步骤/目录:
1.背景介绍
2.方法一:wiki镜像站
3.方法二:离线wiki
4.方法三:香港服务器+V2Ray
    (0)V2Ray介绍
    (1)服务器购买与初始化
    (2)准备工作
    (3)用docker安装V2Ray
    (4)安装V2Ray客户端及设置
    (5)V2Ray的高级操作
        a.网页伪装
        b.服务器备份
        c.VLESS + TCP + TLS + WS
        d.双服务器
    (6)服务器被封禁的表现
5.方法四:购买服务
附录:不使用docker,直接安装V2Ray(不推荐)

本文首发于个人博客https://lisper517.top/index.php/archives/31/,转载请注明出处。
本文的目的是查阅wiki百科。
本文实验日期为2022年8月12日。本文使用的云服务器为阿里云轻量应用服务器(香港),系统镜像 Docker 19.03 。

1.背景介绍

笔者使用gnuhealth(一款开源HIS软件,见 Docker实践——用于小诊所的开源医疗记录系统 )时,其安装页面、树莓派镜像介绍都在wikibooks上( https://en.wikibooks.org/wiki/GNU_Health/Installationhttps://en.wikibooks.org/wiki/GNU_Health/Embedded )。由于wikibooks没有对我国大陆提供服务,所以需要使用其他方法访问。

另外,wiki实际上指的是一类浏览器访问、用户协同编辑其内容的网站,其中以wiki百科最为出名。本文中的wiki一般指代wiki百科或wikibooks。文中介绍的前两种方法仅能访问wiki百科,最后一种方法可访问wiki百科或wikibooks。

2.方法一:wiki镜像站

这是最简单的方法,主要依靠其他人搭建的wiki百科镜像网页来访问。这些网页一般是接到访问请求后转发给wikipedia,然后接收响应、把响应转发回来。目前(2022年8月)可用的镜像站有以下这些:

英文wiki,有
https://en.jinzhao.wiki/wiki/Main_Page

中文wiki,有
https://chinois.jinzhao.wiki/wiki/Wikipedia:%E9%A6%96%E9%A1%B5
https://www.wikipedia.ahut.cf/
https://zh.wikipedia.hfut.cf/wiki/Wikipedia:%E9%A6%96%E9%A1%B5

若镜像站停止服务,可随时bing或baidu搜索 “wiki镜像” ,查询新的镜像站。

使用时,比如对 https://en.wikipedia.org/wiki/GNU_Health 这个原网址,把 /wiki/ 后面的部分复制就行,比如使用第一个镜像站时改成 https://en.jinzhao.wiki/wiki/GNU_Health 即可。

3.方法二:离线wiki

这一部分的内容主要参考了 这篇文章
大致的方法是将wiki百科网站内容全部下载(全网站内容已被别人打包为 .zim文件 ,全部的英文wiki大概 95GB ,中文wiki 20GB ),然后通过特殊的阅读器(kiwix)浏览。
第一步,在 kiwix官网下载页 下载阅读器。kiwix提供了Android、windows、linux、mac、ios、树莓派的软件安装,还有可用于chrome、firefox、edge三种浏览器的插件版kiwix。
第二步,到 kiwix提供的wiki下载页面 下载zim文件。比如英文wiki百科、全站页面就是名称为 wikipedia (English)Number of articles/Flavour 这一列为 all maxi ,其大小目前为95.2GB(这个zim包是2022年5月打包的)。右边对应的有网页下载(Download)和BT种子下载(BitTorrent),BT下载要快很多。中文的wikipedia、 all maxi 只有20.32GB,打包时间是2022年4月。
下载完成后,打开kiwix阅读器,用kiwix阅读器打开本地的zim文件即可。

这种方法还可在局域网搭建服务器,使局域网各机器没有zim文件也能阅读wikipedia(但是要装kiwix),笔者未实践。

4.方法三:香港服务器+V2Ray

如果想拿到gnuhealth的一手资料,wikibooks是必须上的。为了达到这个目标,可使用类似wiki百科镜像站的原理,使用自己的云服务器,进行请求、响应的转发。另外,使用V2Ray访问wiki时务必注意低调,多看少说。要记住,看wiki是为了学习国外技术,师夷长技以制夷。

(0)V2Ray介绍

首先介绍一下V2Ray,以下涉及V2Ray的部分主要参考了 这篇文章 。另外,有一定基础的可以直接看原文(原文还包括其他相关文章的链接),本文适合略有基础的小白直接上手。未说明的软件或地方可自行搜索,或在评论留言询问。
V2Ray是一个开源的工具,支持多种平台、多种协议,能同时支持多个出入站协议,而且其流量可伪装成网页流量。相比于传统的Shadowsocks(R)(即SSR或SS,俗称酸酸乳),区别主要在于V2Ray是一整个框架,功能强大、性能更好,SS(R)则是代理工具、配置简单。目前V2Ray的原开发者断更,社区自发组织开发了V2Fly,基本上可以认为二者相同。V2Fly的官网为 https://www.v2fly.org/ (不对我国大陆提供服务),github的项目地址则为 https://github.com/v2fly/v2ray-core 。V2Fly配置可参考 https://github.com/v2fly/v2ray-examples
介绍完V2Ray,下面正式开始操作。需要注意的是,本文中使用了一些高级操作(购买域名,伪装网页流量,使用docker),如果想简单搭一个的可参考 原文章 ,但如果是小白或需要一定的稳定性,建议还是跟着本文的步骤走。另外,自己搭建是要花一些钱的,实验性质的话花费在100¥左右或更低(最低大概50¥)。

(1)服务器购买与初始化

首先需要购买云服务器。各种云服务器的比较可查看 这份排名 ,买的时候建议先买一个月或更短期的,因为服务器到手后需要测试能否访问wiki,能访问后再续费也不迟,不能访问就及时退款。笔者使用的为阿里云轻量应用服务器(香港),系统镜像为 Docker 19.03 ,配置是CPU2核,内存2GB,硬盘60GB,月流量2T,带宽30Mbps(3.75MB/s,实际一般比该速度略低),价格为34¥/月。
购买完服务器后,先试验一下该服务器能否访问wiki,可使用:

ping en.wikibooks.org

进行测试,正常显示即可以访问wiki;若不能访问,可及时退货,更换新加坡、东京、韩国等地的服务器。
再测试一下网速。这里使用speedtest(该py脚本适用于python2.4-3.7。先装python、pip,参考 runoob教程 ,尽量不要 apt install python3 ):

apt install python3-pip
pip3 install speedtest-cli
speedtest --bytes

然后对服务器进行一些常规设置,比如设置一下root用密钥登录等。下面的操作有不懂的地方可参考 提升树莓派安全性 中的 3.-(3)设置长密码(定期更换)或仅用密钥登录 一节。具体操作如下:

配置密钥登录(实际上香港或海外的服务器用putty连有时挺卡的,卡的时候可以上阿里云连):

sudo su root
vim ~/.ssh/authorized_keys
#填入密钥,试登录
vim /etc/ssh/sshd_config
#PasswordAuthentication yes 改为 no ; PermitRootLogin yes 改为 prohibit-password
systemctl reload sshd
#分别用密码和密钥试登录,密码登录被拒

安装docker-compose:

curl -L https://github.com/docker/compose/releases/download/v1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/bin/docker-compose
chmod +x /usr/bin/docker-compose
docker-compose -v

运行docker-portainer(创建自制证书的方法可参考 Docker树莓派实践——portainer使用https 中的 1.准备工作 ),portainer是一个通过网页图形化管理docker的工具,也可以不装(因为笔者文中对docker的操作都写出了命令。但如果以后有用docker的打算,建议装上省心。):

mkdir -p /docker/portainer/ssl_certificate
#将自制证书(即server.crt和server.key)放入上面的文件夹内。如果不用HTTPS的话也可不放
docker pull portainer/portainer-ce
docker volume create portainer_data
docker run -d --name portainer -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data -v /docker/portainer/ssl_certificate:/ssl_certificate -p 9443:9443 --restart always portainer/portainer-ce --sslcert /ssl_certificate/server.crt --sslkey /ssl_certificate/server.key

然后在云服务器的防火墙(注意不是用ufw、iptables等工具,当然如果服务器预装了这些软件则也需要打开)开放9443端口,浏览器访问 https://服务器ip:9443 初始化portainer;如果不用HTTPS的话,命令改为

docker run -d --name portainer -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data -p 9000:9000 --restart always portainer/portainer-ce

然后打开云服务器的9000端口,浏览器访问 服务器ip:9000 初始化portainer。但是为了安全起见还是尽量走HTTPS。

最后,如果对docker感兴趣,可阅读之前的文章 Docker入门(一)Docker入门(二) ,以及笔者的 Docker实践系列 ;只是单纯想访问wiki百科的话,可继续阅读。

(2)准备工作

访问wiki百科等国外网站时,它们极有可能检测来源ip,如果发现来自我国大陆,就可能停止服务,非常危险,所以需要用nginx把所有数据流都伪装成网页流量来骗过wiki百科。这一步的准备工作中,需要购买域名,对域名进行认证、DNS解析,试配置nginx等,最后应当能用https正常访问购买的域名。

首先要购买域名。这里主要参考了 这篇文章
因为没有备案需求(如果确实有需求、想把自己的备案网站放到香港或其他非内地的服务器上,可在云服务器提供商处顺带购买域名、完成此步),笔者选择了Namesilo这家域名注册商,好处主要有:价格、续费较便宜;防止其他人查询域名所有者;支持支付宝。Namesilo官网为 https://www.namesilo.com/ ,可以看到 .com 后缀的域名一年是9.95$,约60¥。

购买过程如下:进入 Namesilo官网 ,点击右上角的 Sign-up 注册一个账号,注册完毕后在搜索框中搜索一个心仪的域名,比如 wuhuqifei ,如果未被占用的话就选择一个合适的后缀。注意有些域名被划掉的红色价格是续费价,不要买贵了(也可以一年换一次域名,只买最低价)。选好后点旁边的 Add 添加到购物车,点击红色的 checkout 结账,这时可设置续费、时长等,还可在 Have a Coupon or Promotion Code? 里输入邀请码降价(原文给出的邀请码为 tlanyan2020 ,可-1$),但是注意不要购买其他的DNS等服务,只买域名。最后点击 Checkout 付钱,选择支付宝,在 PAY 上面打两个勾,点击 PAY ,用支付宝扫码即可。

接下来设置DNS。Namesilo自带的DNS服务较难用,这里用的阿里云服务器,那么就用阿里云的DNS(其他厂商的云服务器和域名也可以使用阿里云的DNS服务)。打开云服务器的管理界面,在 站点设置-域名-添加域名 中,填入刚才的域名;根据 新手引导1新手引导2 中的操作执行即可,但是引导2的方法要等48小时。使用引导1中的方法,最后要到Namesilo管理后台处把域名的解析服务器改成阿里的 ns1.alidns.comns2.alidns.com ,具体方法是进入Namesilo后台、点击 Manage My Domains ,在刚才买下的domain左边打勾,上面的 ACTIONS for Selected Domains 里选第二个 Change Nameservers ,删除原有的三条配置、填上阿里云的两个DNS服务器, Submit 后跳转回域名管理页面,该域名的 Status 变为 Processing Nameserver Update... ,等待1min刷新页面, Status 变为 Active 即可。然后可以打开CMD(windows机器上win+R,输入cmd后点确定)试一下,使用命令 ping www.自己的域名 应该会显示云服务器的ip,注意这里及下文提到 自己的域名 都是指 xxxxx.com ,com可能是自己选择的其他后缀。

下一步是给购买的域名申请证书。在阿里云中搜索 SSL 证书 ,选择 SSL 证书-免费证书 ,选择digicert的免费证书。这个证书一般用于个人或小网站,一年能领20个,一张证书有效时长为一年、仅为一个域名提供证明。创建一张证书, 证书绑定域名www.自己的域名 ,其他的都不用改。然后会出现一条验证信息,需要在DNS解析里添加一条记录,类型为TXT,主机记录为_dnsauth,记录值为一长串,可以复制下来。因为上文使用的是阿里云的DNS服务器,所以在阿里云DNS控制台会自动配置,如果用的其他厂商提供的DNS(如Nameliso自己的DNS),可自己手动添加该条解析配置。然后验证、提交审核即可,基本上是秒发证书。最后在 SSL 证书 这里下载域名的证书即可,把前6种类型的都可以下一份,本文教程只用到nginx版的证书,但是其他的最好还是下载备份。

现在可以试着配置一下nginx。在云服务器上进行如下操作:

mkdir -p /docker/v2ray/conf/nginx
mkdir /docker/v2ray/www
mkdir /docker/v2ray/ssl_cert
docker pull nginx:1.23.1

用WinSCP把nginx版的证书(.key和.pem文件)放到 /docker/v2ray/ssl_cert 目录下,然后配置nginx:

vim /docker/v2ray/conf/nginx/default.conf

写入以下内容:

server {
    listen 80;
    server_name www.自己的域名;
    rewrite ^(.*)$ https://$host$1 permanent;
}

server {
    listen 443 ssl;
    server_name www.自己的域名;
    ssl_certificate /ssl_cert/xxxxx.pem;
    ssl_certificate_key /ssl_cert/xxxxx.key; 
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
    ssl_prefer_server_ciphers on;
    location / {
        root /var/www/html;
    }
}

现在可以试启动nginx:

docker run -d --name nginx_test -v /docker/v2ray/www:/var/www/html -v /docker/v2ray/conf/nginx:/etc/nginx/conf.d -v /docker/v2ray/ssl_cert:/ssl_cert -p 80:80 -p 443:443 nginx:1.23.1

这时浏览器访问 自己的域名https://www.自己的域名 ,都可看到nginx的403 Forbidden。如果看不到,可检查一下服务器的防火墙或ufw等,是否开放了80、443端口。
然后写一个测试网页:

vim /docker/v2ray/www/index.html

写入以下内容:

<!DOCTYPE html>
<html>
<head>
<title>nginx test</title>
</head>
<body>
<h1>This is my first website, wuhu, qifei!</h1>
<h2>I don't know what to put on...</h2>
</body>
</html>

建议把 This is my first website, wuhu, qifei!I don't know what to put on... 改成其他语句。
浏览器访问 自己的域名/index.html ,看到正确的页面(This is my first website, wuhu, qifei!大字,或者自己写的其他内容)。
最后,nginx版证书下载后只有.key和.pem,还需要一个.crt文件。根据pem文件可生成crt文件(pem其实是crt和key合成的),具体方法是在云服务器上使用如下命令:

openssl x509 -outform der -in /docker/v2ray/ssl_cert/xxxxx.pem -out /docker/v2ray/ssl_cert/xxxxx.crt

上述命令中要把两个地方的 xxxxx 换成自己的pem文件名。转换完成后,可以把crt文件用WinSCP传回来备个份。

到此为止,准备工作完成,进行一些清理:

docker stop nginx_test
docker container rm nginx_test

(3)用docker安装V2Ray

本文接下来将用docker-compose管理nginx和V2Ray,使用的是teddysun/v2ray这个镜像。如果不想用docker,可参考 附录 直接安装V2Ray,但不推荐。
在云服务器上,进行如下操作:

docker pull teddysun/v2ray:5.0.7
mkdir -p /docker/v2ray/conf/v2ray
mkdir -p /docker/v2ray/log/nginx
mkdir /docker/v2ray/log/v2ray
vim /docker/v2ray/conf/v2ray/config.json

config.json 就是v2ray的配置文件,需要写入如下内容:

{
  "log": {
    "loglevel": "info",
    "access": "/log/v2ray.access.log",
    "error": "/log/v2ray.error.log"
   },
  "inbounds": [{
    "port": 40000,
    "protocol": "vmess",
    "settings": {
      "clients": [
        {
          "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
          "level": 1,
          "alterId": 0
        }
      ]
    },
    "streamSettings": {
        "network": "ws",
        "wsSettings": {
          "path": "/mysecretpath"
        }
      },
    "listen": "127.0.0.1"
  }],
  "outbounds": [{
    "protocol": "freedom",
    "settings": {}
  },{
    "protocol": "blackhole",
    "settings": {},
    "tag": "blocked"
  }],
  "routing": {
    "rules": [
      {
        "type": "field",
        "ip": ["geoip:private"],
        "outboundTag": "blocked"
      }
    ]
  }
}

其中,可以更改或值得注意的有以下几处:

"port": 40000,    是v2ray服务器端用于通信的端口,建议换成其他端口(20000~55000之间),记得打开端口
"id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",     是UUID,相当于frps.ini里的token,用于服务器端识别客户端。id的格式为 8-4-4-4-12 ,由数字或小写字母组成,UUID需要用V2Ray-core生成,等下会生成一个
"path": "/mysecretpath"   下文配置nginx会用到,可自行更改为其他路径
"alterId": 0    下文配置V2Ray客户端时会用到

然后修改一下nginx的配置:

rm /docker/v2ray/conf/nginx/default.conf
vim /docker/v2ray/conf/nginx/default.conf

写入以下内容:

server {
    listen 80;
    server_name www.自己的域名;
    rewrite ^(.*)$ https://$host$1 permanent;
}

server {
    listen 443 ssl http2;
    server_name www.自己的域名;
    charset utf-8;
    ssl_certificate /ssl_cert/xxxxx.pem;
    ssl_certificate_key /ssl_cert/xxxxx.key; 
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; # TLSv1.3要求nginx 1.13.0及以上版本
    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 on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    ssl_session_tickets off;
    access_log  /log/nginx.access.log;
    error_log /log/nginx.error.log;
    location / {
        root /var/www/html;
        index  index.html;
    }

    # 下面是和v2ray相关的部分,也即websocket相关配置
    location /mysecretpath {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:40000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

在和v2ray相关的部分中,要注意的有两点:

location /mysecretpath {    这里要和V2Ray配置里的"path": "/mysecretpath"一致
proxy_pass http://127.0.0.1:40000;   40000要和v2ray的配置文件中的port一致

接下来编辑compose模板:

vim /docker/v2ray/docker-compose.yml

写入如下内容:

version: "3.9"

services:
  nginx:
    image: nginx:1.23.1
    network_mode: "host"
    volumes:
      - /docker/v2ray/conf/nginx:/etc/nginx/conf.d
      - /docker/v2ray/ssl_cert:/ssl_cert
      - /docker/v2ray/www:/var/www/html
      - /docker/v2ray/log/nginx:/log
    logging: 
      driver: syslog
    restart: always
  
  v2ray:
    image: teddysun/v2ray:5.0.7
    network_mode: "host"
    volumes:
      - /docker/v2ray/conf/v2ray:/etc/v2ray
      - /docker/v2ray/ssl_cert:/ssl_cert
      - /docker/v2ray/log/v2ray:/log
    logging: 
      driver: syslog
    restart: always

在最后运行之前,需要用V2Ray的客户端(其实V2Ray是客户端和服务器端用的是同样的文件,后面解释)生成一个UUID,即config.json里的id。以windows平台的客户端 V2rayN 为例,在自己的windows电脑上,到 V2rayN项目原址 下载最新的release,需要下载的是v2rayN-Core.zip,然后解压(这个客户端是解压即可用的,免安装。放到一个合适的位置),记下解压位置的盘符和路径。假设盘符和路径分别为 DD:\v2rayN-Core ,用CMD(win+R,输入cmd后回车即可打开cmd)进行如下操作:

D:\v2rayN-Core\v2ctl uuid
#输出一个UUID

复制这个UUID,在云服务器上用vim /docker/v2ray/conf/v2ray/config.json命令打开配置,复制到对应的位置。

一切准备好后,现在可以开始运行:

cd /docker/v2ray
docker-compose config
docker-compose up

两项服务显示绿灯,正常启动,没有疯狂重启。输出的日志大约22行,V2Ray占2行。

首先粗验证一下,浏览器访问 自己的域名自己的域名/index.html ,正确显示大字体的 This is my first website, wuhu, qifei! ;访问 自己的域名/mysecretpath ,出现 Bad Request (注意,不应该是404),说明nginx把请求转发给了V2Ray,但是由于不是用V2Ray客户端访问,V2Ray端口就伪装成了报错网页。

服务器端设置完成后,不要关闭ssh窗口,或者进行如下操作:

^C # 按下ctrl+C关闭docker-v2ray
docker-compose up -d

这样docker-v2ray就在后台运行,可以关闭ssh窗口。但是建议测试阶段先在前台运行看下docker-v2ray的日志,方便排查问题。如果是运行阶段出问题,按本文的配置,nginx和V2Ray的日志在 /docker/v2ray/log 下。

(4)安装V2Ray客户端及设置

V2Ray是不区分客户端和服务端的,因为都用的同样的文件。但有很多社区人员二次开发了一些客户端,各种平台的各类客户端汇总可看 这篇文章 ,这里仅介绍一个windows平台客户端(V2rayN)和一个安卓平台客户端(v2rayNG),以及linux运行的v2rayA。另外,据说iOS的V2Ray客户端没有免费的。

V2rayN的配置参考了 这篇文章
前面实际上已经下载了V2rayN。在windows电脑上,进入解压后的文件夹,运行v2rayN.exe,在右下角的程序托盘里会出现一个蓝色V图标,左键单击后进入V2rayN的主界面。
接着添加V2Ray节点,点击主界面左上方的服务器,添加一个VMess服务器(V2Ray的配置中有一行 "protocol": "vmess", ,即这里的服务器协议),需要填写的有:别名 填一个方便记忆的名字(如wiki-1),地址 填云服务器地址,端口 填443(不要填成40000了),用户ID 填刚才的UUID,额外ID 刚才的alterId(本文中为0);下面的部分,传输协议选 ws,伪装域名填 www.自己的域名 ,路径填 /mysecretpath ,传输层安全选 tls ,alpn选 http/1.1 。填写完成后点击确定,在 所有服务器 里会出现新的一行记录(后面要更改该条记录可直接双击它)。客户端顺利连到服务器端的话下方的信息框中会显示:

配置成功
[] [VMess] wiki-1(xx***xxx:443)
启动服务(2022/8/13 12:32:54)...
Xray 1.5.6 (Xray, Penetrates Everything.) Custom (go1.18.2 windows/386)
A unified platform for anti-censorship.
2022/08/13 12:32:54 [Info] infra/conf/serial: Reading config: D:\v2rayN-Core\config.json
2022/08/13 12:32:55 [Warning] core: Xray 1.5.6 started

设置完服务器后还需要开启客户端的代理模式,即开始代理。对程序托盘里蓝色的V图标单击右键,点击 系统代理-自动配置系统代理 即可,图标会变成红色的V。这时已经可以访问wiki了,浏览器可访问 https://en.wikibooks.org ,如果不能正常访问的话可参考 这篇文章 。如果要停止代理,对程序托盘里红色的V图标单击右键,点击 系统代理-清除系统代理 即可。

最后再设置一下代理范围。默认情况下,V2rayN是全局代理,即不管访问什么网站都要经过服务器代理,这其实没有必要,国内的网站直连更快。如果是V2rayN 4.0以后的版本(本文写作时最新的版本是5.32),可在主界面点击 设置-路由设置 ,把 启用路由高级功能 取消勾选,然后选择 基础功能-一键导入基础规则 ,这样就有了一些基本的规则,然后自己日常使用时慢慢添加规则。可以看到分了三个页面: 1.代理的Domain或IP (添加代理规则,符合规则的都会走代理)、 2.直连的Domain或IP (直连规则)、 阻止的Domain或IP (不允许访问的规则),比如想要访问 https://en.wikibooks.org/wiki/GNU_Health/Installation ,就在 代理的Domain或IP 中的左边一栏(Domain)中,将:

geosite:google

改为

geosite:google, # 一定注意每个规则之间要有一个英文逗号分隔
domain:wikibooks.org

点击确定保存。然后浏览器访问该网址,即可正确出现wiki百科网页;访问国内网页时则会直连。

另外,如果使用爬虫时需要同时用V2rayN,可以在 设置-参数设置-系统代理设置 中,把 高级代理设置,协议选择(可选) 这里选择 http=http://{ip}:{http_port};https=http://{ip}:{http_port} ,就ok了,用requests库或者scrapy都可以。

V2rayN的使用大致就是这样了。再次提醒,使用V2Ray访问wiki时务必注意低调,多看少说。要记住,看wiki是为了学习国外技术,师夷长技以制夷。接下来介绍v2rayNG的使用。v2rayNG的使用参考了 这篇文章

v2rayNG也在github上开源,在github的发行版下载地址是 https://github.com/2dust/v2rayNG/releases ,点进最新的版本,下载apk包(比如 v2rayNG_1.7.18.apk ),把apk包传到手机上进行安装。安装完成后打开,点右上角的 + 号,手动输入配置(和刚才V2rayN的配置过程一样),点击右上角的勾保存,此时点击右下角灰色的V即可开启代理,但是最好先进行一些其他设置。点击左上角的三条横线,点击设置,勾上 启用速度显示 ,把域名策略改成 AsIs ,最后打开代理,访问 wikipedia.org 试试。另外,在设置的 自定义规则 里,也能设置代理、直连、阻止的Domain或IP,可以自行填写,或在右上角三个点处使用 设置默认路由规则 ,日常使用中慢慢添加自己需要的规则。

v2rayA在github上的发行版下载地址为 https://github.com/v2rayA/v2rayA/releases ,而且v2rayA是有官方docker镜像的,这里就安装docker-v2rayA。运行如下命令:

mkdir -p /docker/v2rayA/conf/v2rayA
docker run -d --name v2raya --privileged --network=host -v /docker/v2rayA/conf/v2rayA:/etc/v2raya --restart=always mzz2017/v2raya

然后访问 linux机器ip:2017 即可看到v2rayA界面,同样进行类似设置即可。v2rayA需要用到2017、20170~20172端口,有时可能用到53端口,记得打开。

最后还需提醒,少说多看,务必低调。

(5)V2Ray的高级操作

为了避免被wiki百科检测到来源ip、禁止访问,可以进行一些高级配置来骗过wiki百科。但是要注意,服务器最终还是在阿里云手上,如果wiki百科非要查,其实是骗不过他们的火眼金睛的。还是那句话,少说多看,务必低调。

a.网页伪装

严格来说,这并不是高级操作,而是对前文方法的补全,但这一步是必不可少的。
在之前的配置中,其实是把进出服务器的流量伪装成了访问服务器网页的流量。实际上你在使用服务器访问wiki,但从外表上看只是其他人在访问服务器上的网页。但是前文中,整个网站只有一个简单的网页,而如果服务器的流量较大,很容易看出流量和网站的复杂程度不匹配。因此需要找一些网页来充实网站,或者用nginx反向代理到其他大网站。如果是后一种方法,可以参考 这篇文章 ,介绍了如何搭建wiki百科的镜像站(但是不建议选wiki,可以选百度百科这种能从内地访问的网站)。如果是后一种方法,可以自己写爬虫爬取一些网页(笔者可能在之后推出爬虫系列教程),或者参考之前的文章 Docker树莓派实践——Typecho及其备份 ,用typecho等轻量级(一定要轻量级,太大的框架会消耗大量服务器资源)的框架搭建网站。另外,如果网页经常被爬虫访问,被wiki百科查到的概率会进一步降低,所以如果每个月流量有剩余的话,可以自己写点爬虫爬自己的网站。

b.服务器备份

这个其实不算高级操作,只是用crontab把docker-V2Ray备份一下,方便以后服务器恢复,或部署V2Ray到新的服务器上。
在服务器上进行如下操作:

mkdir -p /backup/v2ray
crontab -e

加上一行:

15 0 * * * /usr/bin/zip -r /backup/v2ray/backup.zip /docker/v2ray

这样每天0点15分就会备份整个docker-v2ray,每天早晨可以自己手动下载压缩包,或者在树莓派上用ssh命令自动下载(见 Docker树莓派实践——Typecho及其备份 一文最后)。恢复时,把压缩包放到/docker目录下解压缩,然后进入/docker/v2ray、直接执行 docker-compose up -d 即可一键恢复。

c.VLESS + TCP + TLS + WS

上文中的配置大致上使用了 VMESS + Websocket(WS) + TLS ,其中VMESS是V2Ray的一种数据传输协议;WS是通信协议,与HTTP协议的不同在于能从服务器端向请求端主动发送信息,前文中是配置了nginx、对WS进行了反向代理;TLS则是指将进出服务器的流量伪装成了用HTTPS访问服务器网页时的流量(用HTTP的话数据不加密,一眼就能看穿)。下面将演示使用 VLESS + TCP + TLS + WS 的配置,这也是 官方配置 中最推荐的(recommended)。
首先介绍一下VLESS和TCP。VLESS也是V2Ray的一种数据传输协议,可以说是VMESS的进阶版,VLESS的特点有:不依赖系统时间(VMESS要对比客户端和服务器端的时间,两者在不同时区的话时间可能不同,那么就不能用V2Ray,但这个问题设置一下时区应该就能解决,只是比较难发现),不使用alterId;无加密(所以需要配合TLS等方式加密),因此速度更快;自带分流、回落(比如上文中,用浏览器直接访问 www.自己的域名/mysecretpath ,显示的是正常的网页即 Bad Request ,这就是一种回落;分流则是对多个代理请求分到不同的端口处理),可替代nginx的分流回落(但是最好还是用nginx开一个正常网页,只是有些情况下可以不用nginx配置WS)。TCP则是一种基础的通信协议,这里没有什么特殊的。
另外笔者想介绍一下XTLS。XTLS从名字上看就和TLS有点关系,简单来说XTLS减少了一次加密,提高了性能。目前来说 VLESS + XTLS 是性能最好的搭配,但是XTLS好像不能搭配WS,笔者便没有深入了解。具体可参考 github XTLS介绍VLESS + XTLS使用介绍 。但其实也不必过于纠结XTLS带来的性能提升,不用XTLS性能也差不了太多,VMESS换成VLESS已经提升不少性能了,安全性还是第一位的。

前文中已经安装过所有需要的软件,这里改动一下服务器端和客户端的配置即可。在云服务器上进行如下操作:

docker stop v2ray_nginx_1
docker stop v2ray_v2ray_1
mv /docker/v2ray/conf/v2ray/config.json /docker/v2ray/conf/v2ray/config.json_backup # 做备份,用不了时可改回原配置
vim /docker/v2ray/conf/v2ray/config.json

写入如下内容(以下配置参考了 官方配置模板 ):

{
    "log": {
        "loglevel": "info",
        "access": "/log/v2ray.access.log", # log文件
        "error": "/log/v2ray.error.log" # log文件
    },
    "inbounds": [
        {
            "port": 40000, # 因为nginx的TCP占用了443,所以这里从443改成40000端口
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", # 换成UUID
                        "level": 0,
                        "flow": "xtls-rprx-origin" # 此设置可加强性能
                    }
                ],
                "decryption": "none",
                "fallbacks": [
                    {
                        "dest": 80
                    },
                    {
                        "path": "/mysecretpath", # 分流路径
                        "dest": 40000, # V2Ray使用的监听端口
                        "xver": 0
                    }
                ]
            },
            "streamSettings": {
                "network": "tcp",
                "security": "tls",
                "tlsSettings": {
                    "alpn": [
                        "http/1.1"
                    ],
                    "certificates": [
                        {
                            "certificateFile": "/ssl_cert/.crt", # .crt路径
                            "keyFile": "/ssl_cert/.key" # .key路径
                        }
                    ]
                }
            }
        },
        {
            "port": 40000, # V2Ray使用的监听端口,和上面应当一致
            "listen": "127.0.0.1",
            "protocol": "vless",
            "settings": {
                "clients": [
                    {
                        "id": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", # 换成UUID
                        "level": 0
                    }
                ],
                "decryption": "none"
            },
            "streamSettings": {
                "network": "ws",
                "security": "none",
                "wsSettings": {
                    "path": "/mysecretpath" # 分流路径,和上面应当一致
                }
            }
        }
    ],
    "outbounds": [
        {
            "protocol": "freedom"
        }
    ]
}

复制时,记得把所有注释删除,即以 # 开头的内容。
这里稍微对服务器端配置进行解释(很多地方是笔者猜测,有不对的地方请指出),不想看的可以继续进行后面的步骤。
"inbounds" 后面是指定入站的请求如何处理。 "flow": "xtls-rprx-origin" 可以极大提升性能。比较重要的是 "fallbacks" ,这是用于分流和回落的设置, "fallbacks" 的一项内容最多可以有4种参数, "alpn" (一般忽略)、 "path" (回落/分流路径)、 "dest" (回落/分流地址,只填端口号则表示本机,也可以转到其他网站,比如填 www.baidu.com:443 )、 "xver" (为1时表示传递真实ip,0表示不传递),就拿上面的配置来说,遇到一个请求,如果是V2Ray客户端发出的(请求格式正确)、UUID是对的、访问端口和路径也确实是代理用的,那么就会根据 "fallbacks" 里的配置被分流到服务器的40000端口,进一步流到下面的WS里(如果再添加几个 "path""dest""xver" 的组合,就更能显示出真正的分流);而如果有一个地方不对,就会被扔回到HTTP端口,即服务器的80端口(如果 "dest": 80 改成 "dest": "www.baidu.com:443" 则会跳转到百度去),那么就会返回正常网页。

然后重新开启服务:

cd /docker/v2ray
docker-compose config
docker-compose up

这时同样在浏览器访问 自己的域名 ,出现的是正常网页;访问 自己的域名/mysecretpath ,出现 Bad Request ,说明服务器端应该配置成功。然后配置客户端,在 V2rayN 和 v2rayNG 的服务器中都可选择VLESS服务器,根据自己服务器端的配置填写即可,注意端口还是填443而不是40000,流控(flow)选择和 "flow": "xtls-rprx-origin" 的一样,传输协议是ws。另外, 官方配置 中还可以用tcp而不是ws配置客户端,详见 config_client_tcp_tls.json 这个文件。

d.双服务器

即一台内地服务器+一台非内地服务器。由于香港的或其他非内地云服务器提供的网页服务经常在内地也能看到,能看到有被wiki百科查到的风险,比较坏的情况是被阻止访问(最坏的是被人肉搜索),这时该云服务器就无法从内地访问。在 阿里云的自检网站 可以查到一个域名或ip是否被列入工信部黑名单。对这种云服务器,并非没有办法拯救。之前也提到过,用putty连香港或其他非内地的服务器有时有点卡,但在阿里云控制台连从来不会卡(除非有时阿里云的服务器抽风),所以想要连接这台香港服务器,可以用一台内地服务器,从阿里云的内部网络访问,有时甚至还能加快访问速度。但是这种操作需要再买一台内地服务器,而内地服务器要稍微贵一点。如果不想担惊受怕就可以花这个钱,或者也可以再买其他非内地服务器(但是仍然有被封的风险)。

在端口转发中,最关键的一个问题是香港服务器和内地服务器通过哪个ip能访问到对方。前面已经提到,香港服务器被列入工信部黑名单后,就不能从内地访问到香港服务器,但是对于香港服务器是否还能通过公网ip访问到内地服务器,或者内地服务器能否通过公网ip访问到香港服务器(即公网访问),笔者并无经验。如果要使用内网ip访问,对于阿里云服务器,点开服务器详情可以看到服务器除了一个公网ip,还有一个内网ip。购买一个内地服务器后,当香港服务器的nginx在运行中时,可以在内地服务器上 ping 自己的域名 ,能正常解析公网ip,但是直接ping香港服务器的内网ip则没有响应,这是因为不同地域服务器间还需要另外开通内网互通。在轻量应用服务器的控制台左侧点入 内网互通 ,可以看到对同账号下不同地域的服务器间进行内网互通要到企业网控制台操作,还要交一笔钱。理论上来说,进行内网互通后,香港服务器和内地服务器能通过各自的内网ip访问到对方,这种内网ip多半是127开头,也可能是172开头。但是不知道内网ip也没关系,可以先按本流程走,以后2个服务器之间无法互相连接时,即刻到阿里云开通内网互通,把香港服务器访问内地服务器的内网ip复制一次就行了。

下面就介绍一下使用双服务器、端口转发的3种方法。双服务器的流量转发,可以使用firewalld/iptables转发(优点是性能高),或者配置nginx转发,还可以配置frp转发。这里笔者比较推荐frp,因为frp虽然第一次配置稍繁琐,但后续更改配置也算简单。更重要的是frp作为十分常用的内网穿透工具,用途更多样化,很有必要了解。这里也略微提一下前两种方法(参考了 这篇文章 ),但这两种方法笔者并未实践。

第一种方法

firewalld,是CentOS默认的防火墙软件,一般服务器镜像上都已预装。阿里云的Docker镜像是基于CentOS,所以也装了firewalld,可使用 firewalld -h 查看帮助。如果要进行转发,可在内地服务器上如下进行配置:

vim /etc/sysctl.conf

在这个文件最后里加一行 net.ipv4.ip_forward = 1 ,意为打开前向代理。然后用 sysctl -p 使配置生效,接下来就可以设置端口转发。在本文中,其他需要转发的端口分别是(内地服务器到香港服务器):50022到22,80到80,443到443,40000到40000。在内地服务器上如下进行配置(记得替换自己的香港服务器ip):

systemctl enable firewalld
systemctl start firewalld
firewall-cmd --state
firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent --add-port=443/tcp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-forward-port=port=443:proto=tcp:toaddr=香港服务器ip:toport=443
firewall-cmd --permanent --add-forward-port=port=443:proto=udp:toaddr=香港服务器ip:toport=443
firewall-cmd --permanent --add-port=50022
firewall-cmd --permanent --add-forward-port=port=50022:proto=tcp:toaddr=香港服务器ip:toport=22
firewall-cmd --permanent --add-port=80
firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=香港服务器ip:toport=80
firewall-cmd --permanent --add-port=40000
firewall-cmd --permanent --add-forward-port=port=40000:proto=tcp:toaddr=香港服务器ip:toport=40000
firewall-cmd --reload

只有443端口需要配置tcp、udp协议。配置完成后,记得在两个服务器的防火墙上分别打开端口。这里稍微解释一下,22是香港服务器的ssh端口(用于putty连接),80是HTTP端口,443是HTTPS端口,40000是V2Ray监听的端口。另外再次提醒,这里的香港服务器ip暂时可填公网ip,后面有必要时可换为内网ip。删除转发规则只需要把 --add 改成 --remove 即可。关于firewalld或iptables的更多操作可自行搜索。

第二种方法

配置nginx转发。在内地服务器上(Docker镜像),可进行如下操作:

mkdir -p /docker/nginx_forward/conf/nginx
docker pull nginx:1.23.1
vim /docker/nginx_forward/docker-compose.yml

写入如下内容:

version: "3.9"

services:
  nginx:
    image: nginx:1.23.1
    network_mode: "host"
    volumes:
      - /docker/nginx_forward/conf/nginx:/etc/nginx/conf.d
    logging: 
      driver: syslog
    restart: always

然后配置nginx:

vim /docker/nginx_forward/conf/nginx/forward.conf

写入如下内容(记得替换自己的香港服务器ip):

#端口转发配置
stream {
    server {
        listen 50022;
        proxy_pass 香港服务器ip:22;
    }
    server {
        listen 80;
        proxy_pass 香港服务器ip:80;
    }
    server {
        listen 443;
        proxy_pass 香港服务器ip:443;
    }
    server {
        listen 40000;
        proxy_pass 香港服务器ip:40000;
    }
}

同样记得在防火墙打开端口。最后运行docker-nginx:

cd /docker/nginx_forward
docker-compose config
docker-compose up -d

下面开始介绍frp的使用方法。

使用frp,基本的原理是,以内地服务器做frps,香港服务器做frpc。简单来说,frp是一种把frpc上的端口投射到frps上的工具,比如把香港服务器的80、443端口投射到内地服务器的80、443端口(或其他端口),那么在内地即使不能通过香港服务器的公网ip访问香港服务器,也可以通过访问内地服务器的公网ip访问到香港服务器。关于frp的更多介绍见 Docker树莓派实践——frp(附dashboard开启https、frp双向验证)

frp中最关键的地方是,笔者实践时未开通内网互通,所以香港服务器是用公网ip访问内地服务器的,也能成功连接。最后,买服务器时要注意,2个服务器的每月流量额度最好能相等,这样不会出现一个服务器流量先用完的情况。

首先进行证书的准备。为了安全,frp也应该使用tls证书,在香港服务器上进行如下操作:

mkdir -p /docker/frpc/conf
mkdir /docker/frpc/ssl_cert
cd /docker/frpc/ssl_cert
vim /docker/frpc/ssl_cert/my-openssl.cnf

写入以下内容:

[ ca ]
default_ca = CA_default
[ CA_default ]
x509_extensions = usr_cert
[ req ]
default_bits        = 2048
default_md          = sha256
default_keyfile     = privkey.pem
distinguished_name  = req_distinguished_name
attributes          = req_attributes
x509_extensions     = v3_ca
string_mask         = utf8only
[ req_distinguished_name ]
[ req_attributes ]
[ usr_cert ]
basicConstraints       = CA:FALSE
nsComment              = "OpenSSL Generated Certificate"
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid,issuer
[ v3_ca ]
subjectKeyIdentifier   = hash
authorityKeyIdentifier = keyid:always,issuer
basicConstraints       = CA:true

然后输入下面六条命令:

openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=www.自己的域名" -days 5000 -out ca.crt
#第三条命令
openssl genrsa -out server.key 2048
#第四条命令
openssl req -new -sha256 -key server.key \
    -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=server.com" \
    -reqexts SAN \
    -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:localhost,IP:香港服务器公网ip,DNS:自己的域名")) \
    -out server.csr
