Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Домашний DNS сервер, легкий вариант.
GAMEINATOR forums > Soft, Hard и периферия > Hard & Soft
jamakasi
В общем понадобился простенький DNS сервер для дома, немного обмозговал и вышло следующее. Брать PowerDNS, BIND или pdnsd не стал, ибо это монстры с которыми надо еще поломать голову как их настроить.

Цели которые преследовались архитектурно:
1) Работать на всем моем зверопарке(Win\Linux\MacOS x).
2) Обособить ядро сервера от логики работы с обработкой запросов.
3) Система плагинов для логики обработки запросов.
3.1) API для удобной разработки плагинов.

Что выбрал:
1) Java, т.к. работает везде и всюду и кроме того довольно часто приходится на ней решать мелкие задачи.
2) Для альфа версии уже есть черновик
3) Движек JS интегрированный в саму яву под названием Nashorn, уже внедрил как альфу.
3.1) Пока только заготовка с 1 функцией.

Возможно проект будет интересен кому то еще кроме меня, так же появился человек который возможно заинтересуется в коммерческом применении.
Цели и идеи которые появились во время написания, все будет по максимуму реализовано через плагины, 1 пункт=1 плагин:
1) Многопоточный опрос множества днс серверов и ответ клиенту с первого ответившего. На данный момент не реализовано но будет точно.
2) Ведение своих записей DNS, т.е. статичных. По сути основное что нужно было лично мне. Как минимум склоняюсь к использованию универсального драйвера для доступа к максимальному числу баз. В планах mysql, sqlite а остальные будут поддерживаться побочно. Сильно вероятно что будет удобный API в JS для хранения сторонних данных в базе.
3) "Динамические DNS" записи для домашней локалки. Как идею продумал примерно так: каждый новый IP обратившийся к серверу падает в следующую логику. Сервер смотрит IP, смотрит имеется ли запись для такого IP, если нет то создает "временную" запись с именем компа который делал запрос. Фишка в том что можно будет скажем обращаться к своему смарту по имени вместо его динамичного IP. Все это к условию что таких записей не было задано статично если у вас дома все IP адреса статичные.
4) Блокировка\редирект некоторых доменов. Вероятно можно будет привязать для индивидуальных записей, к примеру комп ходит куда угодно а вот ноутбук не может ходить на яндекс.
5) Частичное решение проблем с блокировкой сайтов от операторов. Многие провайдеры режут доступ к сайтам именно по DNS, тут же можно глянуть что пришло в ответе и если IP ведет на сервер со страничкой блокировки то ждать ответа от других DNS серверов.
6) Вырезка некоторой надоедливой рекламы на всем домашнем хозяйстве.

Отдельно плагины к ядру:
1) Плагин мини веб сервера для админки программы.
2) Нативный GUI для админки программы(на swing'е)
3) Косвенные службы (Возможно простейшая реализация сервер WINS или нечто другое).
4) Возможно помощник пробития NAT'а на роутере пользователя. Такое полезно тем кто не знает\не умеет открывать порты для игр\софта и т.д.


Зачем это лично мне?:
1) Хочу свой локальный DNS сервер в котором будут доменные имена всех моих железок(IP телефон, комп, 3 ноутбука+ 2 смартфона + 2 телека).
2) Хочу свой асинхронный DNS сервер который сам будет решать какой внешний DNS сервер самый резкий да еще и будет помогать обходить блокировки провайдера.
3) Хочу универсальный резчик рекламы. Все не вырежет но как минимум половину точно убъет.


На данный момент есть тестовая версия с минимум функционала, самая ранняя альфа написанная за вечер. Есть ядро, есть плагин, есть зачаток API.

Сам плагин представляет из себя внутри минимально 2 функции, "init" с аргументом всего запроса который пришел от клиента и getResult без аргументов которым выдергивается готовое сообщение которое и будет отправлено клиенту.
Плагин выглядит так(реально рабочий вариант)
var question = Java.type('org.xbill.DNS.Record');
var Message = Java.type('org.xbill.DNS.Message');
var Flags = Java.type('org.xbill.DNS.Flags');
var Section = Java.type('org.xbill.DNS.Section');
var PluginAPI = Java.type('org.jamakasi.PluginAPI');
var RecArray = Java.type("org.xbill.DNS.Record[]");

var result = new Message();

var writeNormalMessage = function(qHeader,dnsRecordsArr){
response = new Message(qHeader.getID());
response.getHeader().setFlag(Flags.QR);
if (qHeader.getFlag(Flags.RD)) {
response.getHeader().setFlag(Flags.RD);
}
for (var i = 0; i < dnsRecordsArr.length; ++i) {
//System.out.println("Answer: " + dnsRecordsArr[i]);
response.addRecord(dnsRecordsArr[i], Section.ANSWER);
}
return response;
}

var init = function(questMessage) {
question = questMessage.getQuestion();
print('Plugin querry: ' + question);
var api = new PluginAPI();
RecArray = api.lookUp(question.getName(),question.getType());

if (RecArray != null) {
result = writeNormalMessage(questMessage.getHeader(),RecArray);
}else{
//System.out.println("Answer: no internet or no records found");
}
};

var getResult = function () {
//print('Plugin result: ' + result);
return result;
};


Что хочется узнать у постояльцев форума:
1) Кому либо интересно это?
2) Интересна ли сама система что можно будет плагинами собрать только то что надо лично Вам?
3) Нужна ли вообще система плагинов?
4) Ваши предложения по API, добавить и упростить можно все что угодно.
5) Возможно у Вас есть какие-то дополнительные интересные идеи?
6) Будет ли кому-то интересно попробовать пописать плагины?
7) Готовы ли Вы поддержать программу копейкой?
D&S
jamakasi, честно говоря, с появлением клауд-провайдеров, ваще забыл уже что такое свой днс-сервер) Да и в каждом недобитом домашнем роутере он есть.
jamakasi
D&S, согласен, они есть в каждом домашнем роутере но их функционал заканчивается на том что они просто неуправляемые и тупо выступают репитером верхних провайдерских днс.
Тут же вся идея в том что бы сделать больше функционала и чтобы оно могло работать как индивидуально на компе так и по мелкой локалке типа домашней. К примеру можно блокировщик днс(порезать рекламу), собственные записи днс(скажем я таким пользуюсь, у меня пара серверов удаленных, домашний комп, комп у родителей и брата и мне проще прописать статикой их ip и "DNS A" типа me.home brat.home batya.home, точно так же этот вариант подойдет для игровых серверов, скажем я часто играю в tf2 и иногда RUST а там домен любимого сервера слишком длинный и не запоминающийся а так я смогу его укоротить вплоть до 1 буквы). На такое роутерный днс уже не способен.
D&S
Цитата(jamakasi @ 24.03.2016, 07:57) *
функционал заканчивается на том что они просто неуправляемые и тупо выступают репитером верхних провайдерских днс

Ну не всегда, хосты как раз, как правило, даёт создавать. Ну и зависит от роутера конечно, у меня то вообще дома Cisco 881, а она все это покрывает с лихвой. Например, ей можно сказать - чтобы она подбирала свежий конфиг по шедуллеру из сети (то есть можно автоматизировать работу с хостами, блокировщиками, итд), её можно настроить на любую реакцию на события, например, ухудшения полосы пропускания.. есть агенты джиттеры, которые достатчно умны чтобы оценвать полосу до определенного качества видео/аудиа потоков, звонков итд итп.. и в зависимости от событий менять маршрутизацию, или вносить изменения в хосты. Соответственно логику запросов по рут днсам тоже можно очень гибко настроить, то есть например: компам с такими то ип, или из такой то подсети, по такому то хосту - идти лукапить на такой то днс, а если тот днс не отвечает 10 сек, то идем на другой... или отвечаем как всем. Собственно там логика ограничена лишь фантазией.
jamakasi
D&S, про циски и микротики я вкурсе, сталкивался и умеют они почти все. Но как обычно у большинства длинки, тп линки, асусы которые и так умеют не много а их еще и злые провайдеры шьют своим говном. У меня первый роутер от провайдера домру был, так на практике это был вполне мощный нэтгир вот только они его прошили своим говнецом в котором из настроек было только вход в админку, в админке отображение "подключен\не подключен интернет", возможность ввода логина\пароля для подключения к провайдеру(без других настроек вообще) и просмотр(внимание! не изменение) имя и пароля вайфай сети. Т.е. мощный роутер просто был залочен, узб порт выпаян и мне как пользователю нельзя было даже сменить пароль вайфая!) А таких случаев очень много на каждом шагу.
Мне как раз завтра должны привести микротик роутерборд и я наконец выкину свой последний асус.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.