我的基本情况是一台运行 CentOS 5.4 的专用服务器,目前我有一台运行 Ubuntu 9.0.4 的虚拟机。稍后,我想添加另一台运行 Windows Server 2003 的虚拟机,但目前我专注于启动和运行 Ubuntu。
Ubuntu 安装运行良好,但我真的很难让端口转发正常工作,以便我可以访问托管在 Ubuntu VM 上的网站。作为 Linux 新手,我对 IPTables 和 VMWare 自己的端口转发之间的关系感到困惑。
这是迄今为止我尝试过的。
我的服务器的 IP 是 xxx.xxx.xxx.xxx,提供商支持人员告诉我子网掩码是 255.255.255.0,网关地址是 xxx.xxx.xxx.1,网络地址是 xxx.xxx.xxx.0。(后两个让我有点惊讶,我期望的是私有网关/网络地址,而不是公共地址。)
首先,我尝试了桥接网络,但除了通过 VMware 控制台之外,无法与机器通信。我尝试从主机 ping 它(使用 ssh 进入主机),但没有成功;虚拟机也无法访问互联网。我将接口配置从 DHCP 更改为静态,使用静态地址 192.168.1.100,并按照提供商的建议将网关设置为 xxx.xxx.xxx.1。没有什么实际区别,仍然无法从主机 ping 客户机或反之亦然,并且客户机无法访问互联网。
然后我尝试了 NAT。主机自动将 IP 地址设置为 192.168.132.128,网关为 192.168.132.2。现在,来宾可以访问 Internet,当我对主机执行 VNC 并使用 192.168.132.128 打开 Firefox 时,我可以看到托管的网站,但我仍然无法从外部进入。
我提到我对 IPtables 和 VMware 端口转发有点困惑,我的意思是我不确定是否应该将 IPtable 转发设置为客户机接口的 IP 地址(在本例中为 192.168.132.128)或网关地址 192.168.132.2 。
我感觉我在这里遗漏了一些非常简单的东西,有人能告诉我它是什么吗?
答案1
这是我为我的 centos 主机所需的魔法咒语。简而言之,必须添加新的 iptables 规则才能实现两件事。一是将端口 80(可能还有端口 443)从 VM 转发到主机。二是允许在公有子网和私有子网之间跳跃。如果 vmware 处理所有事情并自动添加规则,您应该会在通过“iptables -nvL”获得的规则列表中找到规则或其功能等效项。如果没有,则必须添加它们。
主机端...
#In my case,
IF_ETH_0=eth0
IF_TUN_0=vbr0
IP_PRIVATE_WEB=192.168.132.xxx
IP_PUBLIC_0=192.168.1.yyy
#The interface for the VM is vnet0. vbr0 bridges eth0 and vnet0.
#Using vnet0, instead or vbr0, for IF_TUN_0 will not work.
# port forwarding
/sbin/iptables -t nat --flush
/sbin/iptables -t nat -A PREROUTING -p tcp -i $IF_ETH_0 -j DNAT -d $IP_PUBLIC_0 --dport 80 --to $IP_PRIVATE_WEB:80
/sbin/iptables -t nat -A POSTROUTING -p tcp -o $IF_ETH_0 -j SNAT -s $IP_PRIVATE_WEB --to-source $IP_PUBLIC_0
# the private internal VM address and public-facing host address are on different subnets
# add rules to allow travel between subnets
/sbin/iptables -A FORWARD -i $IF_TUN_0 -o $IF_ETH_0 -j ACCEPT
/sbin/iptables -A FORWARD -i $IF_ETH_0 -o $IF_TUN_0 -j ACCEPT
虚拟机端...
# open up ports 40 and 443
/sbin/iptables -A INPUT -j ACCEPT -p tcp --dport 40 -m state --state NEW
/sbin/iptables -A INPUT -j ACCEPT -p tcp --dport 443 -m state --state NEW
# allow established traffic to pass
/sbin/iptables -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
答案2
您根本不需要使用 iptables 进行端口转发。Vmware 的端口转发机制应该会为您处理好这个问题。查看 vmware 服务器手册中的高级 NAT 配置 -> 主机部分 -> 传入 TCP 部分以设置端口映射。
如果主机和客户机上的端口 80 尚未打开,则可能需要使用 iptables 打开它们,但您不需要任何转发规则。