среда, 4 ноября 2009 г.

Быстро поднимаем DialIn Server


XXI-ый век... В то время, когда космические кормабли бороздят просторы.... Нет. В то время когда инет стал быстрым, дешевым, безлимитным такой архаизм как dial-up может вызвать только умешку, но тем не менее есть места где до сих пор используеться это чудо инженерной мысли. И собственно говоря даже есть люди которым нужно следить за обородуванием из прошлого и как-то уживаться с ним.

Это был пролог. Теперь же ближе к сути. Имееться старый dialin сервер (PIII, FreeBSD 4.6) с  модемным пулом в 12 Зикселей, обслуживает около трех-четырех одновременных подключений. Задача: Перенести это все дело на отдельный, относительно новый сервер (2*Dual Xeon 2,2; 2048 RAM; 160GB Raid-0;1Gbps link). Строго говоря, такая конфигурация для таких целей не то что слишком хорошая, она просто нереальная. Задействовано будет около 1% мощностей, но поскольку другой машины просто небыло, а старый сервер уже вот вот прикажет долго жить, было решено сделать на чем есть, а незадействованные ресурсы потом придумаем как использовать, хоть поднять несколько виртуальных машин для грубых экспериментов. Основная задача DialIn в нашей организации - предоставление интернета на скорости около 56Kbps, а так же пропуск некоторых пользователей к корпоративному почтовому серверу.
Специально для всей этой кухни закупили две платки Moschip MCS 9865. В графе поддерживаемых драйверов значиться Linux Kernel 2.6.14 & above. Хмм... Нативная поддержка в Линукс это уже что-то. В качестве дистрибутива был выбран Debian 5.0 Lenny. Ну что ж все в сборе, можно приступать.



Поехали

Инсталяция Debian'а самая стандартная, благо сейчас с установкой Линукса может справиться любой школьник. Я использовал текстовый режим, из компонентов остаавил только базовую систему, больше ничего не требуеться. После установки несем сервер его будущий дом, тобишь серверную, подключаем там все модемы к RS232-портам, само собой питание и сеть. Все дальнейшие действия совершаем удаленно, с рабочего места.
Собственно что нам нужно сделать:
  1. Собрать и подгрузить драйвер для MCS9865.
  2. Настроить mgetty для приема вызовов.
  3. Настроить PPP для установления связи.
  4. Создать правила файрволла.
  5. Забыть о сервере.
1. Драйвер. Копируем с диска к плате архив MCS9865_Linux.tar.gz.
dialin:~# сp /media/cdrom/drivers/Linux/MCS9865_Linux.tar.gz ~/
dialin:~# tar zxvf MCS9865_Linux.tar.gz
dialin:~# cd MCS9865_Linux
dialin:~# make



И сразу же получаем:


make -C /lib/modules/2.6.26-2-686/build/ SUBDIRS=/root/MCS9865_Linux modules
make[1]: Entering directory `/usr/src/linux-headers-2.6.26-2-686'
  CC [M]  /root/MCS9865_Linux/mcs9865.o
/root/MCS9865_Linux/mcs9865.c: In function ‘serial9865_probe’:
/root/MCS9865_Linux/mcs9865.c:2068: error: ‘SA_SHIRQ’ undeclared (first use in this function)
/root/MCS9865_Linux/mcs9865.c:2068: error: (Each undeclared identifier is reported only once
/root/MCS9865_Linux/mcs9865.c:2068: error: for each function it appears in.)
make[2]: *** [/root/MCS9865_Linux/mcs9865.o] Ошибка 1
make[1]: *** [_module_/root/MCS9865_Linux] Ошибка 2
make[1]: Leaving directory `/usr/src/linux-headers-2.6.26-2-686'
make: *** [default] Ошибка 2


Ну что же, мы не ищем легких путей. Открываем файл mcs9865.c на 2068-ой строке и видим:
//Register a ISR
        if ((retval = request_irq(dev->irq, serial9865_interrupt,SA_SHIRQ,"mcs9865-serial",&serial9865_ports[retval])))
                  goto disable;

