SNAT与DNAT

来源:互联网 发布:优化发展环境讲话 编辑:程序博客网 时间:2024/06/06 05:29

    在linux操作系统中,Netfilter组件是集成在linux内核中扩展各种网络服务的结构化底层框架,在内核级提供防火墙功能。内核中选取五个位置放了五个hook(勾子) function(INPUTOUTPUTFORWARDPREROUTINGPOSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则

     报文流向:

     流入本机:PREROUTING --> INPUT-->用户空间进程

     流出本机:用户空间进程-->OUTPUT--> POSTROUTING

          转发:PREROUTING --> FORWARD --> POSTROUTING

        内核中数据包的传输过程:

   (1)当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去

   (2)如果数据包就是进入本机的,数据包就会到达INPUT链。经INPUT链检查后,数据包被发往本地进程。本地进程进行相应处理后发送响应数据包,数据包经过OUTPUT链,然后到达POSTROUTING链输出;如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出。

        企业内部的主机A若配了一个公网地址6.6.6.6,访问互联网上其他网段的公有地址不受限制,但若访问互联网上同网段的地址即6.0.0.0/8网段的地址,由于A的路由表就有到达该网段的路由记录,就直接访问了,不会去查询路由器,但是实际上访问的不是互联网上的主机,而是本地局域网的主机,也就是说该网段的所有公有地址A都将无法访问。所以企业内部的主机一般是私有地址,但是互联网上没有私有地址的路由,也就是说私有地址无法连接互联网,可以利用防火墙的nat表(network address translation 地址转换规则表)将私有地址转换为公有地址再去访问互联网

1  SNAT

    企业内部的主机A想访问互联网上的主机C,首先将请求数据包(源:ipA,目标:ipC)发送到防火墙所在主机BB收到后将数据包源地址改为本机公网网卡的ip(源:ipA,目标:ipB),然后经互联网发送给CC收到后将回应包(源:ipC,目标:ipB)转发给C的路由器,经互联网将回应包转发给BB收到回应包后修改其目的地址,即回应包改为(源:ipC,目标:ipA)然后将数据包转发给A

    在这个过程中,修改了请求报文的源地址,叫做SNATsource NAT POSTROUTING),用于局域网访问互联网。

    不能在防火墙Bprerouting链上设置转换源地址的防火墙策略,因为若在Bprerouting链上设置转换源地址的防火墙策略,此时还未检查路由表,还不知道要到达数据包中目标主机需经过本机的哪个网卡接口,即还不知道需将源地址替换为哪个公网网卡的ip,需在postrouting设置转换源地址的防火墙策略。


