Evitar bloqueos usando Double… / Sudo Null IT News

Prefacio

El artículo considerará cuatro opciones independientes para el tráfico de tránsito utilizando:

  1. Doble VPN abierta

  2. abrirVPN + vtun

  3. abrirVPN + tun2proxy a través del proxy calcetines5

  4. GOST + abrirVPN

Mi ISP bloqueó mi openvpn. Primero un proveedor habitual y luego también uno móvil. Era un servidor vds normal y corriente en el extranjero con openvpn. Utilizado exclusivamente para fines personales. Después del bloqueo, simplemente decidí comprobar si doublevpn funcionaría, ya que también tenía un servidor en Rusia. Resultó que todo funciona bien usando el doble. La esencia de esta tecnología es que el tráfico de Internet pasa a través de dos servidores en lugar de uno. Esta herramienta, tan olvidada, se analizará en el artículo, quizás a alguien le resulte útil. En el artículo, por si acaso, también analicé opciones para canalizar el tráfico usando vtun o el proxy calcetines5.

Opción I. DobleVPN

Esquema doble vpn

Esquema doble vpn

Por supuesto, lo primero que me vino a la mente fue simplemente conectar dos servidores en Rusia y en otro país usando openvpn. Y sucedió sin ningún problema. Aquí está mi solución a continuación:

Paso uno. Instalación de openVPN en ambos servidores

Todo lo que escribo es adecuado de una forma u otra para cualquier servidor *nix, ya sea ubuntu, centos, fedora, rocky, etc.

Puede instalar openvpn usando un script ya preparado, por ejemplo, como este:

https://github.com/Nyr/openvpn-install

Después de haber ejecutado el script en ambos servidores, puede ir a la configuración de cada uno de ellos.

Paso dos. Configuración en un VDS extranjero

En un servidor en el país X, la configuración es muy sencilla. Una vez que haya ejecutado el script anterior y openvpn se haya instalado, todo lo que necesita hacer es editar el archivo de configuración y reemplazarlo con el siguiente contenido.

/etc/openvpn/server/server.conf
port XXXX # Порт на котором у вас работает openvpn
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh.pem
tls-crypt tc.key
remote-cert-tls client
server 10.100.39.0 255.255.255.0
keepalive 10 120
persist-key
persist-tun
verb 3
sndbuf 0
rcvbuf 0
push "route 10.100.39.0 255.255.255.0"

A continuación, reinicie el servidor openvpn:

systemctl restart openvpn-server@server.service

Y copie la clave de cliente que se creó cuando instalación al VDS ruso. Por ejemplo, usando scp.

Eso es todo. La configuración del servidor externo está completa.

Paso tres. Configuración de VDS ruso.

En un vds ruso, después de instalar openvpn desde un script, el servidor VPN (10.8.0.0/24) ya se está ejecutando. No lo tocaremos. Todo lo que tenemos que hacer es iniciar un cliente VPN abierto extranjero en los VDS rusos.

Edición /etc/sysctl.conf

Insertamos las siguientes líneas:

net.ipv4.ip_forward=1
net.ipv4.conf.tun0.rp_filter=0
net.ipv4.conf.tun1.rp_filter=0

Términos net.ipv4.conf.tun0.rp_filter=0 y net.ipv4.conf.tun1.rp_filter=0 deshabilite la verificación de filtrado de ruta inversa para las interfaces tun0 y tun1, respectivamente. Puede reiniciar el servidor o ingresar los comandos apropiados.

Editando el archivo:

/etc/iproute2/rt_tables

Y agrégale la línea:

150     vpn_net
Aquí tienes una explicación detallada de por qué y qué estamos haciendo (no es necesario que la leas)

El archivo /etc/iproute2/rt_tables se utiliza para definir los nombres de las tablas de enrutamiento de usuarios en sistemas Linux.

  • Tablas de enrutamiento: Imagine que tiene múltiples rutas para que los paquetes de datos viajen a través de su red. Las tablas de enrutamiento le permiten organizar estas rutas en grupos, lo que facilita la administración y configuración de las conexiones de red.

  • ¿Por qué necesitamos tablas personalizadas?

    • Separación de tráfico: Puede enviar diferentes tipos de tráfico a lo largo de diferentes rutas. Por ejemplo, todo el tráfico VPN se puede enviar a través de una determinada tabla y el resto del tráfico a través de otra.

    • Gestión de políticas: Las tablas se pueden utilizar para implementar varias políticas de red, como el enrutamiento basado en calidad de servicio (QoS) o el equilibrio de carga.

    • Gestión de múltiples interfaces de red: Si tiene varias interfaces de red, puede utilizar tablas diferentes para cada una de ellas.

