防火墙之地址转换SNAT DNAT
一、SNAT源地址转换。
1、原理:在路由器后(PSOTROUTING)将内网的ip地址修改为外网网卡的ip地址。
2、应用场景:共享内部主机上网。
3、设置SNAT:网关主机进行设置。
(1)设置ip地址等基本信息。
(2)开启路由功能:
sed -i '/ip-forward/s/0/1/g'
sysctl -p
(3)编写规则:
iptables -t nat -I POSTROUTING -o 外网网卡 -s 内网网段 -j SNAT --to-source 外网ip地址 #适用于外网ip地址固定场景
iptables -t nat -I POSTROUTING -o 外网网卡 -s 内网网段 -j MASQUERADE #适用于共享动态ip地址上网(如adsl拨号,dhcp获取外网ip)
(4)做好安全控制:使用FORWARD时机进行控制,严格设置INPUT规则。
二、DNAT目的地址转换:
1、原理:在路由前(PREROUTING)将来自外网访问网关公网ip及对应端口的目的ip及端口修改为内部服务器的ip及端口,实现发布内部服务器。
2、应用场景:发布内部主机服务。
3、设置DNAT:网关主机上设置。
(1)设置ip、开启路由、设置SNAT
(2)编写防火墙规则:
iptables -t nat -I PREROUTING -i 外网网卡 -d 外网ip tcp --dport 发布的端口 -j DNAT --to-destination 内网服务ip:端口
NAT network address translation
仅从报文请求来看,可以分为:
SNAT 源地址转换
DNAT 目标地址转换
PNAT 端口转换
NAT server:能根据需要实现SNAT DNAT PNAT
并非是用户空间的进程完成转换功能,靠的是内核中的地址转换规则
私有IP客户端访问互联网的方法
SNAT 、PROXY
SNAT:主要用于实现内网客户端访问外部主机时使用(局域网上网用)
定义在POSTROUTING链上
iptables -t nat -A postrouting -s 内部网络地址或主机地址 -j SNAT --to-source NAT服务器上的某外部地址
另外一个target
MASQUERADE地址伪装(适用于PPPOE拨号上网,假设eth1是出口)
iptables -t nat -A postrouting -s 内部网络或主机地址 -o eth1 -j MASQUERADE
DNAT:主要用于内部服务器被外网访问(发布服务)
定义在PREROUTING
iptables -t nat -A PREROUTING -d NAT服务器的某外部地址 -p 某协议 --dport 某端口 -j DNAT --to-destination 内网服务器地址[:port]
注意:NAT服务器需要打开数据转发
echo 1 > /proc/sys/net/ipv4/ip_forward
或者修改/etc/sysctl.conf net.ipv4.ip_forward = 1
实验操作
SNAT、DNAT
实验一:
SNAT
规划主机A 作为SNAT server
eth0 ip地址172.20.1.10(外部地址),eth1 192.168.1.1(内部地址)
主机B当做局域网内主机
eth0 ip地址192.168.1.2 默认路由要指向192.168.1.1
SNAT server:
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.20.1.10
#上面和我们实例操作相同
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
主机B ping外部的其它主机(172.20.1.20模拟互联网上的主机)
DNAT
[root@nat ~]# iptables -t filter -F
[root@nat ~]# iptables -t nat -F
[root@nat ~]# iptables -t nat -A PREROUTING -d 10.1.249.125 -p tcp --dport 80 -j DNAT --to-destination 192.168.2.4
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.1.249.125 tcp dpt:80 to:192.168.2.4
[root@nat ~]# netstat -tln | grep "<80>" 此时本机上并没有开放80端口
[root@wai ~]# curl http://10.1.249.125
hello --> 此时我们访问为 nat 主机上的80端口 由上面可知,此服务器上并没有开放80,而是将请求送往 后端服务器
实体案例
我们有一台机器A可以上外网,配置eth0=192.168.1.1,eth1=222.13.56.192
有6台机器只有内网IP ,分别是192.168.1.102~192.168.1.108,想让这6台机器通过机器A上网
在机器A 防火墙上配置如下即可
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.101 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.102 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.103 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.104 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.105 -j SNAT --to-source 222.13.56.192
/sbin/iptables -t nat -I POSTROUTING -s 192.168.1.108 -j SNAT --to-source 222.13.56.192
在 6台机器上路由显示
route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.1.0 0.0.0.0 255.255.255.0 U 0 0 0 em1
169.254.0.0 0.0.0.0 255.255.0.0 U 1002 0 0 em1
0.0.0.0 192.168.1.1 0.0.0.0 UG 0 0 0 em1
iptables中DNAT转发的配置方法 1.一对一流量完全DNAT 首先说一下网络环境,普通主机一台做防火墙用,网卡两块 eth0 192.168.0.1 内网 eth1 202.202.202.1 外网 内网中一台主机 192.168.0.101 现在要把外网访问202.202.202.1的所有流量映射到192.168.0.101上 命令如下: #将防火墙改为转发模式 echo 1 > /proc/sys/net/ipv4/ip_forward iptables -F iptables -t nat -F iptables -t mangle -F iptables -X iptables -t nat -X iptables -t mangle -X iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101 iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1 2.多对多流量完全DNAT 说是多对多,实际上这里的配置是指定了多个一对一 环境: eth0 192.168.0.1 内网 eth1 202.202.202.1 、202.202.202.2 外网 内网中2台主机 192.168.0.101、192.168.0.102 现在要把外网访问202.202.202.1的所有流量映射到192.168.0.101上,同时把把外网访问202.202.202.2的所有流量映射到192.168.0.102上 这里顺便提一下如何为网卡配置多个IP ifconfig eth1:1 202.202.202.2 netmask 255.255.255.0 up #将防火墙改为转发模式 echo 1 > /proc/sys/net/ipv4/ip_forward iptables -F iptables -t nat -F iptables -t mangle -F iptables -X iptables -t nat -X iptables -t mangle -X iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT iptables -t nat -A PREROUTING -d 202.202.202.1 -j DNAT --to-destination 192.168.0.101 iptables -t nat -A POSTROUTING -d 192.168.0.101 -j SNAT --to 192.168.0.1 iptables -t nat -A PREROUTING -d 202.202.202.2 -j DNAT --to-destination 192.168.0.102 iptables -t nat -A POSTROUTING -d 192.168.0.102 -j SNAT --to 192.168.0.1 3.一对多根据协议DNAT 这个最常用,一般是内网或DMZ区内有多个应用服务器,可以将不同的应用流量映射到不同的服务器上 环境: eth0 192.168.0.1 内网 eth1 202.202.202.1 外网 内网中2台主机 192.168.0.101(Web服务器)、192.168.0.102(邮件服务器) 现在要把外网访问202.202.202.1的Web流量映射到192.168.0.101上,同时把把外网访问202.202.202.1的邮件访问流量映射到192.168.0.102上 命令如下: #将防火墙改为转发模式 echo 1 > /proc/sys/net/ipv4/ip_forward iptables -F iptables -t nat -F iptables -t mangle -F iptables -X iptables -t nat -X iptables -t mangle -X iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT iptables -P FORWARD ACCEPT #Web访问设置 iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.101:80 iptables -t nat -A POSTROUTING -d 192.168.0.101 -p tcp --dport 80 -j SNAT --to 192.168.0.1 #邮件访问设置 iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 25 -j DNAT --to-destination 192.168.0.102:25 iptables -t nat -A POSTROUTING -d 192.168.0.102 -p tcp --dport 25 -j SNAT --to 192.168.0.1 iptables -t nat -A PREROUTING -d 202.202.202.1 -p tcp --dport 110 -j DNAT --to-destination 192.168.0.102:110 iptables -t nat -A POSTROUTING -d 192.168.0.102 -p tcp --dport 110 -j SNAT --to 192.168.0.1
SNAT:源地址转换,代理内部客户端访问外部网络
目标地址不变,重新改写源地址,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机,目前基本都是解决内网用户用同一个公网IP地址上网的情况。
DNAT:目标地址转换,将内部服务器发布至外部网络
和SNAT相反,源地址不变,重新修改目标地址,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机在DNAT的基础上,可以根据请求数据包的端口做PNAT(端口转换,也称为端口映射),可以根据请求数据包不同的端口改写不同的目标地址,从而发送给不同的主机这在用一个公网地址做不同服务时用的比较多,而且相对来说,用NAT的方式可以隐藏后端服务器的真实地址,比较安全。
SNAT的数据流向过程
首先进入PREROUTING,发现不是本网段的地址,而后开始查找路由表(查找路由的过程在PREROUTING和FORWARD之间),于是经过FORWARD链进行转发,在通过POSTROUTING时进行NAT转换。在这个流程中,NAT转换的步骤在POSTROUTING链上实现,之所以不再PREROUTING上做NAT是因为数据包在进来之前,还不知道是本网段地址还是外网地址。
DNAT的数据流向过程
在DNAT中,NAT要在PREROUTING链上做。在数据进入主机后,路由选择过程是在PREROUTING和FORWARD之间的,所以应该先做地址转换之后再进行路由选择,而后经过FORWARD链,最后从POSTROUTING链出去。
PC1地址:172.16.251.185 网关指向:172.16.251.186
route add default gw 172.16.251.186
route
NAT服务器地址:172.16.251.185
PC2地址:
二、SNAT的实现:
1、在我们做NAT之前,首先要把NAT服务器的路由功能打开,不然数据包过不了FORWARD链
sysctl -w net.ipv4.ip_forward=1
######也可以使用文件永久生效,下面值改为1即可
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
######执行如下命令让其生效
sysctl -p
2、在NAT服务器添加iptables规则如:
iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.254.61
#在POSTROUTING链上面,将来自源地址为172.16.0.0/16网段的数据包的源地址都转换为192.168.254.61
查看iptables规则:
iptables -t nat -L -n -v
3、下面我们在PC1上做测试,PC1现在就可以Ping通PC2主机了,如下图:
4、PC1 ping PC2,在PC1主机上抓包来测试:
tcpdump -i eth0 -v | grep 192
三、DNAT的实现:
1、在NAT服务器添加iptables规则如:
iptables -t nat -A PREROUTING -d 192.168.254.61 -j DNAT --to-destination 172.16.251.185
#在PREROUTING链上面,将请求地址NAT服务器 eth1 192.168.1.254的数据包全部转发到PC1 172.16.251.185主机上
查看iptables规则:
iptables -t nat -L -n -v
测试:PC1上面做了WEB服务,我们在PC2上看是否能请求到WEB页面:
请求防火墙eth1地址,192.168.254.61
2、在NAT服务器添加iptables规则如:
iptables -t nat -A PREROUTING -d 192.168.254.61 -p tcp --dport 80 -j DNAT --to-destination 172.16.251.185:8080
#此条规则是将所有请求NAT服务器eth1 192.168.254.61地址的80号端口都转发到172.16.251.185主机上8080端口,当然前提必须在PC1上面监听8080端口
查看iptables规则:
基于动态IP地址来做NAT代理内部客户端来上网
如果IP地址是动态获取的ADSL宽带来做NAT代理上网实现方式
iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o eth1 -j MASQUEREADE
注释:这里最好使用"-o"选项来指定出口,MASQUEREADE会自动调用该接口的地址作为源地址出去。
2. 先说收DNAT
DNAT目标地址转换在PREROUTING链上做;可以将虚拟机的服务映射到宿主机的ip上,达到访问宿主的 ip就等于访问虚拟机的效果;
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.122.2:80
-d 物理机的ip --dport 端口 DNAT 被映射的内网主机ip:端口
应用场景:
这样主要是为了 能让内网的主机能够对外提供服务:数据包的第一站 PREROUTING ,匹配到规则就执行规则进行DNAT转发,经过FORWARD ,到达POSTROUTING出站。没有匹配到就进入INPUT,进行匹配
3.再说SNAT
SNAT源地址转换在POSTROUTING链上做; 可以为局域网提供上网服务
iptables -t nat -A PORTROUTING -o br0 -j MASQUERADE
应用场景:
主机上的NAT 虚拟机需要访问物理网路,虚拟机直接通过先 经过FORWARD,然后通过POSTROUTING 将源地址转换
4. 再说说不需要经过转换的数据包,如图示绿色的部分,直接到达INPUT-->OUTPUT-->POSTROUTING出来了,比如说我要ssh远程这个主机,走的就是这个流向;
A. 如果想让相对的局域网内服务器对外提供web服务,需要做DNAT规则:
iptables -t nat -A PREROUTING -d 公网IP -p tcp –m tcp --dport 公网端口 -j DNAT --to-destination 内网IP:80
我将外网IP 的80,8080 端口都映射到了内网IP的80端口:
经过PREROUTING 链后还需要经过FORWARD 链,需要在FORWARD这开放提供web服务的80 端口:
iptables -A FORWARD -p tcp -m tcp --dport 80 -j ACCEPT
理论上还需要开放一下--sport 80 , 但是如果已经有下面这个规则了,就不需要了:
这个规则是允许已有连接直接通过;但有大量数据包经过时,可以提高速度!
iptables - I FORWARD –p tcp -m state -- state RELADE,RSTABLISHED - j
ACCEPT
看看实际的效果:
B. 当然FORWARD链处,可以对转发进行数据包的过滤,比如我想通过公网服务器的ip,远程ssh连接局域
网内的服务器,就可以使用DNAT进行转换内网主机的22端口,但是为了安全,我想限制可以远程的IP地
址:我只想让我一个人可以 远程,我的ip是192.168.1.154,内网网段是192.168.122.0/24
DNAT:
iptables -t nat -A PREROUTING -d 192.168.1.51 -p tcp -m tcp --dport 8081 --to-destination 192.168.122.2:22
FORWARD:
iptables -A FORWARD -s 192.168.1.154 -d 192.168.122.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
我的ip地址
在192.168.1.154上 ssh远程一下看看
再到其他的主机上ssh试试看,这个主机ip是192.168.1.20
看的出来FORWARD 上的那个规则生效了。
C. 当内网的主机或本地的虚拟机需要通过本机上网时,需要做SNAT规则:我的环境是虚拟机要通过宿主
机上网,虚拟机以宿主机为网关,虚拟机的网段是192.168.122.0/24,宿主机的网段是
192.168.1.0/24,相对来说宿主机网段就是外网,虚拟机就是内网。
-j MASQUERADE 是当外网ip不固定时,这个配置 I 可以自动获取外网ip。
iptables -t nat -A POSTROUTING -o br0 -s 内网段/24 -j MASQUERADE
-s配置不是必须的,在真实局域网环境中,也许会有多个局域网段,这时就可以通过-s 配置,指定那个网段可以上网