#第五条命令
openssl x509 -req -days 365 \
    -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
    -extfile <(printf "subjectAltName=DNS:localhost,IP:香港服务器公网ip,DNS:自己的域名") \
    -out server.crt
mv /docker/frpc/ssl_cert/ca.crt /docker/frpc/ssl_cert/server_ca.crt

其中注意要改5处,3处 自己的域名 (勿加www.),2处 香港服务器公网ip 。然后,用WinSCP把 server.key、server.crt、server_ca.crt 这3个文件拷回来备份;/docker/frpc/ssl_cert这个文件夹里只留下 server_ca.crt 和 my-openssl.cnf 这2个文件,其他的文件删除。再输入如下的六条命令:

openssl genrsa -out ca.key 2048
openssl req -x509 -new -nodes -key ca.key -subj "/CN=www.自己的域名" -days 5000 -out ca.crt
#第三条命令
openssl genrsa -out client.key 2048
#第四条命令
openssl req -new -sha256 -key client.key \
    -subj "/C=XX/ST=DEFAULT/L=DEFAULT/O=DEFAULT/CN=client.com" \
    -reqexts SAN \
    -config <(cat my-openssl.cnf <(printf "\n[SAN]\nsubjectAltName=DNS:自己的域名,DNS:www.自己的域名")) \
    -out client.csr