Да, я знаю о чем вы подумали, использовать goto плохо, это влечет за собой уменьшение толщины озонового слоя... Сейчас речь не об этом. Как говорил нам make ‘SA_SHIRQ’ undeclared,
а благодаря гуглу мы узнаем что SA_SHIRQ уже два года как deprecated и что заменить его нужно на волшебный IRQF_SHARED. После всех этих шаманств, командуем: 
make && make install
И драйвер должен нормально собраться, проинсталлироваться и подгрузиться как модуль. Проверяем модули и выдачу lspci:
dialin:~/MCS9865_Linux# lsmod | grep mcs9865
mcs9865               16736  2
mcs9865_isa           2500   0
dialin:~/MCS9865_Linux# lspci -v | grep -i "NetMos"
03:01.0 Serial controller: NetMos Technology Device 9865 (prog-if 02 [16550])
03:01.1 Serial controller: NetMos Technology Device 9865 (prog-if 02 [16550])
03:01.2 Communication controller: NetMos Technology Device 9865
03:02.0 Serial controller: NetMos Technology Device 9865 (prog-if 02 [16550])
03:02.1 Serial controller: NetMos Technology Device 9865 (prog-if 02 [16550])
03:02.2 Communication controller: NetMos Technology Device 9865

 Как видим все отлично поставилось и определилось. В /dev/ появились 4 устройства ttyD0-D3, и 4 ttyS0-S3. Что-то тут не то. Как видно по выводу lspci, имеються две платы-контроллеры с двумя портами на борту и к ним подсоединены по две двухпортовые железки. Тоесть всего портов должно быть 12, а у нас 8. После непродолжительного гугления выяснилось что по умолчанию Линукс отображает только 4 устройства /dev/ttyS и чтобы увеличить это число нужно при загрузке передать ядру параметр 8250.nr_uarts=x, где х - необходимое количество устройств. Приводим /boot/grub/menu.lst к следующему виду:
default         0
timeout         5
color cyan/blue white/blue

title        Debian GNU/Linux, kernel 2.6.26-2-686
root         (hd0,0)
kernel       /vmlinuz-2.6.26-2-686 root=/dev/sda3 ro 8250.nr_uarts=16
initrd       /initrd.img-2.6.26-2-686

title        Debian GNU/Linux, kernel 2.6.26-2-686 (single-user mode)
root         (hd0,0)
kernel       /vmlinuz-2.6.26-2-686 root=/dev/sda3 ro single
initrd       /initrd.img-2.6.26-2-686


Перезагружаемся, логинимся и видим:
dialin:/boot/grub# ls -l /dev/tty[SD]*
crw-rw---- 1 root dialout 201,  0 Ноя  3 13:37 /dev/ttyD0
crw-rw---- 1 root dialout 201,  1 Ноя  3 08:00 /dev/ttyD1
crw-rw---- 1 root dialout 201,  2 Ноя  3 08:00 /dev/ttyD2
crw-rw---- 1 root dialout 201,  3 Ноя  3 08:00 /dev/ttyD3
crw-rw---- 1 root dialout   4, 64 Ноя  3 08:00 /dev/ttyS0
crw-rw---- 1 root dialout   4, 65 Ноя  3 08:00 /dev/ttyS1
crw-rw---- 1 root dialout   4, 74 Ноя  3 08:00 /dev/ttyS10
crw-rw---- 1 root dialout   4, 75 Ноя  3 08:00 /dev/ttyS11
crw-rw---- 1 root dialout   4, 76 Ноя  3 08:00 /dev/ttyS12
crw-rw---- 1 root dialout   4, 77 Ноя  3 08:00 /dev/ttyS13
crw-rw---- 1 root dialout   4, 78 Ноя  3 08:00 /dev/ttyS14
crw-rw---- 1 root dialout   4, 79 Ноя  3 08:00 /dev/ttyS15
crw-rw---- 1 root dialout   4, 66 Ноя  3 08:00 /dev/ttyS2
crw-rw---- 1 root dialout   4, 67 Ноя  3 08:00 /dev/ttyS3
crw-rw---- 1 root dialout   4, 68 Ноя  3 08:00 /dev/ttyS4
crw-rw---- 1 root dialout   4, 69 Ноя  3 08:00 /dev/ttyS5
crw-rw---- 1 root dialout   4, 70 Ноя  3 08:00 /dev/ttyS6
crw-rw---- 1 root dialout   4, 71 Ноя  3 08:00 /dev/ttyS7
crw-rw---- 1 root dialout   4, 72 Ноя  3 08:00 /dev/ttyS8
crw-rw---- 1 root dialout   4, 73 Ноя  3 08:00 /dev/ttyS9
dialin:/boot/grub#


