DialUp Server
Материал из Belgorod Linux User Group - Белгород.
Поднятие модемного пула (dial-in сервера) на Linux с помощью PPP и mgetty.
Задача:
- Принимать входящие звонки на модеме, подключенном к /dev/ttyS0
- Поднимать PPP соединение с звонящим
- Установить TCP/IP соединение поверх PPP (выдать клиенту IP)
Содержание |
[править] Ядро
В ядре включаем поддержку протокола PPP:
CONFIG_PPP=y CONFIG_PPP_MULTILINK=y CONFIG_PPP_FILTER=y CONFIG_PPP_ASYNC=y CONFIG_PPP_SYNC_TTY=y CONFIG_PPP_DEFLATE=m CONFIG_PPP_BSDCOMP=m CONFIG_PPP_MPPE=m CONFIG_PPPOE=m CONFIG_PPPOL2TP=m
MPPE - это Microsoft Point-to-Point Compression, если он нужен - его также нужно добавить в USE флаги для ppp:
echo "net-dialup/ppp mppe-mppc" >> /etc/portage/package.use
Необходимо подгрузить модуль, если вы собрали его как (m),
modprobe ppp lsmod
[править] mgetty
За прием входящих соединений на порту отвечает демон getty (mgetty, agetty и т.п.). Мы будем использовать mgetty. Он будет висеть на порту (/dev/ttyS0) и принимать входящие соединения от модема.
emerge mgetty
[править] конфиг
/etc/mgetty+sendfax/mgetty.config
# уровень отладки (0 - нет сообщений) debug 9 fax-id 00 00 000000 speed 9600 # выделенная линия # Если мы используем обычный модем - обязательно выставить NO и не пользоваться опцией -r # в противном случаи - не будет производиться инициализация модема direct NO blocking NO # от какого пользователя пользоваться портом. port-owner uucp port-group uucp port-mode 0660 toggle-dtr YES toggle-dtr-waittime 500 # только данные (т.к. может быть и факс и голос) data-only YES # отключить "только факс" fax-only NO modem-type auto # Внимание! Обязательно отключить S0 - авто поднятие трубки модемом! # у нас трубку будет поднимать mgetty (строка answer-chat). # Иначе, если и модем будет поднимать трубку и mgetty - будет сброс линии init-chat "" ATS0=0 OK modem-check-time 3600 # количество "гудков" до поднятия rings 1 # строка ответа поднятия трубки (ATA) answer-chat "" ATA CONNECT \c \r answer-chat-timeout 80 autobauding NO # обратный дозвон - mgetty умеет перезванивать после авторизации. # Возможно выставить соответствие номера кому перезванивать в зависимости от того кто авторизовался # но мы эту опцию отключаем. ringback NO ringback-time 30 ignore-carrier false issue-file /etc/issue prompt-waittime 500 # строка запроса логина. login-prompt @!login: login-time 240 diskspace 1024 notify faxadmin fax-owner uucp fax-group modem fax-mode 0660
mgetty будет вести подробный лог файл:
/var/log/mgetty/mgetty.ttyS0
[править] inittab
Висеть mgetty будет на init-е, и подниматься после выхода (опция respawn). Добавляем в /etc/inittab запуск mgetty init'ом (по строчке на каждый порт):
d0:23:respawn:/sbin/mgetty -n 1 ttyS0
n - количество звонков до поднятия трубки
[править] ppp
После приема входящего звонка нам потребуется установка PPP соединения и последующая авторизация. Для этого ставим PPP:
emerge ppp
[править] конфиг
Описываем в файле, соответсвующем порту:
/etc/ppp/config.ttyS0
modem crtscts -detach mru 1500 mtu 1500 auth +pap login # dns сервер ms-dns 192.168.100.1 netmask 255.255.255.0 # диапазон IP, из которых будут выдаваться IP для клиентов 192.168.100.10:192.168.100.20
[править] pppd
Авторизация будет производиться посредством демона pppd, для этого создаем файл:
/etc/ppp/pap-secrets
poller * "" *
poller - имя пользователя, которого необходимо зарегистрировать в системе, и выставить ему shell /usr/sbin/pppd, и включив в группу uucp:
useradd -c incomming.call -m -s /usr/sbin/pppd -G uucp poller passwd poller
Также следует добавить /usr/sbin/pppd в список разрешенных shell-ов,
echo "/usr/sbin/pppd" >>/etc/shells
Иначе пользователь не сможет авторизоваться и будут ошибки типа:
На стороне сервера:
login[13596]: pam_tally(login:auth): pam_get_uid; no such user login[13596]: pam_unix(login:auth): check pass; user unknown login[13596]: pam_unix(login:auth): authentication failure; logname= uid=0 euid=0 tty=ttyS0 ruser= rhost= login[13596]: FAILED LOGIN (1) on 'ttyS0' FOR `UNKNOWN', User not known to the underlying authentication module
На стороне клиента:
Connect: ppp0 <--> /dev/ttyS4 Serial line is looped back. Connection terminated.
[править] тестирование
Перед тем, как выполнить
init q
чтобы ОС подхватило строку с запуском mgetty - следует проверить работоспособность в режиме debug, запустив mgetty вручную:
mgetty -x 9 -n 1 ttyS0
В другой консоли лучше открыть messages, чтобы видеть сообщения от login и от pppd
tail -f /var/log/messages
и обязательно лог mgetty:
tail -f /var/log/mgetty/mgetty.ttyS0
Далее звоним с другого модема (клиента), используя к примеру minicom:
ATD+7xxxxxx
[править] login
На клиенте вы должны увидеть приглашение логин и пароль:
CONNECT 9600/RLP This is ) .O (Linux i686 hostname!login:
Тут можно авторизоваться теми способами, которые описаны в файле /etc/mgetty+sendfax/login.config Системный вход (shell) вы можете произвести, если в этом файле есть строка:
* - - /bin/login @
Если вы введете логин и пароль shell юзера системы - должен произойти вход и вы увидите строку приглашения bash:
user@bash:~ $
В логах mgetty должно быть что-то типа:
yS0 send: ATA[0d] yS0 waiting for ``CONNECT yS0 got: ATA[0d] yS0 CND: OKATA[0d][0a]CONNECT ** found ** yS0 send: yS0 waiting for ``_ yS0 got: 9600/RLP[0d] yS0 CND: CONNECT 9600/RLP yS0 CND: found: 9600/RLP ** found ** yS0 waiting for line to clear (VTIME=3), read: [0a] yS0 looking for utmp entry... (my PID: 28754) yS0 tio_set_flow_control( HARD ) yS0 print welcome banner (/etc/issue) yS0 getlogname (FIDO AUTO_PPP), read:poller[0d] yS0 input finished with '\r', setting ICRNL ONLCR yS0 tio_get_rs232_lines: status: RTS CTS DSR DTR DCD yS0 login: use login config file /etc/mgetty+sendfax/login.config yS0 match: user='poller', key= yS0 match: user='poller', key= yS0 match: user='poller', key='/AutoPPP/' yS0 match: user='poller', key= yS0 match: user='poller', key='*'*** hit! yS0 calling login: cmd='/bin/login', argv[]='login poller' yS0 setenv: 'CALLER_ID=none' yS0 setenv: 'CONNECT=9600/RLP' yS0 setenv: 'DEVICE=ttyS0' ##### data dev=ttyS0, pid=28754, caller='none', conn='9600/RLP', name=, cmd='/bin/login', user='poller'
[править] pppd
Но у нас должна быть еще и авторизация по a_ppp. Для этого в файле /etc/mgetty+sendfax/login.config должна быть строка:
/AutoPPP/ - a_ppp /usr/sbin/pppd auth -chap +pap
Для начала проверим через minicom, должны получить строку предложения:
CONNECT 9600/RLP This is ) .O (Linux i686 hostname!login:
Далее можно ввести логин и пароль нашего модемного pppd пользователя (poller), и должно "впустить". Правда на экране вы увидите что-то наподобие:
~^?}#@!}!}!} }8}"}&} } } } }#}$@#}%}&"H6^Z}'}"}(}"gz~~^?}#@ !}!}!} }8}"}&} } } } }#}$@#}%}&"H6^Z}'}"}(}"gz~~^?}#@!}!}!} }8}"}&} } } } }#}$@#}%}&"H6^Z}'}"}(}"gz~
Зато в логах сервера должно появиться:
login[19857]: pam_unix(login:session): session opened for user poller by poller(uid=0) pppd[19864]: pppd 2.4.4 started by poller, uid 1007 pppd[19864]: Using interface ppp0 pppd[19864]: Connect: ppp0 <--> /dev/ttyS0
Дальше проверку следует уже осуществлять с помощью pppd на стороне клиента. Создаем файлы:
emerge ppp chat
Описание параметров (логин, пароль и т.п.) /etc/ppp/peers/isp
lcp-echo-failure 0 lcp-echo-interval 0 /dev/ttyS4 connect "/sbin/chat -v -f /etc/ppp/peers/isp-chat" 9600 mtu 296 mru 296 novj nocrtscts ipcp-accept-local # имя пользователя user poller # ваш пароль password gfhjkm usepeerdns defaultroute noipdefault
Описание диалога: /etc/ppp/peers/isp-chat
ABORT BUSY ABORT 'NO CARRIER' ABORT VOICE ABORT 'NO DIALTONE' ABORT 'NO DIAL TONE' ABORT 'NO ANSWER' ABORT DELAYED 'AT' 'OK' 'ATDT+7xxxxxx' TIMEOUT 30 CONNECT
Как видим в этом файле описано поведение модема, т.е. чат (chat) с сервером.
А дальше звоним:
pppd call isp nodetach debug
И смотрим логи на клиенте и сервере.
В messages должно появиться :
pppd[28775]: pppd 2.4.4 started by poller, uid 1007 pppd[28775]: Using interface ppp0 pppd[28775]: Connect: ppp0 <--> /dev/ttyS0
А ваш клиент получит IP
[править] Ссылки
- http://www.opennet.ru/base/modem/dialin_v2.txt.html - обширная избыточная статья по настройке
- http://brneurosci.org/linuxsetup17.html - хорошие варианты решения проблем
- http://www.unixdoc.ru/index.php?mode=2&podmode=1&arcicle_id=57 - рабочий пример
- http://itdoc.com.ua/showthread.php?t=147
- http://linux.yaroslavl.ru/docs/serv/pppd/ppp-dialin.html
- http://linux.yaroslavl.ru/docs/serv/pppd/dial-in.html
- http://sysoev.ru/pppd/mgetty.html

