воскресенье, 16 декабря 2007 г.

СЕРВЕР УДАЛЁННОГО ДОСТУПА

УСТАНОВКА DIAL-IN СЕРВЕРА В LINUX с мультипортовкой MOXA C168H/PCI
или
СЕРВЕР УДАЛЁННОГО ДОСТУПА

Установка мультипортовкой MOXA C168H/PCI под Linux

Качаем драйвер с сайта разработчика по ссылки

http://web2.moxa.com.tw/services/download/download.asp#mxser.tgz

распаковываем в /opt

Конфигурация статического драйвера под LINUX ядро 2.4.х

Внимание: для статического драйвера требуется установленные исходники ядра.

1. Резервирование встроенного драйвера в ядре

# cd /usr/src/linux/drivers/char

# mv mxser.c mxser.c.old

2. Создаем ссылку

# cd /usr/src/linux/drivers/char

# ln -s /moxa/mxser/driver/mxser.c mxser.c

3.Настройка конфигурации ядра

Конфигурация ядра

# cd /usr/src/linux

# make menuconfig

В меню настройки системы необходимо выбрать [Character devices][Non-standard serial port support], включить поддержку драйвера [Moxa SmartIO support] изменив "[*]" для имеющегося (не "[M]"), выберете [Exit] для выхода из программы.

4. Компиляция и установка ядра

a. cd /usr/src/linux

b. make clean очистка от всех объектов и файлов зависимости, от предыдущей компиляции.

c. make dep создание дерева зависимостей для уточнения части исходного кода нашей конфигурации

d. make bzImage генерирование файла ядра (размещение /usr/src/linux/arch/i386/boot)

мои изменения иструкции без которых неудавалось заставить работать мультипортовку

e. make modules создание модулей ядра

f. make modules_install установка модулей ядра в /lib/modules

g. make install генерирование файлов ядра и установка их в системе

h. lilo

Как, после сборки ядра Linux, инициализировать initrd (ядро падает при монтировании root раздела)

initrd - RAM-диск, инициализируемый загрузчиком, требуется для подключения модулей ядра, необходимых

на этапе до монтирования root-раздела, (например, до монтирования нужно подгрузить - ext2/ext3/scsi модули).

1) man initrd - все изумительно описано;

2) после сборки ядра создаем новый initrd:

mkinitrd /boot/initrd-2.4.21 2.4.21;

3) в /etc/lilo.conf:

initrd=/boot/initrd-2.4.21

В mkinitrd сам initrd можно назвать как угодно, но второй параметр обязательно версия ядра.

h. Удостоверится что загрузчик ядра (vmlinuz) установлен корректно

i. Если использовать 'lilo' необходимо проверить пункт образа /etc/lilo.conf, определил дорожку, которая является 'vmlinuz' дорожкой, или Вы загрузите неправильно (или старый) образ загрузчика ядра (vmlinuz).

После проверки/etc/lilo.conf, выполняем команду "lilo".

5. Устанавливаем tty* устройства и специальные файлы (если карта единственная то все делаем по умолчанию)

# cd /moxa/mxser/driver

# ./msmknod

6. Установка utility

# cd /moxa/mxser/utility

# make clean; make install

7. С помощью Linuxconf изменяем загрузку нашего ядра делая его загрузку по умолчанию

8. Reboot

4. Настройка mgetty и pppd

                    У меня, как сервер выделен отдельно, так и линии выделены спецом под dailin, следовательно, все работает круглосуточно. Получается и mgetty надо держать поднятым круглосуточно. Для этого удобнее всего использовать initd. Он сам поднимет модемы при загрузки сервера и после разрыва соединения. Файл конфигурации /etc/inittab. Ниже приведены строки, относящиеся к модемам.
Думаю лучше всего их прописать после консолей.
--- inittab ---
S0:2345:respawn: /sbin/mgetty -D -s 115200 /dev/ttyS0 ttyS0 # COM1
S1:2345:respawn: /sbin/mgetty -D -s 115200 /dev/ttyS1 ttyS1 # COM2
 
M0:2345:respawn: /sbin/mgetty -D -s 115200 /dev/ttyM0 ttyM0 (мультипортовка)
                                                             ……….
M7:345:respawn: /sbin/mgetty -D -s 115200 /dev/ttyM7 ttyM7 (мультипортовка)
--- inittab ---
 
                    Формат строк прост: id:runlevels:action:process, 