То что нужно. Теперь ставим необходимое ПО:
dialin:/boot/grub# aptitude install uucp mgetty ppp
Говорим init'у что будем использовать модемы:
dialin:~# vim /etc/inittab
D0:23:respawn:/sbin/mgetty -D -n 3 ttyD0
D1:23:respawn:/sbin/mgetty -D -n 3 ttyD1
D2:23:respawn:/sbin/mgetty -D -n 3 ttyD2
И так далее для всех остальных модемов. Пару слов о том что все это значит. 23 - указывает на каких уровнях запуска (runlevels) будет действовать запись, respawn заставляет init перезапускать mgetty после отсоединения пользователей, число после -n, говорит через сколько звонков модем должен поднять трубку. Чтобы изменения вступили в силу, перезапускаем init:
dialin:~# kill -1 1
Теперь переходим к настройке mgetty. Собственно все опции храняться в трех файлах, директории /etc/mgetty.В /etc/mgetty/login.config вписываем строчку
/AutoPPP/ -     a_ppp   /usr/sbin/pppd file /etc/ppp/options.server
Этим мы указываем что mgetty будет стартовать pppd при поднятии трубки модемом, а параметры будет брать из файла /etc/ppp/options.server.

Далее на очереди файл mgetty.config. Он описывает параметры для каждого из модемов, строки инициализации, скорость, лог файлы для каждого. Мы просто скопировали этот файл со старого сервера. Примерный вид:

########################################
#  884544
### ZyXEL U-3xxxx                       ##


  rings 1
  port ttyD0
  init-chat "" \d\d\d+++\d\d\dATQ0E1V1H0 OK ATL0M0S0=0 OK AT&K3 OK
  statistics-chat "" AT OK ATI2 OK
  statistics-file /tmp/modem1.log
  modem-type cls2
  data-only y

 Понятно, что для каждого типа модема строка инициализации должна быть своя. Теперь настраиваем ppp. Создаем файлик /etc/ppp/options.server, в нем содержаться общие параметры для всех модемов. Мы запишем в него только одну строку:
dialin:~# echo "lock" > /etc/ppp/options.server
Теперь создадим конфигурационные файлы для каждого порта. Имя нужно составлять таким образом: options.port, где вместо port подставляем имя порта для каждого модема.

В этих файлах храняться настройки соединения. Мы туда впишем такие строки:

modem
crtscts
-detach
require-pap
refuse-chap
proxyarp
login
ms-dns 4.2.2.2
ms-dns 4.2.2.1
ms-dns 193.193.193.100
172.16.81.12:10.10.5.202


DNS-серверы внешние, последняя строка задает на ip-адресацию внутри тонеллей pppX, которые будут автоматически подниматься, при соединению пользователей. А весь траффик pppd сам будет заворачивать на этот интерфейс. 
Используеться PAP-авторизация пользователей, благодаря строкам refuse-chap и require-pap.
Пользователей прописываем в файле /etc/ppp/pap-secrets, в формате логин пароль IP-адрес.
Ну вот и все, нам осталось только настроить NAT, на вышестоящих шлюзах ну и файрволл на этом. Однако этот процесс уже сугубо индивидуальный и зависит от топологии сети и требований системных администраторов. Поэтому оставляю это вам.


Эпилог

В заключение скажу, что вся эта кухня у нас ест 20Мб RAM из 2466, и 1% ресурсов одного ядра, одного процессора в системе, что чрезвычайно много, однако я уверен, скоро мы найдем применение простаивающим пока мощностям.
Надеюсь эта статья кому-то поможет, хотя вряд-ли, такое обородование и такие задачи сейчас уже днем с огнем не сыщешь. 
Ну да ладно, главное - приобретенный опыт и навыки. Удачи.

Комментариев нет:

Отправить комментарий