UnixMountainSkiFun

Unix Горы Лыжи

01-06-2008 18:56

Проблема №2: Non-IP Dialup (getty)


Итак у вас в наличии настроенный и работающий Linux-компьютер. Возможно вы счастливый обладатель 24x7-соединения через DSL или кабельный модем. У вас конфигурирован firewall, за ним располагается целая сеть компьютеров, на которых работает счастливая орава детишек и женушка. Прямо таки постмилениумная пасторальная зарисовка -- "Моя семья". Нда... круто.

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

Иксы (имеется в виду X window) настолько неповоротливы, что приходится ждать по несколько минут прежде чем откроется X-term. А супруга вообще перестает отвечать. Вы решаете запустить какой-нибудь sniffer, например tcpdump, чтобы выяснить, просматривая некоторые IP-адреса, кто "сожрал" трафик целой сети. Далее, запускаете whois и,... обнаруживаете, что ваша сеть прямо таки "давится", пожирая трафик с www.irs.ustreas.gov.

IRS (налоговая)!?! Ой... уносим задницу побыстрее, пока "люди в черном", с темными очками на переносице и маленькими наушничками не выскочили как из бутылки, и не рассказали сказочки о том, что у вас дома слишком много такого, за что вы (какой кошмар!) не заплатили НАЛОГИ! Нет... неприятность в том, что ваша сеть похожа на рынок, -- настолько густо запружена, что вы не можете поговорить со своей благоверной. Ситуация похожа на то, как будто в воздухе стало мало кислорода. Я в этом вижу проблему, а вы?

Я покажу каким образом вы можете использовать другой коммуникационный канал, так сказать последний шанс. Можно подключить свой Linux-компьютер к чему-нибудь старомодному, по типу BBS-системы. Если вы работали с компьютерами в 1970 и 80-ых, то помните то старое доброе время, когда Internet "гулял через" SLIP, CSLIP и PPP, и был таким медленным... Вы даже помните как пользоваться терминальными программами (скорее всего это PROCOMM, а может быть Smarterm, кхм... а может быть вы сами написали что-то подобное), выполняя ATDT-команды для своего Hayes-совместимого модема, соединяясь с модемами на других компьютерах напрямую (точка-точка).

В этом нашем сценарии вы с негодованием вытаскиваете из своего переносного компьютера PCMCIA Ethernet сетевую карту и вместо нее запихиваете PCMCIA-модем. Теперь зззззапускаете терминальную программу (такую как Minicom), зззззвоните на свой домашний номер, где висит модем, и получаете такое приветствие:

 sol login:

Входите, становитесь root-ом, останавливаете всю сеть нафик, и начинаете высматривать что же случилось. Вот он... рецепт спасения!

Ну... может быть такое. Возможно ваша система безнадежно скомпроментирована (compromised). Когда кто-то пробрался внутрь и сделал что-то нехорошее с вашей системой, то скорее всего невозможно обезопасить ее снова, по той простой причине, что может существовать бесчисленное множество дыр и черных ходов (holes and back doors), которые делают ее подобной ситу. Ничуть не сложно открыть еще одну закрытую дверь, если уже пробрался сквозь первую. Лучше всего оставить сеть выключенной до тех пор, пока вы не доберетесь до дома и не переинсталируете всю систему заново. (Даже и не думайте восстанавливать свою систему из backup-ов. Ведь не ясно как давно ваша система была скомпромитирована. Представьте, восстановитесь и одновременно с этим восстановите весь набор дыр и троянов...) Эта книга не о том как разрешать такие ситуации, поэтому больше не хочется терять время на эту тему. Единственно, что еще скажу, так это то, что вы должны уделять больше внимания заплатки по безопасности, которые наверняка вышли с того момента, как последний раз установили систему "с нуля". Помимо этого необходимо уведомить о этом инциденте своего ISP. Ну и наконец, вы должны попробовать понять, каким образом этот маленький засранец забрался внутрь, чтобы в следующий раз его можно было взять за шкирку.

Ну и достаточно об этом. Мы расскажем вам о том, как можно настроить систему так, чтобы иметь такой способ зайти в нее. В конце концов, что бы вы делали, и в какую бы трубу вылетели, если бы не могли остановить "флуд" (flood) изнутри своей сети?

Зачем?

Вопросы "зачем?" теперь становятся более очевидными. Наличие еще одной коммуникации всегда хорошая идея. Может быть ваша проблема кроется не в DoS-атаке, устроенной маленьким засранцем против вашей сети. Возможно это просто "помершая" сетевая карточка, начавшая устраивать "широковещательный кошмар" (broadcasting junk). Такой случай тоже "уложит" вашу сеть. Да мало ли что..., можно придумать еще дюжину других неприятностей. Например в моем случае наиболее частым являлось то, что я "закрывал" свою домашнюю сеть чрезмерно параноидальными правилами firewall-а, и забывал запустить sshd, уходил утром спокойно на работу в полной уверенности в том, что все работает и уж если что, то я спокойно смогу зайти в мою систему (а ведь надо было прежде чем уходить на работу попробовать перейти на второй runlevel -- проще говоря перезагрузиться).

В любом случае, когда что-то идет не так, наличие еще одной возможности войти в систему может быть весьма полезным. Если вы всегда в системе, то консоль всегда под рукой. Не знаю как вы, а я время от времени отхожу от консоли, а бывает, что даже и дома меня нет. Вот когда я начинаю нервничать если не настроил dialup про запас.

Как

Процедура начала сеанса работы (logging) c Linux-компьютером запускает программу, называемую getty. Это название происходит от GET tTY. TTY -- происходит от телетайпа, который был брэнднэймом первого последовательного коммуникационного устройства. Это название "лежит рядышком" около таких понятий как Xerox и Kleenex. Никто уж давно не использует телетайпы, однако эти понятия и имена все еще на слуху. Я нахожу это приятно ностальгичным, учитывая что в мире технологий такая долгая память весьма редка.

Вы используете getty всякий раз когда начинаете сеанс работы на одной из своих текстовых консолей. Ведь вы же знаете о текстовых консолях? (Если у вас дистрибутив, который всегда загружается в графическом пользовательском интерфейсе (GUI), и к тому же вы не линуксоид со стажем, то возможно, что и нет).

Linux поддерживает много виртуальных консолей. Каждый дистрибутив, который попадался мне на глаза, использует эту особенность и запускает как минимум пять таких консолей. Используйте клавиши CTRL-ALT-Fn для переключения меж ними. Нажмите CTRL-ALT-F1 и вы обнаружите себя наедине с текстовым приглашением для начала сессии. Нажмите CTRL-ALT-F2 и попадете в другую консоль. Большинство дистрибутивов, которые мне попадались, предоставляют GUI по CTRL-ALT-F7. Вы можете использовать такую комбинацию клавиш, чтобы вернуться в GUI.

Работа getty проста. Обнаружить соединение на порту, подобрать коммуникационные параметры, отобразить файл /etc/issue, запросить имя пользователя, а затем ждать. Когда имя пользователя введено, то getty запускает программу login, которая запрашивает пароль, а затем запускает shell, указанный для этого пользователя в /etc/passwd.

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

Программа mingetty не может быть использована для поддержки login-а по dialup-у. Она просто напросто ничего не знает о статусных проводах последовательного порта, управляющих командах модема и кодах возврата. Она также без малейшего понятия о таких штуках как: скорости передачи (baud rates), контроль четности (parity), стартовые биты (start bits), стоповые биты (stop bits), типы терминалов (terminal types). Мало ли, может быть и вы об этом не знаете. Ничего страшного -- это действительно не нужно знать.

Сказанное выше не исключает того, что имеются и другие, более интеллектуальные варианты getty. Мы рассмотрим более общий вариант и поможем вам разобраться с его конфигурированием. Однако для начала поговорим о том, как запустить getty. Это не похоже ни на какой другой процесс в Linux-е.

Файл /etc/inittab

Помните я говорил вам о том, что это не книга о системном администрировании Linux? Это, как и по-большей части все в этой книге, истинно лишь наполовину. То есть по сути это значит то, что специалисты по этике или морали называют "ложью", -- я вам солгал. Чтобы объяснить некоторые понятия, мы должны познакомить вас с некоторыми аспектами системного администрирования Linux-а. Одно из таких понятий так называемая модель инициализации System V (System V initialization model). Сердцем всего этого является файл /etc/inittab, название происходит от слов INITialization TABle (таблица инициализации). (Кстати, знаете ли Вы из каких слов появилось слово portmanteau? И не говорите мне потом, что эта книга ничему вас не научила!)

Если ранее вы ничего не слышали о inittab, то наверняка вам ничего не известно и runlevel-ах (уровень выполнения). System V initialization model предполагает, что система может находиться в одном, из некоторого количества, состоянии (states), или runlevel-е, в границах от 0-го состояния (выключено), до состояния S (single user -- однопользовательский режим). Меж этими пограничными состояними находятся состояния 1 -- 5, которые являются различными вариациями наборов базовых сервисов, работающих вплоть до состояния 6, которое суть перезагрузки (как-то оно не совсем похоже на состояние, не так ли?). То, какие сервисы запущены в каждом из состояний, варьируется от дистрибутива к дистрибутиву. Помимо этого, различные дистрибутивы несколько по разному трактуют то, как система переходит от одного состояния к другому.

Здесь мы рассмотрим взятый из системы SuSE Linux 6.4 файл /etc/inittab. Такой выбор был сделан в результате длительного анализа дистрибутивов на лучшую пригодность целям педагогики. Этот дистрибутив был выбран еще и потому, что я пользовался этим дистрибутивом, когда набирал текст этой главы. На самом деле можно рассмотреть и файл, взятый из RedHat или Debian. В этих дистрибутивах файл может отличаться лишь в каких-то деталях, но по сути и выполняемым функциям он тот же самый.

Ну так что..., приступим к вивисекции inittab-а?

 #
 # /etc/inittab
 #
 # Copyright (c) 1996 SuSE GmbH Nuernberg, Germany.  All rights reserved.
 #
 # Author: Florian La Roche <florian@suse.de>, 1996
 #
 # This is the main configuration file of /sbin/init, which
 # is executed by the kernel on startup. It describes what
 # scripts are used for the different runlevels.
 #
 # All scripts for runlevel changes are in /sbin/init.d/ and the main
 # file for changes is /etc/rc.config.
 #

 # default runlevel
 id:3:initdefault:

 # check system on start-up
 # first script to be executed if not booting in emergency (-b) mode
 si:I:bootwait:/sbin/init.d/boot

 # /sbin/init.d/rc takes care of runlevel handling
 #
 # runlevel 0 is halt
 # runlevel S is single-user
 # runlevel 1 is multiuser without network
 # runlevel 2 is multiuser with network
 # runlevel 3 is multiuser with network and xdm
 # runlevel 6 is reboot
 l0:0:wait:/sbin/init.d/rc 0
 l1:1:wait:/sbin/init.d/rc 1
 l2:2:wait:/sbin/init.d/rc 2
 l3:3:wait:/sbin/init.d/rc 3
 #l4:4:wait:/sbin/init.d/rc 4
 #l5:5:wait:/sbin/init.d/rc 5
 l6:6:wait:/sbin/init.d/rc 6

 # what to do in single-user mode
 ls:S:wait:/sbin/init.d/rc S
 ~~:S:respawn:/sbin/sulogin
 # what to do when CTRL-ALT-DEL is pressed
 ca::ctrlaltdel:/sbin/shutdown -r -t 4 now

 # special keyboard request (Alt-UpArrow)
 # look into the kbd-0.90 docs for this
 kb::kbrequest:/bin/echo "Keyboard Request -- edit /etc/inittab to let this work."

 # what to do when power fails/returns
 pf::powerwait:/sbin/init.d/powerfail    start
 pn::powerfailnow:/sbin/init.d/powerfail now
 #pn::powerfail:/sbin/init.d/powerfail now
 po::powerokwait:/sbin/init.d/powerfail  stop

 # for ARGO UPS
 sh:12345:powerfail:/sbin/shutdown -h now THE POWER IS FAILING

 # getty programs for the normal runlevels
 # <id>:<runlevels>:<action>:<process>
 # The 'id' field  MUST be the same as the last
 # characters of the device (after "tty").
 1:123:respawn:/sbin/mingetty --noclear tty1
 2:123:respawn:/sbin/mingetty tty2
 3:123:respawn:/sbin/mingetty tty3
 4:123:respawn:/sbin/mingetty tty4
 5:123:respawn:/sbin/mingetty tty5
 6:123:respawn:/sbin/mingetty tty6

 #
 #
 #  Note: Do not use tty7 in runlevel 3; this virtual line
 #  is occupied by the programm xdm.
 #
 #  This is for the package xdmsc; after installing and
 #  configuration, you should remove the comment character
 #  from the following line:
 #7:2:respawn:+/sbin/init.d/rx tty7

 # modem getty.
 # mo:23:respawn:/usr/sbin/mgetty -s 57600 modem

 # fax getty (hylafax)
 # mo:23:respawn:/usr/lib/fax/faxgetty /dev/modem

 # vbox (voice box) getty
 # I6:23:respawn:/usr/sbin/vboxgetty -d /dev/ttyI6
 # I7:23:respawn:/usr/sbin/vboxgetty -d /dev/ttyI7

 # end of /etc/inittab

Как и во всех *nix-овых конфигурационных и скриптовых файлах, строки начинающиеся с знака диез/решетка (#) являются комментариями и игнорируются. Строки, принимающиеся во внимание выглядят следующим образом:

 id:runlevels:action:process

Расшифруем каждое из полей.

id Идентификационное имя, состоящее из четырех символов. Это просто название. То, как оно названо не имеет особого значения (хотя имеются некоторые соглашения, относительно login accounting-а, поэтому не изменяйте названия для строк, которые уже существуют).
runlevels Перечисляет один или более runlevel, на котором/-ых процесс будет запущен.
action Одно из следующего ниже
Action Описание
respawn Если процесс умер (dies), то запустить его снова.
wait Процесс будет выполнен, когда запущен указанный runlevel/ы, и кроме того прежде чем продолжить свою работу далее, init будет ожидать пока этот процесс не окончит свою работу.
once Процесс будет выполнен один раз, когда запущен указанный runlevel/ы, init не будет ожидать пока этот процесс окончит свою работу.
boot Процесс будет выполнен один раз на стадии загрузки. Поле runlevel-ов игнорируется.
bootwait Процесс будет выполнен один раз на стадии загрузки. Поле runlevel-ов игнорируется. Процесс init будет ожидать окончания работы процесс, прежде чем продолжит свою работу.
off Данная конфигурационная строка становится неактивной. Некоторые пользователи предпочитают такому синтаксису комментирование.
initdefault Указывает rinlevel по умолчанию. Поле process игнорируется.
sysinit Процесс будет выполнен один раз на стадии загрузки. Он будет выполнен прежде процессов указанных в конфигурационных записях, с полями boot и bootwait.
Имеются и другие опции, отвечающие за on-demand-обработку и сбоев по питанию (power failure), однако в этой главе они нас не интересуют. Чтобы узнать об этом более детально, смотрите inittab(5).
process Выполняемый процесс.

Первая незакомментированная строка следующая:

 id:3:initdefault

Эта строка описывает runlevel по-умолчанию. Это runlevel, на котором будет пребывать система, когда компьютер загрузится. Отметим, что в данном случае это runlevel 3.

Настройка getty

Как было сказано ранее, программа которая распознает и обслуживает пользовательское соединение (несетевое), называется getty. Имеется достаточно много различных getty-программ. Правда состоит в том, что скорее всего вы не захотите использовать ни одну из них, которая работает как классическая getty-программа. Здесь мы опишем два варианта getty, которые хорошо подойдут для использования с модемом. Это agetty и mgetty.

agetty

Команда agetty имеет некоторое количество возможностей, которые позволяют ее использовать с модемом, включающие в себя:

  • она распознает контроль четности (parity) и размер символа (character size); она может обрабатывать символы только в верхнем регистре (uppercase) (традиционным для *nix способом:\EVERYTHING UPPERCASE, WITH \C\A\P\I\T\A\L\S PRECEDED BY BACKSLASHES).
  • она может подстраивать скорость передачи (rate based), основываясь на сообщении CONNECT от Hayes-модема.
  • она позволяет конфигурировать flow control (это необходимо для современных высокоскоростных модемов).

Команда agetty весьма полезна, однако, по моему мнению (IMHO), mgetty лучше. Однако, чтобы покончить с этой командой, приведем ключи командной строки, которые понимает agetty (как обычно, в этом документе мы приводим только те, которые скорее всего будут использованы -- если вы захотите узнать больше, то копайте глубже):

-hВключает аппаратный flow control (протокол RTS/CTS).
-iНе отображать содержимое файла /etc/issue.
-f issue-file-nameИспользовать issue-file-name вместо файла по-умолчанию /etc/issue.
-I строка-инициализацииУстановить строку инициализации, которая будет послана модему перед тем, как отсылать что-либо еще. Зачастую она устанавливается в ATZ (команда сброса для Hayes-модемов). Непечатные символы могут быть помещены в такую строку с использованием обратной косой черты (\), за которой следует восьмеричное ASCII-значение символа, в виде трехзначного числа. Например, чтобы послать символ ESC (десятичный код ASCII 27), Вам необходимо указать \033.
-l login-программаУказать альтернативную login-программу. Если используется программа по-умолчанию -- /bin/login, то ее можно не указывать.
-mПопытаться извлечь скорость соединения из сообщения от стандартной Hayes-команды "CONNECT xxx". Программа agetty предполагает, что модем возвращает статусное сообщение, содержащее baud rate (скорость передачи), в ответ на первоначально выставленную в командной строке скорость (rate).
-nНе запрашивать имя пользователя (login name). Эта возможность может быть использована вместе с -l, чтобы запускаться на другой системе, например такой как BBS. Отметим что когда agetty не запрашивает login, то она не может автоматически установить контроль четности (parity), размер слова (word size) и прочие терминальные параметры.
-t timeoutЕсли имя пользователя не введено в течении timeout-секунд, то прекратить выполнение программы.
-LЛокальная линия (Local line). Этот параметр предписывает agetty игнорировать состояние сигнала "наличие несущей" (carrier detect signal) на последовательном порту. Эту функцию, в противоположность использованию с модемом, имеет смысл использовать в случае, если вы имеете терминал присоединенный непосредственно к последовательному порту.
-wЖдать символа "возврат каретки" (CR -- carriage return) или "перевод строки" (LF -- linefeed), перед тем как передавать файл /etc/issue и отображать приглашение для ввода имени пользователя. Использование этого ключа очень хорошая идея, особенно при использовании опции -l.

mgetty

Когда я настраиваю не-сетевой удаленный доступ, то я предпочитаю использовать mgetty. Почему? Да потому, что она поддерживает дополнительные полезные особенности. Вот эти преимущества, который я вижу в mgetty:

  • она поддерживает инициализацию модема меж вызовами.
  • она "вручную" отвечает на входящие звонки, поэтому вы никогда не установите свой модем в режим "Автоответчик" ("Autoanswer"). Это означает, что ваш модем не будет отвечать по телефону, если система не готова.
  • она понимает блокировочный протокол UUCP (Unix-to-Unix Communications Program) так, что вы сможете использовать один и тот же модем для dial-in (принимающих звонки) и dial-out (звонящих) приложений одновременно.
  • она понимает факс-модемы, -- если входящий звонок от факса, то она сохранит входящий факс в виде файла, а после этого снова будет готова для факса, либо для обмена данными.
  • она имеет расширенные возможности журналирования (logging).

Если вы вновь просмотрите ту часть главы, в которой рассматривался /etc/inittab, то заметите закоментированные строки, которые отвечают за mgetty. Становится очевидно, что SuSE разделяет мое мнение относительно mgetty. Единственная проблема состоит в том, что их параметры по-умолчанию несколько устарели. Скорость в 57,600 бод слишком низка для современных скоростных модемов.

Рассмотрим наиболее важные командные параметры mgetty, а затем выберем некоторые из них, чтобы изменить наш /etc/inittab.

Значение ключаОписание
-k spaceЗарезервировать space-килобайт на диске, когда принимается факс. Правильным будет установить этот параметр в достаточно большое значение. Иначе может статься так, что вы станете жертвой DoS-атаки через факс!
-x logging levelУстановить уровень "болтливости" журналирования mgetty. Уровень журналирования может быть от 0 (без журналирования) до 9 (многословное журналирование).
-s speedУстанавливает скорость передачи данных (data rate) меж модемом или терминалом в начальное значение, измеряется в битах в секунду (bits per second).
-rПропускает инициализацию модема для непосредственно подсоединенных терминалов (direct-connected terminals).
-p login-promptПозволяет создать свое собственное приглашение для login (login prompt). Имеется некоторое количество макросов, которые Вы можете использовать для того, чтобы поместить некоторую информацию в строку приглашения. Например, "\D" будет выводить дату, "\T" -- время, а "@" название системы. Имеется и масса других, -- проконсультируйтесь с man- и info- страницами.
-n число-звонковПозволяет указать на который по счету звонок mgetty будет отвечать. По-умолчанию это 1 (означающий первый звонок).
-DПредписывает mgetty принимать только звонки с данными (data calls only). Если ваш модем не факс-модем, то лучше установить этот парамерт. Однако даже если это и факс-модем, то использование этого параметра приведет к тому, что факс-звонки будут отклонены.
-FПредписывает mgetty принимать только факс-звонки. Любой звонок с данными будет отклонен.
-C classСообщает mgetty "класс" используемого модема. Допустимые значения для класса модема, -- auto, cls2, c2.0, data (это то же самое, что использование параметра -D). Класс по-умолчанию -- auto, при котором mgetty будет пытаться запросить capabilities модема. cls2 и c2.0 выбирают меж протоколами "class 2 fax" и "class 2.0 fax" (не справшивайте меня чья светлая голова придумала названия "2" и "2.0", вместо скажем "2" и "2.1"). Я рекомендую использовать auto, если вы конечно не имеете проблем с этим классом.
-I faxidИспользуйте строку faxid, как идентификатор факса (fax station ID). В США незаконно отправлять факсы без некоторой идентифицирующей информации. Эта информация должна включать в себя как минимум название предприятия или фамилию человека и телефонный номер факса. Хотя mgetty обычно не отправляет факсы (исключая случай с fax polling -- читайте info- и man- страницы!), все же правильным будет поместить эту минимальную информацию в программу, просто на всякий случай.
-aПредписывает включить autobauding. Другими словами mgetty будет пытаться проанализировать сообщение от модема "CONNECT xxxxx" так, чтобы подстроить скорость передачи (baud rate). Большинство современных модемов теперь не требуют этого. Они связываются с хостом на постоянной скорости и внутренне буферизируют данные, чтобы обрабатывать различные скорости передачи. Используйте этот параметр только если Ваш модем настоятельно требует, чтобы скорость отдачи/приема данных хостом соответствовала скорости соединения. (Модемы 14.4К или быстрее не должны выставлять таких требований).
-m modem chatУстанавливает инициализационный диалого модема. Строка состоит из перемежающихся сообщений "expect/send". Используйте двойные кавычки для пустой expect-строки. Например: -m '"" ATZ OK ATH0'

Помните, это не полная документация по mgetty. Однако, основываясь даже на этом изложении, давайте взглянем каким образом можно модифицировать строку из /etc/inittab:

 # modem getty.
 mo:23:respawn:/usr/sbin/mgetty -k 204800 -s 115200 -m '"" ATZ OK' -I "(763) 555-3456 M. Schwarz" modem

Указанные нами параметры означают вот что:

  • как минимум 200Mb дискового пространства должно оставаться свободным (-k).
  • скорость (baud rate) поднята на максимально возможное значение для современных последовательных портов (-s).
  • модем будет сбрасываться меж звонками (-m).
  • все факсы будут c корректной идентификацией (-I).

Помните, что mgetty имеет еще и другие параметры, которые мы не рассмотрели. Он может отклонять звонки, основываясь на идентификаторе звонящего (caller ID), конечно же для тех модемов, которые поддерживают эту функцию. Она разработана, чтобы работать с программой sendfax. Она может быть настроена так, чтобы отклонять все звонки без необходимости выгрузки программы из памяти, и так далее. Не поленитесь, почитайте документацию о всех этих функциях программы.

<< Проблема №1: Сеть Parallel Line Internet Protocol (PLIP) | Multi Tool Linux | Заключение >>


edit RightSideBar