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

Настройка iptables при работе виртуальных машин KVM через мост VLAN

В настоящее время я настраиваю виртуализированную среду с KVM, которая охватывает два физических хост-компьютера (Host1 и Host2). Оба подключены к одной VLAN. Сетевые интерфейсы на обеих машинах настроены следующим образом:

auto lo
iface lo inet loopback

auto enp4s0
iface enp4s0 inet static
    address <<public-IP>>
    netmask <<netmask>>
    gateway <<gateway>>

auto enp4s0.4000
iface enp4s0.4000 inet manual
    vlan-raw-device enp4s0
    mtu 1400

auto br0
iface br0 inet static
    address 192.168.100.<<1 or 2, depending on the host>>/24
    bridge_ports enp4s0.4000

Виртуальные машины подключаются к сети следующим образом:

<interface type='bridge'>
  <mac address='52:54:00:91:64:64'/>
  <source bridge='br0'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>

и:

auto ens3
iface ens3 inet static
    address 192.168.100.<<101 or 102, depending on the VM>>/24
    gateway 192.168.100.<<1 or 2, depending on the host>>

Пока все работает очень хорошо. С виртуальных машин я могу проверить связь с обоими хостами, а также со всеми другими виртуальными машинами на обеих машинах. Я также могу получить доступ к Интернету, теперь, когда я включил NAT, добавив следующее правило iptables:

iptables -t nat -A POSTROUTING -o enp4s0 -j MASQUERADE

Но теперь возникает проблема: хотя я могу пинговать все хосты в VLAN с любого компьютера в VLAN, я не могу правильно подключиться к службам TCP, работающим внутри виртуальных машин. Вот мои наблюдения:

Что меня действительно удивляет, так это то, что ping работает, а curl - нет. Мне (не очень опытному в работе с сетями) кажется, что это какая-то проблема с настройкой iptables. Вот как iptables настроен в настоящее время на обоих хостах (запущенных и iptables -t nat -L -nv:

Выход iptables -L -nv:

Chain INPUT (policy ACCEPT 31 packets, 3143 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain FORWARD (policy ACCEPT 5 packets, 520 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 23 packets, 4089 bytes)
 pkts bytes target     prot opt in     out     source               destination

Выход iptables -t nat -L -nv:

Chain PREROUTING (policy ACCEPT 19 packets, 1313 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 6 packets, 352 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   13   961 MASQUERADE  all  --  *      enp4s0  0.0.0.0/0            0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Я даже пытался использовать tcpdump при попытке установить соединение netcat между Host1 (nc -l 4444) и Host2 (nc 192.168.100.2 4444). Кажется, что нет пробок.

Вот как настраивается iptables на виртуальных машинах:

Выход iptables -L -nv:

Chain INPUT (policy ACCEPT 31 packets, 3143 bytes)
 pkts bytes target     prot opt in     out     source               destination    
    6   399 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0   tcp dpt:80 ctstate NEW,ESTABLISHED   

Chain FORWARD (policy ACCEPT 5 packets, 520 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 23 packets, 4089 bytes)
 pkts bytes target     prot opt in     out     source               destination
    4  1066 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0   tcp spt:80 ctstate ESTABLISHED  

Выход iptables -t nat -L -nv:

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination              

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Я работаю над этим уже два дня и не могу понять. Любая помощь будет принята с благодарностью.

Я только что сам разобрался в проблеме. Когда я писал запрос в службу поддержки своему хостинг-провайдеру, я подумал о дополнительном брандмауэре, который они предлагают. Я предположил, что он охватывает только общедоступный IP-адрес, а не частную подсеть в VLAN. Однако после выключения этого брандмауэра теперь все работает, как ожидалось!