Iptables для перенаправления DNS-поиска IP и порт

21

Я обнаружил, что мой провайдер (verizon) перехватывает весь трафик DNS через порт 53.

Используя iptables, я хочу перенаправить весь поисковый трафик DNS на определенный IP-адрес и порт (5353). Любая попытка подключения моего компьютера к другому компьютеру через порт 53 должна быть перенаправлена ​​на 23.226.230.72:5353.

Чтобы проверить DNS-сервер и порт, который я пытаюсь использовать, я запустил эту команду.

~$ dig +short serverfault.com @23.226.230.72 -p5353
198.252.206.16

Это правило iptables, которое я пытаюсь использовать.

iptables -t nat -A OUTPUT -p udp -m udp --dport 53 -j DNAT --to-destination 23.226.230.72:5353

После добавления этого правила все DNS-запросы не найдены. Пинги возвращаются unknown host. На веб-страницах написано «Сервер не найден».

~$ mtr serverfault.com
Failed to resolve host: Name or service not known

Я хочу, чтобы мой DNS для поиска извлекался из 23.226.230.72:5353. Как я могу заставить правило iptables работать?

РЕДАКТИРОВАТЬ

Демонстрация перехвата DNS (порт 53) моим провайдером. Трассировка выходных данных от раскопок до 23.226.230.72 через порт 5353, а затем через порт 53.

~$ dig +trace stackexchange.com @23.226.230.72 -p5353

; <<>> DiG 9.9.5-3-Ubuntu <<>> +trace stackexchange.com @23.226.230.72 -p5353
;; global options: +cmd
.           86395   IN  NS  ns7.opennic.glue.
.           86395   IN  NS  ns4.opennic.glue.
.           86395   IN  NS  ns3.opennic.glue.
.           86395   IN  NS  ns5.opennic.glue.
.           86395   IN  NS  ns2.opennic.glue.
.           86395   IN  NS  ns10.opennic.glue.
.           86395   IN  NS  ns1.opennic.glue.
.           86395   IN  NS  ns6.opennic.glue.
.           86395   IN  NS  ns8.opennic.glue.
dig: couldn't get address for 'ns8.opennic.glue': no more


~$ dig +trace stackexchange.com @23.226.230.72 -p53

; <<>> DiG 9.9.5-3-Ubuntu <<>> +trace stackexchange.com @23.226.230.72 -p53
;; global options: +cmd
.           7440    IN  NS  f.root-servers.net.
.           7440    IN  NS  d.root-servers.net.
.           7440    IN  NS  j.root-servers.net.
.           7440    IN  NS  i.root-servers.net.
.           7440    IN  NS  g.root-servers.net.
.           7440    IN  NS  k.root-servers.net.
.           7440    IN  NS  a.root-servers.net.
.           7440    IN  NS  h.root-servers.net.
.           7440    IN  NS  e.root-servers.net.
.           7440    IN  NS  m.root-servers.net.
.           7440    IN  NS  c.root-servers.net.
.           7440    IN  NS  b.root-servers.net.
.           7440    IN  NS  l.root-servers.net.
;; Received 239 bytes from 23.226.230.72#53(23.226.230.72) in 2948 ms

stackexchange.com.  215 IN  A   198.252.206.16
;; Received 62 bytes from 192.228.79.201#53(b.root-servers.net) in 116 ms

Мои текущие iptables. iptables-save

