Поиск |
[software] [catdoc] [tcl] [geography] [old things] | |||||||||||||||||
Автор выражает благодарность Андрею
Васильеву за подсказку насчет конфигурирования bridge через файл
interfaces.
Соединение компьютеров в сеть через bluetoothКогда у меня завелась в доме парочка Bluetooth адаптеров, мне захотелось использовать их не только для обмена данными с мобильными телефонами, но и для организации сети, чтобы перемещаясь с ноутбуком по комнате не приходилось таскать за собой ethernet-овский кабель.Все описания PAN (Personal area networking) которые мне удалось найти в сети (например это) какие-то фрагментарные. Поэтому я решил описать свой собственный опыт. Впрочем, вряд ли у меня получится лучше. Постановка задачиИмеется:
Чтобы при втыкании в ноутбук bluetooth адаптера путем минимальных телодвижений ноутбук оказался в сети. Настройка точки доступаТочкой доступа является стационарный компьютер. НА нем у меня стоит Debian sarge.Для организации доступа требуется решить две задачи
В 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. Но лучше не связываться.) Поэтому мы делаем следующее:
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 для пользователей без пароля. Теперь для того, чтобы оказаться в сети нам нужно сделать ровно две вещи:
|