我目前正在设法弄清楚,如何使用iptables将stream量从我的专用服务器的辅助公共IP地址转发到我的networking的内部IP,以使例如web服务器等可从外部看到。
我的设置是一个专用服务器,其中包含三个形成“专用LAN”的虚拟机。 这些连接build立起来,虚拟机可以通过隔离的局域网和物理服务器之间的网桥连接到互联网。 允许传出stream量使用以下规则build立(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端口将超时。 看来我还是错过了一些东西,或者我在做规则的时候有一个错误。
请注意:我不想只打开一个特定的端口,而是希望将所有传入的stream量都转发给虚拟机,并在那里处理安全性。
任何意见将不胜感激 – 也许我只是失去了一些小事。
您将需要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(假定外部IP为8.8.8.8 ,内部为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发送到默认网关和互联网。 一旦达到200.100.50.25 ,这个系统将从来没有听说过192.168.0.10 ,并将丢弃该数据包。 不好。
被丢弃在第一跳,因为192.168.0.10是一个私人地址,不能在Internet上路由。
为了解决这个问题,你需要第二个规则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作为客户端,而不是真正的客户端。 跟踪滥用者会有点困难。