[Dnsmasq-discuss] patch: block-file/allow-file - for review/feedback

imnozi at gmail.com imnozi at gmail.com
Thu May 21 19:43:50 UTC 2026


On Thu, 21 May 2026 19:42:55 +0200
Ercolino de Spiacico <bellocarico at hotmail.com> wrote:

> In dnsmasq, domain filtering (for example, adblocking) currently relies 
> on built-in directives such as local and address. That approach works 
> well up to a point, but it does not scale: around 15 MB (≈700–800k 
> domains) the process hangs regardless of available system resources.

It could be related to hardware or to the dnsmasq version.

On an x86_64 system running dnsmasq v2.90, I'm currently blocking 1.75M FQDNs (50MB blacklist* using 'local='; sourced from Univ. of Toulouse). DNsmasq's virtual size is 152MB; resident size is 147MB. I haven't experienced failures and have seen only very slightly greater resolution latency. It's been a while since I last checked, but I think this blacklist increases dnsmasq's memory requirements by around 150MB.

N


* - dnsmasq.conf (sans comments):
domain-needed
bogus-priv
conf-file=/var/smoothwall/mods/dnsbl/dnsmasq-blacklist.conf
cache-size=1024


> 
> To take a different approach I developed this patch in attachment that 
> adds two new directives: block-file and allow-file. Summary of the 
> functionality:
> 
>   - Uses mmap() to load domain lists into RAM.
> 
>   - Multiple block-file directives are supported.
> 
>   - Multiple allow-file directives are supported.
> 
>   - Example syntax:
> 
> block-file=/path/to/blockfile#NX,1
> 
> NX is optional and can be replaced with any IP address to return instead 
> of NX.
> 
> The trailing ,1 is optional too, and enables logging when domains from 
> that file are matched (useful to log only blocked domains).
> 
> allow-file=/mnt/USB/blockfile-override,1
> 
>   - Mapped files must be pre-sorted (sorting is not included in this 
> patch to keep the code minimal).
> 
>   - Blocking/allowing behaviour mimics dnsmasq’s current semantics. For 
> example:
> 
>    dnsmasq config:
>    local=/example.com/ (blocked)
>    server=/www.example.com/ (unblocked)
> 
> After the patch:
> 
>    example.com → listed in block-file
>    www.example.com → listed in allow-file
> 
>   - Files are loaded one at a time and assesses against the amount of 
> RAM available. If Current RAM usage + blockfile >= 80% of Total RAM, the 
> loading is skipped and logged as a warning.
> 
>   - This code does not change DNS resolution itself; it performs a very 
> fast name match to decide whether a query should proceed or be answered 
> with NX or a custom IP.
> 
> 
> I developed this patch for FreshTomato router (dnsmasq v2.93rc1). On 
> those small devices I performed a functional test loading 2.2M domains 
> (55 MB blockfile) and reload the configuration without interruptions; no 
> packet drops were observed during a config when reloading. This is 
> already 3 time the current limit, but I haven't performed any proper 
> capacity testing yet, which is expected to be much higher.
> 
> 
> Any comments or considerations are greatly appreciated.
> Thanks.




More information about the Dnsmasq-discuss mailing list