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 的流程图:

../../../_images/dns_rule_nes_ctrl.jpg

原生从 Upstream 进入的报文转发示意图:

../../../_images/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 进入的报文转发示意图如下:

../../../_images/dns_rule_upstream.jpg