使用iptables转发端口到其他客户端,但可以识别原始发件人ip

ni_*_*hao 2 iptables

我在专用的ubuntu服务器上有一个防火墙(基于iptables)。我有几个局域网客户端。

在我的一个LAN客户端中,我正在运行可基于IP限制访问权限的软件。对我而言,重要的是我可以通过使用WAN IP而不是LAN IP进行限制。

我已经配置了防火墙,以便将一个端口转发到运行良好的LAN客户端(在stackoverflow上找到了解决方案)。到目前为止没有问题。

但是,在LAN客户端上,我看不到外部发送者的IP,但是-我认为由于转发-客户端看到数据包来自我的LAN服务器。

问题是:如何将服务器上的端口转发到具有不同端口的另一个LAN IP,以便LAN客户端识别数据包的外部IP。

让我们更清楚一点:

服务器局域网IP:192.168.1.10服务器端口:8080

应该转发给:客户端LAN IP:192.168.1.20客户端LAN端口:8000

使用iptables我有:

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8080 -d 192.168.1.10 -j DNAT --to 192.168.1.20:8000

iptables -A FORWARD -p tcp -d 192.168.1.20 --dport 8000 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -t nat -A POSTROUTING -p tcp --dport 8000 -d 192.168.1.20 -j SNAT --to 192.168.1.10
Run Code Online (Sandbox Code Playgroud)

如所写的可行,但是当IP 88.77.66.55的某人发送数据包时,我的LAN客户端(192.168.1.20)看到该数据包来自我的LAN服务器(192.168.1.10),不幸的是不是来自88.77.66.55。

我可以解决...吗?

小智 5

您的最后一条规则与MASQUERADE规则相同。

例如:

iptables -t nat -A POSTROUTING --out-interface eth0 -j伪装

使用MASQUERADE或SNAT,您正在修改源IP地址经过第一台服务器时的地址。第二台服务器看到该数据包,并将其响应发送回该IP,然后将该IP发送回客户端。

但是,服务器将请求视为来自192.168.1.10-因为它来自此请求。

客户端>网关> iptables-router>服务器(请参阅.10)> iptables-router>网关>客户端

如果删除MASQUERADE / SNAT,服务器将看到真实IP,但是当发送答复时,数据包将转到其默认网关(默认路由),该网关可能是您的路由器或数据中心的网关。客户端从一个未知的IP地址获得响应,并且不知道该如何处理,因此看起来好像不起作用。可选地,网关/路由器看到没有关联连接的SYNACK,并丢弃数据包。

客户端>网关> iptables-router>服务器>网关(DROP)或>客户端(DROP)

如果您希望服务器获取客户端的真实IP,可以通过以下两种常用方法使其工作:

  1. 将服务器的网关(默认路由)设置为iptables机器(即,正在运行这些iptables规则的机器)的IP地址。在这种情况下,服务器将所有外部流量(即:对来自互联网的随机IP地址的响应)发送到正在等待答复的iptables机器的MAC地址。iptables会将其发送回客户端。Web服务器计算机位于 iptables计算机之后,使用iptables计算机作为路由器。

客户端>网关> iptables-路由器>服务器(真实IP)> iptables-路由器>网关>客户端

  1. 使用像nginx这样的HTTP代理,该代理的工作方式与您现在使用的代理相同,并且客户端仅看到内部的.10地址。但是,因为它是代理,所以它可以发送HTTP标头,例如X-Original-IP-Address:123.456.789.012,其中包含客户端的真实IP地址。

客户端>网关> iptables-路由器>服务器(请参阅X-Original-IP标头)> iptables-路由器>网关>客户端

最好的问候,尼尔