GRE over IPSEC with IKEv2 and BGP: Fortigate vs Mikrotik
- Iñaki Urrutxi

- 19 mar 2020
- 5 Min. de lectura
Actualizado: 20 mar 2020
Hace unos días tuve que realizar un túnel VPN contra un cliente, el cual debido a diversos motivos, me propuso hacerlo mediante un túnel gre-over-ipsec. Ya sé que este tipo de túneles no son de uso común, han sido reemplazados por los túneles IPSEC sobre interfaces, pero vamos a aprovecharlo para a ver cómo funcionan y que nos ofrecen.

EL GRE (Generic Encapsulation Protocol) es un protocolo para generar túneles VPN que se utiliza para encapsular una amplia variedad de protocolos dentro de túneles IP. Normalmente se utilizar con IPSEC para encriptar los datos que transporta, todo esto produce un incremente de las cabeceras de datos y por tanto hay que tener cuidado con el MTU de los interfaces.
Caracteristicas del protocolo GRE:
- Protocolo desarrollado por CISCO, se usa para transportar paquetes de una red a otra dentro de un túnel
- Sigue el estándar IETF (RFC 2784) y usa el protocolo 47 cuando se encapsula en IP
- GRE tiene autenticación básica (por eso se suele usar junto a IPSEC)
- GRE no tiene ningún control de flujo
- Transporta otros protocolos no IP como Nettbios, Multicast y Broadcast, etc
- Incremente 24 bytes el tamaño del paquete( 20 bytes de cabecera IP y 4 bytes de cabecera GRE)
- Permiten que viajen dentro del túnel protocolos de enrutamiento
Caracteristicas del protocolo GRE over IPSEC:
- Ofrece la seguridad que no ofrece GRE: cifrado, autentificación e integridad
- Incrementa aún más el tamaño del paquete al utilizar encapsulado ESP, dependiendo de los algoritmos a usar el tamaño de las cabeceras es mayor o menor.
- ESP se encapsula usando 2 modos: tunnel y transport.


