Установка PPP-соединения в Linux

В. Водолазкий (vvv@rinet.ru)

Ох, как же мне надоел навязчивый сервис от Microsoft! Надоели Lособенности¦ операционной системы Windows95, надоели ошибки в Microsoft Word, которые стоили при подготовке диссертации немало бессонных ночей, в общем... плюнул я на красивые форточки и всерьез сел за Linux.

Конечно же, многое поначалу было непривычно, а некоторые вещи поражают меня до сих пор. Возьмем, к примеру, проблему русификации. Есть и шрифты, и раскладки клавиатуры, и кодировка КОИ-8 постепенно пробила себе дорогу даже на экраны пользователей Windows... Но вот, чтобы воспользоваться всем этим, надо читать документацию на английском языке, подготовленную и переданную мировым сообществом гражданином Израиля, которому помогали ребята из Голландии, США, Тайваня, Замбии (или Заира v по e-mail адресу разве поймешь!) и только один наш соотечественник v Сергей Вакуленко оказался причастным к решению этой проблемы. Причем, как выяснилось, разработанные им шрифты и раскладки вошли в официальную версию X11 Release 6 и теперь доступны для всего человечества. Грустно, люди со всего мира о нас за- ботятся, бесплатно делают действительно нужную и важную работу, а нам наплевать! Знаете ли вы, например, о проекте интернационализации программных средств для UNIX, предусматривающим разработку, среди прочего и полностью русскоязычных версий всех утилит и системных программ. Но руководит русской частью проекта не родной наш Госкомитет по Информатике, а Ульрих Дреппер из западногерманского университета в Карлсруэ. Вот так...

Но к чему такое затянувшееся введение? А вот к чему! Дело в том, что университетские традиции Европы и Штатов предполагают обучение студентов на многопользовательских UNIX-системах, что предполагает качественно иной уровень Lмассовой¦ UNIX-культуры v базовых знаний системы, квалифицированных специалистов в пределах досягаемости неофитов, литературы, доступа к Internet и многих других факторов. У нас, по ряду причин, это не так. И поэтому нередко документация по установке UNIX-программ, особенно связанных с настройкой сетевого подключения оказывается не слишком понятной, или, что еще хуже, применимой. Одной из таких проблем является подключение Linux-машины к сети Internet. Поэтому давайте попробуем сделать эту операцию шаг за шагом.

Прежде всего определимся с типом соединения. Отечественные провайдеры, в от- личие от большинства администраторов многопользовательских систем на Западе отда- ют предпочтение не SLIP-соединению, а более современному протоколу PPP, что между прочим, опровергает расхожий тезис об отсталости российских Internet-технологий. Основные преимущества PPP по сравнению со SLIP состоят в следующем:

  1. назначение IP-адресов в PPP реализуется внутри PPP- соединения между компьютерами провайдера и клиента. Это значительно упрощает процесс конфигурирования при использовании динамических IP-адресов;
  2. Коррекция ошибок, возникающих при передаче данных осуществляется не между владельцем информационных ресурсов и потребителем, как в SLIP, а между провайдером и клиентом, что примерно на 15-20% повышает информационную скорость передачи данных.

Поэтому выберем какой-нибудь хост, к которому можно подключиться у нас. Кстати, в первом номере LПланеты Internet¦ за прошлый год была опубликована заметка о подключении к сети RINET. Не отличаясь оригинальностью (поскольку я тоже пользуюсь услугами этого провайдера) я попытаюсь на глазах у почтенной публики Lприце- питься¦ к сети через RINET.

Прежде чем приступить к непосредственной установке необходимо собрать некото- рый объем исходных данных. Вот что нам потребуется:

Что нам нужно: Значения в примере: Ваши данные:
Имя пользователя, используемое в электронной почте myname
Входной идентификатор для регистрации в системе ppmyname
Регистрационный пароль begemot
IP-адрес пользователя 194.87.171.101
IP-адрес сервера DNS 194.87.171.65
Домен пользователя rinet.ru

