Cifrado de tráfico de Linux
Hay muchas formas de evitar los sitios de bloqueo y garantizar la privacidad en la red. Términos como TOR, VPN, proxies son bien conocidos por todos. Para conectarlos y configurarlos, no necesita conocimientos especiales, pero hay soluciones más elegantes. Hoy hablaré sobre el método de evitar bloqueos en Linux con el enmascaramiento del tráfico y mostraré algunos scripts para automatizar esto. Se pueden transferir fácilmente a la Raspberry Pi para hacer un enrutador inteligente.
Contenido
- 1 Cifrado de tráfico en Linux
- 1.1 ¿Qué es qué?
- 2 Brevemente sobre dos opciones
- 3 Implementación
- 3.1 Opción 1: cliente VPN en la máquina del usuario
- 3.2 Opción 2: Cliente VPN en el enrutador
- 4 IPSet
- 5 Automatización después de fallas / reinicios
- 6 Conclusión
Este artículo no es una guía. Está escrito únicamente para familiarizarlo con algunas de las funciones de enrutamiento en los sistemas Linux. El autor del artículo y los editores del sitio www.ciberforense.com no tienen ninguna responsabilidad por el resultado del uso de los métodos y técnicas descritos aquí.
- decidiremos lo que necesitamos: instalar los paquetes necesarios y descubrir por qué son necesarios;
- estudiamos el principio general del grupo;
- configurar un canal VPN seguro usando el stunnel OpenVPN +;
- hacer listas de direcciones y describir el alcance de su aplicación;
- cree una secuencia de comandos para agregar rápidamente un dominio o una dirección IP a las listas de IPSet además de la tabla de enrutamiento e inclusión en las reglas de redireccionamiento;
- Usamos SSH para proporcionar un canal seguro de comunicación a su internet.
Cifrado de tráfico de Linux
¿Qué necesitamos para que todo funcione, y preferiblemente cómodamente? Por supuesto, iptables, ¿a dónde irías sin él? También iproute2, nos permitirá crear un montón de tablas. Se requiere IPSet para no bloquear el jardín de las muchas reglas de iptables.
Que es que
- iptables es una utilidad de línea de comando. Herramienta básica de gestión de firewall para kernels de Linux.
- iproute2 : un conjunto de utilidades para administrar los parámetros de los dispositivos de red en el kernel de Linux.
- IPSet es una herramienta para trabajar con listas de direcciones IP y puertos de red en un filtro de red. Genera una lista en un formato especial para la transmisión al firewall.
- Stunnel es una herramienta de comunicación encriptada para clientes o servidores que no son compatibles con TLS o SSL. Stunnel intercepta los datos no cifrados que deberían haberse enviado a la red y los cifra. El programa funciona tanto en sistemas Unix como en Windows. Utiliza OpenSSL como cifrado para implementar el protocolo básico TLS y SSL.
- OpenVPN es un servidor VPN con soporte de encriptación de la biblioteca OpenSSL. Las partes del cliente están disponibles en casi todas las plataformas. Capaz de trabajar a través de proxies como Socks, HTTP, a través de NAT y filtros de red.
Acerca de todas estas utilidades, puede encontrar mucha información en Internet y con ejemplos de configuraciones en una variedad de opciones. Usaremos iptables para marcar paquetes. Tendremos dos opciones de personalización. La primera es cuando la máquina que está rastreando está conectada a la VPN. La segunda opción es cuando hay un nodo en la red (máquina virtual, Raspberry Pi o cualquier otro host con Linux) que desempeña el papel de un enrutador. A continuación, analizaremos estas opciones con más detalle.
Brevemente sobre dos opciones
El cliente y el servidor establecerán un canal de comunicación encriptado en el puerto 443 (stunnel) y transmitirán dentro de OpenVPN en el puerto 995. Afuera, debería verse como HTTPS regular.
Y aquí puede implementar dos esquemas de conexión.
Opción 1. En la máquina cliente, iptables marcará los paquetes con un determinado indicador si las direcciones en los paquetes y las listas de IPSet coinciden, y las pasará para el enrutamiento.
A continuación, los paquetes marcados con una bandera se enviarán de acuerdo con una tabla de enrutamiento creada previamente, el resto irá por la ruta predeterminada. Usando la consola o un pequeño script, corregiremos esta lista de direcciones. Puede haber varias listas, según la situación.
Opción 2. El cliente será un host en la red local (máquina virtual, Raspberry Pi u otro dispositivo). Se indicará como la puerta de enlace principal en las computadoras desde las cuales se necesita acceso a los recursos a través de VPN. Después de recibir una solicitud de una dirección IP de la lista, la puerta de enlace habilitará NAT y enviará dicho tráfico a la VPN. El resto del tráfico se enrutará a la puerta de enlace predeterminada sin NAT.
Para los sistemas Linux, podemos dejar la puerta de enlace predeterminada y configurar IPSet e iproute2, y luego configurarlos de manera similar a la configuración del enrutador host «intermedio». En este caso, el tráfico en la misma lista de IPSet se seleccionará a nivel de cliente. Es decir, lo que está en la lista se enviará al enrutador host intermedio y luego a la VPN. El resto se enrutará de forma predeterminada.
Implementación
Supongamos que en algún lugar de la nube ya tenemos un servidor VPS con Ubuntu o Debian. En otras distribuciones, las diferencias probablemente solo estarán en la instalación de los paquetes necesarios. Este host en nuestra configuración se usará como un servidor VPN. Las recomendaciones sobre qué VPS es mejor usar en Internet están completas, para un presupuesto diferente, con diferentes configuraciones y condiciones.
Instale OpenVPN, stunnel, git en el servidor:
1
|
sudo apt install openvpn stunnel4 git
|
A continuación, utilizaremos un script listo para configurar el servidor OpenVPN. Por supuesto, puede configurar todo manualmente, y le aconsejo que haga exactamente eso. La información sobre cómo configurar correctamente OpenVPN es fácil de encontrar en la Web. Pero si necesita obtener el resultado muy rápido y no quiere molestarse, entonces aquí hay una solución rápida.
1
2
3
|
git clone https://github.com/Nyr/openvpn-install.git
cd openvpn–install
sudo ./openvpn–install.sh
|
Obtenemos el script de instalación y lo ejecutamos. Le ayudará a crear claves y certificados personalizados y, si es necesario, cambiar el direccionamiento de red. Todo es muy accesible y comprensible. En la salida, para cada usuario, obtenemos un archivo, dentro del cual habrá una clave de configuración y certificados (servidor y usuario). Transferimos este archivo al cliente.
Abra el archivo de configuración del servidor OpenVPN y edítelo. Seleccione el puerto deseado, el que estará libre en el servidor para conectarse. Es mejor usar un puerto que sea más o menos discreto (elegí el 995o, generalmente los puertos de correo se dejan abiertos) para que el cliente pueda conectarse con seguridad al servidor VPN.
Así es como se verá nuestra configuración:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
port 443
proto tcp
dev tun0
sndbuf 0
rcvbuf 0
ca ca.crt
cert server.crt
key server.key
dh dh.pem
auth SHA512
tls–auth ta.key 0
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig–pool–persist ipp.txt
push «redirect-gateway def1 bypass-dhcp»
push «dhcp-option DNS 208.67.222.222»
push «dhcp-option DNS 208.67.220.220»
push «route 10.8.0.0 255.255.255.0»
route 192.168.31.0 255.255.255.0
keepalive 10 120
cipher AES–256–CBC
user nobody
group nogroup
persist–key
persist–tun
status openvpn–status.log
verb 3
crl–verify crl.pem
|
El siguiente paso es configurar stunnel:
1
2
3
4
5
6
7
8
|
sudo nano /etc/stunnel/stunnel.conf
output = /var/log/stunnel.log
[openvpn]
client = no
accept = 443
connect = localhost:443
cert = /etc/stunnel/stunnelsrv.pems
|
Aquí todo es simple:
- describa dónde se guardarán los registros;
- indicar el nombre del servicio en cualquier forma;
- elegimos en qué modo funciona el dispositivo: servidor o cliente. En este caso, client = no indica el modo del servidor;
- accept = 443 indica el puerto al que nos conectaremos externamente (el puerto 443 se eligió por una razón: en el 99% de los casos siempre está abierto, es más fácil fingir que es un HTTPS normal y no se nos notará incluso con DPI ).
Generamos claves y certificados para stunnel:
sudo openssl req –nodes –new –days 365 –newkey rsa:1024 –x509 –keyout stunnelsrv.pem –out stunnel.pem
|
En esta etapa, es importante recordar que OpenVPN en el puerto 995 proto tcp, dev tun0 y stunnel en el puerto 443 funcionan en nuestro lado del servidor. Todas las demás configuraciones son estándar.
Pasamos al cliente:
1
|
sudo apt install iproute2 ipset stunnel4 git openvpn
|
Todo lo que necesitamos está configurado, ahora configuramos el stunnel en el lado del cliente:
1
2
3
4
5
6
7
8
|
output = /var/log/stunnel.log
[openvpn]
client = yes
accept = 127.0.0.1:995
connect = IP:443
cert = /etc/stunnel/stunnel.pem
|
Aquí indicamos dónde mostrar los registros, el modo cliente está habilitado. Usando la directiva accept, decimos a qué dirección y puerto enviar la conexión y dónde, de hecho, se conecta el cliente stunnel (opción de conexión). Bueno y qué certificado usar.
Transferimos el archivo del cliente OpenVPN desde el servidor. Compruebe la configuración: se utiliza el puerto 995, proto tcp, dev tun0. Punto muy importante: necesitamos declarar una ruta a nuestro VPS a través de la puerta de enlace predeterminada. De lo contrario, resulta que Stunnel establecerá una conexión, luego la VPN se conectará e intentará redirigir todo al túnel, pero Stunnel ya no podrá funcionar, ya que el host y el puerto serán inaccesibles. También desactivamos la redirección de todo el tráfico a la VPN, verificamos la dirección de conexión y el puerto. La dirección del servidor VPN en la configuración será 127.0.0.1, es decir, localhost. Se entiende que Stunnel ya ha reenviado el puerto del cliente deseado. Debería obtener algo como lo siguiente:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
client
dev tun
proto tcp
sndbuf 0
rcvbuf 0
remote 127.0.0.1 995
resolv–retry infinite
nobind
persist–key
persist–tun
remote–cert–tls server
auth SHA512
cipher AES–256–CBC
setenv opt block–outside–dns
key–direction 1
#redirect-gateway def1
pull–filter ignore redirect–gateway
route IP 255.255.255.255 net_gateway — добавляем в конфиг OpenVPN клиента. IP — это белый IP–адрес VPN–сервера.
#ip route add table obhod default dev tun0
verb 3
|
Entonces, en el servidor y el cliente, OpenVPN y stunnel están instalados y configurados. Conexión segura establecida. A continuación consideraremos cada opción por turno.
Opción 1: cliente VPN en la máquina del usuario
Primero, cree una lista de direcciones IP, que usaremos a continuación:
1
|
sudo ipset –N vpn iphash
|
Agregue una dirección para las pruebas:
1
|
sudo ipset –A vpn 8.8.8.8
|
Ahora necesitamos marcar paquetes con direcciones de destino que coincidan con la lista.
1
|
sudo iptables – OUTOUT –t mangle –m set —match–set vpn dst –j MARK —set–mark (1 или 0x1)
|
Como resultado de nuestras acciones, iptables, si coinciden en la dirección de destino y la dirección de la lista IPSet, comenzarán a marcar dicho tráfico. Luego, cree una nueva tabla de enrutamiento, para esto la escribiremos en el archivo / etc / iproute2 / rt_tables con prioridad más alta que la predeterminada (253):
1
|
252 vpn
|
Ahora necesita crear una regla y una ruta para los paquetes marcados.
1
2
|
sudo ip rule add table vpn prio 1000 fwmark (1 или 0x1)
sudo ip route add table vpn dev tun0 default
|
No olvide habilitarlorp_filter
para garantizar el enrutamiento asimétrico y permitir la transferencia de paquetes entre interfaces, en caso de que alguien necesite proporcionar acceso a recursos cerrados en la red local.
1
2
3
|
sudo sysctl net.ipv4.tcp_fwmark_accept=1
sudo sysctl net.ipv4.conf.all.rp_filter=2
sudo net.ipv4.ip_forward=1
|
Ahora habilite NAT para el tráfico que va a la VPN.
1
|
sudo iptables –t nat –I POSTROUTING –o tun0 –j MASQUERADE
|
Si necesita proporcionar acceso desde la red local a través de su VPN, la regla de iptables debe corregirse ligeramente, es decir, transferirse a otra cadena.
sudo iptables –I PREROUTING –t mangle –m set —match–set tovpn dst –j MARK —set–mark 0x1
|
Como resultado, resulta que todas las direcciones de la lista VPN IPSet pasan por una conexión segura, el resto se enruta a través de la ruta predeterminada.
Opción 2: Cliente VPN en el enrutador
Ahora, considere el caso cuando una máquina VPN no realiza una conexión VPN, sino un cierto nodo en la red y todo está configurado de manera similar al ejemplo anterior. Luego, debemos especificar este nodo como la puerta de enlace predeterminada o instalar IPSet e iproute2 en la máquina cliente y configurarlo correctamente.
En este caso, el IPSet local e iproute2 funcionarán y enviarán un paquete al enrutador del servidor intermedio, que verificará la dirección de destino con su lista de IPSet y, si encuentra una coincidencia, enviará el paquete a la VPN, si no encuentra una coincidencia, lo reenviará a la puerta de enlace predeterminada.
La desventaja de esta técnica es que necesita agregar direcciones IP a las listas dos veces. Primero, en el servidor del enrutador, y la segunda vez en su lista local de IPSet. Pero esto permite un uso más flexible del enrutamiento.
También vale la pena señalar otra opción, que no se mencionó anteriormente. Puede instalar el cliente VPN y el stunnel en el servidor del enrutador, y luego eliminar la línea de puerta de enlace de redireccionamiento de ignorar de la configuración. Luego, todo el tráfico recibido se envolverá en un túnel VPN. Todo lo que queda es realizar un IPSet localmente para dirigir el tráfico necesario a través de diferentes puertas de enlace.
IPSet
Las listas de IPSet son muy convenientes de usar si necesita permitir o bloquear rápidamente las conexiones entrantes o salientes al servidor. Entonces, por ejemplo, muchos implementan el filtrado geográfico: es más fácil enumerar todo una vez y prohibir todo el tráfico entrante de todas partes, excepto esta lista con una sola regla. Por ejemplo:
1
|
sudo iptables –A INPUT –m set —match–set !RU src –j DROP
|
Esta regla bloqueará todas las conexiones entrantes, excepto las direcciones de la lista de IPset RU.
IPSet, como puede ver, es una herramienta conveniente que reduce significativamente la tabla de reglas de iptables. En particular, es bueno combinar redes de servidores, direcciones de administradores, otros usuarios, etc., en listas separadas. Y luego prohibir inmediatamente el acceso de uno y permitir otros.
Automatización después de bloqueos / reinicios
Para no perder todos los ajustes que configuramos, agregaremos a crontab periódicamente para guardar las reglas de IPSet e iptables.
1
2
3
4
5
|
sudo crontab –e
1 * * * * /bin/bash root ipset save > /opt/ipset.rules
1 * * * * iptables–save root > /opt/firewall.rules
|
Y en /etc/rc.local agregar recuperación:
1
2
|
ipset restore < /opt/routers/ipset.rules
iptables–restore < /opt/routers/iptables.rules
|
Ahora escribiremos un script que omitirá las reglas iprule e iproute y, en caso de que falte algo, agregaremos el que falta. El script puede convertirse en un demonio para que se cuelgue constantemente en la memoria y supervise el estado del sistema, o solo se puede ejecutar cuando se inicia el sistema operativo. En general, la segunda opción es suficiente.
Encontrará el código fuente del script de verificación en el archivo en el enlace al final del artículo, pero su significado general es el siguiente: verificamos la tabla de enrutamiento y, si no hay una ruta, la agregamos. Luego realizamos la misma verificación con la regla de la tabla. Luego miramos la regla de iptables, que etiqueta los paquetes.
Finalmente, escribiremos un script que nos permitirá agregar direcciones IP a las listas de IPSet de manera más conveniente para que cada vez que no entremos en la consola. Este script se ve así:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#!/bin/bash
test=$(zenity —entry —title=«Agregar una dirección a las listas de ipset « —text=«Введите адрес ip или домена»)
initip=$(dig +short «$test» –u 1.1.1.1)
if [ ! –n «$initip» ]; then
zenity —password —title=«Ingrese la contraseña de administrador» | sudo –S ipset –exist –A vpn «$test»
echo «$test» >> /opt/iptovpn.txt
else
zenity —password —title=«Ingrese la contraseña de administrador» | sudo –S ipset –exist –A vpn «$initip»
echo «$initip» >> /opt/iptovpn.txt
fi
sudo ipset save > /opt/ipset.rules
|
Al inicio, ingresamos el nombre de dominio o inmediatamente la dirección IP. El script los asimilará a ambos y luego empujará la IP a la lista de IPSet.
También en el archivo encontrará el script add_in_file que lee un archivo con una lista de dominios, obtiene una IP y la agrega a las listas de IPSet.
Conclusión
Entonces, ¿qué hicimos? Y aquí está lo que. Levantamos el canal cifrado «blanco» desde el punto de vista del proveedor, el canal HTTPS. Adentro va nuestro OpenVPN. El cliente envuelve allí lo que necesitamos y no envía lo que no se necesita. En principio, puede escribir un par de reglas de iptables que indiquen quién puede ir a las direcciones de la lista dada y quién no. Puede especificar las fuentes de las solicitudes de mayor seguridad y para que, Dios no lo quiera, un usuario inquisitivo se arrastre. Esto se implementa utilizando la segunda lista de IPSet, donde debe manejar hosts confiables que utilizarán el acceso.
Si lo desea, puede implementar toda esta arquitectura no tan engañada en una Raspberry Pi con Linux y llevarla con usted como un pequeño enrutador. Le proporciona en cualquier lugar una conexión confiable, segura y encriptada a la que nadie puede acceder.