iptablesnat转发和构建简单的DMZ防火墙

一.NAT

iptables 中的nat表:

nat:Network Address Translation:NAT不仅完美地解决了IP地址不足的问题,而且还能够有效地避免来自网络外部的***,隐藏并保护网络内部的计算机.

nat有三种实现方式:SNATDNAT和端口多路复用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的实现原理

如图:

wKiom1YU3gjQYrt8AADWdcp-OQU366.jpg

(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的实现过程,他是现在iptablesNAT表中的POSTROUTING链中。因为要经过本地路由之后,查看不是本地的请求才进行NAT转发的。

2.DNAT原理:

如图:

wKiom1YU3t2Q9oSBAADVlhL8qGU395.jpg

(1)外网主机访问内网一服务器,经过NAT设备。

(2)当外网主机(1.2.3.4)访问内网服务器时,访问的肯定是能够外网识别的一个或多个公网IP12.1.1.1)。

(3)当外网用户访问内部网络服务器的数据报经过NAT设备时,NAT设备根据报文的目的地址,将访问内部服务器的请求报文的目的地址和端口转换为内部服务器的私有IP地址和端口号(这些操作是在内部路由之前,不然NAT会认为请求自己的,转到自己用户空间,所以DNAT使用在PREROUTING链上)。将请求发送到内部服务器。

(4)当内部服务器回应该报文时,NAT设备再根据已有的地址映射关系将回应报文的源IP地址和端口号转换成公网IP地址和端口号。


二.构建简单的DMZ

使用iptables构建DMZ防火墙:一般而言一个公司或企业的内部网络可以划分为两个部分,一个是内部服务器所在区域DMZ,向外部提供服务,另一部分是公司内部通讯使用的网络。而公司内部向外提供服务的网络容易受到***。这是一个危险的子网环境,要做到保护这个子网环境又要做到向外提供服务。往往这连个区域要独立分开,即使DMZ区受到***,通讯子网仍然要在防火墙的保护之下。

实验环境(如图)

wKioL1YU34KjoN-EAAEZAxYMTfM346.jpg

简单介绍,通过防火墙连接的有连接外网的eth0(IP172.16.99.1 充当公网地址,以便实验使用,连接的内网主机的通信区eth1IP192.168.1.1),连接内网服务区DMZ eth2(IP10.20.99.1)

一般有以下情况

1. 能使内网主机访问外网能访问DMZ区中的服务器

2. 使外网不能访问内网主机能访问DNZ区中的服务器

3. 禁止DMZ访问内网

实验步骤:

1.Linux防火墙上的一些配置:

添加三块网卡设备:

wKiom1YU386CbzirAADrHXmz-rg592.jpg

路由:

wKiom1YU4CbBMo2LAAC0ybRjuss917.jpg

2.在内网通讯区网络的设置:把该区域的网络的网关都指向192.168.2.1DNS服务器是172.16.99.1

在实验中我们使用一台Linux虚拟机充当内网中一台主机,其IP192.168.2.2,网关为:192.168.2.1,子网掩码为:255.255.255.0DNS172.16.99.1

wKioL1YU4MODbPfAAABdFDHsE1E477.jpg

3.在内网服务区DMZ网络的设置,把该区域的网络的网关都指向10.20.99.1DNS服务器是172.16.99.1

在实验室使用一台Linux虚拟机充当WEB服务器,IP10.20.99.2 网关为10.20.99.1,子网掩码为:255.255.0.0

wKioL1YU4PCST1TdAABc-9tJTyU340.jpg

又有一台ftp服务器,IP10.20.99.3,子网掩码为:255.255.0.0,网关为:10.20.99.1

wKiom1YU4PvSpaw9AABxKVQB5GQ701.jpg 


编写防火墙规则脚本实现相应的功能:

#!/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.内网一主机(IP192.168.2.2)访问内网服务器:(分别通过公网IP和私网IP访问):

wKiom1YU4nuhzZgFAADWc_wMiTU171.jpg

2.内网一主机(IP192.168.2.2)访问外网:

wKiom1YU4uTg5J0CAAHh5XGBzWY269.jpg

2.外网访问内网Web服务器和ftp服务器,不能访问内网一主机(ip:192.168.2.2

wKioL1YU4yKiE_2cAAEH1X5gaJU025.jpg

wKiom1YU4wzBDZ8sAACUru0PFSQ998.jpg

2.我们在内网主机(192.168.2.2)上开启vsftp服务器,查看外网能否访问(肯定不能):

wKioL1YU41TyDJrWAACdenIH-Ls281.jpg

wKiom1YU4z6wR1M0AACTb-MfJLU769.jpg



此环境的另外一只实现方法

另一种防火墙规则的编写:就是将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