【记录】在Ubuntu上实现科学上网

先扯几句

终于开始了博客之旅。

从最早写公众号,到后来写$\LaTeX$,到现在使用GitHub静态托管页面拥有自己的“博客”,反倒是有些返璞归真,让我想到了自己小时候真·灌水论坛的日子。

现在终于具有了些许自主性。比如「科学上网」这种话题,肯定就不能写在公众号上;而且就前几年的公众号体验来讲,输入公式和排版,以及代码框的体验,肯定不如markdown和latex来的舒服;而latex又和html的兼容性不好,最终折中地选择了GitHub+markdown的这种方式。

其实一直早就想写很多东西,比如三原色、田忌赛马等问题都用长图发在了朋友圈当中,还比如从去年就想写的《神奇的哥尼斯堡》,大概这和此篇一样都该被归为“杂文”之中;学术性的博客也很想写,从最早看机器学习、多视几何、ROS等,包括之后Parzen窗的理解等,就很想作为优质博客补充一下现在网络上的缺失;很多时候也应该停下来思考思考人生,写一写收获与感悟,所以总的来说内容可能会很杂——所以我也并不指望能有什么引流,或者一些学术文章可能会发在知乎上?总之也有许多问题没有想好,但总要先吃一次螃蟹再说,于是便有了此篇文章。

工程性比较强,算是一种归档吧,以防日后自己忘了(毕竟在网上没有看到太多博客把着这个事情讲的很好)。当然,也或许是Ubuntu之间本身也会有体制差异,可能实验室这破电脑本身就不太行,所以才让我摸索了许久。

下面进入正文。

使用VPS服务实现Windows/MacOS科学上网

这一部分是写给不会配置VPS服务的朋友的(俗称自己搭梯子),毕竟我知道很多人是买一些软件的服务才科学上网的,想当年两会时期我也找这些软件救过急。

如果你已经会自己搭梯子了,那么这部分内容可以跳过。else: Continue。

什么是VPS服务

比如像搬瓦工、Vultr等这些知名的网站都是提供VPS(Virtual Private Server,虚拟专用服务器)服务的,大体上来说,就是他们会租赁给你一个ip地址,以及一个具有一定配置的服务器,允许这个服务器作为代理(proxy),让你这个服务器成为一个“中间商”,去访问其他网站,比如Google。

我踩过了许多坑,这里直接说结论:最早我用Hostwinds,高峰时间段经常抽风,两会期间完全挂掉,遂换到了搬瓦工。然后搬瓦工是真的快,但是快不过两天,而且退款服务还只能使用一次,导致我现在还有几百块钱被困在搬瓦工上(就是我拥有他的ip地址,然后国内把他封了,ip地址在国外还可以代理使用所以对方拒绝给我退款……)。最终给我选择了vultr,速度还不错(能流畅看YouTube我觉得就很不错了),关键是ip如果被封了还可以随时更换,完全是以使用时间计费,ip被封了就把这个instance destroy掉就可以了。

为什么要折腾VPS服务呢?因为有了ip地址,你就可进行相应的配置,一个终端设备就只用使用一个端口,理论上,租赁一个ip地址就可以支持你六万多台设备的使用,这就好比租了一个房子,当然,服务器配置的好坏决定了你的带宽速度,价格越高房子就越大。而去那些VPN软件租赁的服务,他们本身拥有ip地址(房子),而只会给你分配一个或几个端口号,这就好像租了一个床位,如果这个房子太过拥挤(用户过多),那你的贷款就会很慢,甚至down掉。而且,一旦有些床位住了犯罪分子(用户不规范上网),这就会牵连整个房子,所以经常会出现一些VPN软件挂掉的情况,其实不是国家真的针对,只是有些人真的不规范上网。

至于要房子还是要床位,这个见仁见智,各位自行取舍,但如果你只拥有床位,肯定是不能实现Ubuntu科学上网的,除非你找到也支持Ubuntu科学上网的VPN软件,据我所知基本没有。

如何配置科学上网

