2 <META HTTP-EQUIV="Content-Type" "text/html; charset=utf-8">
3 <TITLE>Соединение компьютеров в сеть через Bluetooth</TITLE>
4 <meta name="description" CONTENT="Мой собственный опыт настройки
5 блютусного Network access point">
8 Автор выражает благодарность <a href="http://vap.livejournal.com">Андрею
9 Васильеву</a> за подсказку насчет конфигурирования bridge через файл
12 <H1>Соединение компьютеров в сеть через bluetooth</H1>
14 Когда у меня завелась в доме парочка Bluetooth адаптеров, мне захотелось
15 использовать их не только для обмена данными с мобильными телефонами, но
16 и для организации сети, чтобы перемещаясь с ноутбуком по комнате не
17 приходилось таскать за собой ethernet-овский кабель.
19 Все описания PAN (Personal area networking) которые мне удалось найти в
21 href="http://bluez.sourceforge.net/contrib/HOWTO-PAN">это</a>) какие-то
22 фрагментарные. Поэтому я решил описать свой собственный опыт. Впрочем,
23 вряд ли у меня получится лучше.
25 <H2>Постановка задачи</H2>
29 <li> Стационарный компьютер, подключенный к интернету.
30 <li> Локальная сеть подключенная к данному компьютеру (т.е задачи
31 форвардига, маскарадинга etc уже решены, и на компьютере имеется
32 работающй dhcp-сервер)
33 <li> Некоторое количество ноутбуков (N, N<7)
34 <li> Некоторое количество (N+1) USB Bluetooth адаптеров
38 Чтобы при втыкании в ноутбук bluetooth адаптера путем минимальных
39 телодвижений ноутбук оказался в сети.
41 <h2>Настройка точки доступа</h2>
42 Точкой доступа является стационарный компьютер. НА нем у меня стоит
45 Для организации доступа требуется решить две задачи
47 <li>Чтобы компьютер принимал соединения
48 <li>Чтобы после установки соединения по dhcp отдавалась необходимая
49 конфигурационная информация
51 Для решения первой задачи достаточно запустить sdpd и pand с правильными
52 параметрами. Эти демоны (как и hcid) входят в пакет bluez-utils.
54 В Debian для этого достаточно прописать две строчки в
55 <tt>/etc/default/bluez-utils</tt>
58 PAND_OPTIONS="--listen --role NAP"
61 Решение второй задачи - более сложное и менее документированое. Видимо,
62 большинство авторов хаутушек поднимали статические адреса на обоих
63 концах линка и на этом успокаивались. Но у меня есть жена, а у жены -
64 ноутбук. Поэтому приходится решать задачу в общем виде - с возможностью
65 подключения более чем одного устройства.
67 Для того чтобы dhcp-сервер слушал на интерфейсе, интерфейс должен
68 существовать в момент запуска dhcpd. Более того, pand создает для
69 каждого bluetooth-соединения отдельный интерфейс. Замучаешься описывать
70 и передергивать dhcpd по каждому соединению. Поэтому все HOWTO
71 рекомендуют использовать bridging. Это такая функциональность в
72 линуксовом ядре, позволяющая объединить несколько физических интерфейсов
73 в один. Для работы с бриджингом нам понадобится пакет bridge-utils, в
74 состав которого входит утилита brctl.
76 В PAN-HOWTO рекомендуется организовать бридж-интерфейс, в который будет
77 добавлен эзернет-интерфейс локальной сети и будут автоматически
78 добавляться bluetooth-интерфейсы по мере возникновения.
80 <b>Никогда так не делайте</b>. Дело в том что бридж он по своей природе
81 вроде хаба - он проталкивает все пакеты, приходящие на один из
82 включенных в него интерфейсов во все остальные. Соответственно,
83 производительность бриджа равна производительности самого тормозного из
84 включенных в него интерфейсов. Поэтому включив в один бридж 100-mb
85 ethernet и bluetooth, вы посадите производительность ethernet-а до
86 производительнсоти блютуза - т.е. до примерно одного мегабита.
87 <i>(На самом деле код бриджинга, конечно, гораздо умнее, и может работать
88 как свитч, а не как хаб. Более того, можно его настроить так, чтобы
89 можно было втыкать и вытыкать ethernet не прерывая работы, чтобы если
90 есть кабель, пакеты автоматически бегали по нему, а если нет то через
91 bluetooth. Но лучше не связываться.)</i>
93 Поэтому мы делаем следующее:
95 <li>Создаем и настраиваем бридже
96 <li>Не включаем ни одного физического интерфейса в этот бридж
97 <li>Напускаем на этот бридж dhcpd.
99 Насторйки bridge, рекомендованные в HOWTO-PAN следующие:
103 Установить <tt>forward delay</tt> - задержку в пересылке пакета в 0
107 Запретить использование Spanning tree protocol.
109 Эти возможности кода bridging в линуксовом ядре предназначены для
110 ситуаций, когда сети объединяются более чем одним bridge и нужно
111 принимать меры для того чтобы пакеты не бегали по кругу. В данной
112 простой ситуации - топология "звезда", нам это не нужно, а задержки оно
116 Сетевые интерфейсы в debian описываются в файле
117 <tt>/etc/network/interfaces</tt>,
118 документированном в man-странице <b>interfaces</b>(5). На первый взгляд,
119 ничего касающегося бриджей там не обнаруживается. Но, оказывается,
120 синтаксис этого файла расширяем с помощью скриптов, помещаемых в
121 <tt>/etc/network/if*.d</tt>.
123 Пакет bridge-utils приносит с собой и устанавливает в
124 /etc/network/if-pre-up.d скрипт bridge, который обрабатывает команды
125 конфигурирования bridge. Дополнительные директивы конфигурации
126 интерфейса, обрабатываемые этим скриптом, описаны в
127 <tt>/usr/share/doc/bridge-utils/README.Debian.gz</tt>.
129 Поэтому добавляем в <tt>/etc/network/interfaces</tt> фрагмент следующего
134 iface pan0 inet static
139 netmask 255.255.255.0
142 Наиболее важной в этой конструкции является директива bridge_ports none.
143 Скрипт bridge вступает в работу именно при наличии директивы
144 bridge_ports с непустым списком интерфейсов. Поскольку на самом деле мы
145 не хотим добавлять какие-либо интерфейсы в список сразу (только по мере
146 подключения bluetooth-клиентов) то используем зарезервированное слово
149 Две другие строки, начинающиеся с bridge соответствуют вышеприведенным
150 командам конфигурации.
152 Теперь когда у нас есть интерфейс, мы можем прописать в /etc/dhcpd.conf
153 соответствующую subnet и добавить имя этого интерфейса в строчку
154 INTERFACES в /etc/default/dhcpd.
156 Приведу на всякий случай фрагмент из dhcpd.conf
158 # Это адрес сервера в ethernet-сети
159 server-identifier 192.168.217.1;
161 subnet 10.0.0.0 netmask 255.255.255.0 {
163 option subnet-mask 255.255.255.0;
164 default-lease-time 600;
165 option broadcast-address 10.0.0.255;
166 option time-servers 192.168.217.1;
167 option lpr-servers 192.168.217.1;
168 range 10.0.0.2 10.0.0.254;
169 # Обязательно передавайте domain-name сервер
170 option domain-name-servers 192.168.217.1;
171 option routers 10.0.0.1;
176 Осталось позаботиться о том, чтобы вновь появляющиеся bnep-интерфейсы
177 включались в этот бридж и обслуживались dhcpd. Для этого пишем скрипт
178 <tt>/etc/bluetooth/pan/dev-up</tt> следующего содержания:
184 Первая команда в этом скрипте добавляе интерфейс $1 (т.е. тот, который
185 pand передал в качестве параметра скрипту) в бридж pan0.
186 Вторая команда - поднимает интерфейс. Устанавливать осмысленный IP там
187 не надо, об этом позаботится уровень бриджа. Вероятно, было бы
188 достаточно прописать туда up вместо нулевого адреса.
190 Да, еще. Рекомендую заменить на этом компьютере стандартный скрипт
191 bluez-pin на что-нибудь менее интерактивное. Иначе во всяком случае при
192 первом соединении придется вводить PIN на обоих компьютерах.
194 href="http://www.wagner.pp.ru/~vitus/software/unix/btdev.html">мой
195 вариант решения этой пробелмы</a>
199 <h2> Настройка клиента</h2>
201 Настройка клиента намного проще. Поскольку сервер аннорсирует себя по
202 протоколу sdp, то на клиенте достаточно запустить
206 Чтобы соединение установилось.
208 В <tt>/etc/network/interfaces</tt> прописываем
210 iface bnep0 inet dhcp
212 и теперь для того, чтобы всё заработало, достаточно чтобы кто-то после
213 установления соединения дернул <tt>ifup bnep0</tt>
215 Я прописал это в <tt>/etc/bluetooth/pan/dev-up</tt>, хотя, вероятно,
216 можно было просто пропистаь в <tt>/etc/network/interfaces</tt> для этого
217 интерфейся <tt>mapping hotplug</tt>
219 Остался один-единственынй вопрос - а кто будет запускать pand с рутовыми
220 правами при втыкании bluetooth-адаптера в ноутбук. Моя паранойя не
221 позволяет разрешить это делать hotplug-у. Мало ли где я решил
222 воспользоваться bluetooth для работы с мобильным телефоном, и мало ли
223 какую сеть оно там найдет. Поэтому пишем в <tt>/usr/local/bin</tt>
234 # Здесь будет вариант работы ноутбука сервероа
236 echo "use $0 on|off" >&2
241 И в /etc/sudoers прописываем запуск /usr/bin/pand для пользователей без
244 Теперь для того, чтобы оказаться в сети нам нужно сделать ровно две вещи:
246 <li>Воткнуть bluetooth адаптер
247 <li>сказать bluenet on
250 Дополнительные особенности настройки dhcp на ноутбуках, как например, полезность локального DNS-сервера, использование пакета resolvconf для того, чтобы этот сервер ходил к правильному форвардеру, использование опции time-servers и ntp-servers отдаваемых dhcp-сервером для синхронизации времени оставим пока за скобками. Для этого нужен отдельный текст, так как ничего блютуз-специфичного в них нет. В случае ethernet там требуется всё то же самое.