- FORTIGATE
-Interfaces
config system interface
edit "wan1"
set vdom "root"
set ip 1.1.1.1 255.255.255.252
set allowaccess ping https ssh snmp
set vlanforward enable
set type physical
set alias "WAN"
set role wan
edit "internal1"
set vdom "root"
set ip 192.168.1.1 255.255.255.0
set allowaccess ping https ssh snmp
set device-identification enable
set lldp-transmission enable
set role lan
end- Túnel Ipsec
config vpn ipsec phase1-interface
edit "VPN-Ipsec1"
set interface "wan1"
set ike-version 2
set local-gw 1.1.1.1
set peertype any
set net-device disable
set proposal aes256-sha256
set nattraversal disable
set remote-gw 2.2.2.2
set psksecret greoveripsecpresharedkey
next
endconfig vpn ipsec phase2-interface
edit "VPN-Ipsec1"
set phase1name "VPN-Ipsec1"
set proposal aes256-sha256
set pfs disable
set replay disable
set auto-negotiate enable
set encapsulation tunnel-mode(default)/transport-mode
set protocol 47
set src-subnet 1.1.1.1 255.255.255.255
set dst-subnet 2.2.2.2 255.255.255.255
next
end- Interface Gre
config system gre-tunnel
edit "gre1-over-ipsec"
set interface "VPN-Ipsec1"
set remote-gw 2.2.2.2
set local-gw 1.1.1.1
next
end- Interface Túneles
config system interface
edit "gre1-over-ipsec"
set vdom "root"
set ip 10.199.199.1 255.255.255.255
set allowaccess ping
set type tunnel
set remote-ip 10.199.199.2 255.255.255.252
set interface "VPN-Ipsec1"
next
end edit "VPN-Ipsec1"
set vdom "root"
set ip 1.1.1.1 255.255.255.255
set allowaccess ping
set type tunnel
set remote-ip 2.2.2.2 255.255.255.255
set interface "wan1"
next
end- Policies
Esta política se usa para que el tunel ipsec se ponga UP. En fortigate si no hay un politica creada el tunel no se pone UP.
config firewall policy
edit 1
set srcintf "VPN-Ipsec1"
set dstintf "VPN-Ipsec1"
set srcaddr "all"
set dstaddr "all"
set action accept
set schedule "always"
set service "ALL"
next
end
Estas son las políticas para permitir el tráfico entre la lan y el túnel y viceversa
edit 2
set srcintf "internal1"
set dstintf "gre1-over-ipsec"
set srcaddr "all"
set dstaddr "all"
set action accept
set schedule "always"
set service "ALL"
set nat disable
next
end edit 3
set srcintf "gre1-over-ipsec"
set dstintf "internal1"
set srcaddr "all"
set dstaddr "all"
set action accept
set schedule "always"
set service "ALL"
set nat disable
next-Rutas estáticas
config router static
edit 1
set gateway 1.1.1.2
set device "wan1"
next edit 2
set dst 2.2.2.2 255.255.255.255
set device "VPN-Ipsec1"
next-BGP sobre el tunel GRE
config router bgp
set as 65060
set router-id 10.199.199.1
config neighbor
edit "10.199.199.2"
set activate6 disable
set remote-as 65061
set send-community6 disable
next
end
config redistribute "connected"
set status enable
end
config redistribute "static"
set status enable
end
end- MIKROTIK
-Interfaces
/ip address
add address=192.168.2.1/24 interface=ether5
add address=2.2.2.2/29 interface=ether1
add address=10.199.199.2/30 interface=gre2-over-ipsec
-Túnel Ipsec
/ip ipsec peer
add address=1.1.1.1/32 exchange-mode=ike2 local-address=2.2.2.2
name=VPN-IPSEC2
/ip ipsec profile
set [ find default=yes ] dh-group=modp2048,modp1536 enc-algorithm=aes-256 hash-algorithm=sha256
/ip ipsec proposal
set [ find default=yes ] auth-algorithms=sha256 enc-algorithms=aes-256-cbc pfs-group=none
/ip ipsec identity
add peer=VPN-IPSEC2 secret=greoveripsecpresharedkey
/ip ipsec policy
add dst-address=212.81.209.10/32 peer=VPN-IPSEC2 protocol=gre sa-dst-address=212.81.209.10 sa-src-address=212.81.221.163 srcaddress=212.81.221.163/32 tunnel=yes(default)/tunnel=no(transport)-Interface Gre
/interface gre
add allow-fast-path=no !keepalive local-address=2.2.2.2 name=gre2-over-ipsec remote-address=1.1.1.1-Rutas estáticas
/ip route
add distance=1 gateway=2.2.2.1
add distance=1 dst-address=1.1.1.1/32 gateway=2.2.2.1-BGP
/routing bgp instance
set default as=65061 redistribute-connected=yes redistribute-static=yes router-id=10.199.199.2
/routing bgp peer
add name=gre remote-address=10.199.199.1 remote-as=65060 ttl=default- TROUBLESHOOTING
- MTU
Los equipos negocian el MTU de interface GRE dependiendo del modo del túnel ESP y de los algoritmos que se usan para negociar el túnel. Como podemos ver en el ejemplo de en los ejemplos, cuando cambiamos de modo "tunnel" a modo "transport".
Podemos ajustar manualmente el tamaño del MTU en el túnel GRE en Mikrotik, sin embargo, en Fortigate solo se puede modificar el MTU sobre el interface físicos.
MTU Fortigate GRE - Encapsulation transport-mode
FG61E# diag netlink interface list | grep if=gre1-over-ipsec
if=gre1-over-ipsec family=00 type=778 index=65 mtu=1430 link=0 master=0MTU Mikrotik GRE - Encapsulation transport-mode
[prueba@mikrotik]> interface gre print
Flags: X - disabled, R - running
0 R name="gre2-over-ipsec2" mtu=auto actual-mtu=1422 local-address=212.81.221.163 remote-address=212.81.209.10 dscp=inherit clamp-tcp-mss=yes dont-fragment=no allow-fast-path=no MTU Fortigate GRE - Encapsulation Tunnel-mode
FG61E# diag netlink interface list | grep if=gre1-over-ipsec
if=gre1-over-ipsec family=00 type=778 index=65 mtu=1414 link=0 master=0MTU Mikrotik GRE - Encapsulation Tunnel-mode
[prueba@mikrotik] > interface gre print
Flags: X - disabled, R - running
0 R name="gre-tunnel1" mtu=auto actual-mtu=1414 local-address=212.81.221.163 remote-address=212.81.209.10 dscp=inherit clamp-tcp-mss=yes dont-fragment=no allow-fast-path=no - BGP
Comprobamos que el BGP se ha establecido y que importamos y exportamos las rutas del vecino en cada caso.
- MIKROTIK
[prueba@mikrotik] > ip route print
Flags: X - disabled, A - active, D - dynamic, C - connect, S - static, r - rip,
b - bgp, o - ospf, m - mme, B - blackhole, U - unreachable, P - prohibit
# DST-ADDRESS PREF-SRC GATEWAY DISTANCE
0 A S 0.0.0.0/0 2.2.2.1 1
2 ADC 10.199.199.0/30 10.199.199.2 gre2-over-ipsec 0
4 Db 10.199.199.0/30 10.199.199.1 20
5 ADb 10.199.199.1/32 10.199.199.1 20
9 A S 1.1.1.1/32 2.2.2.1 1
10 ADb 192.168.1.0/24 10.199.199.1 20
11 ADC 192.168.2.0/24 192.168.2.1 ether5 0
12 ADC 2.2.2.0/30 2.2.2.2 ether1 0[prueba@mikrotik] routing bgp peer print
Flags: X - disabled, E - established
# INSTANCE REMOTE-ADDRESS REMOTE-AS
1 E default 10.199.199.1 65060 - FORTIGATE
FG61E# get router info bgp summary
BGP router identifier 10.199.199.1 local AS number 65060
BGP table version is 4
3 BGP AS-PATH entries
0 BGP community entries
Neighbor V AS MsRcvd MsSent TblVe rInQ OutQ Up/Down St/Rfrc
10.199.199.2 4 65061 239 236 3 0 00:24:01 3
Total number of neighbors 1FG61E # get router info routing-table all
Routing table for VRF=0
Codes: K - kernel, C - connected, S - static, R - RIP, B - BGP
O - OSPF, IA - OSPF inter area
N1 - OSPF NSSA external type 1, N2 - OSPF NSSA external type 2
E1 - OSPF external type 1, E2 - OSPF external type 2
i - IS-IS, L1 - IS-IS level-1, L2 - IS-IS level-2, ia - IS-IS inter area
* - candidate default
S* 0.0.0.0/0 [10/0] via 1.1.1.2, wan1
C 10.199.199.0/30 is directly connected, gre1-over-ipsec
C 10.199.199.1/32 is directly connected, gre1-over-ipsec
S 10.199.199.2/32 [10/0] via 10.199.199.2, gre1-over-ipsec
B 192.168.2.0/24 [20/0] via 10.199.199.2 (recursive via 10.199.199.2), 00:24:01
C 192.168.1.0/24 is directly connected, internal1
C 1.1.1.1/30 is directly connected, wan1
C 2.2.2.2/32 is directly connected, vpn-ipsec1
En futuros articulos veremos la diferencia con los túneles IPSEC over GRE.




Comentarios