使用 libvirt 通过 VPN 进行 NAT

使用 libvirt 通过 VPN 进行 NAT

我使用 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'> 规则 - 您只需删除该规则即可

相关内容