Страница 1 из 3

DHT bootstrap сервер для FlylinkDC++

Добавлено: 21 мар 2014, 09:00
flylinkdc
Всем привет.

Кто хорошо разбирается в DHT и хочет по обсуждать реализацию.
Сейчас во всех клиентах от StrongDC++ есть поддержка DHT от автора стронга BM
он исходники серверной части не открывал. (где-то в инете видел php скрипт от PPK - автор Ptokax наверно)

С нашей стороны Сергей написан свой dht сервер на php
но сейчас ему некогда заниматься флайлинком
сам я особо в php не разбираюсь :) может кто-то хочет поучаствовать в Code Review.
Пока я вижу, что в скрипте нужно
1. Реализовать расшаренный коннект к базе (сейчас используется MySQL)
2. Биндинг переменных
3. Возможно пересмотреть алгоритм вообще :)

Этот DHT- сервер также добавлен в EiskaltDC++ как дополнительный
https://github.com/eiskaltdcpp/eiskaltd ... er.cpp#L37
и после очередного релиза уйдет всем линуксойдам.

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

<server url="http://strongdc.sourceforge.net/bootstrap/" agent="StrongDC++ v2.43"/>
<server url="http://ssa.in.ua/dcDHT.php"/>

исходный код тут
https://github.com/pavel-pimenov/dht-server-php

Добавлено: 21 мар 2014, 22:54
HackFresse
где искать?

Добавлено: 22 мар 2014, 10:45
flylinkdc

Добавлено: 28 мар 2014, 11:27
HackFresse
есть проблемы с безопасностью, нужно переделывать.
есть проблемы с оптимальностью, нужно переделывать.

Сначала бы просто обсудить желаемую схему работы этого самого DC-DHT, чтобы потом лишний раз не переделывать

Добавлено: 28 мар 2014, 11:51
flylinkdc
HackFresse писал(а):есть проблемы с оптимальностью, нужно переделывать.
это я знаю - просто в php плохо ориентируюсь
и про безопастность можно подробнее - может это нужно сделать быстрее всего?

Схема работы такая как и в оригинальном стронге, или ты хочешь изменить что-то координально?

Добавлено: 28 мар 2014, 12:33
HackFresse
про безопасность да, нужно бы в первую очередь... там при определённом умении можно уронить базу и попытаться тормознуть весь сервер

не поломать всё кардинально, а что-то оптимизировать.
Схема работы клиента упрощенная -- получить по необходимости какой-то список других клиентов и пытаться с ними взаимодействовать.

А вот со стороны сервера..
1) какое количество отдаваемых других клиентов самое оптимальное, почему ?

2) какие адреса отдавать? нужно ли отдавать именно рандомные, или есть смысл группировать по странам/областям (или еще как-то)?
Последняя серия "Шерлока" в русской озвучке с бОльшей вероятностью будет у клиентов с IP из России+Украины+Беларуси, чем из Италии и Румынии

3) СтОит ли учитывать, сколько раз адрес конкретного дхт-клиента отдавался другим клиентам (чтобы не направлять всех на одну ноду)?
Что-то вроде распределения нагрузки (сейчас обеспечивается рандомом)

4) Стоит ли учитывать время последнего детекта отдаваемого dht-клиента? Если клиент "засветился" всего один раз год назад, и больше в дц не появлялся - какой смысл отдавать то, чего давно уж нет (и заставлять честных дц-клиентов пытаться туда подключаться)

5) Как обойти возможность заполнения базы фейковыми данными (например, через все подряд прокси циклично и многократно запрашивать список клиентов с разными параметрами)?

Нюансов очень много

Добавлено: 28 мар 2014, 12:38
HackFresse

Код: Выделить всё

SELECT cid, ip, udp, RAND() as 'R' FROM $data_table WHERE cid != '$cid' ORDER BY 'R' LIMIT 0, 50
Вся логика дхт-сервера в одном запросе, тут есть куда развиваиться

Добавлено: 28 мар 2014, 13:11
flylinkdc
Во! это уже конструктивно.
не убегай :) вечером отпишу подробнее свое видение.

Вот нашел урл где PPK выкладывал скрипт dht-сервера
http://forums.apexdc.net/topic/3594-dht ... rap-error/
там же в ветке и автор алгоритма и StrongDC++ - Big Muscle

Добавлено: 28 мар 2014, 16:37
HackFresse
там всё еще проще, вообще хранятся только 50 последних отметившихся.
и входящая инфа так же не особо фильтруется..

Добавлено: 28 мар 2014, 17:24
flylinkdc
HackFresse писал(а):вообще хранятся только 50 последних отметившихся.
для хранения 50 записей нужен mysql ?
в php нет статического массива с временем жизни хоста?

Добавлено: 28 мар 2014, 18:03
HackFresse
там просто другой принцип работы, весь смысл в "по запросу отдать результат и умереть" (но это уже отдельная тема для споров и возражений, что всё меняется и развивается)

