跳转至

4 dnsproxy-DNS代理转发

作者:魏健强

一、概述

dnsproxy 扩展库实现 DNS 代理转发功能,用于在合宙 SOC 上的不同网卡间转发 DNS 查询请求;

  1. DNS 请求转发 当本地网络收到 DNS 查询请求时,dnsproxy 会拦截请求,然后将请求转发到指定的上游 DNS 服务器。
  2. DNS 响应回传 当收到上游 DNS 服务器的响应时,dnsproxy 会查找之前保存的映射关系,并将响应数据转发回原始请求的客户端。

以“4G 网卡连接外网,以太网 LAN 网卡连接内网接入设备”的场景为例,dnsproxy 扩展库的作用参考下图:

二、核心示例

1、核心示例是指:使用本扩展库文件提供的 API,开发的基础业务逻辑的演示代码;

2、核心示例的作用是:帮助开发者快速理解如何使用本库,所以核心示例的逻辑都比较简单;

3、 完整的 demo,请参考 LuatOS 仓库 中各个产品目录下的 demo/netdrv;

-- 开启以太网LAN功能,并使用4G网卡联网

netdrv.setup(socket.LWIP_ETH, netdrv.CH390, {spi=0,cs=8})  -- 初始化以太网网卡
local ipv4,mark, gw = netdrv.ipv4(socket.LWIP_ETH, "192.168.4.1", "255.255.255.0", "192.168.4.1")                                             -- 设置ip
dhcpsrv.create({adapter=socket.LWIP_ETH})                    -- 创建dhcp服务端、
dnsproxy.setup(socket.LWIP_ETH, socket.LWIP_GP)            -- 开启dns代理转发
netdrv.napt(socket.LWIP_GP)                                -- 开启napt

三、常量详解

核心库常量,顾名思义是由合宙 LuatOS 内核固件中定义的、不可重新赋值或修改的固定值,在脚本代码中不需要声明,可直接调用;

合宙LuatOS内核固件中定义的核心库常量,和此扩展库功能有关,所以也会放到本文描述。

关于网络适配器类型的常量:

注意:目前除 8101 系列产品默认网络适配器为 socket.LWIP_STA,其他主流模组默认网络适配器为 socket.LWIP_GP。

socket.LWIP_GP

常量含义:4G网卡
         LWIP是指:传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈
         GP是GPRS的缩写GPRS是2G网络时代的分组数据网络,此处用来代指移动蜂窝数据网络,例如4G网络
数据类型:number
示例代码:socket.localIP(socket.LWIP_GP)

socket.LWIP_STA

常量含义:WiFi设备模式网卡
         LWIP是指:传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈
         STA是STATION的缩写,表示WiFi设备模式,需要连接WiFi热点才能上网
数据类型:number
示例代码:socket.localIP(socket.LWIP_STA)

socket.LWIP_AP

常量含义:WiFi热点模式网卡
         LWIP是指:传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈
         AP是Access Ponit的缩写,意思是WiFi热点,供其他WiFi设备接入上网
数据类型:number
示例代码:socket.localIP(socket.LWIP_AP)

socket.LWIP_ETH

常量含义:使用LwIP协议栈的以太网卡
         LWIP是指:传输层和网络层使用的是LuatOS内核固件中的LwIP协议栈
         ETH是Ethernet的缩写,意思是以太网;
数据类型:number
示例代码:socket.localIP(socket.LWIP_ETH)

socket.ETH0

常量含义:使用硬件协议栈的以太网卡;
         ETH是Ethernet的缩写,意思是以太网,ETH0表示编号为0的硬件协议栈以太网卡
数据类型:number
示例代码:socket.localIP(socket.ETH0)

socket.USB

常量含义:USB接口的以太网卡
         常见的USB以太网卡又可以分为 USB RNDIS以太网卡  USB ECM以太网卡两种
数据类型:number
示例代码:socket.localIP(socket.USB)

socket.LWIP_USER0

常量含义:使用LWIP协议栈的自定义网卡0
数据类型:number
示例代码:socket.localIP(socket.LWIP_USER0)

socket.LWIP_USER1

常量含义:使用LWIP协议栈的自定义网卡1
数据类型:number
示例代码:socket.localIP(socket.LWIP_USER1)

socket.LWIP_USER2

常量含义:使用LWIP协议栈的自定义网卡2
数据类型:number
示例代码:socket.localIP(socket.LWIP_USER2)

socket.LWIP_USER3

常量含义:使用LWIP协议栈的自定义网卡3
数据类型:number
示例代码:socket.localIP(socket.LWIP_USER3)

socket.LWIP_USER4

常量含义:使用LWIP协议栈的自定义网卡4
数据类型:number
示例代码:socket.localIP(socket.LWIP_USER4)

socket.LWIP_USER5

常量含义:使用LWIP协议栈的自定义网卡5
数据类型:number
示例代码:socket.localIP(socket.LWIP_USER5)

socket.LWIP_USER6

常量含义:使用LWIP协议栈的自定义网卡6
数据类型:number
示例代码:socket.localIP(socket.LWIP_USER6)

socket.LWIP_USER7

常量含义:使用LWIP协议栈的自定义网卡7
数据类型:number
示例代码:socket.localIP(socket.LWIP_USER7)

四、函数详解

4.1 dnsproxy.setup(adapter, main_adapter)

功能

开启 dns 代理转发功能,用于不同网卡间转发 DNS 查询请求;

注意事项

无;

参数

adapter

参数含义:其他需要上网的设备连接到的合宙SOC网卡
数据类型:number
取值范围:参考第三节的常量详解;
是否必选:必选;
注意事项:无;
参数示例:socket.LWIP_AP

main_adapter

参数含义:合宙SOC用于连接互联网或内网的网卡
数据类型:number
取值范围:参考第三节的常量详解;
是否必选:必选;
注意事项:无;
参数示例:socket.LWIP_GP

返回值

local res = dnsproxy.setup(adapter, main_adapter)

log.info("dnsproxy.setup",res)

res

含义说明:创建结果;
数据类型:boolean
取值范围:true/nil
注意事项:返回值为true代表成功nil代表创建失败
返回示例:true

示例

dnsproxy.setup(socket.LWIP_AP, socket.LWIP_GP)

五、产品支持说明

支持 LuatOS 开发的所有产品都支持 dnsproxy 扩展库;