使用 iptables 将所有传入流量从辅助公共 IP 重定向到内部 IP 地址

bet*_*eta 10 iptables

我目前正在尝试弄清楚如何使用 iptables 将流量从我的专用服务器的辅助公共 IP 地址转发到我网络的内部 IP,以便从外部可以看到例如网络服务器等。

我的设置是一个包含三个虚拟机的专用服务器,它们形成了一个“专用局域网”。它们之间的连接已经建立,虚拟机可以通过隔离 LAN 和物理服务器之间的桥接器连接到 Internet。使用以下规则建立允许传出流量(LAN:192.168.xx,示例公共地址:8.8.8.8):

iptables -t nat -A POSTROUTING -s 192.168.1.101 -j SNAT --to-source 8.8.8.8
Run Code Online (Sandbox Code Playgroud)

这工作正常 - 如果我打开互联网浏览器并转到 whatismyip.com,它现在将不再显示服务器的主 IP 地址,而是会按照它应该做的方式显示辅助 IP。

但是,现在我想反过来做,例如在其中一台虚拟机上安装 Web 服务器,并通过我的辅助 IP 将其提供给公众。我正在寻找答案,发现我应该添加一个 PREROUTING 规则来实现这一点,因此我尝试了以下操作:

iptables -t nat -A PREROUTING -d 8.8.8.8 -j DNAT --to-destination 192.168.1.101
Run Code Online (Sandbox Code Playgroud)

但是,连接到公共 IP 的端口 80 将超时。似乎我仍然遗漏了一些东西,或者我做规则的方式有误。

请注意:我不想只打开一个特定的端口,而是希望将该特定 IP 上的所有传入流量转发到虚拟机并在那里处理安全性。

任何建议将不胜感激 - 也许我只是错过了一些小事。

Tho*_*mBR 16

您将需要 DNAT 和 SNAT 的组合,并且需要启用 ip_forwarding。

首先,检查ip_forwarding:

cat /proc/sys/net/ipv4/ip_forward
Run Code Online (Sandbox Code Playgroud)

如果它是 1(启用),请继续。如果没有,你将不得不把 net.ipv4.ip_forward=1/etc/sysctl.conf并运行sysctl -p

第一条规则是 DNAT(假设8.8.8.8为外部 IP 和192.168.0.10内部IP ):

iptables -t nat -A  PREROUTING -d 8.8.8.8 -j DNAT --to-destination 192.168.0.10
Run Code Online (Sandbox Code Playgroud)

当外部系统(例如200.100.50.25)发送到达 8.8.8.8 的数据包时,DESTINATION将更改为192.168.0.10,并发送出去。但是源将是200.100.50.25,数据包将被处理并且响应数据包可以:

  1. 被 192.168.0.10 丢弃,可能不知道如何路由它。不可取。

  2. 由 192.168.0.10 发送到默认网关和互联网。一旦到达200.100.50.25,该系统将从未听说过192.168.0.10并将丢弃该数据包。不好。

  3. 在第一跳被丢弃,这192.168.0.10是一个私有地址,不能在 Internet 上路由。

为了解决这个问题,你需要第二条规则,SNAT:

iptables -t nat -A POSTROUTING -s 192.168.0.10 -j SNAT --to-source 8.8.8.8
Run Code Online (Sandbox Code Playgroud)

使用此规则,来自的每个数据包都192.168.0.10将更改源8.8.8.8并发送出去。

附带效应是每次登录192.168.0.10都将显示8.8.8.8为客户端,而不是真正的客户端。追踪滥用者会更难一些。

  • 哦,它终于工作了。非常感谢对我的问题的精彩解释和解决方案!! (3认同)