这里以vultr为例。

  1. 创建账号
  2. 登陆账号
  3. 左侧billing界面充值(可以使用支付宝)
  4. 左侧进入products页面,点击右侧“+”号deploy new server
  5. 选择cloud compute即可,到这一步大概是这样一个界面:
  1. 之后的Location,据说Seattle、LA这些结点会很快,但我这里追求长期稳定,折中选择了Dallas,自从两会以后一直很稳定没有挂过。
  2. 操作系统选择Cent OS,Server Size个人自用的话5美元的足够,甚至可以拉上身边几个小伙伴一起使用都是没问题的(比如五个人一起用,就是一个月一美元,还比外边软件快,血赚)
  3. 后面有一个Enable IPv6,勾不勾选均可。其余全部默认,点击右下角deploy now,建立完成。
  4. 等待一会儿后,会出现分配的IP地址,如下图所示。这里可以首先复制ip地址,在ping.pe上检查该ip地址是否被国家封掉,如果China部分全绿,那恭喜你这个ip地址是可以用的;如果是国外都绿而国内都红,那么需要删掉,重新创建instance才行;如果全都红,那很可能是服务器还没有就绪。
  1. 接下来需要使用Xshell这个软件与这个ip地址建立连接。如果没有Xshell,可以直接点击上面的链接,我默认设置了选择free for home and school的版本,提供姓名与有效的邮箱地址就可以免费使用Xshell了,下载地址提供在邮件中。
  2. 打开Xshell,会弹出会话,选择新建一个会话,然后填入对应信息,如下图所示。其中名称填什么都行,主机要改成刚刚获得的ip地址。
  1. 随后会弹出一个SSH安全警告,这里点击接受并保存即可。随后会要求输入用户名,填root。然后会要求输入密码,这里需要从vultr的server information上获取。填入即可。
  1. 如无意外,应该像下图这样。这时我们就进入了愉快的输脚本命令时间了。

在CentOS 8系统下搭建shadowsocks

shadowsocks,官名「影梭」,人称「小飞机」,源自于它那具有标志性的小飞机logo,是一款非常良心的翻墙代理软件。它并不提供任何VPS服务,只是对本地的网络设置做了软件上的封装。实如其形,一旦有了VPS服务器,只需要简单的配置便可以“起飞”,这里提供如何从0到1的安装步骤。

多说一句,Hostwinds的VPS服务是很健全的,很多依赖都会给安装好,搬瓦工次之,Vultr最为原始。所以这一份安装步骤应该是最为完整的,理应也适用于其他VPS服务,不过注意VPS的操作系统必须是CentOS 8,否则可能会报错。


下面进入具体步骤。

先输入python按tab命令检查是否成功安装python。尽量不要动python2的环境,而安装python3。使用yum安装python:

1
yum -y install python36

安装wget、tar

1
yum -y install wget tar

首先下载setuptools的工具包 easy_install需要调用其中的内容

1
wget --no-check-certificate  https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6.tar.gz#md5=c607dd118eae682c44ed146367a17e26

解压工具包

1
tar -zxvf setuptools-19.6.tar.gz

挂载到文件夹下

1
cd setuptools-19.6

编译(或者说配置环境?)

1
python3 setup.py build

安装setuptools

1
python3 setup.py install

安装pip

1
easy_install pip

使用pip安装shadowsocks

1
pip install shadowsocks

退出文件夹至根目录

1
cd ..

可以使用ls命令查看当前文件,应该只有setuptools相关的文件

用vi新建配置文件

1
vi /etc/shadowsocks.json

i键进入insert模式,此后复制如下内容,在xshell中粘贴(shift+insert)即可。

这个配置文件需要遵从json格式,建议预先在本地的文本文件中修改好。其中server就是你购买的ip地址,下边的port_password对应着连接时使用的端口号和密码,可以支持多端口同时连接,这里12561-12566只是一个示例,如果你需要可以开更多的端口。之后的********对应地替换为自己预设的密码。

在修改时要注意json文件的格式,比如最后一个端口号的结尾不要有逗号、最后的false之后不要有逗号,总之如果报错可以考虑检查json的格式问题。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
{
"server":"***.***.***.***",
"local_address": "127.0.0.1",
"local_port":28888,
"port_password": {
"12561": "********",
"12562": "********",
"12563": "********",
"12564": "********",
"12565": "********",
"12566": "********"
},
"timeout":300,
"method":"aes-256-cfb",
"fast_open": false
}

再按esc退出insert模式,输入:wq保存并退出

此时即可启动,建议使用后台启动命令:

1
ssserver -c /etc/shadowsocks.json -d start

然后输入exit即可退出xshell,配置完毕(并没有,你可能会报错哦)。


如果遇到EVP_CIPHER_CTX_cleanup之类的报错,是因为在openssl1.1.0版本中,废弃了EVP_CIPHER_CTX_cleanup函数,此时可以通过vim修改此问题。

首先检查vim编辑器是否完全安装。vim编辑器需要安装至少3个包(版本号不重要):

vim-enhanced-7.0.109-7.el5
vim-minimal-7.0.109-7.el5
vim-common-7.0.109-7.el5

查看本机已经存在的包,确认一下你的VIM是否已经安装,输入

1
rpm -qa|grep vim

如何vim已经正确安装,则会显示上面三个包的名称
如果缺少了其中某个,比如说: vim-enhanced这个包少了,执行:

1
yum -y install vim-enhanced

类似地安装其他你缺少的包,它会自动下载安装。
如果上面三个包一个都没有显示,则直接输入命令:

