Sì, questo si chiama GatewayPorts
in SSH. Un estratto da 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”.
E puoi usare localhost
invece di M
nell'inoltro, poiché stai inoltrando alla stessa macchina a cui stai inviando SSH, se ho capito correttamente la tua domanda.
Quindi, il comando diventerà questo:
ssh -L 2222:localhost:8888 -N -o GatewayPorts=yes hostname-of-M
e avrà questo aspetto in netstat -nltp
:
tcp 0 0 0.0.0.0:2222 0.0.0.0:* LISTEN 5113/ssh
Ora chiunque acceda a questa macchina alla porta 2222 TCP parlerà effettivamente con localhost:8888 come visto nella macchina M. Nota che questo non è lo stesso del semplice inoltro alla porta 8888 di M.
C'è un altro modo. Puoi impostare il port forwarding da S:2222 a W:8888 con iptables. Singolo comando:
iptables -t nat -A PREROUTING -p tcp --dport 2222 \
-j DNAT --to-destination 1.2.3.4:8888
dove 1.2.3.4 è l'indirizzo IP di M. Si chiama NAT (Network Address Translation).
Altre alternative:netcat
(tradizionale) o socat
Sul server (S):
socat tcp-listen:2222,reuseaddr,fork tcp:M:8888
o
nc -l -p 2222 -c 'nc M 8888'
Dettagli vedi in:Un modo semplice per creare un tunnel da una porta locale a un'altra?