Построение защищённых соединений

Туннелирование

В ОС Linux поддерживаются 3 типа тоннелей. Это туннелирование IP в IP, GRE туннелирование и тоннели не-ядерного уровня (как, например, PPTP).
С помощью туннелей происходит объединение разных сетей, расположенные в разных местах в единое информационное пространство
Туннелирование увеличивает нагрузку на систему и сеть, потому что добавляются дополнительные IP-заголовки. Обычно, это 20 байт на пакет. Таким образом, если обычный размер пакета (MTU) в сети равен 1500 байтам, то при пересылке по тоннелю, пакет может содержать только 1480 байт. Это не обязательно становится проблемой, но помните о необходимости правильной настройки фрагментации пакетов, если вы соединяете большие сети.
Туннели настраивается с обеих сторон.

IP В IP

Этот тип туннелирования используется в Linux давно. Для его работы требуются два модуля ядра: ipip.o и new_tunnel.o.

Пример:


Есть три сети: внутренние сети A и B, и промежуточная сеть C (например, Internet).
Сеть A:

сеть          10.0.1.0
маска         255.255.255.0
маршрутизатор 10.0.1.1

Адрес маршрутизатора в сети С  172.16.17.18.

Сеть B:

сеть          10.0.2.0
маска         255.255.255.0
маршрутизатор 10.0.2.1

Адрес маршрутизатора в сети С 172.19.20.21.

 

Мы полагаем, что сеть C передает пакеты от A к B и наоборот. Такой сетью может служить даже Internet.

Алгоритм действий:

Убедитесь, что все необходимые модули загружены:

insmod ipip.o
insmod new_tunnel.o

на маршрутизаторе сети A выполните команды:

ifconfig tunl0 10.0.1.1 pointopoint 172.19.20.21
route add -net 10.0.2.0 netmask 255.255.255.0 dev tunl0

на маршрутизаторе сети B выполните команды:

ifconfig tunl0 10.0.2.1 pointopoint 172.16.17.18
route add -net 10.0.1.0 netmask 255.255.255.0 dev tunl0

Когда нужно отключить тоннель, необходимо выполнить команду:

ifconfig tunl0 down

Через тоннель IP в IP нельзя передавать широковещательные пакеты или пакеты IPv6. Вы можете только соединить 2 сети IPv4, которые в обычной ситуации не могли бы работать друг с другом. При нынешнем положении вещей, совместимость этого кода доходит до ядер версии 2.6.  Туннелирование Linux IP в IP не работает с другими операционными системами и маршрутизаторами. Очень простое решение, если оно вам подходит – используйте его, если вам нужно больше – используйте GRE или IPSec.

GRE туннели

GRE это протокол туннелирования, который был разработан фирмой Cisco. Через GRE туннель могут быт переданы broadcast (широковещательные запросы), multicast и unicast (групповые рассылки), трафик IPv6.
В ОС Linux для установки GRE соединений необходим модуль ip_gre.o.

Туннелирование IPv4

Есть три сети: внутренние сети A и B, и промежуточная сеть C (например, Internet).

Сеть А:

сеть          10.0.1.0
маска         255.255.255.0
маршрутизатор 10.0.1.1

Адрес маршрутизатора в сети С  172.16.17.18. Назовем эту сеть neta

 

сеть B:

сеть          10.0.2.0
маска         255.255.255.0
маршрутизатор 10.0.2.1

Адрес маршрутизатора в сети С — 172.19.20.21. Назовем эту сеть netb

 

Мы полагаем, что сеть C передает пакеты от A к B и наоборот. Как и почему неважно.

На маршрутизаторе сети A, вам необходимо сделать следующее:

        
ip tunnel add netb mode gre remote 172.19.20.21 local 172.16.17.18 ttl 255
ip link set netb up
ip addr add 10.0.1.1 dev netb
ip route add 10.0.2.0/24 dev netb

Объяснение команд:
В первой строке мы добавляем тоннельное устройство и присваиваем ему имя netb (имея при этом ввиду место, куда мы хотим попасть).
Потом мы сообщаем, что хотим использовать протокол GRE (mode gre), удаленный адрес 172.19.20.21 (второй маршрутизатор), и адрес с которого должны отправляться данные, предназначенные для передачи по этому тоннелю 172.16.17.18 (это позволяет вашему маршрутизатору иметь несколько IP-адресов в сети C и оставлять возможность выбора конкретного адреса для тоннеля) и, наконец, TTL-поле пакета должно равняться 255 (ttl 255).
Вторая строка переводит устройство в активное состояние.
В третьей строке мы присваиваем созданному интерфейсу born адрес 10.0.1.1. Это нормально для небольших сетей, но когда вам необходимо использовать много тоннелей, возможно вам нужно будет выбрать другой диапазон адресов для тоннельных интерфейсов. Диапазон туннельных адресов не должен использоваться более нигде, чтобы не возникало никаких проблем с возможными совпадениями IP адресов в других сегментах Интранета.
В четвертой строке определяется маршрут к сети B. Обратите внимание на формат представления сетевой маски. Если вы не знакомы с такой нотацией, краткое пояснение: записываете сетевую маску в двоичной форме и считаете все “единички”. Если вы не знаете как это делается, тогда просто запомните, что:
255.0.0.0 соответствует маске 8
255.255.0.0 соответствует маске 16
255.255.255.0 соответствует маске 24
255.255.254.0 соответствует маске 23

