nginx 代理websocket(V2Ray使用Nginx实现WebSocket+TLS+Web代理)

由于近期TCP阻断频繁,于是部署基于WebSocket+TLS+Web的v2ray,将代理流量通过TLS加密,以此达到通过V2Ray访问任何网络都显示访问一个HTTPS网站,隐蔽性更高,也更安全。当然,这本来就是完整、真正的TLS流量。另外,这种TLS代理在速度或者说效率上对比TCP并没有什么优势,大家酌情部署!

申请域名和填写DNS记录

首先你要注册一个免费域名,这个可以到Freenom上免费搞一个,不多讲。

域名注册好后,需要添加两条DNS记录,建议使用Cloudflare的DNS解析,如果IP被墙可以使用它的CDN复活,没被墙就不建议使用了,毕竟减速CDN不是白叫的。添加两条DNS解析记录,如果没有v6IP的话,就填一个v4IP,如下:

Name (prefix)TypeTTLTarget
A3600这里填写vps上的v4IP
AAAA3600这里填写vps上的v6IP

上面完成后,就开始服务端的配置了。

服务端配置Nginx

安装Nginx

apt-get install nginx

配置Nginx的Server文件

vi /etc/nginx/sites-available/default

修改配置如下:

server {
    listen 80;
    listen [::]:80; //这是IPv4和IPv6的80端口监听
    server_name xxxx.com; //域名
    // 下面是真正的ws转发给v2ray
    location /ray {   //与V2Ray配置中的path保持一致
        proxy_redirect off;
        proxy_pass http://127.0.0.1:10086; //假设WebSocket监听在环回地址的10086端口上
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        }
}

server {
    listen 443 ssl http2;  //这是IPv4和IPv6的443端口监听及ssl和http2支持
    listen [::]:443 ssl http2;      
    server_name xxxx.com;   //域名
    ssl_certificate /etc/letsencrypt/live/xxxx.com/fullchain.pem;  //证书路径,xxxx.xxx改成你的域名
    ssl_certificate_key /etc/letsencrypt/live/xxxx.com/privkey.pem;
    location /ray {     // path路径
        proxy_redirect off;
        proxy_pass http://127.0.0.1:10086;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        // 下面是realip日志,在access.log里面,可留可删除,随意
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
}

对于已经用nginx搭建网站的用户,就更简单了,只要在443端口下添加以下ws转发就好了。

// 下面是真正的ws转发给v2ray
location /ray {   //与V2Ray配置中的path保持一致
    proxy_redirect off;
    proxy_pass http://127.0.0.1:10086; //假设WebSocket监听在环回地址的10086端口上
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    }

下面是nginx.conf完整配置实例,注意修改域名和证书文件夹名。

vi /etc/nginx/nignx.conf

user nginx;
pid /run/nginx.pid;
worker_processes auto;
worker_rlimit_nofile 51200;

events {
    worker_connections 1024;
    multi_accept on;
    use epoll;
}

http {
    server_tokens off;
    sendfile on;
    tcp_nopush on;
    tcp_nodelay on;
    keepalive_timeout 120s;
    keepalive_requests 10000;
    types_hash_max_size 2048;
    include /etc/nginx/mime.types;

    access_log off;
    error_log /dev/null;

    server {
        listen 80;
        listen [::]:80;
        server_name xxxx.com;

        location /ray {
            proxy_redirect off;
            proxy_pass http://127.0.0.1:10086;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $http_host;
        }
    }

    server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;      
        server_name xxxx.com;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
        ssl_prefer_server_ciphers on;
        ssl_certificate /etc/letsencrypt/live/xxxx.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/xxxx.com/privkey.pem;
        location /ray {
            proxy_redirect off;
            proxy_pass http://127.0.0.1:10086;
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
            proxy_set_header Host $http_host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        }
    }
}

如果你只用80端口的话是没必要去申请证书的,配置好v2ray的config.json文件就可以直接用的,当然这就只能是ws代理,不支持tls加密了。443端口需要申请ssl证书,往下看。

申请免费SSL证书

安装certbot

apt install certbot

注: 生成证书前请关闭服务器的Apache或Nginx,否则会生成失败。

certbot certonly --standalone --email 你的邮箱 -d xxxx.com(域名) -d www.xxxx.com

在完成Let’s Encrypt证书的生成之后,我们会在/etc/letsencrypt/live/xxxx.com/域名目录下有4个文件就是生成的密钥证书文件。

cert.pem -  used for OCSP stapling in Nginx >=1.3.7.

chain.pem - will break many server configurations, and should not be used without reading further documentation 

fullchain.pem - 在大多数服务器软件中使用的证书文件。

