Archivos en la Categoría: Educacion

Linux: netplan, blackhole and unreachable routes

Ejemplo de rutas blackhole y unreachable en Netplan

network:
  version: 2
  renderer: networkd
  ethernets:
    lo:
      match:
        name: lo
      addresses: [ 127.0.0.2/32 ]
      routes:
        - to: 10.0.0.0/8
          via: 0.0.0.0
          metric: 240
          type: unreachable
        - to: 192.168.0.0/16
          via: 0.0.0.0
          metric: 240
          type: unreachable
        - to: 172.16.0.0/12
          via: 0.0.0.0
          metric: 240
          type: unreachable
        - to: 169.254.0.0/16
          via: 0.0.0.0
          metric: 240
          type: blackhole

Pista: sin el “address 127.0.0.2” o el “via 0.0.0.0” netplan silenciosamente ignora la configuracion.

Referencias:
Netplan design
Netplan reference
Netplan examples
man netplan

Anuncios

Linux: systemd basics

Comandos basicos:

## Reload systemd configuration
systemctl daemon-reload
## Enable/Disable service
systemctl <enable|disable> XXX.service
## Star/Stop/Reload/Status of Service:
systemctl <start|stop|reload|status> XXX.service
## Get Service logs
journalctl -u XXX.service
## Tail log Services
journalctl -f
## Check if service is running (scripting)
systemctl -q is-active XXX.service && echo RUNNING || echo DEAD

Ejemplo de un tunel SSH con respawn:

# systemd: /etc/systemd/system/ssh-tunnel.service
[Unit]
Description=SSH Tunnel
After=network.target

[Service]
Type=simple
StartLimitInterval=0
Restart=always
RestartSec=3
User=root
ExecStart=-/usr/bin/ssh -2 -C -N -L 8080:127.0.0.1:8080 -i /root/.ssh/id_rsa \
                        -oStrictHostKeyChecking=no -oHashKnownHosts=no \
                        -oServerAliveInterval=30 -oServerAliveCountMax=3 \
                        -oTCPKeepAlive=yes -oExitOnForwardFailure=yes \
                        -p 22 user@host.acme.org

[Install]
WantedBy=multi-user.target

Ejemplo de un servicio dummy TCP:

# systemd: /etc/systemd/system/dummy.socket
[Unit]
Description=Dummy TCP Socket

[Socket]
ListenStream=1234
Accept=yes

[Install]
WantedBy=sockets.target
# systemd: /etc/systemd/system/dummy@.service
[Unit]
Description=Dummy TCP Server
Requires=dummy.socket

[Service]
Type=simple
ExecStart=-/bin/echo OK %H
StandardInput=socket
StandardOutput=socket

[Install]
WantedBy=multi-user.target

Referencias:
understanding systemd units
systemd inetd
man systemd.unit
man systemd.service
man systemd.socket

Java: Getting Memory Usage with MemoryMXBean

Estoy madurando una idea y me he encontrado con una de las muchas perlas de JMX de Java, la MemoryMXBean:

MemoryMXBean mbean = ManagementFactory.getMemoryMXBean();
System.out.println("HeapUsage: " + mbean.getHeapMemoryUsage());
System.out.println("NonHeapUsage: " + mbean.getNonHeapMemoryUsage());

El resultado:

HeapUsage: init = 16777216(16384K) used = 7772720(7590K) 
           committed = 16252928(15872K) max = 1037959168(1013632K)

NonHeapUsage: init = 2359296(2304K) used = 15099032(14745K) 
              committed = 15327232(14968K) max = -1(-1K)

Referencias:
java.lang.management.ManagementFactory

Amazon: Protect Instance Metadata and User Data

Es una practica extendida almacenar las credenciales en el “user-data”, el problema es que desde una instancia de EC2 cualquier usuario de la maquina, autorizado o no, puede acceder a estos datos.

Ejemplo:

curl http://169.254.169.254/latest/user-data

Una regla de iptables para evitar estos accesos, salvo para el usuario “root” (uid=0):

iptables -A OUTPUT \
  -d 169.254.169.254/32 -p tcp --dport 80 \
  -m owner ! --uid-owner 0 \
  -j REJECT --reject-with tcp-reset

References:
EC2 – Instance Metadata and User Data
The best method for passing AWS credentials as user data to an EC2 instance?

Disponibilidad / Availability

Una pequeña chuleta con los porcentajes de disponibilidad y el tiempo de caida asociado:

Availability	Downtime
---------------------------------------------------
97% 			10d 22h 48m
98% 			7d 7h 12m
99% 			3d 15h 36m		***
99,5%			1d 19h 48m
99,9% 			8h 45m 36s		***
99,95%			4h 22m 48s
99,96%			3h 30m 14s
99,97%			2h 37m 41s
99,98%			1h 45m 7s
99,99%			52m 34s			***
99,999% 		5m 15s			***
99,9999%	 	32s				***
99,99999%		3s				***