Особенность подключения Linux-машины от DOS состоит прежде всего в том, что ваш компьютер, подключенный с помощью PPP-соединения превращается в полноправный узел сети Internet, в котором вы можете выступать как клиентом, так и сервером. Это означает, что прежде всего необходимо решить проблему маршрутизации v то есть определения путей доступа от вашей машины к другим компьютерам сети и обратно. Проблема для UNIX не нова и решается одним из трех способов:

  1. за счет локальной базы данных, помещаемой в файле /etc/hosts;
  2. за счет использования специальных серверов доменных имен (Domain Name System v DNS)1;
  3. за счет базы данных на специальном сервере NIS (Network Information Service).

Нам потребуется создать простейший инфантильный сервер, который при любом запросе обращается к Lавторитету¦, которым в нашем случае является сервер DNS вашего провайдера. При желании вы можете впоследствии нарастить мощность вашего DNS-сервера, чтобы снизить накладные расходы на запрос IP-адресов при длительной работе с одними и теми же узлами сети. Но об этом в следующий раз. А сейчас предположим, что в вашей сети всего одна машина v myname.

Кстати, а как установить имя машины? Все проблемы решает строка типа:
/bin/hostname myname.rinet.ru,
которая помещается в один из инициализационных файлов2

Что касается самого выбора имени, то надо было договариваться с провайдером раньше v при регистрации. А теперь ваш IP-адрес будет ассоциироваться у всего мира с машиной mynet.rinet.com. Ура, мы становимся сервером Internet и можем сами командовать электронной почтой в пределах машины! Так чтобы послать вам письмо, ваш корреспондент должен теперь использовать что-нибудь типа root@myname.rinet.ru. Согласитесь, что это уже круто!

Впрочем надувать щеки пока рано. Это ведь только перспектива, а пока нам предстоит немало потрудиться. Мы используем комбинированный подход: создадим крохотную локальную базу данных хостов и подключим внешний DNS-сервер. Прежде всего необходимо установить значение нескольких конфигурационных файлов. Начнем с файла /etc/host.conf. Вот его содержимое с учетом сделанных ранее допущений:

order hosts, bind
multi on

Первая строка указывает на способ организации поиска при поиске адресов узлов сети. Ключ hosts говорит о необходимости просматривать прежде всего локальную базу данных, размещаемую обычно в файле /etc/hosts, а второй -- bind требует связаться для этого с внешним сервером DNS, который, между прочим, может быть запущен физически и на этой же физической машине. Вторая строка файла объявляет о поддержке этим сервером Lмногоженства¦, то есть использовании сразу нескольких IP-адресов. Хотя на работу служб DNS этот параметр влияния не оказывает, не жадничайте v поставьте и забудьте.

Зачем принята такая структура? Исключительно для удобства настройки системы! Так, если вы установили содержимое /etc/host.conf в точности, как это написано в примере, то named вначале будет просматривать файл /etc/hosts и лишь затем обращаться к внешним источникам информации, а если вы введете строку вида:

order bind, hosts

то наоборот v вначале будет сделан запрос к удаленному серверу, и только в том случае, если вы обращаетесь к локальным адресам будет использована внутренняя база данных. Впрочем, как показала практика, первый вариант в большинстве случаев является оптимальным.

Поэтому перейдет к обсуждению содержимого файла /etc/hosts. Вот что подойдет вам в подавляющем большинстве случаев:

127.0.0.1	            localhost
194.87.171.101	myname.rinet.ru     myname

Нам необходимо только две записи v локальный хост, используемый для работы ряда программ в пределах машины и IP-адрес вашей машины, который установлен вашим провайдером. Для упрощения доступа определяется также синоним v просто имя myname.

Но и это еще не все! Нам необходимо указать системе, какими же серверами DNS необходимо пользоваться для определения IP-адресов. Эта информация хранится в файле /etc/resolv.conf:

domain rinet.ru
nameserver 194.87.171.65

В этом файле мы резервируем домен и указываем имена серверов (по одному на строку), которые используются нашей системой. По большому счету, для конечного пользователя этой информации вполне достаточно. Теперь, как только вы подключитесь к провайдеру, все запросы к сетевым ресурсам будут обслуживаться внешним сервером DNS, IP-адрес которого мы указали выше.

