GRE

GRE (Generic Routing Encapsulation — общая инкапсуляция маршрутов) — протокол туннелирования сетевых пакетов, разработанный компанией CISCO Systems. Его основное назначение — инкапсуляция пакетов сетевого уровня сетевой модели OSI в IP пакеты. Номер протокола в IP — 47.

GRE туннель представляет собой соединение точка - точка, его можно считать одной из разновидностей VPN туннеля, без шифрования. Основное достоинство GRE это возможность передавать широковещательный трафик, что позволяет пропускать через такой туннель протоколы маршрутизации использующие его, IPSec — протокол защиты сетевого трафика на IP-уровне туннели в чистом виде этого не могут. Причин для организации GRE туннеля может быть множество от банальной необходимости пробросить свою сеть через чужое IP пространство до использования протоколов OSPF, RIPv2, EGRP совместно с IPSec. Так же GRE, в отличии от IPIP, может помочь пробросить немаршрутизируюмые протоколы, такие как NetBios, IPX, AppleTalk.

Различия между туннель GRE или IPIP:

  • IPIP — инкапсулирует только unicast IPv4-трафик
  • GRE — IPv4/IPv6 unicast/multicast трафик

Туннелирование увеличивает нагрузку на систему и сеть, потому что добавляются дополнительные IP-заголовки. Таким образом, если обычный размер пакета (MTU) в сети равен 1500 байтам, то при пересылке по туннелю, пакет будет меньше, 1476 байт для GRE и 1480 байт для IPIP. Задать MTU можно вручную или с помощью PMTUD (path MTU discovery). Основная проблема в ручной настройке MTU и/или MSS состоит в том, что по пути между вашими площадками может оказаться линк с MTU, скажем, 1300. Тут на помощь может прийти pmtud. Протокол целиком и полностью полагается на ICMP протокол диагностики перегрузки сети unreachable messages, которые должны быть разрешены на всем пути между соседями. Cisco рекомендует устанавливать MTU в 1400 байт вне зависимости от того работает GRE поверх IPSec в туннельном или в транспортном режиме.

Туннелирование подразумевает три протокола:

  • пассажир — инкапсулированный протокол (IP, CLNP, IPX, AppleTalk, DECnet Phase IV, XNS, VINES и Apollo)
  • протокол инкапсуляции (GRE)
  • транспортный протокол (IP)

GRE-заголовок накладывается «поверх» стандартного IP-пакета. При этом в самом GRE-заголовке содержится так называемый Tunnel IP Header. Именно в нем содержится информация о tunnel source и tunnel destination.

Данные адреса вкладываются в основной пакет, когда он отправляется в публичную сеть. В поле Control Information оригинального IP-пакета содержатся исходные IP-адреса источника и назначения. Таким образом, локальные серые IP-адреса скрыты в пакете, а в маршрутизации участвуют только те адреса которые мы указали в tunnel source и tunnel destination. При передаче пакета в локальную сеть GRE-заголовок отбрасывается и остается «чистый» IP-пакет.

Настройка GRE туннелей в Debian и Хостинг VPS/VDS на Ubuntu одинаковы. Имеется 2 удаленных сервера Debian 7.8 Wheezy с реальными статическими IP адресами.

  • Листинг всех туннелей можно просмотреть посредством
    ip tunnel list
  • На обоих серверах в Руководство по iptables: Настройка и оптимизация фаервола Linux разрешим протокол GRE
    $IPT -A INPUT -p gre -j ACCEPT
    or
    $IPT -A INPUT -p gre -s x.x.x.x -j ACCEPT
  • 1 сервер. Скрипт для ручного создания GRE туннеля. IPIP -туннель поднимается совершенно аналогичным образом, в скрипте только mode gre заменится на mode ipip
    gre_to_m86a_create.sh
    #!/bin/sh -e
     
    #ip tunnel del tun1
    ip tunnel add tun1 mode gre remote 91.196.98.162 local 188.230.123.238 dev eth3
    ifconfig tun1 10.26.95.254 pointopoint 192.168.35.254
    #ifconfig tun1 mtu 1400
    #ifconfig tun1 up
    route add -net 192.168.35.0 netmask 255.255.255.0 gw 192.168.35.254
    # Hotel
    route add -net 192.168.22.0 netmask 255.255.255.0 gw 192.168.35.254
    # Service Lan Vlan
    route add -net 10.90.91.0 netmask 255.255.255.0 gw 192.168.35.254

    То же самое только через файл /etc/network/interfaces

    auto tun1
    iface tun1 inet static
            address 10.26.95.254
            netmask 255.255.255.0
            mtu 1400
            up ifconfig tun1 multicast
            pre-up iptunnel add tun1 mode gre local 188.230.123.238 remote 91.196.98.162 dev eth3
            post-up route add -net 192.168.35.0 netmask 255.255.255.0 gw 192.168.35.254
            post-up route add -net 192.168.22.0 netmask 255.255.255.0 gw 192.168.35.254
            post-up route add -net 10.90.91.0 netmask 255.255.255.0 gw 192.168.35.254
            pointopoint 192.168.35.254
            post-down iptunnel del tun1
  • 2 сервер. Скрипт для ручного создания GRE
    #!/bin/sh -e
     
    ip tunnel add tun1 mode gre remote 188.230.123.238 local 91.196.98.162 dev eth5
    ifconfig tun1 192.168.35.254 pointopoint 10.26.95.254
    route add -net 10.26.95.0 netmask 255.255.255.0 gw 10.26.95.254
    route add -net 172.20.20.0 netmask 255.255.255.0 gw 10.26.95.254

    В файл /etc/network/interfaces это будет выгладить так

    auto tun1
    iface tun1 inet static
            address 192.168.35.254
            netmask 255.255.255.0
            mtu 1400
            up ifconfig tun1 multicast
            pre-up iptunnel add tun1 mode gre remote 188.230.123.238 local 91.196.98.162 dev eth5
            post-up route add -net 10.26.95.0 netmask 255.255.255.0 gw 10.26.95.254
            post-up route add -net 172.20.20.0 netmask 255.255.255.0 gw 10.26.95.254
            pointopoint 10.26.95.254
            post-down iptunnel del tun1
  • Всe! Туннель должен работать. Проверяем ping
  • Если не работает запускаем tcpdump Linux примеры использования
    tcpdump -n -i eth3 proto 47

    Ниже рабочий пример для ping из локальной сети

    13:25:04.444375 IP 188.230.123.238 > 91.196.98.162: GREv0, 
    length 88: IP 10.26.95.251 > 192.168.35.55: ICMP echo request, id 5341, seq 15, length 64
    13:25:04.459864 IP 91.196.98.162 > 188.230.123.238: GREv0, 
    length 88: IP 192.168.35.55 > 10.26.95.251: ICMP echo reply, id 5341, seq 15, length 64
PQ VPS сервера в 28+ странах.