localdns iptables

45 阅读5分钟

calico all in one 环境中的 localdns 相关的 iptables 规则



root@u22:~# iptables-save  | grep 169.254
-A PREROUTING -d 169.254.25.10/32 -p udp -m udp --dport 53 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
-A PREROUTING -d 169.254.25.10/32 -p tcp -m tcp --dport 53 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
-A OUTPUT -s 169.254.25.10/32 -p tcp -m tcp --sport 8080 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
-A OUTPUT -d 169.254.25.10/32 -p tcp -m tcp --dport 8080 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
-A OUTPUT -d 169.254.25.10/32 -p udp -m udp --dport 53 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
-A OUTPUT -d 169.254.25.10/32 -p tcp -m tcp --dport 53 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
-A OUTPUT -s 169.254.25.10/32 -p udp -m udp --sport 53 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
-A OUTPUT -s 169.254.25.10/32 -p tcp -m tcp --sport 53 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
-A INPUT -d 169.254.25.10/32 -p udp -m udp --dport 53 -m comment --comment "NodeLocal DNS Cache: allow DNS traffic" -j ACCEPT
-A INPUT -d 169.254.25.10/32 -p tcp -m tcp --dport 53 -m comment --comment "NodeLocal DNS Cache: allow DNS traffic" -j ACCEPT
-A OUTPUT -s 169.254.25.10/32 -p udp -m udp --sport 53 -m comment --comment "NodeLocal DNS Cache: allow DNS traffic" -j ACCEPT
-A OUTPUT -s 169.254.25.10/32 -p tcp -m tcp --sport 53 -m comment --comment "NodeLocal DNS Cache: allow DNS traffic" -j ACCEPT
root@u22:~# 



这些规则均围绕 “NodeLocal DNS Cache” (节点本地 DNS 缓存,IP 为 169.254.25.10)设计,核心目的是优化DNS 流量的处理效率并确保其正常通行。

一、iptables链的处理顺序基础

iptables的规则按“链”分组,不同链在数据包生命周期中按固定顺序触发。涉及的关键链及顺序如下:

  1. PREROUTING(nat 表):入站数据包到达后,最先经过的链**(在路由判断前),常用于修改地址或控制连接跟踪。**
  2. INPUT(filter 表):入站数据包经路由判断为“目标是本机”后进入的链,用于过滤是否允许数据包进入本机。
  3. OUTPUT(nat表):本机生成的出站数据包在路由判断前经过的链,常用于控制连接跟踪。
  4. OUTPUT(filter表):本机生成的出站数据包经路由判断后进入的链,用于过滤是否允许数据包出站

规则在链内按从上到下的顺序匹配,一旦匹配到某条规则,就执行该规则的动作(如 NOTRACK/ACCEPT),后续规则不再处理。

二、具体规则解析(按处理流程排序)

1. 入站 DNS 流量的处理(外部→NodeLocal DNS Cache)

场景:其他进程/容器向 169.254.25.10(DNS缓存)发送 DNS 查询(端口53,UDP/TCP)。

  • 步骤1:跳过连接跟踪(nat 表 PREROUTING 链)

    -A PREROUTING -d 169.254.25.10/32 -p udp -m udp --dport 53 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
    -A PREROUTING -d 169.254.25.10/32 -p tcp -m tcp --dport 53 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
    
    • 作用:对“目标IP为169.254.25.10、目标端口53(DNS默认端口)”的UDP/TCP数据包,执行NOTRACK(不进行连接跟踪)。
    • 原因:DNS 查询频率极高,连接跟踪(conntrack)会记录每个连接的状态,可能消耗大量内核资源。跳过跟踪可减少开销,提高性能。
  • 步骤2:允许入站(filter 表 INPUT 链)

    -A INPUT -d 169.254.25.10/32 -p udp -m udp --dport 53 -m comment --comment "NodeLocal DNS Cache: allow DNS traffic" -j ACCEPT
    -A INPUT -d 169.254.25.10/32 -p tcp -m tcp --dport 53 -m comment --comment "NodeLocal DNS Cache: allow DNS traffic" -j ACCEPT
    
    • 作用:经过 PREROUTING 后,数据包被路由到本机,进入 INPUT 链。规则明确允许“目标IP为169.254.25.10、目标端口53”的UDP/TCP数据包进入本机(即被DNS缓存服务接收)。
    • 原因:确保外部 DNS 查询不会被防火墙默认策略(如 DROP)阻挡。

