Como utilizar o túnel TUN / TAP do programa do usuário?

9

Descobri recentemente a existência de interfaces Linux TUN / TAP e ainda estou tentando entendê-las. Acho que entendi o conceito básico - são criados pseudo-dispositivos que emulam uma interface de rede e, em vez de passar dados para o hardware, são passados ​​para um programa no espaço do usuário.

Como você direcionaria um programa não relacionado para utilizar esse túnel?

Por exemplo, antes da criação do túnel, meu sistema contém apenas eth0 e lo, a interface Ethernet normal (conectada à minha rede local) e a interface de loopback. Depois que um programa cria e configura um túnel, tenho uma nova interface gr0, que forneci um endereço IP que está na minha rede local, mas não está em uso (portanto, estamos todos na mesma sub-rede). Como eu faria um programa independente utilizar esse 'túnel'? Digamos que eu tenha uma mensagem Python simples transmitindo um aplicativo cliente / servidor que utilize uma conexão TCP, como eu poderia configurá-lo para usar o túnel?

Peço desculpas se estou sentindo falta de algo básico, mas como sempre, consegui me confundir no esquema das coisas. Novamente, tudo o que eu quero é que um programa TCP simples utilize esse túnel.

Obrigado!

Mr. Shickadance
fonte

Respostas:

7

Nem sempre é "túnel". TUN / TAP são apenas drivers específicos da NIC. Do ponto de vista da pilha de rede, eles agem como qualquer outra interface de rede: podem ter endereços IP, podem ser interfaces ponto a ponto ou broadcast. As regras de roteamento também se aplicam a elas. Mas todo o tráfego que é gravado em uma dessas interfaces de rede vai para algum programa do espaço do usuário para processamento, e todos os dados gravados pelo programa do espaço do usuário diretamente /dev/tunXparecem pacotes de entrada para a pilha de rede.

Na configuração de encapsulamento usual, o servidor e o cliente têm dispositivos TUN com endereços atribuídos. As tabelas de roteamento configuradas nos dois direcionam o tráfego necessário para esses dispositivos TUN. Quando o pacote é roteado para tun0, o kernel envia para o programa userspace (cliente) que envia esse pacote para outro programa na máquina remota (servidor) via, por exemplo, conexão TCP. Na máquina remota, outro programa (servidor) recebe o pacote do cliente e o grava em seu próprio /dev/tunXdispositivo, "injetando" esse pacote na pilha de rede. E pacotes encapsulados são processados ​​como qualquer outro.

gelraen
fonte
11
Portanto, a resposta (para meus propósitos) é configurar a tabela de roteamento para direcionar o tráfego para essas interfaces. Esse é o ponto que estou perdendo, mas agora devo encontrar uma solução. Além disso, agradeço a explicação, pois ela esclarece as coisas. Obrigado!
Sr. Shickadance 28/03
2
Acabei usando "route add <TUN IP ADDR> dev gr0". Isso me permitiu redirecionar o tráfego através da nova interface. Obrigado novamente!
Sr. Shickadance 29/03