Сергей Ропчан
В любой фирме наверняка найдётся один-два человека, которым жизненно
необходимо получать почту за пределами «офисной сети». Хорошо, если ваш шеф
человек с понятием и свято чтит КЗОТ, тогда он просто скажет: «Ребята, в
воскресенье нужно отдыхать!». А если нет? Тогда не остается ничего другого,
кроме как отвлечься на пару минут от раскладывания пасьянса и сделать это. Для
тех, кто еще не понял – в статье пойдет речь о том, как настроить удаленный
доступ к серверу.
Во избежание всевозможных
вопросов, в том числе и системных (и да не нарветесь вы на kernel panic), на
всякий случай уточняю:
n В качестве модема использовалась покрытая пылью
коробочка с надписью «ZyXEL 228S».
n Подключалось это к серийному порту почтового
сервера.
n В качестве операционной системы стоял, стоит и
будет стоять ASPLinux версии 7.2.
Что ж, приступим.
Шаг 1
После того, как модем должным образом подключен и сконфигурирован, например,
утилитой kudzu, попробуем его для начала протестировать на предмет поднятия
трубки. Для этого запускаем программу /sbin/mgetty (не путать с mingetty!)
следующим образом:
mgetty -D -s 38400 -n 4 ttyS1
То есть указываем mgetty работать с модемом на
линии /dev/ttyS1 только в режиме DATA (-D) со скоростью 38400 (-s), а трубку
поднимать только после четвертого гудка (-n). Если модем действительно
подключен к этой линии (а не к ttyS0, например), то при попытке дозвона вы
услышите ровно четыре длинных гудка, прежде чем модем «поднимет трубку».
Шаг 2
Все устройства, с помощью которых можно получить доступ на линуксовый
сервер, должны быть должным образом прописаны в файле /etc/inittab. Программа init
считывает этот файл и «принуждает» определенные программы отслеживать попытки
регистрации в системе через эти устройства. Чтобы каждый раз не запускать mgetty
руками, переложим это занятие на широкие плечи init.
Открываем файл inittab и дописываем туда
вышеуказанную командную строку следующим образом:
s1:2345:respawn:/sbin/mgetty
-D -s 38400 -n 4 ttyS1
То есть даем init ценное указание под кодовым
названием s1: активизировать mgetty на четырех уровнях запуска (2345) и
«держать его постоянно» (respawn).
Даем команду ps fax|less, чтобы узнать PID
процесса init (а вдруг он не равен 1?) и PID mgetty (а вдруг он остался висеть
после «ручного» запуска?). Процесс mgetty, если он подгружен, убиваем обычным
образом (kill <PID>), а вот init ненавязчиво просим перечитать свой
конфигурационный файл при помощи сигнала «SIGHUP»: kill -SIGHUP <PID>.
После этого можно попробовать тестирования ради убить несколько раз mgetty – он
все равно будет появляться автоматически под новыми PID’ами. Именно подобное
поведение процесса, кстати говоря, и подразумевается под параметром respawn в inittab.
Шаг 3
Теперь необходимо сконфигурировать mgetty так, чтобы при успешном коннекте
инициировалось PPP-соединение. Для этого открываем конфигурационный файл /etc/mgetty+sendfax/login.conf
и пишем там следующее (остальные строчки конфига лично я удалил):
/AutoPPP/ --ppp /usr/sbin/pppd
auth -chap +pap login modem crtscts lock proxyarp
/AutoPPP/ расшифровывается как
«обнаруживать PPP-соединение автоматически». Далее следует путь к программе,
которую нужно запустить при обнаружении попытки установить PPP-соединение и её
параметры:
n auth означает, что перед тем как пустить
клиента в сетку, необходимо провести авторизацию;
n -chap – не проводить chap-авторизацию;
n +pap – проводить pap-авторизацию;
n login – использовать для pap-авторизации базу
зарегистрированных в системе пользователей;
n modem – «общаться с модемом» (ждать CD,
подавать DTR);
n crtscts – использовать хардварный flow control
(RTS/CTS) при работе с серийным портом;
n lock – создавать lock-файл, дабы доступ к
устройству был эксклюзивным;
n proxyarp – «добавлять» хост клиента в локальную
сеть.
Шаг 4
Чтобы клиент успешно прошел авторизацию, необходимо сделать две вещи:
добавить пользователя в систему (adduser <username>, passwd <username>)
и добавить регистрационную информацию в файл /etc/ppp/pap-secrets.
#Secrets for authentication using
PAP
#client server secret IP addresses
dialup * qwerty
192.168.1.254
Под client подразумевается имя пользователя; * server
говорит о том, что пользователь под этим именем может подключаться к любым
сервисам; secret – это пароль (он должен быть тем же самым, что и при
добавлении пользователя в систему); IP addresses – IP-адрес, под которым
дозвонившийся клиент будет работать в сети.
Все, теперь можно тестировать mgetty по полной
программе.
Шаг 5
Лог mgetty находится в файле mgetty.log.ttyS1 каталога /var/log и выглядит
он следующим образом (я пронумеровал строки, чтобы было легче их
комментировать).
00 —
01 09/23 14:34:28
yS1 mgetty: experimental test release 1.1.26-Apr16
02 09/23 14:34:28
yS1 check for lockfiles
03 09/23 14:34:28
yS1 locking the line
04 09/23 14:34:28
yS1 lowering DTR to reset Modem
05 09/23 14:34:29
yS1 send: \dATQ0V1H0[0d]
06 09/23 14:34:29
yS1 waiting for «OK» ** found **
07 09/23 14:34:30
yS1 send: ATS0=0Q0&D3&C1[0d]
08 09/23 14:34:30
yS1 waiting for «OK» ** found **
09 09/23 14:34:30
yS1 waiting...
10 09/23 14:35:25
yS1 wfr: waiting for «RING»
11 09/23 14:35:25
yS1 wfr: waiting for «RING»
12 09/23 14:35:30
yS1 wfr: waiting for «RING»
13 09/23 14:35:35
yS1 wfr: waiting for «RING»
14 09/23 14:35:40
yS1 send: ATA[0d]
15 09/23 14:35:40
yS1 waiting for «CONNECT» ** found **
16 09/23 14:35:59
yS1 send:
17 09/23 14:35:59
yS1 waiting for «_» ** found **
18 09/23 14:36:01
yS1 clean_line: only 500 of 5277 bytes logged
19 09/23 14:36:11
yS1 login.config: max. 9 command line arguments possible
20
09/23 14:36:11 ##### data dev=ttyS1, pid=2307,
caller=’none’, conn=’38400/V.34 28800/None’, name=’’, cmd=’/usr/sbin/pppd’,
user=’/AutoPPP/’
n 01–03 – блокировка
линии.
n 04–08 – инициализация модема.
n 09 – ждем-c, пока кто-нибудь позвонит.
n 10–14 – поднятие трубки после четырех гудков.
n 15–18 – обмен информацией.
n 19 – считывание конфига.
n 20 – поднятие PPP и, собственно, клиент получил
доступ к серверу.
Теперь, когда поставленная задача решена, самое
время подумать о «наворотах».
Во-первых, давать ли пользователю доступ ко всей
«офисной сети» или ограничить его коннектом с почтовым сервером?
Во-вторых, если в вашей сети есть пользователи,
считающие себя хакерами, то хранение паролей в открытом виде – не очень хороший
способ.
В-третьих, возможно, имеет смысл настроить mgetty
таким образом, чтобы после установки соединения модем сервера прерывал его и
тут же пытался дозвониться модему клиента сам...