dnsproxy.lua 4.4 KB

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