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.
- PREROUTING Antes de decidir a dónde va el paquete. Tablas asociadas: raw mangle nat
- INPUT Cuando el paquete va dirigido al propio host. Tablas asociadas: mangle filter
- FORWARD Cuando el paquete pasa a través del host (no es para él, es un router). Tablas asociadas: mangle filter
- OUTPUT Cuando el paquete es generado por el propio host. Tablas asociadas: raw mangle nat filter
- 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)
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.