Памятка 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 — золото, а не сайт)