1
yum -y install vim*

安装完毕后,通过vim修改openssl中的相关内容,替换下边的文件路径为报错traceback的路径(这里我的路径是这个,作为举例):

1
vim /usr/local/lib/python3.6/site-packages/shadowsocks/crypto/openssl.py

全文搜索cleanup,将所有EVP_CIPHER_CTX_cleanup替换成为EVP_CIPHER_CTX_reset

对应的命令是

1
:%s/cleanup/reset/g

再保存文件:

1
:wq

之后继续正常启动shadowsocks.json,应该就会一切正常。

对于vultr还需停止防火墙服务(多敲几个命令),这样才可以建立TCP连接,否则只能有ICMP连接。

停止当前防火墙服务:

1
systemctl stop firewalld.service

禁用防火墙服务:

1
systemctl disable firewalld.service

检查当前防火墙状态:输出not running时就可以正常使用了

1
firewall-cmd --state

在Windows/MacOS下使用shadowsocks

以上操作做都是通过SSH连接远程服务器进行配置,接下来需要从本地端进行配置。这时我们就可以使用图形化的界面更加方便的配置了。

对于windows系统用户,从shadowosocks官方的GitHub Releases中下载zip文件并解压。对于版本号,我这里的是4.2.0.1,更新的版本号似乎去除了对aes-256-cfb的支持,所以这里建议选择老版本(新版本没折腾过,不敢打包票哈哈)。

对于MacOS用户,也可以从此处下载dmg文件进行安装。

下面以windows为例。解压后运行exe文件,在菜单栏找到小飞机图标,右键即可进行各种配置,如开机启动等。对于系统代理选项,有三种模式:

  1. 禁用。顾名思义,相当于没开软件,并不能翻墙,就是原始的网络。
  2. PAC模式。简单来说就是,建立了一个文档,里边标明了哪些网站需要翻墙,哪些不需要。根据你的PAC模式配置情况,决定是使用在线的文档,还是预装时附带的本地文档,一般来讲本地PAC即可满足需求,必要时可以更新PAC。
  3. 全局模式。顾名思义,任何网站都使用代理。比如之前AO3挂了,又恰巧使用的本地PAC,这个网址没有被加入到本地PAC中,你访问它就会觉得“挂了”。此时如果开全局模式,就可以默认都使用代理访问,就可以访问成功。所以如果什么网站访问不了了,可以先开全局模式试试也无妨。

总之,平时建议开PAC,这样像百度、哔哩哔哩这些国内网站,会自动使用本地网络访问,对于Google等也可以及时甄别;遇到个别网站访问失败时(尤其下数据集什么的),可以切换全局模式,没准会有意外之喜。

最关键的配置是服务器→编辑服务器这里,你需要输入购买的ip地址、端口号、密码等信息,见下图。

根据json文件中你的个性化设置输入服务器地址、端口、密码,加密方式请选择aes-256-cfb(也是与json中对应的),代理端口需要与json中local port一处对应,也有说用1080等端口不易被攻击,不过我之前这样设置时shadowsocks会给我报warning,我这里就随便找了个端口。

如果设置了多个端口,则需配置多条规则(左下方复制,对应修改即可),显然一次只能使用一个端口,多个端口可以方便其他终端设备使用。

配置完毕后点击确定,切换PAC/全局模式后便可以访问Google、YouTube等网站啦!

使用VPS服务实现Ubuntu科学上网

终于讲到了正文部分。

为啥Ubuntu这么特殊呢?嗯,因为连shadowsocks官方都把维护的qt5(一种linux上的可视化开发程序)版本的文件给remove了,所以在ubuntu上似乎很难找到一个较好的图形界面来配置。然后搜到的各种东西又都是让Ubuntu作为服务端来配置,本地端如何配置还真没几个人讲,大概大家Ubuntu都是用来跑程序,不科学上网的吧……

我一度也是这样妥协的,直到两会期间连GitHub也被封了,我才下定决心让Ubuntu也要科学上网,否则我每次都必须把人家的代码fork到gitee上,然后对着gitee敲命令或者git clone,我嫌麻烦。(果然人类进步的源泉是懒2333)

使用terminal科学上网

虽然qt5挂掉了,但是shadowsocks官方的源还是封不掉的,所以首先在ubuntu本地安装shadowsocks:

1
sudo apt install shadowsocks

我这里会安装到2.9.0-2这个版本,并且电脑会认为这就是最新版了。不知道是确实没有新版本了还是说官方源并不再更新新版本了,但反正这个版本肯定也够了。

随后配置shadowsocks的json文件,这里与之前在服务端的配置是类似的。。

