看这这个挺高大上的标题,好像就像是标题党一样,其实真正的标题用正常人的话来说,就是如何科学的上网,只不过生活在大陆这个环境下,已经习惯了用各种隐晦的词来描述某些东西。算了,标题党就标题党吧。

写这篇的主要原因也是因为最近腾讯云把我的一个香港服务器给封禁了,理由也是意料之中的「存在通过技术手段使其成为跨境访问节点等行为」,刚开始还以为是先发出警告,等我连接服务器的时候发现直接是把服务器给封掉了,连22端口都没得用。幸亏部署的服务都是静态方式存储的,而且大多数还都有备份,这要是没有备份的话,真的要气死人了。

没办法只好重新搞一台服务器了,不过这次选用的国外的服务器,服务器拿到手就直接通过脚本部署了一套SSR,刚用了几个小时就被Q了,切换IP同样操作之后还是没过多久就又不行了,于是尝试更换方案,经过了解尝试使用V2Ray+websocket+tls+web的方式来构建服务。

V2Ray+websocket+tls+web是目前最稳定的翻Q技术之一,即使在敏感时期也稳如泰山。和SSR的流量混淆不同,V2Ray+ws+tls用真正的https流量FQ,没有必要做任何混淆。在长城看来,流量和不计其数的https流量没有任何区别。但是如果GFW尝试主动嗅探的话,发现流量的目的地没有真正的网站,从而被识破然后被Q。所以要在这个服务外面加一个真正的网站做掩护,从而假装是访问真正的网站。

Cloudflare配置DNS

这次部署过程中,使用的是Cloudflare作为DNS服务器,Cloudflare是世界上最大的CDN提供商,全球半数的网站都在使用Cloudflare。使用不用担心隐私泄露或钓鱼风险,而且也可以提供免费的CDN服务,只不过对于国内来说,访问速度可能会慢一点。

配置完成之后可以使用 ping命令测试是否可以ping通,如果可以,那就说明配置没问题。

V2Ray安装和配置

网上已经有很多一键安装脚本,这里选用的是 https://github.com/v2fly/fhs-install-v2ray,此脚本需要在root用户下运行,并且会安装如下文件:

installed: /usr/local/bin/v2ray
installed: /usr/local/bin/v2ctl
installed: /usr/local/share/v2ray/geoip.dat
installed: /usr/local/share/v2ray/geosite.dat
installed: /usr/local/etc/v2ray/config.json
installed: /var/log/v2ray/
installed: /var/log/v2ray/access.log
installed: /var/log/v2ray/error.log
installed: /etc/systemd/system/v2ray.service
installed: /etc/systemd/system/v2ray@.service

此脚本会配置自动运行脚本。自动运行脚本会在系统重启之后,自动运行 V2Ray。目前自动运行脚本只支持带有 Systemd 的系统,以及 Debian / Ubuntu 全系列。

其中路径/usr/local/etc/v2ray/config.json就是配置文件的路径,安装完成之后只用修改这个文件即可。

关于V2Ray的配置网上已经有很多,我们只需要下载一个,其中需要修改的地方改成我们自己的即可。可以参考我的配置:

{
    "inbound": {
        "protocol": "vmess",
        "listen": "127.0.0.1",
        "port": 8080,
        "settings": {
            "clients": [
                {
                    "id": "◆◆◆◆◆◆◆◆◆◆◆◆",
                    "afterId": 0,
                }
            ]
        },
        "streamSettings": {
            "network": "ws",
            "wsSettings": {
                "path": "/★★★★★★★★★★★★"
            }
        }
    },
    "outbound": {
        "protocol": "freedom",
    "ip": ["geoip:provate"],
    "outboundTag": "blocked"
    }
}

在这个配置文件中,需要将标记的信息换成自己的即可:

"◆◆◆◆◆◆◆◆◆◆◆◆":uuid,自己生成或者通过在线网站生成,例如:63c0042a-4a85-4d03-a488-3ba383142461

"★★★★★★★★★★★★":这个地方填写的则是一个随机字符串,越没有规律越好,越乱越好,可以在键盘上胡乱打一串或者程序生成。其实这个字符串就是websocket路径,在配置客户端的时候需要用到。

Nginx配置反代

因为上面已经配置了DNS的解析服务,而且也不适合直接用IP,所以这时候就需要用Nginx来代理websocket,配置文件内容如下:

server {
    ### 1:
    server_name ●●●●●●●●●●●●;

    listen 80 reuseport fastopen=10;
    rewrite ^(.*) https://$server_name$1 permanent;
    if ($request_method  !~ ^(POST|GET)$) { return  501; }
    autoindex off;
    server_tokens off;
}

server {
    ### 2:
    ssl_certificate /etc/letsencrypt/live/●●●●●●●●●●●●/fullchain.pem;

    ### 3:
    ssl_certificate_key /etc/letsencrypt/live/●●●●●●●●●●●●/privkey.pem;

    ### 4:
    location /★★★★★★★★★★★★
    {
        proxy_pass http://127.0.0.1:8964;
        proxy_redirect off;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;

        sendfile on;
        tcp_nopush on;
        tcp_nodelay on;
        keepalive_requests 10000;
        keepalive_timeout 2h;
        proxy_buffering off;
    }

    listen 443 ssl reuseport fastopen=10;
    server_name $server_name;
    charset utf-8;

    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_requests 10000;
    keepalive_timeout 2h;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_ciphers TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-256-GCM-SHA384: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_ecdh_curve secp384r1;
    ssl_prefer_server_ciphers off;

    ssl_session_cache shared:SSL:60m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 10s;

    if ($request_method  !~ ^(POST|GET)$) { return 501; }
    add_header X-Frame-Options DENY;
    add_header X-XSS-Protection "1; mode=block";
    add_header X-Content-Type-Options nosniff;
    add_header Strict-Transport-Security max-age=31536000 always;
    autoindex off;
    server_tokens off;

    index index.html index.htm  index.php;
    location ~ .*\.(js|jpg|JPG|jpeg|JPEG|css|bmp|gif|GIF|png)$ { access_log off; }
    location / { index index.html; }
}

