跳转到内容
Doc Record

ssh动态代理

以下是对命令 ssh -o GatewayPorts=yes -D 2000 test-2023.intranet.company -NTfCg 的逐项解析和完整说明:


此命令通过 SSH 建立一个 后台运行的动态端口转发隧道(SOCKS5 代理),绑定到本地所有网络接口,允许远程主机通过该代理访问目标网络资源。具体用途包括:

  • 将本地 2000 端口作为代理入口,流量通过 test-2023.intranet.company 服务器转发。
  • 支持远程主机(非本机)连接本地 2000 端口(通过 -g 和 GatewayPorts=yes 实现)。
  • 后台静默运行,无终端交互,适合长期稳定的代理需求。

  • 作用:允许远程主机连接到本地转发的端口。
  • 默认行为:SSH 默认将本地端口绑定到 127.0.0.1(仅限本机访问)。
  • 启用后:绑定到 0.0.0.0(所有网络接口),使其他主机可通过本地 IP 访问 2000 端口。
  • 典型场景:需要将本地代理共享给局域网内其他设备时(如手机、平板)。

  • 作用:启用动态端口转发(SOCKS5 代理),监听本地 2000 端口。
  • 流量规则:所有发送到 2000 端口的流量将通过 SSH 隧道加密并转发到目标网络。
  • 端口选择:
    • <1024 的端口需要 root 权限(如 -D 80)。
    • 2000 是用户级端口,无需特权。

  • 作用:指定 SSH 连接的目标服务器。
  • 补充说明:
    • 确保该域名能被正确解析(如通过 DNS 或 /etc/hosts 配置)。
    • 如果使用密钥认证,需提前配置 ~/.ssh/config 或通过 -i 指定私钥。

  • 作用:不执行远程命令,仅建立隧道。
  • 用途:适用于纯端口转发场景,无需启动远程 Shell。

  • 作用:禁用伪终端(PTY)分配。
  • 用途:进一步减少资源占用,确保连接仅用于转发。

  • 作用:将 SSH 进程转入后台运行。
  • 操作提示:
    • 若需终止后台进程,可使用 ps aux | grep ssh 查找 PID 后执行 kill <PID>。
    • 结合 -f 时,输入密码需在命令中提前处理(如使用密钥或无密码登录)。

  • 作用:启用数据压缩(基于 gzip 算法)。
  • 适用场景:
    • 网络带宽较低时(如移动网络),减少传输数据量。
    • 传输大量文本数据(如日志、代码)。
  • 不适用场景:
    • 高速局域网环境(压缩可能增加延迟)。
    • 已加密或预压缩的数据(如视频、图片)。

  • 作用:允许远程主机连接本地转发端口(与 GatewayPorts=yes 功能重复,但双重确保)。
  • 历史背景:旧版 SSH 中,-g 是实现 GatewayPorts=yes 的等效命令行选项,现代版本中两者可同时使用以明确意图。

终端窗口
ssh \
-o GatewayPorts=yes \ # 允许远程主机连接本地端口
-D 2000 \ # 动态转发到本地2000端口(SOCKS5)
test-2023.intranet.company \ # 目标服务器
-N \ # 不执行远程命令
-T \ # 不分配终端
-f \ # 后台运行
-C \ # 启用压缩
-g # 允许远程主机连接

  • 浏览器或应用配置 SOCKS5 代理为 127.0.0.1:2000,所有流量通过 test-2023.intranet.company 转发。
  • 访问内部服务(如 http://internal-app:8080)时,流量经由隧道直达内网。
  • 在本地 PC 运行此命令,手机或其他设备将代理设置为 <PC的IP>:2000,即可通过 PC 的 SSH 隧道访问内网。
  • 绕过网络限制访问被封资源(如访问外部 API),依赖服务器的出口 IP。

  • 原因:SSH 认证失败(密码错误、密钥未配置)。
  • 解决:
    • 使用 -v 参数查看详细日志:ssh -v ...。
    • 配置密钥登录:ssh-copy-id user@test-2023.intranet.company。

2. 端口占用:bind: Address already in use

Section titled “2. 端口占用:bind: Address already in use”
  • 原因:本地 2000 端口被其他进程占用。
  • 解决:
    • 更换端口:-D 2001。
    • 释放端口:lsof -i :2000 查找占用进程并终止。
  • 原因:本地防火墙或路由器阻止外部访问 2000 端口。
  • 解决:
    • 开放防火墙:sudo ufw allow 2000(Linux)。
    • 检查路由器 NAT 规则(如需从公网访问)。

在 ClashX 配置文件中添加 SOCKS5 代理:

proxies:
- name: "ssh-tunnel"
type: socks5
server: 127.0.0.1
port: 2000
udp: true # 按需启用 UDP 转发
rules:
- DOMAIN-SUFFIX,intranet.company,ssh-tunnel

使用 autossh 替代 ssh 实现自动重连:

终端窗口
autossh -M 0 -o "ExitOnForwardFailure=yes" -NTfCg -D 2000 test-2023.intranet.company

此命令通过 SSH 动态端口转发,将本地 2000 端口变为一个多功能的 SOCKS5 代理通道,适合需要安全穿透内网或共享代理的场景。通过参数组合优化了后台运行、压缩和远程访问支持,是高效管理网络流量的实用工具。