Настройка маршрутизатора сети B.

ip tunnel add neta mode gre remote 172.16.17.18 local 172.19.20.21 ttl 255
ip link set neta up
ip addr add 10.0.2.1 dev neta
ip route add 10.0.1.0/24 dev neta

Когда захотите отключить туннель, выполните на маршрутизаторе A:

ip link set netb down
ip tunnel del netb

Конечно, вы можете изменить netb на neta и выполнить эту команду на маршрутизаторе B.

Туннелирование IPv6

Предположим у вас есть сеть IPv6 и вы хотите подключить ее к sixbone, или к другой удалённой сети.

Network 3ffe:406:5:1:5:a:2:1/96

Ваш адрес IPv4 это 172.16.17.18, а маршрутизатор 6bone имеет адрес 172.22.23.24.

ip tunnel add sixbone mode sit remote 172.22.23.24 local 172.16.17.18 ttl 255
ip link set sixbone up
ip addr add 3ffe:406:5:1:5:a:2:1/96 dev sixbone
ip route add 3ffe::/15 dev sixbone

Рассмотрим более подробно команды.
В первой строке мы создали тоннельное устройство с именем sixbone. Тоннелю задан режим sit (что значит туннелирование IPv6 в IPv4), целевой адрес и адрес источника. TTL установлен в максимальное значение, 255. Далее, мы активируем устройство. После этого задаем наш сетевой адрес и определяем маршрут для 3ffe::/15 (что есть вся сеть sixbone) через тоннель.

Тоннели GRE являются достаточно удобными для организации единого информационного пространства для бизнеса. Это стандарт, который используется за пределами сообщества Linux. Правда применяется в основном с оборудованием Cisco.

Туннелирование IPv6 при помощью Cisco и/или sixbone

Это еще один вариант применения возможностей туннелирования IPv6. Он популярен среди специалистов, использующих протокол IPv6. Практический пример, описанный ниже не единственный способ организовать туннелирование IPv6.
Этот метод часто используется при создании туннеля между Linux и маршрутизатором Cisco. Опыт говорит, что многих пользователей интересует именно этот.

Об адресах IPv6:

По сравнению с адресами IPv4, адреса IPv6 действительно большие: 128 бит по сравнению с 32 битами. Это дает нам именно то, что нужно – очень много IP-адресов, если быть более точным: 340,282,266,920,938,463,463,374,607,431,768,211,465. Кроме этого, IPv6 (или IPng, сокращение от IP Next Generation) позволяет уменьшить таблицы маршрутизации на магистральных маршрутизаторах Internet, упростить конфигурацию оборудования, увеличить безопасность на уровне IP и улучшить качество обслуживания (QoS).

Пример ip address IPv6: 2002:836b:9820:0000:0000:0000:836b:9886

Использование адресов IPv6 может оказаться весьма трудным. Потому, существуют некоторые правила:

  • Не используйте лидирующие нули. Аналогично с IPv4.
  • Используйте двоеточия для отделения каждой 16-битной (2-байтной) группы.
  • Если в адресе есть последовательность нулей, ее можно записать как ::.
    Это можно сделать только один раз в адресе и только для кратных 16-ти битам последовательностей.

Так, например, адрес 2002:836b:9820:0000:0000:0000:836b:9886 может быть записан как 2002:836b:9820::836b:9886, что гораздо короче и удобней.

Другой пример, адрес 3ffe:0000:0000:0000:0000:0020:34A1:F32C может быть записан как 3ffe::20:34A1:F32C, что значительно короче.

IPv6 предназначен для замены текущего IPv4. Поскольку это относительно новая технология, пока не существует всемирной сети, где в качестве основного протокола используется IPv6. Для быстрейшего продвижения этой технологии, была создана sixbone.

Сети основанные на IPv6 соединяются одна с другой инкапсуляцией IPv6 в IPv4 и пересылкой по существующей инфраструктуре IPv4.
Именно здесь применяются тоннели.

Для того, чтобы использовать IPv6, наше ядро должно иметь его поддержку. Существует много хороших описаний, как это сделать. Но все сводится к нескольким шагам:

  • Возьмите достаточно новую версию дистрибутива Linux, с соответствующей glibc.
  • Обновите исходные тексты ядра.

После этого можно приступать к сборке ядра, с включенной поддержкой IPv6:

  • Перейдите в каталог /usr/src/linux и запустите:
  • make menuconfig
  • Перейдите в раздел “Networking Options”
  • Отметьте пункты “The IPv6 protocol”, “IPv6: enable EUI-64 token format”, “IPv6: disable provider based addresses”
