SSH代理通常指利用SSH建立的代理通道,例如通过 动态端口转发(SOCKS5) 或者 Agent转发 来代理身份验证请求;而 端口转发(Port Forwarding)分为本地(-L)、远程(-R)和动态(-D)三类,用于把流量从一端安全地转发到另一端。跳板机(bastion host)是位于外网与内网之间的单点入口,通常充当受控的中继,配合 ProxyJump (-J) 或端口转发可以安全访问内网目标。
跳板机的优势在于统一审计、最小化暴露服务、并可结合 SSH密钥、MFA 及访问控制实现安全访问策略。
外网机器A → 跳板机B → 内网目标C,通过跳板机统一出口并记录操作。
最直接的方式是使用SSH的 ProxyJump 选项(简写为 -J):
ssh -J user@jump.example.com user@target.internal
这条命令会将SSH连接先发到跳板机(jump.example.com),跳板机再代理连接到目标(target.internal)。如果目标端口不是默认的22,可以用 -p 指定端口。
为了更方便,可以在 ~/.ssh/config 添加:
Host target.internal
User user
ProxyJump user@jump.example.com
使用 ProxyJump 简化命令链、不需要手动建立中间隧道且易于与SSH配置管理结合。
本地端口转发(-L)将本机端口转发到远端目标;远程端口转发(-R)则是将远端端口转发到本地或另一个内网目标。
ssh -L 5432:db.internal:5432 user@jump.example.com
执行后,本地访问 localhost:5432 的流量会被通过跳板机转发到内网数据库 db.internal:5432。
ssh -R 8080:localhost:3000 user@jump.example.com
这会在跳板机上打开 8080 端口并把流量转发到你本地的 3000 服务,适合临时将本地开发服务暴露给跳板机或第三方。
远程转发可能会带来安全风险,需结合跳板机的防火墙、sshd_config 中的 GatewayPorts 等设置进行限制。
动态端口转发(-D)会在本地创建一个SOCKS代理,应用程序配置为使用该代理后,所有通过代理的流量会通过跳板机发出。
ssh -D 1080 -N user@jump.example.com
命令说明:-D 1080 在本地打开1080端口的SOCKS5代理;-N 表示不执行远程命令,仅建立隧道。之后在浏览器或curl中配置SOCKS5代理为 localhost:1080。
在Firefox中设置网络代理为 SOCKS5 host=localhost port=1080,或者使用 proxychains、tsocks 将命令行工具透过该代理访问。
常见安全建议包括:禁用密码登录、使用SSH密钥并设置Passphrase、开启两步验证或TOTP,限制跳板机上的允许用户和登录来源地址。
避免在跳板机上保留私钥;如果需要转发私钥权限,可用 ssh-agent 与 -A,但注意Agent转发有被窃用风险,务必信任跳板机或仅在受控环境使用。
启用最小权限原则:只开放必要端口,使用防火墙(iptables/nftables/安全组)限制来源IP,日志审计并定期复查转发规则。对外暴露远程端口时尽量避免使用 GatewayPorts yes,或限制为绑定到特定地址。
如果连接失败,检查:DNS是否能解析目标、跳板机的SSHD是否允许 AllowTcpForwarding、本地端口是否被占用、以及是否有防火墙阻断中间流量。使用 ssh -v 或多重 -vvv 调试输出定位问题。