privkey.pem - 证书私钥

在Nginx环境下,那就需要用到fullchain.pemprivkey.pem两个证书文件,在部署Nginx的时候只要将对应的ssl_certificatessl_certificate_key路径设置成生成的2个文件就可以。

打开/etc/nginx/sites-available/default填入如下内容:(上面的nginx的配置文件已经添加进去了)

ssl_certificate /etc/letsencrypt/live/xxxx.com/fullchain.pem; //xxxx.com是你的域名
ssl_certificate_key /etc/letsencrypt/live/xxxx.com/privkey.pem;

Let’s Encrypt免费SSL证书有效期为90天, 需要我们自己手工更新续期才可以,手工续期如下命令:

systemctl stop nginx

certbot certonly --renew-by-default --email 你的邮箱 -d xxxx.xxx -d www.xxx.com

systemctl start nginx

看到这里是不是发现,俺在搭建一个完整的https网站,不错,到这一步你只要写一个html静态页面放在根目录下,这个站点就可以通过浏览器正常访问了。闲话不多说,往下看。

V2Ray服务端配置

证书申请好了以后,配置好nginx后,就要安装v2ray和修改服务端的配置文件了。

安装v2ray:

// 下载脚本
$ wget https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh 

// 安装v2ray
$ bash install-release.sh

修改v2ray配置如下:

vi /usr/local/etc/v2ray/config.json

{
  "inbounds": [
    {
      "port": 10086,    //同nginx上的环回地址端口保持一致
      "listen":"127.0.0.1", //只监听 127.0.0.1,避免除本机外的机器探测到开放了 10086 端口
      "protocol": "vmess",
      "settings": {
        "clients": [
          {
            "id": "b831381d-6324-4d53-ad4f-8cda48b30811",
            "alterId": 64
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "wsSettings": {
        "path": "/ray"  //同nginx上的路径一致
        }
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "freedom",
      "settings": {
        "domainStrategy": "UseIP"
      }
    }
  ],
  "dns": {    //开启DoH
      "servers": [
          "https+local://1.1.1.1/dns-query",
          "1.1.1.1",
          "8.8.8.8",
          "localhost"
      ]
  }
}

systemctl start nginx //启动nginx

systemctl start v2ray //启动v2ray

bash install-release.sh //更新v2ray

bash install-release.sh --remove //移除v2ray

到此就可以开启Nginx和V2Ray了,服务端也就全部完成,下面就是折腾客户端了。另,这些配置文件建议先在本地修改好后再scp到服务端,因为服务端上的vi编写js文件容易遇到缩进问题。

V2Ray客户端设置

首先从V2Ray官网下载软件。

客户端config.json文件配置:

{
  "inbounds": [
    {
      "port": 1080,
      "listen": "127.0.0.1",
      "protocol": "socks",
      "sniffing": {
        "enabled": true,
        "destOverride": ["http", "tls"]
      },
      "settings": {
        "auth": "noauth",
        "udp": false
      }
    }
  ],
  "outbounds": [
    {
      "protocol": "vmess",
      "settings": {
        "vnext": [
          {
            "address": "xxxx.xxx",  //域名
            "port": 443,
            "users": [
              {
                "id": "b831381d-6324-4d53-ad4f-8cda48b30811",
                "alterId": 64
              }
            ]
          }
        ]
      },
      "streamSettings": {
        "network": "ws",
        "security": "tls",
        "wsSettings": {
          "path": "/ray"  //路径
        }
      }
    }
  ]
}

客户端白话配置如下,主要就是选择ws传输协议,填上type路径,还有打开tls传输。

80端口配置,不需要打开tls传输,如下:

地址(address) : xxxx.xxx	//这里填写你的域名或IP

端口(port) : 80

用户ID(uuid) : 这里填写你的UUID

额外ID(alterid) : 64

加密方式(security) : auto

传输协议(network) : ws

伪装域名(host) : cloudfront.com //可选项

路径(type) : /ray

443端口配置,443端口需要打开底层tls传输,如下:

地址(address) : xxxx.xxx	//这里填写你的域名或IP

端口(port) : 443

用户ID(uuid) : 这里填写你的UUID

额外ID(alterid) : 64

加密方式(security) : auto

传输协议(network) : ws

伪装域名(host) : cloudfront.com //可选项

路径(type) : /ray

底层传输 :tls

和443端口都可以使用,到这也就全部完成了。有建站经验的网友应该很容易上手。提醒一下,用之前清理一下浏览器缓存。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2303805254@qq.com,本站将立刻删除。

(0)
上一篇 2022-04-18 10:17
下一篇 2022-04-19 10:10

相关推荐

发表回复

登录后才能评论