Хочу поделиться и обсудить возможности использования протокола 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 как основу для других сервисов и как прототип схожих по функциям систем.
Автор: gr33tx