我在专用的 ubuntu 服务器上有一个防火墙(基于 iptables)。 我有几个 LAN 客户端。
在我的一个 LAN 客户端上,我正在运行可以根据 IP 限制访问的软件。 对我来说,重要的是我可以通过使用 WAN IP 而不是 LAN IP 来限制它。
我已经配置了我的防火墙,以便将一个/一个端口转发到运行良好的 LAN 客户端(在 stackoverflow 找到的解决方案)。到目前为止没有问题。
但是在 LAN 客户端我没有看到外部发件人的 IP,但是 - 我认为由于转发 - 客户端看到数据包来 self 的 LAN 服务器。
问题是:如何将我的服务器上的一个端口转发到另一个具有不同端口的局域网IP,但让局域网客户端识别数据包的外部IP。
让我们说得更清楚:
服务器局域网IP:192.168.1.10 服务器端口:8080
应转发至: 客户端局域网IP:192.168.1.20 客户端局域网端口: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
正如所写的那样有效,但是当 f.i. IP 88.77.66.55 的某人发送了一个数据包,然后我的 LAN 客户端 (192.168.1.20) 看到该数据包来 self 的 LAN 服务器 (192.168.1.10),不幸的是不是来自 88.77.66.55。
我可以解决这个...吗?
最佳答案
您的最后一条规则与 MASQUERADE 规则相同。
例如:
iptables -t nat -A POSTROUTING --out-interface eth0 -j MASQUERADE
使用 MASQUERADE 或 SNAT,您正在修改通过第一台服务器的源 IP 地址。第二台服务器看到数据包并将其响应发送回该 IP,然后将其发送回客户端。
但是,服务器将请求视为来自 192.168.1.10 - 因为这是它的来源。
client > gateway > iptables-router > server (see .10) > iptables-router > gateway > client
如果您删除 MASQUERADE/SNAT,服务器会看到真实的 IP,但当它发送回复时,数据包将转到它的默认网关(默认路由),这可能是您的路由器或数据中心的网关。客户端从一个它不知道的 IP 地址得到响应,也不知道如何处理它,所以看起来它不起作用。或者,网关/rputer 看到一个没有关联连接的 SYNACK 并丢弃数据包。
client > gateway > iptables-router > server > gateway (DROP) 或 > client (DROP)
如果想让服务端获取到客户端的真实IP,有两种常用的方法:
- 将服务器的网关(默认路由)设置为 iptables 机器的 IP 地址(即:您正在运行这些 iptables 规则的机器)。在这种情况下,服务器将所有外部流量(即:对来自互联网的随机 IP 地址的响应)发送到等待回复的 iptables 机器的 MAC 地址。 iptables 会将其发送回客户端。网络服务器机器在 iptables 机器后面,使用 iptables 机器作为路由器。
客户端>网关>iptables-router>服务器(真实IP)>iptables-router>网关>客户端
- 使用像 nginx 这样的 HTTP 代理,它的工作方式与您现在的工作方式相同,客户端只能看到内部 .10 地址。但是,因为它是代理,它可以发送一个 HTTP header ,如 X-Original-IP-Address: 123.456.789.012,其中包含客户端的真实 IP 地址。
客户端 > 网关 > iptables-router > 服务器(查看 X-Original-IP header )> iptables-router > 网关 > 客户端
最好的问候, 尼尔
关于iptables - 使用 iptables 转发端口到其他客户端,但可以识别原始发件人 ip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14877900/