Como fazer aliases macvlan alcançáveis em namespaces diferentes?

2

Eu tenho

  • uma interface, nome eth0 , no meu namespace de rede principal
  • outra interface, nome jail0 , em um namespace de rede alternativo (nome name0 ). Este namespace é usado por um ambiente preso.
  • jail0 é um macvlan alias de eth0 .

Eu vejo a rede sem nenhum problema, do meu sistema principal e também da minha cadeia.

No entanto, não consigo pingar um ao outro .

Por que isso acontece? Eu gostaria de torná-los acessíveis.

Nenhuma das interfaces de rede existe no espaço de nomes das outras.

    
por peterh 24.10.2017 / 20:18

2 respostas

2
A interface

macvlan pode ser usada em diferentes modos que alteram como os dados transmitidos entre duas instâncias macvlan são tratados. O modo padrão é vepa (Virtual Ethernet Port Aggregation), o que possivelmente é o motivo pelo qual sua configuração não funciona.

Descrição resumida dos modos comuns que você pode querer configurar:

  • vepa data é transmitido pela interface física, para comunicação entre instâncias do macvlan, o switch precisa suportar o modo hairpin ou deve haver um roteador IP encaminhando os pacotes.

  • private nenhuma comunicação entre as instâncias do macvlan permitidas, mesmo que o comutador externo suporte o modo hairpin.

  • bridge permite a comunicação direta entre instâncias, o tráfego entre as instâncias do macvlan não é transmitido no link físico.

Você provavelmente quer usar o macvlan no modo bridge . Para a comunicação entre a instância macvlan e o espaço de nomes que contém a própria interface de rede, é necessário criar uma instância macvlan no mesmo espaço de nomes de rede (principal / anfitrião). Para obter detalhes e explicações, consulte resposta de A.B .

Para documentação completa (e os outros modos), veja man 8 ip-link .

    
por 24.10.2017 / 20:32
3

Para completar a resposta aceita, o modo de ponte é o caminho mais fácil, mas não é suficiente para obter a comunicação.

Quando a instância jail tenta efetuar ping no host, ele envia uma solicitação ARP para obter seu IP. Como o host não possui uma instância macvlan, o pacote será transmitido diretamente no link físico (o corolário da definição do modo bridge). O host nunca verá este pacote, então não pode responder: nenhuma resposta de ping. O outro jeito é o mesmo: o host emite todos os seus pacotes para a LAN física real, nenhum pacote do host jamais irá para a interface macvlan do container (cadeia ...).

O truque é criar uma segunda interface macvlan, também no modo bridge, destinada ao host: isso irá integrar o host com o tráfego do container / jail.

host# ip link add link eth0 name hostmvl0 type macvlan mode bridge

Depois, há dois métodos:

  • mesmo IP em ambas as interfaces

    pro: nenhuma alteração na eth0 ou nas suas configurações, por exemplo, sem problemas com o DHCP do host.
    con: alguma complexidade, não pode ter transmissões indo em todos os lugares.

    Atribua o IP do host (igual a eth0) nele, sem lan route padrão ( noprefixroute ) ou isso pode confundir o roteamento de todos os hosts:

    host# ip addr add hostip/netmask dev hostmvl0 noprefixroute
    host# ip link set hostmvl0 up
    

    Para cada contêiner (prisão ...) adicione sua rota através da interface macvlan do host em vez da real:

    host# ip route add jailip/32 dev hostmvl0
    

    Agora tudo vai funcionar (exceto que uma transmissão (ping, udp ...) do host não será vista pelo container / jail porque será roteada em eth0).

    Nota: a nova interface recebe um endereço MAC aleatório. Ela pode ser definida com um address xx:xx:xx:xx:xx:xx adicional na criação, mas não pode ser a real (eth0) na criação. Apenas a cadeia verá esse endereço MAC.

  • IP na interface macvlan do host, interface física sem IP

    pro: configuração de rede mais comum, nenhum caso especial (por exemplo: a transmissão do host funciona em todos os lugares), nenhuma configuração de rota adicional por contêiner.
    con: requer a remoção das configurações de rede da eth0 e as migra para hostmvl0. O endereço MAC mudará (a menos que algum outro hack seja feito para impedi-lo), portanto, pode afetar um cliente DHCP.

    Como sugerido por sebasth, pode-se simplesmente remover o IP da eth0 e considerar a nova placa de rede "principal" como hostmvl0. É claro que se houver algum serviço gerenciando isso, mude-o para lá. Melhor sempre definir o mesmo endereço MAC, senão ele mudaria na rede a cada reinicialização, isso é desaprovado no ambiente de negócios.

    host# ip addr del hostip/netmask dev eth0 #careful, connectivity is lost
    host# ip link set hostmvl0 address xx:xx:xx:xx:xx:xx
    host# ip addr add hostip/netmask dev hostmvl0
    host# ip link set hostmvl0 up
    host# ip route add default via usualrouterip
    

    Se você usar o DHCP, o MAC mudou, o IP também. Pode-se mudar o MAC da eth0 para poder reutilizar seu original para hostmvl0. Algumas ferramentas às vezes são muito inteligentes quando isso é feito. Esta discussão sobre o Archlinux pode conter informações sobre como evitar que o NetworkManager reverta as configurações.

por 25.10.2017 / 01:05