Я хочу запустить гостевую систему qemu-kvm с Debian 9 в качестве ОС на хосте Debian 10. Хост подключен к локальной сети, и я хотел бы, чтобы гость был «видимым» для локальной сети, как если бы это было обычное устройство, подключенное напрямую к сети. Для этого я настроил мост под названием br0
на хосте путем редактирования /etc/network/interfaces
следующим образом:
auto lo
iface lo inet loopback
allow-hotplug eth0
auto eth0
iface eth0 inet manual
up ifconfig eth0 promisc up
down ifconfig eth0 promisc down
auto br0
iface br0 inet static
hwaddress ether 08:60:6e:69:4a:b5
address 192.168.1.11
netmask 255.255.255.0
gateway 192.168.1.1
bridge_ports eth0
bridge_stp on
bridge_fd 0
MAC-адрес, настроенный для моста, такой же, как и у моего eth0
интерфейс.
После этого изменения сеть моего хоста, похоже, работает нормально.
С помощью sudo virsh edit debian9
(где debian9
это имя гостя), я отредактировал сетевой интерфейс по умолчанию следующим образом:
<interface type='bridge'>
<mac address='52:54:00:bc:8c:97'/>
<source bridge='br0'/>
<model type='virtio'/>
<address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>
Внутри гостя я назначил статический IP-адрес, отредактировав /etc/network/interfaces
следующим образом, поскольку он не получил IP-адрес с использованием DHCP:
source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
allow-hotplug enp1s0
auto enp1s0
iface enp1s0 inet static
address 192.168.1.13
netmask 255.255.255.0
gateway 192.168.1.1
Кажется, что гость правильно отображается в br0
мост на хосте, когда я делаю sudo brctl show
:
bridge name bridge id STP enabled interfaces
br0 8000.08606e694ab5 yes eth0
vnet0
docker0 8000.024202321e8f no veth7291e29
virbr0 8000.5254005aa541 yes virbr0-nic
Теперь хост может правильно подключиться к гостю (например, с помощью ping или ssh), а гость может правильно подключиться к хосту, но другие устройства в той же локальной сети не могут получить доступ к гостю, или наоборот.
Я подозреваю, что это должно быть связано с какой-то проблемой брандмауэра / маршрутизации на хосте, но я не уверен, как это диагностировать дальше. Ниже приводится результат работы iptables -S
на хосте. Я сам не настраивал какие-либо правила iptables: большинство из них связаны с сетью NAT libvirt по умолчанию или установкой докера на хосте:
-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
-A DOCKER -d 172.17.0.1/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8050 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
Есть ли у кого-нибудь предложения, как я могу сделать гостя "видимым" в локальной сети?
Это происходит потому, что FORWARD
политика сети DROP
.
Вы могли бы использовать
iptables -I FORWARD -i br0 -j ACCEPT
iptables -I FORWARD -o br0 -j ACCEPT
принимать весь перенаправленный трафик из / в br0
интерфейс.
Это также причина, по которой клиент не получает адрес через DHCP. Пакеты DHCP от клиента отбрасываются FORWARD
политика.