Звоним провайдеру 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 |