梦想 -- 我有一台国外的VPS,我想完整的看看这个世界

现在国外的VPS(虚拟私有主机或叫它云主机)越来越便宜甚至免费。阿里云、Ucloud也提供在香港的云主机,这些云主机到国内的网络优化的极好。是不是有想法,利用一下这台在国外的云主机去“看看完整的外面的世界”呢?

看懂并实际操作这篇文章的意义

可以不受限的访问国外的技术网站。

看懂并实际操作这篇文章所要的知识

  • 有windows基础知识,会在上面安装软件
  • 使用过ssh client端软件远程连接过linux服务器
  • 有linux系统的基础知识,至少会打命令及在上面安装软件
  • 对TCP协议有最基本的了解

单台国外云主机如何实现“完整看世界”

大概的实现思路是这样的:

  1. 用户在本地台式机和国外服务器之间使用puttyXshell或SecureCRT或MobaXterm建立一个ssh端口转发(ssh port forwarding)。利用ssh端口转发可以通过ssh的加密通道包裹SS的协议,成功穿越G-F-W对SS协议的检测。即使让SS跑在公网上,也不会被G-F-W封阻,因为它的外面被ssh 加密 tunnel包裹着,不会被发现,而ssh 加密 tunnel可以成功通过G-F-W的。使用ssh 加密tunnel 来包裹SS协议,可以最大限度的提供SS在公网上传输的稳定性,解决之前SS客户端用公网直连国外的SS服务器端老断的问题。来,看这张图,看看ssh port forwarding是怎么样工作的:
    https://www.ibm.com/developerworks/cn/linux/l-cn-sshforward/index.html

  2. 通过上述方法连接在国外服务器上安装的SS服务端Shadowsocks-libev,实现“完整看世界”。一图胜千言,先来系统架构图吧:

国外VPS上安装SS服务端, 以Ubuntu16.04-LTS linux系统版本为例:

大家可以看一下Shadowsocks-libev上的介绍,上面说得还是很详细的。
软件安装命令如下(以Ubuntu16.04-LTS linux系统为例):

sudo apt-get install software-properties-common -y
sudo add-apt-repository ppa:max-c-lv/shadowsocks-libev -y
sudo apt-get update
sudo apt install shadowsocks-libev

国外VPS上启动SS服务器端

SS服务器端软件启动命令如下:

ss-server -p 10001 -k yourpassword -m rc4-md5 -t 60 -f /tmp/ss-10001.pid -n 3000 -u
###参数说明:
-p 10001 服务端监听的TCP端口号,用来给客户端连接用的
-k yourpassword 你的客户端连上来的密码
-m rc4-md5  你的客户端连上来的加密方法
-t 60 超时时间
-f pid 文件名
-n 最大打开文件数
-u 允许UDP转发

在ssh client(你的windows电脑)上设置ssh 端口转发,我这边以SecureCRT 这个ssh client为例,其它的类似

选择你国外服务器的ssh连–session options–PortForwarding设置一个ssh端口转发,Local上设置ip 127.0.0.1,端口 10001, Remote上设置 端口10001。 你可以这样理解上面设置,把本机(windows电脑)上的127.0.0.1的10001端口上所有数据通过ssh 加密tunnel转发到你的国外VPS的10001端口上,这个10001端口也是你国外VPS的SS服务器的监听端口。设置好后,请在连接SS前,先用这个ssh客户端连接这台国外linux服务器,建立加密ssh tunnel。在和服务器建立ssh tunnel连接后,在本地window系统会启一个 127.0.0.1:10001的TCP端口,这个127.0.0.1:10001就是SS客户端的连接地址和端口
设置如下图:

在你的windows 电脑或手机上安装SS客户端,并做设置

在你的windows 电脑或手机上安装SS客户端,下载地址

软件的安装就不多说了,按给的包可以在不同的平台上安装,电脑手机都可以。

手机端运行ssh 端口转发可能麻烦一些,但也可以实现,这里就不做更多说明了。解决手机端的SS访问的问题,我的方法是在国内和国外各运行一台Ubuntu系统的VPS,在两台VPS之间打一个加密ssh tunnel,然后手机用SS客户端直连国内VPS的ssh转发端口。这样,就解决了手机端SS运行ssh问题,会多一些成本 ,但方便很多。
这个算题外话,国内和国外两台linux服务器之间打一个加密的ssh tunnel 命令如下:

ssh -o ServerAliveInterval=60  -o TCPKeepAlive=yes -f -N -L inner_server_ip:10001:localhost:10001 root@outer_server_ip
### 解释:
-o ServerAliveInterval=60  -o TCPKeepAlive=yes   保持ssh长连接并60秒检测一下
inner_server_ip 国内服务器外网ip
outer_server_ip 国外服务器外网ip
-L inner_server_ip:10001:localhost:10001 实现一个国内服务器TCP 10001端口到国外服务器TCP 10001 端口的ssh 端口转发

在完成安装后,运行软件并做如下设置:

  • Server Addr: 127.0.0.1,因为你用了ssh port forwarding
  • Server Port: 10001 你在启动SS服务器时设置的端口 -p参数
  • Password: 你在启动shadowsoks服务器端时设置的密码 -k参数
  • Encryption: 你在启动shadowsoks服务器端时设置的加密方式 -m参数

具体如下图:

最后进行连接测试

在运行SS客户端后,右击电脑(以windows为例)SS 飞机图标:

  • Enable system proxy 网站访问走SS代理,不勾的话,是不使用SS代理
  • Start on Boot 电脑启动后自动启动
  • Servers 选择你配置好的连接 127.0.0.1:10001

  • Modes – PAC 模式是国内直接访问,国外走我们的代理; Global 模式是全部都走我们的国外代理,这个模式下访问国内网站会比较慢。

最后,打开Global模式,访问 ip138.com看一下,我们的出口IP是否是我们国外代理服务器的IP,如果是,那就做对了。再打开google,看是否可以正常访问,如果是,那就做对了。

坚持原创技术分享,您的支持将鼓励我继续创作!