Pull to refresh

Comments 18

Занятно. Тема интересна, было приятно увидеть углубление в формат конфига.
# -*- shell-script -*-
#
# Configuration file for ferm(1).
#

# Interfaces
@def $WAN_IF = eth0;
@def $LO_IF = lo;

# My IPs
@def $L_NET = 0.0.0.0/20;
@def $M_IP = 0.0.0.0;
@def $LO_IP = 127.0.0.1;

# SIP proviers
@def $S_IP = 0.0.0.0;
@def $M_IP = sip.sip.sip;
@def $A_IP = 0.0.0.0;

@def $PROVS_IPS = ($S_IP $M_IP $A_IP);

# Users
@def $SIP_USERS = ( 0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 );

@def $ADM_IPS = ($A_IP $M_IP);

table filter {
chain INPUT {
policy ACCEPT;

# allow local packages
interface $LO_IP ACCEPT;

saddr (
$L_NET
$PROVS_IPS
$ADM_IPS
$SIP_USERS
) proto udp dport 5060 ACCEPT;
proto udp dport 5060 DROP;

# connection tracking
mod state state INVALID DROP;
mod state state (ESTABLISHED RELATED) ACCEPT;

# respond ping
proto icmp ACCEPT;

# allow SSH connections
proto tcp dport ssh mod state state NEW mod recent {
update seconds 180 hitcount 5 rsource name NOSSHBRUTE DROP;
set rsource name NOSSHBRUTE ACCEPT;
}

saddr ( $ADM_IPS ) proto tcp dport 5038 ACCEPT;
proto tcp dport 5038 DROP;
}

chain OUTPUT {
policy ACCEPT;
}

chain FORWARD {
policy DROP;
}
}

Для примера сойдёт?
UFO just landed and posted this here
UFO just landed and posted this here
Перевод мана на русский — это задача богоугодная, однако явно не для публикации на хабре. Принципиально она выполнима, с той оговоркой, что мануал, вообще говоря, большой. Не так. БОЛЬШОЙ :) Поэтому займет оно не один вечер.
Плюс, в общем случае мануал не заменяет выжимки из мануала — иначе как объяснить дикую популярность различных хауту?

Ну да, над переводом мана я подумаю, может и сделаю в свободное время.
UFO just landed and posted this here
Очень интересно. Хотел бы увидеть продолжение рассказа про ferm.
Ferm — гениальная вещь. В свое время просмотрел все утилиты для управления iptables, ни одна из них не давала такой гибкости, которую может дать ferm. Основной плюс ferm (может для кого-то минус) — это просто небольшая надстройка над iptables, позволяющая использовать всю мощь iptables в более читаемом виде. Поэтому если не знаешь iptables, смысла использовать ferm нет, а если знаешь, то разобраться в ferm не составит труда.
ИМХО, чтобы строить грамотно правила, знать iptables нужно в любом случае. Можно не знать отдельных названий совпадений/действий/модулей, но для этого man'ы и придуманы. А понимать, как оно работает, к добру ли, нет ли, приходится. В таких условиях человеческая обертка воспринимается как манна небесная.
Многие используют какой-нибудь firehol, вообще не задумываясь о внутреннем устройстве iptables. Это удобно на домашнем сервере, быстро открыть-закрыть несколько портов не вникая в iptables.
# import-ferm >/dev/null 
option 'nfmask' in line 25 not understood
# grep nfmask /etc/iptables 
-A OUTPUT -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff

Общие проблемы всех надстроек — всё-таки они не все фичи понимают/поддерживают. :(
В данном случае проблема решается не просто, а очень просто :)
--- /usr/sbin/ferm 2011-08-30 09:49:03.857287358 +0400
+++ ferm 2011-08-30 09:49:29.384287034 +0400
@@ -285,7 +285,7 @@
add_target_def 'BALANCE', qw(to-destination to:=to-destination);
add_target_def 'CLASSIFY', qw(set-class);
add_target_def 'CLUSTERIP', qw(new*0 hashmode clustermac total-nodes local-node hash-init);
-add_target_def 'CONNMARK', qw(set-mark save-mark*0 restore-mark*0 mask);
+add_target_def 'CONNMARK', qw(set-mark save-mark*0 restore-mark*0 mask nfmask ctmask);
add_target_def 'CONNSECMARK', qw(save*0 restore*0);
add_target_def 'DNAT', qw(to-destination=m to:=to-destination random*0);
add_target_def 'DSCP', qw(set-dscp set-dscp-class);


Это добавит поддержку и в import-ferm тоже.
Не всё так просто. С этими изменениями import-ferm не заработал. После прописывания этих двух ключевых слов и в import-ferm, он съел это правило и навернулся на следующем:
# import-ferm >/dev/null 
option 'mark' in line 26 cannot be pre-negated
# awk 'NR==26{print}' /etc/iptables 
-A OUTPUT -m mark ! --mark 0x0 -j ACCEPT
В общем, типичное допиливание надстроек. Всё решаемо, само собой, но нафига это нужно…
Что-то у вас старая версия по-моему. У меня с mark все в порядке, и import подгружает таблицу из ferm.

# ferm --version
ferm 2.1
Да, у меня 1.3.3 — текущая «стабильная» в портаж Gentoo. Поставил 2.1 — она даже ещё раньше споткнулась, не доходя до 25-26 строчек:
# import-ferm >/dev/null 
option 'set-xmark' in line 19 not understood
# awk 'NR==19{print}' /etc/iptables 
-A INPUT -i ppp0 -j CONNMARK --set-xmark 0x1/0xffffffff

И, сразу отвечая на Ваш второй ответ ниже — под «нафига» имелось в виду не «нафига ferm» — на этот вопрос Вы действительно ответили в топике, а «нафига дополнительные проблемы из-за использования надстроек, типичные для всех надстроек». Все тулзы такого типа как-бэ облегчают жизнь пользователю, но на практике это мины замедленного действия. Кому-то повезёт, и он на мине не подорвётся, кому-то не повезёт… И проблема не только в том, что нет 100% совместимости, но и в том, что появляется дополнительная прослойка, в которой тоже (как и в любой программе) есть баги. А отладка ситуации, когда из вроде-бы корректного конфига ferm будут генерироваться не совсем корректные правила iptables, может занять немало времени (большая часть которого уйдёт на то, чтобы прийти к мысли что нужно искать проблему именно там).
Ну и да, нафига это нужно написано в первом разделе топика после введения. Ограничения, налагаемые ferm'ом минимальны и практически все легко устранимы, а выигрыш вполне ощутим (имхо). Если аргументы не выглядят весомыми, ну так я не настаиваю, вкусы бывают разные. Обращать в религию я никого не собирался в общем-то.
Ничего себе. Разумнее использовать циклы на шелле.
Sign up to leave a comment.

Articles