gen_config.lua 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639
  1. #!/usr/bin/lua
  2. local ucursor = require "luci.model.uci".cursor()
  3. local json = require "luci.jsonc"
  4. local server_section = arg[1]
  5. local proto = arg[2] or "tcp"
  6. local local_port = arg[3] or "0"
  7. local socks_port = arg[4] or "0"
  8. local chain = arg[5] or "0"
  9. local chain_local_port = string.split(chain, "/")[2] or "0"
  10. local server = ucursor:get_all("shadowsocksr", server_section)
  11. local socks_server = ucursor:get_all("shadowsocksr", "@socks5_proxy[0]") or {}
  12. local xray_fragment = ucursor:get_all("shadowsocksr", "@global_xray_fragment[0]") or {}
  13. local xray_noise = ucursor:get_all("shadowsocksr", "@xray_noise_packets[0]") or {}
  14. local outbound_settings = nil
  15. function vmess_vless()
  16. outbound_settings = {
  17. vnext = {
  18. {
  19. address = server.server,
  20. port = tonumber(server.server_port),
  21. users = {
  22. {
  23. id = server.vmess_id,
  24. alterId = (server.v2ray_protocol == "vmess" or not server.v2ray_protocol) and tonumber(server.alter_id) or nil,
  25. security = (server.v2ray_protocol == "vmess" or not server.v2ray_protocol) and server.security or nil,
  26. encryption = (server.v2ray_protocol == "vless") and server.vless_encryption or nil,
  27. flow = (((server.xtls == '1') or (server.tls == '1') or (server.reality == '1')) and (((server.tls_flow ~= "none") and server.tls_flow) or ((server.xhttp_tls_flow ~= "none") and server.xhttp_tls_flow))) or nil
  28. }
  29. }
  30. }
  31. }
  32. }
  33. end
  34. function trojan_shadowsocks()
  35. outbound_settings = {
  36. servers = {
  37. {
  38. address = server.server,
  39. port = tonumber(server.server_port),
  40. password = server.password,
  41. method = ((server.v2ray_protocol == "shadowsocks") and server.encrypt_method_ss) or nil,
  42. uot = (server.v2ray_protocol == "shadowsocks") and (server.uot == '1') or nil,
  43. ivCheck = (server.v2ray_protocol == "shadowsocks") and (server.ivCheck == '1') or nil,
  44. }
  45. }
  46. }
  47. end
  48. function socks_http()
  49. outbound_settings = {
  50. version = server.socks_ver or nil,
  51. servers = {
  52. {
  53. address = server.server,
  54. port = tonumber(server.server_port),
  55. users = (server.auth_enable == "1") and {
  56. {
  57. user = server.username,
  58. pass = server.password
  59. }
  60. } or nil
  61. }
  62. }
  63. }
  64. end
  65. function wireguard()
  66. outbound_settings = {
  67. secretKey = server.private_key,
  68. address = server.local_addresses,
  69. peers = {
  70. {
  71. publicKey = server.peer_pubkey,
  72. preSharedKey = server.preshared_key,
  73. endpoint = server.server .. ":" .. server.server_port,
  74. keepAlive = tonumber(server.keepaliveperiod),
  75. allowedIPs = (server.allowedips) or nil,
  76. }
  77. },
  78. noKernelTun = (server.kernelmode == "1") and true or false,
  79. reserved = {server.reserved} or nil,
  80. mtu = tonumber(server.mtu)
  81. }
  82. end
  83. local outbound = {}
  84. function outbound:new(o)
  85. o = o or {}
  86. setmetatable(o, self)
  87. self.__index = self
  88. return o
  89. end
  90. function outbound:handleIndex(index)
  91. local switch = {
  92. vmess = function()
  93. vmess_vless()
  94. end,
  95. vless = function()
  96. vmess_vless()
  97. end,
  98. trojan = function()
  99. trojan_shadowsocks()
  100. end,
  101. shadowsocks = function()
  102. trojan_shadowsocks()
  103. end,
  104. socks = function()
  105. socks_http()
  106. end,
  107. http = function()
  108. socks_http()
  109. end,
  110. wireguard = function()
  111. wireguard()
  112. end
  113. }
  114. if switch[index] then
  115. switch[index]()
  116. end
  117. end
  118. local settings = outbound:new()
  119. settings:handleIndex(server.v2ray_protocol)
  120. local Xray = {
  121. log = {
  122. -- error = "/var/ssrplus.log",
  123. loglevel = "warning"
  124. },
  125. -- 初始化 inbounds 表
  126. inbounds = {},
  127. -- 初始化 outbounds 表
  128. outbounds = {},
  129. }
  130. -- 传入连接
  131. -- 添加 dokodemo-door 配置,如果 local_port 不为 0
  132. if local_port ~= "0" then
  133. table.insert(Xray.inbounds, {
  134. -- listening
  135. port = tonumber(local_port),
  136. protocol = "dokodemo-door",
  137. settings = {network = proto, followRedirect = true},
  138. sniffing = {
  139. enabled = true,
  140. destOverride = {"http", "tls", "quic"},
  141. metadataOnly = false,
  142. domainsExcluded = {
  143. "courier.push.apple.com",
  144. "rbsxbxp-mim.vivox.com",
  145. "rbsxbxp.www.vivox.com",
  146. "rbsxbxp-ws.vivox.com",
  147. "rbspsxp.www.vivox.com",
  148. "rbspsxp-mim.vivox.com",
  149. "rbspsxp-ws.vivox.com",
  150. "rbswxp.www.vivox.com",
  151. "rbswxp-mim.vivox.com",
  152. "disp-rbspsp-5-1.vivox.com",
  153. "disp-rbsxbp-5-1.vivox.com",
  154. "proxy.rbsxbp.vivox.com",
  155. "proxy.rbspsp.vivox.com",
  156. "proxy.rbswp.vivox.com",
  157. "rbswp.vivox.com",
  158. "rbsxbp.vivox.com",
  159. "rbspsp.vivox.com",
  160. "rbspsp.www.vivox.com",
  161. "rbswp.www.vivox.com",
  162. "rbsxbp.www.vivox.com",
  163. "rbsxbxp.vivox.com",
  164. "rbspsxp.vivox.com",
  165. "rbswxp.vivox.com",
  166. "Mijia Cloud",
  167. "dlg.io.mi.com"
  168. }
  169. }
  170. })
  171. end
  172. -- 开启 socks 代理
  173. -- 检查是否启用 socks 代理
  174. if proto and proto:find("tcp") and socks_port ~= "0" then
  175. table.insert(Xray.inbounds, {
  176. -- socks
  177. protocol = "socks",
  178. port = tonumber(socks_port),
  179. settings = {
  180. auth = socks_server.socks5_auth or "noauth",
  181. udp = true,
  182. mixed = ((socks_server.socks5_mixed == '1') and true or false) or (socks_server.server == 'same') and nil,
  183. accounts = (socks_server.server ~= "same" and (socks_server.socks5_auth and socks_server.socks5_auth ~= "noauth")) and {
  184. {
  185. user = socks_server.socks5_user,
  186. pass = socks_server.socks5_pass
  187. }
  188. } or nil
  189. } or nil
  190. })
  191. end
  192. -- 传出连接
  193. Xray.outbounds = {
  194. {
  195. protocol = server.v2ray_protocol,
  196. settings = outbound_settings,
  197. -- 底层传输配置
  198. streamSettings = (server.v2ray_protocol ~= "wireguard") and {
  199. network = server.transport or "tcp",
  200. security = (server.xtls == '1') and "xtls" or (server.tls == '1') and "tls" or (server.reality == '1') and "reality" or nil,
  201. tlsSettings = (server.tls == '1') and {
  202. -- tls
  203. alpn = (server.transport == "xhttp" and server.xhttp_alpn ~= "") and server.xhttp_alpn or server.tls_alpn,
  204. fingerprint = server.fingerprint,
  205. allowInsecure = (server.insecure == "1"),
  206. serverName = server.tls_host,
  207. certificates = server.certificate and {
  208. usage = "verify",
  209. certificateFile = server.certpath
  210. } or nil,
  211. } or nil,
  212. xtlsSettings = (server.xtls == '1') and server.tls_host and {
  213. -- xtls
  214. allowInsecure = (server.insecure == "1") and true or nil,
  215. serverName = server.tls_host,
  216. minVersion = "1.3"
  217. } or nil,
  218. realitySettings = (server.reality == '1') and {
  219. alpn = (server.transport == "xhttp" and server.xhttp_alpn ~= "") and server.xhttp_alpn or nil,
  220. publicKey = server.reality_publickey,
  221. shortId = server.reality_shortid,
  222. spiderX = server.reality_spiderx,
  223. fingerprint = server.fingerprint,
  224. serverName = server.tls_host
  225. } or nil,
  226. rawSettings = (server.transport == "raw" or server.transport == "tcp") and {
  227. -- tcp
  228. header = {
  229. type = server.tcp_guise or "none",
  230. request = (server.tcp_guise == "http") and {
  231. -- request
  232. path = {server.http_path} or {"/"},
  233. headers = {Host = {server.http_host} or {}}
  234. } or nil
  235. }
  236. } or nil,
  237. kcpSettings = (server.transport == "kcp") and {
  238. -- kcp
  239. mtu = tonumber(server.mtu),
  240. tti = tonumber(server.tti),
  241. uplinkCapacity = tonumber(server.uplink_capacity),
  242. downlinkCapacity = tonumber(server.downlink_capacity),
  243. congestion = (server.congestion == "1") and true or false,
  244. readBufferSize = tonumber(server.read_buffer_size),
  245. writeBufferSize = tonumber(server.write_buffer_size),
  246. header = {type = server.kcp_guise},
  247. seed = server.seed or nil
  248. } or nil,
  249. wsSettings = (server.transport == "ws") and (server.ws_path or server.ws_host or server.tls_host) and {
  250. -- ws
  251. Host = server.ws_host or server.tls_host or nil,
  252. path = server.ws_path,
  253. maxEarlyData = tonumber(server.ws_ed) or nil,
  254. earlyDataHeaderName = server.ws_ed_header or nil
  255. } or nil,
  256. httpupgradeSettings = (server.transport == "httpupgrade") and {
  257. -- httpupgrade
  258. host = (server.httpupgrade_host or server.tls_host) or nil,
  259. path = server.httpupgrade_path or ""
  260. } or nil,
  261. splithttpSettings = (server.transport == "splithttp") and {
  262. -- splithttp
  263. host = (server.splithttp_host or server.tls_host) or nil,
  264. path = server.splithttp_path or "/"
  265. } or nil,
  266. xhttpSettings = (server.transport == "xhttp") and {
  267. -- xhttp
  268. mode = server.xhttp_mode or "auto",
  269. host = (server.xhttp_host or server.tls_host) or nil,
  270. path = server.xhttp_path or "/",
  271. extra = (server.enable_xhttp_extra == "1" and server.xhttp_extra) and (function()
  272. local success, parsed = pcall(json.parse, server.xhttp_extra)
  273. if success then
  274. return parsed.extra or parsed
  275. else
  276. return nil
  277. end
  278. end)() or nil
  279. } or nil,
  280. httpSettings = (server.transport == "h2") and {
  281. -- h2
  282. path = server.h2_path or "",
  283. host = {server.h2_host} or nil,
  284. read_idle_timeout = tonumber(server.read_idle_timeout) or nil,
  285. health_check_timeout = tonumber(server.health_check_timeout) or nil
  286. } or nil,
  287. quicSettings = (server.transport == "quic") and {
  288. -- quic
  289. security = server.quic_security,
  290. key = server.quic_key,
  291. header = {type = server.quic_guise}
  292. } or nil,
  293. grpcSettings = (server.transport == "grpc") and {
  294. -- grpc
  295. serviceName = server.serviceName or "",
  296. multiMode = (server.grpc_mode == "multi") and true or false,
  297. idle_timeout = tonumber(server.idle_timeout) or nil,
  298. health_check_timeout = tonumber(server.health_check_timeout) or nil,
  299. permit_without_stream = (server.permit_without_stream == "1") and true or nil,
  300. initial_windows_size = tonumber(server.initial_windows_size) or nil
  301. } or nil,
  302. sockopt = {
  303. mark = 250,
  304. tcpFastOpen = ((server.transport == "xhttp" and server.tcpfastopen == "1") and true or false) or (server.transport ~= "xhttp") and nil, -- XHTTP Tcp Fast Open
  305. tcpMptcp = (server.mptcp == "1") and true or nil, -- MPTCP
  306. Penetrate = (server.mptcp == "1") and true or nil, -- Penetrate MPTCP
  307. tcpcongestion = server.custom_tcpcongestion, -- 连接服务器节点的 TCP 拥塞控制算法
  308. dialerProxy = (xray_fragment.fragment == "1" or xray_fragment.noise == "1") and "dialerproxy" or nil
  309. }
  310. } or nil,
  311. mux = (server.v2ray_protocol ~= "wireguard") and {
  312. -- mux
  313. enabled = (server.mux == "1" or server.xmux == "1") and true or false, -- Mux
  314. concurrency = (server.mux == "1" and ((server.concurrency ~= "0") and tonumber(server.concurrency) or 8)) or (server.xmux == "1" and -1) or nil, -- TCP 最大并发连接数
  315. xudpConcurrency = ((server.xudpConcurrency ~= "0") and tonumber(server.xudpConcurrency)) or nil, -- UDP 最大并发连接数
  316. xudpProxyUDP443 = (server.mux == "1") and server.xudpProxyUDP443 or nil -- 对被代理的 UDP/443 流量处理方式
  317. } or nil
  318. }
  319. }
  320. -- 添加带有 fragment 设置的 dialerproxy 配置
  321. if xray_fragment.fragment ~= "0" or (xray_fragment.noise ~= "0" and xray_noise.enabled ~= "0") then
  322. table.insert(Xray.outbounds, {
  323. protocol = "freedom",
  324. tag = "dialerproxy",
  325. settings = {
  326. domainStrategy = (xray_fragment.noise == "1" and xray_noise.enabled == "1") and xray_noise.domainStrategy,
  327. fragment = (xray_fragment.fragment == "1") and {
  328. packets = (xray_fragment.fragment_packets ~= "") and xray_fragment.fragment_packets or nil,
  329. length = (xray_fragment.fragment_length ~= "") and xray_fragment.fragment_length or nil,
  330. interval = (xray_fragment.fragment_interval ~= "") and xray_fragment.fragment_interval or nil
  331. } or nil,
  332. noises = (xray_fragment.noise == "1" and xray_noise.enabled == "1") and {
  333. {
  334. type = xray_noise.type,
  335. packet = xray_noise.packet,
  336. delay = xray_noise.delay:find("-") and xray_noise.delay or tonumber(xray_noise.delay)
  337. }
  338. } or nil
  339. },
  340. streamSettings = {
  341. sockopt = {
  342. mark = 250,
  343. tcpFastOpen = ((server.transport == "xhttp" and server.tcpfastopen == "1") and true or false) or (server.transport ~= "xhttp") and nil, -- XHTTP Tcp Fast Open
  344. tcpMptcp = (server.mptcp == "1") and true or nil, -- MPTCP
  345. Penetrate = (server.mptcp == "1") and true or nil, -- Penetrate MPTCP
  346. tcpcongestion = server.custom_tcpcongestion -- 连接服务器节点的 TCP 拥塞控制算法
  347. }
  348. }
  349. })
  350. end
  351. local cipher = "ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA"
  352. local cipher13 = "TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384"
  353. local trojan = {
  354. log_level = 3,
  355. run_type = (proto == "nat" or proto == "tcp") and "nat" or "client",
  356. local_addr = "0.0.0.0",
  357. local_port = tonumber(local_port),
  358. remote_addr = server.server,
  359. remote_port = tonumber(server.server_port),
  360. udp_timeout = 60,
  361. -- 传入连接
  362. password = {server.password},
  363. -- 传出连接
  364. ssl = {
  365. verify = (server.insecure == "0") and true or false,
  366. verify_hostname = (server.tls == "1") and true or false,
  367. cert = (server.certificate) and server.certpath or nil,
  368. cipher = cipher,
  369. cipher_tls13 = cipher13,
  370. sni = server.tls_host,
  371. alpn = server.tls_alpn or {"h2", "http/1.1"},
  372. curve = "",
  373. reuse_session = true,
  374. session_ticket = (server.tls_sessionTicket == "1") and true or false
  375. },
  376. udp_timeout = 60,
  377. tcp = {
  378. -- tcp
  379. no_delay = true,
  380. keep_alive = true,
  381. reuse_port = true,
  382. fast_open = (server.fast_open == "1") and true or false,
  383. fast_open_qlen = 20
  384. }
  385. }
  386. local naiveproxy = {
  387. proxy = (server.username and server.password and server.server and server.server_port) and "https://" .. server.username .. ":" .. server.password .. "@" .. server.server .. ":" .. server.server_port,
  388. listen = (proto == "redir") and "redir" .. "://0.0.0.0:" .. tonumber(local_port) or "socks" .. "://0.0.0.0:" .. tonumber(local_port),
  389. ["insecure-concurrency"] = tonumber(server.concurrency) or 1
  390. }
  391. local ss = {
  392. server = (server.kcp_enable == "1") and "127.0.0.1" or server.server,
  393. server_port = tonumber(server.server_port),
  394. local_address = "0.0.0.0",
  395. local_port = tonumber(local_port),
  396. mode = (proto == "tcp,udp") and "tcp_and_udp" or (proto .. "_only"),
  397. password = server.password,
  398. method = server.encrypt_method_ss,
  399. timeout = tonumber(server.timeout),
  400. fast_open = (server.fast_open == "1") and true or false,
  401. reuse_port = true
  402. }
  403. local hysteria = {
  404. server = (server.server_port and (server.port_range and (server.server .. ":" .. server.server_port .. "," .. server.port_range) or (server.server .. ":" .. server.server_port) or (server.port_range and server.server .. ":" .. server.port_range or server.server .. ":443"))),
  405. bandwidth = (server.uplink_capacity or server.downlink_capacity) and {
  406. up = tonumber(server.uplink_capacity) and tonumber(server.uplink_capacity) .. " mbps" or nil,
  407. down = tonumber(server.downlink_capacity) and tonumber(server.downlink_capacity) .. " mbps" or nil
  408. },
  409. socks5 = (proto:find("tcp") and tonumber(socks_port) and tonumber(socks_port) ~= 0) and {
  410. listen = "0.0.0.0:" .. tonumber(socks_port),
  411. disable_udp = false
  412. } or nil,
  413. transport = (server.transport_protocol) and {
  414. type = (server.transport_protocol) or udp,
  415. udp = (server.port_range and (server.hopinterval) and {
  416. hopInterval = (server.port_range and (tonumber(server.hopinterval) .. "s") or nil)
  417. } or nil)
  418. } or nil,
  419. --[[
  420. tcpTProxy = (proto:find("tcp") and local_port ~= "0") and {
  421. listen = "0.0.0.0:" .. tonumber(local_port)
  422. } or nil,
  423. ]]--
  424. tcpRedirect = (proto:find("tcp") and local_port ~= "0") and {
  425. listen = "0.0.0.0:" .. tonumber(local_port)
  426. } or nil,
  427. udpTProxy = (proto:find("udp") and local_port ~= "0") and {
  428. listen = "0.0.0.0:" .. tonumber(local_port)
  429. } or nil,
  430. obfs = (server.flag_obfs == "1") and {
  431. type = server.obfs_type,
  432. salamander = { password = server.salamander }
  433. } or nil,
  434. quic = (server.flag_quicparam == "1" ) and {
  435. initStreamReceiveWindow = (server.initstreamreceivewindow and server.initstreamreceivewindow or nil),
  436. maxStreamReceiveWindow = (server.maxstreamseceivewindow and server.maxstreamseceivewindow or nil),
  437. initConnReceiveWindow = (server.initconnreceivewindow and server.initconnreceivewindow or nil),
  438. maxConnReceiveWindow = (server.maxconnreceivewindow and server.maxconnreceivewindow or nil),
  439. maxIdleTimeout = (tonumber(server.maxidletimeout) and tonumber(server.maxidletimeout) .. "s" or nil),
  440. keepAlivePeriod = (tonumber(server.keepaliveperiod) and tonumber(server.keepaliveperiod) .. "s" or nil),
  441. disablePathMTUDiscovery = (server.disablepathmtudiscovery == "1") and true or false
  442. } or nil,
  443. auth = server.hy2_auth,
  444. tls = (server.tls_host) and {
  445. sni = server.tls_host,
  446. --alpn = server.tls_alpn or nil,
  447. insecure = (server.insecure == "1") and true or false,
  448. pinSHA256 = (server.insecure == "1") and server.pinsha256 or nil
  449. } or {
  450. sni = server.server,
  451. insecure = (server.insecure == "1") and true or false
  452. },
  453. fast_open = (server.fast_open == "1") and true or false,
  454. lazy = (server.lazy_mode == "1") and true or false
  455. }
  456. local shadowtls = {
  457. client = {
  458. server_addr = server.server_port and server.server .. ":" .. server.server_port or nil,
  459. listen = "127.0.0.1:" .. tonumber(local_port),
  460. tls_names = server.shadowtls_sni,
  461. password = server.password
  462. },
  463. v3 = (server.shadowtls_protocol == "v3") and true or false,
  464. disable_nodelay = (server.disable_nodelay == "1") and true or false,
  465. fastopen = (server.fastopen == "1") and true or false,
  466. strict = (server.strict == "1") and true or false
  467. }
  468. local chain_sslocal = {
  469. locals = local_port ~= "0" and {
  470. {
  471. local_address = "0.0.0.0",
  472. local_port = (chain_local_port == "0" and tonumber(server.local_port) or tonumber(chain_local_port)),
  473. mode = (proto:find("tcp,udp") and "tcp_and_udp") or proto .. "_only",
  474. protocol = "redir",
  475. tcp_redir = "redirect",
  476. --tcp_redir = "tproxy",
  477. udp_redir = "tproxy"
  478. },
  479. socks_port ~= "0" and {
  480. protocol = "socks",
  481. local_address = "0.0.0.0",
  482. local_port = tonumber(socks_port)
  483. } or nil
  484. } or {{
  485. protocol = "socks",
  486. local_address = "0.0.0.0",
  487. ocal_port = tonumber(socks_port)
  488. }},
  489. servers = {
  490. {
  491. server = "127.0.0.1",
  492. server_port = (tonumber(local_port) == 0 and tonumber(chain_local_port) or tonumber(local_port)),
  493. method = server.sslocal_method,
  494. password = server.sslocal_password
  495. }
  496. }
  497. }
  498. local chain_vmess = {
  499. inbounds = (local_port ~= "0") and {
  500. {
  501. port = (chain_local_port == "0" and tonumber(server.local_port) or tonumber(chain_local_port)),
  502. protocol = "dokodemo-door",
  503. settings = {
  504. network = proto,
  505. followRedirect = true
  506. },
  507. streamSettings = {
  508. sockopt = {tproxy = "redirect"}
  509. },
  510. sniffing = {
  511. enable = true,
  512. destOverride = {"http","tls"}
  513. }
  514. },
  515. (proto:find("tcp") and socks_port ~= "0") and {
  516. protocol = "socks",
  517. port = tonumber(socks_port)
  518. } or nil
  519. } or { protocol = "socks",port = tonumber(socks_port) },
  520. outbound = {
  521. protocol = "vmess",
  522. settings = {
  523. vnext = {{
  524. address = "127.0.0.1",
  525. port = (tonumber(local_port) == 0 and tonumber(chain_local_port) or tonumber(local_port)),
  526. users = {{
  527. id = (server.vmess_uuid),
  528. security = server.vmess_method,
  529. level = 0
  530. }}
  531. }}
  532. }
  533. }
  534. }
  535. local tuic = {
  536. relay = {
  537. server = server.server_port and server.server .. ":" .. server.server_port,
  538. ip = server.tuic_ip,
  539. uuid = server.tuic_uuid,
  540. password = server.tuic_passwd,
  541. certificates = server.certificate and { server.certpath } or nil,
  542. udp_relay_mode = server.udp_relay_mode,
  543. congestion_control = server.congestion_control,
  544. heartbeat = server.heartbeat and server.heartbeat .. "s" or nil,
  545. timeout = server.timeout and server.timeout .. "s" or nil,
  546. gc_interval = server.gc_interval and server.gc_interval .. "s" or nil,
  547. gc_lifetime = server.gc_lifetime and server.gc_lifetime .. "s" or nil,
  548. alpn = server.tls_alpn,
  549. disable_sni = (server.disable_sni == "1") and true or false,
  550. zero_rtt_handshake = (server.zero_rtt_handshake == "1") and true or false,
  551. send_window = tonumber(server.send_window),
  552. receive_window = tonumber(server.receive_window)
  553. },
  554. ["local"] = {
  555. server = tonumber(socks_port) and "[::]:" .. (socks_port == "0" and local_port or tonumber(socks_port)),
  556. dual_stack = (server.tuic_dual_stack == "1") and true or nil,
  557. max_packet_size = tonumber(server.tuic_max_package_size)
  558. }
  559. }
  560. local config = {}
  561. function config:new(o)
  562. o = o or {}
  563. setmetatable(o, self)
  564. self.__index = self
  565. return o
  566. end
  567. function config:handleIndex(index)
  568. local switch = {
  569. ss = function()
  570. ss.protocol = socks_port
  571. if server.plugin and server.plugin ~= "none" then
  572. ss.plugin = server.plugin
  573. ss.plugin_opts = server.plugin_opts or nil
  574. end
  575. print(json.stringify(ss, 1))
  576. end,
  577. ssr = function()
  578. ss.protocol = server.protocol
  579. ss.protocol_param = server.protocol_param
  580. ss.method = server.encrypt_method
  581. ss.obfs = server.obfs
  582. ss.obfs_param = server.obfs_param
  583. print(json.stringify(ss, 1))
  584. end,
  585. v2ray = function()
  586. print(json.stringify(Xray, 1))
  587. end,
  588. trojan = function()
  589. print(json.stringify(trojan, 1))
  590. end,
  591. naiveproxy = function()
  592. print(json.stringify(naiveproxy, 1))
  593. end,
  594. hysteria = function()
  595. print(json.stringify(hysteria, 1))
  596. end,
  597. shadowtls = function()
  598. local chain_switch = {
  599. sslocal = function()
  600. if (chain:find("chain")) then
  601. print(json.stringify(chain_sslocal, 1))
  602. else
  603. print(json.stringify(shadowtls, 1))
  604. end
  605. end,
  606. vmess = function()
  607. if (chain:find("chain")) then
  608. print(json.stringify(chain_vmess, 1))
  609. else
  610. print(json.stringify(shadowtls, 1))
  611. end
  612. end
  613. }
  614. local ChainType = server.chain_type
  615. if chain_switch[ChainType] then
  616. chain_switch[ChainType]()
  617. end
  618. end,
  619. tuic = function()
  620. print(json.stringify(tuic, 1))
  621. end
  622. }
  623. if switch[index] then
  624. switch[index]()
  625. end
  626. end
  627. local f = config:new()
  628. f:handleIndex(server.type)