# 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 的流程图: ![](../../_static/dns_rule_nes_ctrl.jpg) 原生从 Upstream 进入的报文转发示意图: ![](../../_static/dns_upstream.jpg) 从 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 进入的报文转发示意图如下: ![](../../_static/dns_rule_upstream.jpg)