É possível enviar pacotes entre namespaces de rede usando apenas interfaces TUN / TAP?

0

Estou tentando entender a diferença entre diferentes tipos de interfaces (virtuais) (por exemplo, TUN / TAP, veth etc.) e estava estudando alguns desses tipos no contexto de contêineres.

É 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 um par veth (uma extremidade em cada namespace) necessário para fazer isso?

Do meu ponto de vista, 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 namespace de rede dessa interface e não enviar pacotes entre namespaces de rede. Está correto?

    
por dippynark 15.11.2018 / 16:43

1 resposta

0

Uma interface tun / tap sempre pertence a algum aplicativo: os pacotes enviados para a interface são lidos pelo aplicativo e os pacotes gravados pelo aplicativo entram na pilha de rede do kernel por meio dessa interface.

Normalmente, você conectará o namespace da rede com pares de ethernet virtuais (veth). Eles apenas encaminham pacotes para a outra interface do par.

Nada impede que você escreva um aplicativo que faz exatamente isso: Abra duas interfaces tun / tap, leia pacotes de um e encaminhe para o outro, e vice-versa. Há também 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", então isso não conta realmente).

Portanto, com os aplicativos corretos, você pode conectar namespaces com interfaces tun / tap. No entanto, em geral, não faz muito sentido fazer isso, porque você tem que escrever tal aplicativo, e será menos eficiente do que apenas usar um par de veth.

Editar

Eu tentei mover uma interface tun de socat para um namespace de rede ns0 que criei, e ela funciona bem como eu esperava, apesar de socat estar em execução no namespace de rede principal:

socat TUN:10.1.0.254/24,tun-name=tun0a,iff-up TUN:10.1.0.1/24,tun-name=tun0b
ip link set tun0b netns ns0

e, em seguida, você precisa definir novamente o endereço para tun0b após a mudança.

Assim, o "crossover" acontece com uma (ou ambas) interface (s) de rede tun / tap em um namespace diferente do processo.

    
por 16.11.2018 / 09:42