Introdução a interfaces virtuais do Linux: Túneis

O Linux suporta muitos tipos de túneis, mas os novos usuários podem ficar confusos com suas diferenças e não saber qual deles é o mais adequado para um determinado caso de uso. Neste artigo, darei uma breve introdução às interfaces de encapsulamento comumente usadas no kernel do Linux. Não há análise de código, apenas uma breve introdução às interfaces e seu uso no Linux. Qualquer pessoa com experiência em rede pode estar interessada nessas informações. Uma lista de interfaces de encapsulamento, bem como ajuda na configuração específica de encapsulamento, pode ser obtida emitindo a ajuda do link ip do comando iproute2.

Esta postagem aborda as seguintes interfaces usadas com frequência:

  • IPIP
  • SIT
  • ip6tnl
  • VTI e VTI6
  • GRE e GRETAP
  • IP6GRE e IP6GRETAP
  • FOU
  • GUE
  • GENEVE
  • ERSPAN e IP6ERSPAN

Depois de ler este artigo, você saberá o que são essas interfaces, as diferenças entre elas, quando usá-las e como criá-las.

Túnel Linux IPIP

O túnel IPIP, exatamente como o nome sugere, é um túnel IP sobre IP, definido no RFC 2003. O cabeçalho do túnel IPIP se parece com:

Geralmente, é usado para conectar duas sub-redes IPv4 internas através da Internet IPv4 pública. Ele tem a menor sobrecarga, mas só pode transmitir tráfego unicast IPv4. Isso significa que você não pode enviar multicast via túnel IPIP.

O túnel IPIP suporta IP sobre IP e MPLS sobre IP.

Nota: Quando o módulo ipip é carregado ou um dispositivo IPIP é criado pela primeira vez, o kernel do Linux cria um dispositivo padrão tunl0 em cada espaço de nome, com os atributos local = any e remote = any. Ao receber pacotes de protocolo IPIP, o kernel os encaminha para tunl0 como um dispositivo de fallback se não conseguir encontrar outro dispositivo cujos atributos local / remoto correspondam mais de perto ao endereço de origem ou de destino.

Aqui está como criar um túnel IPIP:

On Server A:# ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR# ip link set ipip0 up# ip addr add INTERNAL_IPV4_ADDR/24 dev ipip0Add a remote internal subnet route if the endpoints don’t belong to the same subnet# ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0
On Server B:# ip link add name ipip0 type ipip local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR# ip link set ipip0 up# ip addr add INTERNAL_IPV4_ADDR/24 dev ipip0# ip route add REMOTE_INTERNAL_SUBNET/24 dev ipip0

Nota: Substitua LOCAL_IPv4_ADDR, REMOTE_IPv4_ADDR, INTERNAL_IPV4_ADDR, REMOTE_INTERNAL_SUBNET pelos endereços baseados no seu ambiente de teste. O mesmo com o exemplo a seguir configs.

Túnel Linux SIT

SIT significa Transição Simples da Internet. O principal objetivo é interconectar redes IPv6 isoladas, localizadas na Internet IPv4 global.

Inicialmente, ele tinha apenas um modo de encapsulamento IPv6 sobre IPv4. Após anos de desenvolvimento, no entanto, adquiriu suporte para vários modos diferentes, como ipip (o mesmo com o túnel IPIP), ip6ip, mplsip e qualquer outro. O modo any é usado para aceitar tráfego IP e IPv6, o que pode ser útil em algumas implantações. O túnel SIT também suporta ISATA, e aqui está um exemplo de uso.

O cabeçalho do túnel SIT se parece com:

Quando o módulo sit é carregado, o kernel do Linux cria um dispositivo padrão, chamado sit0.

Aqui está como criar um túnel SIT:

On Server A:
# ip link add name sit1 type sit local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR mode any# ip link set sit1 up
# ip addr add INTERNAL_IPV4_ADDR/24 dev sit1

Em seguida, execute as mesmas etapas no lado remoto.

Túnel Linux ip6tnl

Ip6tnl é uma interface de encapsulamento IPv4 / IPv6 sobre IPv6, que se parece com uma versão IPv6 do encapsulamento SIT. O cabeçalho do túnel se parece com:

ip6tnl suporta os modos ip6ip6, ipip6, any. O modo ipip6 é IPv4 sobre IPv6 e o ​​modo ip6ip6 é IPv6 sobre IPv6, e o modo any suporta IPv4 / IPv6 sobre IPv6.