#第五条命令
openssl x509 -req -days 365 \
    -in client.csr -CA ca.crt -CAkey ca.key -CAcreateserial \
    -extfile <(printf "subjectAltName=DNS:自己的域名,DNS:www.自己的域名") \
    -out client.crt
mv /docker/frpc/ssl_cert/ca.crt /docker/frpc/ssl_cert/client_ca.crt

其中注意要改5处,5处都是 自己的域名 (勿乱加www.)。然后,用WinSCP把 client.key、client.crt、client_ca.crt 这3个文件拷回来备份;/docker/frpc/ssl_cert这个文件夹里只留下 client.key、client.crt、server_ca.crt 这3个文件,其他的文件删除(包括 my-openssl.cnf )。剩下的 server.key、server.crt、client_ca.crt 这3个文件后面放到内地服务器上。

做好证书后,购买一个阿里云的内地服务器,同样选择 Docker 镜像,像香港服务器一样进行初始化(设置密钥,下载docker-compose,安装portainer)。然后对内地服务器进行如下操作:

docker pull snowdreamtech/frps
mkdir -p /docker/frps/conf
mkdir /docker/frps/ssl_cert
vim /docker/frps/conf/frps.ini

在frps.ini(frps的配置文件)中写入以下内容:

[common]
bind_port = 7000
#frpc上也要有相同的token值
token = 你的口令

