我使用 libvirt 安装了一个服务器,并创建了一个测试虚拟机。当我使用默认网络作为其接口时,它会获得一个私有 IP,NAT 似乎工作正常。我安装了 OpenVPN,所以我有一个 tun0 接口,现在我想在该虚拟机上进行 NAT(tun0 在 172.16.0.0 上有一个私有 IP,我无法控制 vpn 服务器,也无法在那里获取更多私有 IP)。我使用与默认网络相同的参数创建了网络,但使用 10.99.0.0 作为 DHCP(因为为什么不呢),但当我尝试从虚拟机 ping 互联网上的某个东西时,我得到了一个 icmp-port-unreachable。
以下是 iptables 中的前向链:
0 0 ACCEPT all -- tun0 vpn0 0.0.0.0/0 10.99.0.0/16 ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- vpn0 tun0 10.99.0.0/16 0.0.0.0/0
0 0 ACCEPT all -- vpn0 vpn0 0.0.0.0/0 0.0.0.0/0
0 0 REJECT all -- * vpn0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
15 1244 REJECT all -- vpn0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 ACCEPT all -- eno1 virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- virbr0 eno1 192.168.122.0/24 0.0.0.0/0
0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0
0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
如您所见,eno1 是默认网络通过 virbr0 使用的通向互联网的接口,而 tun0 是通过 vpn0 接口使用的 vpn 接口(我在 libvirt 的配置中就是这样命名的)。查看数字,出于某种原因,第 5 条规则是匹配的。
是否有可能 libvirt 没有正确使用 tun0 接口,而是由于某种原因,尝试通过 eno1 进行 NAT?
这是它的配置:
<network connections='1'>
<name>vpn</name>
<uuid>2a641009-63db-a0d9-dac2-6204748786db</uuid>
<forward dev='tun0' mode='nat'>
<nat>
<port start='1024' end='65535'/>
</nat>
<interface dev='tun0'/>
</forward>
<bridge name='vpn0' stp='on' delay='0'/>
<mac address='52:54:00:c2:05:79'/>
<ip address='10.99.99.254' netmask='255.255.0.0'>
<dhcp>
<range start='10.99.99.10' end='10.99.99.250'/>
</dhcp>
</ip>
</network>
我看不出它与默认网络有什么区别,除了默认网络可以工作。
谢谢您的帮助
答案1
当 libvirt 设置 NAT 时,它不会强制流量流向任何特定的物理 NIC。主机的路由规则控制 NAT 流量将流向何处。换句话说,如果使用默认的 libvirt 虚拟网络,流量应该能够流向你的默认 NIC eno1或者根据客户尝试连接的目标 IP 地址,通过 tun0 连接到 VPN。当您在配置中添加规则 <interface dev='tun0'/> 时,这只是告诉 libvirt 阻止到除 tun0 之外的任何 NIC 的流量。换句话说,假设 virbr0 的原始默认配置确实不是已设置 <interface ..>',那么它应该“刚好”适用于您的 VPN。列出的 iptables 规则显示“eno1”,这表明您有一个 <interface dev='eno1'> 规则 - 您只需删除该规则即可