]> www.wagner.pp.ru Git - sites/home_page.git/blob - hints/bluenet.html
Added cover and link to pdf for jasmina
[sites/home_page.git] / hints / bluenet.html
1 <HTML><HEAD>
2 <META HTTP-EQUIV="Content-Type" "text/html; charset=utf-8">
3 <TITLE>Соединение компьютеров в сеть через Bluetooth</TITLE>
4 <meta name="description" CONTENT="Мой собственный опыт настройки
5 блютусного Network access point">
6 </HEAD><BODY>
7
8 Автор выражает благодарность <a href="http://vap.livejournal.com">Андрею
9 Васильеву</a> за подсказку насчет конфигурирования bridge через файл
10 interfaces.
11
12 <H1>Соединение компьютеров в сеть через bluetooth</H1>
13
14 Когда у меня завелась в доме парочка Bluetooth адаптеров, мне захотелось
15 использовать их не только для обмена данными с мобильными телефонами, но
16 и для организации сети, чтобы перемещаясь с ноутбуком по комнате не
17 приходилось таскать за собой ethernet-овский кабель.
18 <p>
19 Все описания PAN (Personal area networking) которые мне удалось найти в
20 сети (например <a
21 href="http://bluez.sourceforge.net/contrib/HOWTO-PAN">это</a>) какие-то
22 фрагментарные. Поэтому я решил описать свой собственный опыт. Впрочем,
23 вряд ли у меня получится лучше.
24
25 <H2>Постановка задачи</H2>
26
27 Имеется: 
28 <ol>
29 <li> Стационарный компьютер, подключенный к интернету.
30 <li> Локальная сеть подключенная к данному компьютеру (т.е задачи
31 форвардига, маскарадинга etc уже решены, и на компьютере имеется
32 работающй dhcp-сервер)
33 <li> Некоторое количество ноутбуков (N, N&lt;7)
34 <li> Некоторое количество (N+1) USB Bluetooth адаптеров
35 </ol>
36
37 Хочется:<br>
38 Чтобы при втыкании в ноутбук bluetooth адаптера путем минимальных
39 телодвижений ноутбук оказался в сети.
40
41 <h2>Настройка точки доступа</h2>
42 Точкой доступа является стационарный компьютер. НА нем у меня стоит
43 Debian sarge. 
44 <p>
45 Для организации доступа требуется решить две задачи
46 <ol>
47 <li>Чтобы компьютер принимал соединения
48 <li>Чтобы после установки соединения по dhcp отдавалась необходимая
49 конфигурационная информация
50 </ol>
51 Для решения первой задачи достаточно запустить sdpd и pand с правильными
52 параметрами. Эти демоны (как и hcid) входят в пакет bluez-utils. 
53 <p>
54 В Debian для этого достаточно прописать две строчки в
55 <tt>/etc/default/bluez-utils</tt>
56 <pre>
57 PAND_ENABLED=1
58 PAND_OPTIONS="--listen --role NAP"
59 </pre>
60
61 Решение второй задачи - более сложное и менее документированое. Видимо,
62 большинство авторов хаутушек поднимали статические адреса на обоих
63 концах линка и на этом успокаивались. Но у меня есть жена, а у жены -
64 ноутбук. Поэтому приходится решать задачу в общем виде - с возможностью
65 подключения более чем одного устройства.
66 <p>
67 Для того чтобы dhcp-сервер слушал на интерфейсе, интерфейс должен
68 существовать в момент запуска dhcpd. Более того, pand создает для
69 каждого bluetooth-соединения отдельный интерфейс. Замучаешься описывать
70 и передергивать dhcpd по каждому соединению. Поэтому все HOWTO
71 рекомендуют использовать bridging. Это такая функциональность в
72 линуксовом ядре, позволяющая объединить несколько физических интерфейсов
73 в один. Для работы с бриджингом нам понадобится пакет bridge-utils, в
74 состав которого входит утилита brctl.
75 <p>
76 В PAN-HOWTO рекомендуется организовать бридж-интерфейс, в который будет
77 добавлен эзернет-интерфейс локальной сети и будут автоматически
78 добавляться bluetooth-интерфейсы по мере возникновения.
79 <P>
80 <b>Никогда так не делайте</b>. Дело в том что бридж он по своей природе
81 вроде хаба - он проталкивает все пакеты, приходящие на один из
82 включенных в него интерфейсов во все остальные. Соответственно,
83 производительность бриджа равна производительности самого тормозного из
84 включенных в него интерфейсов. Поэтому включив в один бридж 100-mb
85 ethernet и bluetooth, вы посадите производительность ethernet-а до
86 производительнсоти блютуза - т.е. до примерно одного мегабита.
87 <i>(На самом деле код бриджинга, конечно, гораздо умнее, и может работать
88 как свитч, а не как хаб. Более того, можно его настроить так, чтобы
89 можно было втыкать и вытыкать ethernet не прерывая работы, чтобы если
90 есть кабель, пакеты автоматически бегали по нему, а если нет то через
91 bluetooth. Но лучше не связываться.)</i> 
92 <p>
93 Поэтому мы делаем следующее:
94 <ol>
95 <li>Создаем и настраиваем бридже
96 <li>Не включаем ни одного физического интерфейса в этот бридж
97 <li>Напускаем на этот бридж dhcpd.
98 </ol>
99 Насторйки bridge, рекомендованные в HOWTO-PAN следующие:
100 <pre>
101 brctl setfd pan0 0
102 </pre>
103 Установить <tt>forward delay</tt> - задержку в пересылке пакета в 0 
104 <pre>
105 brctl stp pan0 off
106 </pre>
107 Запретить использование Spanning tree protocol.
108 <p>
109 Эти возможности кода bridging в линуксовом ядре предназначены для
110 ситуаций, когда сети объединяются более чем одним bridge и нужно
111 принимать меры для того чтобы пакеты не бегали по кругу. В данной
112 простой ситуации - топология "звезда", нам это не нужно, а задержки оно
113 добавляет.
114
115 <p>
116 Сетевые интерфейсы в debian описываются в файле
117 <tt>/etc/network/interfaces</tt>,
118 документированном в man-странице <b>interfaces</b>(5). На первый взгляд,
119 ничего касающегося бриджей там не обнаруживается. Но, оказывается,
120 синтаксис этого файла расширяем с помощью скриптов, помещаемых в
121 <tt>/etc/network/if*.d</tt>.
122 <p>
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>.
128 <p>
129 Поэтому добавляем в <tt>/etc/network/interfaces</tt> фрагмент следующего
130 содержания:
131
132 <pre>
133 auto pan0
134 iface pan0 inet static
135         bridge_ports none
136         bridge_fd 0
137         bridge_stp off
138         address 10.0.0.1
139         netmask 255.255.255.0
140         brodcast 10.0.0.255
141 </pre>
142 Наиболее важной в этой конструкции является директива bridge_ports none.
143 Скрипт bridge вступает в работу именно при  наличии директивы
144 bridge_ports с непустым списком интерфейсов. Поскольку на самом деле мы
145 не хотим добавлять какие-либо интерфейсы в список сразу (только по мере
146 подключения bluetooth-клиентов) то используем зарезервированное слово
147 none.
148 <p>
149 Две другие строки, начинающиеся с bridge соответствуют вышеприведенным
150 командам конфигурации.
151 <p>
152 Теперь когда у нас есть интерфейс, мы можем прописать в /etc/dhcpd.conf
153 соответствующую subnet и добавить имя этого интерфейса в строчку
154 INTERFACES в /etc/default/dhcpd.
155 <p>
156 Приведу на всякий случай фрагмент из dhcpd.conf
157 <pre>  
158 # Это адрес сервера в ethernet-сети
159 server-identifier 192.168.217.1;
160
161   subnet 10.0.0.0 netmask 255.255.255.0 {
162         max-lease-time 3600;
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;
172         
173   }
174 </pre>
175 <p>
176 Осталось позаботиться о том, чтобы вновь появляющиеся bnep-интерфейсы
177 включались в этот бридж и обслуживались dhcpd. Для этого пишем скрипт
178 <tt>/etc/bluetooth/pan/dev-up</tt> следующего содержания:
179 <pre>
180 #!/bin/sh
181 brctl addif pan0 $1
182 ifconfig $1 0.0.0.0
183 </pre>
184 Первая команда в этом скрипте добавляе интерфейс $1 (т.е. тот, который
185 pand передал в качестве параметра скрипту) в бридж pan0.
186 Вторая команда - поднимает интерфейс. Устанавливать осмысленный IP там
187 не надо, об этом позаботится уровень бриджа. Вероятно, было бы
188 достаточно прописать туда up вместо нулевого адреса.
189 <p>
190 Да, еще. Рекомендую заменить на этом компьютере стандартный    скрипт
191 bluez-pin на что-нибудь менее интерактивное. Иначе во всяком случае при
192 первом соединении придется вводить PIN на обоих компьютерах.
193 См например <a
194 href="http://www.wagner.pp.ru/~vitus/software/unix/btdev.html">мой
195 вариант решения этой пробелмы</a>
196
197
198
199 <h2> Настройка клиента</h2>
200
201 Настройка клиента намного проще. Поскольку сервер аннорсирует себя по
202 протоколу sdp, то на клиенте достаточно запустить 
203 <pre>
204 pand --search 
205 </pre>
206 Чтобы соединение установилось.
207 <p>
208 В <tt>/etc/network/interfaces</tt> прописываем
209 <pre>
210 iface bnep0 inet dhcp
211 </pre>
212 и теперь для того, чтобы всё заработало, достаточно чтобы кто-то после
213 установления соединения дернул <tt>ifup bnep0</tt>
214 <p>
215 Я прописал это в <tt>/etc/bluetooth/pan/dev-up</tt>, хотя, вероятно,
216 можно было просто пропистаь в <tt>/etc/network/interfaces</tt> для этого
217 интерфейся <tt>mapping hotplug</tt>
218 <p>
219 Остался один-единственынй вопрос - а кто будет запускать pand с рутовыми
220 правами при втыкании bluetooth-адаптера в ноутбук. Моя паранойя не
221 позволяет разрешить это делать hotplug-у. Мало ли где я решил
222 воспользоваться  bluetooth для работы с мобильным телефоном, и мало ли
223 какую сеть оно там найдет. Поэтому пишем в <tt>/usr/local/bin</tt>
224 такой скрипт
225 <pre>
226 #!/bin/sh
227 case "$1" in
228 on)
229         sudo pand --search 
230 ;;      
231 off)
232         sudo pand -K
233 ;;      
234 # Здесь будет вариант работы ноутбука сервероа
235 *)
236         echo "use $0 on|off" &gt;&amp;2
237         exit 1
238 esac    
239 </pre>
240
241 И в /etc/sudoers прописываем запуск /usr/bin/pand для пользователей без
242 пароля.
243 <p>
244 Теперь для того, чтобы оказаться в сети нам нужно сделать ровно две вещи:
245 <ol>
246 <li>Воткнуть bluetooth адаптер
247 <li>сказать bluenet on
248 </ol>
249
250 Дополнительные особенности настройки dhcp на ноутбуках, как например, полезность локального DNS-сервера, использование пакета resolvconf для того, чтобы этот сервер ходил к правильному форвардеру, использование опции time-servers и ntp-servers отдаваемых dhcp-сервером для синхронизации времени оставим пока за скобками. Для этого нужен отдельный текст, так как ничего блютуз-специфичного в них нет. В случае ethernet там требуется всё то же самое.    
251 </BODY>
252 </HTML>