подробней в man inittab. Первая строка относится к модему Курьер. В параметрах mgetty можно указать уровень отладки. На пример, чтоб писались лог файлы по каждому модему в отдельный файл, что удобно при отладке, добавьте '-x 5'.
                    Да и учтите, что у меня на борту есть мультипортовки. Т.е. если у вас нет мультипортовки и модем висит на Com2, скорее всего стока будет выглядеть примерно так: 
's1:12345:respawn:/usr/local/sbin/mgetty -s 57600 /dev/ttyS1 ttyS1'
 
Чтобы mgetty стартовал надо послать команду:
kill -1 1 или init q
                    На модеме тотчас должна загореться лампочка TR - это означает, что mgetty подхватил модем и начал функционировать. Настройку можно считать законченной, если при входящем звонке модем поднимает трубку и устанавливает соединение.
                    Один из приятных моментов статьи - тестирование. Если вы сделали все правильно, перезагрузите initd ('init q'). Должны увидеть, как поднимутся модемы. Поскольку pppd мы еще не настраивали, тестировать можно только аварийную консоль. Думаю, вы понимаете, что если тестировать консоль, то в 'login.config' указан '/bin/login'(или типа того), а галочка о выводе терминала после установки соединения установлена. 
Да чуть не забыл. 
*!!!* Пользователи, которые могут входить через аварийный вход должны быть прописыны в системе(/etc/passwd), а пользователи использующие pppd(Интернет) должны быть прописаны с соответствующих файлах настройки pppd (при pap авторизации /etc/ppp/pap-secrets, при chap - /etc/ppp/chap-secrets) *!!!*
В виндах настройте модемное соединение. Звоним... модем берет трубу после нужного гудка, устанавливается соединение и вываливается окно терминала. Введя в терминале ligin & password, должны увидеть любимый shell. Если что-то не получилось, не паникуйте. Посмотрите лог файлы уверен, найдете все ответы. Кстати, в будущем имея настроенный pppd мы так же будем проверять и его работу с помощью этого соединения. После того, как получили shell, можно запустить 'pppd', затем клавишу 'F7' для закрытия терминала и продолжения работы, но уже в Интернет (pppd должен быть настроен).
 
                    Настройка pppd. Это второй творческий вопрос. Есть масса вариантов настройки. Так на пример каждый пользователь может иметь свой ip адрес или каждый модем может иметь стой ip. Можно организовать определитель номера (вопрос к mgetty), используя его настроить callback.
Авторизация PAP, CHAP или скрипты. Опишу, как сделал сам и постараюсь затронуть другие варианты. Обратите внимание на одну важную деталь – pppd, должен иметь возможность запускаться от пользователя. Если вам не удастся решить это настройкой самого демона, установите привилегию на запуск от владельца файла(uid). 
                    Для начала следует убедиться, что пользователи имеют право запускать pppd, а если не имеют, то разрешаем командой:chmod u+s /usr/sbin/pppdТеперь можно создать PPP-аккаунт или обычный аккаунт (обычного пользователя). Лучше создавать PPP-аккаунт, т.к. в этом случае при входе в систему такого пользователя сразу запускается pppd. Для этого можно воспользоваться утилитой Linuxconf или подредактировать файл /etc/passwd таким образом:ppp:x:351:230:pppclient:/home/ppp:/usr/sbin/pppd В данном примере пользователь "ppp" при входе в систему шелл не получит. Зато автоматически запустится pppd. Для того, чтобы теперь в систему мог войти пользователь из windows, ему необходимо настроить dialer так, чтобы после соединения открывалось окно терминала, и логин с паролем вводить вручную. Можно, конечно, организовать скрипт, но все равно это неудобно. Чтобы от этого избавиться, можно использовать на сервере AutoPPP. То есть при соединении пароль и логин считываются автоматически (как у большинства интернет-провайдеров). Для этого надо изменить некоторые настройки в /etc/mgetty/login.config. Пропишите в нем: /AutoPPP/ - a_ppp /usr/sbin/pppd file /etc/ppp/options Возможно, эта строка может несколько различаться для разных версий mgetty, но в подавляющем большинстве случаев она выглядит именно так.
 
                    Биллинг пользователей модемного пула сделан на основе выходных данных самого pppd, по этому мне не принципиально, чтоб каждый пользователь имел свой ip адрес (=> каждый модем имеет свой ip). Конфигурационный файл pppd - /etc/ppp/options. Листинг файла легче смотреть с помощью 'egrep -v'#|^ *$' /etc/ppp/options', так печатаются только не закомментированные строки:
--- /etc/ppp/options ---
192.168.1.1:
ms-dns 
ms-dns 
ms-wins 
ms-wins 
asyncmap 0
auth
crtscts
lock
modem
-detach
+pap
-chap
debug
usehostname
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
--- /etc/ppp/options ---
 
                    Первая строка это ip адрес сервера, на котором висит модем, и клиента, который дозвонился на сервер. Формат строки: 
