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.