Quando o módulo ip6tnl é carregado, o kernel do Linux cria um dispositivo padrão, chamado ip6tnl0.

Aqui está como criar um túnel ip6tnl:

# ip link add name ipip6 type ip6tnl local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR mode any

Uma VTI e uma VTI6

Virtual Tunnel Interface (VTI) no Linux são relacionadas à implementação da Cisco da VTI e do Juniper do túnel seguro (st.xx).

Esse driver de encapsulamento específico implementa encapsulamentos de IP, que podem ser usados ​​com o xfrm para fornecer a noção de um encapsulamento seguro e, em seguida, usar o roteamento de kernel na parte superior.

Em geral, os túneis VTI operam quase da mesma maneira que os túneis ipip ou sit, exceto pelo fato de adicionar um encapsulamento / decapsulação fwmark e IPsec. Túnel VTI:

VTI6 é o equivalente IPv6 do VTI. Aqui está como criar um túnel VTI:

# ip link add name vti1 type vti key VTI_KEY local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR# ip link set vti1 up# ip addr add LOCAL_VIRTUAL_ADDR/24 dev vti1
# ip xfrm state add src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR spi SPI PROTO ALGR mode tunnel# ip xfrm state add src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR spi SPI PROTO ALGR mode tunnel# ip xfrm policy add dir in tmpl src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR PROTO mode tunnel mark VTI_KEY# ip xfrm policy add dir out tmpl src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR PROTO mode tunnel mark VTI_KEY

Você também pode configurar o IPsec via libreswan ou strongSwan.

Túneis Linux GRE e GRETAP

Encapsulamento de roteamento genérico, também conhecido como GRE, é definido na RFC 2784

O tunelamento GRE adiciona um cabeçalho GRE adicional entre os cabeçalhos IP interno e externo. Em teoria, o GRE poderia encapsular qualquer protocolo da camada 3 com um tipo Ethernet válido, diferente do IPIP, que só pode encapsular o IP. O cabeçalho do GRE se parece com:

Observe que você pode transportar tráfego multicast e IPv6 através de um túnel GRE.

Quando o módulo gre é carregado, o kernel do Linux cria um dispositivo padrão, chamado gre0.

Aqui está como criar um túnel GRE:

# ip link add name gre1 type gre local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR [seq] key KEY

Enquanto os túneis GRE operam na camada 3 do OSI, o GRETAP funciona na camada 2 do OSI, o que significa que há um cabeçalho Ethernet no cabeçalho interno.

Veja como criar um túnel GRETAP:

# ip link add name gretap1 type gretap local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR

Linux IP6GRE e IP6GRETAP

IP6GRE é o equivalente IPv6 do GRE, o que nos permite encapsular qualquer protocolo da Camada 3 sobre IPv6. O cabeçalho do túnel se parece com:

IP6GRETAP, assim como o GRETAP, possui um cabeçalho Ethernet no cabeçalho interno:

Veja como criar um túnel GRE:

# ip link add name gre1 type ip6gre local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR# ip link add name gretap1 type ip6gretap local LOCAL_IPv6_ADDR remote REMOTE_IPv6_ADDR

Túnel Linux FOU

Tunneling pode acontecer em vários níveis na pilha de rede. Os túneis IPIP, SIT e GRE estão no nível IP, enquanto FOU (foo over UDP) é um tunelamento no nível UDP.

Há algumas vantagens em usar o encapsulamento UDP, pois o UDP trabalha com a infraestrutura de HW existente, como RSS em NICs, ECMP em comutadores, e descarga de soma de verificação. O conjunto de patches do desenvolvedor mostra aumentos significativos de desempenho para os protocolos SIT e IPIP.

Atualmente, o túnel FOU suporta o protocolo de encapsulamento baseado em IPIP, SIT, GRE. Um exemplo de cabeçalho FOU é semelhante: 

Aqui está como criar um túnel FOU:

# ip fou add port 5555 ipproto 4# ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap fou encap-sport auto encap-dport 5555

O primeiro comando configurou uma porta de recebimento FOU para IPIP vinculada a 5555; para o GRE, é necessário configurar o ipproto 47. O segundo comando configura uma nova interface virtual IPIP (tun1) configurada para o encapsulamento FOU, com a porta de destino 5555.

NOTA: FOU não é suportado no Red Hat Enterprise Linux.

GUE

Encapsulamento UDP genérico (GUE) é outro tipo de encapsulamento UDP. A diferença entre FOU e GUE é que o GUE possui seu próprio cabeçalho de encapsulamento, que contém as informações do protocolo e outros dados.

