Tunele GRE

Posted on śro 06 październik 2010 in Routing

GRE czyli Generic Routing Encapsulation to technologia stworzona przez firmę Cisco. GRE umożliwia enkapsulowanie szeregu protokołów warstwy sieciowej w tunelu IP. Na chwilę obecną GRE jest dostępny na sprzęcie większości znaczących producentów (w MikroTik RouterOS od wersji 5.0rc1). Popularne scenariusze użycia to:

  • Łączenie zdalnych sieci wykorzystujących protokoły inne niż IP
  • Przesyłanie ruchu IPv6 poprzez sieć IPv4
  • Szyfrowanie ruchu multicast. IPSec nie potrafi szyfrować ruchu multicastowego – jednym ze sposobów jest przepchnięcie multicastów tunelem GRE i zaszyfrowanie go IPSec
  • Przesyłanie protokołów routingu (większość tuneli w innych technologiach ma z tym problemy)

Warto pamiętać o tym, że GRE sam w sobie nie oferuje żadnych mechanizmów bezpieczeństwa. GRE jest protokołem bezstanowym w związku z czym nie monitoruje dostępności urządzenia na drugim końcu połączenia jednak większość implementacji umożliwia okresowe wysyłanie komunikatów keep-alive monitorujących stan połączenia. GRE używa protokołu numer 47 o czym warto pamiętać konfigurując ścianę ogniową :)

Pora na nieco praktyki:

Poniżej typowy przykład zastosowania tunelu GRE - mamy dwie zdalne podsieci, które chcemy połaczyć (192.168.1.0/24 i 192.168.2.0/24) - po drodze cały Internet. Tunel zestawiamy pomiędzy dwoma brzegowymi routerami (nie muszą być na brzegu - ważne by były osiąglne z drugiej końcówki tunelu). Tunel zestawiamy pomiędzy hostami 1.1.1.1 i 2.2.2.2. Adresujemy go 10.255.255.0/30. Ostatnim krokiem będzie skonfigurowanie tras z jednej podsieci do drugiej (statyczne wpisy lub jakiś protokół routingu - pamiętajmy, że GRE nie ma z nimi problemów :))

tunnel
GRE

Poniżej przykłady konfiguracji w kilku popularnych systemach bazujące na powyższym przykładzie:

GRE i Cisco

Konfiguracja pierszego routera. Podajemy adres docelowy tunelu oraz adres lub interfejs źródłowy. Definiujemy co w takim tunelu ma podróżować (tunel mode gre ip) i adresujemy koncówki tunelu. Oczywiście nie zapominamy o trasie do zdalnej podsieci :)

Router1(config)#interface fastEthernet 0/0
Router1(config)#ip route 192.168.2.0 255.255.255.0 10.255.255.2
Router1(config-if)#ip address 1.1.1.1 255.255.255.224
Router1(config-if)#interface tunnel 0
Router1(config-if)#tunnel source fastEthernet 0/0
Router1(config-if)#tunnel destination 2.2.2.2
Router1(config-if)#tunnel mode gre ip
Router1(config-if)#ip address 10.255.255.1 255.255.255.232

Fragment pliku konfiguracyjnego powinien wyglądać tak:

!
interface Tunnel0 
 ip address 10.255.255.1 255.255.255.252 
 tunnel source FastEthernet0/0 
 tunnel destination 2.2.2.2
!         
interface FastEthernet0/0 
 ip address 1.1.1.1 255.255.255.242 
 duplex auto 
 speed auto
!

I lustrzane odbicie konfiguracji po drugiej stronie:

Router2(config)#interface fastEthernet 0/0
Router2(config)#ip route 192.168.1.0 255.255.255.0 10.255.255.1
Router2(config-if)#ip address 2.2.2.2 255.255.255.224
Router2(config-if)#interface tunnel 0
Router2(config-if)#tunnel source fastEthernet 0/0
Router2(config-if)#tunnel destination 1.1.1.1
Router2(config-if)#tunnel mode gre ip
Router2(config-if)#ip address 10.255.255.1 255.255.255.232

Dla uproszczenia w kolejnych przykładach pokażę jak skonfigurować tylko jedną stronę tunelu. Drugą końcówkę konfiguruje się analogicznie.

GRE i RouterOS

Adresacja interfejsów:

[admin@R1] > ip address add interface=ether1 address=1.1.1.1/27
[admin@R1] > ip address add interface=ether2 address=192.168.1.1/24

Tunel GRE:

[admin@R1] > interface gre add local-address=1.1.1.1

... remote-address=2.2.2.2 keepalive=10 [admin@R1] > interface gre print Flags: X - disabled, R - running 0 R name="gre-tunnel1" mtu=1500 l2mtu=65535 local-address=1.1.1.1 remote-address=2.2.2.2 keepalive=10 [admin@R1] > ip address add interface=gre-tunnel1 address=10.255.255.1/30

I w końcu trasa do zdalnej sieci:

[admin@R1] > ip route add dst-address=192.168.2.0/24 gateway=10.255.255.2
[admin@R1] >

GRE i Vyatta

Zaczynamy od zaadresowania interfejsów:

vyatta@vyatta1# set interfaces ethernet eth0 address 1.1.1.1/27
[edit]
vyatta@vyatta1# set interfaces ethernet eth1 address 192.168.1.1/24
[edit]

I w końcu sam tunel GRE:

vyatta@vyatta1# set interfaces tunnel tun0 encapsulation gre
[edit]
vyatta@vyatta1# set interfaces tunnel tun0 local-ip 1.1.1.1
[edit]
vyatta@vyatta1# set interfaces tunnel tun0 remote-ip 2.2.2.2
[edit]
vyatta@vyatta1# set interfaces tunnel tun0 address 10.255.255.1/30
[edit]
vyatta@vyatta1# commit
[edit]
vyatta@vyatta1# save
Saving configuration to '/opt/vyatta/etc/config/config.boot'...
Done
[edit]
vyatta@vyatta1#

Na koniec trasa do zdalnej podsieci:

vyatta@vyatta1# set protocols static route 192.168.2.0/24 next-hop 10.255.255.2
[edit]
vyatta@vyatta1#

Skontrolujmy wprowadzone zmiany:

vyatta@vyatta1# show interfaces
 ethernet eth0{
     address 1.1.1.1/27
     hw-id 08:00:27:84:2e:5b
 }
 ethernet eth1{
     address 192.168.1.1/24
     hw-id 08:00:27:07:1d:9b
 }

 tunnel tun0{
     address 10.255.255.1/30
     encapsulation gre
     local-ip 1.1.1.1
     remote-ip 2.2.2.2
 }
[edit]
vyatta@vyatta1# show protocols
 static {
     route 192.168.2.0/24{
         next-hop 10.255.255.2 {
         }
     }
 }
[edit]
vyatta@vyatta1#

Na koniec jeszcze raz przypomnę - tunele GRE nie oferują żadnych mechanizmów bezpieczeństwa. Jeśli nam na tym zależy (a zakładam, że tak) należy skorzystać z dodatkowych rozwiązań, takich jak choćby IPSec. Ale to już może następnym razem :)