Openwrt gateway и Boreanet

22 февраля 2016 в 13:44

Mesh-роутер — это просто

С того момента, когда cjdns добавили в официальный репозиторий OpenWRT, процесс подготовки mesh-роутера стал просто тривиален. Саму установку OpenWRT на роутеры описывать подробно не вижу смысла, т.к. это популярная тема. На многих официально поддерживаемых роутерах задача установки свободной прошивки сводится к простому скачиванию Factory архива и скармливанию его стандартной форме обновления прошивки на заводской системе. Главное, чтобы не было блокировки на установку сторонней прошивки, но и в этом случае, как я полагаю, будет множество обходных путей.

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

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

Установка
Как написал выше, OpenWrt Chaos Calmer 15.05 имеет необходимые пакеты в официальном репозитории. Заходим в меню System -> Software. Обновляем список и устанавливаем пакеты luci-app-cjdns и cjdns. Последний является зависимостью первого и должен автоматически установиться.

Mesh режим
После установки, cjdns сразу начнет работать. Т.е. обычная установка проходит в один шаг. Но мы хотим, чтобы роутер не только соединялся с cjdns нодами в нашей локальной сети, но и стал активным участником меш-сети. В меню появляется раздел Services -> cjdns. Во вкладке Overview отображаются все текущие соединения. Если на ваших домашних компьютерах работает cjdns, с большой вероятностью роутер установит с ними соединение в меш-режиме. Нам нужно добавить 802.11s WiFi сеть. Делается это так же просто:
идем в раздел Network -> WiFi,
на нужном физическом интерфейсе нажимаем Add,
по текущей договоренности на форуме cjdroute.net выбираем 11 канал в 2.4 ГГц,
поле Mode будет 802.11s — WiFi mesh,
Network у нее будет отдельный, т.к. нам не нужно, чтобы эти участники попадали во внутреннюю Lan сеть (я создал новый с именем Mesh),
SSID: hyperboria_mesh,
защищать эту сеть не нужно.

В разделе Network -> Interfaces у нас появится новая сеть. Protocol я выбрал unmanaged — нам нет необходимости присваивать участникам обычные IP адреса.

Так же можно добавить простую точку доступа без защиты с именем, например, cjdroute.net, которая подключает устройства к этой сети. Это позволит подключать девайсы, не умеющие в 802.11s, но умеющие в cjdns, к hyperboria.

Теперь идем в Services -> cjdns -> Settings, спускаемся к пункту Ethernet Interfaces и добавляем там нашу новую сеть (если забыли имя, то можно подсмотреть в списке Network -> Interfaces). Beacon Mode я выбрал 2, чтобы он не только ожидал там специальные Ethernet фреймы, с помощью которых будет устанавливать mesh-соединения, но и сам рассылал такие. Так же стоит убедиться, что в домашней локальной сети тоже соединяемся. Если провайдер предоставляет локалку свою, можно попробовать и через WAN интерфейс соединяться с другими клиентами провайдера.

Оверлэйные UDP-соединения (он же UDP транспорт)

Естественно, глупо ожидать, что по всему городу рассыпаны уже эти коробочки, и функционирует полноценная сеть на всю страну. Тем более, что между городами крайне низкая плотность населения. Для дополнительной связи нам нужно будет добавить коннекты через UDP транспорт. Это обычный оверлэйный режим поверх других сетей типа интернета. Примерно так работает TOR. Только в данном случае, соединения будут устанавливаться напрямую без попыток анонимизации и потери скорости.

Стоит так же упомянуть о том, что здесь есть непонятый многими, но очень важный момент — необходимость добавлять такие соединения вручную и устанавливать связь с теми, с кем обменялся ключами и паролями. На первый взгляд, эта процедура идиотская и создает лишние сложности в установке: ведь в оверлэйных сетях типа Tor и I2P этого делать не надо — есть bootstrap ноды, которые передают вам список всех адресов других участников. Однако, это удобство является уязвимостью — в том же Китае к этим нодам подключаются атакующие, получают список всех участников и блокируют соединения с этими адресами и самой нодой. Т.е. удобство добавляет в систему единую точку отказа и ставит под угрозу стабильность работы вообще.

Обменяться ключами и адресами можно на том же форуме cjdroute.net в специальном разделе. Вероятно, позже, ваши друзья и коллеги тоже присоединяться к сети и обменяются с вами нужными данными.

