KVM使用NAT联网并为VM配置iptables端口转发
[https://www.ilanni.com/?p=7016]
1-1. KVM为VM配置NAT网络
我们可以通过如下命令,查看NAT是否开启。如下:
virsh net-list
通过上图,我们可以看到NAT方式已经开启。而且default是宿主机安装VM支持模块的时候自动安装的。
1-2. 我们也可以查看,系统中已经存在的网卡。
ifconfig
通过上图,我们可以看出网卡virbr0就是NAT方式连接网络时,所使用到的网卡
1-3. 通过配置文件,来查看NAT方式的DHCP地址池,该配置文件为:/etc/libvirt/qemu/networks/default.xml
cd /etc/libvirt/qemu/networks/
pwd
more default.xml
通过上图我们可以看出,目前NAT使用的IP地址池是192.168.122.2-192.168.122.254,网关为192.168.122.1,子网掩码为255.255.255.0
1-4. 创建虚拟机时如下命令
qemu-img create -f qcow2 /home/images/kvm31.img 20G
virt-install --name kvm31 --ram 2048 --vcpus=2 --os-type=windows --accelerate --cdrom=/home/ios/zh-Hans_windows_web_server_2008_x64_dvd_x14-26154.iso --disk path=/home/images/kvm31.img,format=qcow2,bus=ide --network network=default --video=vga --vnc --vncport=5931 --vnclisten=0.0.0.0 --force --autostart
其中
--network network=default //就是指默认网络配置default.也就是这里的NAT
同时有关硬盘的格式与接口模式也一定要注意
--disk path=/home/images/kvm31.img,format=qcow2,bus=ide
1-5. 默认情况下VM此时使用的DHCP方式获取IP地址,可以ping www.baidu.com 可以通.
这边以kvm11 [192.168.122.159] 为例
ssh root@192.168.122.159
cd /etc/sysconfig/network-scripts
ls
cat ifcfg-eth0
如果你在安装系统时未进行网络配置。我们现在修改VM使用静态IP地址
ssh root@192.168.122.159
vi /etc/sysconfig/network-scripts/ifcfg-eth0
BOOTPROTO=static //以前是dhcp
ONBOOT=yes //以前是no
IPADDR=192.168.122.159
GATEWAY=192.168.122.1
NETMASK=255.255.255.0
systemctl restart network.service
就发现已经ping www.baidu.com 不通了.
1-6. 现在切换到KVM服务器[是笔记本,不是kvm11],开启KVM服务器的IP转发功能
vi /etc/sysctl.conf
增加以下代码
net.ipv4.ip_forward=1 // [也可换成 echo net.ipv4.ip_forward=1>>/etc/sysctl.conf ]原本是 net.ipv4.ip_forward=0 ,可是我这台没有这条.不知道为什么
sysctl -p
1-7. 我们还要开启KVM服务器的IPtables的转发功能,使用如下命令:
iptables -t nat -A POSTROUTING -o br0 -j MASQUERADE
注意该命令中的网卡时br0,而不是eth0
1-8. 此时,我们再切换VM[kvm11]中测试的网络通信情况。如下:
发现ping www.baidu.com 不通,但 ping 182.61.200.7 能通
1-9. 解决 name or service not known
虚拟机[kvm11]
vi /etc/resolv.conf
nameserver 8.8.8.8
nameserver 8.8.4.4
systemctl restart network.service
2. 为VM配置iptables端口转发
假设该KVM的公网IP为192.168.50.146,VM的IP为192.168.122.159,现在我要求通过访问KVM的8022端口访问VM的22端口
要想达到上述功能,我们需要在KVM服务器上[笔记本上]设置如下IPtables规则:[]
iptables -t nat -A PREROUTING -d 192.168.50.146 -p tcp -m tcp --dport 8022 -j DNAT --to-destination 192.168.122.159:22
iptables -t nat -A POSTROUTING -s 192.168.122.255/255.255.255.0 -d 192.168.122.159 -p tcp -m tcp --dport 22 -j SNAT --to-source 192.168.50.146
注意这两条IPtables规则:
第一条规则很好理解,就是把所有访问192.168.50.146:8022的请求转发到192.168.122.159:22的端口上。
第二条规则我的理解是,把所有来自192.168.122.0/255.255.255.0网段访问192.168.122.159:22的数据全部通过192.168.122.1这个网关转发出去。
现在我们来实际效果,如下:
ssh -p 8022 root@192.168.50.146
发现一打开就被关闭.是被防火墙阻止了.
2-2. 打开防火墙
systemctl start firewalld.service
firewall-cmd --zone=public --add-port=5901-6100/tcp --permanent //添加一个端口5901-6100
firewall-cmd --zone=public --add-port=8022/tcp --permanent //添加一个端口8022
firewall-cmd --zone=public --add-port=873/tcp --permanent //添加一个端口873
firewall-cmd --zone=public --add-port=80/tcp --permanent //添加一个端口80
firewall-cmd --zone=public --add-port=443/tcp --permanent //添加一个端口443
firewall-cmd --reload //重新加载规则
firewall-cmd --list-port //列出添加的端口
代码分析
--zone #作用域
--add-port=1935/tcp //添加端口,格式为:端口/通讯协议
--permanent //永久生效,没有此参数重启后失效
最后一步不知道怎么处理,就是没成功.
清空规则
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT //ssh
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT //http
sudo iptables -I INPUT 1 -i lo -j ACCEPT //保持彼此之间的通信--[成功]
sudo iptables -P INPUT DROP //INPUT链的默认规则更改