Не нужно думать про то, как оно было сделано на коленке абы как когда-то ранее, нужно думать про то, как оно должно работать в будущем.

Добавлено: 28 мар 2014, 20:59
flylinkdc
Ок для начала всеже подскажи как отюнить текущий скрипт.
заодно и я подучу php :)

Чего я сделал.
1. Поднял тариф до Linux VPS-512 http://infobox.ru/vps/linux
2. Добавил к munin мониторинг mySQL чтобы оценить как оно поможет.
http://109.120.164.244/munin/localdomai ... index.html
3. Все флаилинки перевел на этот сервер http://109.120.164.244/dcDHT.php
раньше были включены 2 сервера
- http://ssa.in.ua/dcDHT.php
- http://strongdc.sourceforge.net/bootstrap/ (у этого подделывался агент на "StrongDC++ v2.43" чтобы скрипт не обламывал нас)

Считаю что алгоритм во сейчас флае не очень хороший - он выбирает рандомно сервер из этого массива

как предлагаю полечить:
Флай будет всегда обращаться к одному серверу.
Сам сервер будет периодически ходить на http://strongdc.sourceforge.net/bootstrap с агентом "StrongDC++ v2.43"
забирать у оригинального стронга 50 записей размещая ее в своей базке.
или это плохая идея?
Ведь по своей сути bootstrap должен быть один - тогда он будет давать максимум актуальных нод.

Добавлено: 28 мар 2014, 21:20
HackFresse
Не согласен, привязка только к одному или двум захардкоженным серверам - плохо (они могут быть недоступны/отключены/заблокированы).

"DHT (англ. Distributed Hash Table — «распределённая хеш-таблица») — это класс децентрализованных распределённых систем", но если не работает всего лишь один IP - вся эта крутая децентрализованность и распределённость теряется

максимум актуальных нод вообще никак нельзя уместить в 50 записей

максимум актуальных нод из Италии не будет так же полезен, как половина устаревших нод из России, если качается раздача сериала "Глухарь"

Добавлено: 28 мар 2014, 21:31
flylinkdc
HackFresse писал(а):к одному или двум захардкоженным серверам
Они не зашиты в коде. а меняются на лету в конфиге.
я могу серверов туда насувать хоть 100

Также это стартовый скрипт инициализации сети - вероятно автор DHT и выбрал это число как наиболее оптимальное.
а в торренте сколько серверов и сколько узлов вертается?

Добавлено: 28 мар 2014, 21:42
flylinkdc
Вот нашел сервер от гуру этих сетей - битторент
https://github.com/bittorrent/bootstrap-dht

Сервака у них всего два и вертают они назад 16 нод

The current rate at router.utorrent.com is about 20000 requests per second. Every request returns 16 nodes. That means every node in the node buffer is handed out once every (10000000 / 16 / 20000 ~=) 31 seconds.

Добавлено: 30 мар 2014, 11:36
flylinkdc
2HackFresse -
есть проблемы с безопасностью, нужно переделывать.
есть проблемы с оптимальностью, нужно переделывать.

надеюсь ты не кинулся все переписывать с нуля
лучше подскажи что в текущем не так.

Добавлено: 01 апр 2014, 23:47
HackFresse
Постоянно приходится повторять одно и то же, но никто меня не слушает..
1) Не доверять любой входящей информации
и входящая инфа так же не особо фильтруется..
при определённом умении можно уронить базу и попытаться тормознуть весь сервер

Добавлено: 02 апр 2014, 09:55
flylinkdc
HackFresse писал(а):Постоянно приходится повторять одно и то же, но никто меня не слушает..
Я в php плохо понимаю - советы это конечно хорошо, но ты бы кинул патчик что и как поправить в коде.

p.s.
Сдох чето мой DHT вчера ночью :)
http://109.120.164.244/munin/localdomai ... index.html

mysqld кушал 100% CPU и апач не откликался...
Эх хакеры недоделанные.
нет бы скрипт помогли от тюнить, а они сразу сервак ломать побежали :)

Добавлено: 02 апр 2014, 10:02
flylinkdc

Код: Выделить всё


/var/log/apache2# tail -f access.log
95.154.76.135 - - [02/Apr/2014:11:00:57 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
93.174.93.145 - - [02/Apr/2014:11:00:57 +0400] "GET /dcDHT.php?cid=1&u4=1,%20con_count%20=%201,%20user_agent%20=%201,%20dht_time%20=%201,%20cid%20=1%20--%20 HTTP/1.1" 200 419 "-" "-"
95.154.66.248 - - [02/Apr/2014:11:00:57 +0400] "GET /dcDHT.php?cid=R2BNMVD2PSHUUC6VNMY5AWPWMJKGVBN75ZFEWVQ&encryption=1 HTTP/1.1" 200 388 "-" "-"
127.0.0.1 - - [02/Apr/2014:11:00:57 +0400] "GET /server-status?auto HTTP/1.1" 200 626 "-" "libwww-perl/6.03"
95.154.76.135 - - [02/Apr/2014:11:01:00 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:03 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:06 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:09 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:12 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:15 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:18 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:21 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:23 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:26 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:29 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:32 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:35 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:38 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:41 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:43 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:46 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:49 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"
95.154.76.135 - - [02/Apr/2014:11:01:51 +0400] "GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790 HTTP/1.1" 200 388 "-" "-"


Добавлено: 02 апр 2014, 10:22
HackFresse
перезагрузить виртуалку нужно, тогда апач начнёт откликаться и база оживёт. и посмотреть на данные в таблице, там тоже весело.

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

Добавлено: 02 апр 2014, 10:46
flylinkdc

Код: Выделить всё

SELECT cid,count(*), max(ip) FROM `dhtInfo` group by cid having count(*)>1
1 	6773 	93.174.93.145
Сделал уникальность по CID - вечером посмотрю как он засрал таблицу 1-ками :)
что-то не нашел как сделать на уровне базы check по полю чтобы CID был равен 39 буквам
mysql такое не умеет?
хотя наверно дешевле проверить на уровне php

Добавлено: 02 апр 2014, 12:49
HackFresse
flylinkdc писал(а): Вот нашел урл где PPK выкладывал скрипт dht-сервера
http://forums.apexdc.net/topic/3594-dht ... rap-error/
там же в ветке и автор алгоритма и StrongDC++ - Big Muscle
у них вот есть проверка на 39 символов, но если они до сих пор используют этот скрипт - их тоже можно уронить %-)


на хранилище данных перекладывать ответственность за проверку и фильтрацию входных данных очень неправильно...


акцентировать внимание именно на mysql тоже не стоит, нужен уровень абстракции повыше

Т.е. есть какое-то хранилище данных, в которое можно что-то записать и откуда можно что-то извлечь. Mysql, mongo, sqlite, xml, массив в памяти или просто текстовый файл - не важно.
-----------
Вот есть куча прокси-серверов, через которые можно циклически дёргать сервер запросами, которые очень похожи на валидные, типа

Код: Выделить всё

GET /dcDHT.php?cid=P5RJWR3AKVJQHR5G5DX7HYOXWMWJ2EYHFUPSRYA&encryption=1&u4=28790
генерировать динамически правдоподобные CID и порт.

В базу будут писаться данные о фейковых нодах dht-сети (IP прокси, рандомный CID и рандомный порт),
через некоторое время в выборке из 50 нод практически все ноды будут фейковыми, а оставшиеся румынскими/итальянскими "нулевиками"

Насколько полезным будет такой dht-сервер для жителей дефолт-сити, например?

Добавлено: 02 апр 2014, 13:23
flylinkdc
HackFresse писал(а):у них вот есть проверка на 39 символов, но если они до сих пор используют этот скрипт - их тоже можно уронить
Добавил кусочек - пашет

Код: Выделить всё

 // check arguments
  if(strlen($cid = $_GET['cid']) != 39)
  {
    $error = "HTTP/1.1 400 Invalid CID.";
    header($error);
    die($error);
  }
а как лучше ошибку так-же вертануть в лог www-сервера?
чтобы подобные попытки логировались

Добавлено: 02 апр 2014, 13:58
flylinkdc
HackFresse писал(а):В базу будут писаться данные о фейковых нодах dht-сети (IP прокси, рандомный CID и рандомный порт),
через некоторое время в выборке из 50 нод практически все ноды будут фейковыми, а оставшиеся румынскими/итальянскими "нулевиками"
Насколько полезным будет такой dht-сервер для жителей дефолт-сити, например?
А насколько интересна данная задача для вредителя?
если очень захотеть сломать можно ведь что угодно - но думаю они не будут заниматься этой мелкой пакость.

Можно приделать обратную связь:
Кидать со стороны сервера UDP пакеты на указанные порты клиентам
и получать подтверждения что DHT менеджер на уровне клиента еще работает (требуется дописывать клиентаи и ждать пока они обновяться)
я уже так выполняю тест открытости DHT порта в окне настроек соединения - анализирую приход на вход DHT ответного UDP пакета
и зажигаю зеленый фонарик на против номера порта.
В итоге можно знать какие клиенты сколько в онлайне и сделать что-то вроде рейтинга.
но мифические прокси сервера по идее так-же могут подделывать ответы...

Но ты как я понял клонишь к привязке к диапазонам GeoIP ?

Добавлено: 02 апр 2014, 15:04
flylinkdc

Код: Выделить всё

header("Cache-Control: no-cache, must-revalidate"); // HTTP/1.1
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT"); // Дата из прошлого
Еще вопрос - Expires зачем назад шлется?
может выкинуть и хватит Cache-Control