Przeglądaj źródła

Merge pull request #1218 from AmberisMyShiba/tuic-features

TUIC features
coolsnowwolf 2 lat temu
rodzic
commit
288a31b225

+ 12 - 1
luci-app-ssr-plus/Makefile

@@ -10,6 +10,7 @@ PKG_CONFIG_DEPENDS:= \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Xray \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Xray \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria \
+	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Tuic-Client \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy \
@@ -26,7 +27,7 @@ PKG_CONFIG_DEPENDS:= \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server \
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Trojan
 	CONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Trojan
 
 
-LUCI_TITLE:=SS/SSR/V2Ray/Trojan/NaiveProxy/Socks5/Tun LuCI interface
+LUCI_TITLE:=SS/SSR/V2Ray/Trojan/NaiveProxy/TUIC/Hysteria/Socks5/Tun LuCI interface
 LUCI_PKGARCH:=all
 LUCI_PKGARCH:=all
 LUCI_DEPENDS:= \
 LUCI_DEPENDS:= \
 	@(PACKAGE_libustream-mbedtls||PACKAGE_libustream-openssl||PACKAGE_libustream-wolfssl) \
 	@(PACKAGE_libustream-mbedtls||PACKAGE_libustream-openssl||PACKAGE_libustream-wolfssl) \
@@ -39,6 +40,7 @@ LUCI_DEPENDS:= \
 	+PACKAGE_$(PKG_NAME)_INCLUDE_Xray:xray-core \
 	+PACKAGE_$(PKG_NAME)_INCLUDE_Xray:xray-core \
 	+PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG:chinadns-ng \
 	+PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG:chinadns-ng \
 	+PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria:hysteria \
 	+PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria:hysteria \
+	+PACKAGE_$(PKG_NAME)_INCLUDE_TUIC-Client:tuic-client \
 	+PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks:ipt2socks \
 	+PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks:ipt2socks \
 	+PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun:kcptun-client \
 	+PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun:kcptun-client \
 	+PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy:naiveproxy \
 	+PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy:naiveproxy \
@@ -114,6 +116,15 @@ config PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG
 
 
 config PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria
 config PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria
 	bool "Include Hysteria"
 	bool "Include Hysteria"
+	select PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG
+	default n
+
+config PACKAGE_$(PKG_NAME)_INCLUDE_TUIC-Client
+	bool "Include tuic-client"
+	select PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG
+	select PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks
+	depends on aarch64||i686||x86_64
+	depends on !(TARGET_x86_geode||TARGET_x86_legacy)
 	default n
 	default n
 
 
 config PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks
 config PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks

+ 58 - 16
luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua

@@ -225,7 +225,6 @@ o:depends({type = "v2ray", v2ray_protocol = "socks"})
 o = s:option(Value, "username", translate("Username"))
 o = s:option(Value, "username", translate("Username"))
 o.rmempty = true
 o.rmempty = true
 o:depends("type", "naiveproxy")
 o:depends("type", "naiveproxy")
---o:depends("type", "tuic")
 o:depends({type = "socks5", auth_enable = true})
 o:depends({type = "socks5", auth_enable = true})
 o:depends({type = "v2ray", v2ray_protocol = "http", auth_enable = true})
 o:depends({type = "v2ray", v2ray_protocol = "http", auth_enable = true})
 o:depends({type = "v2ray", v2ray_protocol = "socks", auth_enable = true})
 o:depends({type = "v2ray", v2ray_protocol = "socks", auth_enable = true})
@@ -237,7 +236,6 @@ o:depends("type", "ssr")
 o:depends("type", "ss")
 o:depends("type", "ss")
 o:depends("type", "trojan")
 o:depends("type", "trojan")
 o:depends("type", "naiveproxy")
 o:depends("type", "naiveproxy")
-o:depends("type", "tuic")
 o:depends({type = "socks5", auth_enable = true})
 o:depends({type = "socks5", auth_enable = true})
 o:depends({type = "v2ray", v2ray_protocol = "http", auth_enable = true})
 o:depends({type = "v2ray", v2ray_protocol = "http", auth_enable = true})
 o:depends({type = "v2ray", v2ray_protocol = "socks", socks_ver = "5", auth_enable = true})
 o:depends({type = "v2ray", v2ray_protocol = "socks", socks_ver = "5", auth_enable = true})
@@ -351,15 +349,29 @@ o.default = "0"
 
 
 -- [[ TUIC ]]
 -- [[ TUIC ]]
 -- TuicNameId
 -- TuicNameId