~# iptables-save
# Generated by iptables-save v1.4.21 on Tue Jul 15 23:06:52 2014
*mangle
:PREROUTING ACCEPT [79950528:41742899703]
:INPUT ACCEPT [78748282:41360159554]
:FORWARD ACCEPT [13:5427]
:OUTPUT ACCEPT [85455483:57472640071]
:POSTROUTING ACCEPT [85480442:57475512901]
-A POSTROUTING -o lxcbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Tue Jul 15 23:06:52 2014
# Generated by iptables-save v1.4.21 on Tue Jul 15 23:06:52 2014
*nat
:PREROUTING ACCEPT [71:18713]
:INPUT ACCEPT [7:474]
:OUTPUT ACCEPT [109:7855]
:POSTROUTING ACCEPT [109:7855]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -d 172.17.0.0/16 -j MASQUERADE
-A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE
COMMIT
# Completed on Tue Jul 15 23:06:52 2014
# Generated by iptables-save v1.4.21 on Tue Jul 15 23:06:52 2014
*filter
:INPUT ACCEPT [78748139:41360144354]
:FORWARD ACCEPT [13:5427]
:OUTPUT ACCEPT [85454926:57472600172]
:fail2ban-ssh - [0:0]
:fail2ban-vsftpd - [0:0]
-A INPUT -p tcp -m multiport --dports 21,20,990,989 -j fail2ban-vsftpd
-A INPUT -p tcp -m multiport --dports 22,6622 -j fail2ban-ssh
-A INPUT -i lxcbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i lxcbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i lxcbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -i lxcbr0 -p udp -m udp --dport 67 -j ACCEPT
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A FORWARD -o lxcbr0 -j ACCEPT
-A FORWARD -i lxcbr0 -j ACCEPT
-A fail2ban-ssh -j RETURN
-A fail2ban-vsftpd -j RETURN
COMMIT
Rucent88
источник
Итак, вы пытаетесь перенаправить весь трафик порта 53 на этот IP (23.226.230.72) и порт (5353)?
Тахоми
пожалуйста, оставьте свой iptables rulesздесь
Networker
@tachomi Правильно
Rucent88
Или вы не можете использовать DNS вашего провайдера ... Общедоступные DNS-серверы Google 8.8.8.8и8.8.4.4
Creek
@ Крик, я думаю, ты неправильно понял. Мой провайдер перехватывает весь трафик через порт 53. Даже если бы я хотел использовать серверы Google DNS, я не могу получить к ним доступ.
Rucent88

Ответы:

12

Выполните все эти инструкции от имени пользователя root (sudo).

Отредактируйте этот файл.

/etc/NetworkManager/NetworkManager.conf

Отключите DnsMasq, закомментировав строку dns=dnsmasq. Положите #перед линией

#dns=dnsmasq

Перезагрузите сеть.

service network-manager restart

Добавьте эти приемлемые правила.

iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to 23.226.230.72:5353
iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to 23.226.230.72:5353
Rucent88
источник
2
Это решение обновляется вместе с операционной системой и потребляет ноль ресурсов, не подвергая риску безопасность, обеспечивает простую настройку с помощью загрузочного скрипта и не требует обслуживания. Недостатком является то, что он не очень гибкий
Rucent88
3

Похоже, что вы действительно хотите контролировать то, что происходит с вашими DNS-запросами.

Я не уверен, что использование iptables будет моим предпочтительным решением.

Задумывались ли вы о настройке локального DNS-сервера, который просто перенаправляет ваши запросы на нужный хост и порт? Один пример: используя опцию пересылки bind9, вы можете добавить порт для пересылки.

Такая настройка намного проще в обслуживании и устранении неполадок, а также может быть гораздо более гибкой. Рассмотрите преимущество кэширования или просто рассмотрите случай, когда ваш внешний DNS-сервер не работает. Вы можете иметь несколько серверов пересылки в вашей конфигурации DNS, но только один IP в правилах iptables ....

Существует хороший обзор настройки bind9 в руководстве по цифровому океану . Просто добавьте порт к серверам пересылки, и все будет готово.

Bind9 совсем не потребляет много ресурсов и легко настраивается (или, по крайней мере: проще, чем iptables :-))

Винсент де Баер
источник
Ох, и, разумеется, в этой настройке не забудьте настроить устройства на использование локального пересылающего DNS-сервера.
Винсент де Баер
У меня действительно работал DNS-сервер, но он не был надежным (нежелательное оборудование). Поддерживать безопасность в актуальном состоянии было больно. Это потребляло больше времени, ресурсов, электричества, и это, в конце концов, пало в минус. Если бы у меня были сотни компьютеров в корпоративной сети, то я согласен, что DNS-сервер был бы хорошей идеей. Но я всего лишь один человек с ноутбуком. Пара приемлемых правил должна быть самым простым и дешевым ресурсом.
Rucent88
Просто добавьте один на свой ноутбук, он почти не потребляет ресурсов, и он будет обновляться с вашей основной ОС (при условии, что вы используете дистрибутивные пакеты), и заставит его слушать на localhost. Почти нулевой риск безопасности.
Винсент де Баер
Действительно, ИМХО, это лучший способ сохранить сценарий в 99% случаев. Единственный 1%, который не применяется, это когда вы настраиваете систему Captive Portal, но это уже другая история.
ivanleoncz
2

