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

Ссылки

Личные инструменты