Гостевой unikernel на KVM не может связаться с хостом, но хост может связаться с гостем

Гостевой unikernel на KVM не может связаться с хостом, но хост может связаться с гостем

Я пытаюсь сделать rumpkernel (https://github.com/rumpkernel) запустить на KVM, подключиться к сокету на хосте и отправить некоторые данные.

Я могу предоставить хосту доступ к гостю, используя следующий пример nginx: https://github.com/rumpkernel/wiki/wiki/Tutorial%3A-Serve-a-static-website-as-a-Unikernel

По сути, я делаю следующее:

ip tuntap add tap0 mode tap
ip addr add 10.0.0.10/24 dev tap0
ip link set dev tap0 up 

Затем запустите rumprun с параметрами:

rumprun kvm -i -M 128 \
        -I if,vioif,'-net tap,script=no,ifname=tap0'\
        -W if,inet,static,10.0.0.11/24 \
        -b images/data.iso,/data \
        -- <my python script>

Где скрипт python открывает сокет (0.0.0.0:2010) и слушает. Затем на хосте я могу сделать:

nc 10.0.0.11 2010

И я вижу, что он подключается. Проблема в том, что я не могу сделать наоборот. Теперь у меня есть гостевой kvm, открывающий сокет и пытающийся подключиться:

with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:                                                                                       
   ip = "10.0.0.10"
   try:
       s.connect( (ip, 9999) )
       #send some data

И запускаем тот же скрипт, который слушает, как и раньше, привязываясь к 10.0.0.10:9999. Гость просто застревает при попытке подключения и в конечном итоге истекает время ожидания.

Я перепробовал почти все, что смог найти в сети, в итоге остановился на мосте с IP 10.0.0.10 и добавил к нему tap0. Затем я просмотрел br0 и получил следующее (удалив несколько строк):

15:38:46.173914 ARP, Request who-has 10.0.0.11 tell 10.0.0.11, length 28
...
15:38:46.500262 ARP, Request who-has 10.0.0.10 tell 10.0.0.11, length 28
15:38:46.500288 ARP, Reply 10.0.0.10 is-at 0e:ec:XX:XX:XX:XX (oui Unknown), length 28
15:38:46.500440 IP 10.0.0.11.52886 > 10.0.0.10.9999: Flags [S], seq 20858086, win 32768, options [mss 1460,nop,wscale 3,sackOK,nop,nop,nop,nop,TS val 1 ecr 0], length 0

Что заставляет меня думать, что маршрут есть, но пакет почему-то не доходит. Я пробовал отключить фильтрацию в sys.d

net.bridge.bridge-nf-call-ip6tables = 0
net.bridge.bridge-nf-call-iptables = 0
net.bridge.bridge-nf-call-arptables = 0

И по-прежнему ничего.

Есть идеи, как это сделать? Я не хочу подключать eth0, потому что это удаленный сервер, и гостю в данный момент не нужны внешние соединения.

решение1

Ну что ж, я уже целый день пытаюсь решить эту проблему, и, конечно же, после того, как я задаю здесь вопрос, я нахожу ответ.

Намек был в этом:Настройте FirewallD, чтобы разрешить сетевой доступ к виртуальным машинам через мост.

Я проверил iptables и логи и нашел это в /var/log/ufw.log

Dec  5 15:38:46 xxxx kernel: [516010.193395] [UFW BLOCK] IN=br0 OUT= MAC=... SRC=10.0.0.11 DST=10.0.0.10 LEN=64 TOS=0x00 PREC=0x00 TTL=64 ID=

0 DF PROTO=TCP SPT=52886 DPT=9999 ОКНО=32768 RES=0x00 SYN URGP=0

Оказывается, работает брандмауэр, который блокирует соединение. Я добавил новое правило, как указано здесь: https://help.ubuntu.com/community/UFW и теперь это работает. Судя по всему.

Связанный контент