До появления официальной поддержки пакетов 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](https://habrastorage.org/getpro/habr/post_images/77c/bc9/e72/77cbc9e72154a4f6d75ef3eede4da1c2.png)
Вы можете прописать адрес нашего сервера 192.168.45.1 в качестве шлюза для всех соединений, а можете просто добавлять статические роуты и перенаправлять запросы только для конкретных сайтов: Network -> Static routes
![image](https://habrastorage.org/getpro/habr/post_images/c3d/c15/9ce/c3dc159cee62648ee7db17cb23786182.png)
В данном случае, я сделал защищенные и устойчивые соединения для всех устройств в моей домашней сети на рутрекер и btc-e.com. По какой-то странной причине, мне захотелось сделать подключения к этим сайтам более безопасными.
В этом бонусном пункте есть и обратный вариант: сделать роутер таким сервером. Например вы находись где-то в гостях или пользуетесь общественным WiFi и хотите сделать соединения более безопасными. В той же вкладке настроек роутера добавляем входящие соединения, а на ноутбуке исходящие. Немного другие правила для роутинга — и вот вам более защищенная связь из любого места.
Таким образом, мы левой и правой кнопками мыши добились поставленных задач. На написание, возможно, банальной для хабра статьи меня сподвигла эта карта cjdroute.net/map. Многие добавили свое местоположение с комментарием, что готовы присоединиться, если им помогут все настроить. Во времена первых статей о CJDNS, процедура настройки была местами запутанной, а большинство мануалов подразумевали ручную сборку OpenWRT и ковыряние конфигов. Конечно, есть ряд настроек, которые хорошо бы добавить позже в консоли, но для старта достаточно описанных пунктов. Надеюсь, это может многим превратить свое желание в намерение. Если будут какие-то вопросы, мы охотно отвечаем на форуме cjdroute.net
Комментарии (20)
merlin-vrn
22.02.2016 18:53-1Если честно, самая большая польза от этого топика — новость о том, что оно появилось в репах openwrt. Вот и лишний повод мне обновить, наконец, роутер до 15-го. А может быть, подождать и уже обновлять сразу до 16-го релиза.
J_o_k_e_R
22.02.2016 20:16+2Почему вы пишите так, как будто cjdns и mesh — это тождественные понятия? На микротиках (как минимум) можно сделать mesh без cjdns. Вообще cjdns — это далеко не единственная mesh-сеть. Правильный заголовок был бы "Роутер с cjdns — это просто".
Foxcool
22.02.2016 20:37По-моему, текущий заголовок подходит и не говорит о тождественности: реализовано звено меш-сети одним из способов. Использованные средства перечислены в тегах.
achekalin
22.02.2016 21:41+4Ну я вот открывал, думая найти информацию о mesh именно на микротиках (чего из заголовка не следовало), а увидел — на openwrt (чего в заголовке также не обозначено).
Сделайте доброе дело для тех, кто статью будет в поисковике искать: укажите в заголовке все теги (хотя бы даже в скобках, но лучше в виде связанного предложения).
Ну и пара слов, «зачем» делать mesh, не помешало бы. Хабр — совсем не форум поклонников openwrt, в том смысле, что иные вещи, хотя и понимаемы тут, совсем не идут по дефолту. А поскольку Хабр несет (кроме финансовой) образовательную функцию, несколько абзацев о том, «что», «зачем», и «с чем его едят» были мало что не лишними, а прямо улучшили бы статью!
Mixim333
23.02.2016 08:29+1Спасибо, было интересно почитать. Ни могли бы меня просветить по отдельному моменту: https://ru.wikipedia.org/wiki/Ячеистая_топология — «Ячеистая топология (англ. Mesh Topology) — сетевая топология компьютерной сети, построенная на принципе ячеек, в которой рабочие станции сети соединяются друг с другом и способны принимать на себя роль коммутатора для остальных участников» — т.е. потенциально, если наша Mesh-сеть разрастется до значительных масштабов, то нам будет не нужен провайдер вообще, получится что-то вроде немаленькой локальной сети?
Foxcool
23.02.2016 11:24Теоретически да. Гиперборея — это даже не локалка, а глобальная сеть, т.к. к ней соединены участники из разных стран. НО, стоит иметь ввиду, что соединить весь мир только вайфаем — это неэффективно и вообще нереально:
- даже если предположить, что у нас на каждые сто метров кто-то живет на всей территории, то есть океаны, через которые надо соединяться подводными кабелями или спутниковыми каналами — это уже на данный момент подразумевает наличие бизнеса и магистральных провайдеров. Не потянет народ такой уровень самоорганизации.
- Использование только вайфай соединений на дальние расстояние — это неэффективно. Предположим, у нас есть два человека в городе. Друг до друга у них 1000 прыжков по вайфай точкам. Если использовать только этот способ, без применения оверлэйных соединений поверх провайдеров интернета и сокращения количества хопов до нескольких штук, будут очень сильные задержки. Связь, конечно, будет, но она будет медленной и не потянет быструю передачу больших файлов и тем более реалтаймовую игру по сети.
Однако, меш-сети отлично решают проблемы последней мили. Где-то тут на хабре, кажется, пролетала статья о том, как жители какого-то европейского городка в горах, которым не хотели обычные провайдеры обеспечивать нормальный интернет, сами построили меш-сеть и решили эту проблему. Меш-сети особенно актуальны в населенных пунктах с неплотной застройкой: частный сектор городов, поселки, деревни. Провайдеры не спешат тянуть туда кабели, т.к. слишком мало потенциальных клиентов, но те, кто заинтересован, могут самоорганизоваться и врубить вайфай/перекинуться кабелем. Та же сотовая связь, по-моему, имеет ячеистую топологию и потому имеет успех: какие-то вышки соединены друг с другом только радиоканалом, а какие-то уже подключены оптикой.
Так же, если вернуться к CJDNS, как одному из инструментов, то стоит упомянуть, что его применение не ограничивается именно построением меш-сетей по вайфаю. По сути, CJDNS выполняет одну ограниченную функцию: строит IP интересным способом, при котором нижеперечисленные фичи идут из коробки:
- не надо у кого-то спрашивать IP-адрес. Он генерируется вместе с ключами сколько угодно раз;
- этот адрес постоянный. Он не меняется после переезда в другой город или страну;
- когда вы шлете пакеты на другой IP адрес, то они автоматически шифруются его публичным ключом и прочитать эти пакеты может только получатель (естественно, насколько позволяет сила алгоритма шифрования);
- нельзя заблокировать чей-то айпи адрес. И при использовании в соединениях вайфай, крайне сложно (если вообще возможно) отследить путь. Надо ловить и потрошить каждого участника цепочки. Именно поэтому, использование cjdns может сильно помочь TOR & I2P от атаки "глобальный наблюдатель";
- каждый узел, соединенный с другими узлами, может принимать на себя роль коммутатора и передавать пакеты через себя получателю. ПРи этом система старается использовать оптимальный маршрут. Если быстрее передать поверх обычного интернета, то он передаст поверх интернета.
И применение этой реализации IP может быть как в построении меш-сетей (локальных частных и глобальной), так и в качестве быстрой неанонимной сетки чисто поверх интернета. В нашем случае строят одновременно и то и то: SEMI-MESH сеть, в которой хотят использовать любые каналы связи — от интернет-провайдеров до обсуждений возможности соединяться лазерными указками или модулировать сигнал на радиолюбительских частотах. Т.е. Применение этой штуки может помочь строить людям неубиваемый новый интернет (хоть медленная связь, но будет и всегда нефильтруемая и плохо отслеживаемая. Далее уже чем больше свободы, тем быстрее и качественнее связь).Foxcool
23.02.2016 11:27https://xakep.ru/2014/09/05/mesh-networks/ вот статья на ксакепе про меш-сети еще
J_o_k_e_R
23.02.2016 20:18-1нельзя заблокировать чей-то айпи адрес. И при использовании в соединениях вайфай, крайне сложно (если вообще возможно) отследить путь. Надо ловить и потрошить каждого участника цепочки. Именно поэтому, использование cjdns может сильно помочь TOR & I2P от атаки «глобальный наблюдатель»;
Ну вот опять приехали. Не дает меш вообще и cjdns в частности анонимности и не преследует, в том числе по словам автором cjdns, эту цель. И маршрут отследить просто, так как адрес отправителя и получателя не шифруется. Достаточно последовательно слушать радиодиапазон на "пути" следования пакета, в которому ("пути") точки удалены на небольшое расстояние друг от друга (в отличие от i2p на большом интернете, где "соседние" пиры могут быть расположены на различных континентах).
И I2P (точно) как и обращения к внутренним ресурсам tor (тут не уверен) не подвержены атаке "глобальный наблюдатель", если мы говорим про одно и то же. В отличие от посещения ресурсов в большом интернете через tor. А i2p для посещения большого интернета вообще не предназначен.
pcmaniac
23.02.2016 20:08Настроил на работающем рутере, нашёл один живой линк, добавил, показывает коннект с ним, но не видит ресурсы, доступные только в cjdns сети. Есть какие-то тонкости? На рутере добавил интерфейс cjdns как ещё один исходящий для lan. Этого достаточно или ещё что-то нужно допилить?
Пинг на IPv6 адрес, живущий в cjdns выдаёт Transmit error: code 1231
И ещё не совсем ясен момент с именем интерфейса, которое мы указываем при создании 802.11s сети. Что-то потом с этим интерфейсом делать нужно или он чисто для служебных нужд и остаётся болтаться с дефолтными настройками?Foxcool
24.02.2016 10:03+1Вообще, правильный вариант — установить для этих целей cjdns на компьютере. Но в принципе, я думаю, что можно превратить роутер в такой ipv6 шлюз. На хабре тоже гуглятся статьи на эту тему. Т.е. большинство вопросов, связанных с работой сети на cjdns, связаны с администрированием обычных IP сетей. Соответственно, подходят обычные мануалы для сетевого админинга.
pcmaniac
24.02.2016 15:42Странно то что и сам рутер не видит сети. С него тоже пинги/трасса не идут. По идее если девайс получил адрес, то этот адрес должен быть закреплён за одним из интерфейсов и должны быть прописаны маршруты, которые указывают, какие ещё адреса доступны через этот интерфейс. И вот тут непонятно, сам демон cjdns на OpenWRT делает нужные настройки или нужно ручками прописывать. И если ручками, то что и где?
Просто вы некоторые моменты упомянули вскольз. Можно по ним по-подробней? Может быть больше скринов :)Foxcool
24.02.2016 15:49Да, роутер должен быть полноценным участиком сети. У меня пинги проходят, когда на фаерфорле на зону cjdns (под ней tun интерфейс) ставлю Accept на input & output. Сами роуты настраивать для IPv6 не приходилось руками.
Foxcool
24.02.2016 15:55Эти пункты не стал описывать, потому что, как правило оно и не нужно. На обычных устройствах стоит CJDNS и в меш режиме сам соединяется с роутером, если находится с ним в одной сети. И роутер с этого момента может помогать устанавливать соединения клиентским устройствам. Самому роутеру такое может пригодиться, наверное, если ставить на него торенты и прочие распределенные приложения, ну или если тот вариант с роутингом в hyperboria для клиентов без установленного CJDNS.
В любом случае, проверьте файрвол.pcmaniac
24.02.2016 16:22В принципе у меня основная идея — таки настроить NAT, чтобы любой клиент, даже не знающий о существовании cjdns, но умеющий IPv6, мог ходить на cjdns адреса, просто подключившись к рутеру по Wi-Fi. Возможно тут нужно курить NAT66.
Akr0n
Хоть где-то вообще удалось поднять эту сеть? Судя по карте, минимально необходимое расстояние между узлами, которое покрывает обычная точка доступа, встречается очень редко...
Foxcool
Насчет меш-коннектов не со своими устройствами на территории РФ не знаю. Наверняка в некоторых студенческих общагах можно легко это все реализовать уже сейчас. Или есть такие соединения. А в мире вообще они есть https://en.wikipedia.org/wiki/List_of_wireless_community_networks_by_region
Идея выше в принципе проста: использовать CJDNS как распределенный ВПН, а роутер между делом научить соединяться. Чем больше таких устройств, тем больше шансов, что будут появляться такие коннекты, повышающие устойчивость всей сети. Меш-коннекты — важный элемент для защиты от атаки "глобальный наблюдатель".
Akr0n
Посмотрел карту, на расстоянии между друг другом в 200-300 метров не нашел более 3 узлов. Я так понимаю, бОльшие расстояния обычные точки не в состоянии покрыть, особенно в городской застройке.