Личный блог Suvan`a.

Работая и играя с Linux... И что из этого иногда получается.

Брандмауэр для сети с DMZ(простая реализация).

Рубрика: Безопасность -> Брандмауэр
Метки: | | | | |
Воскресенье, 29 марта 2009 г.
Просмотров: 8950

Правила брандмауэра.

     На рисунке показана предложенная топология с 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