国内的优良传统,去年5月份DockerHub突然就不能用了,想拉个镜像都不知道标签版本是多少,更别提各版本的区别了,很难受,国内的Tag文档网站平时用的也都关了,简直要命。平时GitHub也是时灵时不灵的,看运气吧。为了能更好的学习,增强国际关系,现在介绍一个 SSH隧道端口动态转发实现SOCKS代理的方法(即通过ssh连接实现代理)。
为啥用这个,不直接Http代理?好多云服务器限制了VPN一类的软件,我就不试了。
1. 准备材料
- 香港或国外云服务器,这是最重要的,通过这个来访问国际网站的。阿里和腾讯都有活动,好像99一年的带公网IP,1M带宽,我觉的还行,所以我从淘宝找了个8块1个月的(带IP,3M带宽,快多了)先试试水。
-
MobaXterm汉化版
提取码:TJRc
其实 xshell、putty、crt等都能实现ssh隧道端口转发,但MobaXterm界面有意义,就用这个。
-
MobaXterm汉化版
- Edge浏览器/360等Chrome内核浏览器 +
Proxy SwitchyOmega
插件
或者直接用火狐浏览器(它能设置SOCKS代理),但不如用插件的方便
- Edge浏览器/360等Chrome内核浏览器 +
- Privoxy (如果想更好用,可以用这个将socks代理转http代理,我直接用的socks代理,没用这个)
2. 使用
2.1 准备云服务器
- 记住要香港或国外的云服务器,云服务器能直接访问漂亮国的。
- 有IP的。
- 能在自己电脑ssh连接的。
我在淘宝8块买的都满足,直接用。
2.2 本地电脑实现SOCKS代理
- 下载打开
MobaXterm汉化版
- 下载打开
- 从下面打开mobaSSHTunnel设置
mobaSSHTunnel
填写
1处填写ssh连接信息,密码先不用写,下一步填
2处填写一个本地端口,稍大点,2000-5000直接就行,然后保存
- 从下面打开mobaSSHTunnel设置

编辑一下图上的地方,选本机网卡IP(127.0.0.1不一定好使)。
- 最后开启隧道
一定要开启,这样SOCKS代理就好了,代理地址就是 刚才你选的网卡地址,端口就是刚才填的那个,一般使用socks5代理模式。如上图,我的应该是:192.168.2.200:5678 socks5
- 最后开启隧道
2.3 浏览器设置
看自己喜好,我用的Edge浏览器。
- 安装
Proxy SwitchyOmega
插件
1718253242829.png
- 安装
-
设置代理
配置代理
-
在proxy选项卡填上刚才自己的SOCKS代理,点击应用选项 保存
- 启用代理
在浏览器的扩展标签切换到proxy代理,就可以愉快的谷歌和YouTube了。



