使用 ssh 端口转发,需要一个 ssh 服务器作跳板机,不能在接收端口服务器本身作跳板机。
大概的流程是,所有指向本地端口(local_host
)的流量都会转发到 tunnel_host 跳板机,然后通过跳板机转发到 target_host
ssh -NL [local_host:]local_port:target_host:target_port tunnel_user@tunnel_host
-L
指本地转发,-N
指不进入 tunnel_host(跳板机)主机会话,-f
指后台运行。local_host
:本地主机,在此主机转发,local_host 可以不设置,默认是127.0.0.1
,如果想要外部可以访问,需要改成0.0.0.0
,这个需要在sshd_config
中将GatewayPorts
改为yes
,不过设置 local_host 为 0.0.0.0 就可以了。同理,local_port 就是接收转发的端口。target_host
:需要转发的主机地址。同理,target_port
是需要转发主机的端口。tunnel_host
:就是跳板机,跳板机需要 OpenSSH 服务器。
# 使用 192.168.50.16 作跳板机,将 192.168.50.175 远程桌面端口转发到本机 3389 端口
# 使用 0.0.0.0 保证外部网络也可以访问
ssh -NL 0.0.0.0:3389:192.168.50.175:3389 [email protected]
远程转发指的是在远程 SSH 服务器建立的转发规则,反向端口转发。
ssh -R [REMOTE:]REMOTE_PORT:DESTINATION:DESTINATION_PORT -N [USER@]REMOTE_HOST
- 在这里必须设定远程主机的
GatewayPorts
可以由外部设备访问转发的端口。- REMOTE_PORT:目标端口转发到的端口,可以是本地的端口,或者远程的端口,但要与 REMOTE_HOST 对应
- DESTINATION:目标地址,可以是
localhost
、或者本地的其它设备的地址或者远程计算机,同理 LOCAL_PORT 也需要是对应设备的 IP,它是需要被转发。
# 例如,将本地(服务器)的 3389 端口转发到远程的主机中的 8888 端口
ssh -R 0.0.0.0:6666:remote_host:3389 -N root@localhost
动态转发是一种 SOCKS 代理,可以将本地的 SOCKS 代理转发到远程主机,然后通过远程主机访问互联网。
ssh -D [LOCAL_HOST:]LOCAL_PORT -N [USER@]REMOTE_HOST