16.06.1999, | |
Звоним провайдеру
| |
При запуске pppd находит свои параметры в следующем порядке:
Файл /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 и скорость порта.
lock Этот параметр указывает pppd заблокировать последовательный порт перед тем, как его открыть, так, как это делает UUCP. Дело в том, что пока в последовательном порту не активен сигнал DCD, его могут открыть несколько процессов и все они могут одновременно читать из него и писать в него. Ничего хорошего обычно из этого не получается. Поэтому, если на Вашем компьютере, кроме pppd кто-то еще претендует на возможность работать с данным последовательным портом, то его лучше заблокировать.
Упрощенно блокирование происходит следующим образом.
Допустим, мы хотим работать с устройством cuaa0.
Для этого мы смотрим, существет ли файл
/var/spool/lock/LCK..cuaa0.
Если да, то устройство заблокировано, если нет, то мы создаем
этот файл и записываем в него номер нашего процесса.
После того, как мы поработали с портом, файл необходимо удалить.
На самом деле, этот процесс несколько сложнее, но здесь мы
не будем в него углубляться. Более детально это описано в статье
Настраиваем порты.
Заметим, что данное блокирование носит уведомительный характер и,
естественно, никто не мешает любой другой программе работать с
заблокированным таким образом портом до тех пор, пока там не
будет активен сигнал DCD, но правильные
программы так не поступают.
К таким правильным программам относятся, в частности,
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 ждет его завершения.
Если код выхода скрипта 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 будет показывать, что все в порядке. Если Вы попробуете попинговать удаленный адрес, то увидите, что модем отправляет пакеты на удаленную сторону, но ответа оттуда не приходит. Поэтому Вам нужно либо указать адреса, которые совпадут с адресами, назначаемыми удаленной стороной, либо не указывать их вообще.
Для того что бы завершить соединение, достаточно послать сигнал
kill -1 `cat /var/run/ppp0.pid` После этого интерфейс ppp0 вернётся в первоначальное состояние. |