【Iptables】13 Iptables动作总结之二(进阶)

本文深入探讨Iptables中的NAT动作,包括SNAT、DNAT、MASQUERADE和REDIRECT,详细解释了如何使用这些动作进行源地址和目标地址转换,以及在不同场景下的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

特别说明:此系列博文根据 朱双印博客-iptables系列博文,个人实践后总结,此为个人笔记精简版,更通俗易懂请参考 朱双印博客-iptables系列博文 原文内容,诸君必能有所收获

13 Iptables动作总结之二(进阶)

我们之前已经了解了ACCEPT、DROP、REJECT、LOG,另外还有一些动作虽然不常用,但是也可能会用到的,分别是SNAT、DNAT、MASQUERADE、REDIRECT

首先来了解下NAT,NAT即Network Address Translation的缩写,译为"网络地址转换",如名,NAT的作用就是用来做网络地址转换的,通常会被集成到路由器,防火墙,或者独立的NAT设备中,简单理解它就是修改报文IP地址来达到报文被发送到修改后的IP处

学习动作之前,我们可以看一下常见的一些场景

如内部网络存在一些主机,它们各自有自己的IP地址,当内部网络的主机访问其他网络的主机时,会暴露自己的IP地址,如果需要隐藏这些内部网络的主机,可以做些什么达到目的呢

这个时候就会用到NAT了,当内部网络的主机与外界通信,报文会经过路由器或者防火墙;当报文经过时,将源IP地址改为路由器或者防火墙的地址,这样,其他外部主机收到报文会认为是路由器或者防火墙这个IP发出的,隐藏IP地址的目的也就可以达到了;通常,路由器等拥有NAT功能的设备,会维护一张NAT表,表中记录了报文是从哪个内部主机的哪个进程的,当报文经过路由器,路由器会将报文的内容主机的源IP替换为路由器IP,将源端口映射为某个端口,NAT表会把这种对应关系记下来
在这里插入图片描述
当响应的报文被送回来后,路由器会按照NAT表的记录,将目标地址IP和端口改回去,这样,报文又会被送到内部网络的主机上

这就是用到了NAT的功能,准确一点,应该是用到了NAPT功能,NAPT是NAT的一种,全称为Network Address Port Translation,该功能在映射报文IP地址的同时还会映射相应的端口号

内部网络的报文发送出去,报文的源IP会被修改,也就是源地址转换:Source Network Address Translation,缩写为SNAT;当外部网络响应发送报文回来时,报文的目标地址会被修改,也就是目标地址转换:Destination network Address Translation,缩写为DNAT

NAT不仅能帮我们隐藏网络内部主机的IP地址,还能够让局域网内的主机共用一个能连接外部网络的主机IP,让私网能够访问外部网络,具体就是利用SNAT与DNAT把内部网络IP地址和端口映射为可以访问外部网络的主机IP和端口;

环境准备

验证SNAT和DNAT动作的环境和验证iptables作为网络防火墙的配置相同,只不过此时我们把内外网比作我们常见的公网和私网
在这里插入图片描述
主机A:作为模拟公网的主机

主机B:作为模拟网络防火墙的主机,既能和公网主机通信,又能与私网主机通信

主机C:作为模拟的私网主机

同样的,需要开启主机B的核心转发功能,现在我们来看看动作SNAT吧

动作:SNAT

现在我们让主机B扮演有NAT功能的设备,配置iptables规则的SNAT动作去完成内网主机访问外网并隐藏IP

我们在主机B上配置规则如下

iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -j SNAT --to-source 192.168.200.221
在这里插入图片描述
上述规则中,我们表示将来自172.16.0.0网段的报文,将源地址改为可以访问外网的IP地址192.168.200.221

使用了 -t nat 选项,指定nat表,因为主要是nat表进行的地址转换

使用 -A POSTROUTING 表示将规则放到POSTROUTING链的末尾,这样每一条在之前经过规则匹配后的报文经过这个规则再经过修改源地址IP和映射端口后就会被发送出去

使用 -j SNAT 指定了SNAT动作,即源地址端口转换

使用了 --to-source 选项,这是SNAT动作的常用选项,用于指定SNAT需要将报文的源IP修改成哪个IP地址

