防守在网络安全中的重要性不必多说。保护网络最常见的方法就是使用防火墙。防火墙作为网络的第一道防线,通常放置在外网和需要保护的网络之间。最简单的情况是直接将防火墙放置在外网和企业网络之间,所有流入企业网络的数据流量都将通过防火墙,使企业的所有客户机及服务器都处于防火墙的保护下。这对于一些中小企业来说是简单易行的,而且这种解决方法在某些情况下也表现不错。然而这种结构毕竟比较简单。企业中有许多服务器、客户机等资源需要保护,不同的资源对安全强度的要求也不同。不能用对待客户机的安全级别来对待服务器,这样服务器将会很危险;同样,也不能用对待服务器的安全级别来对待客户机,这样用户会感觉很不方便。
内网 |
外网 |
DMZ |
|
内网 |
/ |
Y |
Y |
外网 |
N |
/ |
Y |
DMZ |
N |
N |
/ |
内网的用户显然需要自由地访问外网。在这一策略中,防火墙需要进行源地址转换。
此策略是为了方便内网用户使用和管理DMZ中的服务器。
很显然,内网中存放的是公司内部数据,这些数据不允许外网的用户进行访问。
DMZ中的服务器本身就是要给外界提供服务的,所以外网必须可以访问DMZ。同时,外网访问DMZ需要由防火墙完成对外地址到服务器实际地址的转换。
很明显,如果违背此策略,则当入侵者攻陷DMZ时,就可以进一步进攻到内网的重要数据。
此条策略也有例外,比如DMZ中放置邮件服务器时,就需要访问外网,否则将不能正常工作。
# Flush out the tables and delete all user-defined chains
/sbin/iptables -F
/sbin/iptables -X
/sbin/iptables -t nat -F
/sbin/iptables -t nat -X
# Drop every packet
/sbin/iptables -P INPUT DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -P FORWARD DROP
接下来,逐一解释六种策略的实现。
1.内网可以访问外网
对应的防火墙脚本片段如下:
/sbin/iptables -t nat -A POSTROUTING -s [内网地址] -d [外网地址] -o eth0 -j SNAT –to [NAT的真实IP]
当数据从连接外网的eth0流出时,要将来自内网的数据包的源地址改成Internet上的真实IP,这样才能和外网的主机进行通信。“[NAT的真实IP]”表示分配给NAT用户的真实IP,有几个就写几个,以空格分开,但至少要写一个。
2.内网可以访问DMZ
对应的防火墙脚本片段如下:
/sbin/iptables -A FORWARD -s [内网地址] -d [DMZ地址] -i eth2 -j ACCEPT
以上命令允许所有来自内网、目的地为DMZ的数据包通过。
3.外网不能访问内网
对应的防火墙脚本片段如下:
/sbin/iptables -t nat -A PREROUTING -s [外网地址] -d [内网地址] -i eth0 -j DROP
以上命令将来自外网、去往内网的数据包全部丢弃。
4.外网可以访问DMZ
为了保护DMZ中的服务器,外网对DMZ的访问也要加以限制。通常的思路是,只允许外网访问DMZ中服务器所提供的特定服务,比如HTTP。
对应的防火墙脚本片段如下:
/sbin/iptables -t nat -A PREROUTING -p tcp –dport 80 -d[分配给HTTP服务器的Internet上的真实IP] -s [外网地址] -i eth0 -j DNAT –to[HTTP服务器的实际IP]
/sbin/iptables -A FORWARD -p tcp -s [外网地址] -d [HTTP服务器的实际IP] -i eth0 –dport 80 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d [外网地址] -s [HTTP服务器的实际IP] -i eth1 –sport 80 ! –syn -j ACCEPT
/sbin/iptables -t nat -A PREROUTING -s [外网地址] -d [DMZ地址] -i eth0 -j DROP
该防火墙脚本片段将开放HTTP服务,使得只有访问DMZ中HTTP服务的数据包才能通过防火墙。
5.DMZ不能访问内网
对应的防火墙脚本片段如下:
/sbin/iptables -A FORWARD -s [DMZ地址] -d [内网地址] -i eth1 -j DROP
以上命令将丢弃所有从DMZ到内网的数据包。
6.DMZ不能访问外网
对应的防火墙脚本片段如下:
/sbin/iptables -t nat -A POSTROUTING -p tcp –dport 25 -d [外网地址] -s[邮件服务器的IP] -o eth0 -j SNAT –to [分配给SMTP服务器的Internet上的真实IP]
/sbin/iptables -A FORWARD -p tcp -s [邮件服务器的IP] -d [外网地址] -i eth1 –dport 25 -j ACCEPT
/sbin/iptables -A FORWARD -p tcp -d [邮件服务器的IP] -s [外网地址] -i eth0–sport 25 ! –syn -j ACCEPT
以上命令先允许DMZ中邮件服务器连接外网的SMTP服务端口(25),然后禁止其它从DMZ发往外网的数据包。
针对以上基本策略例举了实现它们的基本规则。在实际应用中,需要根据具体情况进行设置。只要设置得当,Linux也能成为很好的防火墙。需要补充的是,无论何种防火墙都只能提供有限的保护。设置好防火墙不等于网络就是安全的,关键在于综合运用各种安全手段。
用iptables构建DMZ防火墙
一般被保护的内部网络可分成两部分,一部分是内部通讯区,只允许内部用户访问,绝对禁止外部用户访问,另一部分是停火区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与外部通讯区相连。如图所示。
2006-03-24 11:11:35
大 中 小 |
arp -i eth1 -Ds 192.168.1.1 eth1 pub
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
外部主机的网关设为路由器的外网卡eth0地址10.0.0.1。
内部主机的网关设为路由器的内网卡eth2地址168.1.1.1。
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
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
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
### MASQ_XX is the masquaded address of REAL_XX supplied to EXTERNAL LAN ###
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
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
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
1.内部通讯区可以无限制的访问外部通讯区以及DMZ,但访问外部通信区时防火墙进行了源地址转换。
2.外部通讯区可以通过对外公开的地址访问DMZ的服务器,由防火墙完成对外地址到服务器实际地址的转换。
3.外部通讯区不能访问内部通讯区以及防火墙。
4.DMZ不可以访问内部通讯区。
5.除外部通讯区邮件服务器外,DMZ不能访问外部通讯区
原文见 http://blogold.chinaunix.net/u/24390/showart_331970.html
端口映射和DMZ区别是:
端口映射只有内外网之分;
而DMZ有三个网段,即使突破了DMZ,仍然需要进一步攻破内网,则更加安全;
然后DMZ有一个完整的定义,正如上面的六条,
从这个上面看,DMZ开放所有的端口,而端口映射只是开放一个端口;以及一对一映射与DMZ的区别是前者出去的IP是映射的IP,而后者是WAN口IP,这些都不是关键的区别。
一对一NAT的对外IP具有双向性:对于外网客户端来说其是目的地址,对于外网服务器来说其是源地址。
端口映射和DMZ映射的对外IP只是作为客户端的目的地址,对于外网服务器其源地址仍为该服务器所在的局域网的路由器WAN口IP地址。
DMZ映射可以理解为开启了映射所有端口的主机。 也就是这些都不是关键的区别。