情况: 我有一台专用服务器(CentOS 6),在 Virtual Box 中有几个虚拟机(Cent OS 7 和 Windows Server 2012 R2)。Windows 中运行着几个应用程序,可以使用 mod 代理从主 IP(XX105.20)访问。托管在 Linux VM 中的应用程序需要从不同的 IP(XX109.118)(服务器的第二个 IP 地址)访问。
我尝试过什么: 到目前为止,我尝试过 IP 转发这个科幻问题但应用程序无法访问。
iptables -t nat -A PREROUTING -p tcp -d X.X.109.118 -j DNAT --to-destination 192.168.56.102
iptables -t nat -A POSTROUTING -p tcp -d 192.168.56.102 -j SNAT --to-source X.X.109.118
iptables -I FORWARD -m state -d 192.168.56.102 --state NEW,RELATED,ESTABLISHED -j ACCEPT
顺便说一句,该应用程序可以从 Windows Guest 以及 CentOS Host 访问
根据评论进行编辑: 我有两个域。一些基于 .net 的 Web 应用程序正在使用其中一个域的子域在 Windows 服务器中运行。而我正在为在 Linux 中运行的应用程序使用另一个域名。因此,对于第一个域(及其子域),它都是基于名称的访问,它也使用主 IP 地址。我已将第二个域注册到附加 IP 地址 XX1.118。ping 也很好(使用 IP 和域名)。我想要的只是这个 IP 可以将所有通信发送(和接收)到 192.168.56.102 上的 VM。
答案1
您的第二条规则与目的地匹配192.168.56.102
,但POSTROUTING
链需要用于重写来自(--source)
(192.168.56.102
响应)的数据包的目的地。
将第二条规则更改为:
iptables -t nat -A POSTROUTING -p tcp -s 192.168.56.102 -j SNAT --to-source X.X.109.118
或者
iptables -t nat -A POSTROUTING -p tcp -s 192.168.56.102 -j MASQUERADE
您正在将所有带有目的地的 tcp 数据包发送X.X.109.118
到 linux VM,因此您不能让任何 Web 服务器在专用主机上侦听此地址。
确保 apache 没有监听您正在转发的 IP 地址,以避免数据包被链处理INPUT
。
或者您可以为域配置一个基于名称的虚拟主机,但只监听地址(just this virtualhost listening on X.X.109.118)
并删除 iptables 规则。
IE:
<Virtualhost X.X.109.118:443>
[...]
</Virtualhost>