我在端口 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