Аннотация |
Этот документ описывает установку call-back в Linux. Хочу поблагодарить Анну за терпение. |
Мне необходимо ваше мнение об этом документе. Я попытался собрать полную информацию, на сколько это возможно, и буду вам благодарен, если вы найдете ошибки и сообщите мне свои соображения. Это сделает документ полнее. Тем не менее, я не буду отвечать на ваши вопросы, если вы не прочитали текст целиком.
Документ издается согласно условиям LDP (Linux Documentation Project). Можете связаться с автором, если у вас нет этих условий. Документ бесплатный.
Авторские права на русский перевод этого текста принадлежат (c) 2000 ASPLinux Все права зарезервированы.
Этот документ является частью проекта Linux HOWTO.
Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но так или иначе автор текста и автор перевода желали бы знать о таких дистрибутивах.
Все переводы и производные работы, выполненные по документам Linux HOWTO должны сопровождаться этой заметкой об авторских правах. Это делается в целях предотвращения случаев наложения дополнительных ограничений на распространение документов HOWTO. Исключения могут составить случаи получения специального разрешения у координатора Linux HOWTO с которым можно связаться по адресу приведенному ниже.
Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: <linux-howto@metalab.unc.edu>, или к координатору русского перевода Linux HOWTO компании ASPLinux по адресу <linux-howto@asplinux.ru>
Большинство из нас пользуются Интернетом на работе. Тем не менее, часто необходим доступ к сети из дома или другого места вне работы. Возможно, работать из дома дешевле, чем из здания компании. Думаю, лучшее решение - установить на сервер Linux программное обеспечение, позволяющее производить call-back. При помощи технологии call-back, появляется возможность перезвонить на определенный телефонный номер за счет компании. Я попытаюсь описать, как это работает. Сначала определенный пользователь звонит на сервер Linux. Затем пользовательская сторона кладет трубку. В это время Linux звонит пользователю. Пользователь снова аутентифицируется. И мы получаем соединение с сервером, причем пользователь платит только за первое короткое соединение, за остальное платит компания. Двойная проверка и некоторые возможности в программе, поддерживающей call-back, не позволяют посторонним пользователям воспользоваться деньгами компании. Кроме того, мы можем ограничить доступ только пределами внутренней сети или только Интернетом (Call-back очень гибок). Ниже я попытаюсь представить настройку call-back сервера под Linux и расскажу, как настроить свой компьютер для этой операции.
Разные администраторы предпочитают разные модемы. Однако, во время покупки модема, вам нужно придерживаться определенных правил:
Не покупайте Win-Modem, т.к. он не работает под Linux
Внешний модем работает быстрее, чем внутренний.
Внутренний ISA модем лучше PCI (вы можете использовать PCI слот для чего-нибудь другого)
Не покупайте Plug&Play модем. Если он уже у вас есть, отключите Plug&Play и настройте модем на свободный COM порт (Plug&Play-HOWTO).
Если у нас есть нужный модем, мы должны настроить систему. Для этого мы должны проверить на каком он порту, и сделать символьный линк между файлом устройства и /dev/modem. Например, если у нас модем на COM2, мы пишем:
ln -s /dev/cua1 /dev/modem
Проверяем
lrwxrwxrwx 1 root uucp 9 Sep 19 19:10 /dev/modem -> /dev/cua1
Если модем на другом порту, надо запомнить, что
/dev/cua0 is com1 /dev/cua1 is com2 /dev/cua2 is com3 /dev/cua3 is com4
Для новых ядер:
/dev/ttyS0 is com1 /dev/ttyS1 is com2 /dev/ttyS2 is com3 /dev/ttyS3 is com4
Теперь можно проверить наши настройки при помощи minicom.
Для начала, нам нужно настроить параметры ядра - проверяем, установлена ли поддержка ppp. Если поддержка не включена (ни внутри ядра, ни в виде модуля), то нам нужно пересобрать ядро (Kernel-HOWTO). Хорошо. Теперь у нас правильное ядро, и нам нужно поставить программное обеспечение. Поддержка call-back - это часть программ mgetty-sendfax и ppp. Вы можете найти их в вашем дистрибутиве. Т.к. в процессе call-back происходит двойная аутентификация, мы должны создать пользователя, от имени которого запускается ppp на сервере.
pppuser:klkIOM89mn65H:230:PPP Dialin:/home/pppuser:/etc/ppp/ppplogin
Затем меняем пароль. Информацию о пароле надо добавить в файл /etc/ppp/pap-secrets (подробнее см. man pppd):
pppuser * password_for_pppuser *
Этот пользователь не имеет програмной оболочки - вместо этого запускается файл /etc/ppp/ppplogin. Мы можем сделать его самостоятельно. Например, при помощи vi /etc/ppp/ppplogin:
#!/bin/sh exec /usr/sbin/pppd -detach 192.168.1.1:192.168.1.2
где 192.168.1.1 - адрес сервера, 198.168.1.2 - адрес нашей машины. Выставляем атрибуты файла, делая его запускаемым. Мы используем демон ppp, поэтому нам надо задать параметры его работы. Редактируем файл /etc/ppp/options:
netmask 255.255.255.0 proxyarp lock crtscts modem
Опция proxyarp очень важна, если вы хотите иметь доступ в Интернет. Остальные опции используются для управления модемом. Если вы уберете опцию proxyarp, то вы сможете работать только с локальной сетью сервера. См. PPP-HOWTO и man pppd для более подробной информации. Теперь нам надо настроить модем. Чтобы наш сервер был готов к приему звонков, добавим строку в файл /etc/inittab (для COM2):
s1:2345:respawn:/sbin/mgetty ttyS1 -D /dev/ttyS1 vt100
Для COM1 она выглядит примерно так:
s0:2345:respawn:/sbin/mgetty ttyS1 -D /dev/ttyS1 vt100
Дайте команду init q. Если в журналах не появилось сообщений об ошибках, переходим к следующему шагу. Мы должны вернуться в каталог /etc/ppp и создать файл options.ttyS1 (для модема на COM1 - options.ttyS0):
IP_local: IP_remote
для нашей сети это будет:
192.168.1.1:192.168.1.2
Теперь проверим файл /etc/mgetty+sendfax/login.config на предмет наличия в ней строки:
/AutoPPP/ - a_ppp /usr/sbin/pppd auth -chap +pap login detach kdebug 7 debug
Остальные строки могут начинаться с #.
И наконец, чтобы ppp работало от пользователя pppuser, мы должны установить флаг suid для pppd:
chmod u+s /usr/sbin/pppd
это даст:
-rwsr-xr-x 1 root root 106892 Jan 11 1999 /usr/sbin/pppd
Я думаю, что очень неплохо добавить эту команду в cron, потому что у меня возникли проблемы с правами после перезапуска моего сервера. Наш сервер будет работать в качестве маршрутизатора. Нам надо разрешить ядру пересылать IP-пакеты. Для этого в файл /etc/rc.d/rc.local добавим следующую строку:
echo "1" > /proc/sys/net/ipv4/ip_forward
Если у вас дистрибутив RedHat или ему подобный, то вы можете изменить в файле/etc/sysconfig/network строку FORWARD_IPV4=false на FORWARD_IPV4=true.
Для проверки позвоним на Linux, используя для этого скрипт. Если мы делаем это из MS Windows, поставим галочку "вызвать окно терминала после соединения". Входим как pppuser с его паролем. Надеюсь, что все будет работать нормально.
Мы уже можем позвонить к Linux, и настало время, чтобы Linux позвонил к нам. Это не очень сложно. Нам нужно отредактировать два файла. Создадим файл /etc/mgetty+sendfax/callback.conf и пока оставим его пустым.
Теперь настало время узнать номера телефонов наших пользователей, чтобы сервер сам звонил к ним. Для этого вносим в файл /etc/mgetty+sendfax/login.conf следующее:
call - - /usr/sbin/callback - S 123456
где call - это псевдо-пользователь, нужный для того, чтобы начать соединение. Строка в /etc/mgetty+sendfax/login.conf запускает программу, звонящую на указанный телефонный номер (в нашем случае это 123456). Похожая процедура может быть выполнена для другого пользователя. Я попробую объяснить, как это работает. Когда мы звоним на сервер, он предлагает нам пройти аутентификацию, и мы входим как псевдо-пользователь `call'. Скрипт на нашем компьютере вешает трубку, и мы ждем. На сервере запускается программа /usr/sbin/callback, которая перезванивает нам. Мы снова проходим проверку, но теперь в качестве пользователя pppuser, и после этого устанавливается ppp-соединение. Все. Настройка рабочей станции очень проста. Если у вас MS Windows, вы должны установить удаленный доступ сети и в свойствах модема найти "установка связи-->дополнительно-->строка инициализации", где прописываем.
&c0s0=1
Закрываем окно, звоним и заходим на сервер как описано выше. Если мы хотим использовать Linux, мы должны написать скрипт. Довольно сложно написать один хороший скрипт на все случаи жизни, т.к. правильная конфигурация ppp имеет первичное значение. Скрипты, описанные ниже (автор A. Gozdz), я предложил бы поместить в один каталог. Более подробную информацию читайте в PPP-HOWTO.
ДЛЯ SLACKWARE:
Конфигурационный файл ppp (модем на COM2) /etc/options
lock defaultroute noipdefault modem /dev/cua1 33600 crtscts debug passive asyncmap 0 |
и специфичные скрипты
/etc/ppp/ppp-call
#!/bin/bash teksta="Соединение не удалось" tekstb="Соединение выполненно" # /sbin/setserial /dev/cua1 spd_vhi killall -INT pppd 2>/dev/null rm -f /var/lock/LCK* /var/run/ppp*.pid (/usr/sbin/pppd -detach /dev/ttyS1 115200 \ connect "/usr/sbin/chat -v -f /etc/ppp/pppcallback" &) || \ (echo $teksta; ls marsss >/dev/null; exit 1) echo $tekstb exit 0 |
/etc/ppp/pppcallback
TIMEOUT 60 ABORT 'ERROR' ABORT 'BUSY' ABORT 'NO ANSWER' ABORT 'NO DIALTONE' ABORT '\nVOICE\r' ABORT '\nRINGING\r\n\r\nRINGING\r' '' AT&FH0 <p>'OK-+++\c-OK' 'AT&C0S0=1' TIMEOUT 75 OK ATDT123456 CONNECT '' ogin:-ogin: ppp_pseudouser '\nNO CARRIER\r' '' TIMEOUT 180 '\nRING\r' AT&C1A CONNECT '' TIMEOUT 20 ogin:-ogin: pppuser sword:-sword password_for_pppuser |
Теперь вы можете запустить ppp-call. :)
ДЛЯ RED HAT 6.x:
/etc/ppp/options
lock defaultroute noipdefault modem 33600 crtscts debug passive asyncmap 0 |
/etc/ppp/pppcallback
TIMEOUT 5 ABORT 'ERROR' ABORT 'BUSY' ABORT 'NO ANSWER' ABORT 'NO DIALTONE' ABORT '\nVOICE\r' ABORT '\nRINGING\r\n\r\nRINGING\r' '' AT&FH0 'OK-+++\c-OK' 'AT&C0S0=1' TIMEOUT 40 OK ATDT5376443 CONNECT '' ogin:-ogin: ppp-pseudo-user '\nNO CARRIER\r' '' TIMEOUT 180 '\nRING\r' AT&C1A CONNECT '' TIMEOUT 20 ogin:-ogin: pppuser sword:-sword password_for_ppuser |
/usr/bin/ppp-call
#!/bin/bash teksta="Соединение не удалось" tekstb="Соединение выполненно" # /sbin/setserial /dev/cua1 spd_vhi killall -INT pppd 2>/dev/null rm -f /var/lock/LCK* /var/run/ppp*.pid (/usr/sbin/pppd -detach call ppp_call &) || \ (echo $teksta; ls marsss >/dev/null; exit 1) echo $tekstb exit 0 |
Теперь вы можете запустить ppp-call. :)
Если у вас M$ Windows, то вы можете использовать следующий скрипт. Я его не проверял (я использую терминал). Если у вас возникнут вопросы, спрашивайте автора скрипта - Adrian Debkowski (adrian@cr-media.pl).
proc main delay 1 waitfor "ogin:" transmit "call^M" waitfor "RING" transmit "ATA^M" waitfor "CONNECT" waitfor "ogin:" transmit "pppuser^M" waitfor "word:" transmit "ppp^M" endproc |
Настройка call-back ничуть не сложна, и я не знаю лучшего пути настроить доступ кроме как через сервер. Настройка, представленная выше - это результат большого количества попыток. Все то же самое может быть сделано по-другому - после прочтения всех материалов, относящихся к этой теме (man pppd, HOWTO-NET4).