#frps统计板
dashboard_port = 7500
dashboard_user = wuhuqifei # 用户名记得更改
dashboard_pwd = wuhuqifei # 密码记得更改

#dashboard使用tls的相关配置
dashboard_tls_mode = true
dashboard_tls_cert_file = /ssl_cert/server.crt
dashboard_tls_key_file = /ssl_cert/server.key

#kcp据说是多消耗15%流量、降低tcp延迟,端口可和bind_port相同。流量用的多可以不加这个
kcp_bind_port = 7000

#双向认证相关配置
tls_only = true
tls_cert_file = /ssl_cert/server.crt
tls_key_file = /ssl_cert/server.key
tls_trusted_ca_file = /ssl_cert/client_ca.crt

下面对frps的配置进行一些说明。 bind_porttoken 是最核心的设置,其他的设置可以不要但这两个必须有,前者是指定用于frps自己通讯的端口,后者相当于V2Ray的UUID(但是token可以自己随手输,UUID则要专门生成)。dashboard是一个网页统计版,就是说浏览器访问 内地服务器ip:7500 ,输入user和pwd后就能从网页UI观察frps的投射情况;dashboard不用tls的话是用HTTP通信、不加密,用上tls后就能从HTTPS访问、加密,访问时要用 https://内地服务器ip:7500 这种形式,浏览器会弹出警告,在高级选项里选择继续访问;双向认证是指frps和frpc互相通讯时,不止是frps要验证frpc的口令,而且frps和frpc相互之间(frps要用tls证书验证frpc的身份,frpc也要用tls证书验证frps的身份,所以叫双向)还要验证各自的证书,更加安全。
设置完frps.ini后,把 server.key、server.crt、client_ca.crt 这3个文件放入/docker/frps/ssl_cert中,然后运行docker-frps:

