Evitar bloqueos usando Double… / Sudo Null IT News
Prefacio
El artículo considerará cuatro opciones independientes para el tráfico de tránsito utilizando:
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
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
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
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.
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
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.