DNS не работает, когда активен прозрачный прокси.

Вопрос или проблема

Я запустил ShadowSocks(Socks5) tproxy и настроил iptable для маршрутизации всего трафика к нему. Это работает и слушает трафик, я могу обращаться к веб-страницам, просто введя IP-адрес; однако он не разрешает ни один домен/днс-запрос. Я протестировал сеть с помощью следующих команд, что якобы означает, что сеть работает, а проблема заключается только в dns. Обратите внимание, что все совершенно нормально, если я просто использую обычный прокси ShadowSocks. Я запустил tproxy с помощью этой команды ss-redir -s ServerIP -p ServerPort -m EncryptionMethod -k MyPasswd -b 127.0.0.1 -l 60080 --no-delay -u -T -v, и я использую Ubuntu 24.04 Noble на ядре gen 6+

$ nc -vz 172.217.163.46 80
Подключение к 172.217.163.46 80 порт [tcp/http] успешно!

$ nc -vz 172.217.163.46 443
Подключение к 172.217.163.46 443 порт [tcp/https] успешно!

$ nc -v -u 127.0.0.1 60080
Подключение к 127.0.0.1 60080 порт [udp/*] успешно!

$ nc -zvu 8.8.8.8 53
Подключение к 8.8.8.8 53 порт [udp/domain] успешно!

$ wget 172.217.163.46
--2024-11-06 18:05:45--  http://172.217.163.46/
Подключение к 172.217.163.46:80... подключено.
HTTP-запрос отправлен, ожидание ответа... 301 Постоянно перемещено
Расположение: http://www.google.com/ [следование]
--2024-11-06 18:05:45--  http://www.google.com/
Разрешение www.google.com (www.google.com)... не удалось: Временная ошибка разрешения имени.
wget: невозможно разрешить адрес хоста 'www.google.com'

$ dig google.com @1.1.1.1
;; ошибка связи с 1.1.1.1#53: время ожидания истекло

Вот конфигурация iptables

    ##################### SSREDIR #####################
    iptables -t mangle -N SSREDIR

    # connection-mark -> packet-mark
    iptables -t mangle -A SSREDIR -j CONNMARK --restore-mark
    iptables -t mangle -A SSREDIR -m mark --mark 0x2333 -j RETURN

    # пожалуйста, модифицируйте MyIP, MyPort и т.д.
    # игнорировать трафик, отправленный на ss-server
    iptables -t mangle -A SSREDIR -p tcp -d 120.233.31.53 --dport 26262 -j RETURN
    iptables -t mangle -A SSREDIR -p udp -d 120.233.31.53 --dport 26262 -j RETURN

    # игнорировать трафик, отправленный на зарезервированные адреса
    iptables -t mangle -A SSREDIR -d 0.0.0.0/8          -j RETURN
    iptables -t mangle -A SSREDIR -d 10.0.0.0/8         -j RETURN
    iptables -t mangle -A SSREDIR -d 100.64.0.0/10      -j RETURN
    iptables -t mangle -A SSREDIR -d 127.0.0.0/8        -j RETURN
    iptables -t mangle -A SSREDIR -d 169.254.0.0/16     -j RETURN
    iptables -t mangle -A SSREDIR -d 172.16.0.0/12      -j RETURN
    iptables -t mangle -A SSREDIR -d 192.0.0.0/24       -j RETURN
    iptables -t mangle -A SSREDIR -d 192.0.2.0/24       -j RETURN
    iptables -t mangle -A SSREDIR -d 192.88.99.0/24     -j RETURN
    iptables -t mangle -A SSREDIR -d 192.168.0.0/16     -j RETURN
    iptables -t mangle -A SSREDIR -d 198.18.0.0/15      -j RETURN
    iptables -t mangle -A SSREDIR -d 198.51.100.0/24    -j RETURN
    iptables -t mangle -A SSREDIR -d 203.0.113.0/24     -j RETURN
    iptables -t mangle -A SSREDIR -d 224.0.0.0/4        -j RETURN
    iptables -t mangle -A SSREDIR -d 240.0.0.0/4        -j RETURN
    iptables -t mangle -A SSREDIR -d 255.255.255.255/32 -j RETURN

    # отметить первый пакет соединения
    iptables -t mangle -A SSREDIR -p tcp --syn                      -j MARK --set-mark 0x2333
    iptables -t mangle -A SSREDIR -p udp -m conntrack --ctstate NEW -j MARK --set-mark 0x2333

    # packet-mark -> connection-mark
    iptables -t mangle -A SSREDIR -j CONNMARK --save-mark

    ##################### OUTPUT #####################
    # проксировать исходящий трафик с этой машины
    iptables -t mangle -A OUTPUT -p tcp -m addrtype --src-type LOCAL ! --dst-type LOCAL -j SSREDIR
    iptables -t mangle -A OUTPUT -p udp -m addrtype --src-type LOCAL ! --dst-type LOCAL -j SSREDIR

    ##################### PREROUTING #####################
    # проксировать трафик, проходящий через эту машину (другое->другое)
    iptables -t mangle -A PREROUTING -p tcp -m addrtype ! --src-type LOCAL ! --dst-type LOCAL -j SSREDIR
    iptables -t mangle -A PREROUTING -p udp -m addrtype ! --src-type LOCAL ! --dst-type LOCAL -j SSREDIR

    # передать помеченный пакет в TPROXY для обработки
    iptables -t mangle -A PREROUTING -p tcp -m mark --mark 0x2333 -j TPROXY --on-ip 127.0.0.1 --on-port 60080
    iptables -t mangle -A PREROUTING -p udp -m mark --mark 0x2333 -j TPROXY --on-ip 127.0.0.1 --on-port 60080

    ip route add local default dev lo table 100
    ip rule  add fwmark 0x2333        table 100
    ip rule  del   table 100 &>/dev/null
    ip route flush table 100 &>/dev/null

Ответ или решение

Исходя из представленного описания проблемы с DNS при активной прозрачной прокси, можно выделить несколько ключевых аспектов для диагностики и решения данной проблемы.

1. Понимание проблемы

Вы успешно настраиваете ShadowSocks с использованием TPROXY, и трафик направляется правильно, однако запросы DNS не обрабатываются должным образом. Вы можете подключаться к IP-адресам напрямую, но возникают проблемы с разрешением доменных имен. Это может указывать на проблемы в конфигурации маршрутизации или правилах IPTABLES.

2. Проверка конфигурации IPTABLES

Наиболее вероятная причина, по которой DNS-запросы не обрабатываются, заключается в неправильной маршрутизации или в том, что правила IPTABLES не направляют UDP-пакеты на порт 53 (по умолчанию используем для DNS).

Рекомендации по исправлению IPTABLES:

  • Убедитесь, что правила IPTABLES включают обработку UDP-трафика для DNS. Добавьте следующее правило в вашу конфигурацию IPTABLES:
iptables -t mangle -A OUTPUT -p udp --dport 53 -j SSREDIR
  • Проверьте, что в OUTPUT и PREROUTING корректно обрабатываются все необходимые правила для UDP.

3. Настройка DNS-серверов

Вам нужно убедиться, что используется правильный DNS-сервер. Проверьте конфигурацию /etc/resolv.conf и убедитесь, что доступны рабочие DNS-серверы, например:

nameserver 8.8.8.8
nameserver 1.1.1.1

После внесения изменений не забудьте протестировать их с помощью команды dig или nslookup.

4. Тестирование

  1. После внесения изменений выполните команды:
dig @8.8.8.8 google.com

или

nslookup google.com
  1. Проверьте, что DNS-resolver отвечает корректно.

5. Логи и диагностика

Если проблема всё ещё не решена:

  • Проверьте логи ShadowSocks для выявления возможных ошибок или предупреждений, связанных с соединениями.
  • Используйте tcpdump для мониторинга трафика на порту 53, чтобы увидеть, отправляются ли DNS-запросы и есть ли на них ответы:
tcpdump -i <your_interface> port 53

6. Протоколирование и обратная связь

Если все предложенные шаги не привели к успешному решению проблемы, рассмотрите возможность обращения за помощью к сообществу ShadowSocks или специализированным форумам, где вы сможете получить более таргетированную поддержку, включая возможные ошибки, специфичные для вашей версии.

Заключение

Проблема с неработающими DNS-запросами при использовании прозрачного прокси в первую очередь связана с конфигурацией маршрутизации и правилами IPTABLES. Проведя диагностику и внесение необходимых изменений, вы сможете восстановить нормальную работу разрешения доменных имен.

Оцените материал
Добавить комментарий

Капча загружается...