]> www.wagner.pp.ru Git - sites/home_page.git/blob - hints/notebook.html
Исправлена опечатка в аннотации к Детям Пространства
[sites/home_page.git] / hints / notebook.html
1 <HTML><HEAD>
2 <META HTTP-EQUIV="Content-Type" "text/html; charset=utf-8">
3 <TITLE>Настройка ноутбука</TITLE>
4 <META NAME="description" CONTENT="Как сделать так чтобы при включении в
5 какую-нибудь сеть ноутбук как можно больше конфигурационной информации
6 получал автоматически">
7 </HEAD><BODY>
8 <h1>Настройка ноутбука</h1>
9 Ноутбук отличается от стационарного компьютера тем, что для него
10 перемещение из одного места в другое является штатным режимом работы.
11 Как правило, в большинстве мест куда мы ходим с ноутбуками, есть сеть, в
12 которую мы этот ноутбук включаем. Хочется сделать так, чтобы ничего
13 дополнительно настраивать при этом не приходилось.
14 <p>
15 Рассмотрим как добиться этого в случае если на ноутбуке установлен
16 Debian sarge
17
18 <h2>Постановка задачи</h2>
19 Не буду утверждать что мой характер использования ноутбука самый
20 типичный, но поскольку другого опыта у меня нет, опишу какой есть.
21 <p>
22 Ноутбук может быть 
23 <ol>
24 <li>Включен в локальную сеть дома 
25 <li>Включен в локальную сеть на работе 
26 <li>Включен в локальную сеть в гостях
27 <li>Подсоединен к интернету через GPRS
28 <li>Подсоединен к интернету через dialup-соединение (что мало чем
29 отличается от GPRS).
30 </ol>
31 <h2>Используемые протоколы</h2>
32 Когда ноутбук включается в локальную сеть, штатным способом обойтись без
33 ручной настройки параметров сети, является использование протокола DHCP
34 (Dynamic host configuration protocol). 
35 <p>
36 Когда ноутбук использует GPRS или dialup-соединение, то все настройки
37 которые мы можем получить определяются возможностями протокола PPP -
38 локальный IP-адрес, адрес второго конца PPP-линка (он же шлюз по
39 умолчанию) адреса одного-двух DNS-серверов и всё. 
40 <p>
41 Возможности DHCP существенно шире. Если внимательно почитать man
42 dhcpd.conf то можно обнаружить что с помощью DHCP можно настроить рутер
43 с  нетривиальным рутингом и рабочую станцию, использующую кучу различных
44 сетевых протоколов. Естественно, если клиент достаточно умный, чтобы
45 этими возможностями воспользоваться.
46 <p>
47 Я использую isc dhclient версии 3 (пакет dhcp3-client). Этот клиент
48 может всё.
49 <h2>Получение статического IP-адреса</h2>.
50 Для linux-ноутбука существенно важно, чтобы он имел постоянный IP-адрес,
51 к тому же прописанный в локальном DNS с каким-нибудь осмысленным именем.
52 Ведь этот ноутбук является не только клиентом, но и сервером. Уж sshd-то
53 у вас на нем есть, и возможность запустить scp на десктопной машине
54 чтобы скопировать файлы с ноутбука - крайне полезна.
55 <p>
56 Если у вас в ноутбуке есть встроенная сетевая карта, то можно прописать
57 в конфиге dhcp-сервера выдачу постоянного IP по этой сетевой карте. Но
58 если вы используете PCMCIA или USB сетевую карту или какой беспроводной
59 адаптер (bluetooth, wifi) подключаемый через pcmcia  или USB, то
60 существенно важно чтобы если вы поменялись сетевой картой с соседом, вы
61 не поменялись бы заодно и IP-адресами.
62 <p>
63 Для этого в протоколе DHCP есть понятие client identifier. 
64 <p>
65 В качестве идентификатора клиента может быть использована произвольная
66 последовательность байт. В конфигах dhclient и dhcpd (предполагаем что в
67 вашей локальной сети в качестве сервера используется ISC dhcpd) этот
68 идентификатор можно прописать и как набор 16-ричных значений разделенных
69 на байты двоеточиями, и как строку в кавычках. Аналогичные возможности
70 имеют клиенты dhcp по умолчанию в FreeBSD и Solaris. В Windows с этим
71 все гораздо хуже. Там почему-то идентификатор задается с в виде
72 32-битного числа (хотя протокол такого жесткого ограничения не
73 накладывает)
74 <p>
75 Я всегда использую в качестве идентификатора hostname компьютера. Это
76 существенно облегчает поддержку конфигурации dhcp-сервера.
77 <p>
78 Итак, пишем в <tt>/etc/dhcp3/dhclient.conf</tt>
79 <pre>
80 send host-name "thinkpad";
81 send dhcp-client-identifier "thinkpad";
82 </pre>
83
84 Первая строчка почти никак не влияет на dhcpd. В dhcpd версии 
85 3 может быть что-то и можно сделать, а dhcpd 2.x просто запишет
86 полученные hostname в dhcp.leases (что тоже не вредно - администратор
87 сервера сможет узнать какой IP получала данная машина, если она
88 почему-то получила адрес из динамического диапазона).
89 <p>
90 В конфигурационном файле dhcpd вашему ноутбуку должен соответствовать
91 блок:
92 <pre>
93  host thinkpad {
94       option dhcp-client-identifier "thinkpad";
95       option host-name "thinkpad";
96       fixed-address 192.168.217.9;
97   }    
98 </pre>
99
100 В домашней сети вы такой блок пропишете с легкостью, а в рабочей для
101 этого нужно иметь кое-какое влияние на системного администратора.
102 <p>
103 В домашних сетях своих друзей, к которым вы ходите в гости, скорее всего
104 придется удовлетвориться динамическим IP, если только вы не ходите к ним
105 в гости достаточно регулярно.
106 <p>
107 Можно еще пытаться динамически проапдейтить локальный DNS, связав свое
108 имя с полученным динамическим IP, но я этим никогда не развлекался,
109 поэтому советов давать не буду. 
110 <h2>Настройка DNS и прочих параметров резолвинга</h2>
111 Нужен ли на ноутбуке локальный DNS-сервер? Последнее время я пришел к
112 выводу, что нужен. Зачем? Дело в том что ноутбук далеко не всегда
113 выключают при перетаскивании его из одного места в другое. Гораздо чаще
114 его загоняют в suspend. А большая часть программ, которые могут быть при
115 этом запущены, крайне отрицательно относятся к смене адресов
116 DNS-серверов без перезапуска. Вообще-то в glibc есть API для
117 переинициализации резолвера. Но им почти никто не пользуется. Поэтому
118 какая-нибудь запущенная дома программа при переносе на работу будет
119 продолжать пытаться достучаться до домашнего DNS-сервера. Хорошо, если у
120 неё получится. А если DNS-сервер в локальной сети имел приватный
121 IP-адрес?
122 <p>
123 Вот если в resolv.conf прописан в качестве DNS-сервера localhost, то всё
124 в порядке. Нужно только уведомить DNS-сервер о смене форвардеров.
125 <p>
126 Для этой цели в debian есть пакет resolvconf. В случае если он
127 установлен, скрипты  dhcp-клиента и pppd, ответственные за прописывание
128 адресов DNS передают эту информацию программе resolvconf, вместо того
129 чтобы явным образом переписывать /еtc/resolv.conf. 
130 <p>
131 А resolvconf обладает настраиваемой конфигурацией и может делать уйму
132 полезных вещей. В комплекте большинства включенных в дистрибутив
133 DNS-серверов есть скрипты, которые помещаются в /etc/resolvconf/update.d
134 и выполняют необходимые модификации при смене адресов DNS-сервера.
135 <p>
136 Я выбрал для ноутбука кэширующий dns-сервеp pdnsd, специально
137 разработанный в качестве кэширующего DNS для машины-клиента. Если вам
138 хочется, можете, конечно, поставить полноценный bind, он тоже умеет
139 взаимодействовать с resolvconf, но pdnsd  проще в настройке и потребляет
140 меньше памяти.
141 <p>
142 При использовании resolvconf вместе с кеширующим DNS-сервером нужно
143 прописать строчку 
144 <pre>
145 nameserver 0.0.0.0
146 </pre>
147 в <tt>/etc/resolvconf/resolv.conf.d/head</tt> чтобы ссылка на локальный
148 DNS-сервер всегда оказывалась первой в сгенерированном resolv.conf
149 <p>
150 Делать этот файл неперегенерируемым не стоит, поскольку dhcp отдает не
151 только адреса name-серверов, но и domain-name - имя домена по умолчанию,
152 которое имеет смысл прописывать в resolv.conf в качестве search.
153 <h2>Синхронизация времени</h2> 
154 Общеизвестно, что часы на компьютере никогда не идут точно. Поэтому надо
155 если не непрерывно, с помощью ntpd, то хотя бы периодически
156 синхронизировать время с компьютером,на  котором запущен ntpd, и который
157 синхронизируется с каким-нибудь сервером времени, использущим атомные
158 часы.
159 <p>
160 Держать ntpd на ноутбуке, который может быть вообще вне сети, а может
161 использовать достаточно дорогое GPRS соединение, я считаю излишиним. 
162 А вот при включении ноутбука в сеть с DHCP, особенно если dhcpd любезно
163 сообщил о наличии в этой сети серверов времени - крайне полезно.
164 <p>
165 В dhcp-протоколе предусмотрена передача информации о двух видах серверов
166 времени - старом протоколе time (порт 37) клиентом которого является
167 команда rdate (пакет rdate) и более современного протокола ntp, клиентом
168 которого является команда ntpdate (пакет ntpdate).
169 <p>
170 Поскольку не во всех сетях доступны оба протокола, будем
171 синхронизироваться по тому протоколу, который доступен.
172 <p>
173 dhclient имеет два набора скриптов-хуков - dhclient-enter-hooks.d и
174 dhclient-exit-hooks.d. Первый выполняется когда уже получен ответ от
175 сервера, но еще не сконфигурирован интерфейс, а второй - после
176 конфигурирования интерфейса. Естественно, запускать синхронизацию
177 времени надо из второго.
178 <p>
179 Но сначала нужно объяснить dhclient-у, что эту необязательную информацию
180 следует запрашивать. Для этого в dhclient.conf прописываем в список
181 запрашиваемых параметров (опция request) кроме умолчательных параметров
182 subnet-mask, broadcast-addres, time-offset, routers, domain-name,
183 domain-name-servers, netbios-name-servers и netbios-scope еще параметры
184 time-servers и ntp-servers.
185 <p>
186 Теперь, вызывая скрипты из dhclient-exit-hooks.d, dhclient будет
187 выставлять им переменные среды new_ntp_servers и new_time_servers, если,
188 конечно, сервер предоставит им соответствующую информацию.
189 <p>
190 Теперь пишем скрипт <tt>/etc/dhcp3/dhclient-exit-hooks.d/time</tt>.
191 <p>
192 <pre>
193 time_setup () {
194 if [ &quot;$reason&quot; != BOUND ] &amp;&amp; [ &quot;$reason&quot; != RENEW ] \
195     &amp;&amp; [ &quot;$reason&quot; != REBIND ] &amp;&amp; [ &quot;$reason&quot; != REBOOT ]
196 then
197     return
198 fi
199
200     if [ x$new_ntp_servers != x -a -x /usr/sbin/ntpdate ]; then
201     echo &quot;Using NTP server(s) $new_ntp_servers&quot;
202     /usr/sbin/ntpdate -b -s $new_ntp_servers &amp;
203     elif [ x$new_time_servers != x -a -x /usr/sbin/rdate ]; then
204         echo &quot;Using time server(s) $new_time_servers&quot;
205         /usr/sbin/rdate $new_time_servers
206     fi
207 }
208
209 time_setup
210 </pre>
211
212 Этот скрипт работает следующим образом: основную работу делает функция time_setup, которая завершается командой return, если причина вызова скрипта
213 (содержащаяся в переменной reason) не соответствует одной из причин по которой могли измениться передаваемые по dhcp параметры.
214 <p>
215 В случае если работа продолжается, мы проверяем можем ли мы установить время с помощью ntp, (для чего требуется чтобы сервер отдал соответствующий параметр, и у нас бы присутствовала программа-клиент, и если да, то выполняем синхронизацию, а если нет, аналогичным образом пытаемся синхронизироваться по более старому прототоколу time.
216 <h2>Параметры windows networking (aka samba)</h2>
217 Тут  ничего не требуется делать руками. Если dhcp-сервер отдает параметры netbios-name-servers и netbios-scope, то в пакет samba-common входит соответствующий enter-hook, который их пропишет в конфиг samba. Главное не забыть при конфигурировании этого пакета ответить на &quot;Да&quot; на вопрос 
218 &quot;Modify smb.conf to use WINS settings from DHCP&quot;
219 <p>
220 Очевидно, что в случае dial-up соединения параметры windows-networking никому неинтересны. Хотя... мелким хакерам они интересны. Сколько раз наблюдал как стоит мне установить GPRS-соединение, сразу ко мне на машину начинали ломиться на порты Samba, MS-SQL и Radmin. Поэтому, если у вас на ноутбуке запущен сервер samba, не поленитесь и пропишите в /etc/ppp/ip_up.d скриптик, который будет его выключать при установлении GPRS или диалапного соединения. Целее будете.
221  
222
223 <h2>Электронная почта на ноутбуке</h2>    
224
225 Понятно, что параметры протоколов приема почты (POP3, IMAP) не зависят от местоположения ноутбука. Ходить за почтой всегда надо в свой почтовый ящик, и хорошо если он запущен по сети. С отправкой почты - сложнее. В наше время в большинстве локальных сетей запрещают клиентским машинам ходить по SMTP на произвольный хост в интернете, чтобы ограничить распространение вирусов и спаммерских троянов.  С другой стороны большинство почтовых серверов не пускают клиентов с произвольных IP-адресов.
226 <p>
227 В принципе, dhcp-протокол содержит опцию smtp-servers, и вполне можно написать аналогичный enter-hook, который, получив эту опцию, будет прописывать её в качестве релея по умолчанию для локального MTA. Естественно, скрипт этот будет специфичен для каждого MTA.
228 <p> 
229 Кроме того, потребуется придумать что делать в случае dialup и gprs соединений. У большинства сотовых операторов есть свои smtp-сервера, принимающие почту с GPRS-адресов. Тем более они есть и у диалапных провайдеров.
230 Но протокол PPP этой информации не предоставляет.
231 <p>
232 Кроме того использование протоколов POP3, IMAP и SMTP по ненадежным и медленным dialup и gprs линкам чревато многократными передачами одного и того же письма - ведь эти протоколы не поддерживают докачку. 
233 <p>
234 Поэтому я пошел по другому пути и настроил в качестве дефолтного почтового транспорта старую добрую UUCP, которая прекрасно работает over tcp. Протокол uucp предусматривает авторизацию, поэтому проблем с тем кого пускать на свой uucp-сервер, а кого нет - нет. Опять же есть докачка. Лучше, конечно, на всякий пожарный случай гонять uucp-траффик через ssl, например с использованием stunnel.
235 <p>
236 Для выполнения обмена по uucp я использую следующий скрипт:
237 <pre>
238 #!/bin/sh
239 if /sbin/route -n |grep -q "^0.0.0.0"; then
240   /usr/sbin/uucico -s wagner
241 fi  
242 </pre> 
243 Он запускается по крону раз в несколько минут, проверяет наличие route в интернет, и если таковая имеется, то выполняет обмен с системой wagner (моей домашней машиной).  
244 <p>
245 Кроме того, uucico запускается из /etc/ppp/ip-up.d, поскольку неизвестно доживет ли дорогое и нестойкое диалапное соединение до следующего запуска этого скрипта по крону. А для очень дорогих каналов (например при дозвоне по сотовому телефону на IP-гейт провайдера, когда цена минуты сравнима с ценой голосового разговора, а скорость 9600), у меня есть expect-овский скрипт, который запускет ppp, мониторит вывод команды uulog, и обнаружив в логе uucp слова "Call complete" немедленно разрывает связь:
246 <pre>
247 #!/usr/bin/expect
248
249 spawn -noecho uulog -F
250 set timeout 1
251 log_user 0
252 expect {
253  -re . exp_continue
254  timeout {}
255
256 puts "Starting ppp session"
257 if [catch "exec pon $argv &gt;&amp;@ stderr"] {
258   puts "ppp connection failed"
259   exit 1
260 }  
261 set timeout -1
262 log_user 1
263 expect {
264 "Call complete" {
265          puts "Stopping ppp session"
266          exec poff
267          exit
268       }  
269 }      
270
271 </pre> 
272 <p>
273 Работа через UUCP по медленным каналам (GPRS, dialup) имеет те преимущества что    
274  <ul>
275 <li>Протокол предусматривает докачку. В случае обрыва соединения при передаче больщого письма, то что выкачано, не придется перевыкачивать
276 <li>Минимизирован объем передаваемой служебной информации.
277 <li>Почта, доставляемая на ноутбук проходит через прирученный почтовый сервер с известно какими антиспамовыми и антивирусными системами. 
278 </ul>
279 Но есть и большой недостаток - нужно иметь прирученный почтовый сервер, на котором вы (или его администратор) сможете настроить uucp-over-tcp сервер. Обычные провайдеры таких услуг не предоставляют.
280 <H2>Настройка системы печати</h2>
281 В протоколе dhcp предусмотрен параметр lpr-servers, но никогда не пытался его использовать. Проще сделать 
282 <pre>
283 cat <i>файл-для-печати</i>|ssh <i>соседняя-десктопная-машина</i> lpr  
284 </pre>
285 А в случае использования cups вообще можно указывать URL сервера печати и печатать по протоколу ipp.
286 </BODY>
287 </HTML>