¿Qué significa el número 150 y la línea 150 vpn_net?

  • Número: Este es simplemente un número único que asignas a tu mesa. Puedes seleccionar cualquier número excepto los ya reservados por el sistema (por ejemplo, 255, 254, 253, 0).

  • Línea: Una cadena con el formato “nombre_tabla de números” asocia un identificador numérico con un nombre descriptivo. En este caso, creas una tabla llamada “vpn_net” y le asignas el número 150.

¿Por qué añadir esa línea?

Supongamos que tiene una conexión VPN y desea que todo el tráfico dirigido a la VPN pase a través de esa conexión. Puede crear una tabla de enrutamiento separada para el tráfico VPN y agregarle rutas apropiadas. Luego, usando reglas de iptables u otros mecanismos, puedes redirigir todo el tráfico destinado a la VPN a esta tabla.

Ahora necesitamos crear dos scripts que se ejecutarán cuando el cliente openvpn externo se inicie y cuando se detenga.

/etc/openvpn/server1_up.sh

/sbin/ip rule add from 10.8.0.0/24 table vpn_net
/sbin/ip route add default dev tun1 table vpn_net

/etc/openvpn/server1_down.sh

/sbin/ip rule del from 10.8.0.0/24 table vpn_net
/sbin/ip route del default dev tun1 table vpn_net

Lo colgamos en ambos guiones.

chmod +x /etc/openvpn/server1_up.sh y chmod +x /etc/openvpn/server1_down.sh

Ahora necesitamos tomar la configuración del cliente que tomamos de un servidor externo. Cambie su extensión: en lugar de .ovpn escriba .conf

mv my_client.ovpn my_client.conf

Colocar en carpeta: /etc/openvpn/client y edite algo como esto:

/etc/openvpn/client/my_client.conf
client
dev tun
proto udp
remote XX.XX.XX.XX YY YY # IP и порт зарубежного VDS
resolv-retry infinite
nobind
persist-key
persist-tun
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
verb 3
script-security 2
up "/etc/openvpn/server1_up.sh"
down /etc/openvpn/server1_down.sh

# До этого место. Дальше не трогаем.
<ca>
-----BEGIN CERTIFICATE-----
wIBAgIJAL0WnyzV8N87MA0
......

Indicamos que nuestros scripts se iniciarán cuando el cliente se inicie y se detenga.

Inicie el cliente openvpn

systemctl start openvpn-client@my_client

Agregar una nueva regla de iptables

iptables -t nat -I POSTROUTING -s 10.8.0.0/24 -o tun1 -j MASQUERADE

Y la antigua regla nat que agregó el instalador. Nyr/openvpn-instalaciónborrar. Guardamos los iptables de la misma forma que está en tu *nix, para que funcionen después del arranque. Y arrancamos automáticamente nuestro cliente:

systemctl enable openvpn-client@my_client

Comprobamos que todo funciona mediante los comandos.

ip route show table all|grep vpn_net
ip rule list| grep vpn_net
ip address

Al usar instalación-openvpn Creamos la cantidad requerida de claves OpenVPN.


Opción II. OpenVPN + Vtun

Túnel de tráfico mediante VTUN

Túnel de tráfico mediante VTUN

En la primera opción teníamos openvpn + openvpn, pero nada nos impide conectar, por ejemplo, un VDS ruso y uno extranjero usando el antiguo y buen vtun. Y el tráfico de túneles de la misma manera.

Paso uno. Instalando vtun en ambos servidores

Vtun se puede construir desde la fuente. Asumiremos que ha instalado vtun y openvpn en ambos servidores. Se permiten paquetes reenviados, consulte la configuración en la opción No. 1.

Paso dos. Ejecutar un servidor vtun en un servidor externo

Para el servidor, puedes tomar algo como esta configuración y ponerla en un archivo /etc/vtund.conf:

/etc/vtund.conf
options {
   port 5000;
   ifconfig   /sbin/ifconfig;
}

# Default session options
default {
   proto tcp;     # TCP protocol
   compress no;   # Compression is off
   encrypt no;    # ssh does the encryption
   speed 0;       # By default maximum speed
   keepalive yes;
   stat yes;
}

my_tunnel {
   passwd MY_STRONG_PASS;    # Password
   type  tun;                # IP tunnel
   proto tcp;                # TCP protocol
   up {
      ifconfig "%% 10.3.0.2 pointopoint 10.3.0.1 mtu 1500";
   };
   down{
      ifconfig "%% down";
   };
}

