Linux版VMware使用DHCP为虚拟机分配固定IP及实现NAT网络端口转发

首先介绍一下环境:

1. Host(宿主计算机)的操作系统是Scientific Linux,内核版本2.6.18,主机名SPVM02,IP地址135.100.101.102,部署的是VMware Workstation 8。

2. Guest(虚拟机)这边安装的操作系统是Windows 7。

3. Guest使用vmnet8这块网卡,通过NAT协议实现上网。


需要实现的功能是Host网络中的其他计算机使用Microsoft Remote Desktop远程登录Guest桌面。所以探索如何通过配置VMware Workstation来实现NAT网络端口转发是本文的核心内容。


以下两个方法均可以实现我们需要的功能,其中第二种方法比较直接,需要解决问题的朋友可以直接往下翻。


先说第一种方法,通过修改VMware网络配置实现DHCP为Guest分配固定IP和让外网计算机访问Guest指定端口的功能。

这个配置在Windows版的VMware Workstation中可以通过图形界面完成,然而在Linux中我们目前只能通过修改配置文件的方式来实现。步骤如下:


1. 首先用“ps -ef”来找到DHCP和NAT服务的配置文件:


[root@SPVM02 ~]# ps -ef | grep dhcpd

root     11080     1  0 09:58 ?        00:00:00 /usr/bin/vmnet-dhcpd -s 6 -cf /etc/vmware/vmnet8/dhcpd/dhcpd.conf -lf /etc/vmware/vmnet8/dhcpd/dhcpd.leases -pf /var/run/vmnet-dhcpd-vmnet8.pid vmnet8

[root@SPVM02 ~]# ps -ef | grep natd

root     11054     1  0 09:58 ?        00:00:00 /usr/bin/vmnet-natd -s 6 -m /etc/vmware/vmnet8/nat.mac -c/etc/vmware/vmnet8/nat/nat.conf


我们还可以通过“cat /proc/11080/cmdline”的方法找到,这里不多说了。

总之,我们找到了这两个服务的配置文件:“/etc/vmware/vmnet8/dhcpd/dhcpd.conf”和“/etc/vmware/vmnet8/nat/nat.conf”。


2. 修改DHCP配置文件,实现VMware为虚拟机分配固定IP的功能:


[root@SPVM02 ~]# vi /etc/vmware/vmnet8/dhcpd/dhcpd.conf
......
####### VMNET DHCP Configuration. End of "DO NOT MODIFY SECTION" #######

host spvmwin7a {
        hardware ethernet 00:0C:29:F1:5D:46;
        fixed-address 192.168.187.200;
}


我们在配置文件的最后添加上述文本。

其中"spvmwin7a"是个主机名,其实随便填就好了,只要别跟配置文件里的其他host重名就成;

Guest网卡的MAC地址“00:0C:29:F1:5D:46”可以通过在Guest命令行中使用Windows命令“ipconfig /all”获得;

固定IP地址“192.168.187.200”即为所要分配给这台Guest网卡的IP地址。


3. 修改NAT配置文件,实现Host到Guest的端口转发:


[root@SPVM02 ~]# vi /etc/vmware/vmnet8/nat/nat.conf
......
[incomingtcp]

# Use these with care - anyone can enter into your VM through these...
# The format and example are as follows:
#<external port number> = <VM‘s IP address>:<VM‘s port number>
#8080 = 172.16.3.128:80

9000 = 192.168.187.200:3389

我们在配置文件的[incomingtcp]这个section里添加上面这行文本。

它表示将发往Host 9000端口的TCP请求,转发到192.168.187.200(Guest)的3389端口。


注:3389为Microsoft Remote Desktop服务的默认监听端口。



4. 重启VMware的DHCP和NAT服务:


我们需要重启VMware的dhcpd和natd进程,刚才的改动才能生效。

坑爹的地方来了,我翻遍了互联网和官方的文档,也没找到如何重启这两个进程。

网上有文章说执行“/usr/lib/vmware/net-services.sh restart”来重启网络相关进程,但可能是因为VMware版本不太一样,我找了半天也没找到类似的脚本。

跟朋友商量后,还是用了kill命令然后手动运行的这两个进程,效果是没有问题的。

直到后来,我才试出了对应的命令:

[root@SPVM02 ~]# /usr/bin/vmware-networks --stop
Stopped Bridged networking on vmnet0
Stopped DHCP service on vmnet8
Stopped NAT service on vmnet8
Disabled hostonly virtual adapter on vmnet8
Stopped all configured services on all networks

[root@SPVM02 ~]# /usr/bin/vmware-networks --start
Started Bridge networking on vmnet0
Started NAT service on vmnet8
Enabled hostonly virtual adapter on vmnet8
Started DHCP service on vmnet8
Started Network detection service
Started all configured services on all networks

[root@SPVM02 ~]# /usr/bin/vmware-networks --status
Bridge networking on vmnet0 is running
DHCP service on vmnet8 is running
NAT service on vmnet8 is running
Hostonly virtual adapter on vmnet8 is enabled
Network detection service is not running
All the services configured on all the networks are running


5. 验证配置:

首先我们来到Guest的命令行,使用“ipconfig /renew”来刷新网络连接,IP地址从“192.168.187.128”变成了“192.168.187.200”,说明我们对DHCP的更改生效了。

然后我们打开Windows的“远程访问”功能,赘述一下方法:右键“计算机”选择“属性”,点击左边“远程设置”,在弹出的对话框中“远程桌面”的地方选择允许远程计算机连接。

再在Host所在网络中,找一台Windows的主机,“开始”>"运行"中输入"mstsc"尝试连接一下“135.100.101.102:9000”,如果提示输入凭证以登陆Windows,就说明端口转发的设置生效了。


再说第二种方法,其实在Linux中端口转发是一件非常容易的事情。

我们可以简单地建立一个端口映射关系来解决这个问题,使用的时候只需要在Host执行一个命令即可搞定:

ssh -Nf -L 135.100.101.102:3390:192.168.187.200:3389 localhost


至于命令的含义,这里就不再赘述了,感兴趣的朋友请自行参阅“man ssh”。



下面说一些调试过程中可能会用上的技巧:


如果连不上Guest的远程桌面,首先在外网ping一下Host,在Host中ping一下Guest,然后再检查一下Windows防火墙。

在Guest检查服务是否正常,“开始”>"运行"中输入"mstsc"尝试连接一下自己“192.168.187.200:3389”,如果说是“正在运行一个会话”那么就说明服务是正常的,换个端口试下就知道连不通是怎么提示的了。



参考文献:

1. 《LINUX下的VMWARE的端口映射》 http://blog.chinaunix.net/uid-12290680-id-26867.html

2. <Using VMware Workstation - VMware Workstation 8> http://www.vmware.com/pdf/ws80-using.pdf

3. <BSD General Commands Manual - SSH(1)>


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。