Redirigimos todo el tráfico del contenedor a través de un proxy SOCKS con tun2socks
Publicado el 17.06.2025
A veces es necesario enrutar todo el tráfico saliente de un contenedor específico a través de un servidor proxy. Esto puede ser útil para garantizar el anonimato, sortear bloqueos geográficos o para probar configuraciones de red. En este artículo veremos cómo configurar este sistema usando la utilidad tun2socks y reglas de iptables, y cómo gestionar este proceso con systemd.
¿Qué es tun2socks?
tun2socks es una potente herramienta que permite reenviar el tráfico de red destinado a un dispositivo TUN a través de un proxy SOCKS. Crea una interfaz de red virtual (dispositivo TUN) cuyo tráfico se encapsula en una conexión SOCKS. Esto es especialmente útil cuando el proxy a nivel de aplicación no es posible o no es deseable.
Instalación de tun2socks
Para empezar necesitamos instalar tun2socks. Usaremos los binarios precompilados desde GitHub.
Ve a la página de releases de tun2socks: https://github.com/xjasonlyu/tun2socks/releases
Selecciona la versión estable más reciente y descarga el archivo apropiado para tu arquitectura (por ejemplo,
tun2socks-linux-amd64.tar.gzpara sistemas Linux de 64 bits).Descomprime el archivo y mueve el ejecutable a una ruta del sistema, por ejemplo,
/usr/local/bin/:# Ejemplo para linux-amd64, sustituye la versión por la actual wget https://github.com/xjasonlyu/tun2socks/releases/download/v2.5.1/tun2socks-linux-amd64.tar.gz tar -xvf tun2socks-linux-amd64.tar.gz sudo mv tun2socks-linux-amd64/tun2socks /usr/local/bin/tun2socks sudo chmod +x /usr/local/bin/tun2socksAsegúrate de que la ruta al binario en tu script coincide con la real. En nuestro ejemplo es
/usr/local/bin/tun2socks.
Script de redirección de tráfico
Ahora veamos el script que automatiza el proceso de configurar el dispositivo TUN, iptables y lanzar tun2socks.
Nota importante: Para funcionar correctamente con systemd, modificaremos un poco el script para que tun2socks se ejecute en segundo plano y el script pueda terminar, dejando a systemd gestionar el proceso tun2socks.
#!/bin/bash
set -euo pipefail
# Configuración
TUN_DEV="tun0" # Nombre del dispositivo TUN
TUN_ADDR="10.0.0.2/24" # Dirección IP para el dispositivo TUN
FWMARK="100" # Marca para el tráfico
ROUTE_TABLE="100" # Número de la tabla de enrutamiento
CONTAINER_IP="172.29.172.2" # Dirección IP de tu contenedor cuyo tráfico debe redirigirse
SOCKS_PROXY="socks5://username:password@xxx.xxx.xxx.xx:yyyyy" # Dirección del proxy SOCKS5 (con autenticación)
TUN2SOCKS_BIN="/usr/local/bin/tun2socks" # Ruta al ejecutable tun2socks
# Ruta al archivo PID que usará systemd
PID_FILE="/var/run/tun2socks.pid"
# Función para limpiar reglas
cleanup() {
echo "[INFO] Limpiando rutas e iptables antiguos..."
# Eliminamos reglas en orden inverso al de creación
iptables -t nat -D POSTROUTING -o "$TUN_DEV" -j MASQUERADE 2>/dev/null || true
iptables -t mangle -D PREROUTING -s "$CONTAINER_IP" -p tcp -j MARK --set-mark "$FWMARK" 2>/dev/null || true
ip route flush table "$ROUTE_TABLE" 2>/dev/null || true
ip rule del fwmark "$FWMARK" table "$ROUTE_TABLE" priority "$FWMARK" 2>/dev/null || true
ip link set "$TUN_DEV" down 2>/dev/null || true
ip tuntap del dev "$TUN_DEV" mode tun 2>/dev/null || true
# Eliminamos el archivo PID
rm -f "$PID_FILE" 2>/dev/null || true
}
# Comprobamos argumentos de línea de comandos
if [ "$#" -eq 1 ] && [ "$1" == "cleanup_only" ]; then
cleanup
echo "[INFO] Limpieza completada."
exit 0
fi
# Llamamos a cleanup al inicio para garantizar un estado limpio, si no es modo cleanup_only
cleanup
echo "[INFO] Creando $TUN_DEV..."
ip tuntap add dev "$TUN_DEV" mode tun
ip addr add "$TUN_ADDR" dev "$TUN_DEV"
ip link set "$TUN_DEV" up
echo "[INFO] Configurando ip rule e iptables..."
ip rule add fwmark "$FWMARK" table "$ROUTE_TABLE" priority "$FWMARK"
ip route replace default dev "$TUN_DEV" table "$ROUTE_TABLE"
iptables -t mangle -A PREROUTING -s "$CONTAINER_IP" -p tcp -j MARK --set-mark "$FWMARK"
iptables -t nat -A POSTROUTING -o "$TUN_DEV" -j MASQUERADE
echo "[INFO] Iniciando tun2socks..."
"$TUN2SOCKS_BIN" \
--device "$TUN_DEV" \
--proxy "$SOCKS_PROXY" \
--nohup \
--log-level info &
# Guardamos el PID de tun2socks para systemd
echo $! > "$PID_FILE"
echo "[INFO] Configuración completada. tun2socks iniciado."
Análisis del script
Expliquemos con más detalle qué hace cada parte del script:
Configuración
Al inicio del script se definen las variables clave:
- TUN_DEV: Nombre de la interfaz de red virtual (p. ej.,
tun0). - TUN_ADDR: Dirección IP y máscara de subred que se asignarán a
TUN_DEV. Esta dirección será usada como gateway para el contenedor. - FWMARK: Marca numérica arbitraria que se utilizará para marcar los paquetes que se deben redirigir.
- ROUTE_TABLE: Número de la tabla de enrutamiento personalizada a la que se enviará el tráfico marcado.
- CONTAINER_IP: ¡Parámetro críticamente importante! Esta es la dirección IP de tu contenedor cuyo tráfico quieres redirigir. Necesitarás averiguarla.
- SOCKS_PROXY: Dirección completa de tu proxy SOCKS5, incluyendo protocolo, usuario, contraseña y puerto.
- PID_FILE: Ruta al archivo donde se guardará el PID del proceso tun2socks para que systemd pueda rastrearlo.
Función cleanup
La función cleanup() se encarga de eliminar todas las reglas iptables, rutas y el propio dispositivo TUN creados previamente. Esto es importante para garantizar un estado “limpio” antes de cada nueva configuración y al detener el servicio. También elimina el archivo PID.
Lógica de arranque y limpieza
El script comprueba los argumentos de la línea de comandos. Si se ejecuta con el argumento cleanup_only, ejecuta únicamente la función cleanup y termina. En caso contrario, primero limpia configuraciones previas y luego crea las nuevas.
Creación del dispositivo TUN
ip tuntap add dev "$TUN_DEV" mode tun: Crea una nueva interfaz TUN con el nombre especificado.ip addr add "$TUN_ADDR" dev "$TUN_DEV": Asigna la dirección IP al dispositivo TUN creado.ip link set "$TUN_DEV" up: Activa la interfaz TUN.
Configuración de ip rule e iptables
Este es el corazón del mecanismo de redirección:
ip rule add fwmark "$FWMARK" table "$ROUTE_TABLE" priority "$FWMARK": Crea una regla de enrutamiento que dice: “cualquier paquete con la marcaFWMARKdebe procesarse usando la tabla de enrutamientoROUTE_TABLE”. La prioridadFWMARKasegura que esta regla se evalúe antes que otras.ip route replace default dev "$TUN_DEV" table "$ROUTE_TABLE": Dentro de nuestra tabla especialROUTE_TABLEestablecemos la ruta por defecto que apunta a nuestro dispositivo TUN. Esto significa que todo el tráfico que entre en esta tabla irá a través deTUN_DEV.iptables -t mangle -A PREROUTING -s "$CONTAINER_IP" -p tcp -j MARK --set-mark "$FWMARK": Esta reglaiptablesen la cadenaPREROUTING(que procesa paquetes antes de que pasen por el enrutamiento) en la tablamangle(usada para modificar paquetes). Dice: “si un paquete TCP proviene deCONTAINER_IP, márcalo conFWMARK”. Así es como identificamos el tráfico que debe redirigirse.iptables -t nat -A POSTROUTING -o "$TUN_DEV" -j MASQUERADE: Esta regla en la tablanaten la cadenaPOSTROUTING(que procesa paquetes justo antes de enviarlos). Realiza masquerading (SNAT), es decir, cambia la IP origen de los paquetes salientes que pasan porTUN_DEVa la IP asociada aTUN_DEV. Esto es necesario para el correcto funcionamiento del proxy.
Inicio de tun2socks
"$TUN2SOCKS_BIN" --device "$TUN_DEV" --proxy "$SOCKS_PROXY" --nohup --log-level info &: Inicia el propiotun2socks. Se enlaza alTUN_DEVcreado y usa elSOCKS_PROXYespecificado para redirigir todo el tráfico que llega aTUN_DEV. La opción--nohuppermite quetun2sockssiga ejecutándose después de que el proceso padre (el script) termine, y&lo lanza en segundo plano.--log-level infoes útil para depuración.echo $! > "$PID_FILE": Guarda el PID del procesotun2sockslanzado en segundo plano en un archivo, para que systemd pueda rastrearlo.
Cómo usar (con systemd)
Ahora que el script está listo, podemos integrarlo con systemd para facilitar su gestión.
Guarda el script: Crea un archivo, por ejemplo,
/usr/local/bin/tun2socks_redirect.sh, y pega en él el contenido del script modificado.sudo nano /usr/local/bin/tun2socks_redirect.shHazlo ejecutable:
sudo chmod +x /usr/local/bin/tun2socks_redirect.shDetermina la IP del contenedor: Si usas Docker, puedes obtener la IP del contenedor ejecutando
docker inspect <nombre_contenedor> | grep "IPAddress".Actualiza CONTAINER_IP y SOCKS_PROXY: Asegúrate de cambiar los valores de
CONTAINER_IPySOCKS_PROXYen el script/usr/local/bin/tun2socks_redirect.shpor los tuyos.
Creación del archivo unit de systemd
Crearemos el unit file de systemd para nuestro servicio.
Crea el archivo
/etc/systemd/system/tun2socks-redirect.service:sudo nano /etc/systemd/system/tun2socks-redirect.servicePega el siguiente contenido:
[Unit] Description=Tun2socks Traffic Redirection Service After=network-online.target Wants=network-online.target [Service] Type=forking # Usamos Type=forking porque nuestro script lanza tun2socks en segundo plano # y el script termina. tun2socks se demoniza por sí mismo (gracias a --nohup). # PIDFile se usa para rastrear el PID de tun2socks. PIDFile=/var/run/tun2socks.pid ExecStartPre=/usr/local/bin/tun2socks_redirect.sh # ExecStart es el comando que systemd rastreará. # Como nuestro script ya inicia tun2socks en segundo plano, systemd lo rastreará a través de PIDFile. ExecStart=/bin/true # ExecStopPost se ejecuta después de detener el servicio, para limpieza ExecStopPost=/usr/local/bin/tun2socks_redirect.sh cleanup_only # User=root - el script requiere privilegios root User=root Restart=on-failure RestartSec=5s [Install] WantedBy=multi-user.target
Explicaciones del unit file:
- [Unit]:
Description: Breve descripción del servicio.After=network-online.target: El servicio se iniciará después de que la red esté completamente configurada.Wants=network-online.target: Indica una dependencia deseada de la red.
- [Service]:
Type=forking: Indica a systemd que el proceso principal del servicio hará fork, dejando un proceso hijo (nuestro tun2socks), y el proceso padre (el script) terminará. systemd usaráPIDFilepara rastrear el proceso real del servicio.PIDFile=/var/run/tun2socks.pid: Ruta al archivo donde nuestro script guarda el PID de tun2socks. Esto es crítico paraType=forking.ExecStartPre=/usr/local/bin/tun2socks_redirect.sh: Comando que se ejecuta antes del arranque principal del servicio. Aquí nuestro script configura el dispositivo TUN y las reglas iptables, y lanza tun2socks en segundo plano.ExecStart=/bin/true: Dado que tun2socks ya fue iniciado por nuestroExecStartPrey systemd lo rastrea porPIDFile, no necesitamos ejecutar nada enExecStart./bin/truesimplemente devuelve éxito.ExecStopPost=/usr/local/bin/tun2socks_redirect.sh cleanup_only: Comando que se ejecuta después de detener el servicio. Llamado con el argumentocleanup_onlyel script solo limpia las reglas.User=root: El servicio debe ejecutarse como root porque modifica configuraciones de red y reglas iptables.Restart=on-failure: Si el servicio termina con error, systemd intentará reiniciarlo.RestartSec=5s: Retardo antes de intentar reiniciar.
- [Install]:
WantedBy=multi-user.target: El servicio se iniciará al arrancar el sistema en modo multiusuario.
Habilitar e iniciar el servicio Systemd
Después de crear el unit file y ajustar el script:
Recarga el demonio systemd:
sudo systemctl daemon-reloadHabilita el servicio para que arranque automáticamente:
sudo systemctl enable tun2socks-redirect.serviceInicia el servicio:
sudo systemctl start tun2socks-redirect.serviceComprueba el estado del servicio:
sudo systemctl status tun2socks-redirect.serviceDeberías ver que el servicio está activo (
active (running)).Revisa los logs:
journalctl -u tun2socks-redirect.service -fEsto te ayudará a seguir la salida del script y de tun2socks.
Ahora tu servicio se iniciará automáticamente al arrancar el sistema e intentará mantener funcionando tun2socks y las reglas de enrutamiento. Para detener el servicio usa sudo systemctl stop tun2socks-redirect.service, y limpiará las reglas automáticamente. Para reiniciarlo usa sudo systemctl restart tun2socks-redirect.service.
Conclusión
De este modo hemos configurado un sistema que redirige todo el tráfico TCP de un contenedor especificado a través de un servidor proxy SOCKS. Este método ofrece flexibilidad y control sobre el tráfico de red, permitiéndote gestionar fácilmente su enrutamiento a través de proxies externos, y la integración con systemd mejora significativamente la fiabilidad y la facilidad de gestión.
Espero que este artículo te haya sido útil! Si tienes preguntas o sugerencias, no dudes en dejar comentarios.
Reseñas relacionadas
La experiencia de colaboración dejó una impresión sumamente positiva, principalmente por el profesionalismo y el enfoque para resolver los problemas que surgieron.
mendarinno384 · Jitsi Meet: Zoom personal, configuración de Jitsi Meet en Docker y en VPS
11.11.2025 · ⭐ 5/5
La experiencia de colaboración dejó una impresión sumamente positiva, principalmente por el profesionalismo y el enfoque para resolver los problemas que surgieron.
Había que hacer funcionar n8n, Redis y la base de datos. Lo había encargado antes a otro proveedor; todo se rompía constantemente. Se lo encargué a Mijaíl y al día siguiente todo funcionó rápido, ¡como un reloj!
christ_media · Instalación de n8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram
Comprador experimentado24.09.2025 · ⭐ 5/5
Había que poner en marcha n8n, redis y la base de datos. Contraté antes a otro proveedor, y todo se rompía constantemente. Lo encargué a Mikhail, y al día siguiente ¡todo empezó a funcionar rápido, como un reloj!
Gracias por el trabajo rápido y bien hecho. Todo se hizo de manera ágil y como debía ser!
Dr-zelenin · Instalación de n8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram
06.09.2025 · ⭐ 5/5
Gracias por el trabajo rápido y bien hecho. Todo se hizo con prontitud y tal como se necesitaba!
Solución rápida al problema, ¡recomiendo a Mijaíl como profesional a todo el mundo! Intenté montar una configuración similar por mi cuenta y siguiendo consejos de IA, y acabé gastando mucho tiempo y dinero (por el tiempo de inactividad del servidor). Así que mi consejo final: acudan a profesionales, sale más barato =) Gracias a Mijaíl por su profesionalidad.
ladohinpy · Instalación de n8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram
25.08.2025 · ⭐ 5/5
Solución rápida al problema, ¡recomiendo a Mikhail como profesional! Intenté montar una configuración similar por mi cuenta y siguiendo consejos de redes neuronales, y acabó siendo una pérdida de mucho esfuerzo y dinero (por el tiempo de inactividad del servidor). Así que mi consejo al final: acudan a profesionales, saldrá más barato =) Gracias a Mikhail por su profesionalismo.
Mijaíl configuró otro VPS. Rápida y profesionalmente sorteó ciertas limitaciones de los proveedores de hosting.
NadoBy · Instalación de N8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram
Cliente acostumbrado12.08.2025 · ⭐ 5/5
Mijaíl completó la configuración de otro VPS. De forma rápida y profesional, sorteando ciertas limitaciones impuestas por los proveedores de hosting.
¡Excelente trabajo, gracias! ¡Mijaíl es un profesional, lo recomiendo!
Dina_Perova · Instalación de n8n en su servidor VPS. Configuración de n8n, Docker, IA, Telegram
Cliente acostumbrado03.07.2025 · ⭐ 5/5
¡Excelente trabajo, gracias! Mikhail es un profesional en lo suyo, ¡lo recomiendo!