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 tun1
adaptador. 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 tun1
adaptador), 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_forward
esté configurado en1
y 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 tun1
adaptador
$ 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 tun1
adaptador 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