Tecnología de red virtual de Linux

Tecnología de red virtual de Linux

Prólogo

  • En los últimos años, el auge de las tecnologías de contenedorización como Docker y Kubernetes y las herramientas de orquestación de contenedores han liberado a los técnicos del barro de la implementación y el mantenimiento de aplicaciones, al tiempo que cambia la arquitectura técnica de muchas y muchas empresas de Internet. También estoy aprendiendo Docker y Kubernetes recientemente. Estoy fascinado por la conveniencia y la seguridad que brindan estas nuevas tecnologías, y tengo especial curiosidad por la implementación de la tecnología de contenedorización en red. Hoy, compartiré los resultados de aprendizaje recientes de la tecnología de red virtual de Linux, con la esperanza de intercambiar aprendizaje con usted.

1. Espacio de nombres de red

  • Network Namespace es una función proporcionada por el kernel de Linux y es una función importante para la virtualización de la red. Puede crear múltiples espacios de red aislados con su propia información de pila de red. Ya sea una máquina virtual o un contenedor, parece estar en una red separada cuando se ejecuta. Además, los recursos de diferentes espacios de nombres de red no son visibles entre sí y no pueden comunicarse entre sí.

Inserte la descripción de la imagen aquí

2. comando ip netns

  • Puede usar ip netnscomandos para completar varias operaciones en el espacio de nombres de red. ip netnsEl comando proviene del iproute2paquete de instalación, el sistema general se instalará de manera predeterminada, de lo contrario, el lector lo instalará por sí mismo.
  • Puede ip netnscompletar las operaciones relacionadas con el Espacio de nombres de red a través del comando, y puede ip netns helpver la información de ayuda del comando:
[root@localhost ~]# ip netns help
Usage: ip netns list
       ip netns add NAME
       ip netns set NAME NETNSID
       ip [-all] netns delete [NAME]
       ip netns identify [PID]
       ip netns pids NAME
       ip [-all] netns exec [NAME] cmd ...
       ip netns monitor
       ip netns list-id
  • Por defecto, no hay espacio de nombres de red en el sistema Linux, por lo que el ip netns listcomando no devolverá ninguna información.
[root@localhost ~]# ip netns list
[root@localhost ~]#
  • Crear espacio de nombres de red
  • Crea un espacio de nombres de amor
[root@localhost ~]# ip netns add love
[root@localhost ~]# ip netns list
love
  • El espacio de nombres de red recién creado aparecerá en el /var/run/netns/directorio. Si ya existe un espacio de nombres con el mismo nombre, el comando informará Cannot create namespace file "/var/run/netns/ns0": File existsun error.
  • Para cada espacio de nombres de red, tendrá su propia tarjeta de red independiente, tabla de enrutamiento, tabla ARP, iptables y otros recursos relacionados con la red.
  • Operación de espacio de nombres de red
    • Ver la información de la tarjeta de red del espacio de nombres de red recién creado
[root@localhost ~]# ip netns exec love ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  • Como puede ver, una loNIC de bucle invertido se crea de manera predeterminada en el espacio de nombres de red recién creado, y la NIC ahora está en 关闭estado. En este momento, intente hacer ping a la lotarjeta de red de bucle invertido, se le pediráNetwork is unreachable
[root@localhost ~]# ip netns exec love ping 127.0.0.1
connect: Network is unreachable
  • Habilite la tarjeta de red lo loopback y la prueba de ping
[root@localhost ~]# ip netns exec love ip link set lo up
[root@localhost ~]# ip netns exec love ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.130 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.051 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.068 ms
^C
--- 127.0.0.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.051/0.083/0.130/0.033 ms
  • Equipo de transferencia
    • Podemos transferir dispositivos (como veth) entre diferentes espacios de nombres de red. Como un dispositivo solo puede pertenecer a un espacio de nombres de red, el dispositivo no puede verse en este espacio de nombres de red después de la transferencia.
    • Entre ellos, el dispositivo veth es un dispositivo transferible, y muchos otros dispositivos (como lo, vxlan, ppp, bridge, etc.) no se pueden transferir.
  • veth par
    • El nombre completo del par veth es Virtual Ethernet Pair, que es un puerto emparejado. Todos los paquetes que ingresan desde un extremo del par de puertos saldrán desde el otro extremo, y viceversa
    • La introducción del par veth es comunicarse directamente en diferentes espacios de nombres de red, y puede conectar directamente dos espacios de nombres de red.
    • La implementación de todo el contenido es muy simple, y los lectores interesados ​​pueden consultar drivers/net/veth.cla implementación del código fuente .

