乐趣区

ssh端口转发的三种方式

转载请注明文章出处:ssh 端口转发的三种方式

ssh 是我使用最频繁的两个命令行工具之一(另一个则必须是 vim)。有了 ssh,我可以远程处理各种可能出现的问题而无需肉身到现场。

这几天 teamviewer 被黑的事情影响挺大,于是由远程控制想到了内网穿透,自然而然的想到了 ssh 的端口转发也能实现内网穿透。再细想一下,发现 ssh 隧道、或者说 端口转发 ,竟然实现了 正向代理 反向代理 内网穿透 三种常用的网络功能,更佩服其功能的强大和使用中的便利。

ssh 有三种端口转发模式,本文一一对其做简要介绍。

本地转发

本地端口转发(Local Port Forwarding),是将本地主机某个端口流量转发到远程主机的指定端口。其命令行语法是:-L [bind_address]:localport:remote_host:remote_port。”-L” 即“local”的首字母,类似的远程转发的 ”-R” 是“remote”的首字母,动态转发的“-D”是“dynamic”的首字母,很好记。

举一个例子说明本地转发的使用场景。

CentOS 7 安装 GUI 界面及远程连接一文中介绍了安装 vnc 服务并开启端口访问。在实际中,暴露出来的 59xx 端口每天都会源源不断的受到自动化脚本的爆破攻击。如果你的 vnc 和登录用户使用弱密码或字典密码,主机安全将受到极大威胁。这种情形下该如何防护?

一种简单安全的防护方法是:使用 iptables/firewalld 关闭端口的外网访问,有连接需求时用 ssh 隧道转发端口:

ssh -L5901:localhost:5901 username@host

该命令中将本地的 5901 端口通过 ssh 隧道 转发到远程主机的 5901 端口,远程连接时输入 localhost 或者 127.0.0.1 和 5901 端口便连到了远程主机的 5901 端口。通过 iptables 和 ssh 的本地转发,实现了他人无法连接,只有自己才能访问的目的。

需要注意的是“-L”选项中的“远程主机”并不特指连接过去的机器(默认是连接上的机器),可以是任何一主机。例如可以将本机的 8080 端口流量转发到 facebook.com 的 80 端口:

ssh -L8080:facebook.com:80 username@host

远程转发

远程端口转发(Remote Port Forwarding),是将远程主机某个端口转发到远程主机的指定端口。其命令行语法是:-R [bind_address]:port:[local_host]:local_port

远程转发最常用的功能是 内网穿透 。有一个公网 ip 的主机,便可以借助 ssh 隧道的远程转发实现内网渗透,达到外网访问内网资源的目的。需要注意的是 ssh 远程转发 默认只能绑定远程主机的本地地址,即 127.0.0.1。如果想要监听来自其他主机的连接,需要修改远程主机 ssh 的配置,将 ”GatewayPorts” 改成“yes”,重启 ssh 后生效。

一个将远程的 8080 端口流量转发到本地 80web 端口的示例:

ssh -R0.0.0.0:8080:80 username@host

通过远程转发,访问公网 ip 主机的 8080 端口便是访问内网 web 主机的 80 端口,这样就实现了内网穿透。

动态转发

无论本地转发还是远程转发,都需要指定本地和远程主机的端口。动态转发(Dynamic Port Forwarding)则摆脱这种限制,只绑定本地端口,远程主机和端口由发起的请求决定。动态转发的语法是:”-D bind_address:port”,一个转发示例:

ssh -D 8080 username@host

该命令让 ssh 监听本地 8080 端口,经过 8080 端口的流量都通过 ssh 隧道由远程服务器代为请求,从而达到获取被屏蔽资源、隐藏真实身份的目的。

动态转发实际上实现了正向代理功能,因此可以用来科学上网。本地转发也可以做正向代理,但要对每一个请求的主机和端口做转发,比较繁琐,实践中不会这么用。

其它

  1. 从用户端角度看,本地转发是正向代理;从资源提供方角度看,本地转发是反向代理;
  2. ssh 连接断开远程转发 / 内网渗透便失效。如果希望远程转发一直有效,需要 ssh 保活技术,建议用 frp 等专注于内网渗透的解决方案;
  3. 虽然 ssh 隧道中的流量都经过了加密,但防火墙对 ssh 隧道中承载的流量能比较智能的识别,因此用作科学上网很容易受到干扰;
  4. 如果仅做端口转发,实践中上述命令经常与 ”-NT -f” 选项结合使用。其中 ”-f” 选项将命令放入后台执行,断开连接需要用 kill 命令;
  5. 从代理角度看,ssh 隧道是低效的,建议用专用软件;
  6. ssh 隧道的流量都经过了加密,从安全角度是十分可靠的。
退出移动版