Linux

Sistema operativo.

Por defecto abre 7 Consolas virtuales (Linux) , de la 1 a la 6 de texto y la 7 gráfica.

Estructura

Un sistema linux se compone de hardware, kernel y procesos de usuario. Se ejecuta en el kernel en modo kernel, es decir, sin límites. Los procesos de usuario tienen limitaciones.

El kernel tiene 4 funciones:

  • determinar el acceso y turno de uso de la CPU
  • saber qué memoria hay libre, ocupada y cuál es de cada proceso. El kernel tiene su espacio de memoria y los procesos de usuario pueden tener la suya propio o compartirla. Algunos procesos de usuario pueden tener memoria de solo lectura. Se puede expandir la memoria apoyándose en la swap. Las CPU modernas incluyen un MMU que virtualiza la memoria y deja ver a cada proceso solo su espacio de memoria
  • gestionar el hardware usando drivers etc
  • gestionar las system calls: dos son importantes: fork() hace una copia casi exacta del proceso actual, exec(program) hace que el kernel cargue el programa de la memoria y reemplace el actual proceso. Por ejemplo, aquí abrimos un shell y hacemos un ls.
graph LR;
     A["SHELL"]-->B["FORK()"];
     B-->C["SHELL"];
     B-->D["COPY OF SHELL"];
     D-->E["EXEC('ls')"];
     E-->F["ls"];

Red

Interfaces de red

Los interfaces de red en linux se representan como una serie de ficheros en /sys/class/net.

Para inspeccionar usa ip pero para cambios permanentes uso nmcli (networkmanager).

# pasamos de dhcp a  estatica
sudo nmcli connection modify leonoetam ipv4.method manual ipv4.addresses 192.168.1.199/24 ipv4.gateway 192.168.1.1 ipv4.dns "8.8.8.8,1.1.1.1"
sudo nmcli connection up leonoetam

# pasamos de estática a dhcp
sudo nmcli connection modify leonoetam ipv4.method auto ipv4.addresses "" ipv4.gateway "" ipv4.dns ""
sudo nmcli connection up leonoetam

Una misma interfaz puede tener muchas ips y conectarse a una o más redes lógicas pero a una solo red física. Si necesitas conectar con dos redes físicas, necesitas dos tarjetas de red. Un equipo puede tener varias tarjetas de red por redundancia.

ip address add 192.168.1.14/24 dev interface_name  #anadir una ip a la interfaz

Rutas

Las rutas se obtienen con el comando ip route show. Si hay dos rutas que coinciden con la red destino, se escoje la más larga. De esta manera si el kernel quiere enrutar 10.23.2.132 y hay dos reglas, la por defecto 0.0.0.0/0 y una segunda 10.23.2.0/24 escoge la que tenga mayor prefijo. En este caso usa la segunda porque 24>0.

Añadir ruta:

ip route add default via gw-address dev interface_name  # anade ruta
ip route del default                                    # borra ruta

Para ver la configuración en ipv6 tenemos ip -6 address show.

DNS

Para hacer una consulta DNS host www.elpais.es.

El sistema linux mira primero en /etc/nsswitch.conf en qué orden mirar (mira primero en /etc/hosts, etc).

Iptables

Netfilter es la parte del kernel que procesa el tráfico y usa las reglas que se editan con IPTABLES.

  1. PREROUTING Antes de decidir a dónde va el paquete. Tablas asociadas: raw mangle nat
  2. INPUT Cuando el paquete va dirigido al propio host. Tablas asociadas: mangle filter
  3. FORWARD Cuando el paquete pasa a través del host (no es para él, es un router). Tablas asociadas: mangle filter
  4. OUTPUT Cuando el paquete es generado por el propio host. Tablas asociadas: raw mangle nat filter
  5. POSTROUTING Justo antes de que el paquete salga por una interfaz. Tablas asociadas: mangle nat

Para cada paquete que recibe el cortafuegos, se examina la primera regla de la cadena correspondiente. Si el paquete no se ajusta a esa regla, se continúa examinando la siguiente hasta que se ajusta con alguna. En ese momento se ejecuta el target:

DROP: el paquete se descarta, no puede pasar
ACCEPT: el paquete continúa su camino normal

Si se llega al final de una cadena predefinida se ejecuta un target por defecto, llamado chain policy. El chain policy establece, por tanto, la política por defecto de nuestro cortafuegos.

