1
0
Эх сурвалжийг харах

Transparent Proxy with sockopt Stream Setting

Co-Authored-By: Alireza Ahmadi <[email protected]>
MHSanaei 1 жил өмнө
parent
commit
fe22cbd0e5

+ 16 - 13
web/assets/js/model/xray.js

@@ -803,22 +803,27 @@ RealityStreamSettings.Settings = class extends XrayCommonClass {
 };
 
 class SockoptStreamSettings extends XrayCommonClass {
-    constructor(
-        acceptProxyProtocol = false,
-    ) {
+    constructor(acceptProxyProtocol = false, tcpFastOpen = false, mark = 0, tproxy="off") {
         super();
         this.acceptProxyProtocol = acceptProxyProtocol;
+        this.tcpFastOpen = tcpFastOpen;
+        this.mark = mark;
+        this.tproxy = tproxy;
     }
-
     static fromJson(json = {}) {
         return new SockoptStreamSettings(
             json.acceptProxyProtocol,
+            json.tcpFastOpen,
+            json.mark,
+            json.tproxy,
         );
     }
-
     toJson() {
         return {
             acceptProxyProtocol: this.acceptProxyProtocol,
+            tcpFastOpen: this.tcpFastOpen,
+            mark: this.mark,
+            tproxy: this.tproxy,
         };
     }
 }
@@ -835,7 +840,7 @@ class StreamSettings extends XrayCommonClass {
         httpSettings=new HttpStreamSettings(),
         quicSettings=new QuicStreamSettings(),
         grpcSettings=new GrpcStreamSettings(),
-        sockopt = new SockoptStreamSettings(),
+        sockopt = undefined,
         ) {
         super();
         this.network = network;
@@ -889,14 +894,12 @@ class StreamSettings extends XrayCommonClass {
         }
     }
 
-    get isSockopt() {
-        return ['http', 'grpc'].indexOf(this.network) !== -1;
+    get sockoptSwitch() {
+        return this.sockopt != undefined;
     }
 
-    set isSockopt(isSockopt) {
-        if (isSockopt) {
-            return ['http', 'grpc'].indexOf(this.network) !== -1;
-        }
+    set sockoptSwitch(value) {
+        this.sockopt = value ? new SockoptStreamSettings() : undefined;
     }
 
     static fromJson(json={}) {
@@ -931,7 +934,7 @@ class StreamSettings extends XrayCommonClass {
             httpSettings: network === 'http' ? this.http.toJson() : undefined,
             quicSettings: network === 'quic' ? this.quic.toJson() : undefined,
             grpcSettings: network === 'grpc' ? this.grpc.toJson() : undefined,
-            sockopt: this.isSockopt ? this.sockopt.toJson() : undefined,
+            sockopt: this.sockopt != undefined ? this.sockopt.toJson() : undefined,
         };
     }
 }

+ 0 - 4
web/html/xui/form/stream/stream_grpc.html

@@ -1,9 +1,5 @@
 {{define "form/streamGRPC"}}
 <a-form layout="inline">
-    <a-form-item label="AcceptProxyProtocol">
-        <a-switch v-model="inbound.stream.sockopt.acceptProxyProtocol"></a-switch>
-    </a-form-item>
-    <br>
     <a-form-item label="ServiceName">
         <a-input v-model.trim="inbound.stream.grpc.serviceName"></a-input>
     </a-form-item>

+ 0 - 4
web/html/xui/form/stream/stream_http.html

@@ -1,9 +1,5 @@
 {{define "form/streamHTTP"}}
 <a-form layout="inline">
-    <a-form-item label="AcceptProxyProtocol">
-        <a-switch v-model="inbound.stream.sockopt.acceptProxyProtocol"></a-switch>
-    </a-form-item>
-    <br>
     <a-form-item label='{{ i18n "path" }}'>
         <a-input v-model.trim="inbound.stream.http.path"></a-input>
     </a-form-item>

+ 5 - 0
web/html/xui/form/stream/stream_settings.html

@@ -42,4 +42,9 @@
 <template v-if="inbound.stream.network === 'grpc'">
     {{template "form/streamGRPC"}}
 </template>
+
+<!-- sockopt -->
+<template>
+    {{template "form/streamSockopt"}}
+</template>
 {{end}}

+ 48 - 0
web/html/xui/form/stream/stream_sockopt.html

@@ -0,0 +1,48 @@
+{{define "form/streamSockopt"}}
+<a-form layout="inline">
+    <a-divider dashed style="margin:0;">
+    <a-form-item label="Transparent Proxy">
+        <a-switch v-model="inbound.stream.sockoptSwitch"></a-switch>
+    </a-form-item>
+    </a-divider>
+    <table width="100%" class="ant-table-tbody" v-if="inbound.stream.sockoptSwitch">
+        <tr>
+            <td>Accept Proxy Protocol</td>
+            <td>
+                <a-form-item>
+                    <a-switch v-model="inbound.stream.sockopt.acceptProxyProtocol"></a-switch>
+                </a-form-item>
+            </td>
+        </tr>
+        <tr>
+            <td>TCP FastOpen</td>
+            <td>
+                <a-form-item>
+                    <a-switch v-model.trim="inbound.stream.sockopt.tcpFastOpen"></a-switch>
+                </a-form-item>
+            </td>
+        </tr>
+        <tr>
+            <td>Route Mark</td>
+            <td>
+                <a-form-item>
+                    <a-input-number v-model="inbound.stream.sockopt.mark" :min="0"></a-input-number>
+                </a-form-item>
+            </td>
+        </tr>
+        <tr>
+            <td>T-Proxy</td>
+            <td>
+                <a-form-item>
+                    <a-select v-model="inbound.stream.sockopt.tproxy" style="width: 250px;"
+                        :dropdown-class-name="themeSwitcher.darkCardClass">
+                        <a-select-option value="off">OFF</a-select-option>
+                        <a-select-option value="redirect">Redirect</a-select-option>
+                        <a-select-option value="tproxy">T-Proxy</a-select-option>
+                    </a-select>
+                </a-form-item>
+            </td>
+        </tr>
+    </table>
+</a-form>
+{{end}}