Прямое кабельное соединение позволяет связывать лишь две системы. Приобретение третьей системы ставит нас перед вопросом - как подключить ее к сети? Именно по этой причине чаще всего применяются расширяемые технологии, в частности Ethernet, для объединения систем в локальную сеть.

Кроме того, выделенные линии дороги. Они используются в основном крупными организациями для объединения сетей. Таким образом, РРР чаще применяется для создания коммутируемых соединений, нежели выделенных каналов.

Поддержка коммутируемых соединений РРР осуществляется рядом вспомогательных программ. Dial-up IP (dip) - распространенный пакет, упрощающий процесс дозвона до удаленного сервера, регистрацию на нем и передачу соединения под контроль РРР. В этом разделе мы опишем dip, поскольку пакет является популярным и бесплатно доступен для широкого спектра систем Unix, ну и, кроме того, поставляется в составе системы Red Hat Linux, которую мы используем для создания примеров применения РРР.

Одной из наиболее важных возможностей dip является автоматизация процесса создания действующего РРР-канала при помощи языка сценариев. В приложении А рассмотрены все команды языка сценариев, существующие в dip версии 3.3.7o-uri, поставляемой в составе Red Hat. Чтобы получить перечень существующих команд, запустите dip в режиме тестирования (ключ -t) и наберите команду help:

  • dip -t
> dip -t
DIP: Dialup IP Protocol Driver version 3.3.7o-uri (8 Feb 96)
DIP> help
DIP knows about the following commands:
beep    bootp    break chatkey    config
databits dec        default dial    echo
flush    get    goto help    if
inc    init    mode modem    netmask
onexit    parity    password proxyarp    print
psend    port    quit reset    send
shell    sleep    speed stopbits term    
timeout    wait        
DIP> quit

Перечисленные команды позволяют настраивать интерфейс, контролировать выполнение сценария и обрабатывать ошибки. Простейшие сценарии требуют использования достаточно ограниченного подмножества команд:

# Запрашиваем локальный адрес IP у РРР
get Slocal 0.0.0.0
#    Выбираем порт и устанавливаем скорость линии
port сиа1
speed 38400
# Аппаратная инициализация модема и очистка буфера ввода
reset
flush
# Набираем номер РРР-сервера и ожидаем ответа CONNECT
dial *70,301-555-1234
wait CONNECT
# Делаем паузу в 2 секунды, чтобы сервер успел подготовиться
sleep 2
# Передаем символ возврата каретки, чтобы «разбудить» сервер
send \r
# Ожидаем приглашения Login> и передаем имя пользователя
wait ogin>
send kristin\r
# Ожидаем приглашения Password> и передаем пароль
wait word>
password
#    Ожидаем приглашения командной строки сервера РРР
wait >
# Передаем команду, регламентированную сервером РРР
send ррр enabled\r
# Переводим интерфейс в режим РРР
mode РРР
# Завершаем работу сценария
exit

Команда get в начале сценария позволяет РРР автоматически определить локальный и удаленный адреса. Slocal - это переменная сценария. Существует несколько стандартных переменных для сценариев, все они описаны в приложении А. $1оса1 обычно хранит локальный адрес, который может статически определяться в сценарии. Однако сервер РРР обладает способностью динамически назначить адрес локальной системе. Этим обстоятельством мы и пользуемся, указав локальный адрес, состоящий из одних нулей. Данная команда предписывает dip разрешить pppd самостоятельно определить адреса. Клиент pppd может получить адреса тремя путями:

Системы РРР могут обмениваться локальными адресами, извлеченными при помощи DNS. Такой вариант мы уже обсуждали в разговоре о настройке выделенных линий.

Адреса могут указываться в командной строке pppd - и этот вариант мы также изучили.


Клиент может разрешить серверу назначить оба адреса. Эта возможность часто используется при работе с коммутируемыми линиями. Она весьма востребована серверами, работающими с многочисленными непродолжительными соединениями. Хорошим примером является сервер поставщи- ка услуг Интернета, предоставляющий коммутируемый доступ.

Следующие две строки сценария указывают физическое устройство, с которым связан модем, и устанавливают скорость его работы. Команда port подразумевает путь /dev, поэтому в качестве аргумента указано только само имя устройства. В большинстве систем PC Unix аргумент команды port принимает одно из значений: cuaO, cual , сиа2 и сиаЗ. Эти значения соответствуют портам системы MS-DOS - от СОМ1 до COM4. Команда speed определяет максимальную скорость передачи данных модему через указанный порт. Скорость по умолчанию - 38400. Измените аргумент, если модем принимает данные с иной скоростью.

Команда reset выполняет аппаратную инициализацию, передавая модему Науев-команду прерывания (+++) и Науев-команду сброса (ATZ). Данный вариант dip использует АТ-команды системы Hayes и работает только с Hayes совместимыми модемами. По счастью, это определение охватывает большинство существующих модемов. После инициализации модем генерирует ответ, отмечая свою готовность принимать данные. Команда flush удаляет это сообщение и все другие сообщения, которые могли быть отображены модемом, из очереди ввода. Используйте flush, чтобы избавиться от потенциальных проблем, связанных с наличием непредусмотренных данных в очереди.

