4 dnsproxy-DNS代理转发
作者:魏健强
一、概述
dnsproxy 扩展库实现 DNS 代理转发功能,用于在合宙 SOC 上的不同网卡间转发 DNS 查询请求;
- DNS 请求转发 当本地网络收到 DNS 查询请求时,dnsproxy 会拦截请求,然后将请求转发到指定的上游 DNS 服务器。
- 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 扩展库;