Настройка callback в pppd


Идея прозвонки к провайдеру, который поддерживает callback, основывается на использовании chat-скриптов. При первоначальной прозвонке pppd "просит" провайдера перезвонить, отключается, а затем модем переходит в режим ожидания ответа. После поступления входящего звонка устанавливается PPP-соединение. Более подробно о настройке pppd можно прочитать в статье Игоря Сысоева, с которой настоятельно рекомендую ознакомиться.

Для такой прозвонки понадобятся два chat-скрипта. Первый - это скрипт, который будет запрашивать у удаленной стороны callback. Запишем его в файл /etc/ppp/chat-cbcp:

#!/bin/sh
#
# Request for callback
#
chat -V -s				\
	ABORT	"ERROR"			\
	ABORT	"NO DIALTONE"		\
	TIMEOUT	5			\
	""	"AT"			\
	"OK"	"ATZ"			\
	"OK"	"ATS7=60\&C0\&D1"	\
	ABORT	"BUSY"			\
	ABORT	"NO ANSWER"		\
	ABORT	"NO CARRIER"		\
	ABORT	"Login incorrect"	\
	"OK"	"ATDT1234567"		\
	TIMEOUT	30			\
	"CONNECT"	"\\c"		\
	TIMEOUT	10			\
	"rname:"	"\\c"

exit 0

Скрипт должен иметь права доступа 0500 (r-x --- ---). Само собой, что вместо 1234567 вам необходимо указать телефон своего провайдера. После того, как дозвонились, удаленная сторона спрашивает "Username:" и происходит PAP-аутентификация. В этом случае нужно создать файл /etc/ppp/pap-secrects с правами доступа 0600 (rw- --- ---) и записать в него ваш логин, название удаленной системы и пароль:

jm	my_isp	pass627789

Название удаленной системы может быть любым. Что же касается пароля, то в нем могут использоваться специальные символы, например '#', который будет рассматриваться как начало комментария. Поэтому такой пароль необходимо заключить в двойные кавычки:

jm	my_isp	"pass62#7789"

Если провайдер PAP-аутентификацию не поддерживает, потребуется небольшая переделка скрипта:

#!/bin/sh
#
# Request for callback
#
chat -V -s				\
	ABORT	"ERROR"			\
	ABORT	"NO DIALTONE"		\
	TIMEOUT	5			\
	""	"AT"			\
	"OK"	"ATZ"			\
	"OK"	"ATS7=60\&C0\&D1"	\
	ABORT	"BUSY"			\
	ABORT	"NO ANSWER"		\
	ABORT	"NO CARRIER"		\
	ABORT	"Login incorrect"	\
	"OK"	"ATDT1234567"		\
	TIMEOUT	30			\
	"CONNECT"	"\\c"		\
	TIMEOUT	10			\
	"rname:"	"jm"		\
	"sword:"	"pass627789"	\
	"}"		"\\c"

exit 0

Проверьте наличие файла /etc/ppp/options:

modem
crtscts
asyncmap 0

Если pppd находится на этапе отладки, то в него можно еще добавить строки с параметрами "kdebug 7" и "debug". Обратите внимание, что в /etc/ppp/options не должно быть параметра "lock"!

Далее необходимо создать файл /etc/ppp/options.cbcp, который должен содержать следующее:

nodefaultroute
noipdefault
nodetach
nopersist
connect '/etc/ppp/chat-cbcp'
user jm
remotename my_isp
callback 3222232

Единственная задача этого файла - сообщить удаленной системе, по какому телефону она должна перезвонить. Для этого используется параметр "callback" с нашим номером телефона.

Если все сделано правильно, то теперь можно позвонить провайдеру и получить от него входящий звонок (cuaa1 - это, разумеется, имя устройства, на котором висит наш модем):

/usr/sbin/pppd cuaa1 57600 file /etc/ppp/options.cbcp

Теперь подготовим второй chat-скрипт, который на эти звонки будет отвечать:

#!/bin/sh
#
# dial for callback
/usr/sbin/pppd cuaa1 57600 file /etc/ppp/options.cbcp

# answering...
chat -V	-s			\
	TIMEOUT	30		\
	ABORT	"ERROR"		\
	"RING"	ATA		\
	"CONNECT"	"\\c"

if [ "$?" = "0" ]; then
	exit 0
fi

exit 1

Не забудьте установить на него права доступа 0500 (r-x --- ---). Конечно, этот скрипт нуждается в небольшом изменении, если не используется PAP:

#!/bin/sh
#
# dial for callback
/usr/sbin/pppd cuaa1 57600 file /etc/ppp/options.cbcp

# answering...
chat -V	-s				\
	TIMEOUT	30			\
	ABORT	"ERROR"			\
	"RING"	ATA			\
	"CONNECT"	"\\c"		\
	TIMEOUT	10			\
	"rname:"	"jm"		\
	"sword:"	"pass627789"	\
	"}"		"\\c"

if [ "$?" = "0" ]; then
	exit 0
fi

exit 1

В файл /etc/ppp/options.dial запишем параметры, которые нам действительно нужны для работы:

defaultroute
noipdefault
connect '/etc/ppp/chat-dial'
user jm
remotename my_isp

Добавление в этот файл параметра "persist" позволит восстанавливать связь в случае ее обрыва и т.п. В конечном итоге, запуск pppd будет выглядеть так:

/usr/sbin/pppd cuaa1 57600 file /etc/ppp/options.dial

Таким образом получается, что стартовавший pppd запускает pppd еще один раз, инициируя звонок от провайдера, после чего на него отвечает и устанавливает PPP-линк.


Юрий Милоданович / Juri Milodanovic
jm@evpatoria.net