пятница, 25 июня 2010 г.

Iptables






Итак, в данной заметке, как вы уже наверно догадались, речь пойдет о пакетном фильтре Iptables.
О том что это такое и как оно работает вы можете прочитать в википедии пройдя по этой ссылке.
Я же просто приведу несколько простых примеров с комментариями (используется формат утилиты iptables-save).

*filter
# Установка политик по умолчанию для цепочек таблицы filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# здесь мы разрешаем tcp соединения с установленными флагами ACK а также соединения имеющие состояние ESTABLISHED или RELATED (например в сочетании с действием по умолчанию DROP это дает нам возможность разрешать только исходящие от нашего сервера соединения)
-A INPUT -p tcp -m tcp --tcp-flags ACK ACK -j ACCEPT
-A INPUT -m state --state ESTABLISHED -j ACCEPT
-A INPUT -m state --state RELATED -j ACCEPT
# Разрешаем входящие соединения на loopback и внутреннем интерфейсе.
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
# Открываем на внешнем интерфейсе порты 25 и 110 (SMTP и POP3).
-A INPUT -i eth0 -p tcp -m tcp -m multiport -j ACCEPT --dports 25,110
# Пример простейшей привязки ip к mac
-A INPUT -m mac -s 192.168.0.5 -i eth1 ! --mac-source 00:22:15:53:16:85 -j DROP
#Данные две строчки позволяют ограничить количество соединений на порт 22 (3 соединения с одног IP за полчаса). Это поможет защититься от брутфорс атак, но вообще крайне не рекомендуется оставлять ssh на стандартном порту.
-A INPUT -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 2/hour --limit-burst 3 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 --tcp-flags FIN,SYN,RST,ACK SYN -j DROP
COMMIT
*mangle
# Установка политик по умолчанию для цепочек таблицы mangle
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
COMMIT
*nat
# Установка политик по умолчанию для цепочек таблицы nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# Пример проброса порта (80 порта [http])с внешнего IP на машину во внутренней сети.
#Сам порт в таблице filter отрывать не надо.
-A PREROUTING -p tcp -d XXX.XXX.XXX.XXX --dport 80 -j DNAT --to-destination 192.168.0.17:80
# Используется на шлюзе для того что сделать http прокси сервер прозрачным (например squid)
-A PREROUTING -s 192.168.0.0/255.255.255.0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128
# Правило для маскарадинга пакетов от сети 192.168.0.0/24 и исходящем интерфейсе eth0 (если он у нас смотрит во вне то у сети 192.168.0.0/24 появляется интернет :-) ).
-A POSTROUTING -s 192.168.0.0/255.255.255.0 -o eth0 -j MASQUERADE
# ну а так можно сделать например если мы хотим открыть кому-то только аську.
-A POSTROUTING -p tcp -m tcp -m multiport -s 192.168.0.25 -o eth0 -j MASQUERADE --dports 5190
COMMIT

Далее пример простого конфига роутера.

*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1194 -j ACCEPT
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -j ACCEPT
-A INPUT -i tun+ -j ACCEPT
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -i lo -j ACCEPT
-A FORWARD -i eth0 -j ACCEPT
-A FORWARD -i tun+ -j ACCEPT
COMMIT
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 192.168.2.0/255.255.255.0 -o eth1 -j MASQUERADE
COMMIT


Администрирование серверов