关于 SSH 端口转发
SSH 的端口转发很实用,但我总觉得难以理解和记忆,直到最近才有所好转。 因为又派上用场了。以前基本只做做内网穿透,现在更多地拿来绕过防火墙。自己的服务器,大多数端口虽然都是被禁用的(至少禁止入网,这也是正常的安全措施),但是想要连接的话直接本地端口转发就可以了。 TL;DR 本地端口转发在当前机器上设置,然后从本机出发,通过另一台机器,连接其他的机器。适用于防火墙的绕过、多重 SSH 登录等。 远程端口转发在当前机器上设置,然后从另外一台机器出发,通过当前机器,连接本机或者其他的机器。适用于 NAT 网络穿透、暴露内部网络服务等。 本质上都是先建立 SSH 会话,形成隧道,然后在上面进行正向或反向的数据传输。 Local Port Forwarding 为什么叫做本地呢,我想有两个原因: 转发的端口在当前(执行 SSH 命令这台)机器上 请求是从当前机器发出的 当前机器就是我的笔记本,另外一台是服务器。比如,在服务器上部署一个应用,开放给 8000 端口,但是被墙掉了,没办法在本地调试,怎么办?防火墙肯定开放了 SSH 登录的端口,比如 22,那么就让请求从本地的端口发送到服务器的 22 端口,再转发到 8000 端口,最后原路返回。我可以设置本地的端口也是 8000,这样直接用 localhost:8000 来访问应用就好了。 转发的重点在于本地的 8000 端口和服务器的 22 端口之间,因为请求到了服务器之后可以给应用的 8000,也可以给其他的机器,只要服务器能连接到: # ssh -L local_port:dest_addr:dest_port server # Local 8000 < -- > Server 22 < -- > Server 8000 # -fNT 让 ssh 不要打开服务器 shell,并且转为后台运行 # server 隐含了使用 22 端口登录,当然也可以在 ssh config 中设置任意登录端口 ssh -fNT -L 8000:localhost:8000 server 注意这里的 dest 对应的 src 是 server,也就是说 localhost 及后面的 8000 都是 server 的 IP 和端口。可以理解为 server 是中介,整条通路是 local -> server -> dest....