0x00 背景

前两天搭建了个sspanel,后端主要使用v2ray-poseidon。之前没用面板的时候,一直是使用中转节点,安装nginx来反代节点,nginx 反代节点的教程前天也发出来了,大家有兴趣也可以看看。但是那篇文章只写道了如何反代节点,而没有提到如何将这种方式与sspanle搭配使用。

之前使用nginx反代节点的过程中,在sspanel遇到的问题主要是:在sspanel新建这个中转节点后,面板中总是显示灰色不可用状态,尽管将配置导入v2ray客户端是可用的。

这个问题困扰了我很久,今天突然就想通了,造成这个问题的主要原因是:面板的节点ID与这个落地节点的ID不匹配,因为落地节点也作为一个独立的节点导入到了面板中,而节点ID又是自增的无法重复设置,所以就会产生这样的问题。

0x01 解决过程

今天突然发现poseidon的教程中,有服务端多开v2ray的教程,于是我想,那我在这个节点开多一个v2ray实例就行啦!

1. 使用docker多开v2ray实例用于中转节点连接

1)复制目录

cd /root/v2ray-poseidon/docker/sspanel
cp -a ws-tls ws-tls-2
cd ws-tls-2

2)修改config.json
配置nodeId为面板中新建的中转节点ID,然后将acceptProxyProtocol 选项值改为 true。

3) 修改docker-compose.yml
container_name:v2ray-ws-tls-2 ports 下面的端口改成其它端口,不然会和原 v2ray-poseidon 出现端口冲突

4) 启动
dc up -d

2. 中转节点配置

1)安装 HAProxy
yum -y install haproxy

2)修改HAProxy 配置文件
清空默认配置

echo '' > /etc/haproxy/haproxy.cfg

举例,现在我有个中转分配的端口为 20001,需要转发 v2ray.poseidon-gfw.cc

frontend sg1_frontend
  bind *:20001
  default_backend sg1_server

backend sg1_server
  server s1 sg1-test-trojanp.poseidon-gfw.cc:443 send-proxy

如果需要中转多个落地机,可以复制上面的内容,比如

# 这是第一个
frontend sg1_frontend
  bind *:20001
  default_backend sg1_server

backend sg1_server
  server s1 sg1-test-trojanp.poseidon-gfw.cc:443 send-proxy

# 这里是第二个
frontend jp1_frontend(这个是可以随便改的,每个中转端口一个名字,别重就行)
  bind *:20002
  default_backend jp1_server(这里必须为落地的名字, backend 后面的内容)

backend jp1_server(此处为落地的名字,可以随便改,每个落地一个名字,别重就行)
  server s1 jp1-test-trojanp.poseidon-gfw.cc:443 send-proxy

# ... ... 还可以有更多

3)重启 HAProxy

systemctl restart haproxy

3. sspanel面板配置

由于我是ws + tls,所以面板中的节点地址配置如下:

落地机器ip或域名;落地机器端口;alterid;tls;ws;path=/|server=中转机器ip或域名|outside_port=中转机器端口

下面给出其他方案的节点地址配置:

// TCP 示例,请注意后面有两个分号
非CDN域名或者ip;非0;2;tcp;;

// WS
非CDN域名或者ip;8080;2;ws;;path=/v2ray|host=这里可以用加了CDN的域名

// WS + TLS (自动配置)
非CDN域名或者ip;非0;2;tls;ws;path=/v2ray|host=tls的域名|inside_port=10550

// WS + TLS (Caddy 提供)
非CDN域名或者ip;0;2;tls;ws;path=/v2ray|host=tls的域名|inside_port=10550|outside_port=443


// nat鸡 ws
非CDN域名或者ip;非0;2;ws;;path=/v2ray|host=这里可以用加了CDN的域名

// nat鸡 ws + tls (自动配置),因为部分商家并不提供 80 & 443 访问,所以请考虑手动申请 SSL 证书
非CDN域名或者ip;非0;2;tls;ws;path=/v2ray|host=tls的域名

// nat鸡 ws + tls (Caddy 提供),因为部分商家并不提供 80 & 443 访问,所以请考虑手动申请 SSL 证书
非CDN域名或者ip;0;2;tls;ws;path=/v2ray|host=tls的域名|inside_port=10550|outside_port=11120


// 以下为 KCP 示例部分,支持所有 V2Ray 的 type:

// none: 默认值,不进行伪装,发送的数据是没有特征的数据包。
非CDN域名或者ip;非0;2;kcp;noop;

// srtp: 伪装成 SRTP 数据包,会被识别为视频通话数据(如 FaceTime)。
非CDN域名或者ip;非0;2;kcp;srtp;

// utp: 伪装成 uTP 数据包,会被识别为 BT 下载数据。
非CDN域名或者ip;非0;2;kcp;utp;

// wechat-video: 伪装成微信视频通话的数据包。
非CDN域名或者ip;非0;2;kcp;wechat-video;

// dtls: 伪装成 DTLS 1.2 数据包。
非CDN域名或者ip;非0;2;kcp;dtls;

// wireguard: 伪装成 WireGuard 数据包(并不是真正的 WireGuard 协议) 。
非CDN域名或者ip;非0;2;kcp;wireguard;

0x02 结语

至此,sspanel的中转节点配置就完成了,其中HAProxy换成nginx的效果应该是一样的,我还没尝试,有兴趣的朋友可以试一下。