Dial-in сервер:

Настройка инициализации портов.

Скрипт инициализации портов /etc/rc.serial сам по себе довольно объемен. Он содержит все (или почти все) возможные параметры инициализации для большинства известных науке девайсов, подключаемых к последовательному порту. Нас же интересует наличие раздела инициализации последовательных портов для модемов: modem() { # Modem that supports CTS and perhaps RTS handshaking. ci=$1; shift co=$1; shift for i in $* do # may depend on modem comcontrol /dev/tty${ci}${i} dtrwait 100 drainwait 180 # Lock crtscts on. # Speed reasonable for V42bis. stty < /dev/ttyi${ci}${i} crtscts 57600 stty < /dev/ttyl${ci}${i} crtscts stty < /dev/cuai${co}${i} crtscts 57600 stty < /dev/cual${co}${i} crtscts done }. Сим инициализируются порты, идентификаторы и номера которых передаются функции в качестве аргументов.

Собственно, настройка заключается в раскомментировании строки в конце файла. Для терминалов ttyd1 и ttyd2 (в терминах Microsoft это COM2 и COM3) строка должна выглядеть так: # Initialize assorted 8250-16550 (sio) ports. modem d a 1 2 Параметры проинициализированных портов получаются такими:

Единственный параметр, который есть резон менять - это скорость порта, все остальное трогать особого смысла нет. Для установки другой скорости, к примеру, 115200 бит/с, stty нужно скормить соответствующие аргументы, при этом описание скорости должно обязательно присутствовать в /etc/gettytab, на такой же скорости должны работать getty и pppd: stty < /dev/ttyi${ci}${i} crtscts 115200 ... stty < /dev/cuai${co}${i} crtscts 115200

Теперь, если отдать: dial-in-server# cd /etc dial-in-server# sh rc.serial то порты проинициализируются нужными скоростями. Для пущей уверенности правильность настроек проверяется соединением с модемом с помощью терминалки. Об этом в разделе, посвященном настройке модемов.

Напоследок, есть немаловажные и не совсем очевидные детали при установке скоростей нескольких модемов на одном сервере, которую автор не встречал ни в одном из руководств по dial-in:

Правится это в /etc/ppp/ppp.conf, в параметре set speed. Мне это стоило двух дней - понять, где «собака порылась». Файл /etc/ppp/ppp.conf: set speed 57600

Протокол терминальных линий.

Вообще, передача данных на физическом уровне бывает синхронной и асинхронной. Терминалы исторически пользуются только асинхронными протоколами последовательных линий. Начало пакета данных определяется положительным или отрицательным фронтом импульса. Затем следует заранее оговоренное число импульсов данных с заранее оговоренной скоростью. Количество переданных полезных бит может быть больше количества импульсов - данные могут передаваться и по фронтам. Далее могут следовать служебные данные типа бита четности. Завершают пакет стоп-биты. Сервер и терминал должны поддерживать и быть сконфигурированы на один тот же протокол.

Настройки линий собраны в файле /etc/gettytab. Естественно, getty, каждый раз, при старте его перечитывает. То есть, после правки, при следующем коннекте будут действовать уже правленые настройки. Секция default определяет параметры, общие для всех секций. Началом секции считается начало строки, окончание и разделитель - двоеточие, продолжение секции на следующей строке - «\» перед концом строки: default:\ :cb:ce:ck:lc:fd#1000:im=\r\n%s/%m (%h) (%t)\r\n\r\n:sp#1200:\ :if=/etc/issue: Умолчания такие:

По документации, cb, lc и fd в свежих версиях getty не поддерживаются, но удалять их, по-моему, пока не стоит. Независимо от версии getty можно убрать if, в нем нет никакой смысловой нагрузки, как и самого файла, скорее всего.

Интересующие нас секции std находятся под комментарием: # Fixed speed entries Для dial-in сгодится большинство из них, если не использовать модем на 2400. Как видим, в секциях определяется запрещение эмуляции контроля четности и использование восьмибитных символов (np), затем переопределяется скорость порта (sp#): g|std.19200|19200-baud:\ :np:sp#19200: std.38400|38400-baud:\ :np:sp#38400: std.57600|57600-baud:\ :np:sp#57600: std.115200|115200-baud:\ :np:sp#115200: std.230400|230400-baud:\ :np:sp#230400: Редактировать (пока) ничего не нужно, важно лишь наличие секции с выбранной скоростью портов и определения в ней протокола 8-N-1:

Настройка модемов.

Настройка сводится к конфигурированию и записи в NVRAM модемов профиля, который будет загружаться при включении и сбросе сигнала DTR. Делается это с помощью любой терминалки и не важно, будет это Windows HyperTerminal, cu или tip UNIX. Мне, однако, претит лишний раз возиться в пыли-грязи с разъемами, да и колотить по клавиатуре в csh получается все же быстрее, чем возить мышью.

Итак, запустим терминалку (модем, подключенный к sio1, проинициализирован на 57600): dial-in-server# cu -l /dev/cuaa1 -s 57600 она лаконично ответит: Connected.

По команде ATI4 модем обязан послушно выдать листинг текущего профиля. В зависимости от значений этого самого профиля модем может и не дублировать ввод, и не отвечать «ОК». Аналоги ATI4 реализованы во всех модемных чипсетах, так что, скорее всего, листинг будет примерно таким: U.S. Robotics 56K FAX EXT Settings... B0 E0 F1 L2 M1 Q1 V1 X4 Y0 BAUD=57600 PARITY=N WORDLEN=8 DIAL=PULSE ON HOOK CID=0 &A3 &B1 &C1 &D2 &G0 &H1 &I0 &K1 &M4 &N0 &P2 &R2 &S0 &T5 &U0 &Y1 S00=001 S01=000 S02=043 S03=013 S04=010 S05=008 S06=002 S07=060 S08=002 S09=006 S10=014 S11=070 S12=050 S13=000 S15=000 S16=000 S18=000 S19=000 S21=010 S22=017 S23=019 S25=020 S27=000 S28=008 S29=020 S30=000 S31=128 S32=002 S33=000 S34=000 S35=000 S36=014 S38=000 S39=012 S40=000 S41=004 S42=010 LAST DIALED #:

Для нормального функционирования модем должен иметь следующие настройки профиля:

Для U.S.Robotics/3COM строка будет выглядеть примерно так: AT&F1E0F1Q1Y0&A3&B1&C1&D2&G0&H1&K1&M4&N0&P0&R2&S0&T5&U0S0=1&W0

Можно поступить по-другому: загрузить заводской шаблон с аппаратным управлением потоком, пролистать его, подправить настройки и записать в NVRAM: AT&F1 ATI4 AT&F1E0F1Q1Y0 U0S0=1 Измененный заводской шаблон сохраняется в профиль 0 NVRAM командой: AT&W0 Проверить настройки можно перезагрузив модем с профилем по умолчанию: ATZ0 ATI4 Выход из cu по: ~. dial-in-server#

В старых (и некоторых не очень старых) модемах есть DIP-переключатели, они имеют наибольший приоритет по сравнению с командами и регистрами, настройка локального эха, автоответа, результирующих кодов и прочих разностей осуществляется ими.

Настройка терминалов.

Определения терминалов находятся в файле /etc/ttys. В числе прочих его пользует init, который и запускает на терминале управляющую программу. В контексте настройки dial-in правке подлежат строки определений последовательных терминалов: # Serial terminals # The 'dialup' keyword identifies dialin lines to login, fingerd etc. ttyd0 "/usr/libexec/getty std.9600" dialup off secure ttyd1 "/usr/libexec/getty std.9600" dialup off secure ttyd2 "/usr/libexec/getty std.9600" dialup off secure ttyd3 "/usr/libexec/getty std.9600" dialup off secure В исходном состоянии каждым из четырех dial-in терминалов ttyd заведует getty с параметрами секции std.9600 из файла /etc/gettytab. Параметр secure разрешает логин rootом, а off - говорит init, что терминал отключен. Чтобы реализовать dial-in подключение к ttyd1 и ttyd2, нужно включить терминал, указать ему секцию с настройками порта и одновременно запретить getty принимать логин rootа - немного паранойи никому не помешает: ttyd0 "/usr/libexec/getty std.9600" dialup off secure ttyd1 "/usr/libexec/getty std.57600" dialup on insecure ttyd2 "/usr/libexec/getty std.57600" dialup on insecure ttyd3 "/usr/libexec/getty std.9600" dialup off secure Теперь отдадим: dial-in-server# kill -HUP 1 Этим мы заставляем init перезагрузиться и, соответственно, перечитать конфигурационные файлы, через момент внешний модем должен зажечь индикатор «TR» (или «DTR» у некоторых модемов, если он есть). Отдадим: dial-in-server# ps ax | grep ttyd и убедимся, что getty готов принимать звонки на нужных нам терминалах с нужными скоростями: 232 ?? I 0:00,07 /usr/libexec/getty std.57600 ttyd1 237 ?? I 0:00,07 /usr/libexec/getty std.57600 ttyd2 Особое внимание в листинге процессов стоит уделить второму столбцу. Символы «??» свидетельствуют о нормальном открытии порта getty и ожидании им модемного соединения (активности сигнала DCD). Нечто отличное, вроде «d1» для ttyd1 означает, что модем, подключенный к sio1, принял звонок и установил связь с удаленным коллегой или о неправильной настройке сигнала CD модема.

На этом настройку dial-in сервера можно закончить, если его основное назначение - удаленное администрирование, ибо dial-in консоли для этих целей вполне достаточно. Настройка PAP и CHAP аутентификации «как у взрослых провайдеров» рассматривается в главе «Настройка сервера удаленного доступа», но перед этим автор настоятельно рекомендовал бы убедиться в полной работоспособности «голой» dial-in консоли. В любом случае траблшутинг придется начинать с отключения протоколов авторизации, так как основных исходных причин немного:

Аккаунт dial-in пользователя.

Если Вы знакомы с удаленной консолью, то этот раздел можно пропустить и пользоваться для dial-in тем же аккаунтом, что и для удаленной консоли.

В предыдущем разделе «Настройка терминалов» удаленные терминалы были объявлены как insecure. Администрировать же нужно от имени rootа. Создадим с помощью /stand/sysinstall или adduser нового пользователя так, чтобы он являлся членом группы wheel - только доверенным лицам позволено su. Можно просто отредактировать /etc/group, если аккаунт уже существует. wheel:*:0:root,remoteuser

Теперь, после логина под таким аккаунтом в любое время можно стать rootом: % su - Password: dial-in-server# Тире - параметр su, позволяющий пользовать окружение rootа, если его опустить, окружение будет взято пользовательское. Кроме dial-in такой аккаунт годится и для любой удаленной консоли.

Неплохим решением будет очистить или отредактировать /etc/motd (оставив две пустые строки в конце) - его содержимое выводится на все виды консолей при логине. Желающим «крутить» систему, подсказка - секция default в /etc/login.conf, мне же было достаточно: FreeBSD 4.7-RELEASE (NETKERNEL) #8: Thu Feb 5 22:05:48 MSK 2004 Welcome to FreeBSD!