outbound.html 50 KB

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