пятница, 5 февраля 2010 г.

SuSE: иного нет у нас пути...

/*
-М-м-м-у-у-у-у!!!
-Шо за "му"?! Опять нажрался, свинота?!

начну с элементарного - русификации консоли (tty/mingetty) в современных SLE/SuSE. где-то с версии SuSE-9.1 "проблема" как-бы исчезла полностью благодаря поддержке UTF-8, но как и что делать вроде никто в отдельную заметку не выносил. по поводу русификации ранних версий есть отличная статейка:

Русификация SuSE 9

но увы и ах - "бойянЪ". задача раскладывается на три составляющие (при условии, что Ваша "локаль" уже задана в /etc/sysconfig/language как RC_LANG="en_US.UTF-8" или RC_LANG="ru_RU.UTF-8"):

1) выбрать "правильный" шрифт (содержащий UTF-8 символы кириллицы как минимум).

чешем в "/usr/share/kbd/consolefonts/" и выбираем тот, который нравится больше всего. после чего вносим его в "/etc/sysconfig/console" как шрифт по умолчанию (пример):

CONSOLE_FONT="UniCyr_8x16.psf.gz"
CONSOLE_MAGIC="(K"

2) задаём UTF-8 кодировку терминала для вывода символов, отличных от ASCII, в "/etc/sysconfig/console":

CONSOLE_ENCODING="UTF-8"

3) выбираем подходящую "раскладку" и "переключалку" (доступные варианты можно просмотреть в /usr/share/kbd/keymaps/i386/qwerty/) и вносим её в "/etc/sysconfig/keyboard" (пример с переключением по правому ALT-у):

KEYTABLE="ru1_win-utf.map.gz"

кроме этого тут же можно установить "шорткат" для переключения между активными терминалами (например по кнопке "Win"):

COMPOSETABLE="clear winkeys"

завершающий штрих - рестарт сервиса "kbd":

/sbin/service kbd restart

после чего можно смело переключиться в "чистую" консоль (Ctl+Alt+F1) и оценить результат.
mission сукесфули комплитед.



Девушки бывают разные:
чёрные, белые, красные...

SuSE/SLE довольно специфичный дистрибутив, ибо содержит огромное количество "вкусностей", недоступных остальным "из коробки". это требует от пользователя определённого знания системы и вырианты решений тех или иных задач могут существенно отличаться (в этом-то и проявляется специфика). где-то эдак годика с 2005-го SuSE включила в базовую поставку системы свою собственную "надстройку" (называйте как хотите - "морда", гуй и т.п.) для управления пакетным фильтром iptables - SuSEfirewall, что до сих пор, imho, остаётся лучшим решением по управлению трафиком.

вся настройка идёт путём правки единственного файла:

$ sudo vim /etc/sysconfig/SuSEfirewall2

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

$ sudo /sbin/SuSEfirewall2 stop
$ sudo /sbin/SuSEfirewall2 start

анализ эффективных цепочек правил легче всего делать при помощи:

$ sudo /usr/sbin/iptables-save | less

"черновую" настройку можно набросать в "гуях" YAST-а:

$ gksu yast2 -> Security and Users -> Firewall

после чего настоятельно рекомендую ввести изменения в силу и в дальнейшем редактировать "/etc/sysconfig/SuSEfirewall2" вручную. особая ценность решения от SuSE в том, что оно не накладывает никаких ограничений "творческой мысли" при редактировании цепочек. если Вы не осилили предлагаемые готовые "пресеты", то никто не запрещает указать:

FW_CUSTOMRULES="/etc/sysconfig/scripts/SuSEfirewall2-custom"

и подгрузить из файла "SuSEfirewall2-custom" свои собственные правила. причём ситуаций, которые требуют подобного вмешательства - масса. в указанном выше файле содержатся примеры с кратким описанием ситуаций для их применения.

основным преимуществом использования SuSEfirewall можно считать чётко структурированный подход к работе цепочек фильтрации. по сути это одно большое наглядное практическое пособие о том, как Правильно работать с iptables. весь трафик сперва делится на "зоны" - DMZ, "внешний"/external, "внутренний"/internal, lo - с возможностью определить дополнительные при желании - wlan и т.п.. после чего для каждой "зоны" создаётся отдельная "цепочка" эффективных правил, фильтрующая весь трафик. также идёт прямое указание на загрузку необходимых Вам модулей ядра (пример):

FW_LOAD_MODULES="nf_conntrack_netbios_ns xt_conntrack xt_owner \
xt_iprange xt_CONNMARK xt_limit xt_TCPMSS xt_state\
nf_conntrack_ftp nf_nat_ftp"

в результате мы получаем красивую и логичную схему действующих правил, которая ещё и минимизирует издержки при обработке трафика благодаря stateful природе пакетного фильтра. суть stateful пожалуй можно перевести как установление "статуса" активного соединения и разбору дальнейших пакетов на его основе. т.е. если какое-то соединение признано валидным/состоявшимся, то оно получает статус ESTABLISHED/(установлено), после чего весь соответствующий ему трафик обрабатывается на основе этого статуса, "минуя" цепочки фильтрации. рассмотрим простой пример, наглядно демонстрирующий преимущества решений SuSE:

> sudo iptables-save -t raw

*raw
:PREROUTING ACCEPT [38828:15020523]
:OUTPUT ACCEPT [36327:4135365]
-A PREROUTING -i lo -j NOTRACK
-A OUTPUT -o lo -j NOTRACK
COMMIT

(параметр FW_LO_NOTRACK="yes")

вроде бы "мелочь" - вывод всего трафика lo из под "опёки" цепочек фильтрации, а на загруженных машинах это ой как приятно. или:

-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

здесь мы "синхронизируем" активное соединение с MSS (Maximum Segment Size in TCP), тем самым предотвращая пересылку слишком больших пакетов, требующих насильственного "деления".

рассмотрим далее упрощённый вариант того, что у нас творится в основных "цепочках" таблицы filter (как пример, без наворотов типа DMZ или специальных "зон" - ситуация "из коробки" так сказать...):

> sudo iptables-save -t filter | less

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:forward_ext - [0:0]
:forward_int - [0:0]
:input_ext - [0:0]
:input_int - [0:0]
:reject_func - [0:0]
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m state --state RELATED -j ACCEPT
-A INPUT -i tap0 -j input_int
-A INPUT -i eth1 -j input_ext
-A INPUT -i wlan1 -j input_ext
-A INPUT -i wmaster0 -j input_ext
-A INPUT -j input_ext
-A INPUT -m limit --limit 3/min -j LOG --log-prefix "SFW2-IN-ILL-TARGET " --log-tcp-options --log-ip-options
-A INPUT -j DROP
-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A FORWARD -i tap0 -j forward_int
-A FORWARD -i eth1 -j forward_ext
-A FORWARD -i wlan1 -j forward_ext
-A FORWARD -i wmaster0 -j forward_ext
-A FORWARD -m limit --limit 3/min -j LOG --log-prefix "SFW2-FWD-ILL-ROUTING " --log-tcp-options --log-ip-options
-A FORWARD -j DROP
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -m limit --limit 3/min -j LOG --log-prefix "SFW2-OUT-ERROR " --log-tcp-options --log-ip-options
*********************
**** прочее обрезано
*********************

нет никакого бардака. определены пять "функции" (отдельные цепочки правил для обработки трафика):

:forward_ext - [0:0]
:forward_int - [0:0]
:input_ext - [0:0]
:input_int - [0:0]
:reject_func - [0:0]

и весь траф поделён на "зоны":

int - "внутренний" - внутри локальной сети
ext - "внешний" - трафик из сетей, которые мы не контролируем (интернет и т.п.)

нетрудно заметить, что к "внутренней" зоне отнесён лишь один сетевой интерфейс - tap0. все остальные интерфейсы работают с "внешним" трафиком. нра? то-то...

для "краткого курса молодого бойца" необходимо и достаточно ознакомиться со следующим файлом:

> vim /usr/share/doc/packages/SuSEfirewall2/EXAMPLES

где дают исчерпывающие примеры по начальной конфигурации пакетного фильтра путём редактирования любимого файла "/etc/sysconfig/SuSEfirewall2". описывают восемь "сценариев":

1. Simple dialup
2. Small home network
3. Small home network with additional WLAN
4. Small company with external mail and web server
5. Company with IPsec tunnel to subsidiary
6. Company with web server in DMZ
7. Complex scenario
8. Laptop in private network but with additional public IP adresses

поскольку копипастить содержимое этого файла смысла нет, то пожалуй остановлюсь на некоторых деталях. начну с типовой ситуации для хомячков:

ISP предлагает тариф, позволяющий "качать" порно на скорости 768kbit/s, а вот "отдавать" трафик можно лишь на скорости в 256kbit/s. при этом возможна ситуация, когда при активной "отдаче" вы заметите "паралич" загружаемых файлов. лечение (при условии, что Вы на впн соединении с интерфейсом dsl0):

FW_HTB_TUNE_DEV="dsl0,250"

тут мы при помощи HTB режем исходящий трафик и резервируем 6kbit/s на "технические" нужды (пакеты TCP ACK или interactive SSH).

по умолчанию (для EXT зоны) зарезан broadcast и multicast. это может быть неудобно, поэтому внимательно смотрим на следующие переменные:

FW_ALLOW_FW_BROADCAST_EXT="no"
FW_ALLOW_FW_BROADCAST_INT="no"
FW_ALLOW_FW_BROADCAST_DMZ="no"
# ниже мы игнорируем логирование "дропнутых" ранее броадкастов
FW_IGNORE_FW_BROADCAST_EXT="yes"
FW_IGNORE_FW_BROADCAST_INT="yes"
FW_IGNORE_FW_BROADCAST_DMZ="yes"

для broadcast пакетов имеет смысл лишь открыть определённые порты, т.е. разрешить лишь выбранным приложениям принимать их. для multicast сперва надо ознакомиться с содержимым файла /etc/protocols, после чего уже разрешать определённые протоколы (например):

FW_SERVICES_EXT_IP="GRE MTP PIM"

и/или цепляем FW_CUSTOMRULES=файл_с_ручными_правками_правил, где рисуем:

iptables -A INPUT -j ACCEPT -d 224.0.0.0/24

тем самым разрешая "входящий" мультикаст на все протоколы/интерфейсы.

не будет лишним обратить внимание на:

FW_KERNEL_SECURITY="yes"

этот параметр включает некоторые скрытые защитные механизмы ядра (icmp_ignore_bogus_error_responses, icmp_echoreply_rate, icmp_destunreach_rate, icmp_paramprob_rate, icmp_timeexeed_rate, ip_local_port_range, log_martians, rp_filter, routing flush, bootp_relay, proxy_arp, secure_redirects, accept_source_route, icmp_echo_ignore_broadcasts, ipfrag_time)

если у вас большая и "шаловливая" локалка, то имеет смысл сделать:

FW_REJECT="no"
FW_REJECT_INT="no"

тем самым любителям сканить порты представится шанс сходить за чашечкой чая в ожидании отклика от портсканера.

имеет смысл как страховку от тупого DDOS-а выставить

FW_ALLOW_FW_SOURCEQUENCH="no"

тут мы "вырезаем" атаку по icmp которая возможна, при следующем условии:

-A input_ext -p icmp -m icmp --icmp-type 4 -j ACCEPT

но теряем на оповещении о статусе соединения от ISP (ежели он соизволит оное раздать ессно, что далеко не факт...)

последняя стадия "Enlightenment-а"/(сиречь Просветления, Мудрости и Духовной Силы) - это прямое редактирование скрипта, ведающего формированием цепочек правил:

> sudo vim /sbin/SuSEfirewall2

тут уж "вольному - воля". кто смел духом - дерзайте (бэкап оригинала не забудьте сохранить на всякий).

Use SuSE, Luke!

2 комментария:

niRv комментирует...

Здравствуйте, товарищь Дживс, закурим! :)

Анонимный комментирует...

ну наконец то я увидел в нете нечто адекватное про настройку сусефервола. ура.

Почему то гугление давало ссылки на статьи и посты в форумах, что сусефаервол - зло, его надо отключить и прочая.

форум лора - зло. для новичков, по крайней мере.

спасибо за статью.