需求:
我想实现防火墙映射
首先备份一下
iptables-save > /home/iptables_backup
# 恢复时使用
iptables-restore < /home/iptables_backup
说一下原理,当一个请求触碰到防火墙时会是这种情况
当一个内网访问外网得时候,请求需要经过防火墙,此时因为nat转发表,需要在POSTROUTING阶段将内网ip转化为防火墙的公网ip发送给目的ip,响应请求的话此时到了防火墙,就反过来,在PREROUTING阶段就将响应请求的目的ip(此时是防火墙的公网ip)转化为内网ip。
也就是说post修改源(SNAT),pre修改目的(DNAT)【这点需要向下看】。
DNAT(Destination Network Address Translation,目的网络地址转换)
SNAT(Source Network Address Translation,源网络地址转换)。
从一台机器映射到另一台机器
映射关系 192.168.122.1:80 ---> 192.168.122.221:80
192.168.122.221 在 80 端口开启了 nginx 服务器
本地链路的报文是不需要经过 PREROUTING 与 POSTROUTING 的,所以必须配置 OUTPUT 否则在本机上测试会发现转发规则无效!
- 在 192.168.122.1 配置如下规则,然后在 192.168.122.1(本机) 的机器能访问 “192.168.122.1:80”
iptables -t nat -A OUTPUT -p tcp -d 192.168.122.1 --dport 80 -j DNAT --to 192.168.122.221:80
当本地系统尝试直接输出(比如,从本机的应用程序直接发出请求)到
192.168.122.1:80
时,DNAT规则会将目标地址转换为192.168.122.221:80
。这意味着,任何从本机出发、原本意图访问192.168.122.1
的HTTP服务的请求,都将被重定向到192.168.122.221
的相同端口。这个规则主要用于调整本机的外出连接行为,而不是影响那些经过本机路由或转发的流量。
# 配置目的地址转换
iptables -t nat -A PREROUTING -p tcp -d 192.168.122.1 --dport 80 -j DNAT --to 192.168.122.221:80
这个命令的作用是将所有发往
192.168.122.1
的TCP端口80的请求,重定向到192.168.122.221
的80端口。这意味着外部网络中的任何设备如果尝试连接到192.168.122.1
的HTTP服务(默认80端口),它们实际上会连接到192.168.122.221
。这种做法常用于隐藏内部网络中实际提供服务的服务器IP,或者在负载均衡场景中,将所有请求导向特定的服务器。
# 配置源地址转换
iptables -t nat -A POSTROUTING -p tcp -d 192.168.122.221 --dport 80 -j SNAT --to 192.168.122.1
这个命令用于配置SNAT,它确保了从
192.168.122.221
返回的响应看起来像是来自192.168.122.1
。也就是说,当192.168.122.221
向外部网络发送响应时,其源IP地址会被设置为192.168.122.1
。这在内部网络使用单一公共IP地址对外提供服务时非常有用,确保外部网络中的客户端能够正确回连。这两个规则创建了一个端口映射,使得外部网络的请求可以通过
192.168.122.1
这个公共或虚拟IP地址访问192.168.122.221
的HTTP服务,并且返回的响应也保持了同样的IP地址一致性。
关于这两段命令在哪里执行。
这两个iptables
命令应该在充当网络网关或具有网络地址转换(NAT)功能的设备上执行,而不是直接在192.168.122.1
或192.168.122.221
这样的内部服务器上。这类设备通常是一个路由器、防火墙或专门设置的Linux系统,它连接内部私有网络与外部公共网络,并负责管理进出网络的所有流量。具体来说,这个设备应当满足以下条件:
- 它是内部网络与互联网之间的中介,所有的外部流量在进入内部网络之前,以及内部网络的响应在返回到互联网时,都会经过它。
- 它需要具备执行
iptables
命令和配置NAT规则的权限及能力。因此,正确的执行位置是网络的边界路由器、防火墙或任何承担网络出口角色的系统,而非内部服务主机本身。