Попробуй это:

Сначала вы должны включить опцию пересылки в

/etc/sysctl.conf

Установите одно значение

net.ipv4.ip_forward = 1

Включить изменения

sysctl -p 

Сохраните и запустите следующее:

iptables -t nat -A PREROUTING -p tcp --sport 53 -j DNAT --to-destination 23.226.230.72:5353
iptables -t nat -A POSTROUTING -j MASQUERADE

Если бы вы могли указать in-interface (-i eth1) в PREROUTING или / и out-interfect (-o eth0), то в POSTROUTING может быть полезно.

ПРИМЕЧАНИЕ: линия MASQUARADE необходима, в то время как эта маска маскирует IP-адрес назначения основным IP-адресом.

tachomi
источник
Я вставил sysctl net.ipv4.ip_forward=1и правила iptables. DNS работает, но он все еще перехватывается моим провайдером. Так что это указывает на то, что DNS все еще отправляется через порт 53.
Rucent88
Я изменил ваше правило на udp, но я получил те же результаты.
Rucent88
Не могли бы вы выложить вывод iptables-save? Что я могу сделать, так это то, что ваша маскировка только указанного MASQUERADE all - 10.0.3.0/24, поэтому, если вы можете отключить эту строку и оставить -A POSTROUTING -j MASQUERADE, это может быть полезно
tachomi
Я добавил запрашиваемую информацию
Rucent88
Хорошо, давайте разберемся немного ... Весь порт 53 ВХОДЯЩИЙ трафик - это тот, который вы хотите перенаправить на 23.226.230.72 или ВЫХОДНОЙ?
Тахоми
1

Попробуй это:

iptables -t nat -A OUTPUT -p tcp --dport 53 -j DNAT --to 23.226.230.72:5353;

iptables -t nat -A OUTPUT -p udp --dport 53 -j DNAT --to 23.226.230.72:5353;

iptables -t nat -A POSTROUTING -j MASQUERADE

Это означает:
1) Любой локальный пользователь, связывающийся с внешним миром через порт tcp 53, отправленный на 23.226.230.72 через порт 5353.
2) То же, что 1, но для udp
3) Установите исходную информацию для исходящего пакета как исходящую от нас.

Джордж Идальго
источник
0
iptables -t nat -A PREROUTING -p tcp --dport 53 -j DNAT --to XX.XX.XX.XX:5353
iptables -t nat -A PREROUTING -p udp  --dport 53 -j DNAT --to XX.XX.XX.XX:5353
iptables -t nat -A POSTROUTING -j MASQUERADE
Zibri
источник
Тот факт, что в этом ответе не упоминается «5353», заставляет меня поверить, что это автоматически неправильно.
G-Man говорит: «Восстанови Монику»
исправлено .........
Зибри
Хорошо, я еще раз посмотрю на ваш ответ. Похоже, что он очень похож на ответ tachomi, за исключением того, что вы (1) изменились sportна  dport(очевидно, это была ошибка в ответе tachomi, на которую battman622 указал три года назад , (2) вы добавили строку (команду) для udp(это законное улучшение ответа тахоми, но уже упоминавшееся в комментарии  ... (продолжение)
G-Man говорит: «Восстановите Монику»
(Продолжение) ... и несколько других ответов) и (3) вы заменили --to-destinationна  --to.  Страница людей не говорит , что --toи  --to-destinationэквивалентны; напротив, он говорит, что --toиспользуется с NETMAPцелью (в отличие от  DNATцели) и что ее аргумент не включает номер порта. (Хотя я заметил, что несколько других ответов используют --toто же, что и вы.) Вы уверены, что это --toработает так, как вы используете (с номером порта, с  DNATцелью)? … (Продолжение)
G-Man говорит «Восстановить Монику»
(Продолжение)… (Если так, возможно, кто-то должен подать запрос на изменение сопровождающему (-ям) справочных страниц.) Это  --toлучше, чем   --to-destinationкаким-либо образом, кроме краткости?
G-Man говорит: «Восстанови Монику»