不要混淆,实际上我们这里是用json的方式完成了图形化界面的配置。所以这里json的文件实际上也可以被放在任何地方,这里以在/etc/shadowsocks/当中为例,然后我个人比较喜欢用文本编辑器编辑,那么命令就是:

1
sudo gedit /etc/shadowsocks/config.json

复制这里修改好的json代码(如果你自己搭过梯子,那肯定也写过这东西)进去即可,保存后启动该文件即可:

1
sslocal -c /etc/shadowsocks/config.json

这时打开浏览器你会发现,还是没有啥区别,访问Google还是上不去,百度还是很快,因为我们还需要设置Proxy代理

注意,这个terminal先不要关掉!

你可能多少听说过Switchy Omega这个东西,然而在我白般尝试后发现它并不支持SOCKS5代理,遂放弃。转而一番查询后发现,火狐可以完美支持SOCKS5的proxy诶,然后我就去下了个火狐浏览器(甚至许多人预装Ubuntu都会自带火狐浏览器吧)

打开火狐浏览器,点击右上角三横线的按钮,找到首选项(或直接在浏览器地址栏输入about:preferences),拉到底找到网络设置一栏(如下图所示)

点击设置,按照下图这样配置。注意选择SOCKS v5,主机地址设置为本地(127.0.0.1,对应json文件中的local address)以及端口号对应json文件中的local port端口号。

点击确定后,如无问题则可访问Google。

也就是说,刚才没关的那个终端,实际上是开了一个本地地址和端口号,来完成刚才的代理工作,而浏览器上的配置,则是要求了浏览器访问网页时要先走这个SOCKS主机及对应的端口。

开机自启动实现科学上网

于是,你就会很不爽:难道每次访问我都得开着这个终端不成?难道每次重启电脑还得开个终端输这个命令?显然,这是可以配置的。

由于之前在超分屏上使用网抑云,qt界面的缩放让我很不爽,当时调过配置文件,所以我就想到,能不能配置一个开机自启动的程序呢?

比如开机自启动teamviewer,实际上是电脑在后台打开了一个不会显示的终端,输入了一个teamviewer启动之类的命令,然后在GUI上就显示了打开的teamviewer,我能否也建立一个这种机制,让电脑自动帮我输入这个命令呢?

答案当然是可以的。

一般来讲,自启动的文件都被放置在~/.config/autostart这样一个路径中。所以我们可以在其中建立一个.desktop文件,让其伪装成一个快捷方式,这样就可以让系统开机自启动。

这里假设文件名就叫shadowsocks.desktop,同样使用文本编辑器打开:

1
sudo gedit ~/.config/autostart/shadowsocks.desktop

在其中输入以下配置:

1
2
3
4
5
6
[Desktop Entry]
Type=Application
Name=shadowsocks
Exec=sslocal -c /etc/shadowsocks/config.json
Terminal=false
X-GNOME-Autostart-enabled=true

我这里还输入了icon和comment,这两者并非必须,大家不输也行。

完成后保存,重启电脑,之后直接打开firefox访问google应该是没什么问题的。

如果你需要,还可以在firefox的网络设置中调整代理脚本,设置哪些网站使用本地网络访问,哪些网络需要走代理端口;

有时你也可能遇到Google的审查机制,被判定为不安全,你固然可以搜索下CSDN这个问题如何解决,大抵是调整一下高级配置就可以了,不过对于我来讲,这种chrome访问内网、firefox访问github、Google Scholar的模式足够了,就不必再作调整了。

以及如果你有余力,也可以把这个代理设置到全局,但我觉得这个要调整的就太多了,而且全局也并不一定真的有多好,就没有往下折腾了。

结语

所以实际上我这是一种阉割版的“Ubuntu”实现科学上网。因为我没有设置全局代理,如果git clone,或者pip、conda install什么的,走的还是本地网络,而这些东西是也很有可能间歇性挂掉的。不过我这算是一种折中吧,大部分包基本该下的都下过,都有缓存了,我这里只是希望能够安心地看GitHub,以及可能会用到YouTube看一些演示视频或者教程,debug时遇到Stack Overflow也不至于完全挂掉。

而且这好像也给Firefox找到了存在的意义。以前总有人倡导,大家装了Ubuntu不要卸载firefox,否则把Chrome搞的一家独大了、寡头垄断了不好。现在从VPN代理的角度来讲,Firefox还是比Chrome方便多了,所以它值得出现在我的Favorite之中。

小福利

最近偶然找到了一个很好的PyTorch教程,这让我这个日常不上YouTube的用户找到了一丢丢上YouTube的理由。在这儿推荐给大家:

课程主页:deeplizard(对应有视频内容的文字教程)
视频列表(需翻墙):YouTube
视频列表(搬运版本):bilibili(我这里选择的是无字幕版本)

正好可以拿这个链接测试下翻墙效果哦~