v2ray自带多种传输方式:ws、tls、tcp等,所以直接搭配nginx等web服务实现端口复用,ss/ssr这类不具备此方式的显得力不从心了,需要额外借助gost等隧道工具办到。
web软件有很多,有apache、nginx、haproxy、caddy等,这里选择nginx,优点内存占用小、效率高、配置简单且文档丰富。隧道有gost、vnet等,这里就用gost了,毕竟开源优势。

搭建SS/SSR

这就不用多说,一键脚本满天飞,让我推荐就是秋水大佬的一键脚本了。

wget --no-check-certificate -O shadowsocks.sh https://raw.githubusercontent.com/teddysun/shadowsocks_install/master/shadowsocks.sh
chmod +x shadowsocks.sh
./shadowsocks.sh 2>&1 | tee shadowsocks.log

具体安装方法见本站转载的文章:

安装gost

wget -O gost.gz https://github.com/ginuerzh/gost/releases/download/v2.11.1/gost-linux-amd64-2.11.1.gz
gzip -d gost.gz
mv gost /usr/bin/
chmod +x /usr/bin/gost

不出意外的话gost已经添加到了系统环境中,使用命令 gost -V 就能查看gost的版本号。如果报错我们需要把 /usr/bin 目录添加到系统环境中。

export PATH="$PATH:/usr/bin"

下面举例:本机ip:1.1.1.1,ss/ssr端口10000,隧道使用tls传输方式,gost命令为:

gost -L relay+tls://:20000/127.0.0.1:10000

把它放到后台运行

nohup gost -L relay+tls://:20000/127.0.0.1:10000 > /dev/null 2>&1 &

安装nginx

Ubuntu/Debian系统可以直接安装nginx,安装后nginx自动开机启动并运行,如果此时80端口被占用,安装之后会报错,所以要不占用80端口的服务kill掉。
apt-get install nginx -y

CentOS系统默认安装不了nginx(部分是可以直接安装的,如AWS家的),需要额外添加源。

sudo rpm -Uvh http://nginx.org/packages/centos/7/noarch/RPMS/nginx-release-centos-7-0.el7.ngx.noarch.rpm
yum install nginx -y
service nginx start

配置nginx

Ubuntu/Debian的nginx默认的配置文件在 /etc/nginx/sites-enabled/ 目录下,CentOS的nginx默认配置文件应该在 /etc/nginx/conf.d/ ,我们新建一个虚拟主机配置文件

vi /etc/nginx/sites-enabled/example-00.com.conf
#或者
vi /etc/nginx/conf.d/example-00.com.conf

配置内容可以这么写

server {
    listen 80;
    server_name example-01.com

    location / {
        proxy_pass http://localhost:20000;
    }
}

这里也就看到了,需要域名example-00.com,此域名反代本地20000端口上的服务,20000端口是gost用来转发10000端口上的流量的,所以nginx间接转发了ss/ssr流量。
举一反三,如果ss/ssr端口还开了10001、10002等端口,我们先用gost转发这些端口,对应关系20000对应10000、20001对应10001、20002对应10002…… 然后在 /etc/nginx/sites-enabled/ 目录下复制 example-01.com.conf 配置文件命名为 example-01.com.conf、example-02.com.conf…… 每个配置文件内容为

server_name example-01.com.conf;
proxy_pass http://localhost:20001;

server_name example-02.com.conf;
proxy_pass http://localhost:20002;

……

其实借助stream可以把所有配置文件写在一起,但我并不喜欢这样,分开能更好便于管理修改。每当修改配置文件需要重启nginx使其生效。

nginx -t #检测配置文件是否正确
server nginx restart

中转机搭配gost

我们还需要安装了gost的中转机来搭配落地机,中转机命令为

gost -L :20000 -F relay+tls://example-00.com:80
gost -L :20001 -F relay+tls://example-01.com:80
gost -L :20002 -F relay+tls://example-02.com:80
……

这样就成了。访问不同域名的80端口,流量转向的是域名对应的ss/ssr端口。

转发ws

ws是http的下一代,nginx转发ws需要添加几行东西。

server {
    listen 80;
    server_name example-01.com

    location / {
        proxy_pass http://localhost:20000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

gost命令为:

#落地端
gost -L relay+ws://:20000/127.0.0.1:10000
#中转端
gost -L :20000 -F relay+ws://example-00.com:80

转发ws+tls

端口复用的最大动机就是利用443端口伪造一个正常的网站,那么gost要在ws上再加tls加密,所以gost命令改为:

#落地端
gost -L relay+wss://:20000/127.0.0.1:10000
#中转端
gost -L :20000 -F relay+wss://example-00.com:443

涉及到tls那么我们要一个https证书,域名证书申请推荐Let's Encrypt,完全免费信任度高且申请简便,最重要是支持泛域名,端口复用只要用多个子域名同一个证书就行。

nginx配置文件修改为:

server {
    listen 443;
    server_name example-01.com
    
    ssl_certificate  cert/fullchain.cer;// 改成你的证书的名字
    ssl_certificate_key cert/exmaple-01.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 / {
        proxy_pass http://localhost:20000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

v2ray端口复用

v2ray可以自己实现ws传输,并配置https证书实现tls加密,就无需借助gost隧道了。所以同样的ws+tls,v2ray的nginx配置简单为:

server {
    listen 443;
    server_name example-01.com

    location / {
        proxy_pass http://localhost:20000;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
    }
}

v2ray还有个好处就是不需要中转机。

搭配CDN

cloudflare、cloudfront(aws)、百度云、腾讯云等等只要支持ws的cdn都是可以用来转发的,cdn不仅可以用来转发v2ray流量,还可以转发gost流量,所以ss/ssr这类也是可以踩上cdn的“东风”的。

如何使用cdn?简单的说就是本来域名解析到的是落地机,现在我们把域名解析到cdn,cdn帮我们连到落地机,仅此而已。具体参考:

Last modification:December 24th, 2020 at 11:59 pm
如果觉得我的文章对你有用,请随意赞赏