dnsproxy.lua 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. --[[
  2. @module dnsproxy
  3. @summary DNS代理转发
  4. @version 1.0
  5. @date 2024.4.20
  6. @author wendal
  7. @demo socket
  8. @tag LUAT_USE_NETWORK
  9. @usage
  10. -- 具体用法请查阅demo
  11. ]]
  12. local sys = require "sys"
  13. local dnsproxy = {}
  14. dnsproxy.map = {}
  15. dnsproxy.txid = 0x123
  16. dnsproxy.rxbuff = zbuff.create(1500)
  17. function dnsproxy.on_request(sc, event)
  18. if event == socket.EVENT then
  19. local rxbuff = dnsproxy.rxbuff
  20. while 1 do
  21. rxbuff:seek(0)
  22. local succ, data_len, remote_ip, remote_port = socket.rx(sc, rxbuff)
  23. if succ and data_len and data_len > 0 then
  24. -- log.info("dnsproxy", "收到DNS查询数据", rxbuff:query():toHex())
  25. if remote_ip and #remote_ip == 5 then
  26. local ip1,ip2,ip3,ip4 = remote_ip:byte(2),remote_ip:byte(3),remote_ip:byte(4),remote_ip:byte(5)
  27. remote_ip = string.format("%d.%d.%d.%d", ip1, ip2, ip3, ip4)
  28. local txid_request = rxbuff[0] + rxbuff[1] * 256
  29. local txid_map = dnsproxy.txid
  30. dnsproxy.txid = dnsproxy.txid + 1
  31. if dnsproxy.txid > 65000 then
  32. dnsproxy.txid = 0x123
  33. end
  34. table.insert(dnsproxy.map, {txid_request, txid_map, remote_ip, remote_port})
  35. rxbuff[0] = txid_map % 256
  36. rxbuff[1] = txid_map // 256
  37. socket.tx(dnsproxy.main_sc, rxbuff, "223.5.5.5", 53)
  38. end
  39. else
  40. break
  41. end
  42. end
  43. end
  44. end
  45. function dnsproxy.on_response(sc, event)
  46. if event == socket.EVENT then
  47. local rxbuff = dnsproxy.rxbuff
  48. while 1 do
  49. rxbuff:seek(0)
  50. local succ, data_len = socket.rx(sc, rxbuff)
  51. if succ and data_len and data_len > 0 then
  52. if true then
  53. -- local ip1,ip2,ip3,ip4 = remote_ip:byte(2),remote_ip:byte(3),remote_ip:byte(4),remote_ip:byte(5)
  54. -- remote_ip = string.format("%d.%d.%d.%d", ip1, ip2, ip3, ip4)
  55. local txid_resp = rxbuff[0] + rxbuff[1] * 256
  56. local index = -1
  57. for i, mapit in pairs(dnsproxy.map) do
  58. if mapit[2] == txid_resp then
  59. local txid_request = mapit[1]
  60. local remote_ip = mapit[3]
  61. local remote_port = mapit[4]
  62. rxbuff[0] = txid_request % 256
  63. rxbuff[1] = txid_request // 256
  64. socket.tx(dnsproxy.sc, rxbuff, remote_ip, remote_port)
  65. index = i
  66. break
  67. end
  68. end
  69. if index > 0 then
  70. table.remove(dnsproxy.map, index)
  71. end
  72. end
  73. else
  74. break
  75. end
  76. end
  77. end
  78. end
  79. --[[
  80. 创建UDP服务器
  81. @api dnsproxy.create(adapter, main_adapter)
  82. @int 监听的网络适配器id
  83. @int 网络适配编号, 默认为nil,可选
  84. @return table UDP服务的实体, 若创建失败会返回nil
  85. ]]
  86. function dnsproxy.setup(adapter, main_adapter)
  87. log.info("dnsproxy", adapter, main_adapter)
  88. dnsproxy.adapter = adapter
  89. dnsproxy.main_adapter = main_adapter
  90. dnsproxy.sc = socket.create(dnsproxy.adapter, dnsproxy.on_request)
  91. dnsproxy.main_sc = socket.create(dnsproxy.main_adapter, dnsproxy.on_response)
  92. socket.config(dnsproxy.sc, 53, true)
  93. socket.config(dnsproxy.main_sc, 1053, true)
  94. dnsproxy.on_ip_ready()
  95. return true
  96. end
  97. function dnsproxy.on_ip_ready()
  98. socket.close(dnsproxy.sc)
  99. socket.close(dnsproxy.main_sc)
  100. log.info("dnsproxy", "开启DNS代理")
  101. socket.connect(dnsproxy.sc, "255.255.255.255", 0)
  102. socket.connect(dnsproxy.main_sc, "223.5.5.5", 53)
  103. end
  104. sys.subscribe("IP_READY", dnsproxy.on_ip_ready)
  105. return dnsproxy