Я пытаюсь настроить расширение с использованием DNSProxyProvider, который перехватывает трафик DNS на UDP и вводит наш пользовательский идентификатор устройства и отправляет его на наш пользовательский сервер DNS, который дает нам ответ, который я перенаправляю для запроса клиента. Я пытаюсь написать ответ на UDPFLOW, я получаю эту ошибку в журналах консоли. < /P>
error domain = nepproxyflowerrordomain code = 9 "Datagram был слишком большой" userinfo = {nslocalizeddescript Я пробовал до сих пор. Ниже приведен код из моего NEDNSProxyProvider. Запрос DNS - это процесс в функции HandlenewFlow, которая вызывает процесс процесса < /p>
override func handleNewFlow(_ flow: NEAppProxyFlow) -> Bool {
if flow is NEAppProxyTCPFlow {
NSLog("BDDNSProxyProvider : Is TCP Flow...")
} else if let udpFlow = flow as? NEAppProxyUDPFlow {
NSLog("BDDNSProxyProvider: handleNewFlow : \(udpFlow)")
processUDPFlow(udpFlow) // < --
}
return true
}
< /code>
В коде ниже я объединяю доменное имя в запросе с DeviceID и отправьте его на наш сервер. Также есть строки журналов, пожалуйста, игнорируйте их. < /P>
// Read incoming DNS packets from the client
private func processUDPFlow(_ udpFlow: NEAppProxyUDPFlow) {
self.udpAppProxyFlow = udpFlow
udpFlow.readDatagrams { datagrams, error in
if let error = error {
NSLog("Error reading datagrams: \(error.localizedDescription)")
return
}
guard let datagrams = datagrams else {
NSLog("No datagrams received.")
return
}
// Forward each DNS packet to the custom DNS server
for (index, packet) in datagrams.enumerated() {
let dnsMessage = self.parseDNSMessage(from: packet.0)
NSLog("tDatagram Header: \(dnsMessage.header)")
for question in dnsMessage.questions {
NSLog("tDatagram Question: \(question.name), Type: \(question.type), Class: \(question.klass)")
}
for answer in dnsMessage.answers {
NSLog("tDatagram Answer: \(answer.name), Type: \(answer.type), Data: \(answer.data)")
}
let oldDomain = self.extractDomainName(from: packet.0)!
let packetWithNewDomain = self.replaceDomainName(in: packet.0, with: "827-\(oldDomain)") // func to append device ID (827)
NSLog("Packet's new domain \(self.extractDomainName(from: packetWithNewDomain ?? packet.0) ?? "Found nil")")
self.sendToCustomDNSServer(packetWithNewDomain!) { responseDatagram in
guard let responseDatagram = responseDatagram else {
NSLog("Failed to get a response from the custom DNS server")
return
}
let tDatagram = (responseDatagram, packet.1)
udpFlow.writeDatagrams([tDatagram]) { error in
if let error = error {
NSLog("Failed to write DNS response back to client: \(error)")
} else {
NSLog("Successfully wrote DNS response back to client.")
}
}
}
}
// Continue Reading Datagrams
self.processUDPFlow(udpFlow)
}
}
< /code>
Ниже приведена функция, которую я использую для замены DomainName < /p>
func extractDomainName(from datagram: Data) -> String? {
// Ensure the datagram has enough data for a DNS header
guard datagram.count > 12 else { return nil }
// Start reading after the header (12 bytes)
var offset = 12
var domainName = ""
while offset < datagram.count {
// Read the length of the next label
let length = Int(datagram[offset])
offset += 1
// Check for the null terminator (end of domain name)
if length == 0 {
break
}
// Ensure there's enough data for the label
guard offset + length
Подробнее здесь: https://stackoverflow.com/questions/793 ... oxyudpflow