libvirt 默认给了两个网络配置,一个是 NAT,一个是 routed,正常情况下,使用 NAT 可以访问互联网,但是端口转发失效,使用 routed 端口转发有效,但是不能访问互联网。

使用 routed 网卡加伪装

解决方案也非常简单,改用 routed 网卡,然后添加伪装即可

sudo firewall-cmd --add-masquerade --permanent
sudo firewall-cmd --reload

然后按照正常的方式配置端口转发

sudo firewall-cmd --add-forward-port=port=13389:proto=tcp:toaddr=192.168.100.196:toport=3389
 
sudo firewall-cmd --add-port=13389/tcp --zone=libvirt-routed

上面的方法有个问题就是虚拟机不能访问物理机,会被一条防火墙规则拦住,如果要使用物理机的代理就不行

[1059303.451015] filter_IN_policy_libvirt-to-host_REJECT: IN=virbr1 OUT= MAC=52:54:00:00:b0:72:52:54:00:90:e9:e2:08:00 SRC=192.168.100.158 DST=192.168.100.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=44103 DF PROTO=TCP SPT=50370 DPT=80 WINDOW=64240 RES=0x00 SYN URGP=0 

临时解决方案

还是使用 NAT 网卡,然后把主机当成跳板机。