Abra el puerto 5000 y agregue reglas SNAT, donde to-source XX.XX.XX.XX Esta es una IP blanca en el país X.

-A INPUT -p tcp -m tcp --dport 5000 -j ACCEPT
-A POSTROUTING -s 10.3.0.0/24 -j SNAT --to-source XX.XX.XX.XX

Lanzamos:

vtund -s

Lo comprobamos, debería aparecer la interfaz tun e ip.

ip address

Paso tres. Lanzamiento del cliente vtun y openvpn en Rusia

Instalamos Openvpn como siempre, ver opción 1.

Y aquí están las configuraciones de vtun en el servidor ruso.

/etc/vtund.conf
options {
   port 5000;

   # Path to various programs
   ifconfig   /sbin/ifconfig;
   ip  /sbin/ip;
}

# Default session options
default {
   compress no; 
   encrypt no; 
   speed 0; 
   keepalive yes;
   stat yes;
}


my_tunnel {
   passwd  PASS;      # Password
   type  tun;         # IP tunnel
   proto udp;         # TCP protocol

   up {
      # 10.3.0.1 локальный ip 
      # 10.3.0.2 удаленный ip
      ifconfig "%% 10.3.0.1 pointopoint 10.3.0.2 mtu 1500";
      ip "rule add from 10.8.0.0/24 table vpn_net";
      ip "route add default dev %% table vpn_net";

       

   };
   down{
      ip "rule del from 10.8.0.0/24 table vpn_net";
      ip "route del default dev %% table vpn_net"; 
      ifconfig "%% down";
   };
}

Ejecutemos el comando:

vtund  my_tunnel ip_адрес_вашего_зарубежного_сервера

Enmascaramos el tráfico de la misma manera que con openvpn:

iptables -t nat -I POSTROUTING -s 10.8.0.0/24 -o tun1 -j MASQUERADE

Después de esto todo debería funcionar. Si no funciona, asegúrese de que los pings estén entre 10.3.0.1 y 10.3.0.2 y observe los registros.

La configuración de vtun se proporciona como ejemplo. Allí, si lo desea, puede transmitir tráfico vía UDP, cifrar, comprimir, etc.

Pero lo más interesante es que vtun puede quedar atrapado en un túnel ssh, después de lo cual filtrarlo y bloquearlo será increíblemente problemático.

¿Puedo usar vtun sobre SSH?

Sí, a través de la función de reenvío de puertos de ssh. No habilite el cifrado de vtun ya que ssh realiza su propio cifrado. Además, asegúrese de seleccionar el protocolo TCP, ya que SSH puede reenviar TCP pero no UDP. Una sesión de ejemplo podría verse así

home$ ssh -L 5000:localhost:5000 work.megacorp.com
 (authenticate if necessary)
 work$ vtund -s home_tunnel_config
 ...
 home$ vtund home_tunnel_config localhost

https://vtun.sourceforge.net/faq.html


Opción III. OpenVPN + tun2proxy

conexión calcetines5

conexión calcetines5

En la tercera opción, arrojaremos el tráfico openvpn a calcetines5 y también lo liberaremos al exterior. Aunque con la ayuda tun2proxy También puede hacer un túnel a un proxy http, por lo que ni siquiera es necesario un VDS extranjero, basta con tener acceso ssh en el país X o algún tipo de proxy http.

https://github.com/tun2proxy/tun2proxy

tun2proxy es una interfaz de túnel para proxies HTTP y SOCKS en Linux, Android, macOS, iOS y Windows:

  • Proxy HTTP (sin autenticación, autenticación básica y resumida)

  • Compatibilidad con SOCKS4 y SOCKS5 (sin autenticación, autenticación de nombre de usuario y contraseña)

  • Compatibilidad con SOCKS4a y SOCKS5h (a través de la función DNS virtual)

  • Configuración mínima para enrutar todo el tráfico.

  • Soporte IPv4 e IPv6

  • Mecanismo de derivación de GFW para ciertos casos de uso

  • Soporte SOCKS5 UDP

  • Soporte integrado para proxy DNS sobre TCP

Instalación y configuración

Toda la instalación y configuración se realiza en un servidor en Rusia. En el primer servidor. En el segundo (servidor extranjero) solo necesitas una cuenta ssh para crear un proxy calcetines5.

yo puse óxido última versión

curl --proto '=https' --tlsv1.2 -sSf  | sh

Y luego comencé la instalación.

$HOME/.cargo/bin/cargo install tun2proxy

