01-06-2008 18:56
Итак у вас в наличии настроенный и работающий 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-е.
Помните я говорил вам о том, что это не книга о системном администрировании 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, которые хорошо подойдут для использования с модемом. Это agetty и mgetty.
Команда agetty имеет некоторое количество возможностей, которые позволяют ее использовать с модемом, включающие в себя:
Команда 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:
Если вы вновь просмотрите ту часть главы, в которой рассматривался /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
Указанные нами параметры означают вот что:
Помните, что mgetty имеет еще и другие параметры, которые мы не рассмотрели. Он может отклонять звонки, основываясь на идентификаторе звонящего (caller ID), конечно же для тех модемов, которые поддерживают эту функцию. Она разработана, чтобы работать с программой sendfax. Она может быть настроена так, чтобы отклонять все звонки без необходимости выгрузки программы из памяти, и так далее. Не поленитесь, почитайте документацию о всех этих функциях программы.
<< Проблема №1: Сеть Parallel Line Internet Protocol (PLIP) | Multi Tool Linux | Заключение >>