跳到主要内容

科学上网

· 阅读需 13 分钟
阅读量: 101阅读人次: 102

貌似也是来到深圳之后,作为一个码农,有时候确实很需要 Google,GitHub,Docker 等服务。这个时候就不得不接触到科学上网了这一行为了。首先谈谈我自己对 GFW 的看法,我觉得这个墙的存在是非常必要的,尽管它的存在,给我的工作带来了少许麻烦,有时候也吐槽,国内我就是找不到啥资料啊,外网又被墙了,What fuck...

但是闲时之余,有时候偶尔也会看看 Youtube 以及外网的新闻,确实,里面的新闻讯息视频等真假混杂,大部分确实带着敌视抹黑的感情色彩的所谓的 “自由言论”。我国国情就是受教育程度普及低,大部分人包括我都缺乏一定事实判断的能力。如果没有 GFW 的存在,确实会带来很大的隐患。宽且,哪里有绝对的好,绝对的坏呢,大家其实都是彼此彼此。作为一个普通的不能再普通的人,虽然没能见见外面,但我很庆幸我生在中国,作为中国人。

另一方面,科学上网这个手段也是必要的。还是有部分人,外贸,高科技从业者需要和世界接触。另外一方面,两者之间的对抗,进一步提高了科学上网这一行为的门槛,从而将一部分人给过滤了出来,也是真正处于保护的目的。至于那些认为不需要被保护的,出了事就要承担相应的后果,毕竟互联网是很难不留任何痕迹的。

最后,提醒各位包括自己,谨记自己的言行!

准备

首先,我推荐自建服务。毕竟科学上网这一行为,在国内其实是违法的(应该是吧),所以会收到打击屏蔽。而我认为风险最高的就是邻居风险。付费的机场是需要盈利的,所以不可避免的有很多用户,想想当你观测到一台服务器,一直大流量的进出国内外,你说他可能是什么。以 IP 为例,你无法保证 IP 真的干净,无法避免被邻居波及,无法避免整个 IP 段被重点拉清单。也有可能某些地区的 GFW 有独特的标准,比如某个 IP 只有寥寥数人访问连却能跑那么多流量,封。

抛开各种技术之外的因素,剩下的就是各种流量隐蔽技术了。要想不被封,就得让 GFW 识别不出你的流量是代理流量。最近难得有时间,所以我也在网上大致浏览了这一对抗行为,从最初的简单的解决 DNS 污染,到现在需要让流量看起来非常正常且最好让 GFW 在准备封你的 IP 或 端口时,要带着十分谨慎小心的顾虑,怕影响其他正常且必要的正常服务。

具体的技术,以及核心思想我就不叙述了。我对这一方面也仅是了解,且只是一个拿来主义着。

XRay

在隐蔽流量特征这一技术中,貌似产生了一个又一个新的协议,类似早期的 shadowsocks,也有后来更近一步的 wmess,trojan,vless。HTTPS 流行之后,又开始引入 TLS 作为加密层,为了应对 TLS over TLS 的流量特征, 又引入了 XTLS。传输层,也有 UDP,TCP,HTTP,Websocket,HTTP2,gRPC,XHTTP 等五花八门的协议。说实话我分的不是太清,经常有时候犯迷糊。

在此时 2024/12/30,不得不提到 XRay 这个社区,它是从 V2ray 社区分化出来的,原因嘛,网上有。作为拿来主义者,这里不再叙述,什么好用用什么就行,目前我觉得 XRay 比较好用,更新比较快,文档比 V2ray 来说相对比较完善。

wget https://github.com/XTLS/Xray-core/releases/download/v25.2.21/Xray-linux-64.zip -O freedom_v25.2.21_linux_amd64.zip
unzip freedom_v25.2.21_linux_amd64.zip -d freedom_v25.2.21_linux_amd64

客户端推荐

v2rayN