Добавление соединений происходит так же просто в разделе Services -> cjdns -> Peers. Там можно добавить пароли для входящих подключений (помните, что для этого надо роутеру иметь белый IP адрес и открыть UPD порт) и информацию об исходящих подключениях. Каждое новое соединение увеличивает стабильность работы. А благодаря простоте интерфейса, добавлять новые можно будет между делом в течение пары минут.

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

Бонусный пункт: защищенный выход в интернет

Cjdns — это по сути решение, которое позволяет создавать распределенную виртуальную частную сеть. Благодаря своей распределенной архитектуре эта VPN вырастает в огромную Semi-meh (оверлэйная + меш) сеть и строит новый интернет будущего (Hyperboria).
Если на ваших компьютерах установлен и правильно настроен CJDNS, значит они будет «видеть» друг друга, даже если оба находятся в тысячах километрах друг от друга за провайдерскими NATами. CJDNS предоставляет IPv6, и все поддерживающие его программы будут отлично работать. Этакий хамачи здорового человека. Но кроме собственно доступа в hyperboria и соединения личных устройств в единую сеть хотелось бы в пару кликов сделать защищенный туннель в обычный интернет.

Настройки на сервере, который будет выпускать нас в интернет.

Допустим, у нас есть VPS в какой-нибудь нормальной стране, где интернет не подвергается агрессивным нападкам. Мы настроили на этом VPS такую же CJDNS ноду и хотим иметь возможность выхода через нее в интернет. Для этого в конфиге cjdns нашей VPS нужно добавить входящий туннель в разделе ipTunnel -> allowedConnections. Например:
{
"publicKey": "kdddddgfgsftrtrtrnrmnmnmgnmdfndmfnmdfnmdnfmdfmdndfdf0.k",
// Публичный ключ нашего клиента. Для роутера достаем в настройках
Services -> cjdns -> Settings
"ip4Address": "192.168.45.10", // IP адрес клиента, который будет автоматически присвоен
"ip4Prefix": 24 // Префикс. Соответствует маске 255.255.255.0
}

В консоли добавляем IPv4-адрес на интерфейс туннеля и разрешаем Forwarding, чтобы выпускать в интернет клиентов.
ip addr add dev tun0 192.168.45.1/24
echo 1 > /proc/sys/net/ipv4/conf/all/forwarding

Добавляем роут и правила для firewall

ip route add dev tun0 192.168.45.0/24
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -i eth0 -o tun0 -m state —state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT

Теперь наш VPS сервер может заменять нам обычные платные VPN сервисы. Кстати, по моим ощущениям, настройка Получается гораздо быстрее и проще чем того же OpenVPN.

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

Настройки на роутере

Тут все просто. Идем в Services -> cjdns -> IP Tunnel и в Outgoing connections добавляем публичный ключ cjdns из конфига нашей VPS ноды. Прописанный IP присваивается автоматически. Маршрутизация клиентов роутера в интернет через этот VPN настраивается добавлением соответствующих правил на фаерволе.

image

Вы можете прописать адрес нашего сервера 192.168.45.1 в качестве шлюза для всех соединений, а можете просто добавлять статические роуты и перенаправлять запросы только для конкретных сайтов: Network -> Static routesimage

В данном случае, я сделал защищенные и устойчивые соединения для всех устройств в моей домашней сети на рутрекер и btc-e.com. По какой-то странной причине, мне захотелось сделать подключения к этим сайтам более безопасными.

В этом бонусном пункте есть и обратный вариант: сделать роутер таким сервером. Например вы находись где-то в гостях или пользуетесь общественным WiFi и хотите сделать соединения более безопасными. В той же вкладке настроек роутера добавляем входящие соединения, а на ноутбуке исходящие. Немного другие правила для роутинга — и вот вам более защищенная связь из любого места.

Таким образом, мы левой и правой кнопками мыши добились поставленных задач. На написание, возможно, банальной для хабра статьи меня сподвигла эта карта cjdroute.net/map. Многие добавили свое местоположение с комментарием, что готовы присоединиться, если им помогут все настроить. Во времена первых статей о CJDNS, процедура настройки была местами запутанной, а большинство мануалов подразумевали ручную сборку OpenWRT и ковыряние конфигов. Конечно, есть ряд настроек, которые хорошо бы добавить позже в консоли, но для старта достаточно описанных пунктов. Надеюсь, это может многим превратить свое желание в намерение. Если будут какие-то вопросы, мы охотно отвечаем на форуме cjdroute.net