Форумы портала PHP.SU » Разное » Обсуждение статей » Hyperboria: Практика создания узла

Страниц (1): [1]
 

1. EuGen - 10 Июля, 2013 - 13:43:44 - перейти к сообщению
Для чего это нужно

Приветствую, коллеги,

Как всем уже известно, законодательство в сети Интернет ужесточается с каждым новым вводимым законом. С 1-го августа 2013-го года вступит в силу закон о произвольных блокировках (на основании иска правообладателя) - и, значит, ресурс попадёт в реестр запрещённых сайтов. Варианты противодействия этому могут быть разными, к самым эффективным мерам, разумеется, относится отмена закона. Но для этого нужно чётко выразить свою позицию, суметь повлиять на государственную власть через общественное мнение и т.п. - всё это происходит сейчас на всех ресурсах, администрация которых осознаёт последствия.

Не следует заблуждаться

Однако, наряду с указанными выше действиями не стоит забывать и о том, что некоторые технические средства по противодействию цензуре всё же есть. Речь конечно же идёт о VPN и распределённых оверлейных сетях. Стоит понимать, что, в случае, если законодательной власти нужно будет - то она наложит запрет на технические средства обхода блокировок (яркий пример - запрет на стойкой шифрование), поэтому не следует думать, что оверлейные сети есть панацея от нововведений и цензурирования Интернета. Тем не менее, я бы хотел познакомить читателей с опытом развёртывания узла hyperboria. Что такое hyperboria - можно почитать в очень доступной статье на habrahabr. Вкратце - это распределённая сеть на основе IPv6 с шифрованием трафика.

Развёртывание узла
Сборка приложения и проверка системы
Перейдём к делу. Прежде всего, для того, чтобы создать узел, нам потребуется cjdns. Предполагаю, что на целевой системе установка ведётся в каталог /opt
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/path# cd /opt

cjdns - это приложение с открытым исходным кодом, его всегда можно найти на GitHub. Стало быть, достаточно клонировать репозиторий:
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/opt# git clone https://github.com/cjdelisle/cjdns.git cjdns

- это создаст репозиторий локально. Дальнейшее просто - разработчики озаботились и создали скрипт "do":
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/opt# cd cjdns
  2. root@host:/opt/cjdns# ./do

После этого произойдёт сборка приложения. Теперь нужно убедиться, что в ОС существует виртуальный интерфейс. Для этого выполнить:
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/opt/cjdns# cat /dev/net/tun

- если система ответит чем-то наподобие:
CODE (text):
скопировать код в буфер обмена
  1. cat: /dev/net/tun: File descriptor in bad state

- то всё корректно, соответствующий интерфейс существует. В противном случае - создать вручную:
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/opt/cjdns# mkdir /dev/net && mknod /dev/net/tun c 10 200 && chmod 0666 /dev/net/tun

- и затем попробовать сделать cat предыдущей команды заново. Если ответом будет что-то наподобие:
CODE (text):
скопировать код в буфер обмена
  1. cat: /dev/net/tun: Permission denied

- то, возможно, вы используете VPS на базе OpenVZ. Если это так, то попросите провайдера включить TUN/TAP устройство.

Конфигурация маршрутизации
Итак, всё проверено и собрано. Теперь можно переходить к конфигурированию узла. Сначала нужно создать конфигурационный файл. Сделать это можно так:
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/opt/cjdns# ./cjdroute --genconf >> cjdroute.conf

- на выходе получится cjdroute.conf - важно понимать, что он будет содержать данные, уникальные для создаваемого узла, поэтому не думаю, что создавать этот файл вручную - хорошая идея.
Теперь вам нужно найти узлы, к которым вы сможете подключиться. Существует тестовый узел, который можно использовать для проверки корректности конфигурации, однако в дальнейшем, для улучшения распределённости сети обязательно нужно добавить и другие узлы. Сам конфигурационный файл представляет собой обычный JSON, узел для подключения следует добавлять в секцию:
CODE (text):
скопировать код в буфер обмена
  1. // Nodes to connect to.
  2. "connectTo":
  3. {
  4.             // Add connection credentials here to join the network
  5.             // Ask somebody who is already connected.
  6. }

- в формате
CODE (text):
скопировать код в буфер обмена
  1. "0.1.2.3:45678":
  2. {
  3.                 "password": "thisIsNotARealConnection",
  4.                 "publicKey": "thisIsJustForAnExampleDoNotUseThisInYourConfFile.k"
  5. }

- то есть вам нужно знать адрес и пароль/публичный ключ узла. Реквизиты тестового узла:
CODE (text):
скопировать код в буфер обмена
  1. //Germany public node hype.rusblock.com
  2. "78.47.249.182:47670":
  3.  {
  4.                         "password": "freedomforallmlzb0mnd9kyz1rnl3l",
  5.                         "publicKey": "guqq5h8p9w6mtxfuh1k9hl1yqljpqqnvj2umcd1cuvx64vbuqhu0.k"
  6. }

После этого достаточно сохранить файл и выполнить команду:
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/opt/cjdns# ./cjdroute < cjdroute.conf >> cjdroute.log

