16.06.1999, © Igor Sysoev, igor@nitek.ru

 

Звоним провайдеру

 

При запуске pppd находит свои параметры в следующем порядке:

  • из файла /etc/ppp/options,
  • затем из ~/.ppprc - из домашней директории пользователя, который запустил pppd,
  • затем из файла /etc/ppp/options.device name,  (то есть, если мы работаем c cuaa0, то из /etc/ppp/options.cuaa0)
  • и, наконец, из командной строки.

Это верно, по-крайней мере, для версии 2.3.5. В более ранних версиях возможны отклонения от этого порядка. Такая очередность позволяет задавать общие параметры в файлах options и изменять в командной строке, если они почему-то не устраивают.

Файл /etc/ppp/options должен быть всегда, пусть даже нулевого размера, иначе pppd просто не запустится. Раз уж файл /etc/ppp/options должен быть всегда, то в него имеет смысл записать параметры, общие для всех случаев использования pppd на данном компьютере. Поскольку наш pppd будет общатся только с модемом, мы запишем в /etc/ppp/options параметр modem, который указывает pppd использовать сигнальные линии модема, а именно DCD и DTR. Кроме того, мы будем всегда использовать аппаратное управление потоком данных с помощью линий RTS/CTS, поэтому запишем туда же еще параметр crtscts. И еще мы добавим параметр asyncmap 0, который подробно описан в статье Параметры asyncmap и escape. Таким образом, содержимое файла /etc/ppp/options будет следующим:

modem
crtscts
asyncmap 0

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

pppd cuaa0 57600 lock connect '/etc/ppp/dial'           \
        defaultroute noipdefault debug nodetach

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

cuaa0   pppd использует COM1. Если Вам нужен COM2, то соответствующее ему устройство - cuaa1. В принципе, можно использовать и устройства ttyd0, ttyd1 и тому подобные, поскольку pppd умеет вправлять им мозги на предмет позвонить. Но почему этого делать не стоит, описано чуть ниже.

57600   Скорость работы с портом - 57600, в принципе, этого достаточно для модемных соединений до 28800. Если Ваши модемы соединяются на скорости до 14400, то имеет смысл установить скорость порта, равную 38400. Ну, и наконец, для скоростей выше 28800, скорость порта следует увеличить до 115200. Причина, по которой скорость работы с портом лучше выставлять больше, чем скорость модемного соединения объясняется в статье Протокол V.42bis и скорость порта.

Правда, стоит учитывать одно обстоятельство - для надёжной работы на скоростях выше 38400 последовательный порт должен иметь FIFO, то есть FreeBSD должна опознавать его, как 16550A или как-то ещё, но ни в коём разе, как 8250 или 16450.

lock   Этот параметр указывает pppd заблокировать последовательный порт перед тем, как его открыть, так, как это делает UUCP. Дело в том, что пока в последовательном порту не активен сигнал DCD, его могут открыть несколько процессов и все они могут одновременно читать из него и писать в него. Ничего хорошего обычно из этого не получается. Поэтому, если на Вашем компьютере, кроме pppd кто-то еще претендует на возможность работать с данным последовательным портом, то его лучше заблокировать.

Упрощенно блокирование происходит следующим образом. Допустим, мы хотим работать с устройством cuaa0. Для этого мы смотрим, существет ли файл /var/spool/lock/LCK..cuaa0. Если да, то устройство заблокировано, если нет, то мы создаем этот файл и записываем в него номер нашего процесса. После того, как мы поработали с портом, файл необходимо удалить. На самом деле, этот процесс несколько сложнее, но здесь мы не будем в него углубляться. Более детально это описано в статье Настраиваем порты. Заметим, что данное блокирование носит уведомительный характер и, естественно, никто не мешает любой другой программе работать с заблокированным таким образом портом до тех пор, пока там не будет активен сигнал DCD, но правильные программы так не поступают. К таким правильным программам относятся, в частности, uucico (UUCP) и mgetty.

Кстати, использование cuaa# в наших примерах вместо ttyd# вызванно именно необходимостью блокирования таким образом. Иначе возникла бы следующая ситуация. Допустим, какой-то процесс заблокировал устройство cuaa0, создав файл /var/spool/lock/LCK..cuaa0. Теперь pppd собирается работать с устройством ttyd0 и для этого ищет файл /var/spool/lock/LCK..ttyd0, которого, разумеется, нету. В результате случится непоправимое.

