В реальной суровой сисадминской жизни часто встречаются задачки из серии "запретить юзерам ходить на одноклассники" или "разрешить ходить только на яндекс и гугл".
Оставим за рамками оценку эффективности подобных решений, их влияние на производительность труда персонала, уместность таких запросов, способы обхода ограничений, и так далее. Рассмотрим только чисто технический аспект вопроса. То есть "как сделать", не особо вдаваясь в тонкости сопутствующих явлений.
До сих пор я был уверен, что такую задачу можно решить только на 7-м уровне и только развёртыванием прокси-сервера. Ан-нет, оказывается, можно и проще. Только для этого нужно, чтобы весь трафик проходил бы через linux-овую машину, которая при этом одновременно являлась бы и DNS Forwarder-ом.
Как выяснилось, демон DnsMasq помимо прочего умеет по некоторому наперёд заданному условию передавать определённые IP-адреса в таблицы фильтрации ядра aka "ipset". То есть логика работы, например, такая. Запрещаем в ipset форвард всех пакетов кроме списка исключений. А в директивах Dnsmasq пишем что-то вроде "ip-адреса, в которые разресолвился google.ru внести в список исключений". Таким образом, пользователь пытается пойти на гугл. Сперва следует DNS-запрос к форвардеру. Наш DNS-сервер получает от вышестоящего сервера IP-адрес гугла и вносит его в перечень разрешённых. После чего пользователь может обмениваться данными с сервером гугла. Если же он пойдёт на сервер "одноклассников", то имя в IP-адрес разрешится, а вот пакетики с данными уже не пройдут.
Понятно, что реализация стратегии "разрешить всё, запретить некоторое" будет в данном случае крайне неэффективной. Потому что пользователь завсегда сможет попасть на запретный ресурс, просто обратившись к нему непосредственно по IP-адресу. Но сам факт, что данную задачу можно решить без применения прокси, оказался для меня несколько неожиданным.