Estou tentando entender a diferença entre os diferentes tipos de interfaces (virtuais) (por exemplo, TUN/TAP, veth etc.) e estava estudando alguns desses tipos dentro do contexto de containers.
É possível enviar pacotes entre um contêiner (em seu próprio namespace de rede) para o namespace de rede do host usando apenas interfaces TUN/TAP ou é necessário um par de veth (uma extremidade em cada namespace) para fazer isso?
Do meu entendimento, as interfaces TUN/TAP só podem ser usadas para enviar/receber pacotes de/para o espaço do usuário de/para a pilha de rede correspondente ao espaço de nomes de rede dessa interface e não enviar pacotes entre espaços de nomes de rede. Isso está correto?
Uma interface tun/tap sempre pertence a algum aplicativo: os pacotes enviados para a interface são lidos pelo aplicativo e os pacotes escritos pelo aplicativo entram na pilha de rede do kernel por meio dessa interface.
Normalmente, você conectará o namespace de rede com pares de ethernet virtuais (veth). Eles apenas encaminham pacotes para a outra interface do par.
Nada impede você de escrever um aplicativo que faça exatamente isso: abra duas interfaces tun/tap, leia os pacotes de uma e encaminhe para a outra e vice-versa. Também existem aplicativos prontos que você pode usar para fazer isso, por exemplo,
socat
.Você pode até escrever dois aplicativos, onde cada aplicativo abre uma única interface tun/tap e os aplicativos se comunicam entre si usando outros meios e implementam o encaminhamento dessa maneira. Basicamente, todos os aplicativos VPN funcionam dessa maneira (embora para aplicativos VPN "por outros meios" seja normalmente "através de uma conexão de rede existente", isso realmente não conta).
Então, sim, com o(s) aplicativo(s) certo(s), você pode conectar namespaces com interfaces tun/tap. No entanto, em geral, não faz muito sentido fazer isso, porque você precisa escrever tal aplicativo e será menos eficiente do que apenas usar um par de veth.
Editar
Eu tentei mover uma interface tun
socat
para um namespace de redens0
que criei e funciona bem como eu esperava, apesarsocat
de ser executado no namespace de rede principal:e então você novamente tem que definir o endereço para
tun0b
depois da mudança.Portanto, o "crossover" acontece por ter uma (ou ambas) interface(s) de rede tun/tap em um namespace diferente do processo.