Qemu虚拟机tap网络后端访问外网的方式
正如https://wiki.qemu.org/Documentation/Networking所述,Qemu以-net user方式创建的网络是不支持ping的,我一般用-netdev tap,id=hn2 -device e1000,netdev=hn2创建网络,利用主机的tap0设备和NAT实现虚拟机访问外网的功能,本以为host上应该能找到对应的iptable NAT规则,但是iptable -F去掉所有规则后发现VM中ping 公网地址依然是可以通的。经过调查发现是libvirt作的NAT,如下命令可以看到libvirt的default网络forward mode是NAT, default网络是libvirtd启动后默认创建的网络。看来不显示的创建iptable规则也能作NAT,具体代码可能要看kernel中bridge相关的,后续需要查证。
sudo virsh net-edit default
<network> <name>default</name> <uuid>168f6909-715c-4333-a34b-f74584d26328</uuid> <forward mode='nat'/> <bridge name='virbr0' stp='on' delay='0'/> <mac address='52:54:00:48:3f:0c'/> <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>
FYI:
https://linuxconfig.org/how-to-use-bridged-networking-with-libvirt-and-kvm
https://wiki.libvirt.org/page/Networking