Siguiendo con la serie de posts sobre Open vSwitch, vamos a ver hoy cómo configurar GRE Tunneling sobre éste. Para los que no lo sepáis, GRE nos permite configurar un enlace Point-to-Point entre dos IPs y tener un enlace a nivel 2 entre dos puntos a través de internet, a efectos prácticos seria como tener una VPN entre estos dos puntos.
Siguiendo con el post sobre un ejemplo práctico en OpenvSwitch ahora vamos a suponer el caso de que tenemos dos hosts con máquinas virtuales, pero separados por internet, en diferentes CPDs, sin conexión a nivel 2, cómo ya vimos, nos interesa que nuestros clientes puedan crear máquinas virtuales en cada una de las máquinas y además cada uno tendrá sus redes privadas implementadas con VLANS en Open vSwitch, estas redes privadas tienen que tener visibilidad entre los dos hosts, al estar las dos máquinas separadas por internet, necesitaremos hacer un túnel GRE para que se vean a nivel 2. Un ejemplo podría ser como sigue:
Vemos en la figura anterior, cómo tendremos un bridge en cada uno de los hosts con una IP pública, en el bridge02 tendremos un puerto haciendo túnel en GRE y especificando la IP del otro host. Así pues a través de la conexión del túnel GRE tendremos los dos hosts conectados a nivel 2. Vamos a ver las IPs que tendrá cada uno de ellos:
Host1- IP 82.82.82.1
Host2- IP 82.82.82.2
Vamos a configurar pues el bridge01 en el host1:
# ovs-vsctl add-br bridge01
# ovs-vsctl add-port bridge01 eth0
# ifconfig bridge01 82.82.82.1
Configuramos el bridge01 en el host2:
# ovs-vsctl add-br bridge01
# ovs-vsctl add-port bridge01 eth0
# ifconfig bridge01 82.82.82.2
Configuramos el bridge02 en el host1, le añadiremos un puerto de tipo gre, especificando la IP del host2:
# ovs-vsctl add-br bridge02
# ovs-vsctl add-port bridge02 gre0 -- set interface gre0 type=gre options:remote_ip=82.82.82.2
Lo mismo en el host2 pero con la IP del host1:
# ovs-vsctl add-br bridge02
# ovs-vsctl add-port bridge02 gre0 -- set interface gre0 type=gre options:remote_ip=82.82.82.1
Una vez configurado, ya podemos añadir puertos en el bridge02, en vez de añadir máquinas virtuales cómo en el post anterior, vamos a añadir dos puertos mapeados a una interfície en cada uno de los hosts, el primero con el tag 1 y el segundo con el tag 2 y vamos a ver que hay visibilidad entre cada VLAN:
Añadimos los puertos en el host1, los taggeamos y les asignamos una IP:
# ovs-vsctl add-port bridge02 bridge02p1 -- set interface bridge02p1 type=internal
# ovs-vsctl set port bridge02p1 tag=[1]
# ifconfig bridge02p1 192.168.1.1
# ovs-vsctl add-port bridge02 bridge02p2 -- set interface bridge02p2 type=internal
# ovs-vsctl set port bridge02p2 tag=[2]
# ifconfig bridge02p2 192.168.2.1
Añadimos los puertos en el host2:
# ovs-vsctl add-port bridge02 bridge02p1 -- set interface bridge02p1 type=internal
# ovs-vsctl set port bridge02p1 tag=[1]
# ifconfig bridge02p1 192.168.1.2
# ovs-vsctl add-port bridge02 bridge02p2 -- set interface bridge02p2 type=internal
# ovs-vsctl set port bridge02p2 tag=[2]
# ifconfig bridge02p2 192.168.2.2
Vamos a hacer un ping des del host1 a las IPs del host2:
host1:~# ping -c4 192.168.1.2 PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data. 64 bytes from 192.168.1.2: icmp_req=1 ttl=64 time=0.532 ms 64 bytes from 192.168.1.2: icmp_req=2 ttl=64 time=0.160 ms 64 bytes from 192.168.1.2: icmp_req=3 ttl=64 time=0.154 ms 64 bytes from 192.168.1.2: icmp_req=4 ttl=64 time=0.158 ms --- 192.168.1.2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 2997ms rtt min/avg/max/mdev = 0.154/0.251/0.532/0.162 ms host1:~# ping -c4 192.168.2.2 PING 192.168.1.2 (192.168.2.2) 56(84) bytes of data. 64 bytes from 192.168.2.2: icmp_req=1 ttl=64 time=0.528 ms 64 bytes from 192.168.2.2: icmp_req=2 ttl=64 time=0.148 ms 64 bytes from 192.168.2.2: icmp_req=3 ttl=64 time=0.148 ms 64 bytes from 192.168.2.2: icmp_req=4 ttl=64 time=0.150 ms --- 192.168.2.2 ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 2999ms rtt min/avg/max/mdev = 0.148/0.243/0.528/0.165 ms
Vemos efectivamente como se llega a cada uno de ellos, ahora mientras hacemos el ping en la VLAN con el tag 1, vamos a ver cómo efectivamente la interfície de la VLAN 2 de la misma máquina no ve el tráfico, en el host 1 ejecutamos:
host1:~# tcpdump -ni bridge02p2 tcpdump: WARNING: test1p2: no IPv4 address assigned tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on test1p2, link-type EN10MB (Ethernet), capture size 65535 bytes
Lo dejamos un rato y vemos como efectivamente no recibe tráfico de la interfície del otro puerto.