connect '/etc/ppp/dial'   Параметр connect указывает команду или скрипт для соединения с удаленной строной. В данном случае мы используем наш скрипт для набора нескольких номеров, который мы записали в файл /etc/ppp/dial. Если мы используем наш более простой сценарий, то этот параметр будет выглядеть так - connect 'chat -V -f /etc/ppp/script'.

Перед тем, как вызвать скрипт или команду, pppd открывает устройство последовательного порта, затем запускает скрипт, перенаправляя в это устройство стандартные потоки ввода и ввывода этого скрипта - stdin и stdout.

Поскольку мы указали параметр nodetach, то все, что скрипт выводит в стандартный поток вывода ошибок - stderr, выводится на терминал. Это удобно для отладки соединения. После того, как Вы убедились, что скрипт работает, как задумано, параметр nodetach можно убрать и pppd при запуске будет уходить в фоновый режим, перенаправляя stderr скрипта в файл /etc/ppp/connect-errors.

После запуска скрипта pppd ждет его завершения. Если код выхода скрипта равен "0", то pppd считает, что связь установлена.

deafultroute   После установления соединения адрес провайдера будет использоваться в качестве маршрута по умолчанию (default route), то есть, говоря по-русски, на этот адрес будут отправлятся все пакеты, которые Ваш компьютер не знает, куда отправить.

noipdefault   Если у Вас на компьютере есть хотя бы один сетевой интерфейс с каким либо IP-адресом, то при установлении соединения, pppd пытается использовать этот адрес в качестве качестве своего локального адреса. Это не всегда нужно, поэтому параметр noipdefault пресекает подобные попытки. Если же у Вас на компьютере нет сетевых интерфейсов, то Вы можете не использовать этот параметр.

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

nodetach   Это параметр указывает pppd не отсоединятся от терминала, с которго он был запущен. Это параметр полезен, в частности, при отладке скрипта для соединения, и был описан чуть выше.

Итак, этих параметров вполне достаточно, что бы pppd установил соединение с удаленной стороной. Перед тем, как запустить pppd выполните команду

netstat -in

Среди прочих строк Вы увидете следующее:

 
Name  Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll
...
ppp0* 1500  <Link>                               0     0        0     0     0
...

Теперь запустите pppd с нашими параметрами и после соединения снова выполните команду

netstat -in

Вы увидите, что состояние сетевого интерфейса ppp0 изменилось:

 
Name  Mtu   Network       Address            Ipkts Ierrs    Opkts Oerrs  Coll
...
ppp0  1500  <Link>                               5     0        7     0     0
ppp0  1500  192.168.10    192.168.10.200         5     0        7     0     0
...

В частности, интерфейс ppp0 получил у удаленной стороны адрес 192.168.10.200 и подсоединился к сети 192.168.10.0. Выполнив команду

netstat -rn

мы обнаружим, что наш интерфейс используется в качестве маршрута по умолчанию (default route), а адрес удаленной стороны - 192.168.10.1:

 
Destination        Gateway            Flags     Refs     Use     Netif Expire
default            192.168.10.1       UGSc        1        2      ppp0
...
192.168.10.1       192.168.10.200     UH          1        0      ppp0
...

В принципе, мы можем сами назначить адреса в качестве параметров pppd, например, вот так - 192.168.20.200:192.168.20.4. Но если удаленная сторона имеет на этот счет собственное мнение, то соединение не будет, несмотря на то, что netstat будет показывать, что все в порядке. Если Вы попробуете попинговать удаленный адрес, то увидите, что модем отправляет пакеты на удаленную сторону, но ответа оттуда не приходит. Поэтому Вам нужно либо указать адреса, которые совпадут с адресами, назначаемыми удаленной стороной, либо не указывать их вообще.

Для того что бы завершить соединение, достаточно послать сигнал HUP (hang up) процессу pppd:

kill -1 `cat /var/run/ppp0.pid`

После этого интерфейс ppp0 вернётся в первоначальное состояние.