Но что представляет из себя процесс подключения? Реально он состоит из нескольких этапов:

  1. соединение с компьютером провайдера по коммутируемой линии связи;
  2. регистрация пользователя в удаленной системе;
  3. инициализация PPP-соединения.

В Windows-среде решение этих трех задач осуществляется какой-либо программой-монстром3, в которой разработчики пытаются упаковать все функции сразу. Но если этот подход применим для неподготовленных пользователей, не желающих эффективно использовать возможности аппаратных средств, то в UNIX мощь системы достигается за счет использования конвейера небольших, но тщательно отлаженных программ, каждая из которых решает какую-либо отдельную задачу. В случае с PPP этот функциональный набор состоит из следующих частей:

/usr/sbin/ppp-on
/usr/sbin/ppp-off
/etc/ppp-on-dialer
/etc/options

и, конечно же, собственно демон /sbin/pppd. Но демон живет внутренней жизнью и запускается при установлении соединения автоматически. А чтобы это соединение было установлено, нам придется разобраться с перечисленными выше файлами. Несмотря на их Lогромное количество¦, работы совсем немного. Во-первых, с ppp-off вам делать ничего не придется v задача этого файла состоит в том, чтобы убить демон pppd после того, как сеанс работы с сетью завершен. А остальные мы рассмотрим по порядку.

Начнем с программы, которую обычно используют для установки соединения v ppp-on. Несмотря на то, что эта программа помещается при установке системы в каталог /sbin это обычный сценарный файл, в который вы, кстати, должны внести ваши данные:

#!/bin/sh
#
# ppp-on
#
# Это основные параметры, которые вы должны настроить
TELEPHONE=9567800	# По этому номеру будем звонить
ACCOUNT=ppmyname	# Регистрационное имя
PASSWORD=begemot 	# Пароль
LOCAL_IP=194.87.171.101	# А если динамический, то  0.0.0.0
REMOTE_IP=0.0.0.0	# IP-адрес с той стороны. Обычно : 0.0.0.0
NETMASK=255.255.255.0	# Маска подсети
#
# Эти переменные нужны для работы  'ppp-on-dialer'.
export TELEPHONE ACCOUNT PASSWORD
# 
# Теперь укажем полное имя программы набора номера
#
DIALER_SCRIPT=/etc/ppp/ppp-on-dialer
#
# Наиболее типичный запуск демона после соединения с помощью
# ppp-on-dialer
#
exec /usr/sbin/pppd debug lock modem crtscts /dev/ttyS2 38400 \
	asyncmap 20A0000 escape FF kdebug 0 $LOCAL_IP:$REMOTE_IP \
	noipdefault netmask $NETMASK defaultroute connect $DIALER_SCRIPT

Ну хорошо, в конце концов ppp-on вызовет программу ppp-on-dialer, а что представляет собой она? Это тоже небольшой сценарий, который приведен ниже:

#!/bin/sh
#
# /etc/ppp-on-dialer
# Выполняет всю черную работу по установке соединения
#
exec chat -v	\
	TIMEOUT		3 \
	ABORT		'\nBUSY\r'	\
	ABORT		'\nNO ANSWER\r'	\
	ABORT		'\nRINGING\r\n\r\nRINGING\r' \
	''	\rAT	\
	'OK-+++\c-OK'	ATH0	\
	TIMEOUT		30	\
	OK	ATDP$TELEPHONE	 \
	CONNECT		''	\
	name:--name:	$ACCOUNT	\
	assword:	$PASSWORD

Фактически, это последовательность сообщений, получаемых программой от модема и ее реакции. Нет ничего удивительного, что этот процесс, по большому счету, вполне стандартен для миллионов компьютеров во всем мире. Но, как говорится в одной рекламе:

LВашему ребенку подойдет любой шампунь...
Но не моему малышу!¦

Попросту говоря, вам потребуется указать модему, что вы пользуетесь не тональным набором номера (ATD) , а импульсным (ATDP), который принят у нас. На этом изменения в этом файле можно считать законченными.

Впрочем, это еще не все... Осталось установить еще одну строчку в файле /etc/ppp/options, а именно v указать имя домена (в нашем случае v rinet.ru).

lock
domain rinet.ru

