Такого поняття як динамічні правила в iptables не існує. Правильно називати - відстеження стану keep state.
У Iptables існують такі типи стану (доступно, якщо модуль 'state' завантажений за допомогою '-m state'):
NEW - Всі пакети встановлюють нове з'єднання (Наприклад, запит на встановлення з'єднання)
ESTABLISHED - Всі пакети належать встановленому з'єднанню (Наприклад, GET відповідь web-сервера)
RELATED - Пакети, які не належать встановленому з'єднанню (тобто ті пакети, які є частиною нових з'єднань, які було ініційовано вже встановленим ESTABLISHED з'єднанням), але пов'язані з ним. (Наприклад - FTP в активному режимі використовує різні сполуки для передачі даних. Ці сполуки пов'язані.)
INVALID - Пакети, які не можуть бути з тих чи інших причин ідентифіковані. Наприклад ICMP помилки не належать існуючим з'єднанням
Тепер перейдемо до створення правил. Насамперед змінимо політики за замовчуванням:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
І наостанок - правил відстежують стан:
iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
Цим ми створили повністю закритий фаєрвол. Тепер залишилося додавати дозволяють правила. Ось кілька прикладів:
- дозволяємо тільки вихідні пінг
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
- дозволяємо доступ до сервера по ssh:
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
А ось повний лістинг нашого брандмауера:
iptables -F
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
Справа в тому, що при таких правилах фаєрвол не роз'єднує ESTABLISHED з'єднання. Якщо ви хочете примусово це зробити - кращий варіант:
iptables -I INPUT 1 -s 10.10.10.10 -m state --state ESTABLISHED, RELATED -j DROP
Якщо ви використовуєте ланцюжок FORWARD. то для неї будуть потрібні такі правила:
iptables -P FORWARD DROP
iptables -A FORWARD -i $ INET_IFACE -m state --state ESTABLISHED, RELATED -j ACCEPT
iptables -A FORWARD -i $ LAN_IFACE -m state --state NEW, ESTABLISHED, RELATED -j ACCEPT