СЕРГЕЙ РОПЧАН
Настройка Incoming Connections в Linux
В любой фирме наверняка найдётся один-два человека, которым жизненно необходимо получать почту за пределами «офисной сети». Хорошо, если ваш шеф человек с понятием и свято чтит КЗОТ, тогда он просто скажет: «Ребята, в воскресенье нужно отдыхать!». А если нет? Тогда не остается ничего другого, кроме как отвлечься на пару минут от раскладывания пасьянса и сделать это. Для тех, кто еще не понял – в статье пойдет речь о том, как настроить удаленный доступ к серверу.
Во избежание всевозможных вопросов, в том числе и системных (и да не нарветесь вы на kernel panic), на всякий случай уточняю:
- В качестве модема использовалась покрытая пылью коробочка с надписью «ZyXEL 228S».
- Подключалось это к серийному порту почтового сервера.
- В качестве операционной системы стоял, стоит и будет стоять 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 ), а вот init ненавязчиво просим перечитать свой конфигурационный файл при помощи сигнала «SIGHUP»: kill -SIGHUP . После этого можно попробовать тестирования ради убить несколько раз 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-соединение и её параметры:
- auth означает, что перед тем как пустить клиента в сетку, необходимо провести авторизацию;
- -chap – не проводить chap-авторизацию;
- +pap – проводить pap-авторизацию;
- login – использовать для pap-авторизации базу зарегистрированных в системе пользователей;
- modem – «общаться с модемом» (ждать CD, подавать DTR);
- crtscts – использовать хардварный flow control (RTS/CTS) при работе с серийным портом;
- lock – создавать lock-файл, дабы доступ к устройству был эксклюзивным;
- proxyarp – «добавлять» хост клиента в локальную сеть.
Шаг 4
Чтобы клиент успешно прошел авторизацию, необходимо сделать две вещи: добавить пользователя в систему (adduser , passwd ) и добавить регистрационную информацию в файл /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/’
|
01–03 – блокировка линии.
- 04–08 – инициализация модема.
- 09 – ждем-c, пока кто-нибудь позвонит.
- 10–14 – поднятие трубки после четырех гудков.
- 15–18 – обмен информацией.
- 19 – считывание конфига.
- 20 – поднятие PPP и, собственно, клиент получил доступ к серверу.
Теперь, когда поставленная задача решена, самое время подумать о «наворотах».
Во-первых, давать ли пользователю доступ ко всей «офисной сети» или ограничить его коннектом с почтовым сервером?
Во-вторых, если в вашей сети есть пользователи, считающие себя хакерами, то хранение паролей в открытом виде – не очень хороший способ.
В-третьих, возможно, имеет смысл настроить mgetty таким образом, чтобы после установки соединения модем сервера прерывал его и тут же пытался дозвониться модему клиента сам...