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

Разработка и поиск скриптов, обсуждение PtokaX.
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

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

Сообщение 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
Последний раз редактировалось flylinkdc 22 мар 2014, 10:22, всего редактировалось 1 раз.
Аватара пользователя
HackFresse
Сообщения: 507
Зарегистрирован: 02 фев 2010, 19:23

Сообщение HackFresse »

где искать?
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение flylinkdc »

Аватара пользователя
HackFresse
Сообщения: 507
Зарегистрирован: 02 фев 2010, 19:23

Сообщение HackFresse »

есть проблемы с безопасностью, нужно переделывать.
есть проблемы с оптимальностью, нужно переделывать.

Сначала бы просто обсудить желаемую схему работы этого самого DC-DHT, чтобы потом лишний раз не переделывать
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение flylinkdc »

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

Схема работы такая как и в оригинальном стронге, или ты хочешь изменить что-то координально?
Аватара пользователя
HackFresse
Сообщения: 507
Зарегистрирован: 02 фев 2010, 19:23

Сообщение HackFresse »

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

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

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

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

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

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

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

Нюансов очень много
Аватара пользователя
HackFresse
Сообщения: 507
Зарегистрирован: 02 фев 2010, 19:23

Сообщение HackFresse »

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

SELECT cid, ip, udp, RAND() as 'R' FROM $data_table WHERE cid != '$cid' ORDER BY 'R' LIMIT 0, 50
Вся логика дхт-сервера в одном запросе, тут есть куда развиваиться
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение flylinkdc »

Во! это уже конструктивно.
не убегай :) вечером отпишу подробнее свое видение.

Вот нашел урл где PPK выкладывал скрипт dht-сервера
http://forums.apexdc.net/topic/3594-dht ... rap-error/
там же в ветке и автор алгоритма и StrongDC++ - Big Muscle
Аватара пользователя
HackFresse
Сообщения: 507
Зарегистрирован: 02 фев 2010, 19:23

Сообщение HackFresse »

там всё еще проще, вообще хранятся только 50 последних отметившихся.
и входящая инфа так же не особо фильтруется..
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение flylinkdc »

HackFresse писал(а):вообще хранятся только 50 последних отметившихся.
для хранения 50 записей нужен mysql ?
в php нет статического массива с временем жизни хоста?
Аватара пользователя
HackFresse
Сообщения: 507
Зарегистрирован: 02 фев 2010, 19:23

Сообщение HackFresse »

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

Не нужно думать про то, как оно было сделано на коленке абы как когда-то ранее, нужно думать про то, как оно должно работать в будущем.
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение 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 должен быть один - тогда он будет давать максимум актуальных нод.
Аватара пользователя
HackFresse
Сообщения: 507
Зарегистрирован: 02 фев 2010, 19:23

Сообщение HackFresse »

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

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

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

максимум актуальных нод из Италии не будет так же полезен, как половина устаревших нод из России, если качается раздача сериала "Глухарь"
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение flylinkdc »

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

Также это стартовый скрипт инициализации сети - вероятно автор DHT и выбрал это число как наиболее оптимальное.
а в торренте сколько серверов и сколько узлов вертается?
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение 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.
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение flylinkdc »

2HackFresse -
есть проблемы с безопасностью, нужно переделывать.
есть проблемы с оптимальностью, нужно переделывать.

надеюсь ты не кинулся все переписывать с нуля
лучше подскажи что в текущем не так.
Аватара пользователя
HackFresse
Сообщения: 507
Зарегистрирован: 02 фев 2010, 19:23

Сообщение HackFresse »

Постоянно приходится повторять одно и то же, но никто меня не слушает..
1) Не доверять любой входящей информации
и входящая инфа так же не особо фильтруется..
при определённом умении можно уронить базу и попытаться тормознуть весь сервер
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение flylinkdc »

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

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

mysqld кушал 100% CPU и апач не откликался...
Эх хакеры недоделанные.
нет бы скрипт помогли от тюнить, а они сразу сервак ломать побежали :)
Последний раз редактировалось flylinkdc 02 апр 2014, 09:55, всего редактировалось 1 раз.
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение 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 "-" "-"

Аватара пользователя
HackFresse
Сообщения: 507
Зарегистрирован: 02 фев 2010, 19:23

Сообщение HackFresse »

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

патч будет больше исходника, позже сделаю, но
5) Как обойти возможность заполнения базы фейковыми данными (например, через все подряд прокси циклично и многократно запрашивать список клиентов с разными параметрами)?
останется открытым
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение 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
Аватара пользователя
HackFresse
Сообщения: 507
Зарегистрирован: 02 фев 2010, 19:23

Сообщение 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-сервер для жителей дефолт-сити, например?
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение flylinkdc »

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

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

 // check arguments
  if(strlen($cid = $_GET['cid']) != 39)
  {
    $error = "HTTP/1.1 400 Invalid CID.";
    header($error);
    die($error);
  }
а как лучше ошибку так-же вертануть в лог www-сервера?
чтобы подобные попытки логировались
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение flylinkdc »

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

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

Но ты как я понял клонишь к привязке к диапазонам GeoIP ?
Аватара пользователя
flylinkdc
Сообщения: 427
Зарегистрирован: 15 дек 2013, 10:26
Хаб: dchub://dc.fly-server.ru
Откуда: Караганда -> Липецк
Контактная информация:

Сообщение flylinkdc »

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

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