Este artículo trata sobre cómo logré iniciar el servidor VPN detrás del NAT del proveedor doméstico (sin una dirección IP blanca). Debo decir de
inmediato que el
rendimiento de esta implementación depende directamente del tipo de NAT utilizado por su proveedor, así como del enrutador .
Entonces, necesitaba conectarme desde mi teléfono inteligente Android a la computadora de mi casa, ambos dispositivos están conectados a Internet a través de los proveedores de NAT, además la computadora está conectada a través de un enrutador doméstico, que también tiene conexiones NAT.
El esquema clásico que utiliza un VPS / VDS arrendado con una dirección IP blanca, así como el alquiler de una dirección IP blanca del proveedor, no se consideró por varias razones.
Basado en la
experiencia de artículos anteriores , habiendo realizado varios experimentos con STUN y proveedores de NAT. Me decidí por un pequeño experimento ejecutando el comando en un enrutador doméstico que funciona con firmware OpenWRT:
$ stun stun.sipnet.ru
obtuvo el resultado:
Cliente STUN versión 0.97
Primario: mapeo independiente, filtro independiente, puerto aleatorio, horquilla
El valor de retorno es 0x000002
Traducción literal
Mapeo independiente - Mapeo independiente
Filtro independiente - Filtro independiente
puerto aleatorio - puerto aleatorio
se horquilla - habrá una horquilla
Habiendo ejecutado un comando similar en mi PC, obtuve:
Cliente STUN versión 0.97
Primario: mapeo independiente, filtro dependiente del puerto, puerto aleatorio, horquilla
El valor de retorno es 0x000006
Filtro dependiente del puerto - filtro dependiente del puerto
La diferencia en la salida de los comandos indicó que el enrutador doméstico hizo su contribución al proceso de transmisión de paquetes desde Internet, esto se manifestó en el hecho de que al ejecutar el comando en la computadora:
stun stun.sipnet.ru -p 11111 -v
Obtuve el resultado:
...
MappedAddress = XX.1XX.1X4.2XX: 4398
...
en este momento, se abrió una sesión UDP por un tiempo, si en ese momento se envió una solicitud UDP (por ejemplo: netcat XX.1XX.1X4.2XX 4398 -u), entonces la solicitud llegó al enrutador doméstico, lo cual fue confirmado por TCPDump ejecutándose en él, pero la solicitud no llegó a la computadora; IPtables lo dejó en el enrutador como un traductor NAT.

Pero el hecho de que una solicitud UDP pasara por ISP NAT daba esperanzas de éxito. Como el enrutador está en mi jurisdicción, resolví el problema redirigiendo el puerto UDP / 11111 a la computadora:
iptables -t nat -A PREROUTING -i eth1 -p udp -d 10.1XX.2XX.XXX --dport 11111 -j DNAT --to-destination 192.168.X.XXX
Por lo tanto, pude iniciar una sesión UDP y recibir solicitudes de Internet desde cualquier dirección IP. En este punto, inicié el servidor OpenVPN (después de configurarlo) escuchando el puerto UDP / 11111, indiqué en el teléfono inteligente la dirección IP externa y el puerto (XX.1XX.1X4.2XX: 4398) y me conecté exitosamente desde el teléfono inteligente a la computadora. Pero en esta implementación, surgió un problema, era necesario mantener de alguna manera una sesión UDP hasta que el cliente OpenVPN estuviera conectado al servidor, no me gustaba la opción de iniciar periódicamente el cliente STUN; no quería desperdiciar los servidores STUN por nada.
También llamó la atención a la entrada "
horquilla: habrá una horquilla ", este modo
Hairpinning permite que una máquina en la red local para NAT acceda a otra máquina en la misma red en la dirección externa del enrutador.

