portrait

Поиск



[software] [catdoc] [tcl] [geography] [old things]
Автор выражает благодарность Андрею Васильеву за подсказку насчет конфигурирования bridge через файл interfaces.

Соединение компьютеров в сеть через bluetooth

Когда у меня завелась в доме парочка Bluetooth адаптеров, мне захотелось использовать их не только для обмена данными с мобильными телефонами, но и для организации сети, чтобы перемещаясь с ноутбуком по комнате не приходилось таскать за собой ethernet-овский кабель.

Все описания PAN (Personal area networking) которые мне удалось найти в сети (например это) какие-то фрагментарные. Поэтому я решил описать свой собственный опыт. Впрочем, вряд ли у меня получится лучше.

Постановка задачи

Имеется:
  1. Стационарный компьютер, подключенный к интернету.
  2. Локальная сеть подключенная к данному компьютеру (т.е задачи форвардига, маскарадинга etc уже решены, и на компьютере имеется работающй dhcp-сервер)
  3. Некоторое количество ноутбуков (N, N<7)
  4. Некоторое количество (N+1) USB Bluetooth адаптеров
Хочется:
Чтобы при втыкании в ноутбук bluetooth адаптера путем минимальных телодвижений ноутбук оказался в сети.

Настройка точки доступа

Точкой доступа является стационарный компьютер. НА нем у меня стоит Debian sarge.

Для организации доступа требуется решить две задачи

  1. Чтобы компьютер принимал соединения
  2. Чтобы после установки соединения по dhcp отдавалась необходимая конфигурационная информация
Для решения первой задачи достаточно запустить sdpd и pand с правильными параметрами. Эти демоны (как и hcid) входят в пакет bluez-utils.

В Debian для этого достаточно прописать две строчки в /etc/default/bluez-utils

PAND_ENABLED=1
PAND_OPTIONS="--listen --role NAP"
Решение второй задачи - более сложное и менее документированое. Видимо, большинство авторов хаутушек поднимали статические адреса на обоих концах линка и на этом успокаивались. Но у меня есть жена, а у жены - ноутбук. Поэтому приходится решать задачу в общем виде - с возможностью подключения более чем одного устройства.

Для того чтобы dhcp-сервер слушал на интерфейсе, интерфейс должен существовать в момент запуска dhcpd. Более того, pand создает для каждого bluetooth-соединения отдельный интерфейс. Замучаешься описывать и передергивать dhcpd по каждому соединению. Поэтому все HOWTO рекомендуют использовать bridging. Это такая функциональность в линуксовом ядре, позволяющая объединить несколько физических интерфейсов в один. Для работы с бриджингом нам понадобится пакет bridge-utils, в состав которого входит утилита brctl.

В PAN-HOWTO рекомендуется организовать бридж-интерфейс, в который будет добавлен эзернет-интерфейс локальной сети и будут автоматически добавляться bluetooth-интерфейсы по мере возникновения.

Никогда так не делайте. Дело в том что бридж он по своей природе вроде хаба - он проталкивает все пакеты, приходящие на один из включенных в него интерфейсов во все остальные. Соответственно, производительность бриджа равна производительности самого тормозного из включенных в него интерфейсов. Поэтому включив в один бридж 100-mb ethernet и bluetooth, вы посадите производительность ethernet-а до производительнсоти блютуза - т.е. до примерно одного мегабита. (На самом деле код бриджинга, конечно, гораздо умнее, и может работать как свитч, а не как хаб. Более того, можно его настроить так, чтобы можно было втыкать и вытыкать ethernet не прерывая работы, чтобы если есть кабель, пакеты автоматически бегали по нему, а если нет то через bluetooth. Но лучше не связываться.)

Поэтому мы делаем следующее:

  1. Создаем и настраиваем бридже
  2. Не включаем ни одного физического интерфейса в этот бридж
  3. Напускаем на этот бридж dhcpd.
Насторйки bridge, рекомендованные в HOWTO-PAN следующие:
brctl setfd pan0 0
Установить forward delay - задержку в пересылке пакета в 0
brctl stp pan0 off
Запретить использование Spanning tree protocol.

Эти возможности кода bridging в линуксовом ядре предназначены для ситуаций, когда сети объединяются более чем одним bridge и нужно принимать меры для того чтобы пакеты не бегали по кругу. В данной простой ситуации - топология "звезда", нам это не нужно, а задержки оно добавляет.

Сетевые интерфейсы в debian описываются в файле /etc/network/interfaces, документированном в man-странице interfaces(5). На первый взгляд, ничего касающегося бриджей там не обнаруживается. Но, оказывается, синтаксис этого файла расширяем с помощью скриптов, помещаемых в /etc/network/if*.d.

