Firejail no funciona sobre el túnel SSH de Socks5

Firejail no funciona sobre el túnel SSH de Socks5

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/firejailcomo shell predeterminado para este usuario y agregando lo siguiente al /etc/firejail/login.usersarchivo:

test-user: --netns=netns0

Realicé la siguiente prueba para asegurarme de que esto funcione:

  1. Ejecutar tshark -i veth0a -f "port 443"desde la cuenta raíz
  2. SSH en el servidor como usuario de prueba
  3. Ejecutar curl https://1.1.1.1como 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.orgdemostrar 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 sessionsucede. 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:

-NNo 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 -Nlo 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)).

información relacionada