как видите, я задаю ip адрес только для сервера. Для клиентов, точнее для модемов ip адреса заданы в отдельных файлах, имена которых соответствуют именам устройств, к которым подключены 
модемы. У меня так:
--- ls -1 ---
options
options.ttyD000
options.ttyD001
options.ttyD002
...
--- ls -1 ---
 
                    Если у вас нет мультипортовки, а модемов допустим только два, на первом и втором com-портах, файлы будут: options.ttyS0 и options.ttyS1 соответственно. Файл options.ttyS1 к примеру может выглядеть следующим образом:
--- cat options.ttyS0 ---
:192.168.1.2                                                             - двоеточие обязательно!
--- cat options.ttyS0 ---
 
                    Кстати если у вас всего один модем, то ни кто не запретит вам указать ip адрес для него прямо в /etc/ppp/options. Продолжая тему выдачи ip адресом замечу, что если вы желаете выдавать каждому пользователю по _своему_ ip адресу, его(ip) нужно указать в четвертом столбце файла авторизации /etc/ppp/pap-secrets или /etc/ppp/chap-secrets. Строка 'auth' как раз и требует, чтоб пользователь сначала ввел логин и пароль для регистрации только потом pppd позволит войти в сеть. Строки '+pap' и '-chap' означают использовать только pap авторизацию. Листинг pap-secrets:
--- cat pap-secrets ---
# Secrets for authentication using PAP 
#client                              server          secret                              ip-addr
test                                   *                   passfortest                      *
test1                                 *                   passfortest1                                        *
 
--- cat pap-secrets ---
 
                    Если в качестве пароля указать '""' (две двойные кавычки) pppd постарается найти пароль в системной базе данных паролей. Проще говоря в /etc/shadow. 

Теперь файл /etc/ppp/pap-secrets. Должен chown root.root, а chmod 600 - пароли все таки :) Его формат прост:

 
# Secrets for authentication using PAP
#client                              server                              secret                              IP addresses
user1                               *                                       user1passwd                  *
ppp                                   *                                       pppsecrets                      *
...
....
.....

При желании каждому юзверю можно отдавать конкретный IP или таскать пароли из /etc/passwd (/etc/shadow). Для этого пароль должен выглядеть так:

 
user1                               servername                                         ""                                      ip_addr
 
                    Полный перевод комментариев файла /etc/ppp/options смотрите в приложении. Большое спасибо автору перевода, к сожалению, не знаю его имени.


ПРИЛОЖЕНИЕ: перевод файла /etc/ppp/options

# Использовать указанную команду или программу для настройки линии. Этот

# обычно использует программу "chat", чтобы позвонить модемом и запустить

# удаленную ppp сессию.

#connect "echo Вам нужно установить команду connect."

# Запустить указанную команду или программу, когда pppd завершил связь.

# Этот скрипт мог бы, к примеру, ввести команды в модем, чтобы завершить

# связь, если сигналы аппартного управления модемом недоступны

#disconnect "chat -- \d+++\d\c OK ath0 OK"

# async карта символов -- 32-bit hex; каждый бит - символ, который надо

# представить в виде escape-последовательности, чтобы pppd мог его принять.

# 0x00000001 - это маска для '\x01', а 0x80000000 - маска для '\x1f'.

#asyncmap 0

# Требование для удаленной стороны назвать себя перед тем как начнется обмен

# пакетами.

#auth

# Использовать аппаратное управление потоком данных (напр., RTS/CTS), чтобы

# управлять потоком данных на последовательном порту

#crtscts

# Использовать программное управление потоком данных (напр., XON/XOFF), чтобы

# управлять потоком данных на последовательном порту

#xonxoff

# Добавить маршрут по умолчанию в системную таблицу маршрутизации,

# используя удаленную сторону как шлюз, когда договоренность IPCP успешно

# достигнута. Эта запись удаляется при завершении связи

#defaultroute

# Определяет, что некоторые символы должны быть за'escape'лены при передаче

# (Независимо от того, просила ли удаленная сторона их escape'ить своей

# async картой управляющих символов). Символы, которые надо escape'ить

# указываются в виде списка шестнадцатеричных чисел, разделенных запятыми.

# Заметьте, что для опции escape могут быть указаны почти все символы, в

# отличие от опции asyncmap, которая позволяет указывать только управляющие

# символы. Символы, которых нельзя escape'ить - это 0x20 - 0x3f или 0x5e.

#escape 11,13,ff

