¿Configurar el adaptador de túnel para el cliente VPN en Ubuntu 16.04 Desktop?

¿Configurar el adaptador de túnel para el cliente VPN en Ubuntu 16.04 Desktop?

Estoy intentando configurar una red para una VPN personalizadaCLIENTEbiblioteca.


Lo que no puedo entender

Necesito poder reenviar el tráfico en una configuración VPN normal para que mi script C++ pueda leer/escribir en el túnel. Si no me equivoco la configuración debería ser algo como esto:

       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

Sé que mi script C++ actualmente no hace esto, actualmente solo lee datos del tun1adaptador. Por el momento, eso es todo lo que intento lograr. Sin embargo, parece que no puedo hacer que las rutas funcionen correctamente.

cuando visitohttp://google.comdesde mi sistema cliente, quiero ver esos paquetes mostrados en el script C++ y que el tráfico no vaya a ningún otro lugar.

Una vez que pueda enrutar adecuadamente todo el tráficoexcluyendo el puertoque la VPN está conectada a través del script C++ usando la interfaz del túnel, comenzaré a enviarla a través de la biblioteca del cliente VPN.

El script C++ funciona actualmente, hasta donde yo sé. Cuando hago ping a 10.0.0.2 (el tun1adaptador), puedo ver que llegan los paquetes.

He probado algunas cosas diferentes, a saber, las siguientes:

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

Esto no funcionó.

Nota: ya me aseguré de que net.ipv4.ip_forwardesté configurado en 1y lo ejecuté sudo sysctl -p.

Consulte a continuación para obtener información sobre la configuración actual.

Nota: estoy ejecutando Ubuntu 16.04 Desktop.


Mis adaptadores actuales

Nota: enp0s3 es mi adaptador principal. Esto se ejecuta en una máquina virtual. enp0s3 es mi conexión 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)

Cómo configuro mi tun1adaptador

$ sudo ip tuntap agregar dev tun1 modo tun

$ sudo ifconfig tun1 10.0.0.1 dstaddr 10.0.0.2 en adelante


El script C++ que estoy escuchandotun1

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

El único propósito de estos scripts es engancharse al tun1adaptador y leerlo continuamente.


Respuesta1

Debe cambiar la puerta de enlace predeterminada de su estación de trabajo. Si emite el siguiente comando, verá la puerta de enlace predeterminada de su sistema.

ip route show table main
default via 1.2.3.4 dev wanif

Puede cambiarlo utilizando ip route replace (man ip-route).

Mejor aún, puedes usar el truco open vpn para anular la ruta predeterminada, sin tener que eliminarla (--redirect-gateway def1).

Esto funciona agregando dos rutas que cubren todo el espacio de direcciones IPv4. Como cada una de estas dos rutas es más específica que la ruta predeterminada, la ruta predeterminada prácticamente se anula.

Esto se hace así:

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

donde 10.0.2.15 es el punto final local de su túnel.

Dado que su secuencia de comandos necesita conectarse en algún lugar "a través de la Internet normal" para proporcionar algún servicio de túnel significativo, debe agregar su punto final remoto de esta manera para evitar estar cubierto por la regla anterior:

ip route add 7.8.9.10/32 via 1.2.3.4 dev wanif

donde 7.8.9.10 es su punto final remoto y 1.2.3.4 su puerta de enlace predeterminada de ISP.

Recuerde las reglas básicas de las reglas de enrutamiento: las más específicas se aplican sobre las menos específicas

información relacionada