Следующая команда осуществляет подключение к удаленному номеру. Команда dial передает модему стандартную Науеэ-команду набора номера - ATD. Вместе с командой передается вся строка аргумента. Команда dial из примера передает модему строку ATD*70,301-555-1234. Модем набирает *70 (код отключения ожидания звонка), а затем междугородный код 301, номер АТС 555 и номер 1234.


Успешно установив соединение с удаленным модемом, локальный модем отображает сообщение CONNECT. Команда wait предписывает ожидать такого сообщения от модема.

Команда sleep 2 вставляет в сценарий двухсекундную задержку. Зачастую бывает полезно сделать паузу перед регистрацией, чтобы позволить удаленному серверу инициализировать сеанс. Помните, что сообщение CONNECT исходит от модема, а не от удаленного сервера. Удаленному серверу может понадобиться выполнить ряд действий, прежде чем он будет готов принимать данные. Небольшая задержка позволяет избежать появления необъяснимых, невоспроизводимых ошибок.

Команда send передает второй стороне символ возврата каретки (\г). Когда установлено модемное соединение, все данные, передаваемые локальной системой, попадают напрямую в удаленную систему. Команда send позволяет передать любую строку. В нашем примере удаленный сервер должен получить символ возврата каретки, прежде чем отобразит первое приглашение. Символ возврата каретки записывается как \r, а символ новой строки - как \n.

Удаленный сервер отображает приглашение Login>, предлагая указать имя пользователя. Команда wait ogin> позволяет обнаружить это приглашение, а команда send kristin передает в ответ имя пользователя, kristin. Сервер запрашивает пароль, отображая приглашение Passwords Команда password предлагает локальному пользователю набрать пароль вручную. Пароль может храниться в команде send сценария, но такой способ потенциально опасен - если неуполномоченное лицо получит доступ к сценарию, оно получит доступ и к паролю. Команда password призвана повысить уровень безопасности.

Если пароль принят, удаленный сервер из нашего примера предлагает начать работу, отображая символ «больше» (>). Многие серверы требуют выполнения определенных команд, указывающих корректный режим работы. Сервер из нашего примера поддерживает несколько протоколов, так что мы должны предписать ему использование РРР, передав соответствующую команду при помощи send.


Завершается сценарий рядом команд, выполняющих настройку среды локального узла. Команда mode предписывает локальному узлу использовать протокол РРР для работы с этим каналом. Выбранный протокол должен соответствовать протоколу удаленного сервера. Существуют следующие значения протоколов для команды dip mode: SLIP, CSLIP, РРР и TERM. SLIP и CSLIP - это варианты протокола SLIP, о котором мы уже говорили. TERM - режим эмуляции терминала. РРР - протокол Point-to-Point (точка-точка). Наконец, команда exit завершает работу сценария, тогда как dip продолжает работу в фоновом режиме и обслуживает канал.

Этот простой сценарий действительно работает и дает полное представление о структуре ожидание/передача сценария dip. Однако ваши сценарии, вероятно, будут не столь простыми. Описанный сценарий неустойчив, поскольку не реализует проверку ошибок. Не получив ожидаемого ответа, сценарий просто повисает. Для решения проблемы можно воспользоваться интервалом ожидания для каждой команды wait. К примеру, команда wait OK 10 предписывает системы ожидать ответа ОК в течение 10 секунд. Когда ответ ОК получен, переменная сценария $errlvl получает нулевое значение и выполнение сценария продолжается со следующей команды. Если ответ ОК не получен до завершения десятисекундного интервала ожидания, $errlvl получает ненулевое значение, и сценарий переходит к следующей команде. Сочетание переменной $errlvi с командами if и goto позволяет реализовать обработку ошибок в сценариях dip. Более подробная информация по этой теме содержится в приложении А.


Готовый сценарий исполняется по команде dip. Предположим, приведенный выше сценарий хранится в файле start-ppp.dip. Следующая команда выполняет сценарий и создает канал РРР, соединяющий локальную систему и удаленный сервер:

  • > dip start-ppp

Завершается соединение РРР по команде dip -к. Команда закрывает соедине- ние и принудительно завершает фоновый процесс dip.

Параметры pppd не хранятся в сценариях dip. dip всего лишь создает соедине- ние РРР, но не занимается настройкой pppd. Параметры pppd хранятся в фай- ле /etc/ррр/options.

Имея в виду приведенный выше сценарий dip, мы можем воспользоваться следующими параметрами pppd:

  • noipdefault
  • ipcp-accept-local
  • ipcp-accept-remote defaultroute

Параметр noipdefault запрещает клиенту определять свой адрес при помощи локальных служб, ipcp-accept-local предписывает клиенту получить свой адрес от второй стороны. Параметр ipcp-accept-remote предписывает системе получить удаленный адрес от удаленной системы. Наконец, pppd предписывает использовать канал РРР в качестве маршрута по умолчанию. Именно этот параметр defaultroute мы уже встречали ранее в командной строке pppd. Любой параметр командной строки pppd может храниться в файле /etc/ррр/ options. В этом случае он принимается во внимание всякий раз, когда запускается демон pppd, в том числе и по вызову сценария dip.

Я использую dip на своем домашнем компьютере, чтобы настраивать коммутируемое РРР-подключение. Лично я нахожу dip простым и легким в применении, отчасти потому, что знаком с языком сценариев dip. Кому-то больше понравится вспомогательная программа chat, входящая в состав пакета pppd.