SSH(Secure Shell),一种安全通道协议,主要用来实现字符界面的远程访问功能
除了基本的远程登录命令行,端口转发也是 SSH 的重要功能
端口转发用来在客户端和服务器之间建立一个加密的 SSH 连接,通过该连接来把本地流量转发到服务器端,或者把服务器端流量转发到本地
端口转发有三种,本地端口转发、远程端口转发、动态端口转发
将对本地端口的访问通过 SSH 转发到目标主机的目标端口,目标主机是服务器可访问的主机
ssh -L [绑定地址:]<本地端口>:<目标主机>:<目标端口> <用户名>@<服务器>
本地端口转发是为了把远程服务拉到本地来访问
应用场景:服务器安装了 MySQL 服务,但没有开放 3306 端口,可以通过本地端口转发,实现本地开发环境访问服务器 MySQL
ssh -L 13306:localhost:3306 user@server
将服务器能访问的 localhost:3306
,即服务器自身的 3306 端口,映射到本地的 13306 端口,本地开发时使用 localhost:13306
来访问 MySQL
将对服务器端口的访问通过 SSH 转发到目标主机的目标端口,目标主机是本地可访问的主机
ssh -R [绑定地址:]<服务器端口>:<目标主机>:<目标端口> <用户名>@<服务器>
远程端口转发是为了把本地服务推到远程去访问
应用场景:服务器安装了 Nginx 服务,但还没有部署后端程序,如果希望通过服务器 IP 来访问到本地开发环境正在运行的后端程序,可以通过远程端口转发,实现服务器上 Nginx 对本地后端程序的访问
ssh -R 18080:localhost:8080 user@server
将本地能访问的 localhost:8080
,即本机自身的 8080 端口,映射到服务器的 18080 端口,服务器 Nginx 可直接代理 localhost:18080
来访问本地后端程序
由服务器来代理本地端口的流量请求
ssh -D [绑定地址:]<本地端口> <用户名>@<服务器>
应用场景:由于安全策略不能访问一些站点时,可通过与代理服务器建立动态端口转发来达到访问的目的
ssh -D 10808 user@server
测试 curl 通过代理访问
curl --socks5 127.0.0.1:10808 https://baidu.com
操作系统或者浏览器也都有代理相关配置,配置为 socks5://127.0.0.1:10808
即可实现流量的代理
在日常运维或开发工作中,由于安全策略或网络拓扑的限制,内网服务器并不会直接向外部暴露端口,导致本地环境无法直连。在企业内部常常会设立一种中间主机,专门负责连通互相隔离的网络环境,这种机器被称为跳板机(Jump Server)
通过 SSH 协议,我们可以先登录到跳板机,再在跳板机上登录目标主机进行操作,这种方式需要两次 SSH 命令,比较繁琐,实际上 SSH 协议提供了的更加便捷的方式来处理跳板机场景
当然,可以通过本地端口转发,将目标主机的 SSH 端口映射到本地端口
ssh -L 2222:<目标主机>:22 user@jump-server
只要本地端口转发在后台保持,可随时直接 ssh user01@localhost -p 2222
登录目标主机
从 OpenSSH 7.3 版本开始,SSH 引入了一个新的参数 -J
,该参数用于指定跳板机
ssh -J user@jump-server user01@<目标主机>
-J
指定跳板机为 jump-server,先登录到 jump-server,再通过 jump-server 访问目标主机
在配置文件 SSH config ~/.ssh/config
中配置
Host server01
HostName <目标主机>
User user01
ProxyJump user@jump-server
后续直接通过 ssh server01
来通过跳板机登录目标主机
在老版本的 SSH 客户端上需要使用 ProxyCommand 方式
ssh -o "ProxyCommand ssh -W %h:%p user@jump-server" user01@<目标主机>
-o "ProxyCommand"
选项指定一个自定义的命令来通过跳板机进行连接
ssh -W %h:%p
将目标主机%h
和端口 %p
转发给跳板机,然后通过跳板机建立与目标主机的连接
在配置文件 SSH config ~/.ssh/config
中配置
Host <目标主机>
ProxyCommand ssh -q -W %h:%p user@jump-server
后续直接通过 ssh user01@<目标主机>
来通过跳板机登录目标主机