add more sniff settings

This commit is contained in:
汐殇 2024-11-29 23:13:30 +08:00
parent 04aad7fd40
commit 09921d984a
3 changed files with 91 additions and 65 deletions

View File

@ -90,12 +90,23 @@ export const defaultControledMihomoConfig: Partial<IMihomoConfig> = {
}, },
TLS: { TLS: {
ports: [443] ports: [443]
},
QUIC: {
ports: [443]
} }
}, },
'skip-domain': ['+.push.apple.com'] 'skip-domain': ['+.push.apple.com'],
'skip-dst-address': [
'91.105.192.0/23',
'91.108.4.0/22',
'91.108.8.0/21',
'91.108.16.0/21',
'91.108.56.0/22',
'95.161.64.0/20',
'149.154.160.0/20',
'185.76.151.0/24',
'2001:67c:4e8::/48',
'2001:b28:f23c::/47',
'2001:b28:f23f::/48',
'2a0a:f280:203::/48'
]
}, },
profile: { profile: {
'store-selected': true, 'store-selected': true,

View File

@ -4,7 +4,7 @@ import SettingCard from '@renderer/components/base/base-setting-card'
import SettingItem from '@renderer/components/base/base-setting-item' import SettingItem from '@renderer/components/base/base-setting-item'
import { useControledMihomoConfig } from '@renderer/hooks/use-controled-mihomo-config' import { useControledMihomoConfig } from '@renderer/hooks/use-controled-mihomo-config'
import { restartCore } from '@renderer/utils/ipc' import { restartCore } from '@renderer/utils/ipc'
import React, { useState } from 'react' import React, { ReactNode, useState } from 'react'
import { MdDeleteForever } from 'react-icons/md' import { MdDeleteForever } from 'react-icons/md'
const Sniffer: React.FC = () => { const Sniffer: React.FC = () => {
@ -17,10 +17,25 @@ const Sniffer: React.FC = () => {
sniff = { sniff = {
HTTP: { ports: [80, 443], 'override-destination': false }, HTTP: { ports: [80, 443], 'override-destination': false },
TLS: { ports: [443] }, TLS: { ports: [443] },
QUIC: { ports: [443] } QUIC: { ports: [] }
}, },
'skip-domain': skipDomain = ['+.push.apple.com'], 'skip-domain': skipDomain = ['+.push.apple.com'],
'force-domain': forceDomain = [] 'force-domain': forceDomain = [],
'skip-dst-address': skipDstAddress = [
'91.105.192.0/23',
'91.108.4.0/22',
'91.108.8.0/21',
'91.108.16.0/21',
'91.108.56.0/22',
'95.161.64.0/20',
'149.154.160.0/20',
'185.76.151.0/24',
'2001:67c:4e8::/48',
'2001:b28:f23c::/47',
'2001:b28:f23f::/48',
'2a0a:f280:203::/48'
],
'skip-src-address': skipSrcAddress = []
} = sniffer || {} } = sniffer || {}
const [changed, setChanged] = useState(false) const [changed, setChanged] = useState(false)
const [values, originSetValues] = useState({ const [values, originSetValues] = useState({
@ -29,7 +44,9 @@ const Sniffer: React.FC = () => {
overrideDestination, overrideDestination,
sniff, sniff,
skipDomain, skipDomain,
forceDomain forceDomain,
skipDstAddress,
skipSrcAddress
}) })
const setValues = (v: typeof values): void => { const setValues = (v: typeof values): void => {
originSetValues(v) originSetValues(v)
@ -58,20 +75,45 @@ const Sniffer: React.FC = () => {
} }
}) })
} }
const handleDomainChange = (type: string, value: string, index: number): void => { const handleListChange = (type: string, value: string, index: number): void => {
const newDomains = [...values[type]] const list = [...values[type]]
if (index === newDomains.length) { if (value.trim()) {
if (value.trim() !== '') { if (index < list.length) {
newDomains.push(value) list[index] = value
} else {
list.push(value)
} }
} else { } else {
if (value.trim() === '') { list.splice(index, 1)
newDomains.splice(index, 1)
} else {
newDomains[index] = value
} }
setValues({ ...values, [type]: list })
} }
setValues({ ...values, [type]: newDomains }) const renderListInputs = (type: string, placeholder: string): ReactNode => {
const currentItems = values[type]
const showNewLine = currentItems.every((item: string) => item.trim() !== '')
return [...currentItems, ...(showNewLine ? [''] : [])].map((item, index) => (
<div key={index} className="mt-2 flex">
<Input
fullWidth
size="sm"
placeholder={placeholder}
value={typeof item === 'string' ? item : item.domain}
onValueChange={(v) => handleListChange(type, v, index)}
/>
{index < values[type].length && (
<Button
className="ml-2"
size="sm"
variant="flat"
color="warning"
onClick={() => handleListChange(type, '', index)}
>
<MdDeleteForever className="text-lg" />
</Button>
)}
</div>
))
} }
return ( return (
@ -144,6 +186,7 @@ const Sniffer: React.FC = () => {
<Input <Input
size="sm" size="sm"
className="w-[50%]" className="w-[50%]"
placeholder="端口号,使用英文逗号分割"
value={values.sniff.HTTP?.ports.join(',')} value={values.sniff.HTTP?.ports.join(',')}
onValueChange={(v) => handleSniffPortChange('HTTP', v)} onValueChange={(v) => handleSniffPortChange('HTTP', v)}
/> />
@ -152,6 +195,7 @@ const Sniffer: React.FC = () => {
<Input <Input
size="sm" size="sm"
className="w-[50%]" className="w-[50%]"
placeholder="端口号,使用英文逗号分割"
value={values.sniff.TLS?.ports.join(',')} value={values.sniff.TLS?.ports.join(',')}
onValueChange={(v) => handleSniffPortChange('TLS', v)} onValueChange={(v) => handleSniffPortChange('TLS', v)}
/> />
@ -160,60 +204,29 @@ const Sniffer: React.FC = () => {
<Input <Input
size="sm" size="sm"
className="w-[50%]" className="w-[50%]"
placeholder="端口号,使用英文逗号分割"
value={values.sniff.QUIC?.ports.join(',')} value={values.sniff.QUIC?.ports.join(',')}
onValueChange={(v) => handleSniffPortChange('QUIC', v)} onValueChange={(v) => handleSniffPortChange('QUIC', v)}
/> />
</SettingItem> </SettingItem>
<div className="flex flex-col items-stretch"> <div className="flex flex-col items-stretch">
<h3></h3> <h3></h3>
{[...values.skipDomain, ''].map((d, index) => ( {renderListInputs('skipDomain', '例:+.push.apple.com')}
<div key={index} className="flex mt-2">
<Input
size="sm"
fullWidth
placeholder="例: push.apple.com"
value={d}
onValueChange={(v) => handleDomainChange('skipDomain', v, index)}
/>
{index < values.skipDomain.length && (
<Button
size="sm"
color="warning"
variant="flat"
className="ml-2"
onClick={() => handleDomainChange('skipDomain', '', index)}
>
<MdDeleteForever className="text-lg" />
</Button>
)}
</div>
))}
</div> </div>
<Divider className="my-2" /> <Divider className="my-2" />
<div className="flex flex-col items-stretch"> <div className="flex flex-col items-stretch">
<h3 className="mb-2"></h3> <h3 className="mb-2"></h3>
{[...values.forceDomain, ''].map((d, index) => ( {renderListInputs('forceDomain', '例v2ex.com')}
<div key={index} className="flex mb-2">
<Input
size="sm"
fullWidth
placeholder="例: v2ex.com"
value={d}
onValueChange={(v) => handleDomainChange('forceDomain', v, index)}
/>
{index < values.forceDomain.length && (
<Button
size="sm"
color="warning"
variant="flat"
className="ml-2"
onClick={() => handleDomainChange('forceDomain', '', index)}
>
<MdDeleteForever className="text-lg" />
</Button>
)}
</div> </div>
))} <Divider className="my-2" />
<div className="flex flex-col items-stretch">
<h3 className="mb-2"></h3>
{renderListInputs('skipDstAddress', '例1.1.1.1/32')}
</div>
<Divider className="my-2" />
<div className="flex flex-col items-stretch">
<h3 className="mb-2"></h3>
{renderListInputs('skipSrcAddress', '例192.168.1.1/24')}
</div> </div>
</SettingCard> </SettingCard>
</BasePage> </BasePage>

View File

@ -352,6 +352,8 @@ interface IMihomoSnifferConfig {
'force-dns-mapping'?: boolean 'force-dns-mapping'?: boolean
'force-domain'?: string[] 'force-domain'?: string[]
'skip-domain'?: string[] 'skip-domain'?: string[]
'skip-dst-address'?: string[]
'skip-src-address'?: string[]
sniff?: { sniff?: {
HTTP?: { HTTP?: {
ports: (number | string)[] ports: (number | string)[]