Я использую сервер ubuntu в качестве маршрутизатора для своих пользователей в сети NAT. Я хочу заставить всех пользователей использовать локальную настройку DNS-сервера в сети. Даже если они используют общедоступный DNS-сервер на своих клиентских машинах, порт DNS должен быть перенаправлен (DNAT) на мой локальный DNS-сервер. Вот что я придумал:
iptables -t nat -A PREROUTING -i eth5 -p udp --dport 53 -j DNAT --to 192.168.1.1:53
iptables -A FORWARD -d 192.168.1.1 -i eth5 -p udp --dport 53 -j ACCEPT
Интерфейс, обращенный к сети NAT, eth5
. Вышеупомянутые правила не работали для меня. Есть ли лучшие решения?
РЕДАКТИРОВАТЬ 1: Моя цель - реализовать фильтр Opndns для предотвращения трафика BitTorrent в сети. В настоящее время фильтр работает достаточно хорошо, и пользователи получают локальный DNS-сервер, потому что они используют DHCP. Но я боюсь, что они могут найти обходной путь, например, указать IP-адрес и IP-адреса DNS-сервера вручную.
РЕДАКТИРОВАТЬ 2: следующий код реализует эту функцию в прошивке томата:
if (nvram_match("dns_intcpt", "1")) {
ipt_write("-A PREROUTING -p udp -s %s/%s ! -d %s/%s --dport 53 -j DNAT --to-destination %s\n",
lanaddr, lanmask,
lanaddr, lanmask,
lanaddr);
}
Есть ли лучшие решения?
Да, вообще не делаю.
Возиться с обычным разрешением DNS почти никогда не получится, какую бы проблему вы ни пытались решить.
РЕДАКТИРОВАТЬ re: ваше обновление. Вы ненадлежащим образом пытаетесь использовать технологию для решения политической проблемы. Не надо.
Это не работает, потому что ответ от вашего DNS-сервера проходит в обход брандмауэра. Затем клиенты (правильно) отбрасывают эти ответы, поскольку они не соответствуют отправленным.
Вам нужно добавить еще одно правило в вашу таблицу POSTROUTING для SNAT пакетов, направляемых на DNS-сервер, на IP-адрес маршрутизатора.
В качестве альтернативы, размещение DNS-сервера в отдельной сети могло бы решить проблему, поскольку ответы будут принудительно возвращаться через маршрутизатор.
Почему бы просто не перенаправить DNS-трафик на любой внешний DNS-сервер? Те, кто явно указывает внешний сервер, просто заметят, что это не работает.