![Firejail no funciona sobre el túnel SSH de Socks5](https://rvso.com/image/168783/Firejail%20no%20funciona%20sobre%20el%20t%C3%BAnel%20SSH%20de%20Socks5.png)
Tengo un servidor Ubuntu 18.04 en el que creé dos pares de interfaces virtuales (veth0a y veth0b) y asigné el final de una interfaz (veth0b) a un nuevo espacio de nombres de red (netns0):
ip netns add netns0
ip netns exec netns0 ip link set lo up
ip link add veth0a type veth peer name veth0b
ip link set veth0b netns netns0
Luego utilicé firejail para forzar a un usuario específico (usuario de prueba) a usar este nuevo espacio de nombres de forma predeterminada configurándolo /usr/bin/firejail
como shell predeterminado para este usuario y agregando lo siguiente al /etc/firejail/login.users
archivo:
test-user: --netns=netns0
Realicé la siguiente prueba para asegurarme de que esto funcione:
- Ejecutar
tshark -i veth0a -f "port 443"
desde la cuenta raíz - SSH en el servidor como usuario de prueba
- Ejecutar
curl https://1.1.1.1
como usuario SSH
La salida de tshark muestra la dirección IP de origen veth0b adecuada para el tráfico 1.1.1.1.
El problema con el que me encuentro es cuando intento utilizar la cuenta de usuario de prueba para establecer el reenvío dinámico de puertos de Socks5 a través de SSH:
ssh -D 10000 -q -C -N test-user@server_ip
Ejecutar este comando desde mi computadora portátil o estación de trabajo me permite establecer un servidor calcetines5 local en el puerto 1000 y conectarlo a través de la conexión SSH. Configurar esto como mi proxy calcetines5 local e ir a https://api.ipify.org
demostrar que el proxy está funcionando y que mi computadora portátil está usando la dirección IP del servidor.
El problema es que el tráfico de sock5 no parece pasar por el espacio de nombres adecuado. En otras palabras, mientras navego por la web en mi computadora portátil mientras estoy conectado al servidor de calcetines5 a través de la conexión ssh del usuario de prueba, mi tráfico no aparece en tshark -i veth0a.
¿Se necesita algún paso adicional para garantizar que el túnel de reenvío de puertos también utilice firejail? ¿La configuración del shell en /etc/passwd solo afecta un shell de inicio de sesión interactivo? ¿Necesito cambiar también el shell no interactivo del usuario a /usr/bin/firejail
? Si es así, ¿cómo haría eso?
Cualquier ayuda sería muy apreciada.
Respuesta1
Lo que estás intentando no puede funcionar y te explico por qué.
Su conexión ssh se conecta al servidor remotosshddemonio, que se ejecuta en el host, no en el espacio de nombres de la red. Allí se crea una instancia para su conexión. Luego estás autenticado, luego se configuran los túneles,entoncessu sesión de usuario está configurada.
Aquí hay un extracto de un ejemplo ejecutado con un cliente ssh versión 7.9p1 usando ssh -v -4 -D 10000 remoteuser@server
:
debug1: Offering public key: /home/localuser/.ssh/id_ed25519 ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
debug1: Server accepts key: /home/localuser/.ssh/id_ed25519 ED25519 SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
debug1: Authentication succeeded (publickey).
Authenticated to server ([192.0.2.2]:22).
debug1: Local connections to LOCALHOST:10000 forwarded to remote address socks:0
debug1: Local forwarding listening on 127.0.0.1 port 10000.
debug1: channel 0: new [port listener]
debug1: channel 1: new [client-session]
debug1: Requesting [email protected]
debug1: Entering interactive session.
debug1: pledge: network
debug1: client_input_global_request: rtype [email protected] want_reply 0
debug1: Sending environment.
debug1: Sending env LANG = C.UTF-8
Como se puede ver, Local connections to LOCALHOST:10000 forwarded to remote address socks:0
...channel 0: new [port listener]
sucede primero.Entonces Entering interactive session
sucede. Esto normalmente llamaríacárcel de bomberosetc., y sería demasiado tarde: todo lo que se haga antes sucede en el espacio de nombres de la red del host. Pero en realidad en tu caso, ya que estás usando -N
:
-N
No ejecute un comando remoto. Esto es útil sólo para reenviar puertos.
nunca se ejecuta ningún shell,cárcel de bomberosno se ejecuta y nunca se toca ningún espacio de nombres de red alternativo. De todos modos, esto no importaría incluso sin -N
lo explicado anteriormente.
Entonces, si realmente quieres hacer eso, necesitarás un proxy SOCKS5 separado y no podrás usar el-D
ya no podrás usar la opción. Puedes ejecutar una instancia desshdo cualquier otra herramienta compatible con SOCKS5 (por ejemplo:dante-server
) dentro del espacio de nombres de la red y realizar redirecciones de puertos, utilizandoiptable,nftables, o el clásico-L
opción clásica desshredirigir aveth0bIP y el puerto de escucha de este proxy SOCKS5, pero esto probablemente requerirá algo más que solocárcel de bomberosy un usuario normal. En este punto será mejor que ejecutes toda la configuración desdesistemad, o con una en toda reglaLXC(oLXDoEstibadoretc.) contenedor.ip netns
muchas funciones son incluso suficientes para ello (ver:Gestión de espacios de nombres con ip netns (iproute2)).