docker run -d --name frps -v /docker/frps/conf/frps.ini:/etc/frp/frps.ini -v /docker/frps/ssl_cert:/ssl_cert --network host --restart=always snowdreamtech/frps

之后可以用浏览器访问 https://内地服务器ip:7500 (记得打开7500端口),输入用户名密码可看到frps运行情况。

设置完内地服务器后,在香港服务器上进行如下操作(如果服务器无法连接,就从阿里云控制台连):

docker pull snowdreamtech/frpc
vim /docker/frpc/conf/frpc.ini

写入以下内容:

[common]
server_addr = 内地服务器ip地址 # 这里应该是办理内网互通后得到的内网ip,如果没有的话可以用内地服务器的公网ip试试
server_port = 7000
token = 你的口令
login_fail_exit = false # 一次连不上是否立即关闭frpc。为false时frpc会不断尝试,直到连上frps

#双向验证相关配置
tls_enable = true
tls_cert_file = /ssl_cert/client.crt
tls_key_file = /ssl_cert/client.key
tls_trusted_ca_file = /ssl_cert/server_ca.crt

[HK-ssh-1]
type = tcp
local_ip = localhost
local_port = 22
remote_port = 50022

[HK-http-1]
type = tcp
local_ip = localhost
local_port = 80
remote_port = 80

