Pull to refresh

OpenWRT + Asus WL 520GU + Iptables. Разделяем LAN, DMZ и Internet

Reading time 5 min
Views 27K
Всем привет!
Давеча возникла необходимость упрятать некоторый сервис в DMZ. Сервис этот крутится в W2K3, и мне не хотелось чтобы машина с OS Windows смотрела в интернет и в локальную сеть ни чем незащищенная(«виндовые» фаерволы просто идут лесом).
Помянуя успешный опыт работы с Asus WL 520GU и DD-WRT, решил пойти по проторенной дороге, но в качестве прошивки для роутера выбрал OpenWRT.
Схему работы связки можно увидеть на рисунке.

Итак, от слов перейдем к делу.

В комментариях было замечанно некоторое недопонимание термина DMZ.
В связи с чем приведу цитату из Википедии.(для противников подобного цитирования могу заметить, что данный материал практически идентичен тому, что написано в книге Полный справочник по Cisco)


ДМЗ (демилитаризованная зона, DMZ) — технология обеспечения защиты информационного периметра, при которой серверы, отвечающие на запросы из внешней сети, находятся в особом сегменте сети (который и называется ДМЗ) и ограничены в доступе к основным сегментам сети с помощью межсетевого экрана (файрвола), с целью минимизировать ущерб, при взломе одного из общедоступных сервисов находящихся в ДМЗ.

Прошиваем роутер.


Для выбранной мною модели необходима прошивка backfire.brcm47xx
1.Выполним аппаратный сброс, так называемый 30/30/30.
При включенном питании роутера нажимаем кнопку reset, держим 30 секунд, не отпуская кнопку отключаем питание и держим еще 30 секунд, не отпуская кнопки включаем питание и вновь удерживаем кнопку reset 30 секунд.
Хинт: по умолчанию ip роутера 192.168.1.1. Если «пингануть» его до аппаратного сброса 30/30/30 то ttl будет равен 64, после сброса ttl становится равным 100.
Теперь отправляем прошивку на роутер при помощи следующей команды
atftp --trace --option "timeout 1" --option "mode octet" --put --local-file openwrt-brcm47xx-squashfs.trx 192.168.1.1
По завершении мельтешения сообщений ждем 5 минут и выключаем/включаем роутер по питанию.
Следующим шагом будет установка пароля root и отключение ненужных сервисов, для этого идем на web интерфейс роутера
192.168.1.1
Я отключил luci_dhcp_migrate и dnsmasq (DHCP и DNS у меня в сети есть))



На этом с web интерфейсом закончим, дальнейшая настройка будет протекать уже из консоли.


В Asus WL 520GU наличествует 5 портов, WAN порт и 4 LAN порта. WAN будет смотреть на провайдера, LAN1-3 в локальную сеть, а LAN4 я выделю в отдельный VLAN и направлю в DMZ.

Подключаемся к маршрутизатору

#ssh root@192.168.0.30
root@192.168.0.30's password:

BusyBox v1.15.3 (2010-11-12 00:01:06 PST) built-in shell (ash)
Enter 'help' for a list of built-in commands.

_______ ________ __
| |.-----.-----.-----.| | | |.----.| |_
| - || _ | -__| || | | || _|| _|
|_______|| __|_____|__|__||________||__| |____|
|__| W I R E L E S S F R E E D O M
Backfire (10.03.1-rc4, r24045) --------------------
* 1/3 shot Kahlua In a shot glass, layer Kahlua
* 1/3 shot Bailey's on the bottom, then Bailey's,
* 1/3 shot Vodka then Vodka.
---------------------------------------------------
root@OpenWrt:~#


Нам необходимо изменить несколько конфигурационных файлов.

1. /etc/config/network, в этом файле задаются настройки интерфейсов.
root@OpenWrt:~# cat /etc/config/network
#### VLAN configuration
config switch eth0
option enable 1

config switch_vlan eth0_0
option device "eth0"
option vlan 0
option ports "1 2 3 5*" #default vlan, это порты LAN1-3, смотрят в локалку
#если кому-то интересно что означает 5*, обратитесь к доке на сайте,
#так как адекватно перевести я не смог
#http://wiki.openwrt.org/doc/uci/network/switch


config switch_vlan eth0_1
option device "eth0"
option vlan 1
option ports "0 5" #Это WAN порт

config switch_vlan eth0_2
option device "eth0"
option vlan 2
option ports "4 5" #добавленный нами vlan2, DMZ

#### Loopback configuration
config interface loopback
option ifname "lo"
option proto static
option ipaddr 127.0.0.1
option netmask 255.0.0.0

#### LAN configuration
config interface lan
option type bridge
option ifname "eth0.0"
option proto static
option ipaddr 192.168.0.30
option netmask 255.255.255.0

#### DMZ configuration
config interface dmz
option ifname "eth0.2"
option proto static
option ipaddr 192.168.100.1
option netmask 255.255.255.0

