服务器:流量端口转发与代理
概览
实现 SSH 免密登录,并让云服务器流量转发到本地端口,通过代理再返回。
免密登录
打开 ~/.ssh/config,写入:
1 | Host <server ip> |
打开 Cursor 的 Remote Explorer,会看到多了 <server ip> 这个选项。
现在配置免密
本机生成密钥
1
ssh-keygen -t ed25519 # 随便取一个文件名
公钥写入服务器
1
ssh-copy-id ~/.ssh/id_ed25519.pub <user>@<server-ip>
验证免密登录
打开 Cursor 的 Remote Explorer,直接点击配置的 <server ip>;也可以使用命令行:
1 | ssh <user>@<server-ip> |
端口转发与代理
原理
建立与云服务器的 SSH 正向隧道后,再搭建一条反向隧道(云服务器 -> 本机)。以下以 “云服务器 1080 端口 ↔ 本机 7897 端口” 为例:
- 云服务器访问外网时,将流量统一发到 1080 端口。
- 反向隧道把 1080 端口的流量转发到本机 7897。
- 本机 7897 端口交给代理软件,按节点分发,再把结果回传给云服务器。
实现
提供三种实现方法,实现方法三选一即可, 但是前置步骤要完成
前置步骤
- 在代理软件的端口设置中开启混合端口转发(以 7897 为例)。
- 在云服务器中配置环境变量,统一走 1080 端口。编辑
~/.bashrc:
1 | # 检查代理是否可用并自动选择代理或直连 |
保存后运行 source ~/.bashrc 使其生效。
- 编辑
/etc/ssh/sshd_config,将以下参数取消注释并设为yes:AllowTcpForwarding:允许 SSH 客户端发起本地/远程端口转发。GatewayPorts:远程端口转发可绑定0.0.0.0/::。PermitTunnel:允许基于 SSH 的三层隧道。
三种方法
注: 三种方法在云服务器上绑定的端口都是 1080, 最好用完一个方法就关闭, 而不是一起使用, 否则可能造成端口冲突
- 写入本地 SSH 配置
在~/.ssh/config中(基于免密配置)写入:
1 | Host <server ip> |
写好后,Cursor 远程连接服务器时会自动启动反向隧道。
使用脚本与工具保持隧道
- 普通 SSH,一旦关闭终端会话就会断开:
1
2ssh -M 0 -f -N -v -o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
-i ~/.ssh/<key file name> -R 1080:localhost:7897 <user>@<server ip>- 使用
autossh可以保持连接,先通过 Homebrew 安装:
1
brew install autossh
再写脚本方便启动和提示:
1 | # 文件名 start_ssh_tunnel.sh |
后续操作:
1 | # 打开端口转发 |
Termius 配置端口转发
在 Termius 左侧 Port Forwarding 中新建规则:- Remote host:
<server ip> - Remote port:
1080 - Bind address:
127.0.0.1 - Destination address:
127.0.0.1 - Destination port:
7897
没搞懂 Bind address 和 Destination address 的区别
不过确认 Termius 显示From <server ip>:1080 to 127.0.0.1:7897即表示已连通,启用后再连接服务器即可完成转发。- Remote host:
测试
测试要使用 curl, 而不能使用 ping
因为 ping 基于 ICMP 协议, 运行在网络层,而我们配置的 SSH 端口转发 + 代理仅支持 TCP/UDP 协议,ICMP 数据包无法通过代理隧道转发
1 | # 请求国内网络 |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 Fish's Blog!
