LINUX.ORG.RU

Помогите пропатчить rTorrent для RuTracker

 , ,


0

3

Анонсеры Рутрекера игнорируют ip в запросе, им нужен заголовок X-Forwarded-For, знаю, что можно просто пропустить через прокси(nginx) и добавить там, но хочется сделать в самом rtorrent.

Есть два файла в которые можно добавить curl_easy_setopt curl_get.cc и curl_stack.cc (в master ветке перенесены в libtorrent), как то примерно так:

  struct curl_slist* headers = NULL;
  headers = curl_slist_append(headers, "X-Forwarded-For: 1.2.3.4");
  curl_easy_setopt(m_handle, CURLOPT_HTTPHEADER, headers);

Первое, в какой правильнее/лучше.

Второе, самое затруднительное, не статично в коде ip-адрес, а как там получить доступ к переменной ip = network.local_address.set. В libtorrent для анонса это делается так.

★★

Анонсеры Рутрекера игнорируют ip в запросе, им нужен заголовок X-Forwarded-For

У меня всё работает с rTorrent 0.9.8. Ты уверен, что у тебя анонсеры трекера не заблокированы на уровне провайдера? В противном случае не могу представить, зачем тебе X-Forwaded-For, если ты не используешь http-прокси для подключения к анонсерам. Больше всего описанное тобой похоже на то, что тебе нужно раздавать со своего IP-адреса и чтобы анонсеры учитывали статистику. Так?

можно просто пропустить через прокси(nginx)

Простейшего Tinyproxy достаточно (или Privoxy).

posixbit ★★★
()
Ответ на: комментарий от yandrey

Притом что у меня на rtorrent оттуда качает с рутрекера без проблема. Думаю проще будет оттуда PKGBUILD взять и посмотреть как это сделано, чем самому патч с нуля писать.

vbcnthfkmnth123 ★★★★★
()
Ответ на: комментарий от posixbit

зачем тебе X-Forwaded-For, если ты не используешь http-прокси для подключения к анонсерам

два подключения, одно основное, с него идут анонсы, чтобы была раздача со второго

yandrey ★★
() автор топика

Про патчинг ничего не знаю, но для rtorrent+Privoxy

Чтобы Privoxy начал добавлять заголовок с IP-адресом, нужно открыть файл /etc/privoxy/user.action и добавить в самый его конец строчки:
Код:

{+add-header{X-Forwarded-For: YOURIP}}
{+redirect{s@[?](pk=[^&]+[&])?@?pk=PASSKEY&@}}
.t-ru.org

Где YOURIP - IP-адрес пользователя. В этом случае для всех адресов, содержащих t-ru.org, будет добавлен заголовок X-Forwarded-For с соответствующим IP-адресом.
vtVitus ★★★★★
()
Ответ на: комментарий от urxvt

Для управления отдачей по нескольким подключениям, давно одновременно с 2-3 провайдерам, пытаюсь хоть немного распределять торрент трафик.

Были времена, вот так делал:

map $host $realip {
    default		"10.0.0.1";
    "bt.t-ru.org"	"10.0.0.1";
    "bt2.t-ru.org"	"10.0.0.2";
    "bt3.t-ru.org"	"10.0.0.3";
    "bt4.t-ru.org"	"10.0.0.4";
}

server {
...
    proxy_set_header X-Forwarded-For $realip;
...
}

сейчас просто хочу попробовать сделать без всяких прокси, rtorrent всёравно каждый раз собираю для себя с другими изменениями

yandrey ★★
() автор топика
Последнее исправление: yandrey (всего исправлений: 1)
Ответ на: комментарий от yandrey

Для управления отдачей по нескольким подключениям, давно одновременно с 2-3 провайдерам, пытаюсь хоть немного распределять торрент трафик.

Перейди на qBittorent, он есть без GUI с доступом через веб-интерфейс (qbittorrent-nox). У него есть опция "IP Address to report to trackers (requires restart)" - то, что тебе нужно.

LamerOk ★★★★★
()

Первое, в какой правильнее/лучше.

На сколько я понял, то в первый. CurlStack что-то типа менеджера для CurlGet.

