Памятка iptables

Настройки стандартного фаервола лиукс вещь занятная. Сколько всяких приколюх можно с ним сделать. Поэтому решил собрать все вместе в одном месте.

Для начала схема:

Правила по умолчанию, ключ -P, возможные варианты — ACCEPT/DROP, применяется только к цепочкам:

${IPT} -P INPUT ACCEPT
${IPT} -P OUTPUT ACCEPT
${IPT} -P FORWARD ACCEPT

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

Очистка таблиц, ключ -F, применяется как и к цепочкам, так и к таблицам.:

${IPT} -F INPUT
${IPT} -F OUTPUT
${IPT} -F FORWARD
${IPT} -t nat -F POSTROUTING
${IPT} -t nat -F PREROUTING
${IPT} -t raw -F PREROUTING
${IPT} -t raw -F OUTPUT

Общие правила:

${IPT} -A PREROUTING -t raw -i lo -m comment --comment "INT-LO NOTRACK-IN" -j NOTRACK
${IPT} -A OUTPUT -t raw -o lo -m comment --comment "INT-LO NOTRACK-OUT" -j NOTRACK
${IPT} -A INPUT -i lo -m comment --comment "INT-LO ACCEPT" -j ACCEPT
${IPT} -A INPUT -d 127.0.0.0/8 ! -i lo -j REJECT -m comment --comment "NADO!" --reject-with icmp-port-unreachable
${IPT} -A INPUT -m state --state RELATED,ESTABLISHED -m comment --comment "NORMAL CONNECT" -j ACCEPT
${IPT} -A INPUT -p icmp -m icmp --icmp-type 8 -m comment --comment "PING ALLOW" -j ACCEPT

Этот набор правил я использую часто. Ключ -t выбирает таблицу(в данном случае raw, если таблица не указана, то по умолчанию используется таблица filter), ключ -i указывает интерфейс  на который пришел пакет. Ключ  -m comment —comment, позволяет оставить комментарий к цепочке( удобно опознавать правила). Самый главный ключ -j, определяет действие к правилу, возможны варианты: ACCEPT(разрешено), DROP(удалить) , REJECT(отклонить), NOTRACK ( не отслеживать соединения) и LOG(логировать).

Например, первое правило читается так — «соединения цепочки PREROUTING в таблице raw, пришедшие на петлевой интерфейс не отслеживать ну и оставить комментарий». Остальные, думаю, понятны из комментариев.

Вот так я принимаю соединения:

${IPT} -A PREROUTING -t raw -s $IP -p tcp -m tcp --dport 3306 -m comment --comment "MYSQL-NOTRACK-IN" -j NOTRACK
${IPT} -A OUTPUT -t raw -d $IP -p tcp -m tcp --sport 3306 -m comment --comment "MYSQL-NOTRACK-OUT" -j NOTRACK
${IPT} -A INPUT -s $IP -p tcp -m tcp --dport 3306 -m comment --comment "MYSQL-ACCEPT" -j ACCEPT

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

Правила для IPSEC соединений:

${IPT} -A INPUT -p esp -m comment --comment "IPSEC" -j ACCEPT
${IPT} -A INPUT -p ah  -m comment --comment "IPSEC" -j ACCEPT
${IPT} -A INPUT -s 91.213.158.254 -p udp -m udp -m multiport --dports 500,4500 -m comment --comment "IPSEC MFMS" -j ACCEPT

Параметр -m multiport —dports позволяет указывать несколько портов. Ключ -p указывает протокол.

Обычно в конце, я использую следующие правило(закрывающее):

${IPT} -A INPUT -m comment --comment "DROP THEM ALL" -j DROP

Для диагностики же, перед «закрывающим» я использую еще одно правило:

${IPT} -A INPUT -m comment --comment "PLEASE READ SYSLOG!" -j LOG --log-prefix "PLOXO: "

Это все пока.  Будет, что то нужное — дополню.

Так же рекомендую посмотреть следующие статьи:

http://linuxshare.ru/docs/security/iptables/iptables-tutorial.html — описание работы и основные команды

http://strngr.name/imitaciya-setevyx-poter/ — имитация потерь

http://www.opennet.ru/base/net/iptables_treasures.txt.html — фичи, расширения.

http://www.netfilter.org/ — исходный сайт продукта.

https://ru.wikibooks.org/wiki/Iptables — золото, а не сайт)