Pull to refresh

IPOP — IP over P2P

Reading time 6 min
Views 22K
Original author: Renato Figueiredo


Хочу поделиться и обсудить возможности использования протокола IP через сети P2P на примере IPOP.

Кратко:

IPOP (IP-over-P2P) — это программно поддерживаемая виртуальная сеть, которая может быть использована в качестве основы для создания виртуальных частных сетей поверх множества провайдеров и административных доменов. IPOP построена как пиринговая одноранговая сеть для туннелирования и маршрутизации инкапсулированных IP-пакетов, которые передаются через виртуальные сетевые интерфейсы (v-NICs). Сеть IPOP состоит из пиринговых роутеров на конечных точках, которые соединяются с виртуальными сетями (к примеру, между виртуальными машинами, находящимися в сетях различных провайдеров).



Это краткое руководство позволит развернуть виртуальную сеть IP-over-P2P между виртуальными машинами, находящимися в различных коммерческих и частных сетях так, как если бы они располагались в доступной вам сетевой среде.

Первым шагом будет развертывание как минимум двух виртуальных машин, которые будут соединены виртуальной сетью IPOP. IPOP поднимается внутри виртуальной машины — главное условие, это наличие подключения к интернет. Неважно как, с белым IP-адресом или за NAT. Например, вы можете запустить одну виртуальную машину на своем компьютере, а другую установить в облаке.

В настоящее время пакет IPOP существует для Debian/Ubuntu, так что развертывать машину придется на этих дистрибутивах (примечание переводчика: опущу способы установки дистрибутивов на различные облачные сервисы и виртуальные машины. У меня, в принципе, получилось связать две машины из VirtualBox и «реальную» машину в DigitalCloud — это не принципиально).

Шаг второй — установка соединения между двумя виртуальными машинами.
У нас есть две виртуальные машины подключенные к интернет. На данном этапе мы установим и настроим IPOP-сеть между ними.

Для начала, чтобы упростить настройку, используем конфигурационные файлы с предустановленными значениями. Далее будем называть наши виртуальные машины Alice и Bob. Машина Alice будет иметь IP-адрес в сети IPOP 192.168.10.10, а машина Bob — 192.168.10.20.

Заходим на машину Alice под root.

wget http://www.acis.ufl.edu/~renato/ipopdemo/ipop_demo_prepare_debian.zip
apt-get install unzip
unzip ipop_demo_prepare_debian.zip 


Сконфигурируем точку виртуальной сети. Для этого нам нужны следующие данные: уникальная строка, указывающая на вашу виртуальную сеть в пространстве P2P и виртуальный IP-адрес. Ниже скрипт помогающий настроить эти параметры. Замените CHANGE_THIS на вашу строку, уникально указывающую на вашу виртуальную сеть. Например такую: ipop_tutorial_05_21_2013_your_name. Второй параметр это последний байт виртуального IP-адреса. У нас он будет «10» для Alice. Соответственно адрес в итоге будет 192.168.10.10.

Запускаем скрипт автонастройки:

./ipop_demo_prepare.sh CHANGE_THIS 10


После окончания работы скрипта мы можем увидеть, что появился виртуальный интерфейс «tapipop» с IP-адресом 192.168.10.10 (примечание: мы подразумеваем, что виртуальная подсеть 192.168.10.0/255.255.255.0 не будет конфликтовать с адресным пространством сети, в которую подключена ваша виртуальная машина. Если это не так, вы можете исправить значения для виртуальной сети в ipop_demo_prepare.sh).

Проверим сетевой интерфейс:

ifconfig tapipop


Увидим нечто подобное:

tapipop   Link encap:Ethernet  HWaddr 96:44:a8:53:67:2a  
          inet addr:192.168.10.10  Bcast:192.168.255.255  Mask:255.255.255.0
         UP BROADCAST RUNNING MULTICAST  MTU:1200  Metric:1
         RX packets:525 errors:0 dropped:0 overruns:0 frame:0
         TX packets:277 errors:0 dropped:0 overruns:0 carrier:0
         collisions:0 txqueuelen:500
          RX bytes:56314 (56.3 KB)  TX bytes:32314 (32.3 KB)


Теперь сконфигурируем машину Bob. Нужно повторить все те же операции (под root):

wget http://www.acis.ufl.edu/~renato/ipopdemo/ipop_demo_prepare_debian.zip
apt-get install unzip
unzip ipop_demo_prepare_debian.zip 



Чтобы войти в нашу виртуальную сеть, мы должны указать при настройке ту же уникальную строку, что и на машине Alice — CHANGE_THIS заменяем на ipop_tutorial_05_21_2013_your_name в нашем случае.

./ipop_demo_prepare.sh CHANGE_THIS 20


Проверяем и убеждаемся, что у нас появился интерфейс tapipop с IP-адресом 192.168.10.20.

Будем пользоваться утилитой Ping для проверки связи между машинами Alice и Bob через виртуальную сеть. Удостоверившись, что пакеты ICMP проходят свободно, мы сможем пустить любой TCP/IP трафик через нашу сеть.

С машины Alice пропингуем машину Bob:

ping 192.168.10.20


(или наоборот, с машины Bob на Alice: ping 192.168.10.10)

