Выбрать главу

Если вы действительно интересуетесь этим, вам стоит посмотреть на патчи Юлиана Анастасова (Julian Anastasov), расположеные по адресу http://www.ssi.bg/~ja/#routes. Они могут вам помочь.

Глава 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).

Вторая строка переводит устройство в активное состояние.