Как настроить IPIP туннель

Для организации VPN-туннеля между двумя хостами зачастую не требуется специализированного программного обеспечения - все необходимое давно уже есть в любом Unix-дистрибутиве. Ниже рассказано как это можно сделать используя утилиту ip в Linux.

Определяемся с адресным пространством

Проектирование своей VPN-сети необходимо с начать с выбора адресного пространства для туннеля. Согласно RFC1918 для внутренних сетей рекомендуется выбирать адреса следующих диапазонов:

RFC1918 name IP address range number of addresses classful description largest CIDR block (subnet mask) host id size mask bits
24-bit block 10.0.0.0 - 10.255.255.255 16,777,216 single class A network 10.0.0.0/8 (255.0.0.0) 24 bits 8 bits
20-bit block 172.16.0.0 - 172.31.255.255 1,048,576 16 contiguous class B networks 172.16.0.0/12 (255.240.0.0) 20 bits 12 bits
16-bit block 192.168.0.0 - 192.168.255.255 65,536 256 contiguous class C networks 192.168.0.0/16 (255.255.0.0) 16 bits 16 bits

Подробнее о внутренних сетях можно прочитать в Wikipedia

Поскольку создаваемый туннель будет иметь топологию точка-точка, нам нужна небольшая сеть на два адреса. Выбираем вот такую: network 192.168.0.0/30 (netmask 255.255.255.252). Помимо этого нам потребуется знать действующие IP-адреса обоих серверов, между которыми мы будем настраивать туннель, и определиться с именем будущего туннельного интерфейса. Эти данные сведем вот в такую табличку, которая наглядно отображает всю информацию, необходимую нам для дальнейшей настройки:

Сервер Действующий IP Имя туннеля Туннельный IP
host1 a1.b1.c1.d1 tun0 192.168.0.1
host2 a2.b2.c2.d2 tun0 192.168.0.2

Конфигурация туннеля в ручном режиме

Для начала поднимем туннель "на ручнике". Для этого на первом хосте выполняем следующие команды:
root@host1:~# ip tunnel add name tun0 mode ipip local a1.b1.c1.d1 remote a2.b2.c2.d2
root@host1:~# ip addres add dev tun0 local 192.168.0.1 peer 192.168.0.2
root@host1:~# ip link set dev tun0 up
Первой командой мы создаем туннельный интерфейс в системе, указывая его новое имя (name), режим инкапсуляции (mode), существующие адреса локального и удаленного сервера (local и remote). Второй командой мы назначfем IP-адреса для вновь созданного туннельного интерфейса. Поскольку это у нас интерфейс точка-точка, то явно указываются два адреса - для ближней стороны туннеля (local) и для удаленной стороны туннеля (peer). Третьей командой мы приводим сконфигурированный интерфейс в активное состояние. Все, настройка на первом сервере закончена. Теперь команда ifconfig tun0 должна показать нечто вроде:
root@host1:~# ifconfig tun0
tun0      Link encap:IPIP Tunnel  HWaddr   
          inet addr:192.168.0.1  P-t-P:192.168.0.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP  MTU:1480  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Аналогичный набор команд выполняем на втором сервере, с тем лишь отличием что локальные и удаленные адреса меняются местами:
root@host2:~# ip tunnel add name tun0 mode ipip local a2.b2.c2.d2 remote a1.b1.c1.d1
root@host2:~# ip addres add dev tun0 local 192.168.0.2 peer 192.168.0.1
root@host2:~# ip link set dev tun0 up
И ifconfig tun0 должен показать здесь похожую картинку, только IP-адреса поменяются местами:
root@host1:~# ifconfig tun0
tun0      Link encap:IPIP Tunnel  HWaddr   
          inet addr:192.168.0.2  P-t-P:192.168.0.1  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP  MTU:1480  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Собственно говоря вот и все! Поздравляю, теперь можно спокойно обмениваться пакетами через поднятый туннель. Для проверки пропингайте с каждого сервера ближний и дальний IP-адрес туннеля.

Режимы инкапсуляции

При создании туннельного интерфейса мы указывали режим работы туннеля, задавая его через параметр mode. Утилита ip поддерживает создание туннелей в двух режимах - ipip и gre. В режиме ipip используется простейшая инкапсуляция IP-пакетов в IP-пакеты. При этом достигается наименьший оверхед, а реализация крайне простая. Расплатой служит невозможность инкапсулировать другие протоколы (IPv6 например), невозможность пропуска мультикаста, и невозможность соединения с другими операционными системами, отличными от Linux, или оборудованием.

В режиме gre для транспортировки туннельных пакетов используется протокол GRE, разработанный в компании Cisco. Это более мощный протокол, допускающий инкапсуляцию различных сетевых протоколов (например, через GRE-туннель можно передавать multicast или IPv6). GRE-туннели поддерживаются различными операционными системами и оборудованием. Но в нашем случае расширенные возможности GRE не нужны, и мы вполне обойдемся инкапсуляцией IP в IP.

Автозапуск туннеля

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

Debian 6

Поддержка туннельных интерфейсов в системе конфигурации Debian 6 находится в зачаточном состоянии, но ее гибкость позволяет нам без труда добиться нужного результата при ее использовании. В качестве примера возьмем конфигурацию первого сервера. Для этого в /etc/network/interfaces добавляем следующее описание для туннельного интерфейса:
auto tun0
iface tun0 inet static
    address 192.168.0.1
    pointopoint 192.168.0.2
    netmask 255.255.255.252
    pre-up /sbin/ip tunnel add name tun0 mode ipip local a1.b1.c1.d1 remote a2.b2.c2.d2
    post-down /sbin/ip tunnel del tun0
Как видите, мы создаем интерфейс через дополнительные команды, а уже его конфигурацию сетевая подсистема выполняет сама.

Debian 7

В сетевой подсистеме Debian 7 поддержка туннелей значительно улучшилась, и для него аналогичная конфигурация в /etc/network/interfaces будет выглядеть вот так:
auto tun0
iface tun0 inet tunnel
    address 192.168.0.1
    dstaddr 192.168.0.2
    netmask 255.255.255.252
    mode ipip
    local a1.b1.c1.d1
    endpoint a2.b2.c2.d2

Проверка работы

Если вы меняли файлы конфигурации сетевой подсистемы, то перед отправкой серверов в перезагрузку убедитесь что вы не допустили в этих файлах каких-либо ошибок и сетевые интерфейсы запускаются правильно. Проверить правильность настроек нового интерфейса без перезагрузки всей сетевой подсистемы можно командами:
ifup -v tun0
ifdown -v tun0
Если ошибок не будет и после ifup интерфейсы на серверах поднимутся, а пинги по туннелю забегают - то все пучком!

-- VitalyDruzhinin - 2013-10-02
Topic revision: r1 - 2013-10-02, VitalyDruzhinin
 

This site is powered by FoswikiCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding Foswiki? Send feedback