实验环境:(本实验中用172.18.0.0/16网段模拟公网ip

局域网主机A192.168.25.106黄色提示符 白色字

防火墙Beth0 192.168.25.107 eth1 172.18.0.107绿色提示符 白色字

互联网主机C172.18.0.108紫色提示符 白色字


    每个主机都有路由表,具有基础的路由功能。主机A上有两张网卡:eth0ip192.168.25.106eth1172.18.0.106,则主机A的路由表上就会有两条记录: 

 destination       gateway      netmask                           iface

192.168.25.0    0.0.0.0        255.255.255.0                 eth0

172.18.0.0       0.0.0.0          255.255.0.0                     eth1

        表示主机A可以到达192.168.25.0/24172.18.0.0/16两个网络,网关为0.0.0.0也就是说怎么都可以到达,所以每台主机不需经过路由器就可以与和它同网段的主机通讯,若主机A想与和它不同网段的主机通讯,需要添加路由记录,添加时可以不指定接口,主机A会自动使用与网关ip同网段的ip所在网卡
 0.0.0.0         172.18.0.107   255.255.0.0      eth1
        即到达任何未知网络时将数据包转发到网关,也就是路由器的某个网卡,网关ip必须是本机可以到达的某个网段的ip,即必须是192.168.25.0/24172.18.0.0/16两个网端的某个ip
        路由器的路由表实际上也是类似的,也有本机ip所在网段的路由和到其他网段的路由,只是在普通主机的基础上启用了路由转发功能,普通主机收到目标主机不是自己的数据包后会抛弃,路由器收到目标主机不是自己的数据包后会检查路由表,将数据包转发出去,也就是说普通主机的路由表只能供自己发送数据包时使用,路由器的路由表是公用的。

    本实验中,A是局域网主机,将数据包转发至防火墙主机BB实际上也充当了路由器的作用。实际环境中,BC之间会有多个路由器,本实验只是为了说明SNAT的工作原理,不再考虑这些因素。

 

nat表共有4个链:INPUTOUTPUTPREROUTINGPOSTROUTING

 

-t 指定防火墙策略应用哪个表

-A 指定防火墙策略应用在该表的哪个链

--to-source 指定转换后的源地址

上述命令将来自192.168.25.0/24网段的数据包的源地址替换为172.18.0.107

 

192.168.25.106通过172.18.0.107访问172.18.0.108




     172.18.0.108上抓包,如图,显示源地址为172.18.0.107

        C看来,是B在访问C,而不是A,但是实际上是A在访问C,数据包是从A发往C的,只是经过B时将源地址改为B,但实际上是A发过来的数据包

       若企业内部有ACD等主机都要访问互联网,
A 请求数据包源地址 ip1端口12345      替换为   B公网ip端口12345
C请求数据包源地址 ip2端口23456     替换为    B公网ip端口23456 
D 请求数据包源地址 ip3端口23456     替换为    B公网ip端口24414 

       SNAT中,将请求数据包的源地址替换时,端口一般不替换,即A用什么端口B就用什么端口,但若产生冲突,即CD使用同一随机端口,B可以将端口替换为其他空闲端口,否则当CD的响应包到达时,B就不知道替换为C还是D了,端口和IP都进行修改,称为PNAT

2  DNAT

    互联网主机C想访问企业内部的web服务器A,但A的地址是私有地址,无法直接访问。此时,C可以访问防火墙的公网地址,C的请求数据包(源:ipC,目标:ipB)到达防火墙B后,在Bprerouting上将请求数据包的目标地址进行修改,并将数据包(源:ipC,目标:ipA)发送给AA收到后进行回复发送响应包(源:ipA,目的ipC)到防火墙,防火墙收到后对数据包源地址进行修改,并将响应包(源:ipB,目标:ipC)给C。利用这种机制可以将企业内部的服务发布到互联网。

    在这个过程中,修改了请求报文的目标地址,叫做DNATdestination NAT POSTROUTING),用于互联网访问局域网。
       必须在防火墙的prerouting上设置修改目标地址的防火墙策略,因为若不在此处修改,请求数据包通过prerouting和路由表后,由于目标主机是本机,就会将数据包发往input,进而被发往本地进程。


实验环境:(本实验中用172.18.0.0/16网段模拟公网ip

局域网web服务器A192.168.25.106黄色提示符 白色字

防火墙Beth0 192.168.25.107 eth1 172.18.0.107绿色提示符 白色字

互联网主机C172.18.0.108紫色提示符 白色字



 


 

打开服务配置文件

 

Httpd默认监听在标准端口80,将端口改为非标准端口8000

 

因为selinux阻止使用非标准端口,所以重启失败

 

使用setenforce 0临时关闭selinux

 

-t 指定防火墙策略应用哪个表

-A 指定防火墙策略应用在该表的哪个链

--to-destination 指定转换后的源地址

当数据包的目标地址为172.18.0.107,目标端口为80,使用协议为tcp时,将数据包的目标地址修改为192.168.25.106:8000

 

172.18.0.108通过172.18.0.107访问192.168.25.106:8000

 

因为修改的是数据包的目标地址,并未修改源地址,所以192.168.25.106认为是172.18.0.107发起的请求,与SNAT不同