通过 SSH 实现云服务器代理到本机
改了几十遍,真改不动了
本文部分章节因平台审核策略调整已做删减,完整内容可参见 https://juejin.cn/post/7405158247593050152
通过 SSH 转发到本机
有时候,我们可能需要在云服务器上安装一些软件,但由于网络问题(内网限制等)导致无法下载。此时如果本地计算机恰巧能访问对应资源(或者有能访问对应资源的代理),那我们可以通过 SSH 实现端口转发,将云服务器的请求转发到本地计算机再中转出去从而解决这一问题。
此方法还可用于"内网中某服务器想安装东西却无法下载,但内网中的本机可以下载"等情况(尽管这种情况并不多见)。
注:本文章不涉及任何翻墙内容,仅从技术层面讨论 SSH 的端口转发功能,请大家遵守网络守则,共同营造一个良好的网络氛围与安全的网络环境。
我的思路为 服务器:端口 a -> 本地计算机:端口 b -> 流量中转软件 -> 目标资源
可以使用不做任何配置的 cl*sh-verge-rev 或者 v2r*yN 作为中转的软件(或者其他能将流量转出去的软件也行)
如果本地计算机的代理软件端口为 7890,则可以将云服务器 1080 端口转发到本机 7890 端口:
ssh-R1080:127.0.0.1:7890 用户名@云服务器IP# 或者(服务器IP是可以省略的)ssh-R云服务器IP:1080:127.0.0.1:7890 用户名@云服务器IP在Termius中可以通过
Port Forwarding功能实现,和上面的代码差不多,更方便一点
此时我们在服务器上使用curl IP查询网站加上转发参数,查看当前 IP 会发现变成了本机计算机的 IP
curl4.ipw.cn-x127.0.0.1:1080curl4.ipw.cn--socks5127.0.0.1:1080下面是依次为基准延伸出去的拓展和记录
SSH 远程操作与端口转发
SSH 端口转发(Port Forwarding)可以通过加密的 SSH 通道在本地和远程主机之间转发网络流量
有三种主要类型:
- 本地端口转发(Local Port Forwarding)
- 远程端口转发(Remote Port Forwarding)
- 动态端口转发(Dynamic Port Forwarding)
1. 本地端口转发到远程服务器
使用-L参数可以将本地计算机上的特定端口流量转发到远程服务器上的特定端口。(本地端口->远程端口)
通常用于访问公司内网中的服务器或服务(比如自己放了台电脑在公司,就可以通过这台电脑访问公司内网)
假设host1是本地主机,可以访问外部网络,host2是公司办公电脑,在内网且但可以访问外部网络,host3是公司主机(比如内部数据库)也在内网但无法访问外部网络。此时host1就可以通过host2来访问host3。注:host1 和 host2 可以通过某些方式连接到一个局域网来互相进行访问(例如 tailscale 等工具)
# 在 host1 上运行ssh-L端口2:host3:端口3 user@host2上面的代码可以将host2的流量可以通过host2 的端口 2转发到host3 的端口 3。
注:此时host3的 IP 是相对于host2的来说的,也就是说host3可以是192.168开头的某机器,也可以是localhost(也就是host2自己)。下面是例子:
例如本地计算机需要通过 SSH 访问远程服务器remote_host上的localhost:3306(MySQL 数据库端口),并希望将其映射到本地计算机的端口8888。
ssh-L8888:localhost:3306 user@remote_host这样就能在本地计算机通过localhost:8888访问远程服务器上的 MySQL 服务。此时SSH 命令中的 localhost 是以 remote_host 视角来看的的
2. 远程端口转发到本地
使用-R参数可以将远程机器上的特定端口流量转发到本地主机的特定端口。(远程端口->本地端口)
通常用于允许远程计算机访问只有本机网络可以访问的东西。
假设需要将本地计算机上的localhost:8080(例如一个本地 Web 服务器)暴露给远程服务器remote_host的端口9090。
ssh-R9090:localhost:8080 user@remote_host这样远程服务器上的用户能够通过localhost:9090访问你的本地 Web 服务。此时SSH 命令中的 localhost 是以 本地主机 视角来看的的
3. 本地动态端口转发到远程服务器
此处因平台审核策略调整已删减,完整内容可参见 https://juejin.cn/post/7405158247593050152
其他参数
n 表示关闭标准输入
q 表示安静模式。消除所有的警告和诊断信息
C 表示压缩数据。在慢速连接上很有用,但在高速网络上反而会降低速度
T 表示不为这个连接分配远程终端(TTY)
N 表示只连接远程主机,不打开远程 shell(不执行远程命令)
以上参数可以配合使用,比如下面命令表示这个连接只用来传数据,不执行远程操作。
此处因平台审核策略调整已删减,完整内容可参见 https://juejin.cn/post/7405158247593050152
此外视需要还可以增加 -f 参数使 SSH 连接成功后转入后台运行。这样一来就可以在不中断 SSH 连接的情况下,在本地机器执行其他 shell 操作。
注:这些 SSH 没有断线重连功能,链接断了命令就退出了,所以需要些脚本监控重启,或者其他工具保持链接。
临时代理配置
Linux 服务器可以使用以下命令来设置临时代理(当前会话生效)
此处因平台审核策略调整已删减,完整内容可参见 https://juejin.cn/post/7405158247593050152
测试代理
此处因平台审核策略调整已删减,完整内容可参见 https://juejin.cn/post/7405158247593050152
关于登录
SSH 在第一次登录时,由于无法确认 host 主机的真实性,会显示连接主机的密钥指纹,问是否确认接受新的主机密钥(为了防止中间人攻击)
如果有物理访问权限或者可以通过其他安全途径访问服务器,可以使用以下类似的命令来主机秘钥指纹,以便于核对
# 查看ED25519主机秘钥指纹ssh-keygen-lf/etc/ssh/ssh_host_ed25519_key.pub当输入 yes 接收新的主机指纹后,会保存在~/.ssh/known_hosts文件中,Windows 是C:/Users/用户名/.ssh/known_hosts文件,这个文件会保存可信赖的远程主机的公钥。
注:当远程主机重装系统或者手动更改主机密钥之后,SSH 连接会发现指纹不匹配从而连接失败,此时在确认访问途径安全的情况下,可以使用ssh-keygen -R 远程主机地址来删除旧密钥条目。登录之后可以使用ls -l /etc/ssh/ssh_host_*查看主机秘钥变更的时间。
参考链接
- SSH 原理与运用(二):远程操作与端口转发 - 阮一峰的网络日志 (ruanyifeng.com)
- SSH 命令的三种代理功能(-L/-R/-D) - 苍青浪 - 博客园 (cnblogs.com)
- Linux 服务器使用本地 http 代理访问国外源 - Chancel’s blog
- 如何在 Termius 中添加带有端口转发的 ssh 命令(使用 -L、-R、-D)_termius 端口转发-CSDN 博客
- Linux 系统设置全局代理(http 代理,socks 代理)_export sock proxy-CSDN 博客