Не используйте “модули”. Часто они плохо работают.

Другими словами, код поддержки IPv6 должен быть связан с ядром статически. Теперь сохраните конфигурацию и соберите ядро.

 

Перед сборкой измените строку в Makefile: EXTRAVERSION = -x ; –> ; EXTRAVERSION = -x-IPv6
Процедура сборки и компиляции ядра операционной системы выходит за рамки этого документа.
Если вы будете испытывать трудности на этом этапе, обратитесь к соответствующей документации.

Начать стоит с файла /usr/src/linux/README.
После того, как вы разберетесь с вопросом сборки и компиляции ядра, выполните после перезагрузки операционной системы  команду /sbin/ifconfig -a. Вы должны будете увидеть новый класс устройств sit0-device, где SIT означает Simple Internet Transition.
Чтобы подключить ваш хост или сеть к другой сети IPv6,  вам необходимо проделать следующее:

Предположим, что у вас имеется сеть IPv6 3ffe:604:6:8::/64 и вы хотите подключить ее к sixbone или аналогичной ей. Обратите внимание, что нотация /64 означает тоже самое, что и в обычном IP адресе.

Ваш адрес IPv4 145.100.24.181, а адрес маршрутизатора sizbone 145.100.1.5

# ip tunnel add sixbone mode sit remote 145.100.1.5 [local 145.100.24.181 ttl 255]
# ip link set sixbone up
# ip addr add 3FFE:604:6:7::2/126 dev sixbone
# ip route add 3ffe::0/16 dev sixbone

Объяснение команд:
Первой строкой создается интерфейс тоннеля с именем sixbone и определяется его режим sit (туннелирование IPv6 в IPv4), а так же указываются адреса отправителя и получателя. Напоследок устанавливается максимальный TTL  255.В следующей строке интерфейс активируется (up). Далее, добавляется наш сетевой адрес и задается маршрут к сети 3ffe::/15 (что на сегодняшний день является всей sixbone) через тоннель. Если машина, на которой выполняются эти команды, является шлюзом IPv6, то нужно будет выполнить еще и такие команды:

# echo 1 >/proc/sys/net/ipv6/conf/all/forwarding
# /usr/local/sbin/radvd
radvd, как и zebra, демон маршрутизации, поддерживающий авто конфигурационные возможности IPv6.
Более детальную информацию ищите в сети Internet.
Проверить настройку системы можно командой:
# /sbin/ip -f inet6 addr

Если на вашем шлюзе IPv6 запущен radvd и вы загрузите в вашей сети систему Linux с поддержкой IPv6, то сможете оценить возможности автоматической настройки IPv6:

# /sbin/ip -f inet6 addr
1: lo: <LOOPBACK,UP> mtu 3924 qdisc noqueue inet6 ::1/128 scope host

3: eth0: <BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast qlen 100
inet6 3ffe:604:6:8:5054:4cff:fe01:e3d6/64 scope global dynamic
valid_lft forever preferred_lft 604646sec inet6 fe80::5054:4cff:fe01:e3d6/10 
scope link

Теперь можно сделать следующий шаг и настроить bind для адресов IPv6. У типа A существует эквивалент для IPv6: AAAA. Для in-addr.arpa эквивалентом является: ip6.int.
Существует много приложений поддерживающих IPv6 и их количество все время увеличивается. Это secure shell, telnet, inetd, браузер Mozilla, веб-сервер Apache и многие другие. Но все это выходит за рамки данного документа ;-)На стороне Cisco конфигурация должна выглядеть примерно так:

!
interface Tunnel1
description IPv6 tunnel
no ip address
no ip directed-broadcast
ipv6 address 3FFE:604:6:7::1/126
tunnel source Serial0
tunnel destination 145.100.24.181
tunnel mode ipv6ip
!
ipv6 route 3FFE:604:6:8::/64 Tunnel1

Если в вашем распоряжении нет Cisco, можно попробовать использовать тоннельные брокеры IPv6, которых сейчас в Internet существует большое количество. В большинстве случаев они не откажут вам в создании дополнительного тоннеля к вам на своих маршрутизаторах Cisco. Чаще всего это можно сделать при помощи web-интерфейса.
Поищите фразу “ipv6 tunnel broker” в вашей любимой поисковой системе.

Методы построения туннелей не уровня ядра.

Существует буквально масса реализаций тоннелей не уровня ядра. Наиболее известными являются PPP и PPTP.
Но на самом деле методов построения туннелей не уровня ядра гораздо  больше.
Примеры способов построения туннелей не уровня ядра:
проприетарные;
высоко защищенные;
не использующие IP уровень
Обсуждение данных туннелей и способов их построения выходит за рамки этого документа.

 

Туннели  с использованием IPSEC. Безопасная передача данных протоколами IP через публичную сеть Интернет.

 Задать вопрос