KVM使用NAT联网并为VM配置iptables端口转发

KVM使用NAT联网并为VM配置iptables端口转发

1
https://www.ilanni.com/?p=7016

1-1. KVM为VM配置NAT网络

我们可以通过如下命令,查看NAT是否开启。如下:

1
virsh net-list

1.png

通过上图,我们可以看到NAT方式已经开启。而且default是宿主机安装VM支持模块的时候自动安装的。

1-2. 我们也可以查看,系统中已经存在的网卡。

1
ifconfig

1.png

通过上图,我们可以看出网卡virbr0就是NAT方式连接网络时,所使用到的网卡

1-3. 通过配置文件,来查看NAT方式的DHCP地址池,该配置文件为:/etc/libvirt/qemu/networks/default.xml

1
2
3
cd /etc/libvirt/qemu/networks/
pwd
more default.xml

1.png

通过上图我们可以看出,目前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

1.png
1.png

如果你在安装系统时未进行网络配置。我们现在修改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.png

1
systemctl restart network.service

1.png

就发现已经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.png

1
sysctl -p

1.png

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.png

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

1.png
1.png

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.png

最后一步不知道怎么处理,就是没成功.
1.png

清空规则

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链的默认规则更改

Leave a Reply

Your email address will not be published. Required fields are marked *