Вопрос или проблема
Я почти потратил 1 день на эту проблему.
У меня 2 ПК:
1. Windows как клиент, 10.20.30.20
2. Debian(последняя версия) как сервер, 10.20.30.10
Я установил Dante (SOCKS прокси) и настроил/перезапустил его.
Я могу использовать этот SOCKS прокси (10.20.30.10/1080TCP) с “1”. (Firefox, без аутентификации)
Поэтому я добавил этот прокси в настройки соединения uTorrent.
Прокси-сервер: Тип=SOCKS5, Прокси=10.20.30.10, Порт=1080, Без аутентификации
uTorrent начинает использовать мой SOCKS прокси, но не может подключиться к DHT/UDP.
uTorrent делает эти соединения (пример);
*65432 = Порт прослушивания uTorrent
TCP 10.20.30.20:(случайный)->10.20.30.10:1080 {Да, это то, что я ожидал!}
UDP 10.20.30.20:65432->10.20.30.10:(случайный) {Что?}
Поскольку uTorrent отправляет UDP пакет, а Dante не открывает UDP порт(ы)
UDP пакет был проигнорирован (отброшен) сервером.
Dante открывает только 1 порт (TCP 1080), и я не могу понять, почему uTorrent
не использует TCP протокол при пересылке UDP.
Мои вопросы:
1. Как я могу заставить Dante динамически открывать UDP порт по запросу?
2. Если “SOCKS5 поддерживает UDP” верно, почему uTorrent не может отправить UDP на TCP порт?
Настройки dante
logoutput: syslog
internal: 10.20.30.10 port = 1080
external: tun0
method: username none
clientmethod: none
user.privileged: root
user.notprivileged: nobody
user.libwrap: nobody
connecttimeout: 50
client pass {
from: 10.20.30.20/32 port 1024-65535 to: 0.0.0.0/0
}
client block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}
block {
from: 0.0.0.0/0 to: 127.0.0.0/8
log: connect error
}
pass {
from: 10.20.30.20/32 to: 0.0.0.0/0
protocol: tcp udp
#command: bind connect udpassociate
##^ Я уже пробовал Включить/Выключить команду, изменить с 0.0.0.0/0 и так далее, но без успеха!
}
block {
from: 0.0.0.0/0 to: 0.0.0.0/0
log: connect error
}
На случай, если, в дополнение к @anonnecroguest‘s ответу:
Сервер SOCKS Dante поддерживает пять команд, которые могут быть использованы в условиях правил (
bind
,connect
,udpassociate
,bindrepy
,udpreply
). Концептуально, они делятся на две группы; первые три соответствуют запросам, сделанным внутренними клиентами. Адрес от будет адресом внутреннего клиента, а адрес к будет адресом внешнего компьютера, с которым клиент хочет связаться.Оставшиеся две (
bindreply
иudpreply
) соответствуют результату связи, осуществленной внешними хостами, либо TCP соединению, установленному к порту связывания, созданному с помощью bind, либо UDP пакету, отправленному на порт, связанный с помощью udpassociate. Для этих двух команд адрес от будет соответствовать внешнему хосту, а адрес к – внутреннему клиенту. По этой причине были созданы отдельные правила для двух наборов команд.
Для UDP операции bind не поддерживаются. Клиент SOCKS должен отправить первый UDP пакет. У клиента SOCKS также нет прямого способа узнать, какой адрес использует сервер SOCKS для пересылки UDP пакетов, которые он отправляет…
В-третьих, для операцийBIND
иUDPASSOCIATE
, когда удаленный хост пытается подключиться или отправить UDP пакет клиенту SOCKS через ассоциацию, ранее созданную клиентом.
# Общее утверждение 'pass' - bind/исходящий трафик.
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
command: bind connect udpassociate
# log: error # connect disconnect iooperation
socksmethod: authmethod2
}
# ...
# Общее утверждение 'pass' для входящих соединений/пакетов.
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
command: bindreply udpreply
# log: error # connect disconnect iooperation
}
Связанные:
– https://stackoverflow.com/a/49975561/5113030 (Конфигурация пересылки UDP с Dante…)
– https://www.inet.no/dante/doc/1.4.x/config/session.html (Эта страница описывает, как настроить функциональность сессий…)
У меня были такие же проблемы с неработающим UDP, даже несмотря на то, что я использовал protocol: tcp udp
. После экспериментов, изменения следующего на команды socks pass ниже помогли мне.
client pass...
client block...
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
command: bind connect udpassociate
}
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
command: bindreply udpreply
}
Ответ или решение
Как заставить SOCKS прокси (Dante) открывать UDP порты
Ваша проблема связана с тем, что uTorrent не может использовать DHT по UDP через SOCKS прокси-сервер на базе Dante, установленный на Debian. Вы упомянули, что UDP пакеты игнорируются сервером, поскольку Dante не открывает необходимые порты для UDP-трафика.
1. Принудительное открытие UDP-портов в Dante
Чтобы разрешить вашему серверу Dante обрабатывать UDP-трафик, необходимо правильно настроить конфигурационный файл. Обратите внимание на следующие шаги:
- Проверьте конфигурацию на предмет поддержки UDP. В вашем случае в блоке
socks pass
следует убедиться, что вы добавили командыudpassociate
. Таким образом, ваша конфигурация должна выглядеть следующим образом:
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
command: bind connect udpassociate
}
- Предоставление ответа на запросы UDP. Для обработки пакетов, приходящих от внешних хостов, необходимо добавить следующий блок:
socks pass {
from: 0.0.0.0/0 to: 0.0.0.0/0
command: bindreply udpreply
}
Эти активные команды позволяют клиенту (в вашем случае uTorrent) инициировать UDP-соединение и обрабатывать ответ от прокси.
- Перезапустите Dante. После изменения конфигурации не забудьте перезапустить сервис для применения новых настроек:
sudo systemctl restart danted
2. Почему uTorrent не отправляет UDP на TCP порт
Несмотря на то, что SOCKS5 поддерживает UDP, важно понимать, как происходит работа с UDP-пакетами через SOCKS. Протокол SOCKS5 не может самоинициировать соединение для UDP, а клиент (uTorrent) должен отправить первый UDP-пакет для инициации сессии.
uTorrent, как и большинство других клиентских приложений, использует механизм UDPASSOCIATE
для установления ассоциаций UDP через SOCKS прокси. Он отправляет пакет ему, а прокси создает ассоциацию, позволяющую обмениваться UDP-трафиком между клиентом и сервером. Поэтому, когда вы настроите как udpassociate
, так и udpreply
, это позволит uTorrent правильно обрабатывать UDP-пакеты.
Заключение
Следуя приведенным инструкциям, вы сможете правильно настроить SOCKS прокси на базе Dante для обработки UDP-трафика. ЕслиDHT и другие функции, требующие UDP, все же не будут работать, стоит проверить дополнительные настройки сетевого окружения, такие как фаервол и маршрутизация.
Таким образом, правильная настройка конфигурационного файла и последующий тест являются ключевыми для успешного использования SOCKS-прокси с поддержкой UDP. Если у вас возникнут дополнительные вопросы или потребуется помощь с настройкой, не стесняйтесь обращаться за советом!