防火墙之地址转换SNAT DNAT

Posted klb561

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了防火墙之地址转换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

 规划主机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:

[[email protected] ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 172.20.1.10

 #上面和我们实例操作相同

 [[email protected] ~]# echo 1 > /proc/sys/net/ipv4/ip_forward

 主机B ping外部的其它主机(172.20.1.20模拟互联网上的主机)

 

 DNAT

技术分享图片

 [[email protected] ~]# iptables -t filter -F 

[[email protected] ~]# iptables -t nat -F

[[email protected] ~]# 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

 [[email protected] ~]# netstat -tln | grep "<80>"  此时本机上并没有开放80端口

 [[email protected] ~]# 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 配置,指定那个网段可以上网

 


LVS的nat模式和fullnat模式的区别

nat模式

1   当client主机(cip)访问web服务器(rip)时,因为rip是内网ip,此时的目标ip是负载均衡器的前端ip(vip),当负载均衡器收到cip发来的报文后会根据里面的iptables规则里的地址,将报文里的目标地址改为web服务器的rip并将报文根据规则里的算法发送出去

2   client主机将报文发送到rip后,由于报文的目标地址是自己(cip),所以会响应请求,将响应报文返回给lvs,然后lvs将此报文的sip(rip)修改为vip并发送给client主机的客户端。

fullnat模式

1   client主机(cip)将请求发往前端的负载均衡器(vip),请求报文源地址是CIP,目标地址为VIP。负载均衡器收到报文后,发现请求的是在规则里面存在的地址,那么它将客户端请求报文的源MAC地址改为自己DIP的MAC地址,目标MAC改为了RIP的MAC地址,并将此包发送给RS。

2   RS发现请求报文中的目的MAC是自己,就会将次报文接收下来,处理完请求报文后,将响应报文通过lo接口送给eth0网卡直接发送给client主机(cip)。

NAT模式下报文变化技术分享图片

发送接收

cip ---> vip

cip ---> rip(DNAT)

rip ---> cip

vip ---> cip(SNAT)

 

 

 

 

fullnat模式下报文变化技术分享图片

发送接收

cip ---> vip

lip ---> rip(SNAT + DNAT)

撕裂--->唇

vip ---> cip(SNAT + DNAT)

注释:

  1. CIP为客户端的地址
  2. VIP为虚拟地址
  3. 撕裂为真实的服务器
  4. 唇为本地地址
  5. SNAT为来源地址转换
  6. DNAT为目的地址转换

LVS-NAT模型实现负载均衡              https://blog.csdn.net/xuxingzhuang/article/details/51650071























































































































以上是关于防火墙之地址转换SNAT DNAT的主要内容,如果未能解决你的问题,请参考以下文章

Linux防火墙iptables之SNAT与DNAT

防火墙之SNAT和DNAT

网关服务器iptables的SNAT与DNAT地址转换

SNAT与DNAT原理,实现内外网相互访问

Linux系统SNAT与DNAT策略应用

iptables中实现内外网相互访问 SNAT与DNAT的原理与应用