# не использовать линии управления модемом.

#local

# Указывает, что pppd должен использовать lock в стиле UUCP на

# последовательное устройство, чтобы исключить одновременный доступ к

# устройству

#lock

# Использовать линии управления модемом. На Ultrix эта опция означает

# управление потоком данных, как опция crtscts. (Эта опция не полностью

# выполняется)

#modem

# Установить значение MRU [Maximum Receive Unit] в при договоренности.

# pppd запросит удаленную сторону отправлять пакеты не более, чем по байт.

# Минимальное значение MRU 128. Значение MRU по умолчанию 1500. Для

# медленных линков рекомендуется 296 (40 байт для заголовка TCP/IP + 256 байт

# данных).

#mru 542

# Установить сетевую маску интерфейса в , 32-битная сетевая маска в

# "десятично-точечной" нотации (напр., 255.255.255.0).

#netmask 255.255.255.0

# Запретить поведение по умолчанию, когда не указан локальный IP адрес,

# которое определяет (если возможно) локальный IP адрес по имени хоста

# С этой опцией удаленная сторона должна будет обеспечить локальный IP

# адрес в течение IPCP переговоров (если она не определена явно в командной

# строке или в файле options).

#noipdefault

# Разрешить опцию "passive" в LCP. С этой опцией pppd будет пытаться

# инициировать соединение; если ответ от другой стороны не принят, то

# pppd будет пассивно ожидать правильный LCP пакет от другой стороны

# (вместо выхода, как делается без этой опции).

#passive

# С этой опцией pppd не будет передавать LCP пакеты для инициации соединения

# пока не придет правильный LCP пакет от другой стороны (как опция "passive"

# в старых версиях pppd).

#silent

# Не требовать или не разрешать договариваться о любых опциях LCP и IPCP

# (использовать значения по умолчанию).

#-all

# Запретить договариваться о сжатии адреса/управления (используется

# по умолчанию, т.е. адресные/управляющие поля запрещены).

#-ac

# Запретить договариваться о asyncmap (используется asyncmap по умолчанию, т.е.

# escape все управляющие символы).

#-am

# Не переходить в фоновый режим (иначе pppd бдет делать так, если

# последовательной устройство указано).

#-detach

# Запретить договариваться о IP адресе (С этой опцией удаленный IP

# адрес должен указываться опцией командной строки или в файле options)

#-ip

# Запретить договариваться о магических числах. С этой опцией pppd не может

# определить looped-back линию.

#-mn

# Запретить договариваться о MRU [Maximum Receive Unit]

# (используется по умолчанию, т.е. 1500).

#-mru

# Запретить договариваться о сжатии полей протокола (используется по

# умолчанию, т.е. сжатие полей протокола запрещено).

#-pc

# Требует, чтобы другая сторона назвала себя используя PAP.

# Это требует ДВУНАПРАВЛЕННОЙ аутентификации - НЕ используйте эту

# опцию для стандартной аутентификации PAP на ISP, так как при этом требуется,

# чтобы машина ISP аутентифицировала себя на вашей машине (а она это не сможет

# сделать)

#+pap

# Не соглашаться с аутентификацией PAP.

#-pap

# Требует, чтобы другая сторона назвала себя используя CHAP [Cryptographic

# Handshake Authentication Protocol].

# Это требует ДВУНАПРАВЛЕННОЙ аутентификации - НЕ используйте эту опцию

# для стандартной аутентификации CHAP на ISP, так как при этом требуется,

# чтобы машина ISP аутентифицировала себя на вашей машине (а она это не сможет

# сделать)

#+chap

# Не соглашаться с аутентификацией CHAP.

#-chap

# Запретить обсуждение сжатия IP заголовков в стиле Van Jacobson

# (используется по умолчанию, т.е. сжатия нет)

#-vj

# Увеличить уровень отладки (то же что -d). Если эта опция есть, pppd

# будет записывать в журнал все прибывшие и отправленные пакеты в читабельной

# форме. Пакеты регистрируются в лог файлах через syslog со средством daemon

# и уровнем отладки. Эта информация может быть перенаправлена в файл

# соответствующей установкой /etc/syslog.conf (см. syslog.conf(5)). (Если

# pppd скомпилирован с разрешенной extra отладкой, он будет записывать

# сообщения в журнал, используя средство local2 вместо daemon).

#debug

# Добавить имя домена к локальному имени хоста для целей аутентификации.

# Например, если gethostname() возвращает имя porsche, но FQDN -

# porsche.Quotron.COM, то вы должны установить эту опцию, чтобы имя домена

# было Quotron.COM.

#domain