v2rayN 目前貌似支持 Windows,Linux 以及 MacOS。目前测试在 Windows 下比较好用。

v2rayA

v2rayA 提供了一个 Web UI 的用户界面,非常适用于那些没有显示器的服务器使用,例如 NAS 宿主机或 Docker 容器。

For OpenWRT

v2raya-openwrt 可以在 iStoreOS 上部署以支持透明代理,发挥旁路由应有的作用。

Shadowrocket

Shadowrocket 是在 iOS 平台上的客户端软件,不过国内区无法下载,需要注册一个海外账号。

VMess 配置

类型:Vmess

地址:freedom.amass.fun

端口:443

UUID:填入 v2ray 的配置文件 config.jsoninbounds.settings.clients.id注意保密

额外ID:0,如 v2ray 的配置文件 config.jsoninbounds.settings.clients.alterId 所述。

算法:auto

传输方式:

  • 名称:websocket
  • Host:freedom.amass.fun记住这里也要修改
  • 路径:/freedom ,与 V2Ray 配置中的 path 保持一致

TLS:开启

ClashX

ClashX 是 MacOS 上一款软件,还比较好用。虽然其仓库代码已经停止更新了,但是 GitHub Release 还在一直更新版本。

下载 Assets 下的 zip 文件,解压 即得到可执行文件,在访达将其拖入【应用程序】下,即可在【启动台】看到 ClashX Meta。

其配置文件位于 ~/.config/clash.meta

trojan

trojan 是一个比较轻量的代理协议,网上已经有代码证明使用非常简单的手段就可以识别代理流量。不过我看目前很多机场还是使用 trojan,且还建在。

为什么还要使用它呢,我最开始一直使用的是 VMess + TLS + Websocket 方式,这个方式目前个人使用目前还没遇到问题,唯一就是在 Clash 上配置,怎么都无法成功代理,无奈之余就选择使用 trojan,目前也不知道稳不稳定,也不想追求更新的加密方式。一个是够用就行,另一个是这玩意一直在对抗升级,等 trojan 被自己正式不太稳再换其他的。

Xray-core 是直接支持使用 trojan 协议的,配置比较简单:

{
// ......
"inbounds": [
{
"listen": "/dev/shm/Freedom-gRPC.socket,0666",
"protocol": "trojan",
"settings": {
"clients": [
{
"password": "23ad6b10-8d1d-41f7-8ad0-e3e35cd38297"
}
]
},
"streamSettings": {
"network": "grpc",
"grpcSettings": {
"serviceName": "freedom"
}
}
}
],
// ......
}

由于我们使用 Nginx 作为前端,TLS 也部署在 Nginx 上,这里需要增加路径作为反向代理:

location ^~ /freedom {
if ($content_type !~ "^application/grpc") {
return 402;
}
client_max_body_size 0;
client_body_buffer_size 512k;
grpc_set_header X-Real-IP $remote_addr;
client_body_timeout 1w;
grpc_read_timeout 1w;
grpc_send_timeout 1w;
grpc_pass unix:/dev/shm/Freedom-gRPC.socket;
}

客户端在 Clash 下配置也很简单,其他配置依葫芦画瓢即可:

# .....
proxies:
- name: "amass"
type: trojan
server: amass.fun
port: 443
password: 23ad6b10-8d1d-41f7-8ad0-e3e35cd38297
network: grpc
grpc-opts:
grpc-service-name: freedom
# ......

技术前瞻

这里的前瞻并不一定很新和超前,只是我用来记录如果现在的方式不行了的话,下一步该如何进行。

值得一提的是,Xray 引入了 fallback 机制(中文翻译叫 回落机制,听起来总觉得怪怪的,还不如不翻译)。即使用 XRay 作为前端监听流量端口(一般是443),如果 Xray 探查到该流量不是代理请求流量,则启动 fallback 机制将流量传入到我们的 fallback 设置的服务器(例如 Nginx)来响应请求。当然这和 Nginx 作为前端,只将符合规则的请求 反向代理给后端 Xray 的目的是一样的,为了营造一个更真实的正常网站。

