V2Ray+websocks+nginx+TLS+cdn科学上网防止被墙

发布于 2019-09-05  623 次阅读


介绍下防被墙的思路:

V2Ray 使用 WebSocket 传输协议,之后使用 Nginx 实现 TLS,然后将 WebSocket 流量转发到 V2Ray,实现 WebSocket + TLS 传输协议。

首先来科普下这些都是什么

WebSocket

是一种通信协议,可在单个TCP连接上进行全双工通信。WebSocket协议在2011年由IETF标准化为RFC 6455,后由RFC 7936补充规范。Web IDL中的WebSocket API由W3C标准化。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。
WebSocket使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在WebSocket API中,浏览器和服务器只需要完成一次握手,两者之间就可以创建持久性的连接,并进行双向数据传输。

Nginx

是一个高性能的网页服务器,能够反向代理 HTTP、 HTTPS、SMTP、 POP3、 IMAP ,也可以作为一个负载均衡器和 HTTP 缓存。是一个免费的、开源的、高性能的 HTTP 服务器。

TLS(安全传输层协议)

用于在两个通信应用程序之间提供保密性和数据完整性。 该协议由两层组成: TLS记录协议(TLS Record)和TLS 握手协议(TLSHandshake)。

CND的全称是Content Delivery Network

即内容分发网络。 CDN是构建在网络之上的内容分发网络,依靠部署在各地的边缘服务器,通过中心平台的负载均衡、内容分发、调度等功能模块,使用户就近获取所需内容,降低网络拥塞,提高用户访问响应速度和命中率。CDN的关键技术主要有内容存储和分发技术。

CDN技术选择cloudflare会比较方便;

cloudflare 是一家国外的 CDN 加速服务商,还是很有名气的。提供免费和付费的加速和网站保护服务。以前推荐过的百度云加速的国外节点就是和 cloudflare 合作使用的 cloudflare 的节点。
cloudflare 提供了不同类型的套餐,即使是免费用户,cloudflare 提供的功能也是很全面的。
对于访客来自于国外的网站很不错;对于访客来自于国内的网站加速效果有限,有些甚至会变慢,不过其安全防护功能也很不错。
前期工作:首先要有一台正常运行的nginx服务器,已经注册并解析的域名;
如果都没有,建议先看下

cdn添加网站域名解析

访问官网: www.cloudflare.com
使用邮箱注册,注册完后自动进入添加网站界面。
添加网站分为四步:添加网站域名、添加DNS记录、选择方案、更新域名服务器。
域名状态为活动的
操作好上述步骤后,官方会给你个提示,让你修改域名的DNS服务器, 这个时候就到自己申请域名的域名控制台,不知道自己是哪里注册的话https://whois.aliyun.com/ 可以在这里看到注册商。
我用的是阿里云的,直接在域名>管理>DNS修改,修改成入下图;完成后大概24小时生效。

回到

看到上面DNS服务器修改已经是生效了
点击DNS可以看到域名的解析和域名服务器以及在status修改dns and http proxy;
所有扫描到的 DNS 记录。黄色云朵表示该解析通过 CDN 访问,灰色云朵表示不通过 CDN 访问,点击云朵可以切换状态。
这里建议全部调为黄色云朵走 CDN 访问,隐藏网站真实 IP 地址。全站通过 CDN 访问可以有效防止网站真实IP泄漏,保护原站安全。
记录简单的话可以直接按默认条目;如果没有扫描出来原记录或要手动添加,建议至少添加 @ 和 www 两条指向原网站 IP 的 A 记录,TTL 默认。

下面是SSL和域名重定向的设置,添加规则


nginx配置https可以参考这里

http://note.youdao.com/noteshare?id=756b11ddae89e3444513a9b7b3bbfa1c&sub=E5A14BBC81B64241BE2BAEC6720380E4

并将http重定向为https ,nginx配置TLS ;   输入   whereis nginx   # 根据你自己实际的安装目录 编辑nginx.conf配置文件

vi /usr/local/nginx/nginx.conf
server {
listen 80;
server_name www.xxx.com;   #你的域名
return 301 https://$server_name$request_uri;
}
server {
listen 443;
server_name www.xxx.com xxx.com;  #你的域名
ssl on;
root html;
index index.html index.htm;
ssl_certificate cert/www.itercat.com.pem; #你的证书路径,我这个是放在/usr/local/nginx/conf/cert
ssl_certificate_key cert/www.itercat.com.key;#你的证书路径
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
location /ws { # 与 V2Ray 配置中的 path 保持一致
proxy_redirect off;
proxy_pass http://127.0.0.1:12345;#假设WebSocket监听在环回地址的12345端口上
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
}
}

v2ray配置文件参考

vi /etc/v2ray/config.json
{
  "inbounds": [
    {
      "port": 12345,
      "listen":"127.0.0.1",//只监听 127.0.0.1,避免除本机外的机器探测到开放了 12345 端口
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "bc1xxxxs-67b7-186e-0487-e5234dff",
            "alterId": 64
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "wsSettings": {
        "path": "/ws"
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {}
    }
  ]
}
都配置完成之后可以测试下ping域名看看是不是ping不到真实的服务器ip了。如果是的话就是成功配置好了cdn了,再配置下客户端之后,v2ray能否正常翻墙了呢

客户端配置参考 注意端口是443,不是12345了

另外网站如果需要解析 php ,建议nginx.conf的php部分配置如下:

          location ~ \.php$
          {
              include fastcgi_params;
              fastcgi_pass unix:/tmp/php-fcgi.sock;
#指定 php-fpm 服务的监听端口或监听 sock,可以写成"fastcgi_pass 127.0.0.1:9000;"
              fastcgi_index index.php;
              fastcgi_param HTTPS on; #这句是关键,没有的话php页面 重定向是没办法重定向到https上的
              fastcgi_param SCRIPT_FILENAME /usr/local/nginx/html$fastcgi_script_name; #这是自己网站目录的路径
          }   

 


公交车司机终于在众人的指责中将座位让给了老太太