Все! Вопреки многочисленным сказкам о неподъемности UNIX для конечного пользователя мы установили клиентскую часть ppp-соединения, затратив на это, максимум полчаса4. Теперь нам потребуется только убедиться в работоспособности нашего соединения.

Прежде всего, проверим, как работает TCP/IP. Для этого нам достаточно использовать команду PING5. Вначале потренируемся Lна кошечках¦ и протестируем работу TCP/IP внутри вашего компьютера без выхода в Internet.

Итак, на моей домашней 486DX4/100 получается следующее:

ping localhost
PING localhost (127.0.0.1): 56 data bytes
64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=1.0 ms
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.8 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.8 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.8 ms

--- localhost ping statistics ---
4 packets transmitted, 4 packets received, 0% packet loss
round-trip min/avg/max = 0.8/0.8/1.0 ms

Теперь смело в бой! Соединяемся с сервером (ppp-on соединится с провайдером, запустит демон pppd и вернет вам управление v запускать его в фоновом режиме не нужно), а после этого можно проверить доступность вашего провайдера с помощью команды типа ping www.rinet.ru. Если все в порядке, то вы получите времена задержки до 200-300 миллисекунд, в зависимости от пропускной способности вашего модема. Но это только небольшой, хотя и важный участок сети v между вами и провайдером. А как работает линия дальше?

Можно для проверки вновь воспользоваться ping, но на мой взгляд это слишком однообразное и нудное занятие, которое не плохо бы слегка оживить. А для оживления мы используем программу traceroute, которая возвращает список узлов, через который проходит ваш пакет при запросе типа ping. Для придания романтизма рутинной проверке работспособности PPP-соединения мы пойдем Lв Пентагон¦, а вернее в сетевой центр NIC.DDN.MIL, который является одним из старейших и надежных сетевых информационных компьютеров. Вот что я получил для своего соединения (безымянный модем 14400):

 traceroute nic.ddn.mil
 1  cs2511-1.rinet.ru (194.87.171.72)  263.971 ms  278.509 ms  259.626 ms
 2  as51.rinet.ru (194.87.171.71)  229.535 ms  1829.28 ms  189.497 ms
 3  hq-1-L0.Demos.net (194.87.15.1)  199.546 ms  279.114 ms  260.114 ms
 4  m9-1-S5-1-2048K.Demos.net (194.87.15.130)  209.016 ms  299.288 ms  229.57 ms
 5  mix-serial3-3.Boston.mci.net (204.189.128.157)  389.54 ms  509.237 ms  469.622 ms
 6  core-fddi-0.Boston.mci.net (204.70.2.33)  399.489 ms  499.211 ms  479.66 ms
 7  core3-hssi-2.WestOrange.mci.net (204.70.1.1)  459.415 ms  499.229 ms  428.81 ms
 8  core3-hssi-2.WestOrange.mci.net (204.70.1.1)  439.498 ms  439.218 ms  469.64 ms
 9  sprint-nap.WestOrange.mci.net (204.70.1.210)  509.465 ms  389.307 ms  499.47 ms
10  sprint-nap.disa.mil (192.157.69.45)  479.508 ms  489.183 ms  419.584 ms
11  137.209.200.202 (137.209.200.202)  589.512 ms  409.272 ms  430.3 ms
12  RESTON-HUB.NIPR.MIL (137.209.60.1)  568.761 ms *  540.131 ms
13  198.26.127.26 (198.26.127.26)  489.416 ms  439.21 ms  599.602 ms
14  nic.ddn.mil (192.112.36.5)  539.497 ms  499.047 ms  489.617 ms

Во-первых, мы проверили доступность и работу сервера DNS (мы ведь обратились к серверу NIC по имени, а не по IP-адресу), а во-вторых убедились, что пакеты бегают как положено по всему Internet. Теперь вы без проблем можете пользоваться ftp, telnet, gopher, archie, www и прочими приятными программами.

Не могу удержаться, чтобы лишний раз не пнуть DOS, Windows и проч. Все необходимые клиенты для всех служб Internet входят в стандартную поставку Linux. Кстати, Netscape выпустила версии своего Навигатора для Linux (как 2.0, так и 3.01), и работают эти программы стабильнее и быстрее, чем в Windows.

