KVM NAT(网络地址转换模式)
NAT(网络地址转换模式)
使用NAT模式,就是让虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问公网。也就是说,使用NAT模式可以实现在虚拟系统里访问互联网。很显然,如果你只有一个外网地址,此种方式很合适。
KVM虚拟机Nat方式上网:
virsh net-list
查看当前活跃的网络,可以看到一个default网络,这个就是一个默认的Nat网络了。
virsh net-dumpxml default
可以查看该网络的详细配置如下:
<network> <name>default</name> <uuid>75dbebde-fc15-4350-8a06-f1432f9e6d30</uuid> <forward mode='nat'> <nat> <port start='1024' end='65535'/> </nat> </forward> <bridge name='virbr0' stp='on' delay='0' /> <mac address='52:54:00:bc:f2:65'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254' /> </dhcp> </ip> </network>
可以看到该网络搭建在一个网桥virbr0上,这个网桥在安装并启动libvirt的时候自动生成。然后在客户机的XML配置文件中添加标签interface内容如下:
<interface type='network'> <mac address='52:54:00:c7:18:b5'/> <source network='default'/> <model type='virtio'/> <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/> </interface>
则可以让客户机用nat方式来上网了,经验证,客户机可以获取到122网段,2到254之间的一个ip地址。
我们可以直接编辑修改default网络的配置:
virsh net-edit default
也可以直接将default网络干掉,然后再重新定义:
virsh net-undefine default
重新创建一个default.xml文件,自定义其中的内容,可以指定某个mac地址对应某个ip,指定某个ip段。例如下面的内容,name对应的是客户机的名字。
<network> <name>default</name> <uuid>dc69ff61-6445-4376-b940-8714a3922bf7</uuid> <forward mode='nat'/> <bridge name='virbr0' stp='on' delay='0' /> <mac address='52:54:00:81:14:18'/> <ip address='192.168.122.1' netmask='255.255.255.0'> <dhcp> <range start='192.168.122.2' end='192.168.122.254' /> <host mac='00:25:90:eb:4b:bb' name='guest1' ip='192.168.5.13' /> <host mac='00:25:90:eb:34:2c' name='guest2' ip='192.168.7.206' /> <host mac='00:25:90:eb:e5:de' name='guest3' ip='192.168.7.207' /> <host mac='00:25:90:eb:7e:11' name='guest4' ip='192.168.7.208' /> <host mac='00:25:90:eb:b2:11' name='guest5' ip='192.168.7.209' /> </dhcp> </ip> </network>
然后用命令:
virsh net-define default.xml virsh net-start default
启用一个客户机,检查网络时候可用。
端口转发
下面均为介绍iptables相关内容,如果愿意使用rinetd或者其他的工具,或者使用桥接模式的,可以不用看了。
如果需要远程管理我们可以使用自带的vnc,但如果认为vnc不如系统自带的3389或ssh方便,我们可将NAT网络内的端口转发出来。
操作完上面第三步内开启转发的功能后,进行如下操作。
注:第四步已经将防火墙关闭,现在是在关闭防火墙的环境下操作,如果要开启防火墙,请自行检查iptables规则是否与防火墙冲突。
下面两条规则为将宿主机的2009端口,自动转发到虚机的3389端口。
iptables -t nat -A PREROUTING -p tcp --dport 2009 -j DNAT --to-destination 192.168.122.101:3389 iptables -t nat -A POSTROUTING -p tcp --dport 2009 -d 192.168.122.101 -j SNAT --to 192.168.122.1
开启转发后一直不通,因为对iptables不熟,这个坑了我2天,网上查询资料后,终于解决。因为默有两条拒绝规则,删除即可。
首先将规则列出:
iptables -nL -v --line-numbers -t filter
会有两条如下规则:
4 7 420 REJECT all — * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 5 0 0 REJECT all — virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
然后删除这两条规则,删除两次第四条即可,因为删除第四条后,第五条又变成第四条了。
iptables -D FORWARD 4 -t filter #删除编号为4的FORWARD规则
然后进行保存并重启iptables服务:
service iptables save #保存规则
service iptables resart #重启服务
转发端口即可工作了。
下面要有一个大坑介绍。
我们上面已经了“save”保存了,但宿主机重启后,iptables自行恢复,屏蔽规则也恢复了,端口转发又无法工作了。
因为在centos7下,需要把配置写入文件,然后开机后再从配置文件读取才可以。目前只找到这个方法。
iptables-save > /etc/sysconfig/iptables #文件路径可自行指定。
在 /etc/rc.local内加入如下内容;
iptables-restore < /etc/sysconfig/iptables
service iptables save
service iptables restart
好了,现在全部搞定了!!
另外由于宿主机映射到外网的端口是由网管分配,附一条转发本地ssh端口的iptables规则。
-A PREROUTING -p tcp -m tcp --dport 3000 -j REDIRECT --to-ports 22