Configure o adaptador de túnel para o cliente VPN no Ubuntu 16.04 Desktop?

1

Estou tentando configurar uma rede para uma biblioteca VPN CLIENT personalizada.

O que não consigo descobrir

Eu preciso poder encaminhar o tráfego em uma configuração normal de VPN para que meu script C ++ possa ler / gravar no túnel. Se não me engano, a configuração deve ser algo assim:

       Normal Setup           How I think my setup should be
------------------------------------------------------------
Start → Aplication → Finish    Start → Aplication → Finish
          ↓   ↑                          ↓   ↑ 
       iface-enp0s3                   iface-enp0s3
          ↓   ↑                          ↓   ↑
        interwebs                      iface-tun1
                                         ↓   ↑
                                       c++ script
                                         ↓   ↑
                                       vpn-server
                                         ↓   ↑
                                       interwebs

Eu sei que o meu script C ++ não faz isso atualmente, atualmente apenas lê os dados do adaptador tun1 . Por enquanto, é tudo o que estou tentando alcançar. No entanto, parece que não consigo fazer as rotas funcionarem corretamente.

Quando visito o link do sistema do meu cliente, quero ver esses pacotes exibidos no script C ++ e o tráfego não deve ser onde .

Depois que eu conseguir rotear corretamente todo o tráfego excluindo a porta em que a VPN está conectada por meio do script C ++ usando a interface de túnel, começarei a enviá-lo por meio da biblioteca cliente VPN. / p>

O script C ++ funciona atualmente, tanto quanto eu sei. Quando eu pingar 10.0.0.2 (o adaptador tun1 ), posso ver os pacotes passarem.

Eu tentei algumas coisas diferentes, a saber:

sudo iptables -t nat -A POSTROUTING --out-interface tun1 -j MASQUERADE
sudo iptables -A FORWARD --in-interface enp0s3 -j ACCEPT

Isso não funcionou.

Note: I've already made sure that net.ipv4.ip_forward is set to 1 and I've run sudo sysctl -p.

Veja abaixo as informações sobre a configuração atual.

Note: I'm running Ubuntu 16.04 Desktop.

Meus adaptadores atuais

Note: enp0s3 is my primary adapter. This is running on a virtual machine. enp0s3 is my connection to the internet.

enp0s3    Link encap:Ethernet  HWaddr 08:00:27:ea:97:d2  
           inet addr:10.0.2.15  Bcast:10.0.2.255  Mask:255.255.255.0
           inet6 addr: fe80::8ec8:60b7:f404:77c5/64 Scope:Link
           UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
           RX packets:58668 errors:0 dropped:0 overruns:0 frame:0
           TX packets:39067 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:1000 
           RX bytes:39002535 (39.0 MB)  TX bytes:7442839 (7.4 MB)

tun1      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
           inet addr:10.0.0.1  P-t-P:10.0.0.2  Mask:255.255.255.255
           inet6 addr: fe80::fed9:4107:8688:8501/64 Scope:Link
           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
           RX packets:0 errors:0 dropped:0 overruns:0 frame:0
           TX packets:16 errors:0 dropped:0 overruns:0 carrier:0
           collisions:0 txqueuelen:500 
           RX bytes:0 (0.0 B)  TX bytes:984 (984.0 B)

Como eu configuro meu adaptador tun1

$ sudo ip tuntap add dev tun1 mode tun

$ sudo ifconfig tun1 10.0.0.1 dstaddr 10.0.0.2 up

O script em C ++ que eu escuto tun1

 // Includes ommited.

 using namespace std;

 typedef void data_receiver(char* data, int length);

 struct receive_handle {
     data_receiver* receiver;
 } typedef receive_handle;

 // Function used to retrieve the interface.
 static int if_nametofd(char *name)
 {
     int interface = open("/dev/net/tun", O_RDWR | O_NONBLOCK);
     ifreq ifr;
     memset(&ifr, 0, sizeof(ifr));
     ifr.ifr_flags = IFF_TUN | IFF_NO_PI;
     strncpy(ifr.ifr_name, name, sizeof(ifr.ifr_name));
     if (ioctl(interface, TUNSETIFF, &ifr)) {
         perror("Cannot get TUN interface");
         exit(1);
     }

     return interface;
 }

 // Called when a packet is received from the tun0 interface.
 void received_data(char* data, int length)
 {
     // Truncate the packet so that we only see the first 15 bytes.
     // This way we don't spam the console.
     for(int i=0; i<15; ++i)
         std::cout << std::hex << (int)data[i];

     std::cout << endl;
 }

 int main()
 {
     cout << "Getting interface..." << endl;

     int iface = if_nametofd("tun1");
     cout << "Using interface: " << iface << endl;

     cout << "Creating handler..." << endl;
     receive_handle* handle = (receive_handle*)malloc(sizeof(receive_handle));
     handle->receiver = received_data;

     char packet[1024];
     cout << "Listening..." << endl;
     while (true)
     {
         if (read(iface, packet, sizeof(packet)) > 0) {
             handle->receiver(packet, sizeof(packet));
         }
     }

     return 0;
 }

Essa finalidade somente de scripts é travar no adaptador tun1 e ler continuamente a partir dele.

por Nathan Fiscaletti 01.04.2018 / 19:22

1 resposta

1

Você precisa alterar o gateway padrão de sua estação de trabalho. Se você emitir o seguinte comando, verá o gateway padrão do sistema.

ip route show table main
default via 1.2.3.4 dev wanif

Você pode alterá-lo usando ip route replace (caminho ip-route).

Melhor, você pode usar o truque vpn aberto para sobrescrever a rota padrão, sem ter que excluí-la (--redirect-gateway def1).

Este trabalho, adicionando duas rotas cobrindo todo o espaço de endereçamento IPv4. Como cada uma dessas duas rotas é mais específica que a rota padrão, a rota padrão é praticamente substituída.

Isso é feito assim:

ip route add 0.0.0.0/1 via 10.0.2.15 dev tun1
ip route add 128.0.0.0/1 via 10.0.2.15 dev tun1

em que 10.0.2.15 é o ponto final do seu túnel.

já que seu script precisa se conectar em algum lugar "via interweb regular" para fornecer algum serviço de encapsulamento significativo, você precisa adicionar seu ponto de extremidade remoto para evitar ser coberto pela regra acima:

ip route add 7.8.9.10/32 via 1.2.3.4 dev wanif

em que 7.8.9.10 é seu ponto de extremidade remoto e 1.2.3.4 seu gateway padrão do ISP.

Lembre-se das regras básicas das regras de roteamento: as mais específicas se aplicam às menos específicas

    
por 01.04.2018 / 20:09