Пакет bridge-utils приносит с собой и устанавливает в /etc/network/if-pre-up.d скрипт bridge, который обрабатывает команды конфигурирования bridge. Дополнительные директивы конфигурации интерфейса, обрабатываемые этим скриптом, описаны в /usr/share/doc/bridge-utils/README.Debian.gz.

Поэтому добавляем в /etc/network/interfaces фрагмент следующего содержания:

auto pan0
iface pan0 inet static
	bridge_ports none
	bridge_fd 0
	bridge_stp off
	address 10.0.0.1
	netmask 255.255.255.0
	brodcast 10.0.0.255
Наиболее важной в этой конструкции является директива bridge_ports none. Скрипт bridge вступает в работу именно при наличии директивы bridge_ports с непустым списком интерфейсов. Поскольку на самом деле мы не хотим добавлять какие-либо интерфейсы в список сразу (только по мере подключения bluetooth-клиентов) то используем зарезервированное слово none.

Две другие строки, начинающиеся с bridge соответствуют вышеприведенным командам конфигурации.

Теперь когда у нас есть интерфейс, мы можем прописать в /etc/dhcpd.conf соответствующую subnet и добавить имя этого интерфейса в строчку INTERFACES в /etc/default/dhcpd.

Приведу на всякий случай фрагмент из dhcpd.conf

  
# Это адрес сервера в ethernet-сети
server-identifier 192.168.217.1;

  subnet 10.0.0.0 netmask 255.255.255.0 {
  	max-lease-time 3600;
	option subnet-mask 255.255.255.0;
    default-lease-time 600;
    option broadcast-address 10.0.0.255;
    option time-servers 192.168.217.1;
    option lpr-servers 192.168.217.1;
    range 10.0.0.2 10.0.0.254;
	# Обязательно передавайте domain-name сервер
    option domain-name-servers 192.168.217.1;
    option routers 10.0.0.1;
	
  }

Осталось позаботиться о том, чтобы вновь появляющиеся bnep-интерфейсы включались в этот бридж и обслуживались dhcpd. Для этого пишем скрипт /etc/bluetooth/pan/dev-up следующего содержания:

#!/bin/sh
brctl addif pan0 $1
ifconfig $1 0.0.0.0
Первая команда в этом скрипте добавляе интерфейс $1 (т.е. тот, который pand передал в качестве параметра скрипту) в бридж pan0. Вторая команда - поднимает интерфейс. Устанавливать осмысленный IP там не надо, об этом позаботится уровень бриджа. Вероятно, было бы достаточно прописать туда up вместо нулевого адреса.

Да, еще. Рекомендую заменить на этом компьютере стандартный скрипт bluez-pin на что-нибудь менее интерактивное. Иначе во всяком случае при первом соединении придется вводить PIN на обоих компьютерах. См например мой вариант решения этой пробелмы

Настройка клиента

Настройка клиента намного проще. Поскольку сервер аннорсирует себя по протоколу sdp, то на клиенте достаточно запустить
pand --search 
Чтобы соединение установилось.

В /etc/network/interfaces прописываем

iface bnep0 inet dhcp
и теперь для того, чтобы всё заработало, достаточно чтобы кто-то после установления соединения дернул ifup bnep0

Я прописал это в /etc/bluetooth/pan/dev-up, хотя, вероятно, можно было просто пропистаь в /etc/network/interfaces для этого интерфейся mapping hotplug

Остался один-единственынй вопрос - а кто будет запускать pand с рутовыми правами при втыкании bluetooth-адаптера в ноутбук. Моя паранойя не позволяет разрешить это делать hotplug-у. Мало ли где я решил воспользоваться bluetooth для работы с мобильным телефоном, и мало ли какую сеть оно там найдет. Поэтому пишем в /usr/local/bin такой скрипт

#!/bin/sh
case "$1" in
on)
        sudo pand --search 
;;      
off)
        sudo pand -K
;;      
# Здесь будет вариант работы ноутбука сервероа
*)
        echo "use $0 on|off" >&2
        exit 1
esac    
И в /etc/sudoers прописываем запуск /usr/bin/pand для пользователей без пароля.

Теперь для того, чтобы оказаться в сети нам нужно сделать ровно две вещи:

  1. Воткнуть bluetooth адаптер
  2. сказать bluenet on
Дополнительные особенности настройки dhcp на ноутбуках, как например, полезность локального DNS-сервера, использование пакета resolvconf для того, чтобы этот сервер ходил к правильному форвардеру, использование опции time-servers и ntp-servers отдаваемых dhcp-сервером для синхронизации времени оставим пока за скобками. Для этого нужен отдельный текст, так как ничего блютуз-специфичного в них нет. В случае ethernet там требуется всё то же самое.