В обычном случае, предполагая, что машина не находится за NAT мы будем наблюдать следующую картину: первые ICMP-пакеты будут сброшены, затем несколько задержек около 1000 мс, затем, ответы с нормальной задержкой. Следующий пример показывает вывод, как если бы ваши машины находились в одном датацентре. Задержки могут быть больше или меньше в зависимости от условий сети, наличия NAT или фаервола.

PING 192.168.10.20 (192.168.10.20) 56(84) bytes of data.
From 192.168.10.10 icmp_seq=1 Destination Host Unreachable
From 192.168.10.10 icmp_seq=2 Destination Host Unreachable
From 192.168.10.10 icmp_seq=3 Destination Host Unreachable
From 192.168.10.10 icmp_seq=4 Destination Host Unreachable
From 192.168.10.10 icmp_seq=5 Destination Host Unreachable
64 bytes from 192.168.10.20: icmp_req=6 ttl=64 time=1008 ms
64 bytes from 192.168.10.20: icmp_req=7 ttl=64 time=8.46 ms
64 bytes from 192.168.10.20: icmp_req=8 ttl=64 time=1.87 ms
64 bytes from 192.168.10.20: icmp_req=9 ttl=64 time=1.87 ms
64 bytes from 192.168.10.20: icmp_req=10 ttl=64 time=1.64 ms


Что происходит в данном примере? Ваши виртуальные машины соединены поверх большой пиринговой сети, имеющей ноды по всему миру. Мы используем систему PlanetLab для размещения IPOP сети.

До того, как Alice и Bob свяжутся между собой, они должны обнаружить идентификаторы друг друга в пиринговой сети. Первые несколько секунд Alice и Bob являются частью P2P сети, но, так как они не связывались до этого, требуется сопоставить имена в пространстве IPOP: IP-адреса точек с уникальным идентификаторами. Поиск производится с помощью DHT-запросов в пиринговую сеть. Пока запрос не будет выполнен, пакеты будут сбрасываться (пакеты с 1 по 5 в примере выше).

Как только соответствие IP-P2P будет найдено, пакеты начнуть ходить между Alice и Bob. Тем не менее, должно пройти еще какое-то время на прокладку пути в пиринговой сети. Происходит процесс, когда Alice и Bob одновременно стараются проложить прямой путь друг до друга через несколько точек P2P. Как только у них это получается, задержка значительно уменьшается (пакеты 7-10).

Безопасность связи между Alice и Bob.

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

Есть много вариантов для настройки IPsec, но важно отметить, что IPsec работает поверх IPOP, и из-за этого наслоения ни программное обеспечение IPsec (в ядре Linux), ни IPOP не нуждаются в изменениях.

На этом шаге тоже будем использовать заранее сконфигурированные файлы настроек для минимизации наших усилий. Будем использовать Racoon для поднятия IPsec и конфигурацию, базирующуюся на сертификатах X.509.

В этом примере Alice и Bob используют сертификаты подписанные одним центром сертификации (CA). Запустите следующие команды на машине Alice:

wget http://www.acis.ufl.edu/~renato/ipopdemo/ipop_ipsec_demo_prepare_debian.zip
unzip ipop_ipsec_demo_prepare_debian.zip
./ipop_ipsec_demo_prepare.sh 


Скрипт сделает следующее:

1. Создаст CA-сертификат (cacert.pem), сертификат (host-cert.pem) и закрытый ключ для каждой точки (host-key.pem) в папке /etc/racoon/certs.
2. Создаст файл настройки /etc/racoon/racoon.conf — описывает то, что будут использованы сертификаты x.509 и конфигурирует другие настройки безопасности.
3. Создаст файл /etc/ipsec-tools.conf — указывает на то, что все связи в виртуальной сети IPOP должны быть защищены IPsec.

Те же шаги надо повторить и на машине Bob.

После этого запускаем пинг с машины Alice до машины Bob:

ping 192.168.10.20


Вы увидите то же поведение, что и на предыдущем шаге — первые пакеты будут сброшены, дальше связь устанавливается. Alice и Bob также могут пинговать друг друга. Разница лишь в том, что теперь соединение между ними провернено на подлинность и шифровано. Сейчас, если машина Alice перестанет использовать IPsec или будет использовать неправильно подписанный сертификат, то она не сможет соединиться с машиной Bob (или наоборот).

Вы можете проверить работу IPsec с помощью tcpdump, с включенным IPsec на обоих машинах и без него.

Если обнаружатся проблемы со связью можно перезапустить процесс:

/etc/init.d/groupvpn.sh stop
/etc/init.d/groupvpn.sh start


или остановить IPsec:

setkey -F
setkey -FP
/etc/init.d/racoon stop


Источник: Futuregrid Там же есть контакты команды разработчиков IPOP.
Официальная страница проекта IPOP

IPOP активный проект с открытым исходным кодом, задействованный в других сервисах.

Хотелось бы обсудить будущее такого интересного проекта, его плюсы и минусы.

На мой взгляд, не хватает полной шифрации «из коробки» и большей децентрализации. Например, как в сети Биткоина. Хотя на официальной странице есть указания на проекты, использующие в основе IPOP, которые обеспечивают шифрование.

Можно рассматривать IPOP как основу для других сервисов и как прототип схожих по функциям систем.
Tags:
Hubs:
+25
Comments 30
Comments Comments 30

Articles