为局域网 DNS 流量禁用 conntrack 优化 OpenWRT 性能

针对有些国产 APP 滥发 DNS 请求的问题

去年我发现,家里部分手机会向路由器发送大量 DNS 查询。尤其是有人使用短视频 APP 时。
虽然 DNS 服务本身可以正常处理这些请求,但 conntrack 表经常达到数万条记录,影响性能。

NAT 和有状态防火墙需要 conntrack,而局域网的 DNS 流量其实并不需要它。
因此,我通过自定义防火墙规则,针对特定流量禁用 conntrack。以下适用于 OpenWRT 22.03 版本后的 fw4 防火墙。


步骤一:新建规则文件

/etc 目录下新建两个文件:

1. notrack_prerouting.nft

1
ip daddr { "192.168.6.1", "192.168.8.1" } udp dport 53 counter notrack

此规则用于禁用进入路由器的 DNS 流量的 conntrack。如果有 IPv6 DNS 服务,可添加类似的 ip6 daddr 规则。

2. notrack_output.nft

1
2
3
ip daddr 127.0.0.0/8 counter notrack
ip6 daddr ::1/128 counter notrack
udp sport 53 counter notrack

此规则用于禁用回环流量和 DNS 端口返回流量的 conntrack。


步骤二:配置防火墙

/etc/config/firewall 文件结尾添加如下内容:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
config include
        option type 'nftables'
        option path '/etc/notrack_prerouting.nft'
        option position 'chain-post'
        option chain 'raw_prerouting'
        option enabled '1'

config include
        option type 'nftables'
        option path '/etc/notrack_output.nft'
        option position 'chain-post'
        option chain 'raw_output'
        option enabled '1'

步骤三:重启防火墙服务

1
service firewall restart

这样配置后,针对指定流量的 conntrack 功能就会被禁用,有效优化路由器在大量 DNS 请求下的性能。

Licensed under CC BY-NC-SA 4.0
使用 Hugo 构建
主题 StackJimmy 设计