This commit is contained in:
anlicheng 2026-03-06 14:21:00 +08:00
parent 5004c0daef
commit 6ae15dc286
3 changed files with 18 additions and 5 deletions

View File

@ -296,7 +296,7 @@ actor SDLContextActor {
case .registerAck(let registerAck): case .registerAck(let registerAck):
await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck) await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck)
case .data(let data): case .data(let data):
try? await self.handleData(data: data) try? await self.handleHoleData(data: data)
case .stunReply(let stunReply): case .stunReply(let stunReply):
SDLLogger.shared.log("[SDLContext] get a stunReply: \(stunReply)") SDLLogger.shared.log("[SDLContext] get a stunReply: \(stunReply)")
} }
@ -500,7 +500,7 @@ actor SDLContextActor {
} }
} }
private func handleData(data: SDLData) async throws { private func handleHoleData(data: SDLData) async throws {
guard let aesKey = self.aesKey else { guard let aesKey = self.aesKey else {
return return
} }
@ -548,12 +548,20 @@ actor SDLContextActor {
// //
let identitySnapshot = self.snapshotPublisher.current() let identitySnapshot = self.snapshotPublisher.current()
if let ruleMap = identitySnapshot.lookup(data.identityID) { if let ruleMap = identitySnapshot.lookup(data.identityID) {
SDLLogger.shared.log("[SDLContext] identity: \(data.identityID), ruleMap: \(ruleMap)", level: .debug)
let proto = ipPacket.header.proto let proto = ipPacket.header.proto
switch TransportProtocol(rawValue: proto) { switch TransportProtocol(rawValue: proto) {
case .udp, .tcp: case .udp, .tcp:
if let dstPort = ipPacket.getDstPort(), ruleMap.isAllow(proto: proto, port: dstPort) { if let dstPort = ipPacket.getDstPort(), ruleMap.isAllow(proto: proto, port: dstPort) {
let packet = NEPacket(data: ipPacket.data, protocolFamily: 2) let packet = NEPacket(data: ipPacket.data, protocolFamily: 2)
self.provider.packetFlow.writePacketObjects([packet]) self.provider.packetFlow.writePacketObjects([packet])
} else {
if let dstPort = ipPacket.getDstPort() {
SDLLogger.shared.log("[SDLContext] identity: \(data.identityID), dst port: \(dstPort) not allow", level: .debug)
} else {
SDLLogger.shared.log("[SDLContext] identity: \(data.identityID), invalid ip packet, not allow", level: .debug)
}
} }
case .icmp: case .icmp:
let packet = NEPacket(data: ipPacket.data, protocolFamily: 2) let packet = NEPacket(data: ipPacket.data, protocolFamily: 2)
@ -562,6 +570,7 @@ actor SDLContextActor {
() ()
} }
} else { } else {
SDLLogger.shared.log("[SDLContext] not found identity: \(data.identityID) ruleMap", level: .debug)
// //
var policyRequest = SDLPolicyRequest() var policyRequest = SDLPolicyRequest()
policyRequest.srcIdentityID = data.identityID policyRequest.srcIdentityID = data.identityID
@ -603,7 +612,7 @@ actor SDLContextActor {
let (packets, numbers) = await self.provider.packetFlow.readPackets() let (packets, numbers) = await self.provider.packetFlow.readPackets()
for (data, number) in zip(packets, numbers) where number == 2 { for (data, number) in zip(packets, numbers) where number == 2 {
if let ipPacket = IPPacket(data) { if let ipPacket = IPPacket(data) {
await self.dealPacket(packet: ipPacket) await self.dealTunPacket(packet: ipPacket)
} }
} }
} }
@ -611,7 +620,7 @@ actor SDLContextActor {
} }
// //
private func dealPacket(packet: IPPacket) async { private func dealTunPacket(packet: IPPacket) async {
let networkAddr = self.config.networkAddress let networkAddr = self.config.networkAddress
if SDLDNSClient.Helper.isDnsRequestPacket(ipPacket: packet) { if SDLDNSClient.Helper.isDnsRequestPacket(ipPacket: packet) {

View File

@ -37,6 +37,10 @@ enum SDLPacketType: UInt8 {
case stunProbe = 0x32 case stunProbe = 0x32
case stunProbeReply = 0x33 case stunProbeReply = 0x33
// arp
case arpRequest = 0x50
case arpResponse = 0x51
// //
case policyRequest = 0xb0 case policyRequest = 0xb0
case policyResponse = 0xb1 case policyResponse = 0xb1

View File

@ -74,7 +74,7 @@ struct LoginView: View {
struct LoginTokenView: View { struct LoginTokenView: View {
@Environment(UserContext.self) var userContext: UserContext @Environment(UserContext.self) var userContext: UserContext
@State private var token: String = "" @State private var token: String = "49974818809840025617726088179154"
@State private var showAlert = false @State private var showAlert = false
@State private var errorMessage = "" @State private var errorMessage = ""