Linux 更改传入流量的源 IP 地址

Linux 更改传入流量的源 IP 地址

我在端口 X 上运行了一个 Web 服务。它从未打算在本地网络之外运行,但我想通过互联网访问它。因此,我需要将所有传入数据包的源 IP 地址更改为本地地址(例如 192.168.2.100)。否则 Web 服务会响应错误。

这就是我需要的:

如果我从我的家用电脑(公网 IP X)向我的服务器的公网 IP 地址 Y 发送一个数据包,则源 IP 地址(在这种情况下为 X)需要更改为本地 IP 地址(例如 192.168.2.1)。之后,数据包应传递到在同一台服务器上端口 80 上运行的 Web 应用程序。

答案1

好的,现在我想我明白你想要什么了。这是一个非常特殊的情况,与正常情况不同转发端口我之前发布的方法(见下文)。以下规则应该可以做到。

对传入数据包进行 SNAT

我做出以下假设:

  • <x>:服务器的公网IP
  • <y>:客户端的公网 IP
  • <a>:服务器的内部 IP(192.168.2.1
  • <b>:客户端内部“伪造”的 IP(192.168.2.100
  • <if>:外部接口(即eth0

仅限 SNAT

此规则将改变数据包的源地址:

iptables -t nat -A INPUT -p tcp -d <x> --dport 80 -s <y> -j SNAT --to-source <b>

DNAT 与 SNAT 组合:

这些规则将改变数据包的源地址和目标地址:

iptables -t nat -A PREROUTING -i <if> -p tcp -d <x> --dport 80 -s <y> \
    -j DNAT --to-destination <a>:80
iptables -t nat -A INPUT -p tcp -d <a> -s <y> --dport 80 \
    -j SNAT --to-source <b>

别忘了接受过滤表中的数据包。


常用的DNAT端口转发规则比较(无SNAT):

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 \
    -j DNAT --to-destination 192.168.2.1:80

这会将8080外部接口(在此示例中eth0)上的传入数据包的端口转发到内部主机192.168.2.1的端口80。替换界面协议端口到目的地与您的设置一致。

该规则将接受修改后的数据包:

iptables -A FORWARD -i eth0 -p tcp -d 192.168.2.1 --dport 80 -j ACCEPT

答案2

iptables -t nat -A PREROUTING -i eth0 -p tcp --dport *$srcPortNumber* -j REDIRECT --to-port *$dstPortNumber*

如果你的网卡不在 eth0 上,你需要更改 -i 属性

编辑#1

您可以使用 --dport 和 --to-port 设置 IP 地址和端口,例如:192.168.0.1:80

相关内容