单端口中转多个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来反代,统计每个端口的流量。