Я вот подумал. С использованием контейнерной виртуализации его легко зделать. (контейнеры — совсем не обязательно гигабайтные бандлы, несущие в себе всё необходимое! можно (нужно) собирать контейнеры on demand с помощью union-type fs).
Собираем ФС и запускаем контейнер, виртуализуя сеть: у контейнера будет только lo и виртуальный сетевой интерфейс.
Можно назначать этому интерфейсу произвольные правила фильтрации трафика и назначить nameserver, который также сможет фильтровать запросы.
В т. н. «режиме обучения» можно зделать так: nameserver по получению запроса будет стопить контейнер (передаю привет cgroups freezer-у) и, например, выплёвывать в dbus сообщение о запросе. Какое-нибудь мокренькое DE может слушать эти сообщения и показывать пользователю мокренькое окошко с запросом разрешить/запретить (разумеется, можно зделать консольный интерфейс для бородатых одминов в свитере, никакой дискриминации!). После чего давать команду разморозить контейнер.
Что делать не с DNS-запросами, а с другими сетевыми пакетами? Я точно не знаю. Возможно, есть лутшее решение, но пока у меня вырисовывается такой kostyl: подсовывать контейнеру TUN-девайс и сидеть слушать на нём, морозя контейнер и спрашивая пользователя о разрешении установить соединение с кем-то.
Разумеется, в обычном режиме никто ничего спрашивать не будет и TUN-девайса тоже не будет. По-умолчанию будут резаться почти все пакеты, кроме запросов к nameserver. nameserver будет фильтровать разрешённые домены и добавлять правила фаерволла, пропускающие трафик только к ним.