iptables之nat转发和构建简单的DMZ防火墙
一.NAT
iptables 中的nat表:
nat:Network Address Translation:NAT不仅完美地解决了IP地址不足的问题,而且还能够有效地避免来自网络外部的攻击,隐藏并保护网络内部的计算机.
nat有三种实现方式:SNAT,DNAT和端口多路复用OverLoad
在了解Nat工作原理之前先了解一下私网IP和公网IP。私网IP地址是指局域网内部网络或主机的IP地址,公网地址是指在因特尔网上全球唯一的IP地址。
私有网络有三个IP 地址块:
A类:10.0.0.0 ~ 10.255.255.255
B类:172.16.0.0 ~ 172.31.255.255
C类:192.168.0.0 ~ 192.168.255.255
私有网络不会在网络中分配,可以在公司,校园,企业内部自由使用。NAT最初的设计就是用于实现让私有网络地址访问公网的能力,后扩展到实现任意两个网络间进行通信时的地址转换应用。
nat 基本工作原理:
1.SNAT的实现原理
如图:
(1).内网主机172.16.99.1向外网服务器1.2.3.4发送请求,通过NAT设备(可以是一个Linux主机,通过iptables来实现NAT。)。
(2).当内网主机请求互联网上的一台服务器时,经过NAT设备,NAT经过查看请求报文的头部信息发现不是本地的,而是发往外网的,就会在路由之后将源IP地址字段的私有地址172.16.99.1转换成一个可在Internet选路的公网地址12.1.1.1 。将该报文发往外网服务器,同时NAT设备的网络地址转换表中记录这一映射。
(3)外网服务器给内网主机发送应答报文,开始时报文的目的地址为12.1.1.1源地址为1.2.3.4。到达NAT设备之后,NAT设备查看报文的头部信息,根据当前的网络地址转换表中的记录,用原来请求的内网私有地址172.16.99.1代替初始的目的地址12.1.1.1。
上述过程对外网服务器来说,本地主机时隐藏的,从而有一定的安全性。这一过程是SNAT的实现过程,他是现在iptables的NAT表中的POSTROUTING链中。因为要经过本地路由之后,查看不是本地的请求才进行NAT转发的。
2.DNAT原理:
如图:
(1)外网主机访问内网一服务器,经过NAT设备。
(2)当外网主机(1.2.3.4)访问内网服务器时,访问的肯定是能够外网识别的一个或多个公网IP(12.1.1.1)。
(3)当外网用户访问内部网络服务器的数据报经过NAT设备时,NAT设备根据报文的目的地址,将访问内部服务器的请求报文的目的地址和端口转换为内部服务器的私有IP地址和端口号(这些操作是在内部路由之前,不然NAT会认为请求自己的,转到自己用户空间,所以DNAT使用在PREROUTING链上)。将请求发送到内部服务器。
(4)当内部服务器回应该报文时,NAT设备再根据已有的地址映射关系将回应报文的源IP地址和端口号转换成公网IP地址和端口号。
二.构建简单的DMZ
使用iptables构建DMZ防火墙:一般而言一个公司或企业的内部网络可以划分为两个部分,一个是内部服务器所在区域DMZ,向外部提供服务,另一部分是公司内部通讯使用的网络。而公司内部向外提供服务的网络容易受到攻击。这是一个危险的子网环境,要做到保护这个子网环境又要做到向外提供服务。往往这连个区域要独立分开,即使DMZ区受到攻击,通讯子网仍然要在防火墙的保护之下。
实验环境(如图):
简单介绍,通过防火墙连接的有连接外网的eth0(IP:172.16.99.1 充当公网地址,以便实验使用) ,连接的内网主机的通信区eth1(IP:192.168.1.1),连接内网服务区DMZ eth2(IP:10.20.99.1)。
一般有以下情况
1. 能使内网主机访问外网,能访问DMZ区中的服务器;
2. 使外网不能访问内网主机,能访问DNZ区中的服务器;
3. 禁止DMZ访问内网。
实验步骤:
1.在Linux防火墙上的一些配置:
添加三块网卡设备:
路由:
2.在内网通讯区网络的设置:把该区域的网络的网关都指向192.168.2.1,DNS服务器是172.16.99.1。
在实验中我们使用一台Linux虚拟机充当内网中一台主机,其IP为192.168.2.2,网关为:192.168.2.1,子网掩码为:255.255.255.0,DNS为172.16.99.1
3.在内网服务区DMZ网络的设置,把该区域的网络的网关都指向10.20.99.1,DNS服务器是172.16.99.1
在实验室使用一台Linux虚拟机充当WEB服务器,IP为10.20.99.2 网关为10.20.99.1,子网掩码为:255.255.0.0
又有一台ftp服务器,IP:10.20.99.3,子网掩码为:255.255.0.0,网关为:10.20.99.1
编写防火墙规则脚本实现相应的功能:
#!/bin/bash #####This is Simple DMZ iptables ##### ## ##### Empty firewall ##### iptables -F iptables -t nat -F iptables -X ##### Modify the default policy ##### iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP ##### Add module and open routing forwarding #### modprobe nf_conntrack_ftp echo "1" > /proc/sys/net/ipv4/ip_forward iptables -I INPUT -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT iptables -I OUTPUT -s 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT ####防火墙上有一DNS服务器### iptables -A INPUT -d 172.16.99.1 -p udp --dport 53 -j ACCEPT iptables -A OUTPUT -s 172.16.99.1 -p udp --sport 53 -j ACCEPT iptables -A OUTPUT -s 172.16.99.1 -p udp --dport 53 -j ACCEPT iptables -A INPUT -d 172.16.99.1 -p udp --sport 53 -j ACCEPT ##### 允许内网主机访问外网,但不允许外网访问内网主机 #### iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j SNAT --to-source 172.16.99.1 iptables -t filter -A FORWARD -s 192.168.2.0/24 -i eth1 -o eth0 -j ACCEPT iptables -t filter -A FORWARD -d 192.168.2.0/24 -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT ##### 允许内网主机访问内网DMZ区域的服务器,可以通过公网IP访问也可以通过内部私网访问,DMZ区域的服务器不允许访问内网主机 #### iptables -t filter -A FORWARD -s 192.168.2.0/24 -i eth1 -o eth2 -j ACCEPT iptables -t filter -A FORWARD -d 192.168.2.0/24 -i eth2 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -t nat -A PREROUTING -d 172.16.99.1 -i eth1 -p tcp --dport 80 -j DNAT --to-destination 10.20.99.2 iptables -t nat -A PREROUTING -d 172.16.99.1 -i eth1 -p tcp --dport 21 -m state --state NEW,ESTABLISHED,RELATED -j DNAT --to-destination 10.20.99.3 ####允许外网通过公网IP访问DMZ区域中Web服务和FTP服务##### iptables -t nat -A PREROUTING -d 172.16.99.1 -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.20.99.2 iptables -t nat -A PREROUTING -d 172.16.99.1 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j DNAT --to-destination 10.20.99.3 注意先后顺序!! iptables -t filter -I FORWARD -d 10.20.99.3 -i eth0 -o eth2 -j ACCEPT iptables -t filter -I FORWARD -s 10.20.99.3 -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -t filter -I FORWARD -d 10.20.99.2 -p tcp --dport 80 -i eth0 -o eth2 -j ACCEPT iptables -t filter -I FORWARD -s 10.20.99.2 -p tcp --sport 80 -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT ####也可以通过修改ftp配置文件,添加一下几项来以被动模式下开启ftp服务器:##### #pasv_enable=YES #pasv_min_port=6666 #pasv_max_port=7777 #iptables -t nat -I PREROUTING -d 172.16.99.1 -i eth0 -p tcp --dport 21 -j DNAT --to-destination 10.20.99.3 # iptables -t nat -I PREROUTING -d 172.16.99.1 -i eth0 -p tcp --dport 6666:7777 -j DNAT --to-destination 10.20.99.3 # iptables -t filter -I FORWARD -d 10.20.99.3 -p tcp -m multiport --dports 21,6666:7777 -i eth0 -o eth2 -j ACCEPT # iptables -t filter -I FORWARD -s 10.20.99.3 -p tcp -m multiport --sports 21,6666:7777 -i eth2 -o eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
测试结果:
1.内网一主机(IP:192.168.2.2)访问内网服务器:(分别通过公网IP和私网IP访问):
2.内网一主机(IP:192.168.2.2)访问外网:
2.外网访问内网Web服务器和ftp服务器,不能访问内网一主机(ip:192.168.2.2)
2.我们在内网主机(192.168.2.2)上开启vsftp服务器,查看外网能否访问(肯定不能):
此环境的另外一只实现方法:
另一种防火墙规则的编写:就是将FORWARD链的默认策略改为ACCEPT,详细策略如下:
#!/bin/bash
#####This is Simple DMZ iptables #######
##### Empty firewall #####
iptables -F
iptables -t nat -F
iptables -X
##### Modify the default policy #####
iptables -P INPUT DROP
iptables -P FORWARD ACCEPT
iptables -P OUTPUT DROP
##### Add module and open routing forwarding ####
modprobe nf_conntrack_ftp
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -I INPUT -d 172.16.0.0/16 -p tcp --dport 22 -j ACCEPT
iptables -I OUTPUT -s 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
####开放53端口#####
iptables -A INPUT -d 172.16.99.1 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -s 172.16.99.1 -p udp --sport 53 -j ACCEPT
iptables -A OUTPUT -s 172.16.99.1 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -d 172.16.99.1 -p udp --sport 53 -j ACCEPT
##### 允许内网主机访问外网,但不允许外网访问内网主机 ####
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j SNAT --to-source 172.16.99.1
####禁止外网访问内网的主机#######
iptables -A FORWARD -i eth0 -o eth1 -m state --state NEW -j DROP
##### 允许内网主机访问内网DMZ区域的服务器,可以通过公网IP访问也可以通过内部私网访问,DMZ区域的服务器不允许访问内网主机 ####
iptables -t nat -A PREROUTING -d 172.16.99.1 -i eth1 -p tcp --dport 80 -j DNAT --to-destination 10.20.99.2
iptables -t nat -A PREROUTING -d 172.16.99.1 -i eth1 -p tcp --dport 21 -m state --state NEW,ESTABLISHED,RELATED -j DNAT --to-destination 10.20.99.3
####禁止内网服务器访问内网主机####
iptables -A FORWARD -i eth2 -o eth1 -m state --state NEW -j DROP
####允许外网通过公网IP访问DMZ区域中Web服务和FTP服务#####
iptables -t nat -I PREROUTING -d 172.16.99.1 -i eth0 -m state --state NEW,ESTABLISHED,RELATED -j DNAT --to-destination 10.20.99.3
iptables -t nat -I PREROUTING -d 172.16.99.1 -i eth0 -p tcp --dport 80 -j DNAT --to-destination 10.20.99.2
####禁止服务器访问外网,禁止内部服务器向外发送请求####
iptables -A FORWARD -i eth2 -o eth0 -m state --state NEW -j DROP