当然,社区有说 Xray 作为前端有一个好处,具体是什么忘记了,下次再翻阅文档时再记录。好像是 Xray 能够更快速的识别流量请求是不是代理请求,快速灵活的应用 fallback 机制。

VLESS-TCP-XTLS-Vision,在 Xray 的 Xray-examples 中的 VLESS-TCP-XTLS-Vision 文件夹下的 README.md 中提到,对于 XTLS Vision 的使用基数,目前几乎没有收到 配置正确 的 Vision 被封端口的报告。

XHTTP: Beyond REALITY,Xrays社区提出了 XHTTP 的底层传输协议,号称全场景流量通吃。

V2Ray

V2Ray 是一个不错的社区,目前也在活跃状态。

目前发现 VMess 协议 单纯的 使用 TCP 能够被检测到代理行为,而比较保险的方式是采用 WebSocket + TLS + Web 这种方式,简单的来说就是流量通过 WSS 传输,行为特征不容易被发现,数据能够被 TLS 进行加密。

同时配合 Nginx 可以将 V2Ray 服务隐藏于内网之中,使用 Nginx 再反向代理其他 Web 服务。使得服务器看起来就像一个正常的 Web 服务器(够提供 HTTP 和 WebSocket 服务)。

提示

除此之外,还发现有些服务商会检测进程名,例如 vray。所以稳妥起见,运行程序之前,先将文件改个名,也不要出现 vmess 这种字样。

服务器配置

下载 v2ray-core 后,V2Ray 对于时间有比较严格的要求,要求服务器和客户端时间差绝对值不能超过90 秒,所以一定要保证时间足够准确。为了方便起见,我们统一时区:

timedatectl set-timezone Asia/Shanghai

然后修改配置文件 config.json,比较推荐的方式是基于 vpoint_vmess_freedom.json 这个文件进行修改,修改完后重命名为 config.json 文件:

config.json
{
"inbounds": [
{
"port": 8089,
"listen": "127.0.0.1", //只监听 127.0.0.1,避免除本机外的机器探测到开放了 8089 端口
"protocol": "vmess",
"settings": {
"clients": [
{
"id": "4ff91e1c-794e-17a4-acc2-60bfc9a445fb", // 这里相当于一个密码,不要泄漏出去
"alterId": 0 // 新版本要求这里为0,以启动新的安全加密特性
}
]
},
"streamSettings": {
"network": "ws",
"wsSettings": {
"path": "/freedom" // 这里我们自己定义一个 path 就好
}
}
}
],
"outbounds": [
{
"protocol": "freedom",
"settings": {}
}
]
}

紧接着配置 Nginx:

server {
listen 443 ssl;
listen [::]:443 ssl;

ssl_certificate cert/freedom.amass.fun.pem;
ssl_certificate_key cert/freedom.amass.fun.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m;
ssl_session_tickets off;

ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;

server_name freedom.amass.fun.key;
location /freedom { # 与 V2Ray 配置中的 path 保持一致
if ($http_upgrade != "websocket") { # WebSocket协商失败时返回404
return 404;
}
proxy_redirect off;
proxy_pass http://127.0.0.1:8089; # 代理至 v2ray vmess over websocket 端口
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
# Show real IP in v2ray access.log
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}

注册使能 systemd 服务:

/etc/systemd/system/v2ray.service
[Unit]
Description=V2Ray Service
Documentation=https://www.v2fly.org/
After = network.target syslog.target
Wants = network.target

[Service]
Type=simple
ExecStart=/root/v2ray/v2ray run -config /root/v2ray/config.json
Restart=always
RestartSec=2s
LimitNOFILE=infinity

[Install]
WantedBy=multi-user.target
systemctl enable v2ray	# 开机自启动
systemctl start v2ray