Estou tentando usar um GRE Tunnel (ou TAP) para conectar uma VM de peso leve de namespace de rede Linux local à máquina HOST local. Tudo aparece para funcionar, exceto que as respostas do host não retornam para a VM.
Minha configuração:
IP real do HOST: 10.1.101.101/24
HOST GRE (Configuração assim):
ip l add dev gre1 type gretap remote 10.1.101.101 local 10.1.101.101 key 101
ip a add dev gre1 10.201.0.2/24
ip l set dev gre1 up
Configuração de rede do HOST:
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:30:1b:42:65:ac brd ff:ff:ff:ff:ff:ff
inet 10.1.101.101/24 brd 10.1.101.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::230:1bff:fe42:65ac/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
link/ether 00:50:04:d0:50:0f brd ff:ff:ff:ff:ff:ff
82: gre0@NONE: <NOARP> mtu 1476 qdisc noop state DOWN group default
link/gre 0.0.0.0 brd 0.0.0.0
83: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
84: gre1@NONE: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 65494 qdisc pfifo_fast state UNKNOWN group default qlen 1000
link/ether e2:83:0d:a4:cc:23 brd ff:ff:ff:ff:ff:ff
inet 10.201.0.2/24 scope global gre1
valid_lft forever preferred_lft forever
inet6 fe80::e083:dff:fea4:cc23/64 scope link tentative dadfailed
valid_lft forever preferred_lft forever
Rotas do HOST:
ip r
default via 10.1.101.1 dev eth0
10.1.101.0/24 dev eth0 proto kernel scope link src 10.1.101.101
10.201.0.0/24 dev gre1 proto kernel scope link src 10.201.0.2
169.254.0.0/16 dev eth0 scope link metric 1000
O iptables do HOST está em branco (IE: iptables -F
)
Configuração de rede da VM:
ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: gre0@NONE: <NOARP> mtu 1476 qdisc noop state DOWN group default
link/gre 0.0.0.0 brd 0.0.0.0
3: gretap0@NONE: <BROADCAST,MULTICAST> mtu 1462 qdisc noop state DOWN group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
114: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:00:00:aa:00:00 brd ff:ff:ff:ff:ff:ff
inet 10.201.0.1/24 brd 10.201.0.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::200:ff:feaa:0/64 scope link
valid_lft forever preferred_lft forever
Rotas da VM:
ip r
10.201.0.0/24 dev eth0 proto kernel scope link src 10.201.0.1
Agora faça o ping do HOST 10.201.0.2
da VM 10.201.0.1
e capture os pacotes:
tcpdump -ni gre1
no HOST:
11:57:36.379404 ARP, Request who-has 10.201.0.2 tell 10.201.0.1, length 28
11:57:36.379431 ARP, Reply 10.201.0.2 is-at e2:83:0d:a4:cc:23, length 28
11:57:36.379455 ARP, Reply 10.201.0.2 is-at e2:83:0d:a4:cc:23, length 28
11:57:37.376634 ARP, Request who-has 10.201.0.2 tell 10.201.0.1, length 28
11:57:37.376658 ARP, Reply 10.201.0.2 is-at e2:83:0d:a4:cc:23, length 28
11:57:37.376683 ARP, Reply 10.201.0.2 is-at e2:83:0d:a4:cc:23, length 28
11:57:38.376539 ARP, Request who-has 10.201.0.2 tell 10.201.0.1, length 28
11:57:38.376567 ARP, Reply 10.201.0.2 is-at e2:83:0d:a4:cc:23, length 28
11:57:38.376596 ARP, Reply 10.201.0.2 is-at e2:83:0d:a4:cc:23, length 28
tcpdump -ni eth0
na VM:
11:57:36.379243 ARP, Request who-has 10.201.0.2 tell 10.201.0.1, length 28
11:57:37.376384 ARP, Request who-has 10.201.0.2 tell 10.201.0.1, length 28
11:57:38.376384 ARP, Request who-has 10.201.0.2 tell 10.201.0.1, length 28
Assim, a AFAICS envia a solicitação ARP para o HOST, o HOST responde ao ARP (corretamente), mas o pacote ARP não volta através do túnel GRE?
Nota 1: A VM é criada por um produto chamado CORE Emulator e consiste em um roteador básico anexado a um GRE Node , este nó aponta para 10.1.101.101
e a chave é 101
Nota 2: Se, em vez de usar o Core Emulator localmente, eu o executo em uma máquina diferente, mas com as mesmas configurações, a mesma configuração funciona corretamente (usando 10.1.101.101).
Eu também tentei configurar o HOST GRE Tunnel para:
ip l add gre1 type gretap remote 127.0.0.1 local 127.0.0.1 key 101
e o nó da VM GRE para apontar para 127.0.0.1
mas recebo o mesmo resultado, o ARP é visto e respondido pelo HOST, mas não é visto pela VM.
EDIT 1:
Em resposta ao meu problema do "mundo real", o CORE me fornece uma solução adequada, conforme descrito aqui: link
EDIT 2: pergunta subseqüente?
É possível que uma VM "Container / Rede Linux namespace / LXC" etc se comunique com a máquina HOST por meio de um túnel GRE. Os pontos de extremidade do túnel GRE seriam algo como HOST:127.0.0.1
to VM:?.?.?.?
(Esses pontos de interrogação me levam à conclusão de que, embora a VM possa enviar para 127.0.0.1, o HOST não tem um caminho de retorno para a VM, que pode ser por isso que o ARP, na minha pergunta inicial, não chega à VM).
Obrigado por ler isto, qualquer ajuda é muito apreciada.