现在我们配置了一条SNAT的规则,并没有配置DNAT规则,是不是会导致回来的报文无法被修改为源IP地址啊,我们可以试一试
在这里插入图片描述
可以看到,内部网络的主机C是能够访问到外网的,我们并没有配置DNAT规则,看来是iptables自动给我们把响应的报文目标地址修改成了我们内部主机的IP地址;这就是内部网络主机通过恭喜可以访问外网的IP来实现访问外网的案例,同时外部网络的主机一直认为是主机B在和它们进行通信交互,达到了隐藏IP的效果,而且我们只用了一条规则,DNAT的功能由iptables自己完成了

这里还有一个需要注意的是,内外部主机C和A能通信,主要是因为主机B的转发作用,主机C能ping通主机A,是因为有一条SNAT规则所在,但是主机A却不能ping通主机C,因为至始至终都是主机B在和主机A通信;主机C能收到 主机A的响应不过是主机B收到报文后,iptables做出的自动DNAT

动作:DNAT

有动作SNAT的使用,也少不了DNAT的使用;SNAT主要用于内部访问外部网络,而DNAT则主要用于外部网络访问内部网络;

如我们内部网络有一系列的服务需要开放给外部网络的人员使用,但是我们的服务却只能内部网络访问,这时我们就需要用到DNAT,将访问某一台可以访问外网的主机IP修改为内部服务主机的IP,这样来实现外部网络访问内部网络的服务,首先,我们在主机B中清除原有规则并添加规则如下

iptables -t nat -I PREROUTING -d 192.168.200.221 -p icmp -j DNAT --to-destination 172.16.220.129

上述规则中,我们指定了nat表的PREROUTING链,然后 -d 选项指定了目标地址,-j DNAT --to-destination 选项表示将符合条件的报文进行DNAT,如果服务具有端口,可在IP后跟冒号与端口号,如172.16.220.129:80 表示将主机B的80端口映射到内网主机的80端口上,当然,如果在匹配条件处指明了其他端口,则是将该端口映射为内部网络的80端口,如 192.168.200.221 -p tcp --dport 801 -j DNAT --to-destination 172.16.220.129:80 表示将主机B上的801端口映射到内部网络主机的80端口

我们试一下看能否访问内部网络,ping 192.168.200.221 ,ping主机B,如果规则没有问题,我们连接的其实是内部网络的主机C,如果不能连通,可能需要添加一条SNAT规则,和之前的一样
在这里插入图片描述
为了验证ping 192.168.200.221这台主机,即主机B后,实际连接的主机C,我们需要在主机C上添加规则如下

iptables -I INPUT -s 192.168.200.115 -p icmp -j LOG

这条规则表示只有是主机A的ping报文,就把它记录下来,默认记录文件是/var/log/message

现在,通过主机Aping主机B,查看是否连通
在这里插入图片描述
看能通信,现在查看主机C的/var/log/message文件,看看是否有来自主机A的ping报文信息
在这里插入图片描述
可以看到,主机C收到了来自外网主机A的ping报文,和我们发送的总共4条报文一样,收到了4条报文

同样的,我们也可以映射端口,做法与SNAT一样

动作:MASQUERADE

我们了解了SNAT与DNAT之后,我们再来看看类似的动作MASQUEREADE,类似于动态的SNAT

我们常常会遇到动态分配IP的问题,如果作为防火墙的主机IP都是动态分配的,那么可能会出现之前的规则因为网络IP地址的变化而变得没有作用,我们就必须重新定义规则,这样是很麻烦的,而且也不能解决我们的实际问题;这个时候我们可以使用MASQUERADE动作,这个动作会动态的将源地址转换为可用的IP地址,即不指定转换为某个固定的IP,而是动态的将报文的源地址修改为指定网卡上可用的IP地址

iptables -t nat -I POSTROUTING -s 172.16.0.0/16 -o eht0 -j MASQUERADE

上述规则,我们指定经过网卡eht0的报文在经过POSTROUTING链时,会自动将报文的源地址修改为网卡eth0上的可用IP地址,即实现了动态更改源IP地址,不再担心主机B因为动态分发IP而导致规则不能使用了,如果没有动态的SNAT需求,我们选择SNAT,因为会更加高效

动作:REDIRECT

使用动作REDIRECT可以实现本机端口的映射,即可以把本机的801端口映射到80端口上

iptables -t nat -A PREROUTING -p tcp --dport 801 -j REDIRECT --to-ports 80

上述规则中,我们使用动作REDIRECT和其选项 --to-ports 将本机端口801映射到80端口,当801接收到的报文,会被重定向到本机的80端口

需要注意的是,REDIRECT动作只能定义在PREROUTING链或者OUTPUT链中,其余的链不行
【Iptables】iptables目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值