作者:北京懷柔3380信箱92號 厲海燕
一般被保護的內部網絡可分成兩部分,一部分是內部通訊區,只允許內部用戶訪問,絕對禁止外部用戶訪問,另一部分是停火區DMZ,對外提供有條件的服務。前者是系統的核心子網,後者易受到外部的攻擊,是一個比較危險的子網環境。一方面要求嚴格保護內部子網,另一方面又要滿足DMZ對外提供服務的需要,因此,必須采用分別保護的策略,對上述兩個區域進行保護。兩個區域要盡量獨立,即使DMZ受到外部攻擊,內部子網仍處於防火牆的保護之下。
本文介紹利用Linux的iptables工具來建立一個具有DMZ的防火牆。
一、軟硬件要求
充當防火牆的機器是一台支持iptables的Linux系統,裝有三個網卡。
二、具體配置
步驟1:配置內核
netfilter要求Linux內核版本不低於2.3.5,在編譯新內核時,要求選擇和netfilter相關的項目,這些項目通常都是位於“Networking options”子項下。
步驟2:環境構造
這裡給出一個用於測試的例子,實際應用可根據具體的情況進行設置。
對外提供服務的內部主機構成一個停火區(假設分配的網段為192.168.1.0/24),防火牆的兩個網卡eth1、eth2分別通過hub1、hub2與停火區、內部通訊區相連,另一個網卡eth0通過直連線(或hub)與路由器的網卡eth1相連,路由器的另一網卡eth0通過一個hub與外部通訊區相連。如圖所示。
路由器增加以下設置:
route add -net 192.168.1.0 netmask 255.255.255.0 gw 192.9.200.2
arp -i eth1 -Ds 192.168.1.1 eth1 pub
防火牆的設置為:
route add default gw 192.168.1.1
route add -host 192.168.1.1 gw 192.168.1.2
route add -net 192.169.1.0 netmask 255.255.255.0 gw 192.168.1.3 eth1
停火區主機的網關設為防火牆的網卡eth1地址192.168.1.3。
外部主機的網關設為路由器的外網卡eth0地址10.0.0.1。
內部主機的網關設為路由器的內網卡eth2地址168.1.1.1。
步驟3:建立規則
在防火牆上創建如下腳本並運行之。
#!/bin/sh
######## default firewall rules-deny all ########
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
###############################################
# Rules between EXTERNAL LAN and INTERNAL LAN #
###############################################
######## masquerade INTERNAL Address to xx.xx.xx.xx when going out ########
iptables -t nat -A POSTROUTING -s 168.1.1.0/24 -d 10.0.0.0/24 -o eth0 -j SNAT --to xx.xx.xx.xx
######## deny all from EXTERNAL LAN to INTERNAL LAN directly ########
iptables -t nat -A PREROUTING -s 10.0.0.0/24 -d 168.1.1.0/24 -i eth0 -j DROP
######################################
# Rules between DMZ and INTERNAL LAN #
######################################
######## allow INTERNAL LAN to DMZ ########
iptables -A FORWARD -p icmp -s 168.1.1.0/24 -d 192.168.1.0/24 -m limit --limit 1/s --limit-burst 10 -j ACCEPT
iptables -A FORWARD -s 168.1.1.0/24 -d 192.168.1.0/24 -i eth2 -j ACCEPT
######## forbid DMZ to INTERNAL LAN except following instance ########
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 168.1.1.0/24 ! --syn -i eth1 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.1.0/24 --sport 20 -d 168.1.1.0/24 -i eth1 -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type 0 -s 192.168.1.0/24 -d 168.1.1.0/24 -m limit --limit 1/s --limit-burst 10 -j ACCEPT
iptables -A FORWARD -p udp -s 192.168.1.0/24 -d 168.1.1.0/24 --sport 53 -j ACCEPT
######################################
# Rules between EXTERNAL LAN and DMZ #
######################################
### allow EXTERNAL LAN to DMZ but deny all from EXTERNAL LAN to DMZ directly ###
iptables -t nat -A PREROUTING -s 10.0.0.0/24 -d 192.168.1.0/24 -i eth0 -j DROP
### REAL_XX is real address of XX server in DMZ ###
### MASQ_XX is the masquaded address of REAL_XX supplied to EXTERNAL LAN ###
######## allow DNS service ########
iptables -t nat -A PREROUTING -p udp -d MASQ_DNS -s 10.0.0.0/24 --dport 53 -i eth0 -j DNAT --to REAL_DNS
iptables -A FORWARD -p udp -s 10.0.0.0/24 -d REAL_DNS -i eth0 --dport 53 -j ACCEPT
iptables -A FORWARD -p udp -d 10.0.0.0/24 -s REAL_DNS -i eth1--sport 53 -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -d MASQ_DNS -s 10.0.0.0/24 --dport 53 -i eth0 -j DNAT --to REAL_DNS
iptables -A FORWARD -p tcp -s 10.0.0.0/24 -d REAL_DNS -i eth0 --dport 53 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.0.0.0/24 -s REAL_DNS -i eth1 --sport 53 ! --syn -j ACCEPT
######## allow HTTP service ########
iptables -t nat -A PREROUTING -p tcp --dport 80 -d MASQ_HTTP -s 10.0.0.0/24 -i eth0 -j DNAT --to REAL_HTTP
iptables -A FORWARD -p tcp -s 10.0.0.0/24 -d REAL_HTTP -i eth0 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.0.0.0/24 -s REAL_HTTP -i eth1 --sport 80 ! --syn -j ACCEPT
######## allow FTP service ########
iptables -t nat -A PREROUTING -p tcp --dport 21 -d MASQ_FTP -s 10.0.0.0/24 -i eth0 -j DNAT --to REAL_FTP
iptables -A FORWARD -p tcp -s 10.0.0.0/24 -d REAL_FTP -i eth0 --dport 21 -j ACCEPT
iptables -A FORWARD -p tcp -s REAL_FTP -d 10.0.0.0/24 -i eth1--sport 20 -j ACCEPT
iptables -A FORWARD -p tcp -d 10.0.0.0/24 -s REAL_FTP -i eth1--sport 21 ! --syn -j ACCEPT
......
### You can add other services in DMZ here sUCh as TELNET、SMTP、 POP3 & IMAP etc. ###
......
######## deny DMZ to EXTERNAL LAN except to external smtp server ########
iptables -t nat -A POSTROUTING -p tcp --dport 25 -d 10.0.0.0/24 -s REAL_SMTP -o eth0 -j SNAT --to MASQ_SMTP
iptables -A FORWARD -p tcp -s REAL_SMTP -d 10.0.0.0/24 -i eth1 --dport 25 -j ACCEPT
iptables -A FORWARD -p tcp -d REAL_SMTP -s 10.0.0.0/24 -i eth0--sport 25 ! --syn -j ACCEPT
通過以上步驟,具有DMZ的防火牆達到了以下目標:
1.內部通訊區可以無限制的訪問外部通訊區以及DMZ,但訪問外部通信區時防火牆進行了源地址轉換。
2.外部通訊區可以通過對外公開的地址訪問DMZ的服務器,由防火牆完成對外地址到服務器實際地址的轉換。
3.外部通訊區不能訪問內部通訊區以及防火牆。
4.DMZ不可以訪問內部通訊區。
5.除外部通訊區郵件服務器外,DMZ不能訪問外部通訊區。