proxy: DNS-резолв через туннель и UDP ASSOCIATE для SOCKS5-прокси#65
Closed
kyctarnik wants to merge 2 commits into
Closed
proxy: DNS-резолв через туннель и UDP ASSOCIATE для SOCKS5-прокси#65kyctarnik wants to merge 2 commits into
kyctarnik wants to merge 2 commits into
Conversation
Owner
|
Внес Ваши правки гармонично в код и поправил некоторые уязвимости, спасибо! |
Author
|
Благодарю за ваше внимание данной проблеме и имплементацию её решения. У меня так же были указаны некие проблемы моей реализации, и, как я вижу, они до сих пор сохранены. Прежде чем браться: вы принимаете внешние PR или предпочитаете реализовать всё сами? (конфигурируемые MTU, DNS и IPv6 в proxy.) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Что добавляет
SOCKS5-прокси (
--proxy-listen) получает две возможности:smoltcp'шным
dns::Socketчерез VPN-туннель, а не резолвером хостовой ОС. Запросуходит в шифрованный туннель → нет утечки DNS на хост и работает для имён, которые
локальный резолвер не отдаёт/подменяет (
socks5h).smoltcp UDP-сокет в туннель, обёртка SOCKS5 UDP request/response, per-association
DNS-кэш, пиннинг адреса клиента. Открывает QUIC/HTTP3 и прочий UDP через прокси.
Детали реализации / на что смотреть при ревью
TCP PMTUD (и
proto-ipv4-fragmentationне включён — фрагменты не пересобирает),поэтому MTU задаётся консервативно заранее. При downstream через Cloudflare WARP
(inner MTU 1280) бóльшие значения дают чёрную дыру: крупные входящие сегменты (обычно
TLS Certificate не-Cloudflare хостов) дропаются и хендшейк виснет. 1280 это снимает.
iface.poll_delay()и просыпается на входящих пакетах, новых CONNECT, исходящих данныхи UDP/DNS-командах.
poll_delayзакрывает таймеры smoltcp, будилка — внешний I/O.wake_txпроброшен черезProxyHandleи клиента.TcpSocket:set_nagle_enabled(false)+set_ack_delay(None)для форвардинга.Известные ограничения / на будущее (в этом PR не решаются, отмечаю явно)
другим egress-MTU потребует другого значения — это должно быть опцией CLI/конфига (или
выводиться из дескриптора сервера), а не константой. Комментарий
// совпадает с WAN_SAFE_TUN_MTUвводит в заблуждение: это другое ограничение(downstream-путь, а не WAN-хоп).
IPv4-адрес и IPv4-маршрут по умолчанию, TCP DNS резолвит только A (
want_v6=false), аhandle_connectрежетATYP_IPV6/ v6-резолв цели сHOST_UNREACHABLE. Поэтомуsocks5hработает (IPv4-only), аsocks5://до dual-stack хоста может падать, когдаклиент передаёт v6-литерал.
proto-ipv6вCargo.tomlвключён, но для роутинга неиспользуется.
приёма упирается в ~64 КБ независимо от
TCP_BUF; одиночный поток ≈ 64 КБ / RTT. Длябраузера (много соединений) ок, для одной большой загрузки — медленно.
1.1.1.1); Сокет работает только с одним сервером. Должно браться из конфига.