用SSH搭建一个简单代理服务器
⽤SSH搭建⼀个简单代理服务器
概述
相信⼤家⼀定遇见过下⾯这些情况:
1.所在⽹路因防⽕墙限制,导致⼀些协议、端⼝不能使⽤。
2.想⽤ VPN ,但配置太⿇烦。
3.不通过 VPN ,想从公司访问家庭⽹络,或在家访问公司⽹络等。
如果你有遇到过上⾯的这些情况,本⽂会给你提供⼀种简单的解决⽅法。
SSH端⼝转发
⾸先让我们先来了解⼀下什么是 SSH 端⼝转发。
SSH 端⼝转发是 SSH 提供的⼀种机制,通过 Server 和 Client 之间的加密连接中继其它端⼝的流量。因为连接是加密的,所以对于传输使⽤未加密协议(如IMAP、VNC或IRC)的信息⾮常有⽤。
端⼝转发分类
SSH 端⼝转发⼀般分为两类:
1.本地端⼝转发
2.远程端⼝转发
本地端⼝转发
本地端⼝转发的作⽤是把 Client 的某个端⼝的流量通过 SSH 连接转发到 Server ,如图1所⽰。
图1 本地端⼝转发
命令格式如下:
ssh -L <local port>:<remote host>:<remote port> <SSH hostname>
假设 Client 地址是 192.168.111.2,Server 地址是 192.168.111.3。在Client 端执⾏如下命令:
root@client $ ssh -L 2222:localhost:22 192.168.111.3
通过上⾯的命令连接上 Server 后,即实现了本地端⼝转发。只要在 Client 上连接本地的 2222 端⼝等同于连接 Server 的 22 端⼝,如下两条命令是等价的,均是连接 Server 的 22 端⼝:
root@client $ ssh 127.0.0.1 -p 2222 root@client $ ssh 192.168.111.3 -p 22
但是这⼉有个问题,就是 Client 的 2222 端⼝是监听在 lo 接⼝上的,因此只有 Client 可以连接,为了让其他主机也可
但是这⼉有个问题,就是 Client 的 2222 端⼝是监听在 lo 接⼝上的,因此只有 Client 可以连接,为了让其他主机也可以连接 Client 的 2222 端⼝,上⾯的命令需要加⼀个 -g 参数。
root@client $ ssh -gL 2222:localhost:22 192.168.111.3
这样外部其他主机也可以连接 Client 的 2222 端⼝了。
远程端⼝转发
与本地端⼝转发相对应的是远程端⼝转发,其作⽤是把 Server 的某个端⼝的流量通过 SSH 连接转发到 Client ,如图2所⽰。
图2 远程端⼝转发
命令格式如下:
ssh -R <remote port>:<local host>:<local port> <SSH hostname>
Client 上执⾏如下命令:
root@client $ ssh -R 2222:localhost:22 192.168.111.3
连接 Server 后,远程端⼝转发⽣效。此时在 Server 上连接本地的 2222 端⼝等同于连接 Client 的 22 端⼝,如下两条命令是等价的,均是连接 Client 的 22 端⼝:
root@server $ ssh 127.0.0.1 -p 2222 root@server $ ssh 192.168.111.2 -p 22
与本地端⼝转发不同,远程端⼝转发不能通过设置 -g 选项使外部主机连接 Server 的 2222 端⼝。
动态端⼝转发
另外除了本地端⼝转发和远程端⼝转发外,还有⼀个更⽅便的动态端⼝转发。与本地端⼝转发和远程端⼝转发把流量转发到某个固定主机的固定端⼝不同,动态端⼝转发是根据数据包的⽬的IP和⽬的端⼝实现动态转发的,⼯作机制类似于代理,如图3所⽰。
图3 动态端⼝转发
命令格式如下:
如何设置代理服务器ssh -D <local port> <SSH hostname>
Client 上执⾏如下命令:
root@client $ ssh -D 1080 192.168.111.3
为了让外部机器也可以连接,需要添加-g 参数:
root@client $ ssh -gD 1080 192.168.111.3
如此,发往 Client 1080 端⼝的数据包将通过 SSH 连接发往 Server ,并在 Server 上重新发起请求。
端⼝转发实践
经过上⾯对 SSH 端⼝转发的介绍,了解了其基本⽤法。接下来我们着⼿解决⽂章开始列出的那⼏个问题。
防⽕墙穿透
假设现在有 A、B、C 三台服务器,C 服务器提供 MySQL 服务,并且防⽕墙限制只信任来⾃ B 服务器的流量,其他任何主机均拒绝访问任何端⼝。有时为了测试需要临时从 A 访问,此时如果修改防⽕墙策略的话会有些⿇烦,还需要测试完后恢复。如果⽤ SSH 本地端⼝转发的话,⼀条命令就解决了,当测试完成后断开此连接即可恢复,此情况如图4所⽰。
图4 本地端⼝转发实例
命令如下:
root@A ssh -gL 3306:192.168.111.4:3306 192.168.111.3 -p 22
现在即可通过连接 A 服务器的 3306 端⼝,访问 C 服务的MySQL 服务了。
简单的代理服务器
在你⽤公共 WiFi 上⽹时,指不定有什么⼈在窥探你的数据包。为了保护⾃⼰的隐私,VPN 是⼀个很好的选择,但VPN 配置有点⿇烦,对于⼀些新⼿来说有点难度。此时通过 SSH 动态端⼝转发可以实现和 VPN 类似的效果。
为了⽤此功能,你⾸先需要⼀台有公⽹ IP 的服务器及 SSH 登陆权限。
接下来就是客户端的配置,此处以 Windows 为例(需要 SSH 连接⼯具 Putty ),配置如图5所⽰。
图5 Putty 配置
配置好点 open ,输⼊账号密码登陆即可。现在⼀个简单的代理服务已经运⾏起来了。接下来是浏览器的配置,这⾥以Chrome 为例,配置如图6所⽰。
图6 浏览器配置
这⾥我⽤到了⼀个很好⽤的 Chrome 插件 “SwitchyOmega”,⽤于设置浏览器的代理。⽤其他代理插件或 Windows ⾃带的代理设置也是同样的配置:
Proto: socks
Server: 127.0.0.1
Port: 1080
浏览器配置好后,在百度中搜索“IP”,即可看到我们的 IP 已经变成上⾯连接的那台服务器的地址了,如图7所⽰。
图7 代理测试
内⽹穿透
随着 IPv4 地址的枯竭,对于家庭⽤户⽽⾔很难获得⼀个公⽹ IP 地址,就我⾃⼰家的宽带来说,每次
拨号只能获得⼀个私有 IP 地址。此时如果想在公司访问家庭⽹络的话,很难实现。
如果你有⼀台拥有公⽹ IP 的主机及 SSH 权限的话,上⾯的情况将迎刃⽽解。
由于远程端⼝转发的限制,需要做两次端⼝转发:⼀次远程端⼝转发把公⽹的 2221(因为绑定在 lo 上,所以只能本机访问)端⼝转发到家庭主机的 22 端⼝,⼀次本地端⼝转发把公⽹的 2222 端⼝转发到 2221 端⼝,如图8所⽰。
图8 内⽹穿透
所需命令如下:
家庭主机上执⾏:
root@home $ ssh -R 2221:localhost:22 35.194.*.*
公⽹主机上执⾏:
root@public $ ssh -gL 2222:localhost:2221 localhost
此时准备⼯作已经完成。在任何 Internet 联通的地⽅,只要连接公⽹服务器的 2222 端⼝,即可登陆到家庭⽹络的主机上。
命令如下:
user@anywhere $ ssh -D 1080 35.194.*.* -p 2222
上⾯命令我们添加了动态端⼝转发参数。此时如果想访问家庭⽹络中其他主机上的资源的话,只要指定这个代理即可。
结束语
⾄此,我们已经完成了SSH 端⼝转发的简要介绍,并通过⼏个实例展⽰了其在⼯作⽣活中的应⽤。赶紧动⼿实践⼀下吧。另外,由于笔者能⼒有限,⽂中难免会有疏漏,不妥之处还望指正。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。