Вопрос или проблема
Я запустил 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. Тестирование
- После внесения изменений выполните команды:
dig @8.8.8.8 google.com
или
nslookup google.com
- Проверьте, что DNS-resolver отвечает корректно.
5. Логи и диагностика
Если проблема всё ещё не решена:
- Проверьте логи
ShadowSocks
для выявления возможных ошибок или предупреждений, связанных с соединениями. - Используйте
tcpdump
для мониторинга трафика на порту 53, чтобы увидеть, отправляются ли DNS-запросы и есть ли на них ответы:
tcpdump -i <your_interface> port 53
6. Протоколирование и обратная связь
Если все предложенные шаги не привели к успешному решению проблемы, рассмотрите возможность обращения за помощью к сообществу ShadowSocks
или специализированным форумам, где вы сможете получить более таргетированную поддержку, включая возможные ошибки, специфичные для вашей версии.
Заключение
Проблема с неработающими DNS-запросами при использовании прозрачного прокси в первую очередь связана с конфигурацией маршрутизации и правилами IPTABLES. Проведя диагностику и внесение необходимых изменений, вы сможете восстановить нормальную работу разрешения доменных имен.