Atualmente, o túnel GUE suporta encapsulamento interno de IPIP, SIT, GRE. Um exemplo de cabeçalho da GUE se parece com:

Aqui está como criar um túnel GUE:

# ip fou add port 5555 gue# ip link add name tun1 type ipip remote 192.168.1.1 local 192.168.1.2 ttl 225 encap gue encap-sport auto encap-dport 5555

Isso configurará uma porta de recebimento de GUE para IPIP vinculada a 5555 e um túnel IPIP configurado para encapsulamento de GUE.

NOTA: O GUE não é suportado no Red Hat Enterprise Linux.

GENEVE

Generic Network Virtualization Encapsulation (GENEVE) suporta todos os recursos do VXLAN, NVGRE e STT e foi projetado para superar as limitações percebidas. Muitos acreditam que o GENEVE poderia eventualmente substituir completamente esses formatos anteriores. O cabeçalho do túnel se parece com:

que é muito semelhante ao VXLAN. A principal diferença é que o cabeçalho GENEVE é flexível. É muito fácil adicionar novos recursos estendendo o cabeçalho com um novo campo Tipo-Comprimento-Valor (TLV). Para obter mais detalhes, você pode ver o rascunho mais recente da geneve ietf ou consultar este artigo O que é GENEVE?

Open Virtual Network (OVN) usa GENEVE como encapsulamento padrão. Aqui está como criar um túnel GENEVE:

# ip link add name geneve0 type geneve id VNI remote REMOTE_IPv4_ADDR

ERSPAN e IP6ERSPAN

Encapsulated Remote Switched Port Analyzer (ERSPAN) usa o encapsulamento GRE para estender o recurso básico de espelhamento de porta da Camada 2 para a Camada 3, o que permite que o tráfego espelhado seja enviado através de uma rede IP roteável. O cabeçalho ERSPAN se parece com:

O túnel ERSPAN permite que um host Linux atue como uma fonte de tráfego ERSPAN e envie o tráfego espelhado ERSPAN para um host remoto ou para um destino ERSPAN, que recebe e analisa os pacotes ERSPAN gerados pela Cisco ou outro ERSPAN interruptores Esta configuração pode ser usada para analisar, diagnosticar e detectar tráfego malicioso.

Atualmente, o Linux suporta a maioria dos recursos de duas versões do ERSPAN: v1 (tipo II) e v2 (tipo III).

Aqui está como criar um túnel do ERSPAN:

# ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 1 erspan IDXor# ip link add dev erspan1 type erspan local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR seq key KEY erspan_ver 2 erspan_dir DIRECTION erspan_hwid HWID
Add tc filter to monitor traffic# tc qdisc add dev MONITOR_DEV handle ffff: ingress# tc filter add dev MONITOR_DEV parent ffff: matchall skip_hw action mirred egress mirror dev erspan1

RESUMO

Eis um sumário de todos os túneis que introduzimos,

Tunnel / Link Type Outer Header Encapsulate Header Inner Header
ipip IPv4 None IPv4
sit IPv4 None IPv4/IPv6
ip6tnl IPv6 None IPv4/IPv6
vti IPv4 IPsec IPv4
vti6 IPv6 IPsec IPv6
gre IPv4 GRE IPv4/IPv6
gretap IPv4 GRE Ether + IPv4/IPv6
ip6gre IPv6 GRE IPv4/IPv6
ip6gretap IPv6 GRE Ether + IPv4/IPv6
fou IPv4/IPv6 UPD IPv4/IPv6/GRE
gue IPv4/IPv6 UDP + GUE IPv4/IPv6/GRE
geneve IPv4/IPv6 UDP + Geneve Ether + IPv4/IPv6
erspan IPv4 GRE + ERSPAN IPv4/IPv6
ip6erspan IPv6 GRE + ERSPAN IPv4/IPv6

Nota: Todas as configurações neste tutorial são voláteis e não sobrevivem à reinicialização do servidor. Se você deseja tornar a configuração persistente durante as reinicializações, considere usar um daemon de configuração de rede, como o NetworkManager, ou mecanismos específicos de distribuição.

 

Traduzido e adaptado de Developers – REDHAT. An introduction to Linux virtual interfaces: Tunnels. LIU, Hangbin. Disponível em: <https://developers.redhat.com/blog/2019/05/17/an-introduction-to-linux-virtual-interfaces-tunnels/>. Acesso em: 16 nov. 2019.

 

Posts relacionados