Насчет Lбыстрее L можно и поконкретнее. Я пытался Lпропинговать¦ nic.ddn.mil и из под Windows 95. На той же машине... И получил среднее время доступа порядка 760 миллисекунд. Факты говорят сами за себя...

Но я знаю, знаю, что поклонники Lфорточек¦ уже заготовили смертельный удар! И состоит он в простом и каверзном одновременно вопросе: А что делать, если телефон провайдера занят? Неужели потребуется еще и еще раз вручную вводить ppp-on?

Вы что же, рассчитываете на ответ настоящего аскета v мол нет в этом никакой проблемы, и руки у пользователя не отвалятся? Не дождетесь, в UNIX-е ведь работают такие же люди как и везде, и тоже не любят дурной работы. А поэтому позвольте предложить вам небольшой сценарий, который организует дозвон до провайдера в автоматическом режиме. Вот он:

#!/bin/sh
#
# Установка  ppp-соединения с автоматическим дозвоном до провайдера
#
# Написано на основе заметочки в Linux Gazette No.13 (msalama@usa.net)
#
#
#   vvv@rinet.ru  В.В.Водолазкий, Москва, 1997
#
#  Вызов программы:   isp [NNN]
#                где NNN - время дозвона в минутах (мне очень понравилось это в 
#		          программе Trumpet Winsock	
#
#  По умолчанию дозваниваемся в течение 30 минут
#

wd=1                   # счетчик попыток
stopflag=1             # Признак окончания работы сценария
SLEEPTIME=45           # Время засыпания между попытками 

echo  
echo  "Устанавливаю  ppp-соединение "
echo

#
#
if [ "$1" = "" ]; then    # Установка предельного времени дозвона
repeattime=30             # Если не указали специально, то будем ждать 30 минут 
else
repeattime=$1
fi
# А не запущен ли pppd раньше. 
# Этой проверкой мы блокируем повторную инициализацию канала...
    foo=$(ps -ax)      # Посмотрим, какие процессы крутятся в системе
    bar=$(echo $foo | grep "/usr/sbin/pppd")  # Есть ли родимый pppd?
    if [ $bar ]; then   # Есть, поэтому заканчиваем работу...
      stopflag=0
      echo
      echo " pppd уже функционирует!"
      echo
      exit 0
    fi     

echo "Время на дозвон к провайдеру: $repeattime"


while [ $stopflag ]; do # Основной цикл дозвона 
echo "Попытка соединения:  $wd"

ppp-on                 # Просто вызываем программу установки соединения
sleep $SLEEPTIME 
foo=$(ifconfig);       # смотрим, не образовался ли канал ppp0
echo $foo
bar=$(echo $foo | grep "ppp0" )   

if [ "$bar" = 1 ]; then    # Да, все в порядке
    echo "**********************"
    echo "*** Соединение с провайдером установлено! ****"
    echo "**********************"
    exit 0
 else                  # Не вышло...
  let wd=$wd+1           # Корректируем счетчик попыток
  if [ $wd -gt $repeattime ]; then
            stopflag=0
	    echo
	    echo "Установить соединение не удалось..."
	    echo
            exit 1
  fi
fi
done                   # Завершаем работу сценария

На этом можно сделать паузу. Паузу, потому что за кадром остались такие немаловажные вопросы, как установка и настройка Linux-машины в качестве узла Internet, обеспечивающего доступ пользователей Сети к его ресурсам. Но об этом в следующий раз.


1За подробностями отправляю читателя к книге П.Храмцова LЛабиринт Internet¦, выпущенной в 1996 году издательством LЭлектроИнформ¦.
2Обычно это файл /etc/rc.d/rc.local в котором хранятся команды настройки для данной машины.
3Которая обычно носит гордое имя Lдайлер¦
4Естественно, я полагаю, что ваше ядро поддерживает PPP, а при установке системы с дистрибутива вы не забыли попросить ее установить pppd v все остальные файлы будут установлены вместе с демоном.
5Одну минутку... Эту команду, вообще говоря, имеет право использовать только root!
AQUA TOP100!