O unikernel convidado no KVM não pode alcançar o host, mas o host pode alcançar o convidado

O unikernel convidado no KVM não pode alcançar o host, mas o host pode alcançar o convidado

Estou tentando fazer um kernel de alcatra (https://github.com/rumpkernel) executado em KVM, conecte-se a um soquete no host e envie alguns dados.

Consigo fazer com que o host acesse o convidado usando o exemplo nginx aqui: https://github.com/rumpkernel/wiki/wiki/Tutorial%3A-Serve-a-static-website-as-a-Unikernel

Praticamente o que eu faço é:

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

Em seguida, inicie o rumprun com os parâmetros:

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>

Onde o script python abre um soquete (0.0.0.0:2010) e escuta. Então no host eu posso fazer:

nc 10.0.0.11 2010

E posso ver isso se conectando. O problema é que não posso fazer o contrário. Agora tenho o convidado kvm abrindo um soquete e tentando conectar:

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

E executando o mesmo script que escuta como antes, vinculando 10.0.0.10:9999. O convidado fica preso ao tentar se conectar e eventualmente expira.

Tentei quase tudo que encontrei online, acabei com uma ponte com IP 10.0.0.10 e adicionei tap0 a ela. Então bisbilhotei o br0 e obtive o seguinte (removi algumas linhas):

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

O que me faz pensar que existe uma rota, mas de alguma forma o pacote não chega. Tentei desativar a filtragem em sys.d

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

E ainda nada.

Alguma idéia de como fazer isso funcionar? Não quero conectar minha eth0 porque é um servidor remoto e o convidado não precisa de conexões externas neste momento.

Responder1

Bem, estou tentando resolver isso há um dia e, claro, depois de postar uma pergunta aqui, encontro a resposta.

A dica estava nisso:Configure o FirewallD para permitir acesso à rede de máquinas virtuais em ponte

Eu verifiquei iptables e logs e encontrei isso em /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 JANELA=32768 RES=0x00 SYN URGP=0

Acontece que há um firewall em execução e estava bloqueando a conexão. Eu adicionei uma nova regra conforme especificado aqui: https://help.ubuntu.com/community/UFW e está funcionando agora. Aparentemente.

informação relacionada