В настоящее время я настраиваю виртуализированную среду с 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. Однако после выключения этого брандмауэра теперь все работает, как ожидалось!