25.08.2011

Linux Server. 2 Настройка iptables

Займёмся правильной настройкой фаервола. На самом деле пакетный фильтр в Linux носит имя netfilter. А iptables - утилита для его настройки. Правильная настройка любого фаервола ведется по правилу: "Что не разрешено - то запрещено". То есть сначала нужно закрыть всё.

Все действия выполняются из под суперпользователя. sudo su
Закрываем всё:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP

Если нужно, чтобы на машину ходили пинги, нужно разрешить icmp-пакеты:
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
В этом случае пинги будут ходить отовсюду. Чтобы разрешить пинг только с конкретных ip/подсетей, пишем следующее (предыдущее не пишем):
iptables -A INPUT -s 192.168.0.100 -p icmp -j ACCEPT
iptables -A OUTPUT -d 192.168.0.100 -p icmp -j ACCEPT
В этом случае 192.168.0.100 - ip машины, с которой можно пинговать. Чтобы задать подсеть, достаточно написать 192.168.0.0/24, где 24 - маска подсети (можно писать 255.255.255.0).

Открытие портов производим по такому же принципу. Если конкретный адрес/подсеть не указаны, порты откроются для всех. Не забываем, что если в цепочке INPUT указывается s (source), то в OUTPUT - d (destination), и наоборот. Откроем 22 порт для 192.168.0.100:
iptables -A INPUT -s 192.168.0.100 -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -d 192.168.0.100 -p tcp --sport 22 -j ACCEPT

Не забываем открыть DNS порты, иначе сами сможем ходить в нет только по айпишникам:
iptables -A INPUT -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT


Проброс портов:
Задача:
при попытке соединения с сервером (192.168.0.104) из локальной сети  (c IP 192.168.0.100) на порт RDP (3389) - соединять клиента с Windows-сервером (192.168.0.21).
Тут нужен NAT. Сначала нужно включить его поддержку
echo net.ipv4.ip_forward=1 > /etc/sysctl.conf
Перезагружаемся.
Теперь пишем правила:
iptables -t nat -A PREROUTING --dst 192.168.0.104 -p tcp --dport 3389 -j DNAT --to-destination 192.168.0.21
Этой командой мы говорим фаерволу, чтобы он добавил в таблицу nat в цепочку PREROUTING правило, которое в пакетах, идущих к машине с фаерволом (192.168.0.104) на порт 3389, заменял адрес назначения пакетов с 192.168.0.104 на 192.168.0.21.

iptables -t nat -A POSTROUTING -p tcp --dst 192.168.0.21 --dport 3389 -j SNAT --to-source 192.168.0.104
Это пишем уже в цепочку POSTROUTING (т.е. после принятия решения о маршрутизации) таблицы nat, в котором говорим, что пакеты, идущие от нас (192.168.0.104) к 192.168.0.21 меняли адрес отправителя на наш (192.168.0.104). Так как сейчас у них адрес отправителя (192.168.0.100 или адрес той машины, с которой мы хотим подключиться к RDP).

Ещё два правила в таблицу filter:
iptables -A FORWARD --dst 192.168.0.21 --src 192.168.0.0/24 -p tcp --dport 3389  -j ACCEPT
iptables -A FORWARD --src 192.168.0.0/24 --dst 192.168.0.21 -p tcp --dport 3389  -j ACCEPT
Эти правила разрешают прохождение пакетов из локалки 192.168.0.0/24 на Windows-сервер (192.168.0.21) на порт 3389 и обратно.

Пока что у меня в фаерволе следующие правила:


Chain INPUT (policy DROP)
target     prot opt source               destination
ACCEPT     icmp --  anywhere               anywhere
ACCEPT     udp  --  anywhere               anywhere            udp spt:domain
ACCEPT     tcp  --  192.168.0.100        anywhere            tcp dpt:ssh
ACCEPT     tcp  --  anywhere                anywhere            tcp spt:www
ACCEPT     tcp  --  192.168.0.100        anywhere            tcp dpt:www

Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     tcp  --  192.168.0.0/24       192.168.0.21        tcp dpt:3389
ACCEPT     tcp  --  192.168.0.21         192.168.0.0/24      tcp spt:3389

Chain OUTPUT (policy DROP)
target     prot opt source               destination
ACCEPT     icmp --  anywhere             anywhere
ACCEPT     udp  --  anywhere             anywhere              udp dpt:domain
ACCEPT     tcp  --  anywhere             192.168.0.100       tcp spt:ssh
ACCEPT     tcp  --  anywhere             anywhere               tcp dpt:www
ACCEPT     tcp  --  anywhere             192.168.0.100       tcp spt:www


Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DNAT       tcp  --  anywhere             192.168.0.104       tcp dpt:3389 to:192.168.0.21

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       tcp  --  anywhere             192.168.0.21        tcp dpt:3389 to:192.168.0.104



Мануалы:
http://easylinux.ru/node/190/
http://www.opennet.ru/docs/RUS/iptables/
http://www.it-simple.ru/?p=2250


UPD: Для совсем начинающих: можете задать вопросы в комментах или в личку. Обязательно отвечу и постараюсь помочь с простыми решениями (в сложных сам не шарю)
UPD2: Недавно здесь выложили ещё один мануал

Комментариев нет:

Отправить комментарий