[HK-https-1]
type = tcp
local_ip = localhost
local_port = 443
remote_port = 443

[HK-v2ray-1]
type = tcp
local_ip = localhost
local_port = 40000
remote_port = 40000

#如果想把香港服务器上的portainer网页也投射出来,就把下面四行的注释去掉
#[HK-portainer-1]
#type = tcp
#local_ip = localhost
#local_port = 9443 # 如果portainer没用HTTPS,就改成9000
#remote_port = 9444

再次检查,香港服务器的/docker/frpc/ssl_cert这个文件夹里应该只有 client.key、client.crt、server_ca.crt 这3个文件。frpc的配置比较简单, [common] 下面的八行设置是连接frps时的设置;后面的,每五行是一个端口投射,以第一个 [HK-ssh-1] 为例,这个中括号里面的是这项投射的名称(frpc成功连到frps后在dashboard上可以看到), type 是投射的通讯协议; [HK-ssh-1] 这整个五行配置的意思是frpc在通过口令、双向认证成功连接到frps后,将会要求把frpc的22端口投射到frps的50022端口;22端口一般是用于ssh的,平常用putty时默认就是连接到22端口,把香港服务器的22端口投射到内地服务器的50022端口,那么用putty连接 内地服务器:50022 端口即可连接到香港服务器的ssh。
之后就可以开启frpc了,但还要检查一下服务器端口的开放情况。内地服务器需要开放22、80、443、7000、7500、40000、50022端口,香港服务器需要开放22、80、443、40000端口;如果portainer也投射的话,内地服务器还需要开放9444端口,香港服务器开放9443或9000端口,之后浏览器访问 https://内地服务器ip:9444 就能看到香港服务器的portainer网页UI。
然后,在香港服务器上开启docker-frpc:

