Tun Network设置抽象
This commit is contained in:
parent
5f36c28040
commit
351695aa52
@ -68,6 +68,7 @@ actor SDLContextActor {
|
|||||||
private let udpHoleServiceProxy: SDLUDPHoleServiceProxy
|
private let udpHoleServiceProxy: SDLUDPHoleServiceProxy
|
||||||
private let packetOutboundActor: PacketOutboundActor
|
private let packetOutboundActor: PacketOutboundActor
|
||||||
private let packetInboundActor: PacketInboundActor
|
private let packetInboundActor: PacketInboundActor
|
||||||
|
private let tunNetworkManager: SDLTunNetworkManager
|
||||||
|
|
||||||
private let publicDnsServers = ["223.5.5.5", "119.29.29.29"]
|
private let publicDnsServers = ["223.5.5.5", "119.29.29.29"]
|
||||||
|
|
||||||
@ -105,6 +106,7 @@ actor SDLContextActor {
|
|||||||
let policyService = PolicyService(identityId: config.identityId)
|
let policyService = PolicyService(identityId: config.identityId)
|
||||||
let superServiceProxy = SDLSuperServiceProxy()
|
let superServiceProxy = SDLSuperServiceProxy()
|
||||||
let udpHoleServiceProxy = SDLUDPHoleServiceProxy()
|
let udpHoleServiceProxy = SDLUDPHoleServiceProxy()
|
||||||
|
let tunNetworkManager = SDLTunNetworkManager(provider: provider)
|
||||||
let packetOutboundActor = PacketOutboundActor(
|
let packetOutboundActor = PacketOutboundActor(
|
||||||
provider: provider,
|
provider: provider,
|
||||||
config: config,
|
config: config,
|
||||||
@ -145,6 +147,7 @@ actor SDLContextActor {
|
|||||||
self.udpHoleServiceProxy = udpHoleServiceProxy
|
self.udpHoleServiceProxy = udpHoleServiceProxy
|
||||||
self.packetOutboundActor = packetOutboundActor
|
self.packetOutboundActor = packetOutboundActor
|
||||||
self.packetInboundActor = packetInboundActor
|
self.packetInboundActor = packetInboundActor
|
||||||
|
self.tunNetworkManager = tunNetworkManager
|
||||||
}
|
}
|
||||||
|
|
||||||
public func start() async {
|
public func start() async {
|
||||||
@ -336,7 +339,7 @@ extension SDLContextActor {
|
|||||||
SDLLogger.log("[SDLContext] registerSuperAck, use algorithm \(algorithm), key len: \(key.count)")
|
SDLLogger.log("[SDLContext] registerSuperAck, use algorithm \(algorithm), key len: \(key.count)")
|
||||||
// 服务器分配的tun网卡信息
|
// 服务器分配的tun网卡信息
|
||||||
do {
|
do {
|
||||||
try await self.setNetworkSettings(config: self.config, dnsServer: DNSHelper.dnsServer)
|
try await self.tunNetworkManager.apply(settings: .init(config: self.config), dnsServer: DNSHelper.dnsServer)
|
||||||
SDLLogger.log("[SDLContext] setNetworkSettings successed")
|
SDLLogger.log("[SDLContext] setNetworkSettings successed")
|
||||||
await self.packetOutboundActor.startPacketReader()
|
await self.packetOutboundActor.startPacketReader()
|
||||||
// 开启权限的定时更新
|
// 开启权限的定时更新
|
||||||
@ -590,71 +593,8 @@ extension SDLContextActor {
|
|||||||
}
|
}
|
||||||
await self.packetOutboundActor.updateRuntime(config: self.config, dataCipher: self.dataCipher)
|
await self.packetOutboundActor.updateRuntime(config: self.config, dataCipher: self.dataCipher)
|
||||||
await self.packetInboundActor.updateRuntime(config: self.config, dataCipher: self.dataCipher)
|
await self.packetInboundActor.updateRuntime(config: self.config, dataCipher: self.dataCipher)
|
||||||
try await self.setNetworkSettings(config: self.config, dnsServer: DNSHelper.dnsServer)
|
|
||||||
}
|
|
||||||
|
|
||||||
// MARK: 网络改变时需要重新配置网络信息
|
|
||||||
private func setNetworkSettings(config: SDLConfiguration, dnsServer: String) async throws {
|
|
||||||
let networkAddress = config.networkAddress
|
|
||||||
|
|
||||||
// 配置路由规则
|
try await self.tunNetworkManager.apply(settings: .init(config: self.config), dnsServer: DNSHelper.dnsServer)
|
||||||
var routes: [NEIPv4Route] = [
|
|
||||||
NEIPv4Route(destinationAddress: networkAddress.netAddress, subnetMask: networkAddress.maskAddress),
|
|
||||||
NEIPv4Route(destinationAddress: dnsServer, subnetMask: "255.255.255.255"),
|
|
||||||
]
|
|
||||||
|
|
||||||
// 如果存在出口节点配置,则接管系统默认留有
|
|
||||||
if config.exitNode != nil {
|
|
||||||
routes.append(.default())
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add code here to start the process of connecting the tunnel.
|
|
||||||
let networkSettings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "8.8.8.8")
|
|
||||||
networkSettings.mtu = 1250
|
|
||||||
|
|
||||||
// 设置网卡的DNS解析
|
|
||||||
let networkDomain = networkAddress.networkDomain
|
|
||||||
let dnsSettings = NEDNSSettings(servers: [dnsServer])
|
|
||||||
|
|
||||||
dnsSettings.searchDomains = [networkDomain]
|
|
||||||
dnsSettings.matchDomains = [networkDomain, ""]
|
|
||||||
// 设置为 false 允许系统在补全 Search Domain 时也能匹配到此设置
|
|
||||||
dnsSettings.matchDomainsNoSearch = false
|
|
||||||
|
|
||||||
networkSettings.dnsSettings = dnsSettings
|
|
||||||
|
|
||||||
let ipv4Settings = NEIPv4Settings(addresses: [networkAddress.ipAddress], subnetMasks: [networkAddress.maskAddress])
|
|
||||||
// 设置路由表
|
|
||||||
ipv4Settings.includedRoutes = routes
|
|
||||||
|
|
||||||
// 配置要排除的路由
|
|
||||||
ipv4Settings.excludedRoutes = self.getIpv4ExcludeRoutes()
|
|
||||||
|
|
||||||
networkSettings.ipv4Settings = ipv4Settings
|
|
||||||
// 网卡配置设置必须成功
|
|
||||||
try await self.provider.setTunnelNetworkSettings(networkSettings)
|
|
||||||
}
|
|
||||||
|
|
||||||
private func getIpv4ExcludeRoutes() -> [NEIPv4Route] {
|
|
||||||
// 要排除的路由表
|
|
||||||
let dnsServers = SDLUtil.getMacOSSystemDnsServers()
|
|
||||||
var ipv4DnsServers = dnsServers.filter {!$0.contains(":")}
|
|
||||||
|
|
||||||
// 增加常见的dns服务
|
|
||||||
let commonDnsServers = [
|
|
||||||
"8.8.8.8",
|
|
||||||
"8.8.4.4",
|
|
||||||
"223.5.5.5",
|
|
||||||
"223.6.6.6",
|
|
||||||
"114.114.114.114"
|
|
||||||
]
|
|
||||||
for ip in commonDnsServers {
|
|
||||||
if !ipv4DnsServers.contains(ip) {
|
|
||||||
ipv4DnsServers.append(ip)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ipv4DnsServers.map { NEIPv4Route(destinationAddress: $0, subnetMask: "255.255.255.255") }
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
96
Tun/Punchnet/TunNetwork/SDLTunNetworkManager.swift
Normal file
96
Tun/Punchnet/TunNetwork/SDLTunNetworkManager.swift
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
//
|
||||||
|
// SDLTunNetworkManager.swift
|
||||||
|
// Tun
|
||||||
|
//
|
||||||
|
// Created by Codex on 2026/5/20.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import NetworkExtension
|
||||||
|
|
||||||
|
final class SDLTunNetworkManager: @unchecked Sendable {
|
||||||
|
struct Settings: Sendable {
|
||||||
|
let ipAddress: String
|
||||||
|
let maskAddress: String
|
||||||
|
let netAddress: String
|
||||||
|
let networkDomain: String
|
||||||
|
let shouldRouteDefault: Bool
|
||||||
|
|
||||||
|
init(config: SDLConfiguration) {
|
||||||
|
let networkAddress = config.networkAddress
|
||||||
|
self.ipAddress = networkAddress.ipAddress
|
||||||
|
self.maskAddress = networkAddress.maskAddress
|
||||||
|
self.netAddress = networkAddress.netAddress
|
||||||
|
self.networkDomain = networkAddress.networkDomain
|
||||||
|
self.shouldRouteDefault = config.exitNode != nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private let provider: NEPacketTunnelProvider
|
||||||
|
|
||||||
|
init(provider: NEPacketTunnelProvider) {
|
||||||
|
self.provider = provider
|
||||||
|
}
|
||||||
|
|
||||||
|
func apply(settings: Settings, dnsServer: String) async throws {
|
||||||
|
let networkSettings = self.makeNetworkSettings(settings: settings, dnsServer: dnsServer)
|
||||||
|
try await self.provider.setTunnelNetworkSettings(networkSettings)
|
||||||
|
}
|
||||||
|
|
||||||
|
private func makeNetworkSettings(settings: Settings, dnsServer: String) -> NEPacketTunnelNetworkSettings {
|
||||||
|
let networkSettings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "8.8.8.8")
|
||||||
|
networkSettings.mtu = 1250
|
||||||
|
networkSettings.dnsSettings = self.makeDNSSettings(settings: settings, dnsServer: dnsServer)
|
||||||
|
networkSettings.ipv4Settings = self.makeIPv4Settings(settings: settings, dnsServer: dnsServer)
|
||||||
|
return networkSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
private func makeDNSSettings(settings: Settings, dnsServer: String) -> NEDNSSettings {
|
||||||
|
let dnsSettings = NEDNSSettings(servers: [dnsServer])
|
||||||
|
dnsSettings.searchDomains = [settings.networkDomain]
|
||||||
|
dnsSettings.matchDomains = [settings.networkDomain, ""]
|
||||||
|
// 设置为 false 允许系统在补全 Search Domain 时也能匹配到此设置
|
||||||
|
dnsSettings.matchDomainsNoSearch = false
|
||||||
|
return dnsSettings
|
||||||
|
}
|
||||||
|
|
||||||
|
private func makeIPv4Settings(settings: Settings, dnsServer: String) -> NEIPv4Settings {
|
||||||
|
let ipv4Settings = NEIPv4Settings(addresses: [settings.ipAddress], subnetMasks: [settings.maskAddress])
|
||||||
|
ipv4Settings.includedRoutes = self.makeIPv4IncludedRoutes(settings: settings, dnsServer: dnsServer)
|
||||||
|
ipv4Settings.excludedRoutes = self.makeIPv4ExcludedRoutes()
|
||||||
|
return ipv4Settings
|
||||||
|
}
|
||||||
|
|
||||||
|
private func makeIPv4IncludedRoutes(settings: Settings, dnsServer: String) -> [NEIPv4Route] {
|
||||||
|
var routes: [NEIPv4Route] = [
|
||||||
|
NEIPv4Route(destinationAddress: settings.netAddress, subnetMask: settings.maskAddress),
|
||||||
|
NEIPv4Route(destinationAddress: dnsServer, subnetMask: "255.255.255.255"),
|
||||||
|
]
|
||||||
|
|
||||||
|
if settings.shouldRouteDefault {
|
||||||
|
routes.append(.default())
|
||||||
|
}
|
||||||
|
|
||||||
|
return routes
|
||||||
|
}
|
||||||
|
|
||||||
|
private func makeIPv4ExcludedRoutes() -> [NEIPv4Route] {
|
||||||
|
let dnsServers = SDLUtil.getMacOSSystemDnsServers()
|
||||||
|
var ipv4DnsServers = dnsServers.filter { !$0.contains(":") }
|
||||||
|
let commonDnsServers = [
|
||||||
|
"8.8.8.8",
|
||||||
|
"8.8.4.4",
|
||||||
|
"223.5.5.5",
|
||||||
|
"223.6.6.6",
|
||||||
|
"114.114.114.114"
|
||||||
|
]
|
||||||
|
|
||||||
|
for ip in commonDnsServers where !ipv4DnsServers.contains(ip) {
|
||||||
|
ipv4DnsServers.append(ip)
|
||||||
|
}
|
||||||
|
|
||||||
|
return ipv4DnsServers.map {
|
||||||
|
NEIPv4Route(destinationAddress: $0, subnetMask: "255.255.255.255")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user