看上去很长,实际上只有四处需要填写,配置文件里用#1,#2,#3,#4标出了位置,把标符号的地方换成你自己的信息。

●●●●●●●●●●●●:标注“●”的地方填写域名,注意这里的域名带www

★★★★★★★★★★★★:标注“★”的地方填写一个随机字符串,这个随机字符串必须和V2Ray配置中的一样,不然无法工作。注意不要删掉前面的斜杠。

最后,把Nginx的配置文件另存为default.conf(注意扩展名就是.conf),放在/etc/nginx/conf.d/下。

配置SSL证书

为了用真正的https流量翻墙,网站就必须有合法的SSL证书。可以用自动化工具Certbot申请证书,只要把以下命令复制到命令窗口,依次执行即可。

这里说的“证书”,实际指的是“数字证书”。当然申请完全是免费的,申请时需要邮箱地址。如有必要,可以使用匿名邮箱。

安装certbot

由于服务器系统自带的Python环境是v3.7,但是没有安装pip,所以首先安装pip工具。

apt install python3-pip

安装好pip之后即可安装certbot

pip3 install certbot

生成证书

certbot certonly --standalone --agree-tos -n -d www.●●●●●●●●●●●● -d ●●●●●●●●●●●● -m ●●●●●●●●●●●●@●●●●●●●●●●●●

第一个-d加一个带www的域名,第二个-d加一个不带www的域名,-m后面加你的电子邮箱。注意前后要带空格。

运行这条命令后,如果显示:

IMPORTANT NOTES:

- Congratulations! Your certificate and chain have been saved at:
  /etc/letsencrypt/live/www.hrw1rdzqa7c5a8u3ibkn.website/fullchain.pem
  Your key file has been saved at:
  /etc/letsencrypt/live/www.hrw1rdzqa7c5a8u3ibkn.website/privkey.pem
  Your cert will expire on 2020-06-04. To obtain a new or tweaked
  version of this certificate in the future, simply run certbot
  again. To non-interactively renew *all* of your certificates, run
  "certbot renew"

- Your account credentials have been saved in your Certbot
  configuration directory at /etc/letsencrypt. You should make a
  secure backup of this folder now. This configuration directory will
  also contain certificates and private keys obtained by Certbot so
  making regular backups of this folder is ideal.

- If you like Certbot, please consider supporting our work by:

  Donating to ISRG / Let's Encrypt:  https://letsencrypt.org/donate
  Donating to EFF:                    https://eff.org

表示证书生成成功。

注意:在生成证书的时候容易出现问题,就比如我在生成证书的时候就出现如下错误:

x86_64-linux-gnu-gcc -pthread -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fno-strict-aliasing -Wdate-time -D_FORTIFY_SOURCE=2 -g -fdebug-prefix-map=/build/python2.7-PPrPZj/python2.7-2.7.15=. -fstack-protector-strong -Wformat -Werror=format-security -fPIC -DUSE__THREAD -DHAVE_SYNC_SYNCHRONIZE -I/usr/include/ffi -I/usr/include/libffi -I/usr/include/python2.7 -c c/_cffi_backend.c -o build/temp.linux-x86_64-2.7/c/_cffi_backend.o
  c/_cffi_backend.c:15:10: fatal error: ffi.h: No such file or directory
   #include <ffi.h>
            ^~~~~~~
  compilation terminated.
  error: command 'x86_64-linux-gnu-gcc' failed with exit status 1

解决办法是安装相关依赖即可。

apt install libffi-dev

同样的因为这个问题导致的cryptographypyopenssl版本问题,也可以通过升级安装包解决。

另外通过这种方式生成的证书时限只有三个月,所以我们通过定时任务,让他自从申请证书,从而达到证书的 自动续命

echo "0 0 1 */2 * service nginx stop; certbot renew; service nginx start;" | crontab

启动服务

测试V2Ray配置是否正常

/usr/local/bin/v2ray -test -config=/usr/local/etc/v2ray/config.json

如果显示:

V2Ray 4.x.x (V2Fly, a community-driven edition of V2Ray.)
A unified platform for anti-censorship.
Configuration OK.

测试nginx配置是否正常

nginx -t

如果显示:

nginx: the configuration file /etc/nginx/ngin短网址nf syntax is ok
nginx: configuration file /etc/nginx/ngin短网址nf test is successful

说明配置没有问题。

测试V2Ray和Nginx配置正常之后即可启动服务了。启动服务通过service命令启动

启动V2Ray:

service v2ray start

启动Nginx

service nginx start

配置完成后,可以在浏览器里输入网址,如果显示Nginx的欢迎页面,就说明网址配置成功了! 接下来要做的是上传一个网页模板,这样别人访问你的服务器就会看到一个真的网站。

在网上找一些静态网页模版,放在目录/usr/share/nginx/html/下即可,最好是找一些全英文的网站,存在中文的话可能会增加一些被墙的概率。

客户端配置

这里使用的客户端是著名的代理软件Shadowsockets(小火箭),这是一款iOS生态下全平台通用的一款软件,配置也相对简单。

点【服务器】按钮,选择【添加VMess】服务器。

到这里基本上就算完成了,当然还有一些其他优化项,比如:

想要了解的可以自行Google,我太懒了,也没有做这些配置,就不一一赘述了,逃。

参考链接:https://pincong.rocks/article/15493