Персональный
сайт
Игоря
Сысоева


 
english
обо мне
 
sysoev.ru
 
nginx
 
mod_accel
mod_realip
mod_deflate
программирование
всякая всячина
windows
freebsd
apache
pppd
unix
web
 
 

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

 

16.06.1999

При запуске 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
~
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 вернётся в первоначальное состояние.

(C) Игорь Сысоев
http://sysoev.ru