• 5.1. Несколько общих замечаний о тоннелях:
  • 5.2. Тоннелирование IP в IP.
  • 5.3. GRE тоннели.
  • 5.3.1. Тоннелирование IPV4.
  • 5.3.2. Тоннелирование IPV6.
  • 5.4. Тоннели неядерного уровня.
  • Глава 5. GRE и другие тоннели.

    В ОС Linux поддерживаются 3 типа тоннелей. Это тоннелирование IP в IP, GRE тоннелирование и тоннели не-ядерного уровня (как, например, PPTP).

    5.1. Несколько общих замечаний о тоннелях:

    Тоннели могут использоваться для очень необычных и интересных вещей. Также они могут усугубить ситуацию, если они сконфигурированы неправильно. Не задавайте маршрут по умолчанию через тоннель, если только вы ТОЧНО не уверены в том, что делаете :-). Далее, тоннелирование увеличивает нагрузку на систему и сеть, потому что добовляются дополнительные IP-заголовки. Обычно, это 20 байт на пакет. Таким образом, если обычный размер пакета (MTU) в сети равен 1500 байтам, то при пересылке по тоннелю, пакет может содержать только 1480 байт. Это не обязательно становится проблемой, но помните о необходимости правильной настройки фрагментации пакетов, если вы соединяете большие сети. Ах да, и конечно самый быстрый способ "прорыть" тоннель — это "рыть" с обоих сторон.

    5.2. Тоннелирование 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, которые в обычной ситуации не могли бы работать друг с другом. При нынешнем положении вещей, совместимость этого кода доходит до ядер версии 1.3. Насколько я знаю, тоннелирование Linux IP-в-IP не работает с другими операционными системами и маршрутизаторами. Очень простое решение, если оно вам подходит — используйте его, если вам нужно больше — используйте GRE.

    5.3. GRE тоннели.

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

    В ОС Linux вам будет нужен модуль ip_gre.o.

    5.3.1. Тоннелирование IPV4.

    Давайте сначала разберемся с тоннелированием 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. Это нормально для небольших сетей, но когда вы становитель "шахтером" (т.е. создаете МНОГО тоннелей), возможно вам нужно будет выбрать другой диапазон адресов для тоннельных интерфейсов (в этом примере мы могли бы использовать 10.0.3.0).

    В четвертой строке определяется маршрут к сети 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.

    5.3.2. Тоннелирование IPV6.

    За кратким описанием адресации IPv6 обратитесь к шеcтой главе: Тоннелирование IPv6 при помощьи Cisco и/или 6bone.

    Продолжим с тоннелями.

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

    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 (что есть вся сеть 6bone) через тоннель.

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

    5.4. Тоннели неядерного уровня.

    Существует буквально масса реализаций тоннелей неядерного уровня. Наиболее известными являются, конечно, PPP и PPTP, но их много больше (некоторые проприетарные, некоторые высокозащищенные, некоторые даже не используют IP) и это определенно выходит за рамки этого документа HOWTO.







     

    Главная | В избранное | Наш E-MAIL | Добавить материал | Нашёл ошибку | Наверх