From 70c48f11a3d037eb924de68fe0b694f4783c7db6 Mon Sep 17 00:00:00 2001 From: zeaslity Date: Fri, 10 Feb 2023 15:56:15 +0800 Subject: [PATCH] =?UTF-8?q?[=20server=20]=20[=20xray=20]=20-=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90Xray=E5=9F=BA=E7=A1=80Bean=E6=A8=A1=E6=9D=BF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- agent/all-agent-hosts.txt | 35 ++++++ .../config/InboundVmessHTTPTemplate.java | 36 +++++++ .../config/OutboundVmessHTTPTemplate.java | 34 ++++++ .../beans/config/TcpHttpHeaderTemplate.java | 86 +++++++++++++++ .../io/wdd/func/xray/beans/node/Edge.java | 4 + .../io/wdd/func/xray/beans/node/EdgeSet.java | 82 ++++++++++++++ .../io/wdd/func/xray/beans/node/Graph.java | 22 +--- .../wdd/func/xray/beans/node/ProxyNode.java | 5 +- .../func/xray/beans/xray/OutboundObject.java | 29 ----- .../func/xray/beans/xray/TransportObject.java | 46 -------- .../wdd/func/xray/beans/xray/XrayConfig.java | 4 +- .../xray/protocol/inbound/DokodemoDoor.java | 2 +- .../xray/protocol/inbound/vless/VLESS.java | 2 +- .../xray/protocol/inbound/vmess/VMESS.java | 2 +- .../outbound/OutboundConfigurationObject.java | 35 ++++++ .../beans/xray/protocol/outbound/VMESS.java | 1 + .../xray/transport/HTTPRequestObject.java | 39 +++++++ .../xray/transport/HTTPResponseObject.java | 36 +++++++ .../xray/transport/HttpHeaderObject.java | 13 +++ .../xray/{ => transport}/InboundObject.java | 2 +- .../beans/xray/transport/OutboundObject.java | 40 +++++++ .../{ => transport}/StreamSettingsObject.java | 6 +- .../xray/beans/xray/transport/TcpObject.java | 15 +++ .../beans/xray/transport/TransportObject.java | 69 ++++++++++++ .../java/io/wdd/func/xray/result/simple.json | 3 + .../func/xray/service/XrayCoreService.java | 8 ++ .../xray/service/XrayCoreServiceImpl.java | 100 +++++++++++++++++- 27 files changed, 651 insertions(+), 105 deletions(-) create mode 100644 agent/all-agent-hosts.txt create mode 100644 server/src/main/java/io/wdd/func/xray/beans/config/InboundVmessHTTPTemplate.java create mode 100644 server/src/main/java/io/wdd/func/xray/beans/config/OutboundVmessHTTPTemplate.java create mode 100644 server/src/main/java/io/wdd/func/xray/beans/config/TcpHttpHeaderTemplate.java create mode 100644 server/src/main/java/io/wdd/func/xray/beans/node/EdgeSet.java delete mode 100644 server/src/main/java/io/wdd/func/xray/beans/xray/OutboundObject.java delete mode 100644 server/src/main/java/io/wdd/func/xray/beans/xray/TransportObject.java create mode 100644 server/src/main/java/io/wdd/func/xray/beans/xray/transport/HTTPRequestObject.java create mode 100644 server/src/main/java/io/wdd/func/xray/beans/xray/transport/HTTPResponseObject.java create mode 100644 server/src/main/java/io/wdd/func/xray/beans/xray/transport/HttpHeaderObject.java rename server/src/main/java/io/wdd/func/xray/beans/xray/{ => transport}/InboundObject.java (95%) create mode 100644 server/src/main/java/io/wdd/func/xray/beans/xray/transport/OutboundObject.java rename server/src/main/java/io/wdd/func/xray/beans/xray/{ => transport}/StreamSettingsObject.java (90%) create mode 100644 server/src/main/java/io/wdd/func/xray/beans/xray/transport/TcpObject.java create mode 100644 server/src/main/java/io/wdd/func/xray/beans/xray/transport/TransportObject.java create mode 100644 server/src/main/java/io/wdd/func/xray/result/simple.json diff --git a/agent/all-agent-hosts.txt b/agent/all-agent-hosts.txt new file mode 100644 index 0000000..09dba56 --- /dev/null +++ b/agent/all-agent-hosts.txt @@ -0,0 +1,35 @@ +146.56.147.12 Seoul-arm64-01 + +146.56.159.175 Seoul-arm64-02 + +140.238.8.73 Seoul-amd64-01 seoul-1 s1 + +140.238.30.110 Seoul-amd64-02 seoul-2 s2 + +140.238.29.102 Seoul-amd64-03 seoul-3 s3 + +140.238.14.103 Seoul-amd64-04 seoul-4 s4 + +150.230.198.103 Tokyo-arm64-01 tokyo-0 t0 + +140.238.63.37 Tokyo-amd64-01 tokyo-1 t1 + +140.238.52.228 Tokyo-amd64-02 tokyo-2 t2 + +42.192.52.227 Shanghai-amd64-01 tc-sh + +43.154.83.213 Hongkong-amd64-01 tc-hk + +43.136.177.228 Chengdu-amd64-01 tc-cd + +129.146.171.163 Phoenix-amd64-02 phoenix-2 p2 + +129.146.65.80 Phoenix-arm64-01 phoenix-3 p3 + +129.146.57.94 Phoenix-arm64-02 phoenix-4 p4 + +141.147.99.91 London-amd64-01 london-1 l1 + +141.147.106.62 London-amd64-02 london-2 l2 + +132.145.28.48 London-arm64-02 london-4 l4 \ No newline at end of file diff --git a/server/src/main/java/io/wdd/func/xray/beans/config/InboundVmessHTTPTemplate.java b/server/src/main/java/io/wdd/func/xray/beans/config/InboundVmessHTTPTemplate.java new file mode 100644 index 0000000..5051fbf --- /dev/null +++ b/server/src/main/java/io/wdd/func/xray/beans/config/InboundVmessHTTPTemplate.java @@ -0,0 +1,36 @@ +package io.wdd.func.xray.beans.config; + +import io.wdd.func.xray.beans.xray.transport.HttpHeaderObject; +import io.wdd.func.xray.beans.xray.transport.InboundObject; +import io.wdd.func.xray.beans.xray.transport.StreamSettingsObject; +import io.wdd.func.xray.beans.xray.transport.TcpObject; +import io.wdd.func.xray.beans.xray.protocol.inbound.vmess.VMESS; + +import static io.wdd.func.xray.beans.config.TcpHttpHeaderTemplate.HttpRequestTemplate; +import static io.wdd.func.xray.beans.config.TcpHttpHeaderTemplate.HttpResponseTemplate; + +public class InboundVmessHTTPTemplate { + + public static InboundObject InboundTemplate; + + static { + + InboundTemplate = new VMESS(); + + // 构建 settings- vmess-tcp-http的对象 + TcpObject tcpObject = new TcpObject(); + + // 构建RequestHttp属性对象 + HttpHeaderObject httpHeaderObject = new HttpHeaderObject(); + httpHeaderObject.setRequest(HttpRequestTemplate); + httpHeaderObject.setResponse(HttpResponseTemplate); + + tcpObject.setHeader(httpHeaderObject); + + // 设置 settings属性 + StreamSettingsObject streamSettingsObject = new StreamSettingsObject(); + streamSettingsObject.setTcpSettings(tcpObject); + InboundTemplate.setStreamSettings(streamSettingsObject); + + } +} diff --git a/server/src/main/java/io/wdd/func/xray/beans/config/OutboundVmessHTTPTemplate.java b/server/src/main/java/io/wdd/func/xray/beans/config/OutboundVmessHTTPTemplate.java new file mode 100644 index 0000000..836a8f7 --- /dev/null +++ b/server/src/main/java/io/wdd/func/xray/beans/config/OutboundVmessHTTPTemplate.java @@ -0,0 +1,34 @@ +package io.wdd.func.xray.beans.config; + +import io.wdd.func.xray.beans.xray.protocol.outbound.OutboundConfigurationObject; +import io.wdd.func.xray.beans.xray.protocol.outbound.VMESS; +import io.wdd.func.xray.beans.xray.transport.HttpHeaderObject; +import io.wdd.func.xray.beans.xray.transport.OutboundObject; +import io.wdd.func.xray.beans.xray.transport.TcpObject; + +import static io.wdd.func.xray.beans.config.TcpHttpHeaderTemplate.HttpResponseTemplate; + +/** + * outbound 不具备此形式 + */ +@Deprecated +public class OutboundVmessHTTPTemplate { + + + static { + + OutboundConfigurationObject OutboundTemplate = new VMESS(); + + // 构造TCP + TcpObject tcpObject = new TcpObject(); + + + HttpHeaderObject httpHeaderObject = new HttpHeaderObject(); + httpHeaderObject.setResponse(HttpResponseTemplate); + tcpObject.setHeader(httpHeaderObject); + + + + + } +} diff --git a/server/src/main/java/io/wdd/func/xray/beans/config/TcpHttpHeaderTemplate.java b/server/src/main/java/io/wdd/func/xray/beans/config/TcpHttpHeaderTemplate.java new file mode 100644 index 0000000..c772331 --- /dev/null +++ b/server/src/main/java/io/wdd/func/xray/beans/config/TcpHttpHeaderTemplate.java @@ -0,0 +1,86 @@ +package io.wdd.func.xray.beans.config; + +import io.wdd.func.xray.beans.xray.transport.HTTPRequestObject; +import io.wdd.func.xray.beans.xray.transport.HTTPResponseObject; + +import java.util.List; + +public class TcpHttpHeaderTemplate { + + + public static HTTPRequestObject HttpRequestTemplate; + public static HTTPResponseObject HttpResponseTemplate; + + + static { + + List xrayFakeHostName = List.of( + "www.baidu.com", + "www.google.com", + "www.bing.com", + "www.github.com" + ); + + List xrayFakeUserAgent = List.of( + "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36", + "Mozilla/5.0 (iPhone; CPU iPhone OS 10_0_2 like Mac OS X) AppleWebKit/601.1 (KHTML, like Gecko) CriOS/53.0.2785.109 Mobile/14A456 Safari/601.1.46" + ); + + List xrayFakeEncoding = List.of( + "gzip", + "deflate" + ); + + List xrayFakePath = List.of( + "/news/", + "/finance/", + "/sports/", + "weathers" + ); + + + HTTPRequestObject.HeadersDTO reqHeadersDTO = HTTPRequestObject.HeadersDTO + .builder() + .host(xrayFakeHostName) + .userAgent(xrayFakeUserAgent) + .acceptEncoding(xrayFakeEncoding) + .pragma("no-cache") + .connection(List.of("keep-alive")) + .build(); + + HttpRequestTemplate = HTTPRequestObject + .builder() + .version("1.1") + .method("GET") + .path(xrayFakePath) + .headers( + reqHeadersDTO + ) + .build(); + + HTTPResponseObject.HeadersDTO resHeadersDTO = HTTPResponseObject + .HeadersDTO + .builder() + .contentType(List.of( + "application/octet-stream", + "video/mpeg" + )) + .transferEncoding(List.of("chunked")) + .connection(List.of("keep-alive")) + .pragma("no-cache") + .build(); + + HttpResponseTemplate = HTTPResponseObject + .builder() + .version("1.1") + .status("200") + .reason("Accept") + .headers( + resHeadersDTO + ) + .build(); + + } + + +} diff --git a/server/src/main/java/io/wdd/func/xray/beans/node/Edge.java b/server/src/main/java/io/wdd/func/xray/beans/node/Edge.java index 4f967a4..07a4e46 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/node/Edge.java +++ b/server/src/main/java/io/wdd/func/xray/beans/node/Edge.java @@ -1,6 +1,8 @@ package io.wdd.func.xray.beans.node; +import io.swagger.annotations.ApiModel; +import io.swagger.annotations.ApiModelProperty; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -12,10 +14,12 @@ import lombok.experimental.SuperBuilder; @Data @NoArgsConstructor @SuperBuilder(toBuilder = true) +@ApiModel("网络模型中的有向权重边") public class Edge { ProxyNode source, destination; + @ApiModelProperty("权重值, 值的范围在0-100,数字越小表示阻力越小") int weight; Edge(ProxyNode source, ProxyNode destination, int weight) { diff --git a/server/src/main/java/io/wdd/func/xray/beans/node/EdgeSet.java b/server/src/main/java/io/wdd/func/xray/beans/node/EdgeSet.java new file mode 100644 index 0000000..76195e5 --- /dev/null +++ b/server/src/main/java/io/wdd/func/xray/beans/node/EdgeSet.java @@ -0,0 +1,82 @@ +package io.wdd.func.xray.beans.node; + +import static io.wdd.func.xray.beans.node.ProxyNodeSet.*; + +public class EdgeSet { + + + public static Edge chengduToShanghai; + + public static Edge shanghaiToSeoul2; + public static Edge shanghaiToTokyo2; + + public static Edge hongkongToSeoul2; + public static Edge hongkongToTokyo2; + public static Edge hongkongToPhoenix2; + + public static Edge seoul2ToTokyo2; + public static Edge seoul2ToPhoenix2; + public static Edge seoul2ToLondon2; + + public static Edge tokyo2ToPhoenix2; + public static Edge tokyo2ToLondon2; + + /** + * 计算 网络路径中的路径权重 + * 值的范围在0-100,数字越小表示阻力越小 + * 指标 1.延迟 2.丢包率 3.带宽 4.节点稳定性 + */ + public void EdgeWeightCalculate(){ + + + + } + + static { + + chengduToShanghai = new Edge( + chengdu, + shanghai, + 10 + ); + + shanghaiToSeoul2 = new Edge( + shanghai, + seoul2, + 40 + ); + + shanghaiToTokyo2 = new Edge( + shanghai, + tokyo2, + 60 + ); + + seoul2ToTokyo2 = new Edge( + seoul2, + tokyo2, + 10 + ); + tokyo2ToPhoenix2 = new Edge( + tokyo2, + phoenix2, + 30 + ); + tokyo2ToLondon2 = new Edge( + tokyo2, + london2, + 50 + ); + hongkongToTokyo2 = new Edge( + hongkong, + tokyo2, + 40 + ); + hongkongToSeoul2 = new Edge( + hongkong, + seoul2, + 20 + ); + + } +} diff --git a/server/src/main/java/io/wdd/func/xray/beans/node/Graph.java b/server/src/main/java/io/wdd/func/xray/beans/node/Graph.java index 390e6fd..51d13f9 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/node/Graph.java +++ b/server/src/main/java/io/wdd/func/xray/beans/node/Graph.java @@ -107,27 +107,7 @@ class Graph { public static void main(String[] args) { List edgeList = Arrays.asList( - new Edge(chengdu, - shanghai, - 10), - new Edge(shanghai, - seoul2, - 40), - new Edge(seoul2, - tokyo2, - 10), - new Edge(tokyo2, - phoenix2, - 30), - new Edge(tokyo2, - london2, - 50), - new Edge(hongkong, - tokyo2, - 40), - new Edge(hongkong, - seoul2, - 20) + ); Graph graph = new Graph(edgeList); diff --git a/server/src/main/java/io/wdd/func/xray/beans/node/ProxyNode.java b/server/src/main/java/io/wdd/func/xray/beans/node/ProxyNode.java index 170f6b7..61b4d0f 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/node/ProxyNode.java +++ b/server/src/main/java/io/wdd/func/xray/beans/node/ProxyNode.java @@ -11,10 +11,13 @@ import lombok.experimental.SuperBuilder; @SuperBuilder(toBuilder = true) public class ProxyNode { + /** + * 简称,自己使用 + */ String name; /** - * 用于定位在图中的位置 + * 用于定位在图中的 顺序位置 */ int num; diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/OutboundObject.java b/server/src/main/java/io/wdd/func/xray/beans/xray/OutboundObject.java deleted file mode 100644 index 80bdb13..0000000 --- a/server/src/main/java/io/wdd/func/xray/beans/xray/OutboundObject.java +++ /dev/null @@ -1,29 +0,0 @@ -package io.wdd.func.xray.beans.xray; - -import lombok.Data; - -@Data -public class OutboundObject { - - private String sendThrough; - private String protocol; - private Object settings; - private String tag; - private StreamSettingsObject streamSettings; - private ProxySettingsObject proxySettings; - private MuxObject mux; - -} - -@Data -class ProxySettingsObject { - private String tag; -} - -@Data -class MuxObject { - - private Boolean enabled; - private Integer concurrency; - -} \ No newline at end of file diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/TransportObject.java b/server/src/main/java/io/wdd/func/xray/beans/xray/TransportObject.java deleted file mode 100644 index c22d451..0000000 --- a/server/src/main/java/io/wdd/func/xray/beans/xray/TransportObject.java +++ /dev/null @@ -1,46 +0,0 @@ -package io.wdd.func.xray.beans.xray; - -import lombok.Data; - -import java.util.Map; - -@Data -public class TransportObject { - - private TcpObject tcpSettings; - private KcpObject kcpSettings; - private WebSocketObject wsSettings; - private HttpObject httpSettings; - private QuicObject quicSettings; - private DomainSocketObject dsSettings; - -} - -class TcpObject { - -} - -class KcpObject { - -} - -@Data -class WebSocketObject { - - private Boolean acceptProxyProtocol; - private String path; - private Map headers; - -} - -class HttpObject { - -} - -class QuicObject { - -} - -class DomainSocketObject { - -} \ No newline at end of file diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/XrayConfig.java b/server/src/main/java/io/wdd/func/xray/beans/xray/XrayConfig.java index 58904bf..b103c12 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/xray/XrayConfig.java +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/XrayConfig.java @@ -1,7 +1,9 @@ package io.wdd.func.xray.beans.xray; -import io.wdd.func.xray.beans.xray.*; +import io.wdd.func.xray.beans.xray.transport.InboundObject; +import io.wdd.func.xray.beans.xray.transport.OutboundObject; +import io.wdd.func.xray.beans.xray.transport.TransportObject; import java.util.List; diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/inbound/DokodemoDoor.java b/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/inbound/DokodemoDoor.java index 0abe325..2bf4186 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/inbound/DokodemoDoor.java +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/inbound/DokodemoDoor.java @@ -1,6 +1,6 @@ package io.wdd.func.xray.beans.xray.protocol.inbound; -import io.wdd.func.xray.beans.xray.InboundObject; +import io.wdd.func.xray.beans.xray.transport.InboundObject; public class DokodemoDoor extends InboundObject { } diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/inbound/vless/VLESS.java b/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/inbound/vless/VLESS.java index 6f4eb44..8bf0b38 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/inbound/vless/VLESS.java +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/inbound/vless/VLESS.java @@ -1,6 +1,6 @@ package io.wdd.func.xray.beans.xray.protocol.inbound.vless; -import io.wdd.func.xray.beans.xray.InboundObject; +import io.wdd.func.xray.beans.xray.transport.InboundObject; import lombok.Data; @Data diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/inbound/vmess/VMESS.java b/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/inbound/vmess/VMESS.java index 156b3ca..b00cdbd 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/inbound/vmess/VMESS.java +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/inbound/vmess/VMESS.java @@ -1,6 +1,6 @@ package io.wdd.func.xray.beans.xray.protocol.inbound.vmess; -import io.wdd.func.xray.beans.xray.InboundObject; +import io.wdd.func.xray.beans.xray.transport.InboundObject; import lombok.Data; @Data diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/outbound/OutboundConfigurationObject.java b/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/outbound/OutboundConfigurationObject.java index ddbbf86..94a40c2 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/outbound/OutboundConfigurationObject.java +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/outbound/OutboundConfigurationObject.java @@ -1,4 +1,39 @@ package io.wdd.func.xray.beans.xray.protocol.outbound; +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.util.List; + +@NoArgsConstructor +@Data public abstract class OutboundConfigurationObject { + + @JsonProperty("vnext") + private List vnext; + + @NoArgsConstructor + @Data + public static class ServerObject { + @JsonProperty("address") + private String address; + @JsonProperty("port") + private Integer port; + @JsonProperty("users") + private List users; + + @NoArgsConstructor + @Data + public static class UserObject { + @JsonProperty("id") + private String id; + @JsonProperty("alterId") + private Integer alterId; + @JsonProperty("security") + private String security; + @JsonProperty("level") + private Integer level; + } + } } diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/outbound/VMESS.java b/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/outbound/VMESS.java index 3d99bd6..fd271aa 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/outbound/VMESS.java +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/protocol/outbound/VMESS.java @@ -1,5 +1,6 @@ package io.wdd.func.xray.beans.xray.protocol.outbound; +import io.wdd.func.xray.beans.xray.transport.OutboundObject; import lombok.Data; @Data diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/transport/HTTPRequestObject.java b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/HTTPRequestObject.java new file mode 100644 index 0000000..b92bd2b --- /dev/null +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/HTTPRequestObject.java @@ -0,0 +1,39 @@ +package io.wdd.func.xray.beans.xray.transport; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.List; + +@NoArgsConstructor +@Data +@SuperBuilder(toBuilder = true) +public class HTTPRequestObject { + + @JsonProperty(value = "version", defaultValue = "1.1") + private String version; + @JsonProperty(value = "method", defaultValue = "GET") + private String method; + @JsonProperty("path") + private List path; + @JsonProperty("headers") + private HeadersDTO headers; + + @NoArgsConstructor + @Data + @SuperBuilder(toBuilder = true) + public static class HeadersDTO { + @JsonProperty(value = "Host") + private List host; + @JsonProperty("User-Agent") + private List userAgent; + @JsonProperty("Accept-Encoding") + private List acceptEncoding; + @JsonProperty("Connection") + private List connection; + @JsonProperty("Pragma") + private String pragma; + } +} diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/transport/HTTPResponseObject.java b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/HTTPResponseObject.java new file mode 100644 index 0000000..6972c98 --- /dev/null +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/HTTPResponseObject.java @@ -0,0 +1,36 @@ +package io.wdd.func.xray.beans.xray.transport; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.experimental.SuperBuilder; + +import java.util.List; + +@NoArgsConstructor +@Data +@SuperBuilder(toBuilder = true) +public class HTTPResponseObject { + @JsonProperty(value = "version", defaultValue = "1.1") + private String version; + @JsonProperty("status") + private String status; + @JsonProperty("reason") + private String reason; + @JsonProperty("headers") + private HeadersDTO headers; + + @NoArgsConstructor + @Data + @SuperBuilder(toBuilder = true) + public static class HeadersDTO { + @JsonProperty("Content-Type") + private List contentType; + @JsonProperty("Transfer-Encoding") + private List transferEncoding; + @JsonProperty("Connection") + private List connection; + @JsonProperty("Pragma") + private String pragma; + } +} diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/transport/HttpHeaderObject.java b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/HttpHeaderObject.java new file mode 100644 index 0000000..70b998a --- /dev/null +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/HttpHeaderObject.java @@ -0,0 +1,13 @@ +package io.wdd.func.xray.beans.xray.transport; + + +import lombok.Data; + +@Data +public class HttpHeaderObject extends TCPHeaderObject { + + HTTPRequestObject request; + + HTTPResponseObject response; + +} diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/InboundObject.java b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/InboundObject.java similarity index 95% rename from server/src/main/java/io/wdd/func/xray/beans/xray/InboundObject.java rename to server/src/main/java/io/wdd/func/xray/beans/xray/transport/InboundObject.java index 292f6e9..6caee92 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/xray/InboundObject.java +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/InboundObject.java @@ -1,4 +1,4 @@ -package io.wdd.func.xray.beans.xray; +package io.wdd.func.xray.beans.xray.transport; import com.fasterxml.jackson.annotation.JsonSubTypes; import com.fasterxml.jackson.annotation.JsonTypeInfo; diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/transport/OutboundObject.java b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/OutboundObject.java new file mode 100644 index 0000000..cb7bf40 --- /dev/null +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/OutboundObject.java @@ -0,0 +1,40 @@ +package io.wdd.func.xray.beans.xray.transport; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +; +import io.wdd.func.xray.beans.xray.protocol.outbound.OutboundConfigurationObject; +import io.wdd.func.xray.beans.xray.protocol.outbound.VLESS; +import io.wdd.func.xray.beans.xray.protocol.outbound.VMESS; +import lombok.Data; + +@Data +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "protocol") +@JsonSubTypes(value = { + @JsonSubTypes.Type(value = VLESS.class, name = "vless"), + @JsonSubTypes.Type(value = VMESS.class, name = "vmess"), +}) +public class OutboundObject { + + private String sendThrough; + private String protocol; + private OutboundConfigurationObject settings; + private String tag; + private StreamSettingsObject streamSettings; + private ProxySettingsObject proxySettings; + private MuxObject mux; + +} + +@Data +class ProxySettingsObject { + private String tag; +} + +@Data +class MuxObject { + + private Boolean enabled; + private Integer concurrency; + +} \ No newline at end of file diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/StreamSettingsObject.java b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/StreamSettingsObject.java similarity index 90% rename from server/src/main/java/io/wdd/func/xray/beans/xray/StreamSettingsObject.java rename to server/src/main/java/io/wdd/func/xray/beans/xray/transport/StreamSettingsObject.java index 453adc0..dc8b077 100644 --- a/server/src/main/java/io/wdd/func/xray/beans/xray/StreamSettingsObject.java +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/StreamSettingsObject.java @@ -1,18 +1,20 @@ -package io.wdd.func.xray.beans.xray; +package io.wdd.func.xray.beans.xray.transport; import lombok.Data; import java.util.List; @Data -public class StreamSettingsObject extends TransportObject{ +public class StreamSettingsObject extends TransportObject { private String network; private String security; private TLSObject tlsSettings; private XTLSObject xtlsSettings; + private SockoptObject sockopt; + } @Data diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/transport/TcpObject.java b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/TcpObject.java new file mode 100644 index 0000000..4abdcbd --- /dev/null +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/TcpObject.java @@ -0,0 +1,15 @@ +package io.wdd.func.xray.beans.xray.transport; + +import io.wdd.func.xray.beans.xray.transport.TCPHeaderObject; +import lombok.Data; + +/** + * https://www.v2ray.com/chapter_02/transport/tcp.html + */ +@Data +public +class TcpObject { + + TCPHeaderObject header; + +} diff --git a/server/src/main/java/io/wdd/func/xray/beans/xray/transport/TransportObject.java b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/TransportObject.java new file mode 100644 index 0000000..021e694 --- /dev/null +++ b/server/src/main/java/io/wdd/func/xray/beans/xray/transport/TransportObject.java @@ -0,0 +1,69 @@ +package io.wdd.func.xray.beans.xray.transport; + +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; +import lombok.Data; + +import java.util.Map; + +@Data +public class TransportObject { + + private TcpObject tcpSettings; + private KcpObject kcpSettings; + private WebSocketObject wsSettings; + private HttpObject httpSettings; + private QuicObject quicSettings; + private DomainSocketObject dsSettings; + +} + + +@Data +@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, property = "type") +@JsonSubTypes(value = { + @JsonSubTypes.Type(value = NoneHeaderObject.class, name = "none"), + @JsonSubTypes.Type(value = HttpHeaderObject.class, name = "http"), +}) +abstract class TCPHeaderObject { + String type; +} + + +class NoneHeaderObject extends TCPHeaderObject{ + +} + + +class KcpObject { + +} + +/** + * https://www.v2ray.com/chapter_02/transport/websocket.html + * 官方参考 + */ +@Data +class WebSocketObject { + + private Boolean acceptProxyProtocol; + private String path; + private Map headers; + +} + +/** + * + */ +@Data +class HttpObject { + +} + +class QuicObject { + +} + +class DomainSocketObject { + +} \ No newline at end of file diff --git a/server/src/main/java/io/wdd/func/xray/result/simple.json b/server/src/main/java/io/wdd/func/xray/result/simple.json new file mode 100644 index 0000000..0e0dcd2 --- /dev/null +++ b/server/src/main/java/io/wdd/func/xray/result/simple.json @@ -0,0 +1,3 @@ +{ + +} \ No newline at end of file diff --git a/server/src/main/java/io/wdd/func/xray/service/XrayCoreService.java b/server/src/main/java/io/wdd/func/xray/service/XrayCoreService.java index 73d6200..8f5b12a 100644 --- a/server/src/main/java/io/wdd/func/xray/service/XrayCoreService.java +++ b/server/src/main/java/io/wdd/func/xray/service/XrayCoreService.java @@ -1,4 +1,12 @@ package io.wdd.func.xray.service; +import io.wdd.func.xray.beans.node.ProxyNode; + +import java.util.ArrayList; +import java.util.LinkedList; + public interface XrayCoreService { + + void generateXrayJsonFromNodeList(ArrayList> allNetworkPathList); + } diff --git a/server/src/main/java/io/wdd/func/xray/service/XrayCoreServiceImpl.java b/server/src/main/java/io/wdd/func/xray/service/XrayCoreServiceImpl.java index 7870e93..3297386 100644 --- a/server/src/main/java/io/wdd/func/xray/service/XrayCoreServiceImpl.java +++ b/server/src/main/java/io/wdd/func/xray/service/XrayCoreServiceImpl.java @@ -1,6 +1,104 @@ package io.wdd.func.xray.service; -public class XrayCoreServiceImpl implements XrayCoreService{ +import io.wdd.func.xray.beans.node.ProxyNode; +import io.wdd.func.xray.beans.xray.XrayConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.stereotype.Service; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; + +import static io.wdd.func.xray.beans.node.ProxyNodeSet.*; + +@Service +@Slf4j +public class XrayCoreServiceImpl implements XrayCoreService { + @Override + public void generateXrayJsonFromNodeList(ArrayList> allNetworkPathList) { + + + allNetworkPathList = new ArrayList<>(); + + ArrayList pathA = new ArrayList<>( + Arrays.asList( + shanghai, + seoul2, + tokyo2, + phoenix2 + ) + ); + + ArrayList pathB = new ArrayList<>( + Arrays.asList( + shanghai, + seoul2, + london2 + ) + ); + + ArrayList pathC = new ArrayList<>( + Arrays.asList( + seoul2, + phoenix2 + ) + ); + + allNetworkPathList.add(pathA); + allNetworkPathList.add(pathB); + allNetworkPathList.add(pathC); + + + // 需要根据所有的交叉链路进行计算 + // A -> B -> C -> D + // B -> D + // A -> B -> F + // B点需要具有 4对inbound和outbound对 + // C点需要具有 2对inbound和outbound对 + + + // 解析所有的Node对 + + // 返回每一条的结果至于 Map中 key => shanghai->seoul2->tokyo2 + // value => xray配置信息 + HashMap interfaceMap = new HashMap<>(); + + // 最终Xray Json配置应该放置于 Map中 key => ProxyNode + // value => Xray Config Json + HashMap resultMap = new HashMap<>(); + + + allNetworkPathList + .stream() + .forEach( + networkPathList -> { + // 每一条每一条的执行,依次添加相应的 in-out 连接 + generateXrayJsonSinglePath( + networkPathList, + interfaceMap, + resultMap + ); + } + ); + + + } + + private void generateXrayJsonSinglePath(ArrayList networkPathList, HashMap interfaceMap, HashMap resultMap) { + int pathLength = networkPathList.size(); + if (pathLength < 2) { + log.error("网络路径节点不能小于2个"); + return; + } + + + // 采用 VMESS + websocket的形式形成 链状代理 + // 由于 Vlss+XTLS的形式形成 链状结构 + + + + + } }