MENU

Websocket+TLS+CDN配置教程

October 3, 2019 • 极意阅读设置

(20-03-19 Update:整合优化Nginx 配置,增加BBR、探针功能)
(19-10-19 Update:添加Nginx 简版配置)

  写这篇是有些迫于无奈,但也没办法,毕竟老的手段总有过时的那一天,只是你有你的张良计,那我也要有我的过墙梯:

$$ Websocket+TLS+Web+CDN $$

  简单讲下现在的和之前的的有什么区别,其实一直以来都是通过伪装数据流量的方法来避开审查,只不过之前是通过添加混淆来实现伪装HTTP流量,但由于开发者早已停止维护更新,所以最近应该是被精准的识破了旧的伪装方式。本文所采用的则是完全的伪装,需要真正的网站域名和SSL证书,应该是再无法区别和正常访问网站流量之间的区别,当然万物也没有绝对,不同数据包的流量特征和使用习惯这点是无法伪装的,如果想保障绝对的安全还可以采用CDN服务李代桃僵。

  往下继续的话,需要你有这些准备:

  • 一个域名(推荐去Namesilo购买6位数字的xyz域名,0.77刀一年,自带Whois隐私保护)
  • 当然还要一台VPS(IP无法正常访问的也可以用CDN救活),本文适用Debian/Ubuntu系统

  如果你到现在还没有看懂我在讲什么的话,就可以不用往下继续了,本文非小白向,起码你要懂域名的DNS解析是啥,Nginx/Caddy中任何一个的简单用法,如果不清楚请Google后再进行尝试。(可以看下本博客的前几篇哦~)


—— V2 配置 ——

  开始安装V2(建议通过代理隧道连接SSH)

wget https://install.direct/go.sh && bash go.sh

  安装好后会自动生成一个uuid,建议保留,如果丢失也可以自己生成

cat /proc/sys/kernel/random/uuid

  清空配置配置文件,重新编辑

echo "" > /etc/v2ray/config.json
nano /etc/v2ray/config.json

  下面提供几个常见配置模板,根据需要选择,也可自行更改

