En este primer artículo sobre redes y en los siguientes vamos a conocer de una manera muy práctica los comandos principales para
configurar y comprobar el estado de las redes en linux Ubuntu.
En la actualidad, el paquete de configuración de red net-tools se considera obsoleto aunque todavía está presente. Herramientas clásicas
como netstat
, nslookup
o ifconfig
con la llegada del paquete iptools2 y el framework
para redes Netplan desde Ubuntu 17 se sustituyen por ip
,
dig
o ss
.
Empezaremos por repasar conceptos clave para entender las redes. Algunos son de sobre conocidos y otros seguramente están un poco olvidados. Las redes son muy complicadas y muchas veces trabajamos con ellas por inercia olvidando un poco las bases de su funcionamiento.
Es posible que al abrir sesión en Ubuntu te muestre un mensaje de bienvenida con información variada sobre el sistema. Se trata de una serie de scripts en archivos que se ejecutan en orden alfabético. No necesariamente tiene que estar esta función configurada en tu servidor. Mis Ubuntu con Oracle Cloud lo traen desde origen y en cambios en otros Ubuntu que he probado no sale. Si el servidor tiene mensaje de bienvenida tendremos algo parecido a esto:
System information as of Thu Apr 21 07:12:39 UTC 2022
System load: 0.62 Processes: 175
Usage of /: 6.9% of 44.97GB Users logged in: 0
Memory usage: 1% IPv4 address for enp0s3: 10.0.0.103
Swap usage: 0%
En naranja he marcado los datos referentes a la red. Ya sabemos la IP privada del servidor, que usa protocolo V4 y el nombre de la interfaz de red. ¿Sabemos que es una IP o una interfaz de red?
Para volver a mostrar el mensaje sudo run-parts /etc/update-motd.d/
IP significa Protocolo de Internet. Es una dirección que identifica un dispositivo de red (ordenador, impresora, etc). Está compuesto por 4 números separados por puntos entre 0 y 255 llamados octectos. En binario 255 es 11111111 (8bits). Por eso IPv4 es de 32 bits (8bits por 4 octetos).
Las IP se dividen entre públicas y privadas:
IP privada: Es la dirección que se asigna a cada dispositivo en una red privada. Cada ordenador, impresora, smartphone tiene su IP privada y no es accesible desde fuera de la red. Las IP pueden ser asignadas dinamicamente por DHCP o de manera manual.
IP pública: Es la IP que tienen los dispositivos que se conectan de manera directa a Internet. Un servidor web o el router de una red local tienen IP pública visible desde Internet. Las IP públicas son únicas para cada dispositivo y son asignadas por el proveedor de Internet (ISP).
NAT significa Network Adress Translator. Por definición un NAT es un mecanismo utilizado por los routers para intercambiar paquetes entre dos redes
que se asignan mutuamente direcciones incompatibles.
Dicho de otra manera y apoyándonos en un ejemplo lo entenderemos mejor. Supongamos que estamos en una red privada 10.0.0.0 y un equipo de esta red con una
ip 10.0.0.50 quiere mandar paquetes a servidor web con ip 80.54.100.2. Lo que ocurrirá es que el router guardará su IP privada con su puerto de origen y lo
asocia con la IP de destino y un puerto al azar (hay 65556 puertos TCP y UDP). En este ejemplo pongamos que sea 80.54.100.2:3000.
Entonces cuando llega información de esa IP con ese puerto al azar el router comprueba la tabla y lo reenvía a la IP privada al puerto que corresponda.
En nuestro ejemplo el 80. Este tipo de NAT recibe el nombre de NAT con sobrecarga y es seguramente el más común.
También es conocida como PAT (Port Address Translation - Traducción de Direcciones por Puerto), NAPT (Network Address Port Translation -
Traducción de Direcciones de Red por Puerto), NAT de única dirección o NAT multiplexado a nivel de puerto.
En hogares y pequeñas oficinas se usa éste tipo.
Otros tipos de NAT son la estática, dinámica y solapamiento.
CG-NAT significa Carrier Grade Network Address Translation. Muchos ISP (proveedores de internet) ante la escasez de IPv4 y la
lenta transición a IPv6 usan CG-NAT. Básicamente es un router
que está por encima del router que tenemos en casa para así usar la misma IP pública con muchos clientes. Tiene el inconveniente que nuestra
IP pública ya no es realmente la que tiene salida a internet y además se comparte con desconocidos. Para la gran mayoría de situaciones esto
no debería ser un problema pero sí que lo puede ser en el caso de querer montar un servidor FTP en casa visible desde internet, puede no ser válido
con algunos clientes de VPN,...
Si realmente necesitas IP pública real contacta con tu ISP. Es probable que puedan quitarte de la CG-NAT por un coste pequeño o puedes buscar un ISP que
no use.
Si no estamos seguros de que estamos sobre CG-NAT podemos usar en Windows el comando tracert mi_ip_publica
o en Linux traceroute mi_ip_publica
.
Si solo devuelve un salto tenemos una ip pública real. Por el contrario si devuelve varias líneas de saltos estamos compartiendo la ip con otros clientes
del operador. El ratio actual es aproximadamente 2-3 clientes por cada ip.
MAC viene de Media Access Control. Es un identificador único que cada fabricante asigna a la tarjeta de red. También se le conoce como dirección física al contrario que la IP que es una dirección lógica. Está formado por 6 parejas de números hexadecimales. Las 3 primeras parejas son el identificador único del fabricante (OUI) y los 3 últimos el identificador del producto (UAA). El formato de MAC es como este: 01:3A:1D:54:6B:32. Un dispositivo puede tener varias direcciones MAC. Por ejemplo, mi portátil tiene una MAC para la tarjeta Ethernet y otra para la interfaz WIFI.
Un puerto de red es una interfaz para comunicarse con un programa a través de una red.
Los puertos van numerados para identificar la aplicación que los usa y permitir a una máquina establecer simultáneamente diversas conexiones con
máquinas distintas. Cuando conectamos con un dispositivo como por ejemplo un servidor web se usa la misma IP pero para cada tipo de dato un puerto
diferente. Los correos suelen utilizar el 465, las páginas web el 443, las descargas de archivos por FTP el puerto 21. Y así con una amplia variedad
de aplicaciones. En resumen, misma IP y diferente puerto según la aplicación.
Existen 2 tipos de puerto:
Aquí debemos aclarar que existen las NIC, network internet card, es decir tarjeta de red que también podemos decir que es una interfaz de red pero "física" como la que tiene tu portátil y están las interfaces de red por software.
Cuando trabajamos con servidores en la nube, todos los elementos de la red aunque sean virtuales se comportan y configuran como si fueran físicos. Son superordenadores alojados en Data Centers donde cada uno de ellos puede virtualizar muchos servidores y la tarjeta de red y la interfaz también es virtual aunque al final siempre hay una tarjeta física.
No hay grandes diferencias entre las interfaces de red de un ordenador local en tu escritorio o un servidor virtual. En el VPS no tendrás acceso a la parte física pero ni falta que hace. De todo lo que es hardware se ocupa tu proveedor. Tu solo preocúpate de las configuraciones y de pagar el alquiler ;-)
Con Oracle Cloud uno de los primeros pasos es crear la red virtual (VNC Virtual Network Cloud) que se comporta muy parecida a una red física. Tiene sus propias interfaces de red 'VNIC' (virtual network interface card), gateways virtuales, firewalls, etc. La VNIC tiene su propia NIC virtual y ésta se comunica con la NIC física para tener salida por Internet. Para más información sobre redes en Oracle visita https://docs.oracle.com/es-ww/iaas/Content/Network/Concepts/overview.htm. Con su asistente, puedes hacer fácilmente los ajustes básicos de red local, gateway y pedir que le asignen una IP pública para servicios de internet.
Otros proveedores de internet más sencillos tipo Hostinger, Digital Ocean o similares te dan un servidor con una distribución Linux a escoger donde ya vienen configurados los datos de red y le asignan la IP pública. Estos ISP(proveedor de servicios de internet) están enfocados hacia clientes que quieren hacer una web personal o para web de pequeñas empresas y buscan un VPS económico. Por otro lado Oracle, Aws, Azure, Google Cloud o IBM Cloud son muy elásticos. Puedes ir desde un pequeño servidor a precios asequibles hasta una gran infrastuctura para multinacionales y grandes organizaciones con potentes servidores conectados por todo el mundo. Cual elegir dependerá de tus necesidades y sobre todo de tu presupuesto.
En cualquier caso, sin importar con quien contrates el VPS, al iniciar un servidor remoto o practicando con uno local tenemos,
como mínimo, dos interfaces de red. Una se llama enp0s3
con la IP que identifica al
servidor dentro de la subred y la otra lo
o loopback
. La dirección de loopback es una dirección especial
que los hosts utilizan para dirigir el tráfico hacia ellos mismos. Generalmente se usa 127.0.0.1 como loopback.
Cualquier ordenador que usamos también tiene varias interfaces de red por software que usan la interfaz de red física o tarjeta de red.
En Windows, desde
PowerShell el comando Get-NetAdapter
muestra todas las interfaces de red (Nota:Este comando no funciona desde CMD). Para operar
y obtener datos de las tarjetas red es recomendable usar PowerShell. Aún así para CMD tenemos el comando netsh interface show interface
En Linux se usaba durante muchos años ifconfig
pero ya ha sido reemplazado por ip address show
.
El nombre de la interfaz también indica de que tipo de interfaz se trata. En Linux, las interfaces de red tienen nombres tales como:
Tiene el mismo formato que una IP. Su función es indicar de una IP que parte pertenece a la subred y que parte al host. Al definir una máscara de red estamos facilitando al enrutador donde tiene que enviar los paquetes.
En una máscara 255.255.255.0, conocida como clase C, estamos diciendo que de una IP los 3 primeros octetos pertenecen a la red y el último octeto identifica los dispositivos. En este caso tenemos una red con capacidad para 254 equipos. ej: De 192.168.0.1 a 192.168.0.254. Los valores 0 y 255 están reservados. El valor 0 sirve para indicar la red. El valor 255 es el de difusión o broadcast.
En la máscara 255.255.0.0, clase B, tenemos 256 subredes con un total de 65534 host.
Existen muchísimas combinaciones de máscaras de red. La siguiente tabla de wikipedia te muestra un resumen.
Pongamos el siguiente ejemplo que ayudará a entender como funcionan las máscaras:
Tenemos una máscara tipo C 255.255.255.0. Seguramente la más común en redes domésticas y pequeñas y un host con 192.168.0.100 que envía un
paquete a 192.168.0.125. Al tratarse de una comunicación entre la misma subred,
los paquetes se han dirigido a la dirección IP xxx.xxx.xxx.125 ya que la máscara de subred 255.255.255.0 ha ocultado los 3 primeros octetos.
Ahora imaginemos que tenemos que enviar un paquete a 80.58.5.189. En este caso, se deduce que el equipo destino no está en la misma red porque los 3 primeros octetos no se corresponden con el rango de la red, así que el enrutador o router con la ayuda de la tabla de enrutamiento, dirige hacia el exterior los paquetes con la puerta de enlace o gateway.
CIDR (Classless Inter-Domain Routing o «enrutamiento entre dominios sin clases») es un estándar de red para la interpretación de direcciones IP.
Los bloques CIDR IPv4 se identifican usando una sintaxis similar a la de las direcciones IPv4: cuatro números decimales separados por puntos,
seguidos de una barra de división y un número de 0 a 32; A.B.C.D/N.
Los primeros cuatro números decimales se interpretan como una dirección IPv4, y el número tras la barra es la longitud de prefijo, contando desde la
izquierda, y representa el número de bits comunes a todas las direcciones incluidas en el bloque CIDR.
Ejemplos:
192.168.0.0/16 indica máscara tipo B porque 16 se traduce como 1111111111 1111111111 00000000 00000000. Estos quiere decir que los 2 primeros
octetos son cómunes y representan el rango de red.
192.168.0.0/24 indica máscara tipo C porque 24 se traduce como 1111111111 1111111111 1111111111 00000000. Ahora los 3 primeros
octetos son cómunes y solamente el octeto 4 queda libre para asignar hosts.
En cada subred el valor de IP mayor se reserva para la difusión. Permite mandar un mensaje desde un punto a todos los dispositivos de la subred. A grandes rasgos, cuando el host emisor crea un mensaje dirigido a la IP de broadcast, mediante el switch se crearán las copias necesarias y las reenviará a todos los dispositivos que se encuentren en esa misma subred.
ARP son las siglas de Address Resolution Protocol. Es una tabla de parejas MAC-IP que sirve para vincular cada IP(dirección lógica) de una red con su MAC (dirección física). Cuando un dispositivo quiere conectar con otro, del que sabe la IP pero no la MAC, hace una petición ARP por la dirección de broadcast a todos los equipos de la red para preguntar por la MAC de esa IP. La pregunta la reciben todos los dispositivos pero solamente contestará aquel que coincida con la IP. Si el rango de red fuera del exterior la petición será enviada al router y éste irá preguntando a todos los routers intermedios hasta llegar al destino.
Es un sistema de la red que sirve de enlace entre dos redes. Tiene su dirección IP por donde entrarán o saldrán paquetes
entre diferentes redes conectadas. Por una cuestión de buenas prácticas es común atribuir la primera o última IP disponible
como puerta de enlace.
El Gateway en la red es un dispositivo, generalmente un router o un ordenador, que es el único punto de conexión directa con el exterior de la LAN.
Todos los dispositivos de una LAN, cualquier ordenador, impresora, etc para salir a internet o una red vecina deben de pasar por el router.
En entornos domésticos o pequeñas oficinas la puerta de enlace es el router que te suministra tu proveedor de internet. Trae switch de red con
varios puertos, DHCP y Wifi.
Un switch o conmutador sirve para interconectar dispositivos en la misma red. En entorno doméstico o pequeña oficina el router y el switch
van encapsulados en el mismo aparato.
Dynamic Host Configuration Protocol (protocolo de configuración dinámica de host). Se trata de un protocolo de red tipo cliente / servidor que se encarga de asignar direcciones IP de forma dinámica. Es el encargado de que al conectar un dispositivo a red como tu portátil o smartphone se le asigne una IP única.
Las tablas de enrutamiento son uno de los componentes esenciales para que un router pueda cumplir su función que consiste en dirigir a los paquetes de datos al destino a través de la ruta más adecuada distinguiendo cuando va a una red local o una red externa.
La tabla de enrutamiento opera según un conjunto de reglas que sirven para determinar que camino deben seguir los paquetes de datos en las redes con protocolo IP. Los routers y ordenadores como Windows, Linux o Mac, tienen una tabla de enrutamiento para saber cómo llegar al destino. En definitiva, cualquier dispositivo que tenga una IP tiene una tabla de enrutamiento.
Elementos de una tabla de enrutamiento:
Para entender como funciona lo veremos de manera práctica viendo varias tablas de algunos equipos. En Windows
route print
y netstat -r
muestran las tablas de enrutamiento.
En este fragmento de mi tabla he marcado con colores algunas líneas con los 3 casos más representativos para comentarlas con más detalle. La interpretación del resto de la tabla aplica la misma lógica.
Analicemos la primera línea marcada en amarillo.
El Destino de red 0.0.0.0 es cualquier IP que no esté contemplado en el resto de la lista de destinos. Como comprenderás es imposible crear una lista con
todas las IP del mundo de páginas web, servidores de correo, etc. En esos casos 0.0.0.0 significa cualquier IP. Se usará como Máscara también
0.0.0.0 para poder llegar a cualquier destino. La Puerta de enlace 192.168.1.1 es la de mi router. El apartado Interfaz indica que es
lo se utiliza para enviar el paquete. La dirección 192.168.1.184 es la IP privada de mi ordenador. Por último, tenemos la métrica
que indica la prioridad y límite de saltos para llegar al destino. Entre más pequeño el valor más alta la prioridad.
Esta primera regla es la que se aplica cuando navegamos por internet. Un ejemplo típico sería abrir google.es desde un navegador. Ese dominio está en
216.58.215.163. Como esa IP no la tengo registrada en mi tabla de enrutamiento
se usará la regla 0.0.0.0 y los paquetes irán por 192.168.1.1 saliendo de mi ordenador por la interfaz 192.168.1.184. Una vez sale el paquete de mi router, irá
saltando por diferentes routers totalmente ajenos a mi red local. Más adelante comentaremos como seguir la trazada de un paquete por internet.
Continuando con la tabla, turno para explicar la línea marcada en verde. El Destino 192.168.1.0 en este caso se refiere a una red porque es la IP más
baja de esta red. Esto requiere una pequeña aclaración. ¿Por qué es una red y no una IP?
Que la máscara sea 255.255.255.0 indica un rango de 0 a 255. Por tanto 0 es el valor más pequeño y está reservado para indicar la red.
Otras máscaras pueden hacer segmentaciones de red, lo
que se denomina subnetting, que hará que dentro del rango 0 a 255 hayan varias subredes independientes y entonces el valor más bajo no tiene
por qué ser 0.
De hecho no lo será salvo en la primera división de red. Si tuviera de máscara 255.255.255.128 tendría dos subredes: una con rango 0 a 127 y otra de 128 a 255.
En la primera subred el valor 0 será la red pero en la segunda red será 128. Conclusión: el 0 no es siempre el valor más bajo de una red.
A menudo vemos redes tipo C 255.255.255.0 que nos pueden dar la falsa creencia de que el 0 es siempre el valor menor de una red.
Existe una herramienta muy práctica para diseñar redes: es la calculadora de redes. A partir de la IP y máscara nos dirá el número de redes creadas y sus rangos.
En internet hay muchas. Pones en cualquier buscador Calculadora Redes y puede salirte esta https://www.calculadora-redes.com/ o cualquier
otra parecida. Las calculadoras son de gran ayuda en el diseño de redes y para entender el por qué nuestra red tiene esos valores de Broadcast o
esa máscara.
Volviendo a la tabla en Puerta de enlace aparece En vínculo. Esto quiere decir que tome como interfaz de salida la propia interfaz del dispositivo, es decir, la tarjeta de red del propio ordenador. Es algo confuso. Recordemos la regla anterior en el que la puerta de enlace era la IP del router porque vamos al exterior. En este caso como vamos a dispositivos de la misma red local nos comunicamos a través de la propia interfaz del equipo que manda los paquetes. Finalmente en la métrica sale un número mayor que en el caso anterior. Por tanto, tiene menos prioridad.
Tercer y último caso que detallamos. En color rojo mandamos un paquete a nuestro propio ordenador, Destino 192.168.1.184. La Máscara 255.255.255.255 no deja espacio para una red, por tanto el destino es una IP, nuestra IP. Como Puerta de enlace también aparece En vínculo. Parece un poco absurdo pero es así. Para autocomunicarse entre sí un host usa su propia interfaz para entrar y salir.
En Linux los obsoletos route -n
, netstat -rn
presentan las tablas
de manera parecida a como hemos visto en Windows con route print
y netstat -r
.
Con la entrada del paquete iprote2 y Netplan cambian muchos comandos de red y la ubicación de los archivos de configuración.
Me pareció interesante comparar los resultados entre algunos clásicos programas de red del viejo paquete net-tools
con sus equivalentes modernos del paquete iprote2. Si bien, lo recomendable es olvidarse de net-tools hay ocasiones en
que echo de menos algunos de sus comandos.
Para comenzar vamos a examinar la tabla de enrutamiento en varias máquinas Linux. Veremos resultados en un VPS Ubuntu de pago con Hostinger,
en una instancia de servidor Ubuntu de Oracle Cloud y una máquina virtual Ubuntu en Oracle VM VirtualBox que corre en Windows.
Primero veremos los obsoletos
route -n
y netstat -r
, a continuación repetimos con su equivalente moderno ip route
. Teoricamente son equivalentes pero, como vamos
a comprobar, no dan exactamente la misma información.
Empezamos en un VPS Hostinger con Ubuntu 18.04 lanzando un route -n
Comparando con los resultados vistos en Windows vemos que algunas columnas son idénticas y otras muestran información diferente. Esto puede ser un poco enmarañado cuando se empieza a estudiar la red con un poco de profundidad. Al menos las columnas más importantes son comunes entre diferentes comandos y sistemas operativos.
Vamos a aclarar un poco que tenemos aquí:
Vamos a comparar resultados con el otro clásico:netstat -r
. La -r
significa route. Tiene varios parámetros para analizar la red.
Como se considera obsoleto, no le prestaremos mucha atención. Solamente un vistazo para comparar con otros y no olvidar que existió este útil comando.
De nuevo encontramos diferencias en las columnas mostradas. Ahora salen valores de MSS, Window y IRTT que si indican 0 significa que tienen el valor predeterminado que no necesariamente es 0. Para el nivel que tenemos y dado que la mayoría de redes funcionan con los valores predeterminados, no haremos nada con esta información. Simplemente los comento un poco para saber de que van:
MSS: acrónimo de Tamaño Máximo de Segmento. Es el tamaño del datagrama más grande que construirá el núcleo para transmitir a través de esta ruta.
Window: es la cantidad máxima de datos que el sistema aceptará de una sola vez desde una máquina remota.
IRTT: significa “tiempo inicial de ida y vuelta”, por sus iniciales en inglés. El protocolo TCP se asegura de que los datos han sido transmitidos de forma fiable entre máquinas retransmitiendo un datagrama si éste ha sido perdido. El protocolo TCP mantiene un contador de cuanto tarda un datagrama en ser enviado a su destino, y el "comprobante" que se recibe, de forma que sabe cuanto esperar antes de suponer que un datagrama necesita retrasmitirse. Este proceso se llama tiempo de ida y vuelta. El tiempo de ida y vuelta inicial es el valor que el protocolo TCP usará cuando se establezca una conexión por primera vez. Para la mayoría de los tipos de redes, el valor por omisión es válido. El valor de irtt puede ajustarse usando el comando route.
Otra diferencia es que sustituye las redes 0.0.0.0 por default
. Recuerda que comentamos que cualquier ruta que no está en la tabla se
denomina "por defecto". El resto de información, que es la que de momento solo nos interesa,
es exactamente igual.
Para finalizar nos queda por ver ip
. Es muy completo y conviene conocerlo con más profundidad. A fecha de hoy, es la aplicación
recomendada para examinar y configurar las redes en Linux Ubuntu y otras muchas distros. Empezamos por el comando ip
con el subcomando
route
.
Como siempro insisto en echar un vistazo a la ayuda del comando para conocer la gran cantidad posibilidades que ofrece. Recordemos que se hace con
man ip
y para el manual más extendido del subcomando route
se usa man ip-route
.
En la siguiente captura tenemos un pequeño fragmento de la mucha información que nos brinda man
.
También puedes buscar los manuales de man en internet. En concreto para Ubuntu para el
comando ip route
en http://manpages.ubuntu.com/manpages/bionic/man8/ip-route.8.html
tienes la documentación vía web.
Desde la man page
una breve definición de ip
nos informa que sirve para ver y configurar enrutamientos,
dispositivos de red, interfaces y túneles.
He marcado en amarillo los 4 objetos o subcomandos más usados con ip
:
Bien, siguiendo la ayuda de man
usaremos route
. Es válido tanto
ip route
como abreviado ip r
.
Nuevamente descubrimos que cada comando para ver rutas muestra la info con pequeñas diferencias sobre los tipos de datos mostrados. En mi opinión,
el formato que utiliza ip
es el menos claro. Suprime las tablas bien diferenciadas por columnas y ahora el nombre de la columna
y el dato va en la misma línea. De todas formas enseguida te acostumbras y no debe suponer ninguna complicación. Expliquemos un poco que tenemos aquí:
1- El primer dato es la red o la IP a la que queremos conectar. En la prímera línea default
ya comentamos que se refiere a
0.0.0.0
osea cualquier IP. En la segunda línea 172.17.0.0/16
es el rango de host predeterminado para contenedores Docker. Con una
calculadora de redes salen 65.534 hosts que van de 172.17.0.1 - 172.17.255.254. El prefijo CIDR /16
indica que la máscara es
255.255.0.0. Por último, la línea 3 con 194.5.159.0/24
hace referencia a la red dónde está el dispositivo y con una máscara tipo C,
255.255.255.0
2- A continuación prestamos atención al segundo dato. En la prímera y tercera línea con dev venet0
se indica que interfaz usaremos para la
conexión de la IP o red del primer dato. La
interfaz venet0
tiene muchas limitaciones y muy escasa documentación en internet. Solamente encontré en
https://wiki.openvz.org/Virtual_network_device.
En foros de Stackoverflow desaconsejan los vps con venet. Además es confuso iniciarse con servidores con interfaz venet. Un dato tan básico
como la gateway no aparece. Tampoco sirve preguntar al soporte de este VPS (Hostinger) ya que no ofrecen información técnica alguna. Consejo:
si puedes no contrates un VPS con interfaz venet0
Para la segunda línea la interfaz que uso para salir es docker0
. Docker es una tecnología de contenedores muy interesante
de la que tengo pendiente preparar una serie de tutoriales. Esta interfaz aparece porque al instalar Docker se crea automaticamente la interfaz.
3- El tercer dato es el protocolo de enrutamiento. Encontrar documentación que explique en profundidad que hace cada tipo de proto
es tarea casi
imposible. Solamente encontré algo en el archivo man de ip route
y algún breve comentario en Stackoverflow. En el caso real de este VPS
todos las rutas son proto kernel
, es decir el kernel creó la ruta durante la configuración automática. El protocolo kernel es el valor más
habitual que encontraremos. Recordemos que el núcleo o kernel
es la parte central de un sistema operativo y es el que se encarga de realizar toda la comunicación segura entre el software y el hardware del ordenador.
En el fichero /etc/iproute2/rt_protos
está la lista de posibles protocolos y su equivalente numérico.
Se me ocurrió crear una regla y me salió una duda de la que no encuento respuesta.
Ejecuto sudo ip addr add 192.168.0/24 dev enp0s3
para seguidamente examinar la tabla con ip route
.
Descubro que esta nueva regla también es del tipo proto kernel
aunque no fue creada durante la configuración automática. ¿Por qué? No lo se.
De momento, no haremos nada con esta información y dejaremos que al crear una regla tome el protocolo por defecto.
4- El cuarto dato es el scope
(significa alcance). En esta tabla los 3 enrutamientos son del tipo scope link
. Su valor puede ser una
cadena o número según la lista de /etc/iproute2/rt_scopes
.
scope link
significa que dentro del segmento de red del dispositivo o LAN se permite la comunicación a través de este enlace. Hacia el exterior debe
usarse el enrutamiento.
El tema del Scope es también complicado para encontrar ejemplos y explicaciones. De lo que me queda claro tras buscar y rebuscar mucho es que además
del link
tenemos otros scopes
que de manera muy resumida son:
5- Por último tenemos el origen o source que es la IP desde donde se inicia la conexión para ese destino. Vemos que para conexiones por defecto se omite este dato,
que para docker usa la IP 127.17.0.1 que es la IP predeterminada de Docker y por último en la última línea el src 194.5.159.198
será la IP origen para
todas las rutas con destino la propia LAN del VPS, que en formato CIDR se representa como src 194.5.159.0/24
Lo siguiente que veremos es otra tabla de enrutamiento de una máquina virtual de Oracle Cloud. Como vamos a comprobar enseguida, tenemos más campos de información y algunos de los valores cambian.
La primera línea de la tabla es para las rutas por defecto 0.0.0.0. Vuelvo a repetir las rutas a cualquier ip no contemplada
en el resto de la tabla. via 10.0.0.1
indica el gateway. Esto es por donde daremos el primer salto para rutas
externas a la LAN. Cualquier destino fuera de la red necesita una puerta de enlace. ¿Por qué está omitido el gateway en el VPS Hostinger? No lo se.
Lo pregunté al soporte técnico y tampoco me lo quisieron explicar.
Siguiendo en esta línea, el siguiente dato dev enp0s3
ya lo conecemos del otro VPS. Es la interfaz que usamos para esa ruta.
A continuacíon el protocolo. Si antes vimos en el otro servidor que siempre era del tipo kernel
en este nos encontramos que
algunas rutas usan protocolo dhcp
que como ya sabemos es aquel donde las IP se asignan dinámicamente.
El siguiente dato, src 10.0.0.67
es la IP privada del servidor usada como origen de las conexiones en esta ruta.
Por último, tenemos en algunas rutas el dato metric 100
que es un valor de prioridad o de límite de saltos en conexiones. Nada
nuevo que no hayamos visto. En las rutas que no aparece la métrica es porque tiene el valor predeterminado.
La última regla de enrutamiento al rango 169.254.0.0/16
es de uso interno de la infrastructura de Oracle Cloud. Se utilizan para conexiones con los volúmenes de inicio y
de bloque y otros servicios. Cuando decimos volúmenes en un servidor Cloud nos referimos a lo que equivale a los discos duros de un PC. Más info
en https://docs.oracle.com/es-ww/iaas/Content/Network/Concepts/overview.htm
Con esto ya tenemos unas nociones de lo que hace y que información muestra una tabla de enrutamiento. Dejamos para más adelante la creación de reglas.
Muestra las direcciones IP asignadas a todas las interfaces. Es el equivalente al antiguo ifconfig
de Linux y al
ipconfig /all
de Windows.
Tiene varias formas de escribirse para abreviar:
ip address
ip ad
ip a
Vamos a comentar que significa toda la información que nos muestra. Lo importante aquí es saber el nombre de la interfaz, su IP y si está en estado habilitado o no.
En este VPS aparecen numeradas 3 interfaces con sus características. La documentación sobre que significa cada uno de estos datos es escasa y además muchos de los valores son para configuración a 'bajo nivel'. Seguramente la gran mayoría de datos no tengamos que modificarlos nunca porque su valor predeterminado será suficiente para funcionar en la mayoría de usos. Al menos, sabremos un poco que hacen.
Tras el nombre de la interfaz entre los caracteres <> tenemos los llamados Indicadores de estado de los dispositivos de red también conocidos como Indicadores net_device. Copio de http://manpages.ubuntu.com/manpages/bionic/es/man7/netdevice.7.html la breve explicación que hacen del significado de estas banderas:
Además de estas banderas, en la interfaz docker0 tenemos otra que no encuentro en la documentación oficial. En Stackoverflow comentan esto:
/etc/iproute2/group
. Inicialmente solo existe 'default'En las siguientes líneas tenemos:
link: Aquí tenemos la dirección física MAC Address.ip route
ya se comentó los diferentes tipos de scope.forever
(para siempre). Se pueden crear interfaces de red y fijar el tiempo de vida que sea necesario. Pasado ese tiempo la interfaz
desaparece o se dehabilita.
Con toda esta información técnica ya somos capaces de interpretrar las interfaces de red de cualquier interfaz linux. Aunque ip address
da muchos datos, lo más importante es mirar el 'state' para saber si está activa, IP, máscara y el nombre.
En este ejemplo, la interfaz docker0 está en state DOWN. Esta interfaz es la que se usa cuando se levanta un contenedor Docker. Hasta que no esté corriendo un contenedor no cambiará a state UP. El cambio es automático.
Vamos a examinar otro VPS hospedado en Oracle Cloud. Nuevamente entramos ip address
desde la terminal:
Bien, se trata de un servidor con la instalación original de ubuntu y nada mas. Hay pequeñas diferencias en algunas banderas de las interfaces que por el momento no afectan los usos habituales que daremos a los servidores. Podemos ver que el tamaño de Mtu aquí es mucho mayor, que la diciplina de colas es del tipo 'pfifo_fast'. En próximos artículos montaremos el stack LAMP, ftp, VPN, contenedores docker y otros servicios y aplicaciones y veremos si realmente esas diferencias no importan.
Con este comando podemos comprobar que ruta seguirá un paquete a una IP. La forma de uso más simple es indicarle una IP y nos dirá que ruta seguirá para alcanzarla:
ip route get dirección_ip
Desde un VPS vamos a comprobar que efectivamente sigue las reglas. Tenemos esta tabla:
default dev venet0 scope link
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
194.5.159.0/24 dev venet0 proto kernel scope link src 194.5.159.198
Comprobemos como conecta consigo mismo:
ip route get 194.5.159.198
local 194.5.159.198 dev lo src 194.5.159.198
El resultado es que usará la interfaz loopback y el origen será la IP pública del propio VPS
Ahora comprobemos como conecta con internet a por ejemplo la famosa DNS de Google:
ip route get 8.8.8.8
8.8.8.8 dev venet0 src 194.5.159.198
El resultado es que usará la interfaz venet0 y el origen será la IP pública del propio VPS
Por último, veamos como conecta a los rangos de IP de Docker
ip route get 172.17.0.50
172.17.0.50 dev docker0 src 172.17.0.1
El resultado es que prefiere usar la interfaz docker0 y el origen será la IP predeterminada de docker. Con estas sencillas pruebas queda demostrado que se respetan las tablas de enrutamiento.
A medida que el equipo va conectándose a diferentes dispositivos de la subred, guarda en una cache la dirección física (dirección MAC) para facilitar
futuras conexiones.
Cuando un host quiere conectar con otro del que no conoce la MAC manda una petición broadcast (a toda la subred) preguntando por él equipo
de esa IP. Ese equipo responderá informando de su MAC y su IP. Esta lista de dispositivos conocidos o 'vecinos' se denomina tabla ARP.
El comando ip neigh show
muestra la tabla ARP.
ubuntu@ubuntusrv2:~$ ip neigh
10.0.0.1 dev enp0s3 lladdr 00:00:17:f3:c2:30 REACHABLE
10.0.0.105 dev enp0s3 FAILED
10.0.0.103 dev enp0s3 lladdr 02:00:17:00:dd:1f STALE
169.254.169.254 dev enp0s3 lladdr 00:00:17:f3:c2:30 DELAY
En la anterior tabla ARP de un VPS en Oracle tengo varias entradas:
lladdress
viene de 'link layer address' (dirección de la capa de enlace).
10.0.0.1 en estado REACHABLE (accesible). Este es el gateway.
10.0.0.105 en estado FAILED (error). Hice una prueba a un ping al azar dónde no encontró nada pero aún así hizo un registro.
10.0.0.103 en estado STALE. La entrada es válida pero 'sospechosa'. En esta IP hay otro VPS.
169.254.169.254. en estado DELAY. Esta IP es de uso interno de Oracle Cloud. La validación de entrada está actualmente retrasada.
Podemos borrar, modificar y añadir manualmente nuevas ARP. A modo de ejemplo vamos a eliminar la entrada que se ha creado en estado FAILED.
sudo ip neigh del 10.0.0.105 dev enp0s3
El comando ip link show
sirve para mostrar o cambiar los atributos de la interfaz. Otras formas abreviadas son: ip link
, ip l
.
ip link
1: lo:
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: venet0:
link/void
3: docker0:
link/ether 02:42:13:99:6f:c8 brd ff:ff:ff:ff:ff:ff
Podemos cambiar el estado UP/DOWN, el nombre y otras características.
En el siguiente ejemplo la interfaz pasará a DOWN. Modifica el atributo que está entre <>. Hay otro state up/down en la misma línea
sudo ip link set docker0 down
Tras esto podemos comprobar el estado de esa interfaz:
ip link show dev docker0
3: docker0:
link/ether 02:42:5d:e6:00:c6 brd ff:ff:ff:ff:ff:ff
Para seguir la trazado de los saltos de datagramas se usa en linux traceroute y en Windows tracert. Aunque se llamen diferente realmente son el mismo programa.
En este ejemplo podemos ver los sucesivos saltos que tiene un paquete para llegar a un servidor desde un ordenador local WIndows a un VPS Linux
Sin embargo si intentamos lo mismo entre equipos Linux no obtenemos respuestas.
La razón es porque tracert
en Windows usa protocolo ICMP y en cambio en linux traceroute
por defecto usa
protocolo UDP y en estos momentos el firewall está filtrando entradas UDP. Anteriormente cuando probamos el uso de
ping
tampoco funcionaba y vimos como abrir el firewall para entradas y salidas ICMP. Como solución rápida,
por parámetros podemos forzar que traceroute
use otros protocolos como el ICMP que previamente hemos abierto o
algún puerto TCP que sepamos está abierto. Como a este servidor le vamos a dar servicios de WEB tenemos abiertas TCP por puerto 80.
El comando quedará así: traceroute -T -p 80
. El parámetro -T
es para usar protocolo TCP y el
parámetro -p 80
para usar el puerto 80. De esta forma las respuestas son recibidas.
sudo traceroute -T -p 80 10.0.0.67
traceroute to 10.0.0.67 (10.0.0.67), 30 hops max, 60 byte packets
1 ubuntusrv2.sub03110851270.masellavcn.oraclevcn.com (10.0.0.67) 0.364 ms !X 0.297 ms !X 0.300 ms !X
El parámetro para usar ICMP con traceroute
es -I
sudo traceroute -I 10.0.0.67
traceroute to 10.0.0.67 (10.0.0.67), 30 hops max, 60 byte packets
1 ubuntusrv2.sub03110851270.masellavcn.oraclevcn.com (10.0.0.67) 0.364 ms !X 0.297 ms !X 0.300 ms !X
Si tenemos muchos interés en usar traceroute
con protocolo UDP tendremos que abrir los puertos correspondientes.
En el caso de Oracle Cloud para evitar que el firewall de la infraesctructura filtre las comunicaciones para este comando hay que crear
una regla de entrada y otra de salida que permita UDP entre los puertos 33434-33524. Lo podemos hacer desde
Networking->Virtual Cloud Networks->MasellaVCN->Network Security Group Details (Oracle recomienda los Network Security Group)
o desde Networking->Virtual Cloud Networks->MasellaVCN->Subnet Details->Security Lists.
Sea por un camino o por otro las nuevas reglas de firewall son idénticas: deben permitir protocolo UDP por los puertos 33434-33524. El origen del paquete se puede permitir a todas las IP con 0.0.0.0/0 o ser mas restrictivo y acotarlo a rangos o IP de host conocidos.
Tras ingresar estas reglas ya tendremos respuestas con traceroute
con UDP. En el siguiente ejemplo compruebo
las trazas entre 2 VPS de la misma subred de Oracle Cloud.
Un caso complicado de usar traceroute
con protocolo UDP es con máquinas de VM VirtualBox. He conseguido
que funcione por TCP o ICMP. La versión estandar de UDP se me ha resistido y no he conseguido hacerlo funcionar. Sin embargo,
en un VPS de Hostinger sin necesidad de abrir los puertos 33434-33524 funciona por UDP. Conclusión: usar mejor ICMP o TCP
por un puerto conocido que suele estar abierto (los de web 80 y 443).
En Windows podemos obtener valores de configuración de red y las DNS utilizadas con ipconfig /all
. Echo mucho a faltar en Linux
un comando equivalente.
En el pasado en Linux para averiguar los DNS se consultaba el archivo /etc/resolv.conf
. En la actualidad esto
no sirve ya que en la mayoría de casos responde con un receptor de escucha de DNS local: nameserver 127.0.0.53
.
Actualmente para averiguar los DNS que realmente usa el host tenemos los comandos:
systemd-resolve --status
y con:
resolvectl status
#Nota: en este caso status se puede omitir y da el mismo resultado
De ambas formas podemos ayudarnos con grep
para buscar coincidencias de cadena y que la respuesta sea más acotada:
resolvectl status | grep "DNS Servers"
Esto mostrará diversa información de red y en algún lugar tendremos el apartado DNS Servers. Puede salir al principio o al final. Para instancias de Oracle y máquinas virtuales de VirtualBox los DNS se encuentran al final. En Hostinger con Ubuntu me ha salido al principio. En Hostinger tuve algunos mensajes de error que detallo como se soluciona:
[root@tallerdeapps ~]# systemd-resolve --status
Failed to get global data: Unit dbus-org.freedesktop.resolve1.service not found.
//Comprobar estado del servicio
[root@tallerdeapps ~]# systemctl status systemd-resolved.service
● systemd-resolved.service
Loaded: masked (/dev/null; bad)
Active: inactive (dead)
//La respuesta es inactivo. Para habilitarlo:
[root@tallerdeapps ~]# systemctl enable systemd-resolved.service
Failed to enable unit: Unit file /etc/systemd/system/systemd-resolved.service is masked.
//Error! dice que se encuentra 'masked' (enmascarado). Esto quiere decir que se encuentra deshabilitado pero en un nivel más profundo para evitar activaciones accidentales. Para desenmascararlo:
[root@tallerdeapps ~]# systemctl unmask systemd-resolved.service
Removed /etc/systemd/system/systemd-resolved.service.
//Intentamos por segunda activar el servicio.
[root@tallerdeapps ~]# systemctl enable systemd-resolved.service
Created symlink /etc/systemd/system/dbus-org.freedesktop.resolve1.service → /lib/systemd/system/systemd-resolved.service.
Created symlink /etc/systemd/system/multi-user.target.wants/systemd-resolved.service → /lib/systemd/system/systemd-resolved.service.
//Ahora sí deja y finalmente entramos de nuevo el comando para que muestre los DNS
[root@tallerdeapps ~]# systemd-resolve --status
Global
DNS Servers: 145.14.150.10
2a02:4780:8:abcd::153
9.9.9.9
// Lo muestra así en las primeras líneas de una larga lista de datos.