Примеры написания правил для iptables
У цепочек программы iptables существуют правила по умолчанию (политики фильтрации). Стандартная политика для iptables – директива DROP.
Выбираемое правило зависит от связки таблица/цепочка. Директива DROP необходима для цепочки filter/FORWARD. Эта цепочка используется для фильтрации всех пакетов, проходящих через систему (т.е. маршрутизируемых). Хорошим кандидатом является также цепочка filter/ INPUT, которая используется для фильтрации пакетов, поступающих на брандмауэр. В других цепочках стандартная политика фильтрации зависит от применения цепочки. Например, если стратегия защиты системы предусматривает ограничение исходящего трафика, директива DROP подойдет и для цепочки filter/OUTPUT.
Ниже показано, как назначить цепочкам filter/FORWARD и filter/OUTPUT политику фильтрации DROP:
iptables -P INPUT -j DROP
Базовые правила
Рассмотрим простой пример системы, в которой нужно разрешить FTP-соединения из внутренней сети во внешнюю. Нужно также разрешить FTP-доступ с компьютера topcat во внешнюю сеть. Весь остальной трафик не разрешен. Система NAT в данном случае не используется. Это не совсем реалистичный пример, который далее будет усложняться.
Чтобы пропустить FTP-трафик из внутренней сети, нужно добавить соответствующие правила в цепочку filter/FORWARD. Через эту цепочку должны также проходить возвращаемые пакеты. Правила, разрешающие FTP-доступ с компьютера topcat во внешнюю сеть, добавляются в цепочки filter/INPUT и filter/OUTPUT. Необходимые правила приведены ниже (номера необходимы для удобства описания, там где «- — [расширение]«, например «- — sport», имеется ввиду все вместе без пробелов):
2. iptables -P INPUT -j DROP
3. iptables -P OUTPUT -j DROP
4. iptables -A FORWARD -s 10.254.10.0/24 -d 0/0 -m multiport -p tcp — — dport ftp, ftp-data -j ACCEPT
5. iptables -A FORWARD -s 0/0 -d 10.254.10.0/24 -p tcp — — sport ftp-data -j ACCEPT
6. iptables -A FORWARD -s 0/0 -d 10.254.10.0/24 -p tcp — — sport ftp ! — — syn -j ACCEPT
7. iptables -A FORWARD -j LOG — — log-prefix «iptables FORWARD: «
8. iptables -A OUTPUT -o eth0 -s 10.254.1.1 -d 0/0 -m multiport -p tcp — — dport ftp, ftp-data -j ACCEPT
9. iptables -A OUTPUT -j LOG — — log-prefix «iptables OUTPUT: «
10. iptables -A INPUT -i eth0 -s 0/0 -d 10.254.1.1 -p tcp — — sport ftp-data -j ACCEPT
11. iptables -A INPUT -i eth0 -s 0/0 -d 10.254.1.1 -p tcp — — sport ftp ! — — syn -j ACCEPT
12. iptables -A INPUT -j LOG — — log-prefix «iptables INPUT: «
Каждую из этих команд можно выполнить отдельно или поместить в сценарий. В строках 1-3 задаются стандартные правила фильтрации для трех цепочек таблицы filter. В строках 4-7 записаны правила цепочки filter /FORWARD, контролирующие переадресацию пакетов через компьютер topcat. В частности, в строке 4 пропускаются пакеты из локальной сети по любому исходящему адресу, при условии, что целевой порт соответствует службе ftp или ftp-data. В строке 5 разрешается передача FTP-данных из внешней сети во внутреннюю. В строке 6 пропускаются ответные FTP-пакеты, если только они не являются запросами на установление соединения. В строке 7 регистрируются все остальные пакеты, поступающие в цепочку FORWARD.
В строках 8-12 заданы правила цепочек filter/OUTPUT и filter/INPUT. По сути, они эквивалентны предыдущим правилам цепочки filter/FORWARD, но применяются к исходящим пакетам, которые генерируются локальными процессами на компьютере topcat (filter/OUTPUT), а также к пакетам, поступающим на компьютер topcat (filter/INPUT). Указан только интерфейс eth0, поэтому FTP-доступ разрешен только во внешнюю сеть. Кроме ответных FTP-пакетов, весь остальной трафик, поступающий на компьютер topcat, игнорируется. Никакой трафик во внутреннюю сеть не пропускается.
Далее будут рассмотрены средства контроля соединений, позволяющие минимизировать правила и повысить общую безопасность системы.
Контроль соединений
Сейчас будем упрощать правила цепочки filter/FORWARD, показанные в предыдущем листинге, включив контроль соединений. Обновленные правила приведены ниже:
2. modprobe ip_conntrack_ftp
3. iptables -P FORWARD -j DROP
4. iptables -P INPUT -j DROP
5. iptables -P OUTPUT -j DROP
6. iptables -A FORWARD -m state — — state ESTABLISHED, RELATED -j ACCEPT
7. iptables -A FORWARD -m state — — state NEW -s 10.254.10.0/24 -d 0/0 -p tcp — — dport ftp -j ACCEPT
8. iptables -A FORWARD -m limit -j LOG — — log-prefix «iptables FORWARD: «
9. iptables -A OUTPUT -o eth0 -s 10.254.1.1 -d 0/0 -m state — — state ESTABLISHED,RELATED -j ACCEPT
10. iptables -A OUTPUT -m state — — state NEW -o eth0 -s 10.254.1.1 -d 0/0 -p tcp — — dport ftp -j ACCEPT
11. iptables -A OUTPUT -m limit -j LOG — — log-prefix «iptables OUTPUT: «
12. iptables -A INPUT -i eth0 -s 0/0 -d 10.254.1.1 -m state — — state ESTABLISHED,RELATED -j ACCEPT
13. iptables -A INPUT -m limit -j LOG — — log-prefix «iptables INPUT: «
Сразу бросается в глаза использование расширения state. Благодаря контролю состояния RELATED пропадает необходимость создавать отдельные правила для обработки ответных пакетов службы ftp-data. Обратите внимание на строки 1 и 2, в которых загружаются модули ip_conntrack и ip_conntrack_ftp. Они необходимы, чтобы можно было использовать расширение state. В строках 3-5 задаются стандартные правила фильтрации для цепочек таблицы filter.
В цепочке filter/FORWARD теперь не четыре правила, а три. Строка 6 — это правило, пропускающее любые пакеты, посылаемые в рамках существующего соединения (состояние ESTABLISHED). Ключевое слово RELATED разрешает все связанные соединения, включая пакеты ICMP и запросы службы ftp-data. В строке 7 указано, что исходящие соединения могут устанавливаться только службой ftp. Конечно, сокращение числа правил с четырех до трех не слишком существенно в данном случае, но если бы было разрешено большее число соединений, эффект получился бы значительным. Например, если нужно разрешить службы ftp, www и telnet, изменению подвергнется только строка 7:
-s 10.254.10.0/24 -d 0/0 -p tcp — — dport ftp,www,telnet -j ACCEPT
Правила цепочек filter/OUTPUT и filter/INPUT подвергаются аналогичным изменениям. Обратите внимание на то, что правила, включающие журнальную регистрацию, содержат опцию -m limit. Это позволяет сократить число регистрируемых пакетов и противостоять атакам типа «отказ от обслуживания» (DOS), нацеленным на переполнение журнальных файлов.
Как и в предыдущем примере, все правила можно выполнять вручную или поместить сценарий.
Правила таблицы nat
Теперь рассмотрим более реалистичный пример. Предположим, что компьютер topcat имеет IP-адрес 199.2.8.17/28, связанный с интерфейсом eth0, и доступен целый диапазон адресов от 199.2.8.18 до 199.2.8.29. Эти адреса назначены провайдером, маршрутизатор которого имеет адрес 199.2.8.30.
В данном примере имеются общедоступные Web- и FTP-сервер, которым назначены внешние адреса 199.2.8.18 и 199.2.8.19. Для обработки этих адресов придется использовать систему NAT и написать соответствующие правила программы iptables. Предположим также, что стратегия безопасности организации разрешает всем компьютерам локальной сети получать доступ в Internet. Доступ к локальным системам из Internet запрещен, за исключением Web- и FTP-серверов, а также ответных пакетов.
Ниже в листинге показаны правила конфигурирования компьютера topcat (без правил журнальной регистрации):
15. modprobe ip_nat_ftp
16. modprobe ip_conntrack
17. modprobe ip_conntrack ftp
18. iptables -P INPUT -j DROP
19. iptables -P FORWARD -j DROP
20. iptables -P OUTPUT -j DROP
21. iptables -t nat -A PREROUTING -d 199.2.8.18 -j DNAT — — to-destination 10.254.1.10
22. iptables -t nat -A PREROUTING -d 199.2.8.19 -j DNAT — — to-destination 10.254.1.20
23. iptables -t nat -A POSTROUTING -s 10.254.1.10 -j SNAT — — to-source 199.2.8.18
24. iptables -t nat -A POSTROUTING -s 10.254.1.20 -j SNAT — — to-source 199.2.8.19
25. iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -j SNAT
26. iptables -A FORWARD -m state — — state ESTABLISHED, RELATED -j ACCEPT
27. iptables -A FORWARD -s 10.0.0.0/8 -d 0/0 -m state — — state NEW -j ACCEPT
28. iptables -A FORWARD -s 0/0 -d 10.254.1.10 -m state — — state NEW, ESTABLISHED, RELATED -p tcp — — dport www -j ACCEPT
29. iptables -A FORWARD -s 0/0 -d 10.254.1.20 -m state — — state NEW, ESTABLISHED, RELATED -p tcp — — dport ftp -j ACCEPT
30. iptables -A OUTPUT -m state — — state NEW, ESTABLISHED, RELATED -j ACCEPT
31. iptables -A INPUT -m state — — state ESTABLISHED, RELATED -j ACCEPT
32. iptables -A INPUT -i eth1 -s 10.0.0.0/8 -d 10.254.1.1 -m state — — state NEW -j ACCEPT
В строках 14 и 15 загружаются модули ядра, необходимые для функционирования системы NAT. Строки 16-20 были описаны выше. Строки 21-24 описывают правила доступа к Web- и FTP-серверам. Правила цепочки PREROUTING транслируют Internet-адреса входящих пакетов в локальные адреса, а правила цепочки POSTROUTING транслируют исходные адреса исходящих пакетов. Порядок обработки этих цепочек позволяет использовать в цепочке FORWARD реальные IP-адреса (а не транслированные, как в программе ipchains).
Строка 25 содержит правило, транслирующее исходный IP-адрес всех внутренних узлов (кроме Web- и FTP-серверов). Здесь используется директива SNAT, поскольку внешний адрес 199.2.8.17 фиксирован (т.е. протокол DHCP или его аналог не используется).
Все пакеты, передаваемые в Internet из внутренней сети, будут казаться отправленными с компьютера 199.2.8.17. Обратная трансляция выполняется автоматически.
Остальные правила напоминают соответствующие правила предыдущего примера.
iptables прекрасен и гибок в настройке, но я до сих пор не осилил решение типа как в керио, монитор установленных соединений и разрыв ручками нежелательных, а это очень печально.
Автору спасибо, все четко и по полочкам разложил.