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

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

Estou tentando configurar uma rede para uma VPN personalizadaCLIENTEbiblioteca.


O que eu não consigo descobrir

Preciso ser capaz de encaminhar o tráfego em uma configuração VPN normal para que meu script C++ possa ler/gravar no túnel. Se não me engano, a configuração deveria ser mais ou menos 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 meu script C++ atualmente não faz isso, atualmente ele apenas lê dados do tun1adaptador. Por enquanto, isso é tudo o que estou tentando alcançar. No entanto, não consigo fazer as rotas funcionarem corretamente.

Quando eu visitohttp://google.comdo meu sistema cliente, quero ver esses pacotes exibidos no script C++ e o tráfego não ir para nenhum outro lugar.

Assim que eu conseguir rotear corretamente todo o tráfegoexcluindo o portoSe a VPN estiver conectada por meio do script C++ usando a interface de túnel, começarei a enviá-la por meio da biblioteca do cliente VPN.

O script C++ funciona atualmente, até onde eu sei. Quando faço ping em 10.0.0.2 (o tun1adaptador), posso ver os pacotes chegando.

Eu tentei algumas coisas diferentes, nomeadamente o seguinte:

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

Isso não funcionou.

Nota: já me certifiquei de que net.ipv4.ip_forwardestá definido 1e executei o sudo sysctl -p.

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

Nota: estou executando o Ubuntu 16.04 Desktop.


Meus adaptadores atuais

Nota: enp0s3 é meu adaptador principal. Isso está sendo executado em uma máquina virtual. enp0s3 é minha conexão com a 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 configuro meu tun1adaptador

$ sudo ip tuntap adicionar dev tun1 modo tun

$ sudo ifconfig tun1 10.0.0.1 dstaddr 10.0.0.2 up


O script C++ que estou ouvindotun1

 // 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;
 }

O único objetivo deste script é travar o tun1adaptador e lê-lo continuamente.


Responder1

Você precisa alterar o gateway padrão da sua estação de trabalho. Se você emitir o comando a seguir, 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 (man ip-route).

Melhor, você pode usar o truque open vpn para substituir a rota padrão, sem precisar excluí-la (--redirect-gateway def1).

Isso funciona adicionando duas rotas cobrindo todo o espaço de endereços 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

onde 10.0.2.15 é o endpoint local do seu túnel.

como seu script precisa se conectar em algum lugar "por meio da interweb normal" para fornecer algum serviço de tunelamento significativo, você precisa adicionar seu endpoint remoto assim para evitar ser coberto pela regra acima:

ip route add 7.8.9.10/32 via 1.2.3.4 dev wanif

onde 7.8.9.10 é seu endpoint 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

informação relacionada