Назад | Перейти на главную страницу

NAT-соединение через vpn с libvirt

Я установил сервер с libvirt и создал тестовую виртуальную машину. Когда я использую сеть по умолчанию для его интерфейса, он получает частный IP-адрес, и NAT, похоже, работает нормально. Я установил OpenVPN, поэтому у меня есть интерфейс tun0, на котором я хочу использовать NAT для этой виртуальной машины (tun0 имеет частный IP-адрес на 172.16.0.0, у меня нет контроля над vpn-сервером, и у меня нет возможности получить там больше частных IP-адресов). Я создал сеть с теми же параметрами, что и сеть по умолчанию, но с использованием 10.99.0.0 для DHCP (почему бы и нет), но когда я пытаюсь выполнить эхо-запрос в Интернете с виртуальной машины, я получаю сообщение 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 - это интерфейс vpn, используемый через интерфейс vpn0 (так я назвал его в конфигурации libvirt). Глядя на число, по какой-то причине подходит пятое правило.

Возможно ли, что libvirt неправильно использует интерфейс tun0, а вместо этого по какой-то причине пытается выполнить NAT через eno1?

Вот его конфиг:

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

Я не вижу никакой разницы с сетью по умолчанию, за исключением того, что сеть по умолчанию работает.

Спасибо за помощь

Когда libvirt устанавливает NAT, он не заставляет трафик течь к какой-либо конкретной физической сетевой карте. Правила маршрутизации хоста определяют, куда будет проходить трафик NAT. IOW, при использовании виртуальной сети libvirt по умолчанию трафик должен иметь возможность проходить либо на вашу сетевую карту по умолчанию eno1 или к VPN через tun0, в зависимости от того, к какому целевому IP-адресу пытается подключиться гость. Когда вы добавляете в конфигурацию правило <interface dev = 'tun0' />, это просто указывает libvirt блокировать трафик к любому NIC, кроме tun0. IOW, предполагая исходную конфигурацию по умолчанию для virbr0, сделал не если установлен <interface ..>, то он должен "просто работать" с вашим VPN. В списке ваших правил iptables отображается 'eno1', что предполагает наличие правила <interface dev = 'eno1'> - вы можете просто удалить это правило