单端口中转多个V2ray连接/单端口多用户思路


单端口中转多个V2ray连接/单端口多用户思路

最近一年多来,国内的nat商家如雨后春笋一样冒了出来,除了进行端口映射以外,这些nat还有一个主要的用途就是用来中转国际流量,加快大家访问海外资源以及翻墙的速度。但是有时候商家出售的nat只提供十个甚至更少的公网端口,或者有些人不想花太多钱去专门购买一台nat,而是直接选择和别人合租,花十来块钱买一个公网端口的使用权,这时候往往会面临一个尴尬的情况 如果nat提供的端口数量少于自己需要中转的服务器的数量怎么办? , 或者你想这台nat除了中转代理之外还能用作提供frp等端口映射服务,那端口自然也要节约着用,有这些需求的可以看看这篇文章。 注意如果是“合租”端口的话,这种方法仅仅适用于你能拿到服务器权限或者是docker,如果是他人帮忙设置中转,那就没办法了

本教程仅针对于ubuntu中转V2ray的Websocket来说,其他的传输协议以及系统请自行修改

安装nginx并配置ssl证书

本文使用nat上的nginx来反代需要中转的目的服务器的端口,由于我需要中转的是websocket+tls的流量,所以是没办法直接使用nginx的80端口传输流量的,所以我们需要先配置ssl证书,有两个方案:

自签名证书

(因为中转之前数据只是在国内传输的,用自签名证书也不会出什么问题)

详情查看廖雪峰的博客,使用他的脚本

apt install nginx
wget https://raw.githubusercontent.com/michaelliao/itranswarp.js/master/conf/ssl/gencert.sh
bash gencert.sh

执行完脚本后,当前文件夹会生成两个文件,把他们移动到/etc/nginx/ssl中(没有文件夹的话新建就好了)

Copy potato.com.crt to /etc/nginx/ssl/potato.com.crt
Copy potato.com.key to /etc/nginx/ssl/potato.com.key

之后编辑nginx站点配置文件 /etc/nginx/sites-available/default,新增一个服务器记录如下图,端口可以直接选nat的公网端口。

server {
    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;
    server_name potatoserver.com; # managed by Certbot

    listen 444 ssl;
    ssl_certificate     /etc/nginx/ssl/potatoserver.com.crt;
    ssl_certificate_key /etc/nginx/ssl/potatoserver.com.key;
}

然后使用systemctl restart nginx重启nginx,再访问我们刚才设置的端口就可以了,因为是自签名证书,显示不安全也是正常的了。

使用certbot自动配置证书

在使用自签名证书之前,我采取的是另一种方法,不过现在看来这种方法比较麻烦,就不细说了。大概思路就是,使用certbot,自动配置证书,不过由于nat基本不可能给你分配公网的80/443端口,所以直接这样做是行不通的,我采取的方案是,先把国外的服务器上的web服务器停用,空出80/443端口,再使用frp将nat的本地端口映射到国外的服务器的80/443端口,并将域名解析到国外服务器的ip上,然后在nat上运行certbot,这样就可以间接利用国外服务器的端口来实现自动配置证书了。

配置nginx反代

通过nat的ip:公网端口,我们已经可以访问刚才配置好的nginx了,然后我们需要设置nginx反代。此例中,我们需要中转的国外代理服务器上的v2ray已经经过了一次反向代理了(当然没有反代直接暴露端口也是可以的)。假设我们有三个代理服务器,他们都使用443端口的nginx反代,反代url为/fanqiang 如传输协议是websocket时,访问example.com/fanqiang会出现Bad Request的提示(因为是websocket)

三台服务器的域名分别为

  • fq1.example.com
  • fq2.example.com
  • fq3.example.com

则我们配置default中的server如下,在之前那个端口为444的server的大括号中添加

    location /fq1 {
     proxy_pass https://fq1.example.com/fanqiang;
     proxy_redirect default;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;

}

    location /fq2 {
        proxy_pass https://fq2.example.com/fanqiang;
        proxy_redirect default;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
}

    location /fq3 {
     proxy_pass https://fq3.example.com/fanqiang;
     proxy_redirect default;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
    }

配置好后,systemctl restart nginx,再试试访问https://natip:444/fq1,出现Bad Request就算成功了。之后即可使用单端口来中转多个服务器了。客户端设置以V2rayn为例,地址填写nat的ip,端口填写暴露在公网的nginx的端口,然后路径(path)要改成/fq1这样的形式而不是之前的/fanqiang了。另外注意,使用中转服务器中转websocket的时候需要填写host,host应为你的目标服务器的域名如 fq2.example.com 手动修改config.json的话需要把tlsSettings的serverName 以及wsSetting的host都改成目标服务器的域名

自用的话还有个小窍门,比如设置一样的uuid以及url,这样只需要修改v2ray的路径(指客户端的/fq1 /fq2这样的路径)即可快速切换。

多用户的想法

虽然v2ray一开始设计的时候没怎么考虑到单端口多用户的情况,但是使用反代的话可以使用多个url来区分不同的用户既可以开多个url然后统计nginx不同url的流量传输情况,也可以开多个代理端口,用多个url来反代,统计每个端口的流量。


文章作者: HavocW
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 HavocW !
评论
  目录