# Разрешить отладочный код в PPP драйвере на уровне ядра. Аргумент n

# это число-комбинация следующих значений: 1 - разрешить общие отладочные

# сообщения, 2 - запросить, надо ли печатать содержимое принимаемых пакетов

# и 4 - запросить, надо ли печатать содержимое отправляемых пакетов

#kdebug n

# Установть значение MTU [Maximum Transmit Unit] в . Пока другая сторона

# на попросит меньшее значение при договоре о MRU, pppd будет требовать у

# сетевого кода ядра отправлять пакеты данных не более, чем по n байт

# через сетевой интерфейс PPP.

#mtu

# Установить имя локальной системы для аутентификационных целей в .

# Возможно, ее надо будет установить в ваше имя на вашем ISP,

# если используется PAP/CHAP.

#name

# Установить имя пользователя для аутентификации этой машины на другой стороне

# используя PAP, в значение .

# НЕ использовать, если вы использовали опцию 'name'!

#user

# Заставить использовать имя хоста как имя локальной системы для

# аутентификационных целей (перекрывает опцию name).

#usehostname

# Установить имя удаленной системы для аутентификационных целей в .

#remotename

# Добавить запись для этой системы в таблицу ARP [Address Resolution Protocol]

# с IP адресом удаленной системы и Ethernet адресом этой системы

#proxyarp

# Использовать базу данных паролей для идентификации удаленной стороны

# используя PAP.

#login

# Если эта опция назначена, pppd будет отправлять кадр LCP echo-request

# удаленной стороне каждые n секунд. Под Linux, echo-request отправляется

# когда пакеты не принимаются от удаленной стороны n секунд. Обычно

# удаленная сторона должна отвечать на echo-request отправкой echo-reply.

# Эта опция может быть использована с опцией lcp-echo-failure для

# определения что удаленная сторона больше не соединена.

#lcp-echo-interval

# Если эта опция задана, pppd будет считать, что связи с peer нет, если n

# LCP echo-requests отправлены без приема правильных LCP echo-reply.

# Если это случилось, pppd завершит связь. Использование этой опции

# требует ненулевого значения для параметра lcp-echo-interval.

# Эта опция может быть использована, чтобы разрешить pppd завершать связь,

# если физическое соединение отсутствует (напр, модем бросил трубку) в

# ситуациях, когда доступны линии управления модемом.

#lcp-echo-failure

# Установить интервал рестарта LCP (пауза возобновления передачи) в секунд

# (по умолчанию 3).

#lcp-restart

# Установить максимальное число передач LCP terminate-request в

# (по умолчанию 3).

#lcp-max-terminate

# Установить максимальное число передач LCP configure-request в

# (по умолчанию 10).

# Некоторые PPP сервера долго стартуют. Вам может понадобиться увеличить эту

# величину, если вы получаете ошибки 'serial line looped back' и вы УВЕРЕНЫ,

# что корректно регистрируетесь и PPP должен запускаться на сервере.

#lcp-max-configure

# Установить максимальное число LCP configure-NAKs, возвращенных перед началом

# отправки вместо configure-Rejects, в (по умолчанию 10).

#lcp-max-failure

# Установить интервал рестарта IPCP (пауза возобновления передачи) в

# секунд (по умолчанию 3).

#ipcp-restart

# Установить максимальное число передач IPCP terminate-request в

# (по умолчанию 3).

#ipcp-max-terminate

# Установить максимальное число передач IPCP configure-request в

# (по умолчанию 10).

#ipcp-max-configure

# Установить максимальное число IPCP configure-NAKs, возвращенных перед

#началом отправки вместо configure-Rejects, в (по умолчанию 10).

#ipcp-max-failure

# Установить интервал рестарта PAP (пауза возобновления передачи) в секунд

# (по умолчанию 3).

#pap-restart

# Установить максимальное число передач PAP authenticate-request в

# (по умолчанию 10).

#pap-max-authreq

# Установить интервал рестарта CHAP (пауза возобновления передач

# challenges) в секунд (по умолчанию 3).

#chap-restart

# Установить максимальное число передач CHAP challenge в

# (по умолчанию 10).

#chap-max-challenge

# С этой опцией pppd будет re-challenge удаленную сторону каждые

# секунд.

#chap-interval

# С этой опцией pppd будет принимать предложение peer о нашем локальном IP

# адресе, даже если локальный IP адрес был указан в опциях.

#ipcp-accept-local

# С этой опцией pppd будет принимать предложение peer о его (удаленном) IP

# адресе, даже если удаленный IP адрес был указан в опциях.

#ipcp-accept-remote

#EOF