KVM使用NAT联网并为VM配置iptables端口转发
1 | https://www.ilanni.com/?p=7016 |
1-1. KVM为VM配置NAT网络
我们可以通过如下命令,查看NAT是否开启。如下:
1 | virsh net-list |
通过上图,我们可以看到NAT方式已经开启。而且default是宿主机安装VM支持模块的时候自动安装的。
1-2. 我们也可以查看,系统中已经存在的网卡。
1 | ifconfig |
通过上图,我们可以看出网卡virbr0就是NAT方式连接网络时,所使用到的网卡
1-3. 通过配置文件,来查看NAT方式的DHCP地址池,该配置文件为:/etc/libvirt/qemu/networks/default.xml
1 2 3 | 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. 创建虚拟机时如下命令
1 2 3 | qemu-img create -f qcow2 /home/images/kvm31.img 20G virt-install --name kvm31 --ram 2048 --vcpus=2 --os-type=windows --accelerate --cdrom=/home/iso/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 |
其中
1 | --network network=default //就是指默认网络配置default.也就是这里的NAT |
同时有关硬盘的格式与接口模式也一定要注意
1 | --disk path=/home/images/kvm31.img,format=qcow2,bus=ide |
1-5. 默认情况下VM此时使用的DHCP方式获取IP地址,可以ping www.baidu.com 可以通.
这边以kvm11 [192.168.122.159] 为例
1 | ssh root@192.168.122.159 |
1 2 3 | cd /etc/sysconfig/network-scripts ls cat ifcfg-eth0 |
如果你在安装系统时未进行网络配置。我们现在修改VM使用静态IP地址
1 | ssh root@192.168.122.159 |
1 | vi /etc/sysconfig/network-scripts/ifcfg-eth0 |
1 2 3 4 5 | BOOTPROTO=static //以前是dhcp ONBOOT=yes //以前是no IPADDR=192.168.122.159 GATEWAY=192.168.122.1 NETMASK=255.255.255.0 |
1 | systemctl restart network.service |
就发现已经ping www.baidu.com 不通了.
1-6. 现在切换到KVM服务器[是笔记本,不是kvm11],开启KVM服务器的IP转发功能
1 | vi /etc/sysctl.conf |
增加以下代码
1 | net.ipv4.ip_forward=1 // [也可换成 echo net.ipv4.ip_forward=1>>/etc/sysctl.conf ]原本是 net.ipv4.ip_forward=0 ,可是我这台没有这条.不知道为什么 |
1 | sysctl -p |
1-7. 我们还要开启KVM服务器的IPtables的转发功能,使用如下命令:
1 | 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]
1 | vi /etc/resolv.conf |
1 2 | nameserver 8.8.8.8 nameserver 8.8.4.4 |
1 | 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规则:[https://www.cnblogs.com/whych/p/9147900.html]
1 2 | 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这个网关转发出去。
现在我们来实际效果,如下:
1 | ssh -p 8022 root@192.168.50.146 |
发现一打开就被关闭.是被防火墙阻止了.
2-2. 打开防火墙
1 2 3 4 5 6 7 8 9 | 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 //列出添加的端口 |
代码分析
1 2 3 | --zone #作用域 --add-port=1935/tcp //添加端口,格式为:端口/通讯协议 --permanent //永久生效,没有此参数重启后失效 |
最后一步不知道怎么处理,就是没成功.
清空规则
1 2 3 4 5 6 7 8 9 | 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链的默认规则更改 |