graph TD
    subgraph "Máquina con iptables"
    A[Paquete Entrante] --> C{PREROUTING};
    C -- tabla mangle --> D[Decisión de Enrutamiento];
    C -- tabla nat (DNAT) --> D;

    D -- ¿Destino final es este host? --> E[INPUT];
    D -- ¿El paquete debe ser reenviado? --> F[FORWARD];

    G[Proceso Local] --> H[OUTPUT];
    H -- tabla mangle --> I{POSTROUTING};
    H -- tabla nat (SNAT) --> I;
    H -- tabla filter --> I;


    E -- tabla mangle --> J[Consumido por Proceso Local];
    E -- tabla filter --> J;

    F -- tabla mangle --> I;
    F -- tabla filter --> I;

    I -- tabla mangle --> K[Salida a la Red];
    I -- tabla nat (SNAT) --> K;

    end

    style A fill:#cde4ff
    style K fill:#cde4ff
    style J fill:#d4edda
    style G fill:#fff3cd

Para montar un NAT server en Linux lo más estable es usar OpenWRT e instalar un firewall.

Para poner reglas de firewall se puede usar directamente IPTABLES. Por ejemplo, te molesta la IP 192.168.34.63 y quieres que no habla con tu máquina

iptables -A INPUT -s 192.168.34.63 -j DROP

Para detener IPs de todo ese bloque de conectar por SMTP:

iptables -A INPUT -s 192.168.34.0/24 -p tcp --destination-port 25 -j DROP

Para establecer que solo se puede hablar con tu máquina por SSH y nada más:

iptables -P INPUT DROP
iptables -A INPUT -p icmp -j ACCEPT  # aceptar pings
# permitir desde la propia maquina
iptables -A INPUT -s 127.0.0.1 -j ACCEPT
iptables -A INPUT -s mi_direccion_ip -j ACCEPT
# permito paquetes salientes (no tienen syn)
iptables -A INPUT -p tcp '!' --syn -j ACCEPT
# permito requests DNS remotas
iptables -A INPUT -p udp --source-port 53 -s servidor.dns -j ACCEPT
# abrimos ssh general
iptables -A INPUT -p tcp --destination-port 22 -j ACCEPT

Wifi

iw dev wlp1s0 scan   # buscar redes
iw dev wlp1s0 link   # info
iw wlp1s0 connect leonoteam   # conectar a red

Bash

Con ctrl+d termina el input (se manda EOF).

cat > ejemplo.txt
esto es un ejemplo
y aqui acaba
(ctrl+d)
Esto escribe un fichero. Si en vez de ctrl+d haces ctrl+c (SIGINT) puede que lo escriba antes de guardar o no, es abrupto.

Manejando los streams:

echo "hola" > hola.txt   # escribir salida estandar
ls /noexiste > salidaestandar.txt 2> salidaerrores.txt
ls /noexiste > salida 2>&1      # al mismo sitio
head < /proc/cpuinfo

Viendo procesos

ps  # ver procesos asociado a mi terminal actual (TTY)
kill -STOP 1501279   # pausar un proceso
kill -CONT 1501279   # reanudar un proceso

Los devices/ficheros pueden ser de 4 tipos: - block: donde se lee byte a byte - character: no tienen tamaño, se puede leer y escribir, acción inmediata, Ejemplos: /dev/tty, /dev/null, /dev/random - pipe: comunicación entre procesos de la misma máquina. FIFO. bloquea lectores hasta que hay escritores. Puede ser named pipe (que se hacen con mkfifo) o anonymous pipe que viven en memoria y se hacen con el operador |. - socket device: comunicación bidireccional entre procesos. Los hay sockets unix donde hay un fichero y sockets de red donde hay ip+puerto.

Sysfs (Device Path)

Los devices se ven en /dev pero pueden tener nombres distintos cada reboot. Sysfs expone los devices en /sys/devices. /dev es para manejar dispositivos y /sys/devices para obtener información de los dispositivos.

Systemd

Tiene 4 tipo de unidades:

  • service:
  • target: control over other units
  • socket: incoming network connection request locations
  • mount: attachments en el filesystem

Tiene Time Units que es la alternativa moderna más potente a los cronjobs.

Journald

El servicio systemd-journald recoge todos los streams de entrada y error y los unifica en un solo stream clasificado.

journalctl -S -4h                   # ultimas 4 horas
journalctl -S 2020-01-14            # desde ese dia
journalctl -u cron.service          # una unidad
journalctl -g 'kernel.*memoery'     # grepear por regex
journalctl -b                       # ver ultimo boot
journalctl -b -1                    # ver penultimo boot
journalctl -b -r -1                 # ver apagado
journalctl -p 3                     # ver lgos de prioridad 3 (0-7 0 mas grave)
journalctl -p 3..5
journalctl -f                       # tail

El servicio rsyslog escucha el stream de journald y decide, usando reglas, donde escribe cada linea.

Audio

  • PipeWire: servidor multimedia moderno que reemplaza a PulseAudio y JACK, ofreciendo baja latencia y mejor compatibilidad.
  • Pulseaudio: servidor de sonido tradicional en Linux, gestiona el audio entre aplicaciones y dispositivos.

Control de recursos

A través de Cgroups.