Best Practice - sjtug/kxsw GitHub Wiki

科学上网的最佳实践

文中涉及的一些名词如有不懂或者没有提供链接的地方可参考 sjtug/kxsw Wiki,以后我再慢慢完善。

既然是科学上网,我们最希望看到的当然是无痛浏览所有被和谐网站。什么叫无痛呢?以下几点条件是必须的:

  1. 能穿越某赌看不见的墙(废话!)
  2. 方便用户使用,说的俗点就是用户体验至上。
  3. 不需要穿墙的时候使用本地网络连接,也就是浏览没有被和谐的网站和以前没有使用穿墙工具一样。这个对于一些浏览一些学术数据库时非常有用,一般的学术数据库只能使用高校IP。这个特性在使用谷歌学术时体验很好!
  4. 一处部署,批量应用,用户使用时无需单独下载客户端。
  5. 最好能有学习能力,能自动学习某网站是不是被墙。

满足以上要求的有如下两种方案——代理/VPN 配合路由表

代理方案

代理一般分为两种,工作在会话层的socks和工作在应用层的http/https. socks5 支持 TCP/UDP, 因此适用范围较广。http/https 则只支持 HTTP 协议,FTP 不在支持范围,虽然支持的协议不多,但是其灵活性较高,因此在这里重点推荐。方案为 shadowsocks(后端)+cow(前端),网络拓扑示意图如下:

+-------------------------------------+
|       Server A(大陆以外)             |
|    运行shadowsocks-libev服务端       |
| 对外提供的SS IP为ip1.com,端口为port1 |
+--------------+----------------------+
               |
               |
               |
+--------------+-------------------------------------------+
|     Server B(大陆)                                        |
| 运行shadowsocks-libev客户端 <----> 运行cow(http/https代理) |
| shadowsocks-libev客户端配置文件处填入IP/PORT及加密方式/密码 |
|                 cow中的代理填入socks5代理端口              |
|                 为了解决DNS污染可增加dnscrypt-proxy        |
+----------------------------------------------------------+

Server 端

Server A需要在大陆以外,最近Digitalocean免费送学生110刀,抓紧喽~ 不了解的请移步digitalocean VPS 把玩。不能用上免费的DO可移步搬瓦工,也很便宜。

shadowsocks 有多种实现,其中最节省资源且仍在开发维护的非 shadowsocks-libev 莫属。

对于Server A的shadowsocks配置文件,示例如下:

  1. 编辑shadowsocks-libev服务器端配置文件 - sudo vim /etc/shadowsocks/config.json
{
    "server":"your_server_ip",
    "server_port":9000,
    "local_port":1080,
    "password":"fuckxxx",
    "timeout":60,
    "method":"aes-256-cfb"
}

其中your_server_ip为你的服务器IP,server_port为服务器对外连接的端口,即为下文提到的Server B所用。加密方式method推荐使用aes-256-cfb.

Server B推荐使用实验室内部的服务器,关于实验室内部服务器的搭建方案可参考 高校实验室环境下的服务器部署小议

假设你现在已有一台可以工作的Linux服务器,安装好shadowsocks-libev后启动客户端即可。更改配置文件内容sudo vim /etc/shadowsocks/ss0.json,文件内容如下:

{
        "server":"your_server_ip",
        "server_port":9000,
        "local_address":"127.0.0.1",
        "local_port":8001,
        "password":"fuckxxx",
        "timeout":60,
        "method":"aes-256-cfb"
}

server处填写国外VPS的IP或者相应的域名;server_port填写国外VPS提供的端口;local_address为监听地址,由于我采用了cow作为中转,所以这里仅监听本地环回地址,local_port填写对外服务端口,即浏览器或者软件中代理选项中的socks代理端口。密码和加密方式对应就好了。

即使 shadowsocks 各网站上有详细的教程,新手首次使用时仍有可能遇到各种问题,遇到问题时首先想想 shadowsocks 的基本工作原理,由于是网络应用,基本的网络知识当然也必不可少。部署教程首推 shadowsocks/shadowsocks-libev

Client 端

客户端分为两种,一种是在本机运行能支持 shadowsocks 的协议,另一种则是在国内的服务器(一般为公网),下面分这两种情况介绍。

本机运行 shadowsocks

  • MAC OS X - GoagentX
  1. 首先确认 shadowsocks 代理能正常使用,注意测试时为 socks5 代理,不要和后面的 http/https 代理混淆了。
  2. 在 cow 处填入 shadowsocks 客户端提供的端口。具体配置文件可参考 cow 的主页。
  3. 推荐使用Chrome+switchsharp或者Firefox+Autoproxy或者其他代理插件,方便测试和切换。如果用IE内核的浏览器则需在连接处设置代理,切换起来不是特别方便而已,凑合也是可以用的。

在实验室内部服务器上可使用Linux搭建,发行版推荐Archlinux。搭建完毕后使用非常方便,只需告诉其他人IP/端口+用户名/密码,使用上述步骤中的3即可在浏览器内使用。可在cow处设置IP白名单,这样就不用用户名和密码认证了。也可以在自己寝室的树莓派上部署,性能基本够用了。

如果不考虑批量应用(比如在实验室一台电脑上部署,其他人填IP等即可使用),cow也是有Win/MAC/Linux下的客户端的。Server B不一定要很高配置的服务器,其实自己的台式机性能就足够了。我寝室那台树莓派主频也就700 Mhz,CPU还是ARM的单核,内存512MB,也就是说比大家的手机性能还要差...

一点点优化

使用 haproxy 作为 ss 的高可用和负载均衡,减轻前端的负担。 如果使用的是 Digital Ocean, 有可能遇到谷歌学术无法访问的问题,解决办法见 Resolve Google Scholar with IPv6 only

其实自从2014年6月份Google全套服务被墙后,受影响的远远不止他们家的服务,国外有很多网站使用了Google提供的一些javascript库及字体服务,所以有时在浏览国外网站时要等非常久才能加载完全,这个时候往往不是由于网速慢,而是由于被和谐的缘故(知道真相后眼泪掉下来...) 如果没有梯子工具,此时可以点击浏览器的停止加载选项即可看到网页内容。但显然自备一套科学上网工具或者肉翻才是长久之计。

⚠️ **GitHub.com Fallback** ⚠️