docker run -d --name frpc -v /docker/frpc/conf/frpc.ini:/etc/frp/frpc.ini -v /docker/frpc/ssl_cert:/ssl_cert --network host --restart=always snowdreamtech/frpc

浏览器访问 https://内地服务器ip:7500 ,忽略警告( 高级选项-继续访问 ),输入dashboard的用户名密码,如果frpc成功连接到frps,就可以看到tcp里新增了4或5项投射。

最后,对V2Ray进行配置,这里只需要更改V2Ray客户端的设置。比如在V2rayN上,应该只需修改地址,把 地址 改成 内地服务器公网ip 即可,甚至都不需要改域名。笔者实验时,两个服务器没有内网互通,只改地址可成功连接;如果不能,可以试试把 域名 也改成 内地服务器公网ip

另外,使用双服务器时,可以配置一下香港服务器,使得其他人扫描端口时,除了22、80、443端口开放,其他端口都关闭;只有ip是内地服务器时才开放其他端口。在香港服务器上如下操作:

firewall-cmd --permanent --remove-port=40000/tcp
firewall-cmd --permanent --zone=trusted --add-port=40000/tcp
firewall-cmd --permanent --zone=trusted --add-source=内地服务器ip
fireawll-cmd --reload

用ufw或iptables也可达到相同的效果(ufw更简单),详情可自行搜索。

