Linux改变传入stream量的源地址

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

所以这里是我需要的:

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

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

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> 

不要忘记接受filter表中的数据包。


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

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

这将在外部接口(本例中为eth0 )上将传入数据包的端口8080转发到内部主机192.168.2.1到端口80 。 用您的设置replace接口协议dport目的地

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

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

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

如果您的网卡不在eth0上,您将更改-i attribut

编辑#1

你可以为–dport和–to-port设置ip地址白色端口为exm:192.168.0.1:80