Amazon: Simple WhatIsMyIP with Lambda and API-Gateway

Un ejemplo de como montar un sencillo WhatIsMyIP usando Amazon Lambda con el Backend de NodeJS y API-Gateway.

El código del Lambda (Runtime: NodeJS, Handler: index.handler, Role: Basic Execution Role):

exports.handler = function(event, context) {
    context.succeed({ "ip": event.ip });
};

Aunque para que sea funcional tienes que publicarlo a través de API-Gateway. Crear un resource, por ejemplo “text” y un metodo (GET). Tambien hacen falta algunas configuraciones de integración:

Integration Request (Content-Type: application/json, Mapping Template):

{
"ip" : "$context.identity.sourceIp"
}

Integration Response (Status 200, Content-Type: text/plain, Mapping Template):

#set($inputRoot = $input.path('$'))
$inputRoot.ip

Method Response (Status 200, Content-Type: text/plain, Model: Empty).

Si prefieres respuestas json en realidad es más sencillo aún, podrías ahorrarte la customización de la parte del Integration Response y el Method Response (Por defecto los mime-types ya son application/json y el Integration es Output passthrough).

Solo tienes que publicarla en un stage (“prod” por ejemplo) y al invocar la URL con curl tendrás algo como esto:

# curl -sL https://xxxxxxxxxx.execute-api.eu-west-1.amazonaws.com/prod/text
219.12.34.56

NOTA-1: Si clonas un API, es posible que deje de funcionar (bug?) y tendrás que ir al “Integration Request” y volver a asignar la función, aunque aparezca la correcta, para que le asigne los permisos de ejecución.
NOTA-2: Si vas a usar Lambdas o API-Gateway para datos “binarios” (todo lo que no sea texto, de momento no está soportado), verás tus datos corromperse.

Referencias:
API-Gateway Developer Guide
API-Gateway Developer Guide: Mapping Template Reference
Lambda Developer Guide

PPP: Connection broken

Hoy voy a contar una historia de terror informático, de esas que recuerdan el día en que a Enjuto Mojamuto se le fue Internet.

El Jueves 10, víspera de festivo en Barcelona, llegué a casa del trabajo… Internet no funcionaba (conexion de Fibra/FTTH -Movistar-). Por suerte con el Tethering de Android tenía un acceso alternativo desde el portatil mientras solventaba el problema (aunque andar cambiando de la LAN al 3G era bastante tedioso).

Como buen “friki” miré mi Uptime Robot; la conexión se había caido a las 12:20PM (media mañana). Ese día hubo tormenta, asi que temía que se me hubiera quemado el router, hubiera caido un arbol y roto las lineas, una excabadora, o vete a saber…
Leer más de esta entrada

OpenSSH: Speed UP SSH Connections

Para acelerar las conexiones recurrentes en OpenSSH:

En el cliente:

# /etc/ssh/ssh_config
Host *
    ControlMaster auto
    ControlPath /dev/shm/.ssh-mux_%u_%r@%h:%p
    ControlPersist 600
    # You can set this to "no" if you trust your LAN/DNS
    CheckHostIP no

En el server:

# /etc/ssh/sshd_config
UseDNS no

Rerefencias:
ssh_config
sshd_config

Networking: Local Network Addresses

Estos son los rangos que se pueden usar en una red local (IPv4):

  • 10.0.0.0/8 (255.0.0.0) [ 10.0.0.0 – 10.255.255.255 ]
  • 172.16.0.0/12 (255.240.0.0) [ 172.16.0.0 – 172.31.255.255 ]
  • 192.168.0.0/16 (255.255.0.0) [ 192.168.0.0 – 192.168.255.255 ]

Referencia: Wikipedia

Java: Skeleton for Workers / Batch processing

Un pequeño esqueleto que persigue:

  1. Que no se coma la CPU.
  2. Que no se coma el espacio el disco soltando trazas de fallo.
  3. Que ante una excepcion “extraña” no se muera el worker.
@Override
public void run() {
	int c = 0;
	while (!isShutdown()) {
		if ((++c % 10000) == 0) { // Anti cpu eater
			intrSleep(1);
		}
		try {
			// ... do things
		} catch (ControlledException e) {
			// ... do things
			log.error("ControlledException: " + e.toString(), e);
			intrSleep(100); // Anti disk space eater
		} catch (Exception e) {
			// ... last resort
			log.error("Unknown Exception: " + e.toString(), e);
			intrSleep(100); // Anti disk space eater
		}
	}
}
private static void intrSleep(final long millis) {
	try {
		Thread.sleep(millis);
	} catch (InterruptedException e) {
		Thread.currentThread().interrupt();
	}
}
A %d blogueros les gusta esto: