Вы можете представить мир без интернета?

Временное отключение Интернета встречается чаще, чем вы думаете. На западе это менее распространено, но может возникать по многим причинам, основными из которых являются цензура, кибератаки, стихийные бедствия, действия или ошибки полиции или служб безопасности.

Некоторые из последних отключений:

  • 2008 г. — три отдельных инцидента со значительным повреждением подводных оптических кабелей связи привели к перебоям в работе с 23 января по 4 февраля на Ближнем Востоке и в Индии, что привело к перебоям в работе интернета и его замедлению.
  • 2011 г. - Интернет в Египте был отключен правительством, в результате чего примерно 93% сетей остались без доступа, в попытке остановить мобилизацию на антиправительственные протесты.
  • 2012 — 29 ноября сирийский интернет был отключен от остального мира. Предполагается, что причиной стала кибератака.
  • 2016 — 21 октября несколько распределенных атак типа «отказ в обслуживании» (DDoS-атаки), нацеленных на системы, управляемые DNS-провайдером Dyn, привели к тому, что основные интернет-платформы и сервисы стали недоступны для большого количества пользователей в Европе и Северной Америке.
  • 2017 — 17 января около 20 процентов жителей Камеруна заблокировали доступ к Интернету из-за антиправительственных протестов.
  • 2019 — Правительство Индии приняло Закон о внесении поправок в Закон о гражданстве. Чтобы предотвратить протесты и возмущение в социальных сетях, правительства различных штатов решили закрыть доступ в Интернет.

Итак, насколько популярен Интернет?

Время для некоторых удивительных статистических данных:

  • В 2020 году 86,6% населения развитого мира имеют доступ к Интернету.
  • В 1995 году она составляла менее 1%.
  • С 1999 по 2013 год число интернет-пользователей увеличилось в десять раз.
  • первый миллиард был достигнут в 2005 году, второй миллиард в 2010 году, третий миллиард в 2014 году.

Как легко можно отключить интернет?

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

Чтобы понять, что это значит, важно понять, как работает интернет-запрос.

Что такое DNS и как он работает?

DNS (серверы доменных имен) работают как телефонная книга, но вместо контактов возвращают физическое местоположение адресов веб-сайтов. Выполняется поиск удобочитаемых доменов (например, google.com), и возвращается IP-адрес сервера. Затем вызывающий абонент будет получать данные, используя IP-адрес.

Все, что подключено к Интернету, имеет IP-адрес, а DNS-серверы избавляют людей от необходимости запоминать IP-адреса веб-сайтов, которые они хотят посетить.

Порт по умолчанию для DNS — 53.

Порт по умолчанию для веб-страницы — 80 для http и 443 для https.

Почему мы так много внимания уделяем DNS?

DNS — это способ, которым мы планируем общаться после отключения Интернета. Это потому, что когда Интернет отключен, он отключен для обычных пользователей. Правительство, полиция и авторизованные пользователи, вероятно, по-прежнему имеют доступ к большей части контента. По этой причине DNS, вероятно, все еще работает.

Как мы можем использовать это тогда?

Мы можем использовать это, запустив собственный DNS-сервер. Мы можем проксировать все DNS-запросы на другой работающий DNS-сервер, но в то же время объединять сообщения и контент, чтобы ими можно было поделиться.

Однако это не будет простым, нам придется создать собственный протокол для интерпретации содержимого сообщения, потому что мы сталкиваемся со многими потенциальными проблемами:

  • Сообщение не может содержать огромное количество данных
  • Сообщение может быть отправлено не по порядку

Наш контракт на сообщение

Чтобы расшифровать сообщение, мне нужен контракт. Это будет базовый пример. DNS-запросы легко перехватываются, поэтому в реальном сценарии вы захотите зашифровать сообщение и, возможно, разделить его на несколько запросов. Для этого примера, и это несложно, я собираюсь отправить только отправителя и сообщение.

Ограничения, с которыми придется столкнуться:

  • URL-адреса должны быть меньше 2048.
  • Доступные символы: 0–9, az, тире, точка, подчеркивание и тильда.

Базовый контракт должен был бы отформатировать сообщение следующим образом:

craig_mymessage.google.com
---------------^ domain
------^ message
^ sender

Давайте попробуем это

DNS-сервер в node.js

Давайте создадим базовый DNS-сервер, для этого в узле вам потребуется установить следующие пакеты:

npm install native-dns async

Добавьте базовый DNS-сервер, который принимает DNS-запрос на порт 53. Приведенный ниже код принимает запрос, проксирует его на реальный DNS-сервер и возвращает результат. Это действительно важно, потому что мы хотим, чтобы сервер действовал так, как если бы он был настоящим DNS-сервером.

Сохраните файл как dns.js

let dns = require('native-dns');
let async = require('async');
let authority = { address: '8.8.8.8', port: 53, type: 'udp' };
let server = dns.createServer();

server.on('listening', () => console.log('server listening on', server.address()));
server.on('close', () => console.log('server closed', server.address()));
server.on('error', (message) => console.error(message.stack));
server.on('socketError', (message) => console.error(message));
server.on('request', (request, response) => {
    let tasks = [];
    let name = request.question[0].name;
    let pieces = name.split('.')[0].split('_');
    if(pieces.length > 1) {
        name = pieces[0];
        pieces.shift();
        console.log(`username: ${name}, message: ${pieces.join(' ')}`);
    }
    request.question.forEach(question => { tasks.push(cb => proxy(question, response, cb)) });
    async.parallel(tasks, function() { response.send(); });
});

function proxy(question, response, cb) {
    let request = dns.Request({ question: question, server: authority, timeout: 1000})
    request.on('message', (error, message) => { message.answer.forEach(a => response.answer.push(a))} );
    request.on('end', cb);
    request.send();
}
server.serve(53);

Чтобы установить этот DNS-сервер по умолчанию, выполните команду:

echo nameserver 127.0.0.1 | sudo tee /etc/resolv.conf

И запустите DNS, запустив dns.js:

sudo node dns.js

И протестируйте его, запустив что-то вроде:

craiggoddenpayne@Craigs-MBP  ~  host www.google.com

Который вернет что-то вроде:

www.google.com has address 216.58.213.100
www.google.com has IPv6 address 2a00:1450:4009:81c::2004

Давайте проверим это

Теперь я указываю на свой собственный DNS-сервер, теперь я могу отправить свой запрос. Чтобы проверить это, в браузере или в консоли отправьте запрос на

craig_we_should_meet_by_the_hill.google.com

Вы должны увидеть в выводе работающего приложения

username: craig, message: we should meet by the hill

Вывод

Этот метод на самом деле довольно часто используется хакерами и тестировщиками на проникновение для получения информации из сети, где Интернет отключен. В реальном сценарии вы хотели бы зашифровать данные и иметь сценарий для генерации сообщения.