需求:

我想实现防火墙映射

首先备份一下

iptables-save > /home/iptables_backup
# 恢复时使用
iptables-restore < /home/iptables_backup

说一下原理,当一个请求触碰到防火墙时会是这种情况 

iptables做映射 iptables本地映射_IP

当一个内网访问外网得时候,请求需要经过防火墙,此时因为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.1192.168.122.221这样的内部服务器上。这类设备通常是一个路由器、防火墙或专门设置的Linux系统,它连接内部私有网络与外部公共网络,并负责管理进出网络的所有流量。

具体来说,这个设备应当满足以下条件:

  • 它是内部网络与互联网之间的中介,所有的外部流量在进入内部网络之前,以及内部网络的响应在返回到互联网时,都会经过它。
  • 它需要具备执行iptables命令和配置NAT规则的权限及能力。

因此,正确的执行位置是网络的边界路由器、防火墙或任何承担网络出口角色的系统,而非内部服务主机本身。