#### WAN configuration
config interface wan
option ifname "eth0.1"
option proto static
option ipaddr 1.2.3.4
option netmask 255.255.255.0
option gateway 1.2.3.1


2. Закомментируем все строки в /etc/config/firewall кроме
config include
option path /etc/firewall.user

3. Конфигурируем Iptables, для этого в файл /etc/firewall.user внесем
#!/bin/sh

ext_if="eth0.1"
ext_ip="1.2.3.4"

int_if="br-lan"
int_ip="192.168.0.30"
LAN="192.168.0.0/24"

dmz_if="eth0.2"
dmz_ip="192.168.100.1"
dmz_server="192.168.100.2"

lo_if="lo"
lo_ip="127.0.0.1"

IPTABLES="/usr/sbin/iptables"

$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP

$IPTABLES -N bad_tcp_packets
$IPTABLES -N icmp_packets

#chain icmp_packets (разрешены только echo reply[request)
$IPTABLES -A icmp_packets -p icmp -s 0/0 --icmp-type 8 -j ACCEPT
$IPTABLES -A icmp_packets -p icmp -s 0/0 --icmp-type 0 -j ACCEPT

#chain bad_tcp_packets (любому кто читал мануал по iptables известно что выполняется в этих #строках)
$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK -m state --state NEW -j REJECT --reject-with tcp-reset
$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

#chain PREROUTING (меняем destination address в пакетах пришедших на внешний IP)
$IPTABLES -t nat -A PREROUTING -p tcp -d $ext_ip -m multiport --dport 8001,31187,20113,20118 -j \
DNAT --to-destination $dmz_server
$IPTABLES -t nat -A PREROUTING -p tcp -d $ext_ip -m multiport --dport 80 -j DNAT \
--to-destination $dmz_server:8001
$IPTABLES -t nat -A PREROUTING -p udp -d $ext_ip -m multiport --dport 20113,20118 -j \
DNAT --to-destination $dmz_server
$IPTABLES -t nat -A PREROUTING -p icmp -d $ext_ip -j DNAT --to-destination $dmz_server

#FORWARD
$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets
$IPTABLES -A FORWARD -p tcp -i $ext_if -o $dmz_if -s 0/0 -d $dmz_server -m multiport --dport 80,8001,31187,20113,20118 -j \ ACCEPT
$IPTABLES -A FORWARD -p udp -i $ext_if -o $dmz_if -s 0/0 -d $dmz_server -m multiport --dport 20113,20118 -j ACCEPT
$IPTABLES -A FORWARD -p tcp -i $int_if -o $dmz_if -s $LAN -d $dmz_server -m multiport --dport 31187,3389 -j ACCEPT
$IPTABLES -A FORWARD -p icmp -i $int_if -o $dmz_if -s $LAN -d $dmz_server -j icmp_packets
$IPTABLES -A FORWARD -p icmp -i $ext_if -o $dmz_if -s 0/0 -d $dmz_server -j icmp_packets
$IPTABLES -A FORWARD -p ALL -i $dmz_if -o $int_if -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -p ALL -i $dmz_if -o $ext_if -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A FORWARD -p icmp -i $dmz_if -o $ext_if -j icmp_packets

#INPUT
$IPTABLES -A INPUT -p tcp -j bad_tcp_packets
$IPTABLES -A INPUT -p icmp -j icmp_packets
$IPTABLES -A INPUT -p tcp -i $int_if -s $LAN -m multiport --dport 22,80 -j ACCEPT
$IPTABLES -A INPUT -p ALL -i $dmz_if -s $dmz_server -j ACCEPT

#OUTPUT
$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets
$IPTABLES -A OUTPUT -p icmp -o $ext_if -d 0/0 -j icmp_packets
$IPTABLES -A OUTPUT -p ALL -s $lo_ip -j ACCEPT
$IPTABLES -A OUTPUT -p ALL -s $int_ip -d $LAN -j ACCEPT
$IPTABLES -A OUTPUT -p icmp -o $dmz_if -d $dmz_server -j icmp_packets

#POSTROUTING
$IPTABLES -t nat -A POSTROUTING -o $ext_if -j SNAT --to-source $ext_ip

Перезагружаем роутер и проверяем работоспособность настройки.
root@OpenWrt:~# reboot

За сим закончу, поставленные задачи выполнены, трафик бегает так как мне нужно.
В заключении стоит отметить, что данное решение весьма бюджетно и вряд ли может рассматриваться при больших объемах трафика.
При тестировании iperf'ом были получены следующие результаты:
сервер iperf запущен в dmz, клиент в локалке = ~ 36Mb/s
сервер iperf запущен в dmz, клиент в Internet = ~ 26Mb/s
Для меня этого вполне достаточно, провайдер дает нам 4Mb/s, а из локальной сети в DMZ трафик весьма не велик.

Спасибо за внимание =)
Tags:
Hubs:
+21
Comments 54
Comments Comments 54

Articles