PacketTunnelMessage.swift 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. //
  2. // PacketTunnelMessage.swift
  3. // naiyoup
  4. //
  5. // Created by C Auto on 2021/8/2.
  6. //
  7. import Foundation
  8. import NetworkExtension
  9. struct PacketTunnelMessage {
  10. typealias ipv4Routes = [(String, String)]
  11. var configData: Data? = nil
  12. var serverIP: String? = nil
  13. var appGroup: String? = nil
  14. var ipv4IncludedRoutes: ipv4Routes = []
  15. var ipv4ExcludedRoutes: ipv4Routes = []
  16. var dnsServers: [String] = ["8.8.8.8","8.8.4.4"]
  17. var proxyExeptionList: [String]? = nil // 不代理列表
  18. var proxyMatchDomains: [String]? = nil // 需代理域名
  19. static func messageTo(_ prividerSession: NETunnelProviderSession?,
  20. _ message: PacketTunnelMessage,
  21. _ completion: @escaping((_ error: Error?,_ response: PacketTunnelMessage?)->Void)) {
  22. guard let prividerSession = prividerSession else {
  23. completion(NSError(domain: "PacketTunnelMessage", code: -1, userInfo: ["error" : "没有session"]), nil)
  24. return
  25. }
  26. do {
  27. try prividerSession.sendProviderMessage(JSONEncoder().encode(message), responseHandler: { (response) in
  28. guard let response = response else {
  29. completion(nil, nil)
  30. return
  31. }
  32. try? completion(nil, JSONDecoder().decode(PacketTunnelMessage.self, from: response))
  33. })
  34. } catch let error {
  35. completion(error, nil)
  36. }
  37. }
  38. // 域名解析
  39. static func getIPAddress(domainName: String) -> String {
  40. var result = ""
  41. let host = CFHostCreateWithName(nil,domainName as CFString).takeRetainedValue()
  42. CFHostStartInfoResolution(host, .addresses, nil)
  43. var success: DarwinBoolean = false
  44. if let addresses = CFHostGetAddressing(host, &success)?.takeUnretainedValue() as NSArray?,
  45. let theAddress = addresses.firstObject as? NSData {
  46. var hostname = [CChar](repeating: 0, count: Int(NI_MAXHOST))
  47. if getnameinfo(theAddress.bytes.assumingMemoryBound(to: sockaddr.self), socklen_t(theAddress.length),
  48. &hostname, socklen_t(hostname.count), nil, 0, NI_NUMERICHOST) == 0 {
  49. let numAddress = String(cString: hostname)
  50. result = numAddress
  51. print(numAddress)
  52. }
  53. }
  54. return result
  55. }
  56. }
  57. extension PacketTunnelMessage: Codable {
  58. enum CodingKeys: String, CodingKey {
  59. case configData
  60. case serverIP
  61. case appGroup
  62. case ipv4IncludedRoutes
  63. case ipv4ExcludedRoutes
  64. case dnsServers
  65. case proxyExeptionList
  66. case proxyMatchDomains
  67. }
  68. func encode(to encoder: Encoder) throws {
  69. var container = encoder.container(keyedBy: CodingKeys.self)
  70. try? container.encode(configData, forKey: .configData)
  71. try? container.encode(serverIP, forKey: .serverIP)
  72. try? container.encode(appGroup, forKey: .appGroup)
  73. try container.encode(dnsServers, forKey: .dnsServers)
  74. let ipv4IncludedRoutesData = try NSKeyedArchiver.archivedData(withRootObject: ipv4IncludedRoutes, requiringSecureCoding: true)
  75. try container.encode(ipv4IncludedRoutesData, forKey: .ipv4IncludedRoutes)
  76. let ipv4ExcludedRoutesData = try NSKeyedArchiver.archivedData(withRootObject: ipv4ExcludedRoutes, requiringSecureCoding: true)
  77. try container.encode(ipv4ExcludedRoutesData, forKey: .ipv4ExcludedRoutes)
  78. proxyExeptionList != nil ? try container.encode(proxyExeptionList, forKey: .proxyExeptionList) : nil
  79. proxyMatchDomains != nil ? try container.encode(proxyMatchDomains, forKey: .proxyMatchDomains) : nil
  80. }
  81. init(from decoder: Decoder) throws {
  82. let values = try decoder.container(keyedBy: CodingKeys.self)
  83. configData = try? values.decode(Data.self, forKey: .configData)
  84. serverIP = try? values.decode(String.self, forKey: .serverIP)
  85. dnsServers = try values.decode(Array.self, forKey: .dnsServers)
  86. appGroup = try values.decode(String.self, forKey: .appGroup)
  87. let ipv4ExcludedRoutesData = try values.decode(Data.self, forKey: .ipv4ExcludedRoutes)
  88. ipv4ExcludedRoutes = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(ipv4ExcludedRoutesData) as! PacketTunnelMessage.ipv4Routes
  89. let ipv4IncludedRoutesData = try values.decode(Data.self, forKey: .ipv4IncludedRoutes)
  90. ipv4IncludedRoutes = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(ipv4IncludedRoutesData) as! PacketTunnelMessage.ipv4Routes
  91. proxyMatchDomains = values.contains(.proxyMatchDomains) ? try values.decode(Array.self, forKey: .proxyMatchDomains) : nil
  92. proxyExeptionList = values.contains(.proxyExeptionList) ? try values.decode(Array.self, forKey: .proxyExeptionList) : nil
  93. }
  94. }