24.08.1999, © Igor Sysoev, igor@nitek.ru

 

Настраиваем pppd

 

Итак, getty в качестве шелла вызывает /usr/sbin/pppd, поэтому мы не можем задать параметры pppd из командной строки, и зададим все необходимые параметры в файлах /etc/ppp/options и /etc/ppp/options.ttyd0. Напомню, что в первом у нас записано:

modem
crtscts
asyncmap 0

Во второй же мы поместим следующее:

passive
192.168.1.1:192.168.1.200
proxyarp
ms-dns 192.168.1.2
ms-dns 192.168.1.4
debug

Рассмотрим параметры подробнее:

passive   При запуске pppd пытается несколько раз установить PPP-соединение, если же все попытки оказались неудачными, pppd завершает работу. Этот параметр указывает pppd не завершать работу, а пассивно ожидать попытки установления соединения, исходящие с удалённой стороны.

192.168.1.1:192.168.1.200   Этот параметр задает соответственно локальный и удалённый адреса для данного соединения, то есть локальный адрес равен 192.168.1.1, а адрес удалённой стороны - 192.168.1.200. В принципе, адреса могут быть выбраны совершенно от балды, например, 192.168.100.1:10.0.0.1 - между нашим и удалённым компьютером будет работать PPP-соединение. Проблемы начнутся, когда удалённый компьютер будет использовать наш в качестве маршрутизатора для доступа к другим компьютерам. Тут нам придется попотеть с таблицей маршрутизации. Но если удалённой стороне нужно выделить только один адрес без всяких сетей, то существует способ избежать этого. Для этого удалённой стороне нужно назначить адрес, входящий в нашу локальную сеть, и указать pppd параметр proxyarp, описанный чуть ниже. Кстати, адрес локальной стороны может совпадать с адресом одной из сетевых карт на этом же компьютере.

После того, как к нам позвонят и pppd установит соединение, выполним команду

netstat -in

Мы увидим, что сетевому интерфейсу ppp1 назначен адрес 192.168.1.1:

 
Name  Mtu   Network       Address       Ipkts Ierrs    Opkts Oerrs  Coll
...
ppp1  1500  <Link>                          2     0        1     0     0
ppp1  1500  192.168.1     192.168.1.1       2     0        1     0     0
...

А выполнив команду

netstat -rn

мы удостоверимся, что удалённой стороне назначен адрес 192.168.1.200:

 
Destination        Gateway       Flags     Refs     Use     Netif Expire
...
192.168.1.200      192.168.1.1   UH          0      297      ppp1
...

proxyarp   Каждый компьютер в сети хранит таблицу соответствия локальных IP-адресов и физических адресов, например, ethernet'овских. Исходя из этой таблицы, сетевой драйвер определяет по какому физический адресу нужно послать пакет с заданным IP-адресом. Эта таблица динамически обновляется с помощью протокола ARP.

Если мы выбрали для удалённой стороны адреса, которые входят в нашу локальную сеть, то имеет смысл использовать параметр proxyarp. Этот параметр указывает pppd создать запись в этой таблице для адреса удалённой стороны (в нашем примере - 192.168.1.200) и поставить ему в соответствие физический адрес одной из сетевых карт, установленных на локальном компьютере. В результате, все компьютеры в нашей локальной сети (кроме того, на который позвонили) будут считать, что адрес 192.168.1.200 находится на этом компьютере и, таким образом, проблемы с маршрутизацией с нашей стороны не возникает.

После успешного соединения выполним команду

arp -a

и увидим, что pppd создал для удалённой стороны с адресом 192.168.1.200 запись в нашей таблице с физическим адресом "0:40:c7:95:38:72":

 
dial.fast.ru (192.168.1.1) at 0:40:c7:95:38:72 permanent
...
ppp1.fast.ru (192.168.1.200) at 0:40:c7:95:38:72 permanent
                                               published (proxy only)
...

Выполнив на соседнем компьютере ту же команду

arp -a

мы увидим, что для него наши два адреса вообще никак не отличаются:

...
dial.fast.ru (192.168.1.1) at 0:40:c7:95:38:72
...
ppp1.fast.ru (192.168.1.200) at 0:40:c7:95:38:72
...

ms-dns 192.168.1.2 и ms-dns 192.168.1.4   Windows 95 и NT 4.0 при установлении PPP-соединения запрашивает адреса двух DNS серверов. Первый параметр задает адрес первого DNS сервера, а второй, понятно, второго. Если у Вас только один DNS сервер, то укажите параметр только один раз.

Этот параметр никак не влияет на адреса DNS клиента, если клиентом выступает pppd. В старых версиях pppd этому параметру соответствовали два других - dns1 и dns2, но, очевидно, эти названия неоднократно вводили публику в заблуждение относительно их применения и параметр переименовали.

debug   Это параметр указывает pppd вести подробный протокол соединения.

В два других файла /etc/ppp/options.ttyd2 и /etc/ppp/options.ttyd3 мы запишем то же самое, за исключением адреса удалённой стороны - он будет другой - соответственно 192.168.1.1:192.168.1.201 и 192.168.1.1:192.168.1.202. Локальный же адрес во всех соединениях мы будем использовать один и тот же.

В принципе, адреса для соединения pppd, как все остальные параметры, определяет в следующем порядке:

  • Из файла /etc/ppp/options.
    Записывать что-то сюда - занятие достаточно бессмысленное. Правда, сюда можно поместить адрес локальной стороны - 192.168.1.1:, так как он у нас одинаков для всех входящих соединений. Но поскольку у нас есть одно исходящее соединение к нашему провайдеру, лучше этого не делать.

  • Из файла ~/.ppprc, находящегося в домашнем каталоге пользователя, который запустил pppd.
    От этого файла тоже мало пользы. Поскольку, либо нам придется каждому пользователю выделять по отдельному адресу, либо эти адреса всё равно будут переопределены следующим файлом. Кроме того, если мы будем использовать PAP или CHAP аутентификацию, то pppd будет всегда запускаться от root'а. В этом случае, лучше назначать адреса с помощью secrets-файлов.

  • Из файла /etc/ppp/options.ttyd0.
    Наиболее действенный способ, которым мы и вспользовались. Каждому порту выделяется свой адрес.

  • Из командной строки pppd.
    Для этого нам нужно записать pppd с нужными нам параметрами в файл:

    #!/bin/sh
    
    /usr/sbin/pppd 192.168.1.1:192.168.1.205
    

    назовем этот файл ppplogin.sh, поместим его в домашний каталог пользователя и установим его в качестве шелла для этого пользователя. Этот метод позволяет некоторым пользователям выделить отдельный адрес.