Я хотел бы проверить пакеты с NEPacketTunnelProvider без указанного прокси. К сожалению, мой readPacketObjects обработчик завершения никогда не вызывается, и я не понимаю почему. Мое обычное интернет-соединение прекращается, и Wireshark, очевидно, ничего не показывает на новом интерфейсе, и я не вижу ни одного моего HTTP-соединения на en0.
Возможно ли это? Форумы разработчиков Apple предполагает, что это может быть не так ... но, похоже, Charles Proxy для iOS может все проверять.
Мой код указан ниже:
class TunnelProvider: NEPacketTunnelProvider {
override func startTunnel(options: [String : NSObject]? = nil, completionHandler: @escaping (Error?) -> Void) {
os_log("starting tunnel")
let settings = NEPacketTunnelNetworkSettings(tunnelRemoteAddress: "127.0.0.1")
settings.tunnelOverheadBytes = 80
settings.mtu = 1200
settings.ipv4Settings = NEIPv4Settings(addresses: ["127.0.0.1", "0.0.0.0"], subnetMasks: ["0.0.0.0", "0.0.0.0"]) // all addresses
settings.ipv4Settings?.includedRoutes = [NEIPv4Route.default()] // all routes
settings.ipv4Settings?.excludedRoutes = [NEIPv4Route(destinationAddress: "127.0.0.1", subnetMask: "255.255.255.255")] // avoid local routes
settings.dnsSettings = NEDNSSettings(servers: ["1.1.1.1", "8.8.8.8", "8.8.4.4"])
settings.dnsSettings?.matchDomains = [""] // if blank don't use this DNS, use system; if "" then use this
NSLog("default/included route %@:%@", NEIPv4Route.default().destinationAddress, NEIPv4Route.default().destinationSubnetMask)
self.setTunnelNetworkSettings(settings) { error in
if let e = error {
NSLog("Settings error %@", e.localizedDescription)
completionHandler(e)
} else {
os_log("Settings set without error")
completionHandler(nil)
}
}
self.readPacketObjects()
}
private func readPacketObjects() {
NSLog("Inside readPacketObjects %@", self.packetFlow)
self.packetFlow.readPacketObjects() { packets in
NSLog("Inside readPacketObjects completionHandler %@", packets)
self.packetFlow.writePacketObjects(packets)
self.readPacketObjects()
}
}
Консольный вывод
default 10:31:03.177424 -0400 tunnel starting tunnel
default 10:31:03.177796 -0400 tunnel default/included route 0.0.0.0:0.0.0.0
default 10:31:03.178602 -0400 tunnel Inside readPacketObjects <NEPacketTunnelFlow: 0x7f9a69d135e0>
default 10:31:03.356006 -0400 tunnel Settings set without error
Редактировать 1
Я могу читать пакеты после изменения settings.ipv4Settings
на локальный адрес с более определенной маской подсети. Однако интернет-соединение все еще не работает, и route get
выводит неверный адрес.
Редактировать 2
Я смог заставить DNS работать, добавив DNS-серверы в исключенные маршруты, как показано здесь . Запись в packageFlow без каких-либо изменений по-прежнему не обеспечивает полную маршрутизацию.