Не знаю, как вам, но мне очень не нравятся все эти новомодные Gnome-dial, kppp и прочие произведения буржуазной мысли. Да, они удобные, но если что-то пойдет наперекосяк, то пока найдешь причину, набегаешься с бубном вдосталь.
Итак, в этом тексте я опишу, как выйти с помощью "чистого PPP" в интернет.
Для этого нам надо - установленный дистрибутив (если ничего не ломали, то пойдет даже свежеустановленный), хороший провайдер с логином-паролем и прочими нужностями, компьютер с подключенным модемом.
Позволю себе надеяться, что у вас стоит ppp со всеми необходимыми модулями, потому как я его давно не компилировал, так как производители дистрибутивов начали ложить сразу "правильный" ppp.
Итак, первое, что вам необходимо сделать - это узнать, насколько "правильный" у вас провайдер. Правильный в моем понимании - это тот, который не издевается над клиентами и предоставляет нормальный сервис и прочее. Для этого берете любую терминалку, которая у вас есть (подойдет даже HyperTerminal из комплекта windows), открываете ее, устанавливаете параметры порта в необходимые значения и пытаетесь набрать ATZ[Enter] - если тут же появились буковки OK - значит, можете радоваться - у вас все подключено правильно. Теперь наберите ATDPномер_вашего_провайдера. Если у вас тоновый набор, смените букву P(ulse) на T(one). Модем должен пошипеть,
поскрипеть и выдать на экран строчку подобную CONNECT 33600/ARQ/V34/LAPM/V42BIS, затем приветствие провайдера (что-нибуть типа Welcome to Demos (HQ-4.Demos.net) ), а затем должна появиться одинокая строчка login: (Может и Login) - вводите свой логин, тут же должна появиться строчка Password: - тут введите свой пароль. В общем пройдите всю процедуру авторизации. У многих провайдеров (Zenon к примеру) потребуется еще выбрать что-нибудь. В общем, ваша задача - понять путь прохождения к PPP. То, что вы достигли начала PPP, можно узнать по появляющейся на экране мешанине символов, обильно сдобренных символами {{{.
Все, больше вам ничего от провайдера не нужно - можете отключаться.
Давайте теперь укажем наш chat-скрипт, который будет делать все вышеприведенные действия сам.
Итак, вот скрипт с моими комментариями (естественно, их надо будет вырезать). Он используется у меня для выхода через Demos.
#!/bin/sh
признак того, что это выполняемый с помощью bash файл
exec chat -v
выполняем chat с выводом (-v) порядка выполнения через syslog.
TIMEOUT 3
устанавливаем тайм-аут в 3 секунды - любая из нижеперечисленных команд не должна выполняться более 3 секунд.
ABORT ' BUSY '
ABORT ' NO ANSWER '
ABORT ' RINGING RINGING '
скрипт прервется, если в каком-либо ответе появится BUSY, NO ANSWER или 2 раза RINGING.
'' AT
ничего не ждем, просто посылаем символ перевода строки и AT (кстати, именно сюда надо вставить строку инициализации модема, если вы ее знаете)
'OK-+++c-OK' ATH0
ждем ответа OK на предыдущую команду, переводим на всякий случай модем в командный режим и на всякий случай ложим трубку.
TIMEOUT 90
Тайм-аут на 90 секунд. За 30 или 60 модем не всегда успевает договориться.
OK ATDP$TELEPHONE
ждем ответа OK от предыдущей команды (ATH0) и набираем номер провайдера.
ABORT ' NO CARRIER '
прервемся, если получим NO CARRIER
CONNECT ''
Ждем строчку CONNECT и как только ее получили, переходим к следующей команде.
ogin:--ogin: $ACCOUNT
Ждем подстроку ogin: и в ответ посылаем свой логин, записанный в переменной $ACCOUNT
assword: $PASSWORD
Ждем подстроку assword: и посылаем в ответ содержимое $PASSWORD.
Вот такой файл записан у меня в /etc/ppp/ppp-on-dialer. Хочу обратить ваше внимание, что он должен быть выполняемым (установлен бит x - chmod 755 /etc/ppp/ppp-on-dialer). Также обратите внимание на то, что строки в файле
рзделены символом - так как на самом деле можно было все записать в одну большую строчку - но так ведь неудобно, не правда ли?.
Вот пример того же файла, только используемого мной для соединения с Zenon.
#!/bin/sh
exec chat -v
TIMEOUT 3
ABORT ' BUSY '
ABORT ' NO ANSWER '
ABORT ' RINGING RINGING '
'' AT
'OK-+++c-OK' ATH0
TIMEOUT 90
OK ATDP$TELEPHONE
CONNECT ''
ogin:--ogin: $ACCOUNT
assword: $PASSWORD
PPP 1
Как говорится, найдите две большие разницы.
Итак это наш скрипт, теперь осталось сделать "обвязку" для запуска PPP и остаться довольным жизнью.
#!/bin/sh
#
# Скрипт ppp-on для установления ppp-соединения.
#
# Измените параметры на ваши.
TELEPHONE=1234567 # Телефонный номер модемного пула вашего провайдера.
ACCOUNT=cooluser # Ваш логин, который дал вам провайдер.
PASSWORD=superpassword # Пароль для вашего логина.
LOCAL_IP=0.0.0.0 # Локальный IP адрес, если вы его знаете. По умолчанию оставьте 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
#
# Установка соединения
#
exec /usr/sbin/pppd debug lock modem crtscts /dev/modem 57600
asyncmap 20A0000 escape FF kdebug 0 $LOCAL_IP:$REMOTE_IP
noipdefault netmask $NETMASK defaultroute connect $DIALER_SCRIPT
Вот такой вот файл. В принципе он простой по содержанию, только я хочу выделить пару строчек. Если вы не разбираетесь, то просто оставьте все, как есть. "debug lock modem crtscts /dev/modem 57600" - в этой кракозябре написано следующее - выводить отладочную информацию, использовать lock файлы, работаем с модемом, управление потоком аппаратное, модем сидит на /dev/modem и общаемся мы с ним на скорости 57600. "defaultroute" - указывает ppp установить пути роутинга так, что бы роутинг по умолчанию шел через ppp.
Обратите внимание - в этом файле записаны ваши пароли, так что поаккуратнее с ним. Лично я, например, установил на него права rwx--x--x и запускаю только от root. Если же вам необходимо разрешить и обычным пользователям запускать ppp, установите бит s на этот скрипт и на pppd. Впрочем, в некоторых дистрибутивах suid-ность скрипта не обязательна - проверьте сами.
Итак, запускаем на одной консоли вывод логов, а на другой запускаем ppp-on.
Должно появиться что-либо подобное (здесь приведен пример взаимодействия с Demos):
Mar 8 11:06:03 localhost kernel: CSLIP: code copyright 1989 Regents of the University of California
Mar 8 11:06:03 localhost kernel: PPP: version 2.3.7 (demand dialling)
Mar 8 11:06:03 localhost kernel: PPP line discipline registered.
Mar 8 11:06:03 localhost kernel: registered device ppp0
Mar 8 11:06:03 localhost pppd[806]: pppd 2.3.11 started by root, uid 0
Mar 8 11:06:04 localhost chat[807]: timeout set to 3 seconds
Mar 8 11:06:04 localhost chat[807]: abort on ( BUSY )
Mar 8 11:06:04 localhost chat[807]: abort on ( NO ANSWER )
Mar 8 11:06:04 localhost chat[807]: abort on ( RINGING RINGING )
Mar 8 11:06:04 localhost chat[807]: send (rAT^M)
Mar 8 11:06:04 localhost chat[807]: expect (OK)
Mar 8 11:06:04 localhost chat[807]: rAT^M^M
Mar 8 11:06:04 localhost chat[807]: OK
Mar 8 11:06:04 localhost chat[807]: -- got it
Mar 8 11:06:04 localhost chat[807]: send (ATH0^M)
Mar 8 11:06:04 localhost chat[807]: timeout set to 90 seconds
Mar 8 11:06:04 localhost chat[807]: expect (OK)
Mar 8 11:06:04 localhost chat[807]: ^M
Mar 8 11:06:05 localhost chat[807]: ATH0^M^M
Mar 8 11:06:05 localhost chat[807]: OK
Mar 8 11:06:05 localhost chat[807]: -- got it
Mar 8 11:06:05 localhost chat[807]: send (ATDP9566285^M)
Mar 8 11:06:05 localhost chat[807]: abort on ( NO CARRIER )
Mar 8 11:06:05 localhost chat[807]: expect (CONNECT)
Mar 8 11:06:05 localhost chat[807]: ^M
Mar 8 11:06:45 localhost chat[807]: ATDP9566285^M^M
Mar 8 11:06:45 localhost chat[807]: CONNECT
Mar 8 11:06:45 localhost chat[807]: -- got it
Mar 8 11:06:45 localhost chat[807]: send (^M)
Mar 8 11:06:45 localhost chat[807]: expect (ogin:)
Mar 8 11:06:45 localhost chat[807]: 33600/ARQ/V34/LAPM/V42BIS^M
Mar 8 11:06:46 localhost chat[807]: ^M
Mar 8 11:06:46 localhost chat[807]: Welcome to Demos (HQ-4.Demos.net)^M
Mar 8 11:06:46 localhost chat[807]: ^M
Mar 8 11:06:46 localhost chat[807]: (tty115) login:
Mar 8 11:06:46 localhost chat[807]: -- got it
Mar 8 11:06:46 localhost chat[807]: send (cooluser^M)
Mar 8 11:06:46 localhost chat[807]: expect (assword:)
Mar 8 11:06:49 localhost chat[807]: superpassword^M
Mar 8 11:07:00 localhost chat[807]: Password:
Mar 8 11:07:00 localhost chat[807]: -- got it
Mar 8 11:07:00 localhost chat[807]: send (superpassord^M)
Mar 8 11:07:01 localhost pppd[806]: Serial connection established.
Mar 8 11:07:01 localhost pppd[806]: Using interface ppp0
Mar 8 11:07:01 localhost pppd[806]: Connect: ppp0 <--> /dev/modem
Mar 8 11:07:02 localhost kernel: PPP BSD Compression module registered
Mar 8 11:07:02 localhost kernel: PPP Deflate Compression module registered
Mar 8 11:07:03 localhost pppd[806]: local IP address 195.133.9.195
Mar 8 11:07:03 localhost pppd[806]: remote IP address 194.87.15.4
Конечно, тут я поменял рельные логин-пароль на вымышленные.
Все, последние строчки нам говорят, что провайдером нам выделен IP адрес 195.133.9.195 и мы в сети. Если же вы получили кучу строк про LCP-timeout, то скорее всего, вы просто не до конца написали chat-скрипт. То есть авторизационный сервер провайдера ждет чего-то от вас, а вы уже запустили PPP, который ждет стандартных заголовков PPP.
Если у вас не установлен DNS сервер, то узнайте его адреса у провайдера и исправьте файл /etc/resolv.conf, что бы он выглядел подобно
nameserver x.x.x.x
search
где x.x.x.x - IP-адрес DNS-сервера провайдера. Но я вам рекомендую поставить локальный DNS-сервер, хотя бы кеширующий - слабый модемный канал не будет забиваться DNS запросами.
Теперь вы можете запускать качалки с нетскейпами и всем прочим - все должно работать.
Конечно, рано или поздно надо отключаться. Конечно, можно это делать, нажимая кнопки на модеме или выдергивая телефонный шнур, но это очень не удобно в том случае, если у вас провайдер с хорошим ночным тарифным планом - пусть сам комп сбрасывает соединение, когда все, что нужно выкачается.
Этот скрипт ppp-off я никак не изменял - просто вырезал для уменьшения обьема комментарии.
#!/bin/sh
if [ "$1" = "" ]; then
DEVICE=ppp0
else
DEVICE=$1
fi
if [ -r /var/run/$DEVICE.pid ]; then
kill -INT `cat /var/run/$DEVICE.pid`
if [ ! "$?" = "0" ]; then
rm -f /var/run/$DEVICE.pid
echo "ОШИБКА: Нет pid файла"
exit 1
fi
echo "PPP соединение на $DEVICE сброшено."
exit 0
fi
echo "ОШИБКА: PPP соединение не активно на $DEVICE"
exit 1
Вот и все ;-).