-o = s:option(Value, "tuic_uuid", translate("TUIC user UUID"))
+o = s:option(Value, "tuic_uuid", translate("TUIC User UUID"))
 o.rmempty = true
 o.rmempty = true
 o.default = uuid
 o.default = uuid
 o:depends("type", "tuic")
 o:depends("type", "tuic")
 
 
+--Tuic IP
+o = s:option(Value, "tuic_ip", translate("TUIC Server IP Address"))
+o.rmempty = true
+o.datatype = "ip4addr"
+o.default = ""
+o:depends("type", "tuic")
+
+-- Tuic Password
+o = s:option(Value, "tuic_passwd", translate("TUIC User Password"))
+o.rmempty = true
+o.default = ""
+o:depends("type", "tuic")
+
+
 o = s:option(ListValue, "udp_relay_mode", translate("UDP relay mode"))
 o = s:option(ListValue, "udp_relay_mode", translate("UDP relay mode"))
 o:depends("type", "tuic")
 o:depends("type", "tuic")
-o:value("native", translate("native"))
-o:value("quic", translate("QUIC"))
+o:value("native", translate("native UDP characteristics")
+o:value("quic", translate("lossless UDP relay using QUIC streams")
 o.default = "native"
 o.default = "native"
 o.rmempty = true
 o.rmempty = true
 
 
@@ -371,34 +383,64 @@ o:value("new_reno", translate("New Reno"))
 o.default = "cubic"
 o.default = "cubic"
 o.rmempty = true
 o.rmempty = true
 
 
-o = s:option(Value, "heartbeat", translate("Heartbeat interval"))
+o = s:option(Value, "heartbeat", translate("Heartbeat interval(second)"))
 o:depends("type", "tuic")
 o:depends("type", "tuic")
---o.datatype = "uinteger"
-o.default = "3s"
+o.datatype = "uinteger"
+o.default = "3"
 o.rmempty = true
 o.rmempty = true
 
 
-o = s:option(Flag, "disable_sni", translate("Disable SNI"))
+o = s:option(Value, "timeout", translate("Timeout for establishing a connection to server(second)"))
 o:depends("type", "tuic")
 o:depends("type", "tuic")
-o.default = 0
+o.datatype = "uinteger"
+o.default = "8"
 o.rmempty = true
 o.rmempty = true
 
 
-o = s:option(Flag, "zero_rtt_handshake", translate("Enable 0-RTT QUIC handshake"))
+o = s:option(Value, "gc_interval", translate("Garbage collection interval(second)"))
 o:depends("type", "tuic")
 o:depends("type", "tuic")
-o.default = 0
-o.rmempty = false
+o.datatype = "uinteger"
+o.default = "3"
+o.rmempty = true
 
 
-o = s:option(Value, "send_window", translate("TUIC send window"))
+o = s:option(Value, "gc_lifetime", translate("Garbage collection lifetime(second)"))
+o:depends("type", "tuic")
 o.datatype = "uinteger"
 o.datatype = "uinteger"
+o.default = "15"
+o.rmempty = true
+
+o = s:option(Value, "send_window", translate("TUIC send window"))
 o:depends("type", "tuic")
 o:depends("type", "tuic")
+o.datatype = "uinteger"
 o.default = 16777216
 o.default = 16777216
 o.rmempty = true
 o.rmempty = true
 
 
 o = s:option(Value, "receive_window", translate("TUIC receive window"))
 o = s:option(Value, "receive_window", translate("TUIC receive window"))
-o.datatype = "uinteger"
 o:depends("type", "tuic")
 o:depends("type", "tuic")
+o.datatype = "uinteger"
 o.default = 8388608
 o.default = 8388608
 o.rmempty = true
 o.rmempty = true
 
 
+o = s:option(Flag, "disable_sni", translate("Disable SNI"))
+o:depends("type", "tuic")
+o.default = 0
+o.rmempty = true
+
+o = s:option(Flag, "zero_rtt_handshake", translate("Enable 0-RTT QUIC handshake"))
+o:depends("type", "tuic")
+o.default = 0
+o.rmempty = true
+
+--Tuic settings for the local inbound socks5 server
+o = s:option(Flag, "tuic_dual_stack", translate("Set if the listening socket should be dual-stack"))
+o:depends("type", "tuic")
+o.default = 0
+o.rmempty = true
+
+o = s:option(Value, "tuic_max_package_size", translate("Maximum packet size the socks5 server can receive from external"))
+o:depends("type", "tuic")
+o.datatype = "uinteger"
+o.default = 1500
+o.rmempty = true
+
 -- VmessId
 -- VmessId
 o = s:option(Value, "vmess_id", translate("Vmess/VLESS ID (UUID)"))
 o = s:option(Value, "vmess_id", translate("Vmess/VLESS ID (UUID)"))
 o.rmempty = true
 o.rmempty = true
@@ -848,4 +890,4 @@ if is_finded("kcptun-client") then
 	o:depends("type", "ss")
 	o:depends("type", "ss")
 end
 end
 
 
-return m
+return m

+ 32 - 6
luci-app-ssr-plus/po/zh-cn/ssr-plus.po

@@ -853,17 +853,38 @@ msgstr "应用"
 msgid "Enable Netflix Mode"
 msgid "Enable Netflix Mode"
 msgstr "启用 Netflix 分流模式"
 msgstr "启用 Netflix 分流模式"
 
 
-msgid "TUIC user UUID"
+msgid "TUIC User UUID"
 msgstr "TUIC用户uuid"
 msgstr "TUIC用户uuid"
 
 
+msgid "TUIC Server IP Address"
+msgstr "TUIC 服务器IP地址"
+
+msgid "TUIC User Password"
+msgstr "TUIC用户密钥"
+
 msgid "UDP relay mode"
 msgid "UDP relay mode"
-msgstr "tuic UDP中继模式"
+msgstr "UDP中继模式"
+
+msgid "native UDP characteristics"
+msgstr "原生UDP特性"
+
+msgid "lossless UDP relay using QUIC streams"
+msgstr "使用 QUIC 流的无损 UDP 中继"
 
 
 msgid "Congestion control algorithm"
 msgid "Congestion control algorithm"
 msgstr "拥塞控制算法"
 msgstr "拥塞控制算法"
 
 
-msgid "Heartbeat interval"
-msgstr "连接保活间隔"
+msgid "Heartbeat interval(second)"
+msgstr "保活心跳包发送间隔(单位:秒)"
+
+msgid "Timeout for establishing a connection to server(second)"
+msgstr "连接超时时间(单位:秒)"
+
+msgid "Garbage collection interval(second)"
+msgstr "UDP数据包片残片清理间隔(单位:秒)"
+
+msgid "Garbage collection lifetime(second)"
+msgstr "UDP数据包残片在服务器的保留时间(单位:秒)"
 
 
 msgid "Disable SNI"
 msgid "Disable SNI"
 msgstr "关闭SNI服务器名称指示"
 msgstr "关闭SNI服务器名称指示"
@@ -872,8 +893,13 @@ msgid "Enable 0-RTT QUIC handshake"
 msgstr "客户端启用 0-RTT QUIC 连接握手"
 msgstr "客户端启用 0-RTT QUIC 连接握手"
 
 
 msgid "TUIC send window"
 msgid "TUIC send window"
-msgstr "发送窗口(无需确认即可发送的最大字节数)"
+msgstr "发送窗口(无需确认即可发送的最大字节数:默认8Mb*2)"
 
 
 msgid "TUIC receive window"
 msgid "TUIC receive window"
-msgstr "接收窗口(无需确认即可接收的最大字节数)"
+msgstr "接收窗口(无需确认即可接收的最大字节数:默认8Mb)"
+
+msgid "Set if the listening socket should be dual-stack"
+msgstr "设置监听套接字为双栈"
 
 
+msgid "Maximum packet size the socks5 server can receive from external"
+msgstr "socks5服务器可以从外部接收的最大数据包大小(单位:字节)"

+ 23 - 17
luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua

@@ -306,23 +306,29 @@ local hysteria = {
 	lazy_start = (server.lazy_start == "1") and true or false
 	lazy_start = (server.lazy_start == "1") and true or false
 }
 }
 local tuic = {
 local tuic = {
-	relay = {
-		server = server.server .. ":" .. server.server_port,
-		uuid = server.tuic_uuid,
-		password = server.password,
-		certificates = server.certificate and { server.certpath } or nil,
-		udp_relay_mode = server.udp_relay_mode,
-		congestion_control = server.congestion_control,
-		heartbeat = server.heartbeat_interval,
-		alpn = server.tls_alpn,
-		disable_sni = (server.disable_sni == "1"),
-		zero_rtt_handshake = (server.zero_rtt_handshake == "1"),
-		send_window = tonumber(server.send_window),
-		receive_window = tonumber(server.receive_window)
-	},
-	["local"] = {
-		server = "0.0.0.0:" .. tonumber(local_port)		
-	}
+		relay = {
+				server = server.server .. ":" .. server.server_port,
+				ip = server.tuic_ip,
+				uuid = server.tuic_uuid,
+				password = server.tuic_passwd,
+				certificates = server.certificate and { server.certpath } or nil,
+				udp_relay_mode = server.udp_relay_mode,
+				congestion_control = server.congestion_control,
+				heartbeat = server.heartbeat .. "s",
+				timeout = server.timeout .. "s",
+				gc_interval = server.gc_interval .. "s",
+				gc_lifetime = server.gc_lifetime .. "s",
+				alpn = server.tls_alpn,
+				disable_sni = (server.disable_sni == "1"),
+				zero_rtt_handshake = (server.zero_rtt_handshake == "1"),
+				send_window = tonumber(server.send_window),
+				receive_window = tonumber(server.receive_window)
+        },
+		["local"] = {
+				server = "[::]:" .. tonumber(local_port),
+				dual_stack = dual_stack = (server.tuic_dual_stack == "1") and true or false,
+				max_packet_size = server.tuic_max_package_size
+		}
 }
 }
 local config = {}
 local config = {}
 function config:new(o)
 function config:new(o)

+ 72 - 0
tuic-client/Makefile

@@ -0,0 +1,72 @@
+# SPDX-License-Identifier: GPL-2.0-only
+#
+# Copyright (C) 2017-2020 Yousong Zhou <[email protected]>
+# Copyright (C) 2021 ImmortalWrt.org
+
+include $(TOPDIR)/rules.mk
+
+PKG_NAME:=tuic-client
+PKG_VERSION:=1.0.0
+PKG_RELEASE:=1
+
+PKG_LICENSE_FILES:=LICENSE
+PKG_MAINTAINER:=Tianling Shen <[email protected]>
+
+include $(INCLUDE_DIR)/package.mk
+
+TUIC_TYPE:=tuic-client-$(PKG_VERSION)
+TUIC_FOOT:=unknown-linux-musl
+ifeq ($(ARCH),aarch64)
+	TUIC_ARCH:=$(TUIC_TYPE)-aarch64-$(TUIC_FOOT)
+	PKG_HASH:=c29eaaf3bc05115acc7453ac26bacf9aff65211b1e8ca7f771b818248bec8601
+else ifeq ($ARCH),arm64)
+	ARM_CPU_FEATURES:=$(word 2,$(subst +,$(space),$(call qstrip,$(CONFIG_CPU_TYPE))))
+	ifeq ($(ARM_CPU_FEATURES),)
+		TUIC_ARCH:=$(TUIC_TYPE)-armv7-$(TUIC_FOOT)eabi
+		PKG_HASH:=33a83ab05dc1a598552bf1f27114502b12c94b6e5333c6ac2def3739c00a4daf
+	else
+		TUIC_ARCH:=$(TUIC_TYPE)-armv7-$(TUIC_FOOT)eabihf
+		PKG_HASH:=e2cc1d81ac376ff2a94976e78c861f5cd21ad809ff5b587ae967e2a63e4c35e4
+	endif
+else ifeq ($(ARCH),i686)
+	TUIC_ARCH:=$(TUIC_TYPE)-i686-$(TUIC_FOOT)
+	PKG_HASH:=67d930b4381a8848bf98acbccb538c73b72ca9dde0aed3705f73e62a9922f758
+else ifeq ($(ARCH),x86_64)
+	TUIC_ARCH:=$(TUIC_TYPE)-x86_64-$(TUIC_FOOT)
+	PKG_HASH:=180c562691247a7feddf553706bc8fd5b5b9de3027154f94a767ea907a45e2de
+endif
+
+define Download/tuic-client
+	URL:=https://github.com/EAimTY/tuic/releases/download/$(TUIC_TYPE)/
+	URL_FILE:=$(TUIC_ARCH)
+	FILE:=$(TUIC_ARCH)
+	HASH:=$(PKG_HASH)
+endef
+
+define Package/tuic-client
+	SECTION:=net
+	CATEGORY:=Network
+	SUBMENU:=Web Servers/Proxies
+	TITLE:=Delicately-TUICed 0-RTT proxy protocol
+	URL:=https://github.com/EAimTY/tuic/
+	DEPENDS:=@USE_MUSL @(aarch64||arm64||i686||x86_64) @!(TARGET_x86_geode||TARGET_x86_legacy)
+	#PKGARCH:=all aarch64 arm i686 x86_64
+endef
+
+define Build/Prepare
+	$(call Build/Prepare/Default)
+ifneq ($(CONFIG_PACKAGE_tuic-client),)
+	$(call Download,tuic-client)
+endif
+endef
+
+define Build/Compile
+endef
+
+define Package/tuic-client/install
+	$(INSTALL_DIR) $(1)/usr/bin
+	$(INSTALL_BIN) $(DL_DIR)/$(TUIC_ARCH) $(1)/usr/bin/tuic-client
+	chmod +x $(1)/usr/bin/tuic-client
+endef
+
+$(eval $(call BuildPackage,tuic-client))