不用了记得把代理切换回去,不然网速慢。
这只是对 单个浏览器启用了代理,如果想要 电脑都启用代理,那就找个ss代理客户端吧。
3. 命令实现socks代理服务
上面2.2是在我们自己电脑上用MobaXterm软件做了 SOCKS代理服务器。其实我们可以把这个代理服务 放到一个 linux上。正好我有N1,装的 OpenWrt,可以在上面 用ssh命令实现SOCKS代理服务。因为连ssh需要密码,所以得手动执行命令。要想N1开机执行命令,免密登陆ssh,需要生成公钥,这里就不弄了。
3.1 安装ssh客户端
OpenWrt 中默认自带的 SSH 服务端和客户端是 Dropbear,Dropbear 作为 SSH 客户端无法满足我们的需要,所以我们要安装 openssh-client。
首先连上N1的ssh。我这个有网页版的TTYD终端,就在里面执行命令就行。
# 1. 更新源
opkg update
# 2. 安装
opkg install openssh-keygen openssh-client
# openssh-keygen负责生成密钥和公钥,openssh-client负责作为客户端与其它主机连接
3.2 用ssh命令实现SOCKS代理
从2.2中MobaXterm的图片上,我们可以看出:ssh隧道大致可以分为本地端口转发、远程端口转发、动态端口转发3种,每种都有自己的ssh命令格式,我们今天用的是 第3种。
命令讲解
-g:开启网关,表示所有访问这个地址的请求都可以转发;如果不加,只有在这个电脑上访问这个地址才转发
-Nf:N表示创建隧道以后不连接到 ssh服务端,连接之后界面会直接卡住,若你要建立之后并连接ssh服务端操作,可以直接取消本参数;f表示在后台运行,注意在后台运行只能通过杀进程的方式结束;连写
-L:表示local,本地端口转发;
-R:表示remote,远程端口转发;
-D选项:表示使用动态端口转发创建ssh隧道
- 本地端口转发
模型:本地主机 <===> ssh服务器 <===> 远端主机
连接从本地主机转发到SSH服务器主机,然后转发到远端主机端口。
因为 本地主机能连ssh服务器,不能连远端主机,而ssh服务器能连远端主机。
# 命令格式
ssh -g -N -L -f [本地端口]:[远程IP]:[远程端口] [ssh帐号]@[ssh服务IP] -p [ssh服务端口]
# 例子
ssh -g -Nf -L 1234:192.168.2.90:80 root@192.168.2.2 -p 22
# root@192.168.2.2 -p 22 表示使用root用户连接 192.168.2.2 的ssh服务,ssh端口是22
# 上面的命令意思是,访问本机电脑的 http://本地IP:1234 可以直接访问到远程机器的 http://192.168.2.90:80所在的web服务。
- 远程端口转发
模型:ssh服务器 <===> 本地主机 <===> 远端主机
将请求从ssh服务器主机转发到本地主机,然后转发到远端主机。
# 命令格式
ssh -g -Nf -R [ssh主机端口]:[远端主机IP]:[远端主机端口] [ssh帐号]@[ssh服务IP] -p [ssh服务端口]
# 例子
ssh -g -Nf -R 2345:192.168.2.90:80 root@192.168.1.10 -p 22·
# root@192.168.1.10 -p 22 同上
# 上面的命令意思是,访问ssh机器(192.168.1.10)的2345端口,相当于访问了远端主机(192.168.2.90)所在的web服务。这里需要注意,默认ssh只会绑定端口在127.0.0.1环回地址上面,若需要绑定到所有 IP,需要在远程机器 sshd 配置文件中打开GatewayPorts:on。
- 动态端口转发(socks代理)
模型:本地主机 <===> ssh服务器 <===> 网络上的所有服务
,同本地端口转发类似,只不过远程主机不确定,由ssh自动判断不同协议的请求作不同的处理。
# 命令格式
ssh -g -Nf -D [本地主机端口] [ssh帐号]@[ssh服务IP] -p [ssh服务端口]
# 例子
ssh -g -Nf -D 3456 root@1.1.1.1 -p 22
# 上面的命令意思是,访问http://本地主机:3456 的请求转到 ssh服务器,然后由ssh服务器去处理请求。而本地主机的IP和端口 服务 就是 socks代理服务器。
所以 在N1 上执行这个命令,N1就可以做socks代理服务器:ssh -g -Nf -D [指定端口] root@[云主机IP] -p [云主机SSH端口]
4. 用 Privoxy 将socks代理转http代理
以ubuntu系统为例:
4.1 安装privoxy
sudo apt-get install privoxy
4.2 修改配置文件
sudo vi /etc/privoxy/config
- 注释掉 listen-address 127.0.0.1:8118,应该是2行,一行IPV4的,一行IPV6的
# listen-address 127.0.0.1:8118
# listen-address [::1]:8118
- 末尾添加
# forward-socks5 远程socks5代理的地址
# forward-socks5t 也是相同的功能,区别是forward-socks5t不使用代理解析DNS,所以不用它,改为使用forward-socks5
# 注意格式,末尾有点
forward-socks5 / 192.168.2.199:6789 .
# listen-address 本地监听的http代理端口
listen-address 192.168.2.199:8118
4.3 启动或重启privoxy服务
sudo systemctl start privoxy
systemctl restart privoxy
systemctl enable privoxy
4.4 测试Http代理是否成功
# 会显示云服务器的ip和归属地
curl -x 'http://192.168.2.199:8118' myip.ipip.net
curl -x 'socks5://192.168.2.199:6789' myip.ipip.net
网友评论