Второе, самое затруднительное, не статично в коде ip-адрес, а как там получить доступ к переменной ip = network.local_address.set. В libtorrent для анонса это делается так.

Наверное, так: man netdevice -> SIOCGIFCONF

urxvt ★★★★★
()
Ответ на: комментарий от LamerOk

Перейди на … (qbittorrent-nox). У него есть опция «IP Address to report to trackers (requires restart)» - то, что тебе нужно.

У rtorrent она тоже есть и меняется без перезапуска, и это также только добавление ip= к анонсу. qbittorrent-nox не устраивает по отсутствию некоторых возможностей, особенно по работе с трекерами.

yandrey ★★
() автор топика

тебе нужен curl_stack.cc.

как получить адрес? как-то так, например: https://stackoverflow.com/a/12131131 имя интерфейса у тебя будет в m_bind_address.c_str(). конечно, если указан bind интерфейс. если не указан, тогда на этапе до открытия сокета ты его не получишь. если это дефолтный интерфейс, то адрес можно выяснить, например, так: https://stackoverflow.com/a/17909967

не знаю, понятно ли это.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

как-то так, например

local_address в rtorrent, когда присутствует в настройках, это произвольная строка с ip-адресом или доменом, брать ip с интерфейса бессмысленно, у меня он там внутренний

yandrey ★★
() автор топика
Ответ на: комментарий от yandrey

В винде было такое: при поднятии локального ретеркера http://127.0.0.1:9000/announce и включенном DHT один клиент анонсировал себя под разными соединениями, как будто это разные машины с разными адресами.

anonymous
()
Ответ на: комментарий от yandrey

ты хотел адрес сетевого девайса же. я отсюда в хрустальном шаре не вижу настройки твоего сервера.

в приведённом тобой примере берётся адрес из настроек. ну и бери его так же. в rtorrent я вижу core/manager.h, в котором такой же local_address есть. включай его и точно так же вызывай, и получай свой local_address.

Iron_Bug ★★★★★
()
Ответ на: комментарий от Iron_Bug

адрес, передаваемый трекерам, про сетевые интерфейсы я ничего не писал, возможно, для незнакомых с rtorrent, название network.local_address.set чуть противоречивое

были бы у меня достаточные знания С/C++, не создавал эту тему, а они практически полностью отсутствуют, надо идти в соседнюю тему про книгу 😀

yandrey ★★
() автор топика
Ответ на: комментарий от yandrey

держи: https://0x0.st/80XU.patch

это компилится. проверить не могу, потому что не хочу разворачивать rtorrent у себя локально. если вдруг недостаточно, напиши, надо будет ещё в curl_get.cc влепить такой хэдер. но вроде бы не нужно.

да, я предполагаю, что в local_address просто строка с адресом (ipv4 или ipv6). особо глубоко в настройки не смотрела.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от Iron_Bug

Спасибо, работает, я до этого сам пробовал подобные правки в curl_stack.h и curl_stack.cc по аналогии с bind_address, но не работало без добавления строки в manager.cc.

Обязательно использовать buffer snprintf(), оставил свой первый вариант:

  if (!m_local_address.empty()) {
    struct curl_slist* headers = NULL;
    auto xffh = std::string("X-Forwarded-For: ") + m_local_address.c_str();
    headers = curl_slist_append(headers, xffh.c_str());
    curl_easy_setopt(get->handle(), CURLOPT_HTTPHEADER, headers);
  }

в нём есть что то неправильное?

yandrey ★★
() автор топика
Ответ на: комментарий от yandrey

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

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)
Ответ на: комментарий от yandrey

на самом деле, конечно, можно исхитриться и один раз при установке local_address (прямо в manager) проинициализировать эту строку, а потом её использовать. но это будет экономия на спичках. эта операция делается один раз на открытие сокета и там оверхед просто ничтожный. можешь перенести формирование хэдера в инициализацию и хранить не адрес, а готовую строку с хэдером. будет милипиздрически, но быстрее работать.

Iron_Bug ★★★★★
()
Последнее исправление: Iron_Bug (всего исправлений: 1)