{
  "log": {
    "loglevel": "warning",
    "access": "/var/log/v2ray/access.log",
    "error": "/var/log/v2ray/error.log"
  },
  "inbounds": [
    {
      "port": 50001,
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "你的UUID",
            "alterId": 64
          }
        ]
      }
    },
    {
      "port": 50002,
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "你的UUID",
            "alterId": 64
          }
        ]
      },
      "streamSettings": {
        "network":"kcp",
        "kcpSettings": {
          "mtu": 1350,
          "tti": 20,
          "uplinkCapacity": 30,
          "downlinkCapacity": 100,
          "congestion": false,
          "readBufferSize": 1,
          "writeBufferSize": 1,
          "header": {
            "type": "none"
          }
        }
      }
    },
    {
      "port": 50003,
      "protocol": "vmess",
      "listen": "127.0.0.1",
      "settings": {
        "clients": [
          {
            "id": "你的UUID",
            "level":1,
            "alterId": 64,
            "security": "none"
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "auto",
        "wsSettings": {
          "path": "/python3"
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {}
    }
  ]
}

  这里是开放了3个端口

  50001(TCP)/ 50002(KCP)/ 50003(WS+TLS+WEB)

  配置好后检查配置文件,如果没有问题重启服务

/usr/bin/v2ray/v2ray -config /etc/v2ray/config.json -test
systemctl restart v2ray

  前两种方式现在已经可以使用,但WS+TLS的方式还需要我们配置一下,首先需要添加一个你的域名的A记录,IP指向服务器地址,推荐使用Cloudflare(请确保此时的DNS解析是灰色云朵状态),这家还提供免费的15年SSL证书(推荐ECDSA 版本),以及免费的CDN加速服务,一站凑齐,免费不折腾。

— Nginx 配置 —

  (已优化Nginx配置,可以与其他站点同时存在~)

  先申请一个免费的SSL证书,这里使用Certbot,你也可以替换为CF之类的证书,

apt install certbot
certbot certonly --standalone --agree-tos -d 你的域名 --server https://api.buypass.com/acme/directory

  签好的 SSL 存放在,

/etc/letsencrypt/live/你的域名/fullchain.pem
/etc/letsencrypt/live/你的域名/privkey.pem

  安装nginx

apt -y install nginx
systemctl start nginx
systemctl enable nginx

  新建v2文件夹,编辑配置文件

mkdir -p /python3
nano /etc/nginx/conf.d/v2ray.conf

  将配置文件改写为如下形式

server {
    listen 443 ssl;

    ssl on;
    ssl_certificate        /etc/letsencrypt/live/此为SSL公钥路径/fullchain.pem;
    ssl_certificate_key    /etc/letsencrypt/live/此为SSL私钥路径/privkey.pem;
    ssl_protocols          TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers                TLS13-AES-256-GCM-SHA384:TLS13-CHACHA20-POLY1305-SHA256:TLS13-AES-128-GCM-SHA256:TLS13-AES-128-CCM-8-SHA256:TLS13-AES-128-CCM-SHA256:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+ECDSA+AES128:EECDH+aRSA+AES128:RSA+AES128:EECDH+ECDSA+AES256:EECDH+aRSA+AES256:RSA+AES256:EECDH+ECDSA+3DES:EECDH+aRSA+3DES:RSA+3DES:!MD5;

    root    /python3;
    index index.php index.html index.htm index.nginx-debian.html;
    server_name 此处改为你的域名;

    include /etc/nginx/default.d/*.conf;

    location /python3 {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:50003;
        proxy_http_version 1.1;
        proxy_set_header Host "你的域名";
        proxy_set_header Connection "Upgrade";
        proxy_set_header Upgrade "WebSocket";
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_intercept_errors on;
        proxy_read_timeout 300s;
    }
        
    location / {
            try_files $uri $uri/ =404;
    }

    location ~ \.php$ {
            include snippets/fastcgi-php.conf;
            fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
    }

    location ~ /\.ht {
            deny all;
    }
}

  测试无误后重新启动nginx

nginx -t
systemctl reload nginx

  现在就可以了,是不是感觉简单了太多

— Caddy 配置 —

  如果你嫌nginx配置十分繁琐,这里也推荐使用caddy:自动创建和维护ssl证书,且配置十分简单:

curl https://getcaddy.com | bash -s personal
mkdir -p /etc/caddy && mkdir -p /etc/ssl/caddy
nano /etc/caddy/Caddyfile

  配置文件如下,不得不承认是真的简洁:

你的域名 {
    log stdout
    tls 你的邮箱@gmail.com
    proxy /opt/wwwroot/v2ray localhost:50003 {
        websocket
        header_upstream -Origin
    }
}

— CDN复活术 —

  登入Cloudflare,并确保Cloudflare的安全认证已激活(即SSL 选项卡页面有显示 Universal SSL Status Active Certificate字眼,如果没有请等待24小时内即可完成的证书申请),若上述都没有问题,应该就可以正常使用了,如果你的IP已不可访问,此时点亮CloudFlare的橙色云朵,便可救活。(你现在访问的此页面,曾经就是这样救活的)

几个小功能:

— 开启TCP BBR —

  谷歌大名鼎鼎的TCP BBR协议能有效的提升TCP线路的质量,具体不多阐述,而设定起来也非常的方便,如下:

echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
sysctl -p
lsmod | grep bbr
# 若出现tcp_bbr字样,则表明设定成功

— 探针伪装 —


  网页上若什么没有自然也是挺奇怪的,所以不如放个探针还可以监测下,我这里用的是比较常见的X探针,当然你也可以自由发挥,装别的探针甚至放别的网站内容~

# 这一步应该需要有php依赖,请先自行安装php组件
# 进入站点目录,获取探针
cd /python3
wget https://github.com/kmvan/x-prober/raw/master/dist/prober.php
# 重命名,重载Nginx
mv ./prober.php ./index.php
systemctl reload nginx

  这时打开网页,探针便可正常加载,注意我只让nginx监听了443端口,所以Http打开显示的是nginx默认界面哟~

— AdGuard 广告拦截 —

  安装AdGuard:

cd /opt
wget https://github.com/AdguardTeam/AdGuardHome/releases/download/v0.96-hotfix/AdGuardHome_linux_amd64.tar.gz
tar -xzvf AdGuardHome_linux_amd64.tar.gz
rm -rf AdGuardHome_linux_amd64.tar.gz
cd AdGuardHome
./AdGuardHome -s install

  在v2的配置文件中,添加dns部分:

  "dns": {
    "servers": [
      "你的服务器公网IP"
    ]
  },

  然后在outbound下中的settings部分添加规则,最终就像这个样子

  "outbound": {
    "protocol": "freedom",
    "settings": {
      "domainStrategy": "UseIP"
    }
  }

  访问服务器公网IP+端口3000可以浏览到AdGuard的管理界面:(配置的时候把webui端口监听在高位端口,防止和已被nginx/caddy占用的80端口冲突,但要记得开放)

— 节点中继 —

  这个是因为我自己有中转需求,我现在有一台原生日本IP的IIJ小鸡,但IIJ线路晚上崩的是完全不能用的,(原本是想用阿里HK中转的,但挂球了),然后现在有一台还可以使用的甲骨文韩国小鸡,走的是LG线路,起码比IIJ强太多了,就打算中转一下,不然打开Abema就像在放PPT一样这谁受得了...

  首先要在中转和落地服务器上均安装V2,然后在中转服务器上修改配置文件的outbound部分如下即可

  "outbounds": [
    {
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "落地服务器IP",
            "port": 落地服务器端口,  
            "users": [
              {
                "id": "落地服务器UUID",
                "alterId": 64
              }
            ]
          }
        ]
      }
    }
  ]
}

  这是最简单的,就是全部中转,但很多时候应该还是会想添加直连的路由功能吧,比如你的中转是在国内,自然访问国内网站和IP就希望直连,但我懒得写的那么详细,就附上我自己的需求吧:kr域名直连,其它落地日本访问

  "outbounds": [
    {
      "protocol": "vmess",
      "tag": "japan",
      "settings": {
        "vnext": [
          {
            "address": "落地IP",
            "port": 落地端口,  
            "users": [
              {
                "id": "落地UUID",
                "alterId": 64
              }
            ]
          }
        ]
      }
    },
    {
      "protocol": "freedom",
      "settings": {},
      "tag": "direct"
    }
  ],
  "routing": {
    "domainStrategy": "AsIs",
    "rules": [
      {
        "type": "field",
        "outboundTag": "direct",
        "domain": [
            "domain:kr"
        ] 
      }
    ]
  }
}

  你可能会觉得我这样写有点奇怪,为什么不是JP域名和日本IP中转,其它IP直连呢,这样才更自然啊,确实我一开始就是这样写的,但后来发现这样写有问题,在手机上访问客户端的时,有些app无法正常访问,但网页打开就时可以,而且还有些奇葩网站,添加了域名规则后仍然限制我访问,但我修改为上文后就可以,我想不明白它的侦测手段具体怎样,所以就只能写成上述模式,至于IP规则我没有很大的需求,就只添加了域名规则:我顶多再折腾台能看BBC的小鸡就满足所有需求了,你要是有需求请参阅V2的白话文教程。

  对了,客户端使用教程不在本文范围之内,如有需要请参考此份教程,本文相当一部分内容也是源自此文。

Last Modified: April 15, 2020