(6)服务器被封禁的表现

wiki对跨越者服务器的封禁表现为80、443端口无法访问,这两个端口的网页都看不了;但是在其它端口的网页服务都能访问。据说现在wiki正在训练AI对跨越流量智能识别+封禁,可能2022年中的一波就与此有关。

5.方法四:购买服务

方法三是主要是探讨了一些学术上的可行性。如果不想折腾,可以购买一些服务,常见的有 ladder(2.99$/月) 、 express(6.67$/月) 、 nord(3.29$/月) 、 surfshark(2.3$/月) 、 pure(3.24$/月) 、 vypr(1.67$/月) 等。

附录:不使用docker,直接安装V2Ray(不推荐)

如果不用docker的话也可以安装V2Ray,但是docker管理更方便、不会污染服务器的系统,且docker-V2Ray版本更新也挺勤快的,所以笔者并不推荐以下的方法。以下内容主要来自 这篇文章

本来官方是有提供自动安装脚本的(在 https://github.com/v2fly/v2ray-core/blob/master/release/install-release.shhttps://install.direct/go.sh ),但是后来弃用了,目前可使用社区中其他人提供的脚本。
使用如下命令即可安装V2Ray:

bash <(curl -sL https://raw.githubusercontent.com/hijkpw/scripts/master/goV2.sh)

输出如下:

Installing V2Ray v4.45.2 on x86_64
Downloading V2Ray: https://github.com/v2fly/v2ray-core/releases/download/v4.45.2/v2ray-linux-64.zip
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0
100 13.1M  100 13.1M    0     0  4168k      0  0:00:03  0:00:03 --:--:-- 3919k
/dev/fd/63: line 152: unzip: command not found
Updating software repo
Installing unzip
Archive:  /tmp/v2ray/v2ray.zip
  inflating: /usr/bin/v2ray/geoip.dat
  inflating: /usr/bin/v2ray/geosite.dat
  inflating: /usr/bin/v2ray/v2ray
  inflating: /usr/bin/v2ray/v2ctl
PORT:xxxxx
UUID:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Failed to execute operation: No such file or directory
Created symlink from /etc/systemd/system/multi-user.target.wants/v2ray.service to /etc/systemd/system/v2ray.service.
V2Ray v4.45.2 is installed.

其中的PORT和UUID也可在V2Ray的配置文件中看到:

vim /etc/v2ray/config.json

另外,配置里的alterId也要记下。
然后在云服务器的防火墙中打开PORT对应端口,验证一下V2Ray运行没有:

ss -ntlp | grep v2ray

若输出为空,应该是被SELinux限制了。可关闭SELinux并重启V2Ray:

setenforce 0
systemctl restart v2ray
ss -ntlp | grep v2ray

这时可正确看到输出。之后使用时,更改 /etc/v2ray/config.json 这个配置文件即可,每次更改完配置文件后用 systemctl restart v2ray 重启V2Ray。最后,设置一下v2ray开机自启:

systemctl enable v2ray

标签: docker, docker-compose, 云服务器, V2Ray

仅有一条评论

  1. zurica

    现在比较流行用xray和hysteria, v2ray有些落伍了~~

添加新评论