我有一个在端口X上运行的Web服务.它从来没有打算在本地网络外运行,但我想通过Internet访问它.因此,我需要将所有传入数据包的源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>
不要忘记接受过滤表中的数据包.
通常的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.将接口,协议,dport和目标替换为您的设置.
此规则将接受修改的数据包:
iptables -A FORWARD -i eth0 -p tcp -d 192.168.2.1 --dport 80 -j ACCEPT