Брандмауэр для сети с DMZ(простая реализация).
Метки: DMZ | DNAT | firewall | IPTables | marshrutizator | SNAT
Воскресенье, 29 марта 2009 г.
Просмотров: 3679
Правила брандмауэра.
На рисунке показана предложенная топология с IP-адресами интерфейсов. Опишем словесно все правила маршрутизации трафика, а потом реализуем их на IPTables:
- Пакеты, выходящие за пределы локальной сети (то есть адресованные интернет-узлам), должны проходить через интерфейс eth0. Кроме этого, нужно перезаписать адрес отправителя: поскольку используем внутренние адреса, то нужно заменить внутренний адрес отправителя адресом внешнего интерфейса.
- Ответы на эти пакеты должны быть переданы на интерфейс eth1 (интерфейс внутренней сети), при этом адрес получателя должен быть корректно перезаписан. Так как ответ, полученный от интернет-узла, будет предназначен внешнему интерфейсу, то нужно вернуть ответ внутреннему узлу, указав его внутренний IP-адрес.
- Пакеты из локальной сети, адресованные компьютерам нейтральной зоны, должны быть переданы на интерфейс eth2. Для этих пакетов NAT не нужен, поскольку DMZ-компьютеры также используют внутренние адреса.
- Пакеты из нейтральной зоны, адресованные компьютерам локальной сети, должны быть переданы на интерфейс eth1. NAT также не нужен.
- Пакеты DMZ-компьютеров, адресованные интернет-узлам, должны покинуть пределы сети через интерфейс eth0. В этом случае NAT нужен: нужно перезаписать адрес отправителя адресом внешнего интерфейса.
- Ответы на эти пакеты должны быть отправлены назад, при этом адрес получателя должен быть корректно перезаписан, так как пакет нужно отправить соответствующей машине нейтральной зоны.
- Входящие запросы на ТСР-соединения (SYN-пакеты) по портам 80 и 443 должны быть переданы Web-серверу (из нейтральной зоны).
- Входящие запросы на TCP/UDP-соединения по порту 53 должны быть переданы DNS-серверу (из нейтральной зоны).
- Входящие запросы на ТСР-соединения по порту 25 должны быть переданы почтовому серверу (из нейтральной зоны).
Вручную прописывать каждое правило очень трудоемко, поэтому обычно пишется сценарий для установки правил брандмауэра. В начало этого сценария помещаются переменные, содержащие параметры локальной сети: внешний интерфейс, IP-адреса серверов и т.д. Это крайне удобно: если неожиданно нужно будет изменить IP-адрес Web-сервера, не нужно будет менять его в каждой команде, где он встречается, достаточно всего лишь изменить значение переменной. Получатся такие переменные:
- IF_LAN — интерфейс брандмауэра, подключенный к локальной сети.
- IF_DMZ — интерфейс брандмауэра, подключенный к нейтральной зоне.
- IF_EXT — внешний интерфейс, соединяющий нашу сеть с внешним миром.
- IP_LAN — IP-адрес интерфейса IF_LAN.
- IP_DMZ — IP-адрес интерфейса IF_DMZ.
- DMZ_HTTP — IP-адрес Web-сервера нейтральной зоны.
- DMZ_DNS — IP-адрес DNS-сервера нейтральной зоны.
- DMZ_MAIL — IP-адрес почтового сервера нейтральной зоны.
- IPT — путь к программе iptables.
Все эти переменные могут использоваться в сценарии с предваряющим знаком доллара, например:
echo $IPT;
Получим такой сценарий для nat.sh:
#/bin/sh
IP_LAN="192.168.0.1"
IP_DMZ="192.168.1.1"
IF_EXT="eth2"
IF_LAN="eth0"
IF_DMZ="eth1"
DMZ_HTTP="192.168.1.2"
DMZ_DNS="192.168.1.3"
DMZ_MAIL="192.168.1.4"
IPT="/usr/sbin/iptables" ## путь к iptables
## Включаем IP-форвардинг
echo "1" > /proc/sys/net/ipv4/ip_forward
## Включаем поддержку динамических IP-адресов
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
## Вспомогательные модули
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe ip_nat_ftp
$IPT -flush $IPT -t nat -flush $IPT -t mangle -flush $IPT -X
## Политики цепочек по умолчанию
$IPT -P INPUT DROP $IPT -P OUTPUT DROP $IPT -P FORWARD DROP
## Разрешаем loopback-трафик
$IPT -A INPUT -i lo -j ACCEPT $IPT -A OUTPUT -o lo -j ACCEPT
Локальная сеть.
Дальше нужно включить SNAT для трафика, адресованного интернет-узлам:
$IPT -t nat -A POSTROUTING -о $IF_EXT -j MASQ
Разрешим трафику «выходить» за пределы сети:
$IPT -A FORWARD -i $IF_LAN -о $IF_EXT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $IF_EXT -o $IF_LAN -m state --state ESTABLISHED,RELATED -j ACCEPT
Если пакеты являются частью установленного соединения (или связаны с ним), то пакетам разрешается вернуться назад в сеть:
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Нейтральная зона(DMZ).
Включаем DNAT для нейтральной зоны:
$IPT -t nat -A PREROUTING -p tcp -i $IF_EXT --dport 80 -j DNAT --to-destination $DMZ_HTTP
$IPT -t nat -A PREROUTING -p tcp -i $IF_EXT --dport 443 -j DNAT --to-destination $DMZ_HTTP
$IPT -t nat -A PREROUTING -p tcp -i $IF_EXT --dport 53 -j DNAT --to-destination $DMZ_DNS
$IPT -t nat -A PREROUTING -p udp -i $IF_EXT --dport 53 -j DNAT --to-destination $DMZ_DNS
$IPT -t nat -A PREROUTING -p tcp -i $IF_EXT --dport 25 -j DNAT --to-destination $DMZ_MAIL
Разрешаем пакетам свободно перемещаться из нейтральной зоны в Интернет:
$IPT -A FORWARD -i $IF_DMZ -о $IF_EXT -j ACCEPT
Общее правило: в DMZ будут переданы пакеты, относящиеся к уже установленным соединениям:
$IPT -A FORWARD -i $IF_EXT -о $IF_DMZ -m state --state ESTABLISHED,RELATED -j ACCEPT
Внешним пользователям (интернет-пользователям) нужно устанавливать соединения с внутренними DMZ-серверами. Для этого нужно разрешить попытки установки TCP-соединений по определенным портам:
$IPT -A FORWARD -p tcp -i $IF_EXT -о $IF_DMZ -d$DMZ_HTTP --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p tcp -i $IF_EXT -o $IF_DMZ -d $DMZ_HTTP --dport 443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p tcp -i $IF_EXT -o $IF_DMZ -d $DMZ_MAIL --dport 25 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Для DNS-запросов, как правило, используется протокол UDP, для передачи DNS-пакетов также допускается использование протокола TCP (в отдельных случаях размер DNS-ответа превышает размер UDP-дейтаграммы), следовательно, нужно разрешить для DNS оба протокола.
$IPT -A FORWARD -p tcp -i $IF_EXT -o $IF_DMZ -d $DMZ_DNS --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p udp -i $IF_EXT -o $IF_DMZ -d $DMZ_DNS --dport 53 -m state —state NEW,ESTABLISHED,RELATED -j ACCEPT
Внутренняя маршрутизация.
Обязательно надо обеспечить передачу трафика между внутренней сетью и нейтральной зоной, так как пользователи локальной сети тоже будут пользоваться услугами внутренних серверов:
$IPT -A FORWARD -i $IF_LAN -о $IF_DMZ -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p tcp -i $IF_LAN -O $IF_DMZ -d $DMZ_HTTP --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p tcp -i $IF_LAN -o $IF_DMZ -d $DMZ_HTTP --dport 443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p tcp -i $IF_LAN -o $IF_DMZ -d $DMZ_DNS --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p udp -i $IF_LAN -o $IF_DMZ -d $DMZ_DNS --dport 53 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -p tcp -i $IF_LAN -o $IF_DMZ -d $DMZ_MAIL --dport 25 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Из DMZ во внутреннюю сеть разрешены только пакеты установленных соединений или относящихся к ним, поскольку DMZ-компьютеры никогда не будут устанавливать новые соединения с узлами внутренней сети:
$IPT -A FORWARD -i $IF_DMZ -о $IF_LAN -m state --state ESTABLISHED,RELATED -j ACCEPT
Также надо разрешить SSH-доступ к брандмауэру из машины, находящейся в локальной сети (это машина администратора с IP-адресом 192.168.0.2):
$IPT -A INPUT -i $IF_LAN -p tcp -s 192.168.0.2 --dport 22 -j ACCEPT
$IPT -A INPUT -i $IF_LAN -p tcp -s 192.168.0.2 --sport 22 -j ACCEPT
Доступ по протоколу SSH к брандмауэру разрешается только с узла с IP-адресом 192.168.0.2. Но это не означает, что можно установить простой пароль доступа - эту машину можно взломать и получить доступ к брандмауэру.
Разрешите выполнение файла nat.sh и добавьте его вызов в сценарий загрузки системы:
# chmod +x /root/nat.sh
