fix dns转发
This commit is contained in:
parent
5d192332b9
commit
af140f7da6
@ -693,7 +693,7 @@ actor SDLContextActor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 处理读取的每个数据包
|
// 处理读取的每个数据包, Tun收到的包的一级路由
|
||||||
private func dealTunPacket(packet: IPPacket) async {
|
private func dealTunPacket(packet: IPPacket) async {
|
||||||
let networkAddr = self.config.networkAddress
|
let networkAddr = self.config.networkAddress
|
||||||
let dstIp = packet.header.destination
|
let dstIp = packet.header.destination
|
||||||
@ -704,27 +704,39 @@ actor SDLContextActor {
|
|||||||
self.provider.packetFlow.writePacketObjects([nePacket])
|
self.provider.packetFlow.writePacketObjects([nePacket])
|
||||||
}
|
}
|
||||||
// 处理dns的解析
|
// 处理dns的解析
|
||||||
else if DNSHelper.isDnsRequestPacket(ipPacket: packet), case .udp(let udpPacket) = packet.transportPacket {
|
else if DNSHelper.isDnsRequestPacket(ipPacket: packet) {
|
||||||
// 数据是通过offset解析的, dns查询必然是udp包
|
if case .udp(let udpPacket) = packet.transportPacket {
|
||||||
let payloadOffset = udpPacket.payloadOffset
|
// 数据是通过offset解析的, dns查询必然是udp包
|
||||||
let dnsParser = DNSParser(data: packet.data, offset: payloadOffset)
|
let payloadOffset = udpPacket.payloadOffset
|
||||||
if let dnsMessage = dnsParser.parse(), let name = dnsMessage.questions.first?.name {
|
let dnsParser = DNSParser(data: packet.data, offset: payloadOffset)
|
||||||
// 如果是内部域名,则转发整个ip包的内容到云端服务器
|
if let dnsMessage = dnsParser.parse(), let name = dnsMessage.questions.first?.name {
|
||||||
if name.contains(self.config.networkAddress.networkDomain) {
|
// 如果是内部域名,则转发整个ip包的内容到云端服务器
|
||||||
SDLLogger.log("[SDLContext] get cloud dns request: \(name)")
|
if name.contains(self.config.networkAddress.networkDomain) {
|
||||||
self.dnsClient?.forward(ipPacketData: packet.data)
|
SDLLogger.log("[SDLContext] get cloud dns request: \(name)")
|
||||||
}
|
self.dnsClient?.forward(ipPacketData: packet.data)
|
||||||
// 通过本地的dns解析,发送的是udp的payload部分
|
}
|
||||||
else {
|
// 如果开启了出口节点,则转发给出口节点
|
||||||
// 尝试解析下对不对
|
else if let exitNode = config.exitNode {
|
||||||
let dnsPayload = Data(packet.data[payloadOffset..<packet.data.count])
|
let exitNodeIp = exitNode.exitNodeIp
|
||||||
SDLLogger.log("[SDLContext] get local dns request: \(name)")
|
SDLLogger.log("[SDLContext] dstIp: \(packet.header.destination.asIpAddress()), use exit_node: \(exitNodeIp.asIpAddress())")
|
||||||
|
// 查找arp缓存中是否有目标mac地址
|
||||||
let tracker = DNSLocalClient.DNSTracker(transactionID: dnsMessage.transactionID,
|
if let dstMac = await self.arpServer.query(ip: exitNodeIp) {
|
||||||
clientIP: packet.header.source,
|
await self.routeLayerPacket(dstMac: dstMac, type: .ipv4, data: packet.data)
|
||||||
clientPort: udpPacket.srcPort,
|
}
|
||||||
createdAt: Date())
|
else {
|
||||||
self.dnsLocalClient?.query(tracker: tracker, dnsPayload: dnsPayload)
|
try? await self.arpServer.arpRequest(targetIp: exitNodeIp, use: self.quicClient)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 通过本地的dns解析,发送的是udp的payload部分
|
||||||
|
else {
|
||||||
|
SDLLogger.log("[SDLContext] get local dns request: \(name)")
|
||||||
|
let dnsPayload = Data(packet.data[payloadOffset..<packet.data.count])
|
||||||
|
let tracker = DNSLocalClient.DNSTracker(transactionID: dnsMessage.transactionID,
|
||||||
|
clientIP: packet.header.source,
|
||||||
|
clientPort: udpPacket.srcPort,
|
||||||
|
createdAt: Date())
|
||||||
|
self.dnsLocalClient?.query(tracker: tracker, dnsPayload: dnsPayload)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -739,7 +751,6 @@ actor SDLContextActor {
|
|||||||
// 判断目标地址是否和当前的网络地址是否在同一个网段
|
// 判断目标地址是否和当前的网络地址是否在同一个网段
|
||||||
// 只有在同一个网段的ip数据才直接发送
|
// 只有在同一个网段的ip数据才直接发送
|
||||||
if SDLUtil.inSameNetwork(ip: dstIp, compareIp: networkAddr.ip, maskLen: networkAddr.maskLen) {
|
if SDLUtil.inSameNetwork(ip: dstIp, compareIp: networkAddr.ip, maskLen: networkAddr.maskLen) {
|
||||||
SDLLogger.log("[SDLContext] read Tun packet step 3, data: \(Array(packet.data))", for: .trace)
|
|
||||||
// 查找arp缓存中是否有目标mac地址
|
// 查找arp缓存中是否有目标mac地址
|
||||||
if let dstMac = await self.arpServer.query(ip: dstIp) {
|
if let dstMac = await self.arpServer.query(ip: dstIp) {
|
||||||
SDLLogger.log("[SDLContext] dstIp: \(dstIp.asIpAddress()), dst_mac is: \(SDLUtil.formatMacAddress(mac: dstMac))", for: .trace)
|
SDLLogger.log("[SDLContext] dstIp: \(dstIp.asIpAddress()), dst_mac is: \(SDLUtil.formatMacAddress(mac: dstMac))", for: .trace)
|
||||||
@ -754,8 +765,7 @@ actor SDLContextActor {
|
|||||||
try? await self.arpServer.arpRequest(targetIp: dstIp, use: self.quicClient)
|
try? await self.arpServer.arpRequest(targetIp: dstIp, use: self.quicClient)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 不在同一个网段的数据,看到是否配置了网络出口
|
// 不在同一个网段的数据,看是否配置了网络出口, 如果配置了,转发数据个网络出口,否则丢弃
|
||||||
// 如果配置了,转发数据个网络出口,否则丢弃
|
|
||||||
else if let exitNode = config.exitNode {
|
else if let exitNode = config.exitNode {
|
||||||
let exitNodeIp: UInt32 = exitNode.exitNodeIp
|
let exitNodeIp: UInt32 = exitNode.exitNodeIp
|
||||||
SDLLogger.log("[SDLContext] dstIp: \(packet.header.destination.asIpAddress()), use exit_node: \(exitNodeIp.asIpAddress())")
|
SDLLogger.log("[SDLContext] dstIp: \(packet.header.destination.asIpAddress()), use exit_node: \(exitNodeIp.asIpAddress())")
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user