Inserte la descripción de la imagen aquí

  • Crea un par veth
[root@localhost ~]# ip link add type veth
[root@localhost ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:2d:60:55 brd ff:ff:ff:ff:ff:ff
    inet 192.168.73.41/24 brd 192.168.73.255 scope global noprefixroute ens33
       valid_lft forever preferred_lft forever
    inet6 fe80::399f:dd76:3eb7:2c5b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000
    link/ether 52:54:00:82:d5:d2 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000
    link/ether 52:54:00:82:d5:d2 brd ff:ff:ff:ff:ff:ff
5: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 72:65:8f:0a:3e:f3 brd ff:ff:ff:ff:ff:ff
6: veth1@veth0: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether e2:42:9c:95:76:ea brd ff:ff:ff:ff:ff:ff
  • Se puede ver que en este momento, se ha agregado un par de veth pares al sistema, conectando las dos tarjetas de red virtuales veth0 y veth 1. En este momento, el par de veth pares está en el estado "inactivo".
  • Si queremos especificar los nombres de los dos puntos finales del par veth, podemos usar el siguiente comando:
ip link add vethfoo type veth peer name vethbar

3. Realice la comunicación entre espacios de nombres de red

  • A continuación, usamos el par veth para comunicarse entre dos espacios de nombres de red diferentes. Justo ahora hemos creado un espacio de nombres de red llamado amor, y luego creamos un mensaje de espacio de nombres de red, llamado usted
[root@localhost ~]# ip netns list
you
love
  • Luego agregamos veth0 a love y veth1 a usted de la siguiente manera:
[root@localhost ~]# ip link set veth0 netns love
[root@localhost ~]# ip link set veth1 netns you
  • Luego configuramos las direcciones IP para el par de pares veth y los habilitamos:
[root@localhost ~]# ip netns exec love ip link set veth0 up
[root@localhost ~]# ip netns exec love ip addr add 192.168.73.51/24 dev veth0
[root@localhost ~]# ip netns exec you  ip link set veth1 up
[root@localhost ~]# ip netns exec you ip addr add 192.168.73.52/24 dev veth1
  • Ver el estado del par veth
[root@localhost ~]# ip netns exec love ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
5: veth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 72:65:8f:0a:3e:f3 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet 192.168.73.51/24 scope global veth0
       valid_lft forever preferred_lft forever
    inet6 fe80::7065:8fff:fe0a:3ef3/64 scope link 
       valid_lft forever preferred_lft forever
[root@localhost ~]# ip netns exec you ip addr
1: lo: <LOOPBACK> mtu 65536 qdisc noop state DOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
6: veth1@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether e2:42:9c:95:76:ea brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 192.168.73.52/24 scope global veth1
       valid_lft forever preferred_lft forever
    inet6 fe80::e042:9cff:fe95:76ea/64 scope link 
       valid_lft forever preferred_lft forever
  • Como se puede ver en lo anterior, hemos habilitado con éxito este par veth y asignado una dirección IP correspondiente a cada dispositivo veth. Intentamos ns1visitar ns0la dirección IP en:
[root@localhost ~]# ip netns exec you ping -c 3 192.168.73.51
PING 192.168.73.51 (192.168.73.51) 56(84) bytes of data.
64 bytes from 192.168.73.51: icmp_seq=1 ttl=64 time=0.292 ms
64 bytes from 192.168.73.51: icmp_seq=2 ttl=64 time=0.056 ms
64 bytes from 192.168.73.51: icmp_seq=3 ttl=64 time=0.041 ms

--- 192.168.73.51 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2000ms
rtt min/avg/max/mdev = 0.041/0.129/0.292/0.115 ms

4. veth Ver al compañero

  • Una vez que colocamos el segmento par del par veth en otro espacio de nombres de red, no podemos verlo en el espacio de nombres actual. Entonces, ¿cómo podemos saber dónde está el extremo opuesto de este par?
  • Puede ethtoolverificarlo a través de la herramienta (cuando hay muchos espacios de nombres de red, la operación será más problemática):
[root@localhost ~]# ip netns exec you ethtool -S veth1
NIC statistics:
     peer_ifindex: 5
  • Sabiendo que el número de serie del dispositivo de interfaz en el otro extremo es 5, vamos a otro espacio de nombres para ver qué dispositivo representa el número de serie 5:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
5: veth0@if6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default qlen 1000
    link/ether 72:65:8f:0a:3e:f3 brd ff:ff:ff:ff:ff:ff link-netnsid 1

5. Puente

  • El par veth rompe la limitación del espacio de nombres de red y realiza la comunicación entre diferentes espacios de nombres de red. Pero el par veth tiene una falla obvia, es decir, solo puede lograr la comunicación entre dos interfaces de red.
  • Si queremos lograr la comunicación entre múltiples interfaces de red, podemos usar la tecnología Bridge que se describe a continuación.
  • En términos simples, un puente consiste en "conectar" varias interfaces de red en una máquina. Como resultado, los paquetes recibidos por uno de los puertos de red se copiarán a otros puertos de red y se enviarán. De esta manera, los paquetes entre los puertos de red pueden enviarse entre sí.

5.1 Cómo funciona el puente

  • El reenvío de paquetes por el puente se basa en la dirección MAC. El puente puede analizar los mensajes recibidos y enviados, leer la información de la dirección MAC de destino y combinarla con la tabla MAC registrada por sí misma para decidir el puerto de red de destino del reenvío de mensajes.
  • Para realizar estas funciones, el puente aprenderá la dirección MAC de origen. Al reenviar el paquete, el puente solo necesita reenviar a un puerto de red específico para evitar la interacción innecesaria de la red.
  • Si encuentra una dirección que nunca ha aprendido, no puede saber a qué puerto de red debe reenviarse el paquete, y difunde el paquete a todos los puertos de red (excepto el puerto de red desde el que se originó el paquete).

Inserte la descripción de la imagen aquí

5.2 Implementación del puente

  • El kernel de Linux está puenteado por un dispositivo de red virtual (dispositivo de red). Este dispositivo virtual puede unirse a varios dispositivos de interfaz Ethernet para unirlos.

[La transferencia de la imagen de la cadena externa falló, el sitio de origen puede tener un mecanismo de cadena antirrobo, se recomienda guardar la imagen y cargarla directamente (img-X3tEDe5h-1587100512783) (H: \ markdownpicture \ 4.png)]

  • Para la capa superior de la pila de protocolos de red, solo se puede ver br0. Los paquetes que debe enviar la pila de protocolos superior se envían a br0. El código de procesamiento del dispositivo puente determina si el paquete debe reenviarse a eth0 o eth1, o ambos; A su vez, los paquetes recibidos de eth0 o eth1 se envían al código de procesamiento del puente, donde se determina si el paquete debe reenviarse, descartarse o enviarse a la capa superior de la pila de protocolos.
  • A veces, eth0 y eth1 también pueden usarse como la dirección de origen o de destino del paquete, y participar directamente en el envío y la recepción del paquete, evitando así el puente.

5.3 brctl

  • Las operaciones relacionadas con el puente pueden usar el comando brctl, que proviene del paquete bridge-utils.
  • Crear un puente
# 创建网桥
brctl addbr br0 
  • Eliminar puente
# 删除网桥
brctl delbr br0
  • Enlace de puerto de red
  • Después de establecer un segmento de red lógica, también debemos asignar un puerto específico a este segmento de red. En Linux, un puerto es en realidad una NIC física o virtual. El nombre de cada tarjeta de red es eth0, eth1, eth2. Necesitamos asociar cada tarjeta de red con el segmento de red br0 como un puerto en br0.
# 让eth0 成为br0 的一个端口
brctl addif br0 eth0  
# 让eth1 成为br0 的一个端口
brctl addif br0 eth1
# 让eth2 成为br0 的一个端口
brctl addif br0 eth2

6. iptables / netfilter

  • iptables es un firewall de software implementado por Linux. Los usuarios pueden establecer reglas de admisión y rechazo de solicitudes a través de iptables para proteger la seguridad del sistema.
  • También podemos entender iptables como un proxy del lado del cliente. Los usuarios usan iptables como proxy para implementar la configuración de seguridad del usuario en el marco de seguridad correspondiente. Este "marco de seguridad" es el verdadero firewall. El nombre de este marco es netfilter.
  • iptables es en realidad una herramienta de línea de comando ubicada en el espacio del usuario.
  • iptables / netfilter (en lo sucesivo denominados iptables) constituye un firewall de filtrado de paquetes en la plataforma Linux, que puede completar funciones como el filtrado de paquetes, la redirección de paquetes y la traducción de direcciones de red (NAT).

7. Procesamiento de mensajes

  • iptables no solo debe procesar los mensajes recibidos por la máquina, sino también los mensajes enviados por la máquina. Estos mensajes deben pasar por una serie de "niveles" para ser recibidos por la capa de aplicación local, o enviados desde el local, cada "nivel" es responsable de diferentes tareas. El "nivel" aquí se llama "cadena".
  • INPUT: Los paquetes entrantes aplican las reglas de política en esta cadena de reglas;
  • OUTPUT: El paquete de datos salientes aplica las reglas en esta cadena de reglas;
  • FORWARD: Aplique las reglas en esta cadena de reglas al reenviar paquetes de datos;
  • PREROUTING: Aplique las reglas en esta cadena antes de enrutar paquetes de datos (todos los paquetes de datos son procesados ​​por esta cadena primero);
  • POSTROUTING: Aplique las reglas en esta cadena después de enrutar los paquetes de datos (todos los paquetes de datos son procesados ​​primero por esta cadena);

Inserte la descripción de la imagen aquí

8. Tabla de reglas

  • De lo anterior, sabemos que iptables funciona de acuerdo con las reglas, y estas reglas son condiciones predefinidas para los administradores de red. La definición general de las reglas es que si el encabezado del paquete cumple con tales condiciones, se trata como tal ". Estas reglas no están organizadas en una tabla de reglas estrictamente en el orden de adición, sino que se clasifican según la función y se almacenan en diferentes tablas. Cada tabla almacena una clase de reglas:

  • filtrar

    • Se utiliza principalmente para filtrar datos, se utiliza para controlar qué datos se pueden pasar, qué datos no se pueden pasar, es la tabla más utilizada.
  • nat

    • Se utiliza para tratar la traducción de direcciones de red, controlar si se realiza la traducción de direcciones y cómo modificar la dirección de origen o de destino, lo que afecta el enrutamiento de los paquetes de datos para lograr el propósito de la conectividad.
  • desaparecido

    • Se utiliza principalmente para modificar el encabezado del paquete IP, como modificar el valor TTL, y también para agregar algunas etiquetas al paquete para facilitar el procesamiento posterior del paquete por otros módulos (agregar etiquetas aquí se refiere a agregar etiquetas a la estructura skb del kernel, y No agregar algo al paquete IP real).
  • crudo

    • En el Netfilter Hay una función de seguimiento de acoplamiento que se llama, que se utiliza principalmente para realizar un seguimiento de todas las conexiones y funciones de la norma es dar a marcar con el control de qué paquetes de datos no hacen proceso de seguimiento de enlaces para mejorar el rendimiento de paquetes de datos de tabla en bruto; 优先级最高.

9. Relación entre mesa y cadena.

  • Las tablas y cadenas completan el procesamiento de paquetes de datos por iptables. Pero no todas las cadenas contienen todo tipo de tablas, por lo que algunas cadenas no están inherentemente equipadas con ciertas funciones. Al igual que cuando vamos a la estación para tomar un autobús, "Checkpoint A" solo es responsable de verificar las tarjetas de identificación, "Checkpoint B" solo es responsable de revisar el equipaje y "C Checkpoint" es más completo, que es responsable de verificar las tarjetas de identificación y el equipaje.

Inserte la descripción de la imagen aquí

Publicado 140 artículos originales · 49 alabanzas · 10,000+ vistas

Supongo que te gusta

Origin blog.csdn.net/double_happy111/article/details/105578348
Recomendado
Clasificación