Como resultado, el problema de mantener una sesión UDP simplemente se resolvió: inicié el cliente en la misma computadora con el servidor.
Funcionó así:
- lanzó un cliente STUN con el puerto local 11111
- Recibió una respuesta con una dirección IP externa y puerto XX.1XX.1X4.2XX: 4398
- datos enviados con una dirección IP externa y un puerto para enviar por correo (cualquier otro servicio es posible) configurado en el teléfono inteligente
- lanzó el servidor OpenVPN en una computadora con escucha de puerto UDP / 11111
- lanzó el cliente OpenVPN en la computadora con la indicación de XX.1XX.1X4.2XX: 4398 para conectarse
- en cualquier momento comencé el cliente OpenVPN en el teléfono inteligente con la dirección IP y el puerto (en mi caso, la dirección IP no cambió) para conectar

Por lo tanto, tuve la oportunidad de conectarme a mi computadora desde un teléfono inteligente. Esta implementación le permite conectar cualquier cliente OpenVPN.
Practica
Necesitarás:
Después de escribir un par de scripts, un par de archivos de configuración, generando los certificados necesarios (dado que el cliente en el teléfono inteligente solo funciona con certificados), se obtuvo la implementación habitual del servidor OpenVPN.
El guión principal en la computadora
Script para enviar datos al correo:
Archivo de configuración del servidor:
proto udp dev tun ca /home/vpn11-srv/ca.crt cert /home/vpn11-srv/server.crt key /home/vpn11-srv/server.key dh /home/vpn11-srv/dh2048.pem server 10.2.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt tls-server tls-auth /home/vpn11-srv/ta.key 0 tls-timeout 60 auth SHA256 cipher AES-256-CBC client-to-client keepalive 10 30 comp-lzo max-clients 10 user nobody group nogroup persist-key persist-tun log /var/log/vpn11-server.log verb 3 mute 20
Archivo de configuración del cliente:
client dev tun proto udp ca "/home/vpn11-srv/ca.crt" cert "/home/vpn11-srv/client1.crt" key "/home/vpn11-srv/client1.key" tls-client tls-auth "/home/vpn11-srv/ta.key" 1 auth SHA256 cipher AES-256-CBC auth-nocache comp-lzo user nobody group nogroup persist-key persist-tun log /var/log/vpn11-clent.log verb 3 mute 20 ping 10 ping-exit 30
La generación de certificados se realizó en
este artículo .
Ejecución de script:
Habiéndolo hecho previamente ejecutable
En el lado del teléfono inteligente
Después de instalar la aplicación
OpenVPN para Android , copiar el archivo de configuración, los certificados y configurarlo, resultó así:
Reviso el correo en un teléfono inteligente Corrijo el número de puerto en la configuración Lanzo el cliente y me conecto En el proceso de escribir el artículo, transferí la configuración de la computadora al Raspberry Pi 3 e intenté ejecutar todo en el módem LTE, ¡pero no funcionó! Resultado del equipo
Cliente STUN versión 0.97
Primario: mapeo independiente, filtro dependiente del puerto, puerto aleatorio, horquilla
El valor de retorno es 0x000006
el valor del
filtro dependiente del
puerto no permitió que se iniciara el sistema.
Pero el proveedor doméstico sin ningún problema dejó que se iniciara el sistema Raspberry Pi 3.
En combinación con una cámara web, con VLC para
crear una transmisión RTSP desde una cámara web $ cvlc v4l2:///dev/video0:chroma=h264 :input-slave=alsa://hw:1,0 --sout '#transcode{vcodec=x264,venc=x264{preset=ultrafast,profile=baseline,level=31},vb=2048,fps=12,scale=1,acodec=mpga,ab=128,channels=2,samplerate=44100,scodec=none}:rtp{sdp=rtsp://10.2.0.1:8554/}' --no-sout-all --sout-keep
y VLC en el teléfono inteligente para ver (transmisión rtsp: //10.2.0.1: 8554 /), resultó que no era un mal sistema de videovigilancia a distancia, también puede elevar Samba e intercambiar archivos, enrutar el tráfico a través de VPN,
controlar remotamente una computadora y mucho mas ...
Conclusión
Como ha demostrado la práctica, para organizar un servidor VPN, puede prescindir de una dirección IP externa por la que tiene que pagar, así como de un VPS / VDS alquilado. Pero todo depende del proveedor. Por supuesto, quería obtener más información sobre los distintos proveedores y los tipos de NAT utilizados, pero esto es solo el comienzo ...
Gracias por su atencion!