Y se instaló correctamente, comprobó que todo estaba bien:

$HOME/.cargo/bin/tun2proxy --help

Leí la ayuda sobre cómo usarlo. A continuación, creé un proxy dinámico para verificar ssh calcetines5 tcp con el siguiente comando:

ssh -D 14017 -q -C -N my-socks5-user@my-remote-server.com

Lo colgué en el puerto 14017. Por si acaso, sería necesario calcetines udp5 hacerlo (pero no buscamos formas fáciles) y es más interesante para la prueba.

A continuación, lancé tun2proxy con el comando:

$HOME/.cargo/bin/tun2proxy --tun tun1 --proxy "SOCKS5://127.0.0.1:14017"

Luego levanté la interfaz de red, porque… por defecto está deshabilitado:

ifconfig tun1 up

Este es el truco de tun2roxy, que crea una interfaz de red. Es decir, si escribe, por ejemplo, ifconfig, con tun2roxy habilitado podrá ver otra “tarjeta de red” que creó en función del proxy. Y si está tun1, entonces podemos hacer lo que queramos, casi igual que en las opciones anteriores.

La interfaz tun1 que creó tun2proxy

La interfaz tun1, que creó tun2proxy basado en el proxy calcetines5

Verifiqué que todo funciona con el siguiente comando:

curl --interface tun1 ifconfig.me

En respuesta, recibí la dirección IP de mi servidor extranjero. Todo está bien, el tráfico giró hacia el tun1 y salió del extranjero.

Ahora necesitamos forzar a openVPN a hacer lo mismo para liberar el tráfico de openVPN a través de tun1 y calcetines5.

/etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.tun0.rp_filter=0
net.ipv4.conf.tun1.rp_filter=0
net.ipv4.conf.all.route_localnet=1

Para presentar:

/etc/iproute2/rt_tables

Agregó la línea:

150     vpn_net

Y ingresé los comandos:

/sbin/ip rule add from 10.8.0.0/24 table vpn_net
/sbin/ip route add default dev tun1 table vpn_net

Y luego es una broma si simplemente disfrazas el tráfico con el comando iptables -t nat -I POSTROUTING -s 10.8.0.0/24 -o tun1 -j MASQUERADE entonces las solicitudes de DNS no funcionarán porque no pasan por TCP. Como escribí arriba, ordinario calcetines5 tcp proxy realmente no encaja. Así que antes de disfrazarme, tuve que ponerme dnsproxy y ejecútelo con el comando:

./dnsproxy -u 8.8.8.8:53

Y esta vez lancé tun2proxy con el comando indicado arriba, pero con otros adicionales. llave --dns direct y también cambié la configuración de openvpn del cliente para que vaya a mi servidor localmente con solicitudes de DNS.

Después de eso todo funcionó y openvpn el cliente salió por este túnel.


Variante IV. GO Túnel simple (GOST) + openVPN

esquema GOST

esquema GOST

Esta opción fue sugerida por los chicos en los comentarios: 1, 2.

Y esta opción es muy sencilla.

GOST (VAYA Túnel Simple) es una herramienta de código abierto construida en el lenguaje Go. Está diseñado para crear túneles seguros y confiables para la transferencia de datos entre diferentes dispositivos y redes. Puedes leer el certificado en inglés. Aquí.

Instalé solo openvpn en el servidor occidental.

Y en Rusia, en un viejo Centos 7, instalé GOST de esta manera:

yum install epel-release
yum install snapd
systemctl enable --now snapd.socket
ln -s /var/lib/snapd/snap /snap
snap install gost

A continuación creé el servicio: vim /usr/lib/systemd/system/gostopenvpn.service

(Unit)
Description=My GOST Service 
After=network.target

(Service)
Type=simple
ExecStart=/путь_к/gost -L=udp://:1194/XX.XX.XX.XX:1194

(Install)
WantedBy=multi-user.target

XX.XX.XX.XX:1194 – esta es la IP del servidor externo y el puerto en el que se ejecuta openVPN en el servidor externo.

A continuación, abrí un puerto en iptables en el servidor ruso donde está instalado GOST e inicié el servicio:

iptables -I INPUT -p udp --dport 1194 -j ACCEPT
systemctl enable gostopenvpn.service
systemctl start gostopenvpn.service

Editó la configuración openvn del cliente externo, indicó en él la IP del servidor ruso con gost en lugar de extranjero. Y todo funcionó. Los clientes openvpn se conectan a una IP rusa, atraviesan un túnel y acceden a Internet desde una IP extranjera.

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *