DNS 重定向功能需求分析与实现设计
用户可以通过 Client 或者 External API 的方式配置 DNS Rule 到 NES_CTRL。以 Client 为例,首先 Client 发起配置 dns rule api_msg,NES_CTRL 接收后进行解析。
DNS Rule 包含以下字段:
id: a8098c1a-f86f-11da-bd1a-00112444be1e,
domain_name: www.testtest6.com,
ip: 10.0.30.1
解析完成后,配置到 NTS_IO 线程中以 struct nes_domainame_entry_s 数据结构存入 HASH 的 nes_domainame_lookup_table 中,key 值为 domainame。最后写入 Redis DB。重启 NES 时,也会从 Redis DB 加载 DNS Rule 到重新加载到 NTS_IO 的 nes_domainame_lookup_table。
typedef struct nes_domainame_entry_s {
char domain_name[DOMAIN_NAME_MAX_LEN + 1];
uint32_t ip; // dns server ip
uint32_t relate_cnt; // how many uuid relate count
struct domainame_entry_status_s status;
} nes_domainame_entry_t;
NES_CTRL 的流程图:
原生从 Upstream 进入的报文转发示意图:
从 Upstream 进入的报文,首先对报文头解封,区分报文协议类型分发到不同的 Ring 环中:
将非 IP 报文加入 default ring 中直通转发;
将 GTP-U 报文加入 NTS_UPSTR_GTPU Ring 环处理;
将 IP 报文加入 NTS_UPSTR_IP Ring 环处理。
进入 NTS_UPSTR_GTPU 及 NTS_UPSTR_IP Ring 环中的报文,经过解封,match acl rule 规则后,匹配对应的 acl rule 转发规则转发至相应的 PORT_IO_ANY ring 实现转发。
加入 DNS 重定向之后,在 NTS_UPSTR_IP 及 NTS_UPSTR_GTPU Ring 环中,插入了 DNS Filter 功能模块,负责:将 match dns rule 的 DNS Query 报文导入至 NTS_EDGE_DNS_IO_ANY Ring 环;未 match dns rule 的 DNS Query 报文走原生的 match acl rule 进行转发。
加入 DNS Rule 之后 Upstream 进入的报文转发示意图如下: