1
0

outbound.html 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783
  1. {{define "form/outbound"}}
  2. <!-- base -->
  3. <a-tabs :active-key="outModal.activeKey"
  4. :style="{ padding: '0', backgroundColor: 'transparent' }"
  5. @change="(activeKey) => {outModal.toggleJson(activeKey == '2'); }">
  6. <a-tab-pane key="1" tab="Form">
  7. <a-form :colon="false" :label-col="{ md: {span:8} }"
  8. :wrapper-col="{ md: {span:14} }">
  9. <a-form-item label='{{ i18n "protocol" }}'>
  10. <a-select v-model="outbound.protocol"
  11. :dropdown-class-name="themeSwitcher.currentTheme">
  12. <a-select-option v-for="x,y in Protocols" :value="x">[[ y
  13. ]]</a-select-option>
  14. </a-select>
  15. </a-form-item>
  16. <a-form-item label='{{ i18n "pages.xray.outbound.tag" }}' has-feedback
  17. :validate-status="outModal.duplicateTag? 'warning' : 'success'">
  18. <a-input v-model.trim="outbound.tag" @change="outModal.check()"
  19. placeholder='{{ i18n "pages.xray.outbound.tagDesc" }}'></a-input>
  20. </a-form-item>
  21. <a-form-item label='{{ i18n "pages.xray.outbound.sendThrough" }}'>
  22. <a-input v-model="outbound.sendThrough"></a-input>
  23. </a-form-item>
  24. <!-- freedom settings-->
  25. <template v-if="outbound.protocol === Protocols.Freedom">
  26. <a-form-item label='Strategy'>
  27. <a-select v-model="outbound.settings.domainStrategy"
  28. :dropdown-class-name="themeSwitcher.currentTheme">
  29. <a-select-option v-for="s in OutboundDomainStrategies" :value="s">[[
  30. s ]]</a-select-option>
  31. </a-select>
  32. </a-form-item>
  33. <a-form-item label='Redirect'>
  34. <a-input v-model="outbound.settings.redirect"></a-input>
  35. </a-form-item>
  36. <a-form-item label='Fragment'>
  37. <a-switch :checked="Object.keys(outbound.settings.fragment).length >0"
  38. @change="checked => outbound.settings.fragment = checked ? new Outbound.FreedomSettings.Fragment() : {}">
  39. </a-switch>
  40. </a-form-item>
  41. <template v-if="Object.keys(outbound.settings.fragment).length >0">
  42. <a-form-item label='Packets'>
  43. <a-select v-model="outbound.settings.fragment.packets"
  44. :dropdown-class-name="themeSwitcher.currentTheme">
  45. <a-select-option v-for="s in ['1-3','tlshello']" :value="s">[[ s
  46. ]]</a-select-option>
  47. </a-select>
  48. </a-form-item>
  49. <a-form-item label='Length'>
  50. <a-input v-model.trim="outbound.settings.fragment.length"></a-input>
  51. </a-form-item>
  52. <a-form-item label='Interval'>
  53. <a-input
  54. v-model.trim="outbound.settings.fragment.interval"></a-input>
  55. </a-form-item>
  56. <a-form-item label='Max Split'>
  57. <a-input
  58. v-model.trim="outbound.settings.fragment.maxSplit"></a-input>
  59. </a-form-item>
  60. </template>
  61. <!-- Switch for Noises -->
  62. <a-form-item label='Noises'>
  63. <a-switch :checked="outbound.settings.noises.length > 0"
  64. @change="checked => outbound.settings.noises = checked ? [new Outbound.FreedomSettings.Noise()] : []">
  65. </a-switch>
  66. </a-form-item>
  67. <!-- Add Noise Button -->
  68. <template v-if="outbound.settings.noises.length > 0">
  69. <a-form-item label="Noises">
  70. <a-button icon="plus" type="primary" size="small"
  71. @click="outbound.settings.addNoise()"></a-button>
  72. </a-form-item>
  73. <!-- Noise Configurations -->
  74. <a-form v-for="(noise, index) in outbound.settings.noises"
  75. :key="index" :colon="false"
  76. :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }">
  77. <a-divider :style="{ margin: '0' }"> Noise [[ index + 1 ]]
  78. <a-icon v-if="outbound.settings.noises.length > 1" type="delete"
  79. @click="() => outbound.settings.delNoise(index)"
  80. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"></a-icon>
  81. </a-divider>
  82. <a-form-item label='Type'>
  83. <a-select v-model="noise.type"
  84. :dropdown-class-name="themeSwitcher.currentTheme">
  85. <a-select-option v-for="s in ['rand','base64','str', 'hex']"
  86. :value="s">[[ s ]]</a-select-option>
  87. </a-select>
  88. </a-form-item>
  89. <a-form-item label='Packet'>
  90. <a-input v-model.trim="noise.packet"></a-input>
  91. </a-form-item>
  92. <a-form-item label='Delay'>
  93. <a-input v-model.trim="noise.delay"></a-input>
  94. </a-form-item>
  95. <a-form-item label='Apply To'>
  96. <a-select v-model="noise.applyTo"
  97. :dropdown-class-name="themeSwitcher.currentTheme">
  98. <a-select-option v-for="s in ['ip','ipv4','ipv6']" :value="s">[[
  99. s ]]</a-select-option>
  100. </a-select>
  101. </a-form-item>
  102. </a-form>
  103. </template>
  104. </template>
  105. <!-- blackhole settings -->
  106. <template v-if="outbound.protocol === Protocols.Blackhole">
  107. <a-form-item label='Response Type'>
  108. <a-select v-model="outbound.settings.type"
  109. :dropdown-class-name="themeSwitcher.currentTheme">
  110. <a-select-option v-for="s in ['', 'none','http']" :value="s">[[ s
  111. ]]</a-select-option>
  112. </a-select>
  113. </a-form-item>
  114. </template>
  115. <!-- dns settings -->
  116. <template v-if="outbound.protocol === Protocols.DNS">
  117. <a-form-item label='{{ i18n "pages.inbounds.network" }}'>
  118. <a-select v-model="outbound.settings.network"
  119. :dropdown-class-name="themeSwitcher.currentTheme">
  120. <a-select-option v-for="s in ['udp','tcp']" :value="s">[[ s
  121. ]]</a-select-option>
  122. </a-select>
  123. </a-form-item>
  124. <a-form-item label='non-IP queries'>
  125. <a-select v-model="outbound.settings.nonIPQuery"
  126. :dropdown-class-name="themeSwitcher.currentTheme">
  127. <a-select-option v-for="s in ['reject','drop','skip']" :value="s">[[
  128. s ]]</a-select-option>
  129. </a-select>
  130. </a-form-item>
  131. <a-form-item v-if="outbound.settings.nonIPQuery === 'skip'"
  132. label='Block Types'>
  133. <a-input v-model.number="outbound.settings.blockTypes"></a-input>
  134. </a-form-item>
  135. </template>
  136. <!-- wireguard settings -->
  137. <template v-if="outbound.protocol === Protocols.Wireguard">
  138. <a-form-item>
  139. <template slot="label">
  140. <a-tooltip>
  141. <template slot="title">
  142. <span>{{ i18n "pages.xray.rules.useComma" }}</span>
  143. </template>
  144. {{ i18n "pages.xray.outbound.address" }}
  145. <a-icon type="question-circle"></a-icon>
  146. </a-tooltip>
  147. </template>
  148. <a-input v-model.trim="outbound.settings.address"></a-input>
  149. </a-form-item>
  150. <a-form-item>
  151. <template slot="label">
  152. <a-tooltip>
  153. <template slot="title">
  154. <span>{{ i18n "reset" }}</span>
  155. </template>
  156. {{ i18n "pages.xray.wireguard.secretKey" }}
  157. <a-icon type="sync"
  158. @click="[outbound.settings.pubKey, outbound.settings.secretKey] = Object.values(Wireguard.generateKeypair())">
  159. </a-icon>
  160. </a-tooltip>
  161. </template>
  162. <a-input v-model.trim="outbound.settings.secretKey"></a-input>
  163. </a-form-item>
  164. <a-form-item label='{{ i18n "pages.xray.wireguard.publicKey" }}'>
  165. <a-input disabled v-model="outbound.settings.pubKey"></a-input>
  166. </a-form-item>
  167. <a-form-item label='{{ i18n "pages.xray.wireguard.domainStrategy" }}'>
  168. <a-select v-model="outbound.settings.domainStrategy"
  169. :dropdown-class-name="themeSwitcher.currentTheme">
  170. <a-select-option v-for="wds in ['', ...WireguardDomainStrategy]"
  171. :value="wds">[[ wds ]]</a-select-option>
  172. </a-select>
  173. </a-form-item>
  174. <a-form-item label='MTU'>
  175. <a-input-number v-model.number="outbound.settings.mtu"
  176. min="0"></a-input-number>
  177. </a-form-item>
  178. <a-form-item label='Workers'>
  179. <a-input-number v-model.number="outbound.settings.workers"
  180. min="0"></a-input-number>
  181. </a-form-item>
  182. <a-form-item label='No Kernel Tun'>
  183. <a-switch v-model="outbound.settings.noKernelTun"></a-switch>
  184. </a-form-item>
  185. <a-form-item>
  186. <template slot="label">
  187. <a-tooltip>
  188. <template slot="title">
  189. <span>{{ i18n "pages.xray.rules.useComma" }}</span>
  190. </template> Reserved <a-icon type="question-circle"></a-icon>
  191. </a-tooltip>
  192. </template>
  193. <a-input v-model="outbound.settings.reserved"></a-input>
  194. </a-form-item>
  195. <a-form-item label="Peers">
  196. <a-button icon="plus" type="primary" size="small"
  197. @click="outbound.settings.addPeer()"></a-button>
  198. </a-form-item>
  199. <a-form v-for="(peer, index) in outbound.settings.peers" :colon="false"
  200. :label-col="{ md: {span:8} }"
  201. :wrapper-col="{ md: {span:14} }">
  202. <a-divider :style="{ margin: '0' }"> Peer [[ index + 1 ]] <a-icon
  203. v-if="outbound.settings.peers.length>1"
  204. type="delete" @click="() => outbound.settings.delPeer(index)"
  205. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"></a-icon>
  206. </a-divider>
  207. <a-form-item label='{{ i18n "pages.xray.wireguard.endpoint" }}'>
  208. <a-input v-model.trim="peer.endpoint"></a-input>
  209. </a-form-item>
  210. <a-form-item label='{{ i18n "pages.xray.wireguard.publicKey" }}'>
  211. <a-input v-model.trim="peer.publicKey"></a-input>
  212. </a-form-item>
  213. <a-form-item label='{{ i18n "pages.xray.wireguard.psk" }}'>
  214. <a-input v-model.trim="peer.psk"></a-input>
  215. </a-form-item>
  216. <a-form-item>
  217. <template slot="label">
  218. {{ i18n "pages.xray.wireguard.allowedIPs" }}
  219. <a-button icon="plus" type="primary" size="small"
  220. @click="peer.allowedIPs.push('')"></a-button>
  221. </template>
  222. <template v-for="(aip, index) in peer.allowedIPs"
  223. :style="{ marginBottom: '10px' }">
  224. <a-input v-model.trim="peer.allowedIPs[index]">
  225. <a-button icon="minus" v-if="peer.allowedIPs.length>1"
  226. slot="addonAfter" size="small"
  227. @click="peer.allowedIPs.splice(index, 1)"></a-button>
  228. </a-input>
  229. </template>
  230. </a-form-item>
  231. <a-form-item label='Keep Alive'>
  232. <a-input-number v-model.number="peer.keepAlive"
  233. :min="0"></a-input-number>
  234. </a-form-item>
  235. </a-form>
  236. </template>
  237. <!-- Address + Port -->
  238. <template v-if="outbound.hasAddressPort()">
  239. <a-form-item label='{{ i18n "pages.inbounds.address" }}'>
  240. <a-input v-model.trim="outbound.settings.address"></a-input>
  241. </a-form-item>
  242. <a-form-item label='{{ i18n "pages.inbounds.port" }}'>
  243. <a-input-number v-model.number="outbound.settings.port" :min="1"
  244. :max="65532"></a-input-number>
  245. </a-form-item>
  246. </template>
  247. <!-- VLESS/VMess user settings -->
  248. <template
  249. v-if="[Protocols.VMess, Protocols.VLESS].includes(outbound.protocol)">
  250. <a-form-item label='ID'>
  251. <a-input v-model.trim="outbound.settings.id"></a-input>
  252. </a-form-item>
  253. <!-- vmess settings -->
  254. <template v-if="outbound.protocol === Protocols.VMess">
  255. <a-form-item label='Security'>
  256. <a-select v-model="outbound.settings.security"
  257. :dropdown-class-name="themeSwitcher.currentTheme">
  258. <a-select-option v-for="key in USERS_SECURITY" :value="key">[[ key
  259. ]]</a-select-option>
  260. </a-select>
  261. </a-form-item>
  262. </template>
  263. <!-- vless settings -->
  264. <template v-if="outbound.protocol === Protocols.VLESS">
  265. <a-form-item label='encryption'>
  266. <a-input v-model.trim="outbound.settings.encryption"></a-input>
  267. </a-form-item>
  268. </template>
  269. <template v-if="outbound.canEnableTlsFlow()">
  270. <a-form-item label='Flow'>
  271. <a-select v-model="outbound.settings.flow"
  272. :dropdown-class-name="themeSwitcher.currentTheme">
  273. <a-select-option value selected>{{ i18n "none"
  274. }}</a-select-option>
  275. <a-select-option v-for="key in TLS_FLOW_CONTROL" :value="key">[[
  276. key ]]</a-select-option>
  277. </a-select>
  278. </a-form-item>
  279. </template>
  280. <!-- XTLS Vision Advanced Settings -->
  281. <template v-if="outbound.canEnableVisionSeed()">
  282. <a-form-item label="Vision Pre-Connect">
  283. <a-input-number v-model.number="outbound.settings.testpre" :min="0"
  284. :max="10" :style="{ width: '100%' }"
  285. placeholder="0"></a-input-number>
  286. </a-form-item>
  287. <a-form-item label="Vision Seed">
  288. <a-row :gutter="8">
  289. <a-col :span="6">
  290. <a-input-number v-model.number="outbound.settings.testseed[0]"
  291. :min="0" :max="9999"
  292. :style="{ width: '100%' }" placeholder="900"
  293. addon-before="[0]"></a-input-number>
  294. </a-col>
  295. <a-col :span="6">
  296. <a-input-number v-model.number="outbound.settings.testseed[1]"
  297. :min="0" :max="9999"
  298. :style="{ width: '100%' }" placeholder="500"
  299. addon-before="[1]"></a-input-number>
  300. </a-col>
  301. <a-col :span="6">
  302. <a-input-number v-model.number="outbound.settings.testseed[2]"
  303. :min="0" :max="9999"
  304. :style="{ width: '100%' }" placeholder="900"
  305. addon-before="[2]"></a-input-number>
  306. </a-col>
  307. <a-col :span="6">
  308. <a-input-number v-model.number="outbound.settings.testseed[3]"
  309. :min="0" :max="9999"
  310. :style="{ width: '100%' }" placeholder="256"
  311. addon-before="[3]"></a-input-number>
  312. </a-col>
  313. </a-row>
  314. </a-form-item>
  315. </template>
  316. </template>
  317. <!-- Servers (trojan/shadowsocks/socks/http) settings -->
  318. <template v-if="outbound.hasServers()">
  319. <!-- http / socks -->
  320. <template v-if="outbound.hasUsername()">
  321. <a-form-item label='{{ i18n "username" }}'>
  322. <a-input v-model.trim="outbound.settings.user"></a-input>
  323. </a-form-item>
  324. <a-form-item label='{{ i18n "password" }}'>
  325. <a-input v-model.trim="outbound.settings.pass"></a-input>
  326. </a-form-item>
  327. </template>
  328. <!-- trojan/shadowsocks -->
  329. <template
  330. v-if="[Protocols.Trojan, Protocols.Shadowsocks].includes(outbound.protocol)">
  331. <a-form-item label='{{ i18n "password" }}'>
  332. <a-input v-model.trim="outbound.settings.password"></a-input>
  333. </a-form-item>
  334. </template>
  335. <!-- shadowsocks -->
  336. <template v-if="outbound.protocol === Protocols.Shadowsocks">
  337. <a-form-item label='{{ i18n "encryption" }}'>
  338. <a-select v-model="outbound.settings.method"
  339. :dropdown-class-name="themeSwitcher.currentTheme">
  340. <a-select-option v-for="(method, method_name) in SSMethods"
  341. :value="method">[[ method_name
  342. ]]</a-select-option>
  343. </a-select>
  344. </a-form-item>
  345. <a-form-item label='UDP over TCP'>
  346. <a-switch v-model="outbound.settings.uot"></a-switch>
  347. </a-form-item>
  348. <a-form-item label='UoTVersion'>
  349. <a-input-number v-model.number="outbound.settings.UoTVersion"
  350. :min="1" :max="2"></a-input-number>
  351. </a-form-item>
  352. </template>
  353. </template>
  354. <!-- hysteria settings -->
  355. <template v-if="outbound.protocol === Protocols.Hysteria">
  356. <a-form-item label='Version'>
  357. <a-input-number v-model.number="outbound.settings.version" :min="2"
  358. :max="2" disabled></a-input-number>
  359. </a-form-item>
  360. </template>
  361. <!-- stream settings -->
  362. <template v-if="outbound.canEnableStream()">
  363. <a-form-item label='{{ i18n "transmission" }}'>
  364. <a-select v-model="outbound.stream.network"
  365. @change="streamNetworkChange"
  366. :dropdown-class-name="themeSwitcher.currentTheme">
  367. <a-select-option value="tcp">TCP (RAW)</a-select-option>
  368. <a-select-option value="kcp">mKCP</a-select-option>
  369. <a-select-option value="ws">WebSocket</a-select-option>
  370. <a-select-option value="grpc">gRPC</a-select-option>
  371. <a-select-option value="httpupgrade">HTTPUpgrade</a-select-option>
  372. <a-select-option value="xhttp">XHTTP</a-select-option>
  373. <a-select-option v-if="outbound.protocol === Protocols.Hysteria"
  374. value="hysteria">Hysteria2</a-select-option>
  375. </a-select>
  376. </a-form-item>
  377. <template v-if="outbound.stream.network === 'tcp'">
  378. <a-form-item label='HTTP {{ i18n "camouflage" }}'>
  379. <a-switch :checked="outbound.stream.tcp.type === 'http'"
  380. @change="checked => outbound.stream.tcp.type = checked ? 'http' : 'none'"></a-switch>
  381. </a-form-item>
  382. <template v-if="outbound.stream.tcp.type == 'http'">
  383. <a-form-item label='{{ i18n "host" }}'>
  384. <a-input v-model.trim="outbound.stream.tcp.host"></a-input>
  385. </a-form-item>
  386. <a-form-item label='{{ i18n "path" }}'>
  387. <a-input v-model.trim="outbound.stream.tcp.path"></a-input>
  388. </a-form-item>
  389. </template>
  390. </template>
  391. <!-- kcp -->
  392. <template v-if="outbound.stream.network === 'kcp'">
  393. <a-form-item label='{{ i18n "camouflage" }}'>
  394. <a-select v-model="outbound.stream.kcp.type"
  395. :dropdown-class-name="themeSwitcher.currentTheme">
  396. <a-select-option value="none">None</a-select-option>
  397. <a-select-option value="srtp">SRTP</a-select-option>
  398. <a-select-option value="utp">uTP</a-select-option>
  399. <a-select-option value="wechat-video">WeChat</a-select-option>
  400. <a-select-option value="dtls">DTLS 1.2</a-select-option>
  401. <a-select-option value="wireguard">WireGuard</a-select-option>
  402. <a-select-option value="dns">DNS</a-select-option>
  403. </a-select>
  404. </a-form-item>
  405. <a-form-item label='{{ i18n "password" }}'>
  406. <a-input v-model="outbound.stream.kcp.seed"></a-input>
  407. </a-form-item>
  408. <a-form-item label='MTU'>
  409. <a-input-number v-model.number="outbound.stream.kcp.mtu"
  410. min="0"></a-input-number>
  411. </a-form-item>
  412. <a-form-item label='TTI (ms)'>
  413. <a-input-number v-model.number="outbound.stream.kcp.tti"
  414. min="0"></a-input-number>
  415. </a-form-item>
  416. <a-form-item label='Uplink (MB/s)'>
  417. <a-input-number v-model.number="outbound.stream.kcp.upCap"
  418. min="0"></a-input-number>
  419. </a-form-item>
  420. <a-form-item label='Downlink (MB/s)'>
  421. <a-input-number v-model.number="outbound.stream.kcp.downCap"
  422. min="0"></a-input-number>
  423. </a-form-item>
  424. <a-form-item label='Congestion'>
  425. <a-switch v-model="outbound.stream.kcp.congestion"></a-switch>
  426. </a-form-item>
  427. <a-form-item label='Read Buffer (MB)'>
  428. <a-input-number v-model.number="outbound.stream.kcp.readBuffer"
  429. min="0"></a-input-number>
  430. </a-form-item>
  431. <a-form-item label='Write Buffer (MB)'>
  432. <a-input-number v-model.number="outbound.stream.kcp.writeBuffer"
  433. min="0"></a-input-number>
  434. </a-form-item>
  435. </template>
  436. <!-- ws -->
  437. <template v-if="outbound.stream.network === 'ws'">
  438. <a-form-item label='{{ i18n "host" }}'>
  439. <a-input v-model="outbound.stream.ws.host"></a-input>
  440. </a-form-item>
  441. <a-form-item label='{{ i18n "path" }}'>
  442. <a-input v-model.trim="outbound.stream.ws.path"></a-input>
  443. </a-form-item>
  444. <a-form-item label='Heartbeat Period'>
  445. <a-input-number v-model.number="outbound.stream.ws.heartbeatPeriod"
  446. :min="0"></a-input-number>
  447. </a-form-item>
  448. </template>
  449. <!-- grpc -->
  450. <template v-if="outbound.stream.network === 'grpc'">
  451. <a-form-item label='Service Name'>
  452. <a-input v-model.trim="outbound.stream.grpc.serviceName"></a-input>
  453. </a-form-item>
  454. <a-form-item label="Authority">
  455. <a-input v-model.trim="outbound.stream.grpc.authority"></a-input>
  456. </a-form-item>
  457. <a-form-item label='Multi Mode'>
  458. <a-switch v-model="outbound.stream.grpc.multiMode"></a-switch>
  459. </a-form-item>
  460. </template>
  461. <!-- httpupgrade -->
  462. <template v-if="outbound.stream.network === 'httpupgrade'">
  463. <a-form-item label='{{ i18n "host" }}'>
  464. <a-input v-model="outbound.stream.httpupgrade.host"></a-input>
  465. </a-form-item>
  466. <a-form-item label='{{ i18n "path" }}'>
  467. <a-input v-model.trim="outbound.stream.httpupgrade.path"></a-input>
  468. </a-form-item>
  469. </template>
  470. <!-- xhttp -->
  471. <template v-if="outbound.stream.network === 'xhttp'">
  472. <a-form-item label='{{ i18n "host" }}'>
  473. <a-input v-model="outbound.stream.xhttp.host"></a-input>
  474. </a-form-item>
  475. <a-form-item label='{{ i18n "path" }}'>
  476. <a-input v-model.trim="outbound.stream.xhttp.path"></a-input>
  477. </a-form-item>
  478. <a-form-item label='Mode'>
  479. <a-select v-model="outbound.stream.xhttp.mode"
  480. :dropdown-class-name="themeSwitcher.currentTheme">
  481. <a-select-option v-for="key in MODE_OPTION" :value="key">[[ key
  482. ]]</a-select-option>
  483. </a-select>
  484. </a-form-item>
  485. <a-form-item label="No gRPC Header"
  486. v-if="outbound.stream.xhttp.mode === 'stream-up' || outbound.stream.xhttp.mode === 'stream-one'">
  487. <a-switch v-model="outbound.stream.xhttp.noGRPCHeader"></a-switch>
  488. </a-form-item>
  489. <a-form-item label="Min Upload Interval (Ms)"
  490. v-if="outbound.stream.xhttp.mode === 'packet-up'">
  491. <a-input
  492. v-model.trim="outbound.stream.xhttp.scMinPostsIntervalMs"></a-input>
  493. </a-form-item>
  494. <a-form-item label="Max Concurrency"
  495. v-if="!outbound.stream.xhttp.xmux.maxConnections">
  496. <a-input
  497. v-model="outbound.stream.xhttp.xmux.maxConcurrency"></a-input>
  498. </a-form-item>
  499. <a-form-item label="Max Connections"
  500. v-if="!outbound.stream.xhttp.xmux.maxConcurrency">
  501. <a-input
  502. v-model="outbound.stream.xhttp.xmux.maxConnections"></a-input>
  503. </a-form-item>
  504. <a-form-item label="Max Reuse Times">
  505. <a-input
  506. v-model="outbound.stream.xhttp.xmux.cMaxReuseTimes"></a-input>
  507. </a-form-item>
  508. <a-form-item label="Max Request Times">
  509. <a-input
  510. v-model="outbound.stream.xhttp.xmux.hMaxRequestTimes"></a-input>
  511. </a-form-item>
  512. <a-form-item label="Max Reusable Secs">
  513. <a-input
  514. v-model="outbound.stream.xhttp.xmux.hMaxReusableSecs"></a-input>
  515. </a-form-item>
  516. <a-form-item label='Keep Alive Period'>
  517. <a-input-number
  518. v-model.number="outbound.stream.xhttp.xmux.hKeepAlivePeriod"></a-input-number>
  519. </a-form-item>
  520. </template>
  521. <!-- hysteria -->
  522. <template v-if="outbound.stream.network === 'hysteria'">
  523. <a-form-item label='Auth Password'>
  524. <a-input v-model.trim="outbound.stream.hysteria.auth"></a-input>
  525. </a-form-item>
  526. <a-form-item label='Congestion'>
  527. <a-select v-model="outbound.stream.hysteria.congestion" :dropdown-class-name="themeSwitcher.currentTheme">
  528. <a-select-option value="">BBR (Auto)</a-select-option>
  529. <a-select-option value="brutal">Brutal</a-select-option>
  530. </a-select>
  531. </a-form-item>
  532. <a-form-item label='Upload Speed'>
  533. <a-input v-model.trim="outbound.stream.hysteria.up"
  534. placeholder="0 (BBR mode), e.g., 100 mbps"></a-input>
  535. </a-form-item>
  536. <a-form-item label='Download Speed'>
  537. <a-input v-model.trim="outbound.stream.hysteria.down"
  538. placeholder="0 (BBR mode), e.g., 100 mbps"></a-input>
  539. </a-form-item>
  540. <a-form-item label='UDP Hop Port'>
  541. <a-input v-model.trim="outbound.stream.hysteria.udphopPort"
  542. placeholder="e.g., 1145-1919 or 11,13,15-17"></a-input>
  543. </a-form-item>
  544. <a-form-item label='UDP Hop Interval (s)'
  545. v-if="outbound.stream.hysteria.udphopPort">
  546. <a-input-number
  547. v-model.number="outbound.stream.hysteria.udphopInterval"
  548. :min="5"></a-input-number>
  549. </a-form-item>
  550. <a-form-item label='Init Stream Receive'>
  551. <a-input-number
  552. v-model.number="outbound.stream.hysteria.initStreamReceiveWindow"></a-input-number>
  553. </a-form-item>
  554. <a-form-item label='Max Stream Receive'>
  555. <a-input-number
  556. v-model.number="outbound.stream.hysteria.maxStreamReceiveWindow"></a-input-number>
  557. </a-form-item>
  558. <a-form-item label='Init Connection Receive'>
  559. <a-input-number
  560. v-model.number="outbound.stream.hysteria.initConnectionReceiveWindow"></a-input-number>
  561. </a-form-item>
  562. <a-form-item label='Max Connection Receive'>
  563. <a-input-number
  564. v-model.number="outbound.stream.hysteria.maxConnectionReceiveWindow"></a-input-number>
  565. </a-form-item>
  566. <a-form-item label='Max Idle Timeout (s)'>
  567. <a-input-number
  568. v-model.number="outbound.stream.hysteria.maxIdleTimeout" :min="4"
  569. :max="120"></a-input-number>
  570. </a-form-item>
  571. <a-form-item label='Keep Alive Period (s)'>
  572. <a-input-number
  573. v-model.number="outbound.stream.hysteria.keepAlivePeriod" :min="0"
  574. :max="60"></a-input-number>
  575. </a-form-item>
  576. <a-form-item label='Disable Path MTU'>
  577. <a-switch
  578. v-model="outbound.stream.hysteria.disablePathMTUDiscovery"></a-switch>
  579. </a-form-item>
  580. </template>
  581. </template>
  582. <!-- udpmasks settings -->
  583. <template v-if="outbound.canEnableStream()">
  584. <a-form-item label="UDP Masks">
  585. <a-button icon="plus" type="primary" size="small" @click="outbound.stream.addUdpMask()"></a-button>
  586. </a-form-item>
  587. <template v-if="outbound.stream.udpmasks.length > 0">
  588. <a-form v-for="(mask, index) in outbound.stream.udpmasks" :key="index" :colon="false"
  589. :label-col="{ md: {span:8} }" :wrapper-col="{ md: {span:14} }">
  590. <a-divider :style="{ margin: '0' }"> UDP Mask [[ index + 1 ]]
  591. <a-icon type="delete" @click="() => outbound.stream.delUdpMask(index)"
  592. :style="{ color: 'rgb(255, 77, 79)', cursor: 'pointer' }"></a-icon>
  593. </a-divider>
  594. <a-form-item label='Type'>
  595. <a-select v-model="mask.type" :dropdown-class-name="themeSwitcher.currentTheme">
  596. <a-select-option value="salamander">Salamander</a-select-option>
  597. </a-select>
  598. </a-form-item>
  599. <a-form-item label='Password'>
  600. <a-input v-model.trim="mask.password" placeholder="Obfuscation password"></a-input>
  601. </a-form-item>
  602. </a-form>
  603. </template>
  604. </template>
  605. <!-- tls settings -->
  606. <template v-if="outbound.canEnableTls()">
  607. <a-form-item label='{{ i18n "security" }}'>
  608. <a-radio-group v-model="outbound.stream.security"
  609. button-style="solid">
  610. <a-radio-button value="none">{{ i18n "none" }}</a-radio-button>
  611. <a-radio-button value="tls">TLS</a-radio-button>
  612. <a-radio-button v-if="outbound.canEnableReality()"
  613. value="reality">Reality</a-radio-button>
  614. </a-radio-group>
  615. </a-form-item>
  616. <template v-if="outbound.stream.isTls">
  617. <a-form-item label="SNI" placeholder="Server Name Indication">
  618. <a-input v-model.trim="outbound.stream.tls.serverName"></a-input>
  619. </a-form-item>
  620. <a-form-item label="uTLS">
  621. <a-select v-model="outbound.stream.tls.fingerprint"
  622. :dropdown-class-name="themeSwitcher.currentTheme">
  623. <a-select-option value>None</a-select-option>
  624. <a-select-option v-for="key in UTLS_FINGERPRINT" :value="key">[[
  625. key ]]</a-select-option>
  626. </a-select>
  627. </a-form-item>
  628. <a-form-item label="ALPN">
  629. <a-select mode="multiple"
  630. :dropdown-class-name="themeSwitcher.currentTheme"
  631. v-model="outbound.stream.tls.alpn">
  632. <a-select-option v-for="alpn in ALPN_OPTION" :value="alpn">[[ alpn
  633. ]]</a-select-option>
  634. </a-select>
  635. </a-form-item>
  636. <a-form-item label="ECH Config List">
  637. <a-input v-model.trim="outbound.stream.tls.echConfigList"></a-input>
  638. </a-form-item>
  639. <a-form-item label="Allow Insecure">
  640. <a-switch v-model="outbound.stream.tls.allowInsecure"></a-switch>
  641. </a-form-item>
  642. </template>
  643. <!-- reality settings -->
  644. <template v-if="outbound.stream.isReality">
  645. <a-form-item label="SNI">
  646. <a-input
  647. v-model.trim="outbound.stream.reality.serverName"></a-input>
  648. </a-form-item>
  649. <a-form-item label="uTLS">
  650. <a-select v-model="outbound.stream.reality.fingerprint"
  651. :dropdown-class-name="themeSwitcher.currentTheme">
  652. <a-select-option v-for="key in UTLS_FINGERPRINT" :value="key">[[
  653. key ]]</a-select-option>
  654. </a-select>
  655. </a-form-item>
  656. <a-form-item label="Short ID">
  657. <a-input v-model.trim="outbound.stream.reality.shortId"></a-input>
  658. </a-form-item>
  659. <a-form-item label="SpiderX">
  660. <a-input v-model.trim="outbound.stream.reality.spiderX"></a-input>
  661. </a-form-item>
  662. <a-form-item label="Public Key">
  663. <a-textarea
  664. v-model.trim="outbound.stream.reality.publicKey"></a-textarea>
  665. </a-form-item>
  666. <a-form-item label="mldsa65 Verify">
  667. <a-textarea
  668. v-model.trim="outbound.stream.reality.mldsa65Verify"></a-textarea>
  669. </a-form-item>
  670. </template>
  671. </template>
  672. <!-- sockopt settings -->
  673. <a-form-item label="Sockopts">
  674. <a-switch v-model="outbound.stream.sockoptSwitch"></a-switch>
  675. </a-form-item>
  676. <template v-if="outbound.stream.sockoptSwitch">
  677. <a-form-item label="Dialer Proxy">
  678. <a-select v-model="outbound.stream.sockopt.dialerProxy"
  679. :dropdown-class-name="themeSwitcher.currentTheme">
  680. <a-select-option v-for="tag in ['', ...outModal.tags]"
  681. :value="tag">[[ tag ]]</a-select-option>
  682. </a-select>
  683. </a-form-item>
  684. <a-form-item label='Address Port Strategy'>
  685. <a-select v-model="outbound.stream.sockopt.addressPortStrategy"
  686. :dropdown-class-name="themeSwitcher.currentTheme">
  687. <a-select-option v-for="key in Address_Port_Strategy"
  688. :value="key">[[ key ]]</a-select-option>
  689. </a-select>
  690. </a-form-item>
  691. <a-form-item label="Keep Alive Interval">
  692. <a-input-number
  693. v-model.number="outbound.stream.sockopt.tcpKeepAliveInterval"
  694. :min="0"></a-input-number>
  695. </a-form-item>
  696. <a-form-item label="TCP Fast Open">
  697. <a-switch v-model="outbound.stream.sockopt.tcpFastOpen"></a-switch>
  698. </a-form-item>
  699. <a-form-item label="Multipath TCP">
  700. <a-switch v-model.trim="outbound.stream.sockopt.tcpMptcp"></a-switch>
  701. </a-form-item>
  702. <a-form-item label="Penetrate">
  703. <a-switch v-model="outbound.stream.sockopt.penetrate"></a-switch>
  704. </a-form-item>
  705. <a-form-item label="Trusted X-Forwarded-For">
  706. <a-select mode="tags"
  707. v-model="outbound.stream.sockopt.trustedXForwardedFor"
  708. :style="{ width: '100%' }"
  709. :dropdown-class-name="themeSwitcher.currentTheme">
  710. <a-select-option
  711. value="CF-Connecting-IP">CF-Connecting-IP</a-select-option>
  712. <a-select-option value="X-Real-IP">X-Real-IP</a-select-option>
  713. <a-select-option
  714. value="True-Client-IP">True-Client-IP</a-select-option>
  715. <a-select-option value="X-Client-IP">X-Client-IP</a-select-option>
  716. </a-select>
  717. </a-form-item>
  718. </template>
  719. <!-- mux settings -->
  720. <template v-if="outbound.canEnableMux()">
  721. <a-form-item label="Mux">
  722. <a-switch v-model="outbound.mux.enabled"></a-switch>
  723. </a-form-item>
  724. <template v-if="outbound.mux.enabled">
  725. <a-form-item label="Concurrency">
  726. <a-input-number v-model.number="outbound.mux.concurrency" :min="-1"
  727. :max="1024"></a-input-number>
  728. </a-form-item>
  729. <a-form-item label="xudp Concurrency">
  730. <a-input-number v-model.number="outbound.mux.xudpConcurrency"
  731. :min="-1" :max="1024"></a-input-number>
  732. </a-form-item>
  733. <a-form-item label="xudp UDP 443">
  734. <a-select v-model="outbound.mux.xudpProxyUDP443"
  735. :dropdown-class-name="themeSwitcher.currentTheme">
  736. <a-select-option v-for="c in ['reject', 'allow', 'skip']"
  737. :value="c">[[ c ]]</a-select-option>
  738. </a-select>
  739. </a-form-item>
  740. </template>
  741. </template>
  742. </a-form>
  743. </a-tab-pane>
  744. <a-tab-pane key="2" tab="JSON" force-render="true">
  745. <a-space direction="vertical" :size="10" :style="{ marginTop: '10px' }">
  746. <a-input addon-before='{{ i18n "pages.xray.outbound.link" }}'
  747. v-model.trim="outModal.link"
  748. placeholder="vmess:// vless:// trojan:// ss://">
  749. <a-icon slot="addonAfter" type="form" @click="convertLink"></a-icon>
  750. </a-input>
  751. <textarea :style="{ position: 'absolute', left: '-800px' }"
  752. id="outboundJson"></textarea>
  753. </a-space>
  754. </a-tab-pane>
  755. </a-tabs>
  756. {{end}}