缘起
由于版权问题,在国外无法使用国内很多视频、音乐资源,因此就想搭建一个VPN,以便翻墙回国。于是我在国内的云服务商那里租了一台服务器,然后在上面搭建了Shadowsocks服务,实现了翻墙回国。在这个过程中遇到了不少问题,这里记录一下。
前提
- 一台位于国内的云服务器
安装Shadowsocks
安装Shadowsocks的过程我主要参考了这篇文章:给小白的Shadowsocks翻墙教程。但依照这篇文章的步骤,我搞了好多次都没有成功,原因是这篇文章里有不少坑,这里主要记录一下是如何解决这些问题的。
云服务器网络
上面安装Shadowsocks的教程需要下载一些位于GitHub上的资源,而由于众所周知的原因,GitHub在国内是无法访问的。因此,我们需要先解决这个问题。即我们想在国外翻墙回国,首先需要让国内的云服务器翻墙出去。
如果是在国内的普通电脑上,那只需要用一些通用的翻墙软件就行了。但我们的云服务器以命令行的形式运行,因此我们需要在命令行中翻墙。这里有两种方案:
方案(一):使用ssh代理
首先,因为我们本身就在国外,不需要再为我们在国内的云服务器专门购买一个VPN,只需要利用我们在国外的电脑就行。
-
从国外的电脑(以下简称“电脑”)ssh到国内的云服务器(以下简称“云服务器”)上:
1
ssh username@cloud_server_ip
-
从云服务器ssh到电脑上,并使用代理端口(端口号可以在1到65535中任选一个,这里我选了11111):
1
ssh -D 11111 username@foreign_computer_ip
-
设置云服务器的网络代理,将代理端口设置为11111:
1
export ALL_PROXY=socks5://127.0.0.1:11111
这样,经过云服务器的网络请求都会被转发到端口11111,然后通过ssh隧道转发到电脑上,这样当云服务器需要访问国外的网络时,就会通过电脑的网络访问,从而实现了翻墙。
-
查看一下云服务器此时的ip地址:
1
curl ipinfo.io
如果显示的ip地址是电脑的ip地址,那就说明我们成功了。
然后按照上面的教程中的步骤安装Shadowsocks,但是我发现依然有问题。问题似乎是,教程中安装Shadowsocks的脚本会使用wget下载一些文件,但是wget似乎不会走我们设置的代理,因此依然会提示连接超时。但是curl是可以走我们的代理网络的,因此我们可以把脚本中的wget请求全部换为curl请求,这样就可以解决这个问题了。
方案(二):先在本地下载,再上传到云服务器
上面的方案设置起来比较复杂,而且可能会出各种问题。其实我之后可能并不会再频繁使用云服务器连接国外的网络,如果只是为了这次的需求,完全可以把需要的文件事先下载下来,然后再上传到云服务器上就行了。
使用这个方案就无法使用上面教程中的单个命令完成了,我们需要拆分一下这个命令:
-
在电脑上下载Shadowsocks安装脚本:
1
wget --no-check-certificate -O shadowsocks-all.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks-all.sh
-
将下载好的脚本上传到云服务器上:
1
scp shadowsocks-all.sh root@cloud_server_ip:/root
-
在云服务器上安装Shadowsocks:
1
bash shadowsocks-all.sh 2>&1 | tee shadowsocks-all.log
需要注意的是,现在运行这个安装脚本依然会失败,有两个原因:
- 无法连接GitHub下载一些文件
- 无法找到Python的安装包
Python版本
上面的安装脚本需要使用python
(python2
),但是Ubuntu 22中的apt源中并没有python
,而需要显式地指定Python版本,例如明确是python2
还是python3
。
因此这里需要做两件事:
- 将脚本中
apt_depends
里的python
改为python2
、python-dev
改为python2-dev
- 在
/usr/bin
目录下创建一个软链接,将python
指向python2
1
ln -s /usr/bin/python2 /usr/bin/python
然后再按照上面教程中的安装步骤就行了。这里我选择安装的Shadowsocks版本是Shadowsocks-Python
。
完成Shadowsocks安装
确认Shadowsocks在正常运行
安装完成后,我们可以使用如下命令查看Shadowsocks的运行状态:
|
|
如果显示的是Shadowsocks (pid xxxxx) is running...
,那就说明Shadowsocks已经在正常运行了。
云服务器防火墙开启端口
需要在云服务器的防火墙中开启Shadowsocks的端口(默认是8388),否则无法连接到Shadowsocks服务。运行下面的命令:
|
|
然后使用下面的命令查看防火墙的状态:
|
|
如果显示的是Status: active
,并且Shadowsocks使用的端口处于ALLOW
状态,那就说明防火墙已经开启了。
在云服务器管理界面开启端口
对很多云服务器来说,仅在云服务器命令行中开启防火墙是不够的,还需要在云服务器的管理界面中开启端口。在管理界面找到安全组
,然后添加一个入方向的规则,将端口设置为Shadowsocks使用的端口(默认是8388),协议设置为TCP
,
源地址设置为0.0.0.0/0
。
使用Shadowsocks翻墙回国
下载Shadowsocks客户端,然后配置Shadowsocks客户端,将服务器地址设置为云服务器的ip地址,端口设置为Shadowsocks使用的端口(默认是8388),密码设置为Shadowsocks服务的密码,确保加密方式与Shadowsocks服务端的一致。 如果之前的设置都正常的话,现在就可以连接到国内的网络了。