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: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 隧道由远程服务器代为请求, 从而达到获取被屏蔽资源, 隐藏真实身份的目的.
动态转发实际上实现了正向代理功能, 因此可以用来科学上网. 本地转发也可以做正向代理, 但要对每一个请求的主机和端口做转发, 比较繁琐, 实践中不会这么用.
其它
kill
来源: http://www.tuicool.com/articles/baYVNrf