- если произойдёт ошибка, можно будет посмотреть лог. В предположении, что всё удачно, появится интерфейс:
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/opt/cjdns# ifconfig tun0
  2. tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
  3.           inet6 addr: ***************
  4.           UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1312  Metric:1
  5.           RX packets:23368 errors:0 dropped:0 overruns:0 frame:0
  6.           TX packets:23320 errors:0 dropped:0 overruns:0 carrier:0
  7.           collisions:0 txqueuelen:500
  8.           RX bytes:1868828 (1.8 MB)  TX bytes:1400376 (1.4 MB)

- и процесс маршрутизатора в списке процессов:
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/opt/cjdns# ps aux | grep cjdroute
  2. root      1332  0.0  0.0   8932   920 ?        Ss   Jul02   0:08 /opt/cjdns/cjdroute angel 9 12
  3. nobody    1333  0.6  0.2  18576  2516 ?        Ss   Jul02  75:14 /opt/cjdns/cjdroute core 16 13

Остановить процесс всегда можно через
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/opt/cjdns# killall cjdroute

Теперь о дальнейшей настройке. Если тестовое подключение произошло успешно, то необходимо во-первых, собрать как можно больше узлов для подключения, а во-вторых, поделиться с другими участниками сети своими данными. Второе делается так:
0. В конфигурационном файле нужно найти секцию:
CODE (text):
скопировать код в буфер обмена
  1. // This key corresponds to the public key and ipv6 address:
  2.     "publicKey": "*************",
  3.     "ipv6": "**********",

- и запомнить эти данные
1. В конфигурационном файле существуют секции, отвечающие за то, какие пароли будут для доступа к узлу (генерируются в момент создания конфигурационного файла), но они все, кроме первого, неактивны. Для большей безопасности следует раскомментировать эти пароли - тогда можно будет разным узлам, которые будут подключаться к настраиваемому, назначать разные пароли. В конфигурационном файле это секции:
CODE (text):
скопировать код в буфер обмена
  1. // A unique string which is known to the client and server.
  2.         {"password": "********"},
  3.  
  4.         // More passwords should look like this.
  5.         {"password": "********"},
  6.         {"password": "********"},
  7.         {"password": "********}

2. Сообщить данные, полученные на шаге 0. и 1. другим участникам hyperboria. Сделать это можно, например, на #cjdns IRC-сервера freenode

Немного удобства
Собственно, после конфигурации всё уже сделано и узел должен работать. Для удобства я рекомендую добавить процесс маршрутизации в автозагрузку. В debian-подобных системах для этого нужно:
Создать скрипт /etc/init.d/cjdroute
CODE (bash):
скопировать код в буфер обмена
  1. #!/bin/sh
  2. #/etc/init.d/cjdroute
  3. #
  4.  
  5. # Carry out specific functions when asked to by the system
  6. case "$1" in
  7.   start)
  8.      echo "Starting cjdroute "
  9.      touch /var/lock/cjdroutepid
  10.      /opt/cjdns/cjdroute < /opt/cjdns/cjdroute.conf >> /opt/cjdns/cjdroute.log
  11.      ;;
  12.   stop)
  13.      echo "Stopping cjdroute "
  14.      rm /var/lock/cjdroutepid
  15.      killall cjdroute
  16.      ;;
  17.   *)
  18.      echo "Usage: /etc/init.d/cjdroute {start|stop}"
  19.      exit 1
  20.      ;;
  21. esac
  22.                                          
  23. exit 0

- после чего выдать права на исполнение:
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/# chmod 755 /etc/init.d/cjdroute

- и добавить скрипт в последовательность автозагрузки
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/etc/init.d# update-rc.d cjdroute defaults

В других дистрибутивах добавление может быть другим, например, в Slackware достаточно будет добавить скрипт в /etc/rc.local (и сам скрипт будет расположен не в /etc/init.d - а в /etc/rc.d)
Последний штрих - для удобства я рекомендую создать ссылки:
CODE (bash):
скопировать код в буфер обмена
  1. root@host:/# ln -s /etc/init.d/cjdroute /usr/bin/cjdctl
  2. root@host:/# ln -s /opt/cjdns/cjdroute /usr/bin/cjdroute

- после этого можно будет удобнее управлять процессом маршрутизатора.

Вместо заключения
На этом всё, узел будет создан и будет запускаться при старте ОС. Другие поясняющие материалы про hyperboria можно найти здесь и здесь. Повторюсь, не стоит думать, что только техническими средствами можно обойти запреты на уровне законодательства, но для свободы в Сети разумно использовать все доступные законные средства.
В настоящее время я создал два узла - на сервере stopcensure[dot]org (отдельная благодарность Илье - DeepVarvar за предоставление мощностей на сервере под процесс маршрутизатора) и на рабочем стейджинге.
Если у вас возникнут вопросы - то постараюсь ответить в этой теме, либо, если у вас есть аккаунт на habrahabr (важное уточнение - аккаунт должен иметь право записи, то есть не быть read-only), можете задать вопросы пользователю shifttstat - ему отдельное спасибо за предоставление списка узлов для подключения.

 

Powered by ExBB FM 1.0 RC1