La continuaci贸n del
art铆culo sobre c贸mo logr茅 organizar un t煤nel VPN directo entre dos computadoras ubicadas detr谩s de los proveedores de NAT. El 煤ltimo art铆culo describi贸 el proceso de organizar una conexi贸n con un tercero: un intermediario (un VPS alquilado que act煤a como un servidor STUN y un transmisor de datos de nodo para una conexi贸n). En este art铆culo, le dir茅 c贸mo prescindir de VPS, pero los intermediarios permanecieron y fueron el servidor STUN y Yandex.Disk ...

Introduccion
Despu茅s de leer los comentarios de la 煤ltima publicaci贸n, me di cuenta de que el principal inconveniente de la implementaci贸n era el uso de un intermediario, un tercero (VPS) que indicaba los par谩metros actuales del nodo, d贸nde y c贸mo conectarse. Dadas las recomendaciones para usar este STUN (hay
muchas ) para determinar los par谩metros de conexi贸n actuales. En primer lugar, decid铆 mirar el contenido de los paquetes usando TCPDump cuando el servidor STUN estaba trabajando con clientes y recib铆a contenido completamente ilegible. Googleando el protocolo se encontr贸 con un
art铆culo que describe el protocolo . Me di cuenta de que no puedo implementar la solicitud al servidor STUN yo mismo y puse la idea en el "cuadro lejano".
Teor铆a
Recientemente tuve que instalar un servidor STUN en Debian desde un paquete
y en las dependencias vi el paquete aturdidor-cliente, pero de alguna manera no le di importancia a esto. Pero m谩s tarde, record茅 sobre el paquete aturdidor-cliente y decid铆 averiguar c贸mo funciona, buscando en Google y Poindeksiv que recib铆:
En respuesta, recib铆:
Cliente STUN versi贸n 0.97
Puerto abierto 21234 con fd 3
Puerto abierto 21235 con fd 4
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 0
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 4
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 2
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Mensaje de aturdimiento recibido: 92 bytes
MappedAddress = <Mi IP>: 2885
SourceAddress = 216.93.246.18//478
ChangedAddress = 216.93.246.17lla479
Atributo desconocido: 32800
ServerName = Vovida.org 0.98-CPC
Mensaje recibido del tipo 257 id = 1
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 0
A punto de enviar un mensaje de len 28 a 216.93.246.17lla478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 4
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 2
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 0
A punto de enviar un mensaje de len 28 a <Mi IP>: 2885
Mensaje de aturdimiento recibido: 28 bytes
ChangeRequest = 0
Mensaje recibido de tipo 1 id = 11
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 0
A punto de enviar un mensaje de len 28 a 216.93.246.17lla478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 4
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 2
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Mensaje de aturdimiento recibido: 92 bytes
MappedAddress = <Mi IP>: 2885
SourceAddress = 216.93.246.17lla479
ChangedAddress = 216.93.246.18 {478
Atributo desconocido: 32800
ServerName = Vovida.org 0.98-CPC
Mensaje recibido del tipo 257 id = 10
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 4
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 2
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 4
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 2
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 4
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 2
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 4
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 2
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 4
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
Codificar mensaje de aturdimiento:
Solicitud de cambio de codificaci贸n: 2
A punto de enviar un mensaje de len 28 a 216.93.246.18 opin478
prueba I = 1
prueba II = 0
prueba III = 0
prueba I (2) = 1
es nat = 1
IP asignada igual = 1
horquilla = 1
puerto de conservador = 0
Primario: mapeo independiente, filtro dependiente del puerto, puerto aleatorio, horquilla
El valor de retorno es 0x000006
Cadena con valor
MappedAddress = <Mi IP>: 2885
justo lo que necesitas! Mostraba el estado actual de la conexi贸n en el puerto UDP local 21234. Pero esto es solo la mitad de la batalla, surgi贸 la pregunta de c贸mo transferir estos datos a un host remoto y establecer una conexi贸n VPN. Usando el protocolo de correo, 驴tal vez Telegram? Hay muchas opciones y decid铆 usar Yandex.Disk, ya que encontr茅
un art铆culo sobre c贸mo Curl funciona a trav茅s de WebDav con Yandex.Disk . Despu茅s de pensar en la implementaci贸n, llegu茅 a este esquema:
- Para indicar que los nodos est谩n listos para establecer una conexi贸n por la presencia de un archivo espec铆fico con una marca de tiempo en Yandex.disk;
- Si los nodos est谩n listos, obtenga los par谩metros actuales del servidor STUN;
- Suba los par谩metros actuales a Yandex.Disk;
- Verifique la disponibilidad y lea los par谩metros de un sitio remoto desde un archivo en Yandex.Disk;
- Establezca una conexi贸n a un host remoto utilizando OpenVPN.
Practica
Despu茅s de pensar un poco, teniendo en cuenta la experiencia del art铆culo anterior, escrib铆 un gui贸n r谩pido. Necesitaremos:
En realidad, el gui贸n en s铆 mismo:
Opci贸n inicial
Para ejecutar el script necesitas:
- Copie en el portapapeles y p茅guelo en el editor, por ejemplo:
- especifique el nombre de usuario y la contrase帽a de Yandex.Disk.
- en el campo "--ifconfig 10.45.54. (1 o 2) 255.255.255.252" especifique la direcci贸n IP interna de la interfaz
- crear secret.key con el comando:
- hacer que el script sea ejecutable:
- ejecuta el script:
donde nZbVGBuX5dtturD es la ID de conexi贸n generada aqu铆
En el nodo remoto, haga lo mismo excepto por la generaci贸n de secret.key y la conexi贸n de ID, deben ser id茅nticos.
Versi贸n actualizada (para un funcionamiento correcto, la hora debe estar sincronizada):
cat vpn10.sh
Para ejecutar el script necesitas:
- Copie en el portapapeles y p茅guelo en el editor, por ejemplo:
- especifique inicio de sesi贸n (segunda l铆nea) y contrase帽a de Yandex.Disk (tercera l铆nea).
- especifique la direcci贸n IP interna del t煤nel (cuarta l铆nea).
- hacer que el script sea ejecutable:
- ejecuta el script:
donde nZbVGBuX5dtturD es la ID de conexi贸n generada aqu铆
En el nodo remoto, haga lo mismo, especifique la direcci贸n IP interna correspondiente del t煤nel y la conexi贸n de ID.
Para iniciar el script al inicio, uso el comando "nohup / <ruta al script> /vpn10.sh nZbVGBuX5dtturD> /var/log/vpn10.log 2> / dev / null &" contenido en el archivo /etc/rc.local
Conclusi贸n
El script funciona, probado en Ubuntu 18.04 y Debian 9. Puede usar cualquier otro servicio como transmisor, pero por la experiencia utilic茅 Yandex.Disk.
En el curso de los experimentos, se descubri贸 que algunos tipos de proveedores de NAT no permiten una conexi贸n. Principalmente con operadores m贸viles donde los torrents est谩n bloqueados.
Planeo finalizar en t茅rminos de:
- La generaci贸n autom谩tica de secret.key cada vez que inicie, cifre y copie a Yandex.Disk para transferir a un host remoto (tomado en cuenta en la versi贸n actualizada)
- Asignar autom谩ticamente direcciones IP de interfaz
- Cifrado de datos antes de subir a Yandex.Disk
- Optimizaci贸n de c贸digo
隆Que haya IPv6 en cada hogar!