我目前正在尝试弄清楚如何使用 iptables 将流量从我的专用服务器的辅助公共 IP 地址转发到我的网络的内部 IP,以便从外部看到 Web 服务器等。
我的设置是一台专用服务器,其中包含三台虚拟机,它们组成一个“专用局域网”。这些虚拟机之间的连接已建立,虚拟机可以通过隔离局域网和物理服务器之间的桥接器连接到互联网。允许传出使用以下规则建立流量(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
这很好用 - 如果我打开网络浏览器并访问 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
但是连接到公网 IP 的 80 端口会超时。看来我还是遗漏了什么,或者我制定规则的方式有误。
请注意:我并不想只打开特定端口,而是想将该特定 IP 上的所有传入流量转发到虚拟机并在那里处理安全性。
任何建议都将不胜感激 - 也许我只是忽略了一些小事。
答案1
您将需要 DNAT 和 SNAT 的组合,并且需要激活 ip_forwarding。
首先,检查 ip_forwarding:
cat /proc/sys/net/ipv4/ip_forward
如果是 1(已启用),请继续。如果不是,则必须安装 net.ipv4.ip_forward=1
并/etc/sysctl.conf
运行sysctl -p
。
第一条规则是DNAT(假设8.8.8.8
为外部IP,假设192.168.0.10
为内部):
iptables -t nat -A PREROUTING -d 8.8.8.8 -j DNAT --to-destination 192.168.0.10
当外部系统(例如200.100.50.25
)发送数据包到达 8.8.8.8 时,会将 更改DESTINATION
为192.168.0.10
,并发送出去。但源将是200.100.50.25
,数据包将被处理,响应数据包可以:
被 192.168.0.10 丢弃,因为 192.168.0.10 可能不知道如何路由它。不可取。
由 192.168.0.10 发送到默认网关并发送到互联网。一旦到达
200.100.50.25
,该系统将从未听说过192.168.0.10
并会丢弃数据包。不好。在第一跳就被丢弃,因为它
192.168.0.10
是私有地址,无法在互联网上路由。
为了解决这个问题,你需要第二条规则,SNAT:
iptables -t nat -A POSTROUTING -s 192.168.0.10 -j SNAT --to-source 8.8.8.8
有了这个规则,每个来自的数据包都192.168.0.10
将被改为源8.8.8.8
并发送出去。
附带影响是每次登录192.168.0.10
都会显示8.8.8.8
为客户,而不是真正的客户。追踪滥用者将变得更加困难。