2. 出站 DNS 响应的处理(NodeLocal DNS Cache→外部)

场景:169.254.25.10(DNS缓存)向外部回复 DNS 查询结果(源端口53,UDP/TCP)。

  • 步骤1:跳过连接跟踪(nat表OUTPUT链)

    -A OUTPUT -s 169.254.25.10/32 -p udp -m udp --sport 53 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
    -A OUTPUT -s 169.254.25.10/32 -p tcp -m tcp --sport 53 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
    
    • 作用:对“源 IP 为169.254.25.10、源端口53”的UDP/TCP数据包(即DNS响应),执行NOTRACK,跳过连接跟踪。
    • 原因:同入站逻辑,减少高频DNS响应的连接跟踪开销。
  • 步骤2:允许出站(filter表OUTPUT链)

    -A OUTPUT -s 169.254.25.10/32 -p udp -m udp --sport 53 -m comment --comment "NodeLocal DNS Cache: allow DNS traffic" -j ACCEPT
    -A OUTPUT -s 169.254.25.10/32 -p tcp -m tcp --sport 53 -m comment --comment "NodeLocal DNS Cache: allow DNS traffic" -j ACCEPT
    
    • 作用:DNS 响应数据包经路由判断后进入OUTPUT链,规则允许其出站(被外部接收)。
    • 原因:确保 DNS 缓存的回复不会被防火墙阻挡。

3. 本地到 DNS 缓存的查询处理(本机→NodeLocal DNS Cache)

场景:本机进程向169.254.25.10发送DNS查询(目标端口53,UDP/TCP)。

  • 步骤:跳过连接跟踪(nat表OUTPUT链)
    -A OUTPUT -d 169.254.25.10/32 -p udp -m udp --dport 53 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
    -A OUTPUT -d 169.254.25.10/32 -p tcp -m tcp --dport 53 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
    
    • 作用:对“目标IP为169.254.25.10、目标端口53”的本机出站查询数据包,执行NOTRACK
    • 原因:本地查询同样高频,跳过跟踪减少内核负担。

4. 8080端口流量的处理(管理/监控相关)

场景:169.254.25.10的8080端口(可能用于DNS缓存的管理/监控)的出入站流量。

  • 规则
    -A OUTPUT -s 169.254.25.10/32 -p tcp -m tcp --sport 8080 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
    -A OUTPUT -d 169.254.25.10/32 -p tcp -m tcp --dport 8080 -m comment --comment "NodeLocal DNS Cache: skip conntrack" -j NOTRACK
    
    • 作用:对“源/目标IP为169.254.25.10、端口8080”的TCP流量,执行NOTRACK
    • 原因:8080端口可能是DNS缓存的健康检查或配置接口,流量频率较低但仍需优化,跳过跟踪以减少资源消耗。

三、总结

这些规则的核心目标是保障NodeLocal DNS Cache的高效运行

  1. 通过NOTRACK跳过DNS相关流量的连接跟踪,减少内核资源占用(避免连接跟踪表过载)。
  2. 通过ACCEPT规则明确允许DNS查询(入站)和响应(出站),确保流量不被防火墙拦截。
  3. 规则按数据包处理顺序(PREROUTING→INPUT/OUTPUT)匹配,优先处理跟踪控制,再处理过滤,逻辑清晰且高效。