Sí, esto se llama GatewayPorts
en SSH. Un extracto de ssh_config(5)
:
GatewayPorts
Specifies whether remote hosts are allowed to connect to local
forwarded ports. By default, ssh(1) binds local port forwardings
to the loopback address. This prevents other remote hosts from
connecting to forwarded ports. GatewayPorts can be used to spec‐
ify that ssh should bind local port forwardings to the wildcard
address, thus allowing remote hosts to connect to forwarded
ports. The argument must be “yes” or “no”. The default is “no”.
Y puedes usar localhost
en lugar de M
en el reenvío, ya que está reenviando a la misma máquina a la que está enviando SSH, si entiendo su pregunta correctamente.
Entonces, el comando será este:
ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M
y se verá así en netstat -nltp
:
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 5113/ssh
Ahora cualquiera que acceda a esta máquina en el puerto 2222 TCP en realidad hablará con localhost:8888 como se ve en la máquina M. Tenga en cuenta que esto no es lo mismo que el reenvío simple al puerto 8888 de M.
Hay otra manera. Puede configurar el reenvío de puertos de S:2222 a W:8888 con iptables. Comando único:
iptables -t nat -A PREROUTING -p tcp --dport 2222 \
-j DNAT --to-destination 1.2.3.4:8888
donde 1.2.3.4 es la dirección IP de M. Se llama NAT (traducción de direcciones de red).
Más alternativas:netcat
(tradicional) o socat
En el servidor (S):
socat tcp-listen:2222,reuseaddr,fork tcp:M:8888
o
nc -l -p 2222 -c 'nc M 8888'
Ver detalles en:¿Forma sencilla de crear un túnel de un puerto local a otro?