1
0

outbound.html 48 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279
  1. {{define "form/outbound"}}
  2. <!-- base -->
  3. <a-tabs
  4. :active-key="outModal.activeKey"
  5. :style="{ padding: '0', backgroundColor: 'transparent' }"
  6. @change="(activeKey) => {outModal.toggleJson(activeKey == '2'); }"
  7. >
  8. <a-tab-pane key="1" tab="Form">
  9. <a-form
  10. :colon="false"
  11. :label-col="{ md: {span:8} }"
  12. :wrapper-col="{ md: {span:14} }"
  13. >
  14. <a-form-item label='{{ i18n "protocol" }}'>
  15. <a-select
  16. v-model="outbound.protocol"
  17. :dropdown-class-name="themeSwitcher.currentTheme"
  18. >
  19. <a-select-option v-for="x,y in Protocols" :value="x"
  20. >[[ y ]]</a-select-option
  21. >
  22. </a-select>
  23. </a-form-item>
  24. <a-form-item
  25. label='{{ i18n "pages.xray.outbound.tag" }}'
  26. has-feedback
  27. :validate-status="outModal.duplicateTag? 'warning' : 'success'"
  28. >
  29. <a-input
  30. v-model.trim="outbound.tag"
  31. @change="outModal.check()"
  32. placeholder='{{ i18n "pages.xray.outbound.tagDesc" }}'
  33. ></a-input>
  34. </a-form-item>
  35. <a-form-item label='{{ i18n "pages.xray.outbound.sendThrough" }}'>
  36. <a-input v-model="outbound.sendThrough"></a-input>
  37. </a-form-item>
  38. <!-- freedom settings-->
  39. <template v-if="outbound.protocol === Protocols.Freedom">
  40. <a-form-item label="Strategy">
  41. <a-select
  42. v-model="outbound.settings.domainStrategy"
  43. :dropdown-class-name="themeSwitcher.currentTheme"
  44. >
  45. <a-select-option v-for="s in OutboundDomainStrategies" :value="s"
  46. >[[ s ]]</a-select-option
  47. >
  48. </a-select>
  49. </a-form-item>
  50. <a-form-item label="Redirect">
  51. <a-input v-model="outbound.settings.redirect"></a-input>
  52. </a-form-item>
  53. <a-form-item label="Fragment">
  54. <a-switch
  55. :checked="Object.keys(outbound.settings.fragment).length >0"
  56. @change="checked => outbound.settings.fragment = checked ? new Outbound.FreedomSettings.Fragment() : {}"
  57. >
  58. </a-switch>
  59. </a-form-item>
  60. <template v-if="Object.keys(outbound.settings.fragment).length >0">
  61. <a-form-item label="Packets">
  62. <a-select
  63. v-model="outbound.settings.fragment.packets"
  64. :dropdown-class-name="themeSwitcher.currentTheme"
  65. >
  66. <a-select-option v-for="s in ['1-3','tlshello']" :value="s"
  67. >[[ s ]]</a-select-option
  68. >
  69. </a-select>
  70. </a-form-item>
  71. <a-form-item label="Length">
  72. <a-input v-model.trim="outbound.settings.fragment.length"></a-input>
  73. </a-form-item>
  74. <a-form-item label="Interval">
  75. <a-input
  76. v-model.trim="outbound.settings.fragment.interval"
  77. ></a-input>
  78. </a-form-item>
  79. <a-form-item label="Max Split">
  80. <a-input
  81. v-model.trim="outbound.settings.fragment.maxSplit"
  82. ></a-input>
  83. </a-form-item>
  84. </template>
  85. <!-- Switch for Noises -->
  86. <a-form-item label="Noises">
  87. <a-switch
  88. :checked="outbound.settings.noises.length > 0"
  89. @change="checked => outbound.settings.noises = checked ? [new Outbound.FreedomSettings.Noise()] : []"
  90. >
  91. </a-switch>
  92. </a-form-item>
  93. <!-- Add Noise Button -->
  94. <template v-if="outbound.settings.noises.length > 0">
  95. <a-form-item label="Noises">
  96. <a-button
  97. icon="plus"
  98. type="primary"
  99. size="small"
  100. @click="outbound.settings.addNoise()"
  101. ></a-button>
  102. </a-form-item>
  103. <!-- Noise Configurations -->
  104. <a-form
  105. v-for="(noise, index) in outbound.settings.noises"
  106. :key="index"
  107. :colon="false"
  108. :label-col="{ md: {span:8} }"
  109. :wrapper-col="{ md: {span:14} }"
  110. >
  111. <a-divider :style="{ margin: '0' }">
  112. Noise [[ index + 1 ]]
  113. <a-icon
  114. v-if="outbound.settings.noises.length > 1"
  115. type="delete"
  116. @click="() => outbound.settings.delNoise(index)"
  117. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
  118. ></a-icon>
  119. </a-divider>
  120. <a-form-item label="Type">
  121. <a-select
  122. v-model="noise.type"
  123. :dropdown-class-name="themeSwitcher.currentTheme"
  124. >
  125. <a-select-option
  126. v-for="s in ['rand','base64','str', 'hex']"
  127. :value="s"
  128. >[[ s ]]</a-select-option
  129. >
  130. </a-select>
  131. </a-form-item>
  132. <a-form-item label="Packet">
  133. <a-input v-model.trim="noise.packet"></a-input>
  134. </a-form-item>
  135. <a-form-item label="Delay">
  136. <a-input v-model.trim="noise.delay"></a-input>
  137. </a-form-item>
  138. <a-form-item label="Apply To">
  139. <a-select
  140. v-model="noise.applyTo"
  141. :dropdown-class-name="themeSwitcher.currentTheme"
  142. >
  143. <a-select-option v-for="s in ['ip','ipv4','ipv6']" :value="s"
  144. >[[ s ]]</a-select-option
  145. >
  146. </a-select>
  147. </a-form-item>
  148. </a-form>
  149. </template>
  150. </template>
  151. <!-- blackhole settings -->
  152. <template v-if="outbound.protocol === Protocols.Blackhole">
  153. <a-form-item label="Response Type">
  154. <a-select
  155. v-model="outbound.settings.type"
  156. :dropdown-class-name="themeSwitcher.currentTheme"
  157. >
  158. <a-select-option v-for="s in ['', 'none','http']" :value="s"
  159. >[[ s ]]</a-select-option
  160. >
  161. </a-select>
  162. </a-form-item>
  163. </template>
  164. <!-- dns settings -->
  165. <template v-if="outbound.protocol === Protocols.DNS">
  166. <a-form-item label='{{ i18n "pages.inbounds.network" }}'>
  167. <a-select
  168. v-model="outbound.settings.network"
  169. :dropdown-class-name="themeSwitcher.currentTheme"
  170. >
  171. <a-select-option v-for="s in ['udp','tcp']" :value="s"
  172. >[[ s ]]</a-select-option
  173. >
  174. </a-select>
  175. </a-form-item>
  176. <a-form-item label="non-IP queries">
  177. <a-select
  178. v-model="outbound.settings.nonIPQuery"
  179. :dropdown-class-name="themeSwitcher.currentTheme"
  180. >
  181. <a-select-option v-for="s in ['reject','drop','skip']" :value="s"
  182. >[[ s ]]</a-select-option
  183. >
  184. </a-select>
  185. </a-form-item>
  186. <a-form-item
  187. v-if="outbound.settings.nonIPQuery === 'skip'"
  188. label="Block Types"
  189. >
  190. <a-input v-model.number="outbound.settings.blockTypes"></a-input>
  191. </a-form-item>
  192. </template>
  193. <!-- wireguard settings -->
  194. <template v-if="outbound.protocol === Protocols.Wireguard">
  195. <a-form-item>
  196. <template slot="label">
  197. <a-tooltip>
  198. <template slot="title">
  199. <span>{{ i18n "pages.xray.rules.useComma" }}</span>
  200. </template>
  201. {{ i18n "pages.xray.outbound.address" }}
  202. <a-icon type="question-circle"></a-icon>
  203. </a-tooltip>
  204. </template>
  205. <a-input v-model.trim="outbound.settings.address"></a-input>
  206. </a-form-item>
  207. <a-form-item>
  208. <template slot="label">
  209. <a-tooltip>
  210. <template slot="title">
  211. <span>{{ i18n "reset" }}</span>
  212. </template>
  213. {{ i18n "pages.xray.wireguard.secretKey" }}
  214. <a-icon
  215. type="sync"
  216. @click="[outbound.settings.pubKey, outbound.settings.secretKey] = Object.values(Wireguard.generateKeypair())"
  217. >
  218. </a-icon>
  219. </a-tooltip>
  220. </template>
  221. <a-input v-model.trim="outbound.settings.secretKey"></a-input>
  222. </a-form-item>
  223. <a-form-item label='{{ i18n "pages.xray.wireguard.publicKey" }}'>
  224. <a-input disabled v-model="outbound.settings.pubKey"></a-input>
  225. </a-form-item>
  226. <a-form-item label='{{ i18n "pages.xray.wireguard.domainStrategy" }}'>
  227. <a-select
  228. v-model="outbound.settings.domainStrategy"
  229. :dropdown-class-name="themeSwitcher.currentTheme"
  230. >
  231. <a-select-option
  232. v-for="wds in ['', ...WireguardDomainStrategy]"
  233. :value="wds"
  234. >[[ wds ]]</a-select-option
  235. >
  236. </a-select>
  237. </a-form-item>
  238. <a-form-item label="MTU">
  239. <a-input-number
  240. v-model.number="outbound.settings.mtu"
  241. min="0"
  242. ></a-input-number>
  243. </a-form-item>
  244. <a-form-item label="Workers">
  245. <a-input-number
  246. v-model.number="outbound.settings.workers"
  247. min="0"
  248. ></a-input-number>
  249. </a-form-item>
  250. <a-form-item label="No Kernel Tun">
  251. <a-switch v-model="outbound.settings.noKernelTun"></a-switch>
  252. </a-form-item>
  253. <a-form-item>
  254. <template slot="label">
  255. <a-tooltip>
  256. <template slot="title">
  257. <span>{{ i18n "pages.xray.rules.useComma" }}</span>
  258. </template>
  259. Reserved <a-icon type="question-circle"></a-icon>
  260. </a-tooltip>
  261. </template>
  262. <a-input v-model="outbound.settings.reserved"></a-input>
  263. </a-form-item>
  264. <a-form-item label="Peers">
  265. <a-button
  266. icon="plus"
  267. type="primary"
  268. size="small"
  269. @click="outbound.settings.addPeer()"
  270. ></a-button>
  271. </a-form-item>
  272. <a-form
  273. v-for="(peer, index) in outbound.settings.peers"
  274. :colon="false"
  275. :label-col="{ md: {span:8} }"
  276. :wrapper-col="{ md: {span:14} }"
  277. >
  278. <a-divider :style="{ margin: '0' }">
  279. Peer [[ index + 1 ]]
  280. <a-icon
  281. v-if="outbound.settings.peers.length>1"
  282. type="delete"
  283. @click="() => outbound.settings.delPeer(index)"
  284. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
  285. ></a-icon>
  286. </a-divider>
  287. <a-form-item label='{{ i18n "pages.xray.wireguard.endpoint" }}'>
  288. <a-input v-model.trim="peer.endpoint"></a-input>
  289. </a-form-item>
  290. <a-form-item label='{{ i18n "pages.xray.wireguard.publicKey" }}'>
  291. <a-input v-model.trim="peer.publicKey"></a-input>
  292. </a-form-item>
  293. <a-form-item label='{{ i18n "pages.xray.wireguard.psk" }}'>
  294. <a-input v-model.trim="peer.psk"></a-input>
  295. </a-form-item>
  296. <a-form-item>
  297. <template slot="label">
  298. {{ i18n "pages.xray.wireguard.allowedIPs" }}
  299. <a-button
  300. icon="plus"
  301. type="primary"
  302. size="small"
  303. @click="peer.allowedIPs.push('')"
  304. ></a-button>
  305. </template>
  306. <template
  307. v-for="(aip, index) in peer.allowedIPs"
  308. :style="{ marginBottom: '10px' }"
  309. >
  310. <a-input v-model.trim="peer.allowedIPs[index]">
  311. <a-button
  312. icon="minus"
  313. v-if="peer.allowedIPs.length>1"
  314. slot="addonAfter"
  315. size="small"
  316. @click="peer.allowedIPs.splice(index, 1)"
  317. ></a-button>
  318. </a-input>
  319. </template>
  320. </a-form-item>
  321. <a-form-item label="Keep Alive">
  322. <a-input-number
  323. v-model.number="peer.keepAlive"
  324. :min="0"
  325. ></a-input-number>
  326. </a-form-item>
  327. </a-form>
  328. </template>
  329. <!-- Address + Port -->
  330. <template v-if="outbound.hasAddressPort()">
  331. <a-form-item label='{{ i18n "pages.inbounds.address" }}'>
  332. <a-input v-model.trim="outbound.settings.address"></a-input>
  333. </a-form-item>
  334. <a-form-item label='{{ i18n "pages.inbounds.port" }}'>
  335. <a-input-number
  336. v-model.number="outbound.settings.port"
  337. :min="1"
  338. :max="65532"
  339. ></a-input-number>
  340. </a-form-item>
  341. </template>
  342. <!-- VLESS/VMess user settings -->
  343. <template
  344. v-if="[Protocols.VMess, Protocols.VLESS].includes(outbound.protocol)"
  345. >
  346. <a-form-item label="ID">
  347. <a-input v-model.trim="outbound.settings.id"></a-input>
  348. </a-form-item>
  349. <!-- vmess settings -->
  350. <template v-if="outbound.protocol === Protocols.VMess">
  351. <a-form-item label="Security">
  352. <a-select
  353. v-model="outbound.settings.security"
  354. :dropdown-class-name="themeSwitcher.currentTheme"
  355. >
  356. <a-select-option v-for="key in USERS_SECURITY" :value="key"
  357. >[[ key ]]</a-select-option
  358. >
  359. </a-select>
  360. </a-form-item>
  361. </template>
  362. <!-- vless settings -->
  363. <template v-if="outbound.protocol === Protocols.VLESS">
  364. <a-form-item label="encryption">
  365. <a-input v-model.trim="outbound.settings.encryption"></a-input>
  366. </a-form-item>
  367. </template>
  368. <template v-if="outbound.canEnableTlsFlow()">
  369. <a-form-item label="Flow">
  370. <a-select
  371. v-model="outbound.settings.flow"
  372. :dropdown-class-name="themeSwitcher.currentTheme"
  373. >
  374. <a-select-option value selected
  375. >{{ i18n "none" }}</a-select-option
  376. >
  377. <a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key"
  378. >[[ key ]]</a-select-option
  379. >
  380. </a-select>
  381. </a-form-item>
  382. </template>
  383. <!-- XTLS Vision Advanced Settings -->
  384. <template v-if="outbound.canEnableVisionSeed()">
  385. <a-form-item label="Vision Pre-Connect">
  386. <a-input-number
  387. v-model.number="outbound.settings.testpre"
  388. :min="0"
  389. :max="10"
  390. :style="{ width: '100%' }"
  391. placeholder="0"
  392. ></a-input-number>
  393. </a-form-item>
  394. <a-form-item label="Vision Seed">
  395. <a-row :gutter="8">
  396. <a-col :span="6">
  397. <a-input-number
  398. v-model.number="outbound.settings.testseed[0]"
  399. :min="0"
  400. :max="9999"
  401. :style="{ width: '100%' }"
  402. placeholder="900"
  403. addon-before="[0]"
  404. ></a-input-number>
  405. </a-col>
  406. <a-col :span="6">
  407. <a-input-number
  408. v-model.number="outbound.settings.testseed[1]"
  409. :min="0"
  410. :max="9999"
  411. :style="{ width: '100%' }"
  412. placeholder="500"
  413. addon-before="[1]"
  414. ></a-input-number>
  415. </a-col>
  416. <a-col :span="6">
  417. <a-input-number
  418. v-model.number="outbound.settings.testseed[2]"
  419. :min="0"
  420. :max="9999"
  421. :style="{ width: '100%' }"
  422. placeholder="900"
  423. addon-before="[2]"
  424. ></a-input-number>
  425. </a-col>
  426. <a-col :span="6">
  427. <a-input-number
  428. v-model.number="outbound.settings.testseed[3]"
  429. :min="0"
  430. :max="9999"
  431. :style="{ width: '100%' }"
  432. placeholder="256"
  433. addon-before="[3]"
  434. ></a-input-number>
  435. </a-col>
  436. </a-row>
  437. </a-form-item>
  438. </template>
  439. </template>
  440. <!-- Servers (trojan/shadowsocks/socks/http) settings -->
  441. <template v-if="outbound.hasServers()">
  442. <!-- http / socks -->
  443. <template v-if="outbound.hasUsername()">
  444. <a-form-item label='{{ i18n "username" }}'>
  445. <a-input v-model.trim="outbound.settings.user"></a-input>
  446. </a-form-item>
  447. <a-form-item label='{{ i18n "password" }}'>
  448. <a-input v-model.trim="outbound.settings.pass"></a-input>
  449. </a-form-item>
  450. </template>
  451. <!-- trojan/shadowsocks -->
  452. <template
  453. v-if="[Protocols.Trojan, Protocols.Shadowsocks].includes(outbound.protocol)"
  454. >
  455. <a-form-item label='{{ i18n "password" }}'>
  456. <a-input v-model.trim="outbound.settings.password"></a-input>
  457. </a-form-item>
  458. </template>
  459. <!-- shadowsocks -->
  460. <template v-if="outbound.protocol === Protocols.Shadowsocks">
  461. <a-form-item label='{{ i18n "encryption" }}'>
  462. <a-select
  463. v-model="outbound.settings.method"
  464. :dropdown-class-name="themeSwitcher.currentTheme"
  465. >
  466. <a-select-option
  467. v-for="(method, method_name) in SSMethods"
  468. :value="method"
  469. >[[ method_name ]]</a-select-option
  470. >
  471. </a-select>
  472. </a-form-item>
  473. <a-form-item label="UDP over TCP">
  474. <a-switch v-model="outbound.settings.uot"></a-switch>
  475. </a-form-item>
  476. <a-form-item label="UoTVersion">
  477. <a-input-number
  478. v-model.number="outbound.settings.UoTVersion"
  479. :min="1"
  480. :max="2"
  481. ></a-input-number>
  482. </a-form-item>
  483. </template>
  484. </template>
  485. <!-- hysteria settings -->
  486. <template v-if="outbound.protocol === Protocols.Hysteria">
  487. <a-form-item label="Version">
  488. <a-input-number
  489. v-model.number="outbound.settings.version"
  490. :min="2"
  491. :max="2"
  492. disabled
  493. ></a-input-number>
  494. </a-form-item>
  495. </template>
  496. <!-- stream settings -->
  497. <template v-if="outbound.canEnableStream()">
  498. <a-form-item label='{{ i18n "transmission" }}'>
  499. <a-select
  500. v-model="outbound.stream.network"
  501. @change="streamNetworkChange"
  502. :dropdown-class-name="themeSwitcher.currentTheme"
  503. >
  504. <a-select-option value="tcp">TCP (RAW)</a-select-option>
  505. <a-select-option value="kcp">mKCP</a-select-option>
  506. <a-select-option value="ws">WebSocket</a-select-option>
  507. <a-select-option value="grpc">gRPC</a-select-option>
  508. <a-select-option value="httpupgrade">HTTPUpgrade</a-select-option>
  509. <a-select-option value="xhttp">XHTTP</a-select-option>
  510. <a-select-option
  511. v-if="outbound.protocol === Protocols.Hysteria"
  512. value="hysteria"
  513. >Hysteria2</a-select-option
  514. >
  515. </a-select>
  516. </a-form-item>
  517. <template v-if="outbound.stream.network === 'tcp'">
  518. <a-form-item label='HTTP {{ i18n "camouflage" }}'>
  519. <a-switch
  520. :checked="outbound.stream.tcp.type === 'http'"
  521. @change="checked => outbound.stream.tcp.type = checked ? 'http' : 'none'"
  522. ></a-switch>
  523. </a-form-item>
  524. <template v-if="outbound.stream.tcp.type == 'http'">
  525. <a-form-item label='{{ i18n "host" }}'>
  526. <a-input v-model.trim="outbound.stream.tcp.host"></a-input>
  527. </a-form-item>
  528. <a-form-item label='{{ i18n "path" }}'>
  529. <a-input v-model.trim="outbound.stream.tcp.path"></a-input>
  530. </a-form-item>
  531. </template>
  532. </template>
  533. <!-- kcp -->
  534. <template v-if="outbound.stream.network === 'kcp'">
  535. <a-form-item label="MTU">
  536. <a-input-number
  537. v-model.number="outbound.stream.kcp.mtu"
  538. min="0"
  539. ></a-input-number>
  540. </a-form-item>
  541. <a-form-item label="TTI (ms)">
  542. <a-input-number
  543. v-model.number="outbound.stream.kcp.tti"
  544. min="0"
  545. ></a-input-number>
  546. </a-form-item>
  547. <a-form-item label="Uplink (MB/s)">
  548. <a-input-number
  549. v-model.number="outbound.stream.kcp.upCap"
  550. min="0"
  551. ></a-input-number>
  552. </a-form-item>
  553. <a-form-item label="Downlink (MB/s)">
  554. <a-input-number
  555. v-model.number="outbound.stream.kcp.downCap"
  556. min="0"
  557. ></a-input-number>
  558. </a-form-item>
  559. <a-form-item label="CWND Multiplier">
  560. <a-input-number
  561. v-model.number="outbound.stream.kcp.cwndMultiplier"
  562. min="0"
  563. ></a-input-number>
  564. </a-form-item>
  565. <a-form-item label="Max Sending Window">
  566. <a-input-number
  567. v-model.number="outbound.stream.kcp.maxSendingWindow"
  568. min="0"
  569. ></a-input-number>
  570. </a-form-item>
  571. </template>
  572. <!-- ws -->
  573. <template v-if="outbound.stream.network === 'ws'">
  574. <a-form-item label='{{ i18n "host" }}'>
  575. <a-input v-model="outbound.stream.ws.host"></a-input>
  576. </a-form-item>
  577. <a-form-item label='{{ i18n "path" }}'>
  578. <a-input v-model.trim="outbound.stream.ws.path"></a-input>
  579. </a-form-item>
  580. <a-form-item label="Heartbeat Period">
  581. <a-input-number
  582. v-model.number="outbound.stream.ws.heartbeatPeriod"
  583. :min="0"
  584. ></a-input-number>
  585. </a-form-item>
  586. </template>
  587. <!-- grpc -->
  588. <template v-if="outbound.stream.network === 'grpc'">
  589. <a-form-item label="Service Name">
  590. <a-input v-model.trim="outbound.stream.grpc.serviceName"></a-input>
  591. </a-form-item>
  592. <a-form-item label="Authority">
  593. <a-input v-model.trim="outbound.stream.grpc.authority"></a-input>
  594. </a-form-item>
  595. <a-form-item label="Multi Mode">
  596. <a-switch v-model="outbound.stream.grpc.multiMode"></a-switch>
  597. </a-form-item>
  598. </template>
  599. <!-- httpupgrade -->
  600. <template v-if="outbound.stream.network === 'httpupgrade'">
  601. <a-form-item label='{{ i18n "host" }}'>
  602. <a-input v-model="outbound.stream.httpupgrade.host"></a-input>
  603. </a-form-item>
  604. <a-form-item label='{{ i18n "path" }}'>
  605. <a-input v-model.trim="outbound.stream.httpupgrade.path"></a-input>
  606. </a-form-item>
  607. </template>
  608. <!-- xhttp -->
  609. <template v-if="outbound.stream.network === 'xhttp'">
  610. <a-form-item label='{{ i18n "host" }}'>
  611. <a-input v-model="outbound.stream.xhttp.host"></a-input>
  612. </a-form-item>
  613. <a-form-item label='{{ i18n "path" }}'>
  614. <a-input v-model.trim="outbound.stream.xhttp.path"></a-input>
  615. </a-form-item>
  616. <a-form-item label="Mode">
  617. <a-select
  618. v-model="outbound.stream.xhttp.mode"
  619. :dropdown-class-name="themeSwitcher.currentTheme"
  620. >
  621. <a-select-option v-for="key in MODE_OPTION" :value="key"
  622. >[[ key ]]</a-select-option
  623. >
  624. </a-select>
  625. </a-form-item>
  626. <a-form-item
  627. label="No gRPC Header"
  628. v-if="outbound.stream.xhttp.mode === 'stream-up' || outbound.stream.xhttp.mode === 'stream-one'"
  629. >
  630. <a-switch v-model="outbound.stream.xhttp.noGRPCHeader"></a-switch>
  631. </a-form-item>
  632. <a-form-item
  633. label="Min Upload Interval (Ms)"
  634. v-if="outbound.stream.xhttp.mode === 'packet-up'"
  635. >
  636. <a-input
  637. v-model.trim="outbound.stream.xhttp.scMinPostsIntervalMs"
  638. ></a-input>
  639. </a-form-item>
  640. <a-form-item
  641. label="Max Concurrency"
  642. v-if="!outbound.stream.xhttp.xmux.maxConnections"
  643. >
  644. <a-input
  645. v-model="outbound.stream.xhttp.xmux.maxConcurrency"
  646. ></a-input>
  647. </a-form-item>
  648. <a-form-item
  649. label="Max Connections"
  650. v-if="!outbound.stream.xhttp.xmux.maxConcurrency"
  651. >
  652. <a-input
  653. v-model="outbound.stream.xhttp.xmux.maxConnections"
  654. ></a-input>
  655. </a-form-item>
  656. <a-form-item label="Max Reuse Times">
  657. <a-input
  658. v-model="outbound.stream.xhttp.xmux.cMaxReuseTimes"
  659. ></a-input>
  660. </a-form-item>
  661. <a-form-item label="Max Request Times">
  662. <a-input
  663. v-model="outbound.stream.xhttp.xmux.hMaxRequestTimes"
  664. ></a-input>
  665. </a-form-item>
  666. <a-form-item label="Max Reusable Secs">
  667. <a-input
  668. v-model="outbound.stream.xhttp.xmux.hMaxReusableSecs"
  669. ></a-input>
  670. </a-form-item>
  671. <a-form-item label="Keep Alive Period">
  672. <a-input-number
  673. v-model.number="outbound.stream.xhttp.xmux.hKeepAlivePeriod"
  674. ></a-input-number>
  675. </a-form-item>
  676. </template>
  677. <!-- hysteria -->
  678. <template v-if="outbound.stream.network === 'hysteria'">
  679. <a-form-item label="Auth Password">
  680. <a-input v-model.trim="outbound.stream.hysteria.auth"></a-input>
  681. </a-form-item>
  682. <a-form-item label="Congestion">
  683. <a-select
  684. v-model="outbound.stream.hysteria.congestion"
  685. :dropdown-class-name="themeSwitcher.currentTheme"
  686. >
  687. <a-select-option value>BBR (Auto)</a-select-option>
  688. <a-select-option value="brutal">Brutal</a-select-option>
  689. </a-select>
  690. </a-form-item>
  691. <a-form-item label="Upload Speed">
  692. <a-input
  693. v-model.trim="outbound.stream.hysteria.up"
  694. placeholder="0 (BBR mode), e.g., 100 mbps"
  695. ></a-input>
  696. </a-form-item>
  697. <a-form-item label="Download Speed">
  698. <a-input
  699. v-model.trim="outbound.stream.hysteria.down"
  700. placeholder="0 (BBR mode), e.g., 100 mbps"
  701. ></a-input>
  702. </a-form-item>
  703. <a-form-item label="UDP Hop Port">
  704. <a-input
  705. v-model.trim="outbound.stream.hysteria.udphopPort"
  706. placeholder="e.g., 1145-1919 or 11,13,15-17"
  707. ></a-input>
  708. </a-form-item>
  709. <a-form-item
  710. label="UDP Hop Interval Min (s)"
  711. v-if="outbound.stream.hysteria.udphopPort"
  712. >
  713. <a-input-number
  714. v-model.number="outbound.stream.hysteria.udphopIntervalMin"
  715. :min="5"
  716. ></a-input-number>
  717. </a-form-item>
  718. <a-form-item
  719. label="UDP Hop Interval Max (s)"
  720. v-if="outbound.stream.hysteria.udphopPort"
  721. >
  722. <a-input-number
  723. v-model.number="outbound.stream.hysteria.udphopIntervalMax"
  724. :min="5"
  725. ></a-input-number>
  726. </a-form-item>
  727. <a-form-item label="Init Stream Receive">
  728. <a-input-number
  729. v-model.number="outbound.stream.hysteria.initStreamReceiveWindow"
  730. ></a-input-number>
  731. </a-form-item>
  732. <a-form-item label="Max Stream Receive">
  733. <a-input-number
  734. v-model.number="outbound.stream.hysteria.maxStreamReceiveWindow"
  735. ></a-input-number>
  736. </a-form-item>
  737. <a-form-item label="Init Connection Receive">
  738. <a-input-number
  739. v-model.number="outbound.stream.hysteria.initConnectionReceiveWindow"
  740. ></a-input-number>
  741. </a-form-item>
  742. <a-form-item label="Max Connection Receive">
  743. <a-input-number
  744. v-model.number="outbound.stream.hysteria.maxConnectionReceiveWindow"
  745. ></a-input-number>
  746. </a-form-item>
  747. <a-form-item label="Max Idle Timeout (s)">
  748. <a-input-number
  749. v-model.number="outbound.stream.hysteria.maxIdleTimeout"
  750. :min="4"
  751. :max="120"
  752. ></a-input-number>
  753. </a-form-item>
  754. <a-form-item label="Keep Alive Period (s)">
  755. <a-input-number
  756. v-model.number="outbound.stream.hysteria.keepAlivePeriod"
  757. :min="0"
  758. :max="60"
  759. ></a-input-number>
  760. </a-form-item>
  761. <a-form-item label="Disable Path MTU">
  762. <a-switch
  763. v-model="outbound.stream.hysteria.disablePathMTUDiscovery"
  764. ></a-switch>
  765. </a-form-item>
  766. </template>
  767. </template>
  768. <!-- finalmask settings -->
  769. <template v-if="outbound.canEnableStream()">
  770. <a-form-item
  771. label="UDP Masks"
  772. v-if="outbound.stream.network === 'kcp' || outbound.protocol === Protocols.Hysteria"
  773. >
  774. <a-button
  775. icon="plus"
  776. type="primary"
  777. size="small"
  778. @click="outbound.stream.addUdpMask(outbound.protocol === Protocols.Hysteria ? 'salamander' : 'mkcp-aes128gcm')"
  779. ></a-button>
  780. </a-form-item>
  781. <template
  782. v-if="outbound.stream.finalmask.udp && outbound.stream.finalmask.udp.length > 0"
  783. >
  784. <a-form
  785. v-for="(mask, index) in outbound.stream.finalmask.udp"
  786. :key="index"
  787. :colon="false"
  788. :label-col="{ md: {span:8} }"
  789. :wrapper-col="{ md: {span:14} }"
  790. >
  791. <a-divider :style="{ margin: '0' }">
  792. UDP Mask [[ index + 1 ]]
  793. <a-icon
  794. type="delete"
  795. @click="() => outbound.stream.delUdpMask(index)"
  796. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
  797. ></a-icon>
  798. </a-divider>
  799. <a-form-item label="Type">
  800. <a-select
  801. v-model="mask.type"
  802. @change="(type) => { mask.settings = mask._getDefaultSettings(type, {}); if(outbound.stream.network === 'kcp') { outbound.stream.kcp.mtu = type === 'xdns' ? 900 : 1350; } }"
  803. :dropdown-class-name="themeSwitcher.currentTheme"
  804. >
  805. <a-select-option
  806. v-if="outbound.protocol === Protocols.Hysteria"
  807. value="salamander"
  808. >
  809. Salamander (Hysteria2)</a-select-option
  810. >
  811. <template v-else>
  812. <a-select-option value="mkcp-aes128gcm"
  813. >mKCP AES-128-GCM</a-select-option
  814. >
  815. <a-select-option value="header-dns"
  816. >Header DNS</a-select-option
  817. >
  818. <a-select-option value="header-dtls"
  819. >Header DTLS 1.2</a-select-option
  820. >
  821. <a-select-option value="header-srtp"
  822. >Header SRTP</a-select-option
  823. >
  824. <a-select-option value="header-utp"
  825. >Header uTP</a-select-option
  826. >
  827. <a-select-option value="header-wechat"
  828. >Header WeChat Video</a-select-option
  829. >
  830. <a-select-option value="header-wireguard"
  831. >Header WireGuard</a-select-option
  832. >
  833. <a-select-option value="mkcp-original"
  834. >mKCP Original</a-select-option
  835. >
  836. <a-select-option value="xdns">xDNS</a-select-option>
  837. <a-select-option value="xicmp">xICMP</a-select-option>
  838. <a-select-option value="header-custom"
  839. >Header Custom</a-select-option
  840. >
  841. <a-select-option value="noise">Noise</a-select-option>
  842. <a-select-option value="sudoku">Sudoku</a-select-option>
  843. </template>
  844. </a-select>
  845. </a-form-item>
  846. <a-form-item
  847. label="Password"
  848. v-if="['salamander', 'mkcp-aes128gcm', 'sudoku'].includes(mask.type)"
  849. >
  850. <a-input
  851. v-model.trim="mask.settings.password"
  852. placeholder="Obfuscation password"
  853. ></a-input>
  854. </a-form-item>
  855. <a-form-item
  856. label="Domain"
  857. v-if="['header-dns', 'xdns'].includes(mask.type)"
  858. >
  859. <a-input
  860. v-model.trim="mask.settings.domain"
  861. placeholder="e.g., www.example.com"
  862. ></a-input>
  863. </a-form-item>
  864. <template v-if="mask.type === 'header-custom'">
  865. <a-form-item label="Client">
  866. <a-icon
  867. type="plus"
  868. type="primary"
  869. size="small"
  870. @click="mask.settings.client.push({rand: 0, randRange: '0-255', type: 'array', packet: []})"
  871. />
  872. </a-form-item>
  873. <template v-for="(c, index) in mask.settings.client" :key="index">
  874. <a-divider :style="{ margin: '0' }">
  875. Client [[ index + 1 ]]
  876. <a-icon
  877. type="delete"
  878. @click="() => mask.settings.client.splice(index, 1)"
  879. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
  880. ></a-icon>
  881. </a-divider>
  882. <a-form-item label="Rand">
  883. <a-input-number
  884. v-model.number="c.rand"
  885. :min="0"
  886. ></a-input-number>
  887. </a-form-item>
  888. <a-form-item label="Rand Range">
  889. <a-input
  890. v-model.trim="c.randRange"
  891. placeholder="0-255"
  892. ></a-input>
  893. </a-form-item>
  894. <a-form-item label="Type">
  895. <a-select
  896. v-model="c.type"
  897. :dropdown-class-name="themeSwitcher.currentTheme"
  898. >
  899. <a-select-option value="array">Array</a-select-option>
  900. <a-select-option value="str">String</a-select-option>
  901. <a-select-option value="hex">Hex</a-select-option>
  902. <a-select-option value="base64">Base64</a-select-option>
  903. </a-select>
  904. </a-form-item>
  905. <a-form-item label="Packet">
  906. <a-input v-model.trim="c.packet" placeholder="binary data" />
  907. </a-form-item>
  908. </template>
  909. <a-divider :style="{ margin: '0' }"></a-divider>
  910. <a-form-item label="Server">
  911. <a-icon
  912. type="plus"
  913. type="primary"
  914. size="small"
  915. @click="mask.settings.server.push({rand: 0, randRange: '0-255', type: 'array', packet: []})"
  916. />
  917. </a-form-item>
  918. <template v-for="(s, index) in mask.settings.server" :key="index">
  919. <a-divider :style="{ margin: '0' }">
  920. Server [[ index + 1 ]]
  921. <a-icon
  922. type="delete"
  923. @click="() => mask.settings.server.splice(index, 1)"
  924. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
  925. ></a-icon>
  926. </a-divider>
  927. <a-form-item label="Rand">
  928. <a-input-number
  929. v-model.number="s.rand"
  930. :min="0"
  931. ></a-input-number>
  932. </a-form-item>
  933. <a-form-item label="Rand Range">
  934. <a-input
  935. v-model.trim="s.randRange"
  936. placeholder="0-255"
  937. ></a-input>
  938. </a-form-item>
  939. <a-form-item label="Type">
  940. <a-select
  941. v-model="s.type"
  942. :dropdown-class-name="themeSwitcher.currentTheme"
  943. >
  944. <a-select-option value="array">Array</a-select-option>
  945. <a-select-option value="str">String</a-select-option>
  946. <a-select-option value="hex">Hex</a-select-option>
  947. <a-select-option value="base64">Base64</a-select-option>
  948. </a-select>
  949. </a-form-item>
  950. <a-form-item label="Packet">
  951. <a-input v-model.trim="s.packet" placeholder="binary data" />
  952. </a-form-item>
  953. </template>
  954. </template>
  955. <template v-if="mask.type === 'sudoku'">
  956. <a-form-item label="ASCII">
  957. <a-input
  958. v-model.trim="mask.settings.ascii"
  959. placeholder="ASCII"
  960. ></a-input>
  961. </a-form-item>
  962. <a-form-item label="Custom Table">
  963. <a-input
  964. v-model.trim="mask.settings.customTable"
  965. placeholder="Custom Table"
  966. ></a-input>
  967. </a-form-item>
  968. <a-form-item label="Custom Tables">
  969. <a-input
  970. v-model.trim="mask.settings.customTables"
  971. placeholder="Custom Tables"
  972. ></a-input>
  973. </a-form-item>
  974. <a-form-item label="Padding Min">
  975. <a-input-number
  976. v-model.number="mask.settings.paddingMin"
  977. :min="0"
  978. ></a-input-number>
  979. </a-form-item>
  980. </template>
  981. <template v-if="mask.type === 'noise'">
  982. <a-form-item label="Reset">
  983. <a-input-number v-model.number="mask.settings.reset" :min="0" />
  984. </a-form-item>
  985. <a-form-item label="Noise">
  986. <a-icon
  987. type="plus"
  988. type="primary"
  989. size="small"
  990. @click="mask.settings.noise.push({rand: '1-8192', randRange: '0-255', type: 'array', packet: '', delay: ''})"
  991. />
  992. </a-form-item>
  993. <template v-for="(n, index) in mask.settings.noise" :key="index">
  994. <a-divider :style="{ margin: '0' }">
  995. Noise [[ index + 1 ]]
  996. <a-icon
  997. type="delete"
  998. @click="() => mask.settings.noise.splice(index, 1)"
  999. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"
  1000. ></a-icon>
  1001. </a-divider>
  1002. <a-form-item label="Rand">
  1003. <a-input-number
  1004. v-model.number="n.rand"
  1005. :min="0"
  1006. ></a-input-number>
  1007. </a-form-item>
  1008. <a-form-item label="Rand Range">
  1009. <a-input
  1010. v-model.trim="n.randRange"
  1011. placeholder="0-255"
  1012. ></a-input>
  1013. </a-form-item>
  1014. <a-form-item label="Type">
  1015. <a-select
  1016. v-model="n.type"
  1017. :dropdown-class-name="themeSwitcher.currentTheme"
  1018. >
  1019. <a-select-option value="array">Array</a-select-option>
  1020. <a-select-option value="str">String</a-select-option>
  1021. <a-select-option value="hex">Hex</a-select-option>
  1022. <a-select-option value="base64">Base64</a-select-option>
  1023. </a-select>
  1024. </a-form-item>
  1025. <a-form-item label="Packet">
  1026. <a-input v-model.trim="n.packet" placeholder="binary data" />
  1027. </a-form-item>
  1028. <a-form-item label="Delay">
  1029. <a-input v-model.trim="n.delay" placeholder="10-20" />
  1030. </a-form-item>
  1031. </template>
  1032. </template>
  1033. <template v-if="mask.type === 'xicmp'">
  1034. <a-form-item label="IP">
  1035. <a-input
  1036. v-model.trim="mask.settings.ip"
  1037. placeholder="0.0.0.0"
  1038. ></a-input>
  1039. </a-form-item>
  1040. <a-form-item label="ID">
  1041. <a-input-number
  1042. v-model.number="mask.settings.id"
  1043. :min="0"
  1044. ></a-input-number>
  1045. </a-form-item>
  1046. </template>
  1047. </a-form>
  1048. </template>
  1049. </template>
  1050. <!-- tls settings -->
  1051. <template v-if="outbound.canEnableTls()">
  1052. <a-form-item label='{{ i18n "security" }}'>
  1053. <a-radio-group
  1054. v-model="outbound.stream.security"
  1055. button-style="solid"
  1056. >
  1057. <a-radio-button value="none">{{ i18n "none" }}</a-radio-button>
  1058. <a-radio-button value="tls">TLS</a-radio-button>
  1059. <a-radio-button v-if="outbound.canEnableReality()" value="reality"
  1060. >Reality</a-radio-button
  1061. >
  1062. </a-radio-group>
  1063. </a-form-item>
  1064. <template v-if="outbound.stream.isTls">
  1065. <a-form-item label="SNI" placeholder="Server Name Indication">
  1066. <a-input v-model.trim="outbound.stream.tls.serverName"></a-input>
  1067. </a-form-item>
  1068. <a-form-item label="uTLS">
  1069. <a-select
  1070. v-model="outbound.stream.tls.fingerprint"
  1071. :dropdown-class-name="themeSwitcher.currentTheme"
  1072. >
  1073. <a-select-option value>None</a-select-option>
  1074. <a-select-option v-for="key in UTLS_FINGERPRINT" :value="key"
  1075. >[[ key ]]</a-select-option
  1076. >
  1077. </a-select>
  1078. </a-form-item>
  1079. <a-form-item label="ALPN">
  1080. <a-select
  1081. mode="multiple"
  1082. :dropdown-class-name="themeSwitcher.currentTheme"
  1083. v-model="outbound.stream.tls.alpn"
  1084. >
  1085. <a-select-option v-for="alpn in ALPN_OPTION" :value="alpn"
  1086. >[[ alpn ]]</a-select-option
  1087. >
  1088. </a-select>
  1089. </a-form-item>
  1090. <a-form-item label="ECH Config List">
  1091. <a-input v-model.trim="outbound.stream.tls.echConfigList"></a-input>
  1092. </a-form-item>
  1093. <a-form-item label="verify Peer Cert By Name">
  1094. <a-input
  1095. v-model.trim="outbound.stream.tls.verifyPeerCertByName"
  1096. placeholder="cloudflare-dns.com"
  1097. ></a-input>
  1098. </a-form-item>
  1099. <a-form-item label=" pinned Peer Cert Sha256">
  1100. <a-input
  1101. v-model.trim="outbound.stream.tls.pinnedPeerCertSha256"
  1102. placeholder="Enter SHA256 fingerprints (base64)"
  1103. >
  1104. </a-input>
  1105. </a-form-item>
  1106. </template>
  1107. <!-- reality settings -->
  1108. <template v-if="outbound.stream.isReality">
  1109. <a-form-item label="SNI">
  1110. <a-input
  1111. v-model.trim="outbound.stream.reality.serverName"
  1112. ></a-input>
  1113. </a-form-item>
  1114. <a-form-item label="uTLS">
  1115. <a-select
  1116. v-model="outbound.stream.reality.fingerprint"
  1117. :dropdown-class-name="themeSwitcher.currentTheme"
  1118. >
  1119. <a-select-option v-for="key in UTLS_FINGERPRINT" :value="key"
  1120. >[[ key ]]</a-select-option
  1121. >
  1122. </a-select>
  1123. </a-form-item>
  1124. <a-form-item label="Short ID">
  1125. <a-input v-model.trim="outbound.stream.reality.shortId"></a-input>
  1126. </a-form-item>
  1127. <a-form-item label="SpiderX">
  1128. <a-input v-model.trim="outbound.stream.reality.spiderX"></a-input>
  1129. </a-form-item>
  1130. <a-form-item label="Public Key">
  1131. <a-textarea
  1132. v-model.trim="outbound.stream.reality.publicKey"
  1133. ></a-textarea>
  1134. </a-form-item>
  1135. <a-form-item label="mldsa65 Verify">
  1136. <a-textarea
  1137. v-model.trim="outbound.stream.reality.mldsa65Verify"
  1138. ></a-textarea>
  1139. </a-form-item>
  1140. </template>
  1141. </template>
  1142. <!-- sockopt settings -->
  1143. <a-form-item label="Sockopts">
  1144. <a-switch v-model="outbound.stream.sockoptSwitch"></a-switch>
  1145. </a-form-item>
  1146. <template v-if="outbound.stream.sockoptSwitch">
  1147. <a-form-item label="Dialer Proxy">
  1148. <a-select
  1149. v-model="outbound.stream.sockopt.dialerProxy"
  1150. :dropdown-class-name="themeSwitcher.currentTheme"
  1151. >
  1152. <a-select-option v-for="tag in ['', ...outModal.tags]" :value="tag"
  1153. >[[ tag ]]</a-select-option
  1154. >
  1155. </a-select>
  1156. </a-form-item>
  1157. <a-form-item label="Address Port Strategy">
  1158. <a-select
  1159. v-model="outbound.stream.sockopt.addressPortStrategy"
  1160. :dropdown-class-name="themeSwitcher.currentTheme"
  1161. >
  1162. <a-select-option v-for="key in Address_Port_Strategy" :value="key"
  1163. >[[ key ]]</a-select-option
  1164. >
  1165. </a-select>
  1166. </a-form-item>
  1167. <a-form-item label="Keep Alive Interval">
  1168. <a-input-number
  1169. v-model.number="outbound.stream.sockopt.tcpKeepAliveInterval"
  1170. :min="0"
  1171. ></a-input-number>
  1172. </a-form-item>
  1173. <a-form-item label="TCP Fast Open">
  1174. <a-switch v-model="outbound.stream.sockopt.tcpFastOpen"></a-switch>
  1175. </a-form-item>
  1176. <a-form-item label="Multipath TCP">
  1177. <a-switch v-model.trim="outbound.stream.sockopt.tcpMptcp"></a-switch>
  1178. </a-form-item>
  1179. <a-form-item label="Penetrate">
  1180. <a-switch v-model="outbound.stream.sockopt.penetrate"></a-switch>
  1181. </a-form-item>
  1182. <a-form-item label="Trusted X-Forwarded-For">
  1183. <a-select
  1184. mode="tags"
  1185. v-model="outbound.stream.sockopt.trustedXForwardedFor"
  1186. :style="{ width: '100%' }"
  1187. :dropdown-class-name="themeSwitcher.currentTheme"
  1188. >
  1189. <a-select-option value="CF-Connecting-IP"
  1190. >CF-Connecting-IP</a-select-option
  1191. >
  1192. <a-select-option value="X-Real-IP">X-Real-IP</a-select-option>
  1193. <a-select-option value="True-Client-IP"
  1194. >True-Client-IP</a-select-option
  1195. >
  1196. <a-select-option value="X-Client-IP">X-Client-IP</a-select-option>
  1197. </a-select>
  1198. </a-form-item>
  1199. </template>
  1200. <!-- mux settings -->
  1201. <template v-if="outbound.canEnableMux()">
  1202. <a-form-item label="Mux">
  1203. <a-switch v-model="outbound.mux.enabled"></a-switch>
  1204. </a-form-item>
  1205. <template v-if="outbound.mux.enabled">
  1206. <a-form-item label="Concurrency">
  1207. <a-input-number
  1208. v-model.number="outbound.mux.concurrency"
  1209. :min="-1"
  1210. :max="1024"
  1211. ></a-input-number>
  1212. </a-form-item>
  1213. <a-form-item label="xudp Concurrency">
  1214. <a-input-number
  1215. v-model.number="outbound.mux.xudpConcurrency"
  1216. :min="-1"
  1217. :max="1024"
  1218. ></a-input-number>
  1219. </a-form-item>
  1220. <a-form-item label="xudp UDP 443">
  1221. <a-select
  1222. v-model="outbound.mux.xudpProxyUDP443"
  1223. :dropdown-class-name="themeSwitcher.currentTheme"
  1224. >
  1225. <a-select-option
  1226. v-for="c in ['reject', 'allow', 'skip']"
  1227. :value="c"
  1228. >[[ c ]]</a-select-option
  1229. >
  1230. </a-select>
  1231. </a-form-item>
  1232. </template>
  1233. </template>
  1234. </a-form>
  1235. </a-tab-pane>
  1236. <a-tab-pane key="2" tab="JSON" force-render="true">
  1237. <a-space direction="vertical" :size="10" :style="{ marginTop: '10px' }">
  1238. <a-input
  1239. addon-before='{{ i18n "pages.xray.outbound.link" }}'
  1240. v-model.trim="outModal.link"
  1241. placeholder="vmess:// vless:// trojan:// ss:// hysteria2://"
  1242. >
  1243. <a-icon slot="addonAfter" type="form" @click="convertLink"></a-icon>
  1244. </a-input>
  1245. <textarea
  1246. :style="{ position: 'absolute', left: '-800px' }"
  1247. id="outboundJson"
  1248. ></textarea>
  1249. </a-space>
  1250. </a-tab-pane>
  1251. </a-tabs>
  1252. {{end}}