在linux操作系统中,Netfilter组件是集成在linux内核中扩展各种网络服务的结构化底层框架,在内核级提供防火墙功能。内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个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)发送到防火墙所在主机B,B收到后将数据包源地址改为本机公网网卡的ip(源:ipA,目标:ipB),然后经互联网发送给C;C收到后将回应包(源:ipC,目标:ipB)转发给C的路由器,经互联网将回应包转发给B,B收到回应包后修改其目的地址,即回应包改为(源:ipC,目标:ipA)然后将数据包转发给A。
在这个过程中,修改了请求报文的源地址,叫做SNAT(source NAT POSTROUTING),用于局域网访问互联网。
不能在防火墙B的prerouting链上设置转换源地址的防火墙策略,因为若在B的prerouting链上设置转换源地址的防火墙策略,此时还未检查路由表,还不知道要到达数据包中目标主机需经过本机的哪个网卡接口,即还不知道需将源地址替换为哪个公网网卡的ip,需在postrouting设置转换源地址的防火墙策略。
实验环境:(本实验中用172.18.0.0/16网段模拟公网ip)
局域网主机A:192.168.25.106黄色提示符 白色字
防火墙B:eth0 192.168.25.107 eth1 172.18.0.107绿色提示符 白色字
互联网主机C:172.18.0.108紫色提示符 白色字
每个主机都有路由表,具有基础的路由功能。主机A上有两张网卡:eth0ip有192.168.25.106,eth1有172.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/24、172.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/24、172.18.0.0/16两个网端的某个ip
路由器的路由表实际上也是类似的,也有本机ip所在网段的路由和到其他网段的路由,只是在普通主机的基础上启用了路由转发功能,普通主机收到目标主机不是自己的数据包后会抛弃,路由器收到目标主机不是自己的数据包后会检查路由表,将数据包转发出去,也就是说普通主机的路由表只能供自己发送数据包时使用,路由器的路由表是公用的。
本实验中,A是局域网主机,将数据包转发至防火墙主机B,B实际上也充当了路由器的作用。实际环境中,B与C之间会有多个路由器,本实验只是为了说明SNAT的工作原理,不再考虑这些因素。
nat表共有4个链:INPUT、OUTPUT、PREROUTING、POSTROUTING
-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发过来的数据包
若企业内部有A、C、D等主机都要访问互联网,
A 请求数据包源地址 ip1端口12345 替换为 B公网ip端口12345
C请求数据包源地址 ip2端口23456 替换为 B公网ip端口23456
D 请求数据包源地址 ip3端口23456 替换为 B公网ip端口24414
SNAT中,将请求数据包的源地址替换时,端口一般不替换,即A用什么端口B就用什么端口,但若产生冲突,即C、D使用同一随机端口,B可以将端口替换为其他空闲端口,否则当C或D的响应包到达时,B就不知道替换为C还是D了,端口和IP都进行修改,称为PNAT。
2 DNAT
互联网主机C想访问企业内部的web服务器A,但A的地址是私有地址,无法直接访问。此时,C可以访问防火墙的公网地址,C的请求数据包(源:ipC,目标:ipB)到达防火墙B后,在B的prerouting上将请求数据包的目标地址进行修改,并将数据包(源:ipC,目标:ipA)发送给A。A收到后进行回复发送响应包(源:ipA,目的ipC)到防火墙,防火墙收到后对数据包源地址进行修改,并将响应包(源:ipB,目标:ipC)给C。利用这种机制可以将企业内部的服务发布到互联网。
在这个过程中,修改了请求报文的目标地址,叫做DNAT(destination NAT POSTROUTING),用于互联网访问局域网。
必须在防火墙的prerouting上设置修改目标地址的防火墙策略,因为若不在此处修改,请求数据包通过prerouting和路由表后,由于目标主机是本机,就会将数据包发往input,进而被发往本地进程。
实验环境:(本实验中用172.18.0.0/16网段模拟公网ip)
局域网web服务器A:192.168.25.106黄色提示符 白色字
防火墙B:eth0 192.168.25.107 eth1 172.18.0.107绿色提示符 白色字
互联网主机C:172.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不同
————————————————
版权声明:本文为CSDN博主「以梦为马不负韶华」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/beanewself/article/details/78317626
https://blog.csdn.net/suiyuan19840208/article/details/8448709