Redsocks2 не может пересылать пакеты udp
Я использую (socks5)redsocks2(из https://github.com/semigodking/redsocks) на стороне клиента для перенаправления всех пакетов данных на промежуточный шлюз вместо сервера приложений напрямую. Это хорошо работает в случае пакетов tcp. Но в случае пакетов UDP это не работает вообще. Проблема заключается в том, что как только UDP-пакет приходит в redsocks, адрес и порт назначения изменились на локальный адрес и порт redsocks.
Я использую ниже правила IPTable для пересылки пакетов:-
iptables -t nat -N REDSOCKS
iptables -t nat -A REDSOCKS -p tcp --dport 7 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -d xxx.xxx.xxx.xxx --dport 1080 -j RETURN
iptables -t nat -A REDSOCKS -d 127.0.0.0/8 -j RETURN
iptables -t nat -A REDSOCKS -d 0.0.0.0 -j RETURN
iptables -t nat -A REDSOCKS -p udp --dport 53 -j RETURN
iptables -t nat -A REDSOCKS -p tcp -j REDIRECT --to-ports YYYYY
iptables -t nat -A REDSOCKS -p udp -j REDIRECT --to-ports ZZZZZ
iptables -t nat -A OUTPUT -p tcp -j REDSOCKS
iptables -t nat -A OUTPUT -p udp -j REDSOCKS
** xxx.xxx.xxx.xxx = intermediate gateway server address
** YYYY, ZZZZ = local ports for redsocks in client device
Я использую ниже файл конфигурации redsocks:
base {
log_debug = off;
log_info = off;
daemon = on;
redirector = iptables;
}
redsocks {
local_ip = 127.0.0.1;
local_port = YYYYY;
ip = xxx.xxx.xxx.xxx;
port = MMMM;
type = socks5;
login = "login";
password = "password";
}
redudp {
local_ip = 0.0.0.0;
local_port = ZZZZZ;
ip = xxx.xxx.xxx.xxx;
port = MMMM;
type = socks5;
login = "login";
password = "password";
udp_timeout = 30;udp_timeout_stream = 180;
}
Насколько я знаю, TPROXY работает на PREROUTING. Он не работает с пакетом, сгенерированным с локальной машины (я имею в виду цепочку OUTPUT). TPROXY может работать на маршрутизаторе, но не может работать на исходной машине.
Пожалуйста, предложите, как мы можем справиться с этим сценарием для пересылки пакетов udp через redsocks2.
2 ответа
Попробуйте использовать перевод Google, чтобы прочитать китайский ReadMe по адресу https://github.com/semigodking/redsocks/wiki
Если вы используете правило перенаправления, адрес назначения в пакетах будет перезаписан, и если вы попытаетесь прочитать адрес назначения из пакета, используя IP_ORIGDSTADDR, вы только прочитаете адрес обратной связи.
Чтобы получить исходный адрес назначения, вы, вероятно, можете попытаться выполнить синтаксический анализ файла /proc/net/nf_conntrack (совпадает с исходным IP-адресом и портом), который содержит информацию обо всех соединениях. Но у вас могут возникнуть проблемы, если у вас есть несколько адресатов для одного и того же (srcIP,srcPort) и, следовательно, это не лучший способ. Но стоит попробовать, если у вас нет такой возможности.