Преамбула
Есть "семейный" яндекс-dns, для которого на роутере запущен второй экземпляр dnsmasq и настроены правила ipchains, прозрачно проксирующие все коннекты с этих хостов куда угодно на 53-й порт этому экземпляру dnsmasq
Эти правила прописаны через uci, и в реальном ipchains выглядят примерно так:
iptables -t nat -A zone_lan_prerouting -p udp -m id --id 0x66773300 -m udp --dport 53 -m mac --mac-source XX:XX:XX:XX:XX:XX -m comment --comment family-yandex-dns -j DNAT --to-destination 192.168.1.5:65053
iptables -t nat -A zone_lan_prerouting -p tcp -m id --id 0x66773300 -m udp --dport 53 -m mac --mac-source XX:XX:XX:XX:XX:XX -m comment --comment family-yandex-dns -j DNAT --to-destination 192.168.1.5:65053
(и так по паре правил для каждого хоста).
Получается своего рода "чёрный список" - всем хостам сети можно напрямую ходить в интернет, кроме явно прописанных в правилах хостов (детские устройства), которые всегда ходят через запасной dns и оттуда на "семейный" dns.
Фабула
Хочется сделать наоборот. Чтобы все хосты по умолчанию проксировались на семейный dns, кроме избранного списка тех, кому можно ходить куда угодно напрямую.
Модифицировать правила выше, поставив перед мак-адресом ! не получается - не дают правила Де-Моргана. Иными словами - в этом случае между правилами должно стоять "ИЛИ", а не "И".
Прописать несколько мак-адресов в одно правило тоже нельзя.
И что делать?
Напрашивается мысль как-то маркировать трафик для "белых" хостов, и позднее в зависимости от маркировки либо пускать его прямо в интернет, либо проксировать. Но кроме мысли ничего нет; я не сисадмин и совершенно не представляю, как это сделать. К тому же это лучше бы делать через uci, а не напрямую лезть в правила iptables.
Или может вообще нужно как-то по-другому?