oriolrius.cat

Des del 2000 compartiendo sobre…

Category: Technology

Get the IP addresses of local Docker containers

Reading time: < 1 minute

We have docker running and the containers have their own private network, thanks to this command we’re going to get the private IP address of all of them:

$ sudo docker inspect $(docker ps -q ) \
--format='{{ printf "%-50s" .Name}} {{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}'
/zerotier
/ntp                                               10.3.10.8
/nodered                                           10.3.10.11
/n8n                                               10.3.10.4
/ssh                                               10.3.10.9
/code                                              10.3.10.7
/semaphore                                         10.3.10.6
/rproxy                                            10.3.10.2
/homer                                             10.3.10.10
/pihole                                            10.3.10.27
/pihole_googledns                                  10.3.10.24
/pihole_opendns                                    10.3.10.23

OpenSSH public key fingerprint

Reading time: < 1 minute

Quick and easy, how to get the fingerprint of your SSH RSA key.

# syntax:
openssl pkey -in PATH/PRIVATE_RSA_KEY -pubout -outform DER | openssl md5 -c

# example:
$ openssl pkey -in ~/.ssh/id_rsa -pubout -outform DER | openssl md5 -c
MD5(stdin)= a6:26:23:d9:c1:d3:d5:e5:c0:38:ab:3c:c1:6a:3f:ea

Mikrotik passwordless SSH with public key

Reading time: 2 – 4 minutes

Following the instructions described in the official documentation:

https://wiki.mikrotik.com/wiki/Use_SSH_to_execute_commands_(public/private_key_login)

The process is as always as easy as:

# upload the id_rsa.pub file
# then import the public key file for the user used for connecting via SSH
user ssh-keys import public-key-file=id_rsa.pub user=admin-ssh
# and it's done.

Everything was OK with my WSL Ubuntu 20.04. (I added WSL at the beginning of the versions because it runs in Windows Subsystem Linux).

But, with the newest WSL Ubuntu 22.04 I was unsuccessful.

Being precise, the SSH versions are:

# WSL Ubuntu 20.04
$ ssh -V
OpenSSH_8.2p1 Ubuntu-4ubuntu0.5, OpenSSL 1.1.1f  31 Mar 2020

# WSL Ubuntu 22.04
$ ssh -V
OpenSSH_8.9p1 Ubuntu-3, OpenSSL 3.0.2 15 Mar 2022

After connecting with verbose details, I found this message, that was the key for solving the problem:

debug1: Offering public key: /home/my_user/.ssh/id_rsa RSA SHA256:2******************************Y agent
debug1: send_pubkey_test: no mutual signature algorithm

Then, I discovered that newest SSH versions aren’t compatible with Mikrotik SSH version. It seems that version isn’t enough newest and are incompatible with how public keys are negotiated at the beginning of the connection.

Finally, the solution was to use an extra parameter for establishing the connection:

ssh -o 'PubkeyAcceptedAlgorithms +ssh-rsa' THE_USER@THE_HOST

Of course, an alternative is using ~/.ssh/config file or the system file: /etc/ssh/ssh_config and add this parameter for everything, or specific hosts. For instance, like this:

Host JUST_A_NAME_OF_THE_CONNECTION
  Hostname THE_IP_ADDRESS_OR_HOSTNAME_OF_THE_TARGET_HOST
  user THE_USER
  PubkeyAcceptedAlgorithms +ssh-rsa

Get the IP address of the WSL2 in Windows 10

Reading time: < 1 minute

Nothing else than what the title says. Simple PowerShell script for dumping the IP address:

wsl -- ip -o -4 -json addr list eth0 `
| ConvertFrom-Json `
| %{ $_.addr_info.local } `
| ?{ $_ }

socat: publish a port only available in localhost

Reading time: 1 – 2 minutes

Assume that we have a service only available in localhost (127.0.0.1/8) and we want to expose this port temporarily. Of course, you can use iptables for redirecting the port. But take care, this is not a simple DNAT because packets will not be evaluated by PREROUTING (-t nat) rules.

Another option is using an old-powerful Swiss knife tool: socat (github).

# binds public port to any local interface
socat TCP-LISTEN:<public_port>,fork TCP:127.0.0.1:<internal_port>
# binds only to an IP address
SOCAT_SOCKADDR=<interface_IP> socat TCP-LISTEN:<public_port>,fork TCP:127.0.0.1:<internal_port>

# examples:

# binds to all interfaces:
socat TCP-LISTEN:1880,fork TCP:127.0.0.1:1880
# just for an IP address of one interface:
SOCAT_SOCKADDR=10.2.0.110 socat TCP-LISTEN:1880,fork TCP:127.0.0.1:1880

WSL2: upgrade from Ubuntu 18.04 to 20.04

Reading time: 2 – 4 minutes

I was afraid for missing my files, configurations and much other staff that I had in Linux filesystem of WSL2 (Windows 10). But I had to upgrade because of compatibility with an application that I need. So, finally, I decided to upgrade the Ubuntu 18.04 that I installed in WSL2 to a newer version 20.04. Yes, I know that there is 22.04 available nowadays, but I wasn’t comfortable jumping to many versions.

I followed simple steps that I found at:

How To Upgrade Existing WSL/WSL2 Ubuntu 18.04 to 20.04

The steps in a nutshell were:

sudo apt update
sudo apt upgrade -y
sudo apt --purge autoremove
sudo apt install update-manager-core
sudo do-release-upgrade

When I answered all the questions and after stopping the WSL2 VM with:

# command that I ran from 'cmd.exe' (Windows console)
wsl --shutdown 

I had and issue rebooting, WSL2 didn’t boot and it gave this message:

wsl/usr/sbin/enter-systemd-namespace: line 10: /usr/sbin/daemonize: No such file or directory

I resolved the problem, shutting down the WSL and running the command:

wsl -u root -e bash --noprofile --norc

It gave me a root console where I could modify the file:

/usr/sbin/enter-systemd-namespace

specifically, in line 10, I changed:

/usr/sbin/daemonize
to
/usr/bin/daemonize

And when I accessed to WSL2 everything worked perfectly. I used to access WSL2 from Windows Terminal which uses the command:

C:\WINDOWS\system32\wsl.exe -d Ubuntu-18.04

But it has small issues with bybou, finally I changed this command to:

C:\WINDOWS\system32\bash.exe ~ -login

I love to use a console with byobu enabled when access the shell, but with my former command, the command ‘byobu-enable’ was ignored. I didn’t find why, in the end the solution was to change the command that I use for accessing Linux console (WSL2).

Likewise, I hope these notes can help someone.

Resize Squashfs/Ext4 partition of OpenWRT in a Raspberry PI

Reading time: < 1 minute

Quick cookbook for just doing what the subject of the post says:

opkg update
opkg install cfdisk
cfdisk
# change partition size using the UI
opkg install losetup resize2fs
BOOT="$(sed -n -e "/\s\/boot\s.*$/{s///p;q}" /etc/mtab)"
DISK="${BOOT%%[0-9]*}"
PART="$((${BOOT##*[^0-9]}+1))"
ROOT="${DISK}0p${PART}"
LOOP="$(losetup -f)"
losetup ${LOOP} ${ROOT}
fsck.ext4 -y ${LOOP}
resize2fs ${LOOP}
reboot

TEDxAlcoi 2022, una experiencia de crecimiento

Reading time: 9 – 14 minutes

Los que ya hace tiempo que me conocéis sabéis que estoy en las fechas de las efemérides. Entre abril y mayo acumulo muchas emociones que me mueven de arriba abajo. Cada mes de abril empiezo por la fecha en que perdí a mi padre. Seguidamente, el nacimiento de Pol y su posterior despedida después de 3 días, coincidiendo con el aniversario de boda. Después viene mi renacimiento, del que este año se han celebrado los 19 años. Y tal día como hoy es mi cumpleaños. Hoy cumplo 45 años.

Pero este año añado a la lista de efemérides, una que no sé si voy a contar anualmente, pero que seguro que ha servido para hacer un gran paso de gigante en mi crecimiento personal. Los tres días superintensos que he pasado con mis compañeros de la TEDxAlcoi. Todo un reto de crecimiento que tendréis la oportunidad de valorar el resultado cuando se publique el video. De momento me limitaré a contar por qué fue una experiencia tan enriquecedora.

Pasé casi todo el miércoles repitiendo y escenificando el texto de mi charla. Llegó el momento de los ensayos del jueves por la tarde en el escenario real. El ambiente estaba cargado de muchos nervios y mucha presión. El nivel de estos era inusualmente alto. Tengo que remontarme a cuando tenía 20 años y tenía presentaciones en aforos de altos ejecutivos para recordar tantos nervios.

Cada vez que intentaba fluir encima del escenario me notaba más bloqueado y menos inspirado. Dicho de otra forma, fui incapaz de decir el texto sin equivocarme y bloquearme varias veces. Fue un golpe muy duro ver que no era capaz de escenificar eso que había repetido más de un centenar de veces.

Unos momentos muy duros para mí, tuve que aislarme de los ensayos un buen rato para poder empezar mis ejercicios de meditación y que estos me permitieran volver a conectar conmigo y recuperar mi confianza. Me sentía como un farsante encima del escenario. Después de saberme el texto a la perfección y escenificarlo de forma magistral delante de mi mujer, pensaba que ya lo tenía controlado.

Pero la realidad era muy distinta, ese gran teatro Calderón de Alcoi lleno de voluntarios y profesionales trabajando a contra-reloj para tenerlo todo listo me imponía tanto que me sentía como un principiante. Por suerte, David, el gran maestro de ceremonias, me dio la oportunidad de repetir mis ensayos a última hora. Esa oportunidad fue clave para empezar a fluir y a sentir que podía hacerlo. El nivel estaba muy lejos de donde yo sabía que puedo llegar, pero al menos era algo presentable delante de la audiencia.

Llegó el viernes después de una noche dura, había dormido como un bebé hasta las 4 de la mañana, pero desde que algo me había despertado ya no pude pegar ojo. Suerte que pude dedicar ese tiempo a meditar y visualizar en mi interior como iría el evento. Decidí no desayunar para poder seguir fluyendo en mi preparación del gran momento. Además, tuve la suerte de poder hablar con Estefanía y los niños. Las 9 de la mañana aparecieron en el reloj de forma implacable y el evento empezó puntual en una sala llena de jóvenes de diferentes institutos y de la universidad de Alcoi.

Yo era el tercero en subir al escenario, honestamente había tenido mucha suerte. Solo tenía que esperar una hora antes de poder compartir mi idea inspiradora con la audiencia. Decidí olvidarme de ese tema hasta que tocara levantarme de la silla; lo mejor que podía hacer era abrirme al evento y disfrutar todo lo que estaba pasando a mi alrededor. La inspiradora puesta en escena de Hugo y las sabias palabras de Aitziber; dejaron que mi reloj volara. Cuando me di cuenta David me estaba presentando y yo me dirigía al punto rojo. Ese momento que llevaba soñando durante los últimos 4 años de mi vida.

Empecé nervioso y tenso, pero convencido de que no me iba a equivocar ni tampoco me quedaría en blanco. Y así fue. No hice la mejor interpretación de mi vida, pero me había quedado muy bien. Durante un buen rato estaba convencido de que había dicho el texto perfectamente, hasta que me hicieron notar que había cambiado una palabra al inicio del texto. Un cambio sutil, pero cargado de semántica: no son muchas competencias laborales, sino muchas competencias digitales lo que necesitan los jóvenes. Es alucinante como la mente puede confundir dos palabras sin darse ni cuenta.

Lo bueno de estas cosas es que el público ni se da cuenta. Ya que la idea queda igualmente bien explicada. Que al final es de lo que se trata. Al igual que hay que destacar este pequeño desliz quiero mencionar que tuve al menos un momento magistral. Porque una parte del texto habla de OnlyFans, una red social que los jóvenes asocian con temas eróticos y sexuales. Así pues, al mencionar esta red los chicos empezaron a gritar y a decir tonterías. Pues bien, fui capaz de reconducir la atención y seguir de una forma que hasta a mí me sorprendió positivamente.

Las palabras se quedan cortas para describir las sensaciones que uno siente después de haber acumulado tanta tensión, tantos nervios y tantas ganas de hacerlo bien. El momento había pasado y lo había hecho bien, yo diría más, lo había hecho muy bien. Todo se puede mejorar, pero podía estar orgulloso del resultado obtenido y eso me llenaba por dentro. Además, el “show” seguía vivo y mis compañeros seguían evolucionando con sus charlas, cosa que me permitía revivir una y otra vez esas grandes sensaciones. Unas sensaciones que ponente tras ponente acababan con el público en pie aplaudiendo y gritando.

Sábado tarde, el gran momento de TEDxAlcoi. Llegaba al evento en unas condiciones muy diferentes al día anterior. Había podido dormir mejor, descansar y hasta estirar las piernas. Los lazos con mis compañeros nos había convertido en amigos. La tensión no tenía nada que ver con la del día anterior. Lejos de estar relajados, pero con un nivel de seguridad en uno mismo muy superior al día anterior. Creo que ese relax, en general, nos hizo cometer algunos errores más que en el día anterior.

En mi caso, creo que lo hice muy y muy bien encima del punto rojo. Interpreté el texto de una forma excelente. Siempre con puntos de mejora, pero con un resultado mejor que en los días anteriores. Era muy curioso la sensación de ver el texto en mi cabeza, la memoria visual me mostraba las páginas del texto y cada una de las líneas que yo iba convirtiendo en una historia encima del escenario. Pero nada es perfecto y muy pocas líneas antes de llegar al final visualicé dos líneas que era incapaz de leer. No había manera de ver qué ponía en ellas y tenía que cerrar la charla. Así pues, me tocó saltarme un par de líneas. Toda una lástima por qué ambas eran una provocación para el público, la suerte es que no añadían contenido a la idea más allá de buscar tocar la fibra.

Con este sabor agridulce acabé mi puesta en escena. El público se levantó y aplaudió con fuerza. La adrenalina se convirtió en oxitocina; dicho de otra forma como esa tensión por hacerlo bien se convertía en la recompensa del trabajo bien hecho. Y así finalizaba esta experiencia que me había ocupado durante tanto tiempo. En mi lista de tareas, proyectos, iniciativas, objetivos y sueños desaparecía una palabra que me había acompañado como un ítem fijo. El símbolo de check se dibujaba y liberaba el espacio para dejar sitio a un nuevo sueño que cumplir.

Lo había hecho, se había cumplido, lo había conseguido. Estaba contento y me costaba creer que todo había acabado. Pero mi naturaleza perfeccionista me recordaba esa espinita clavada por no haber conseguido hacerlo tan bien como sé que puedo hacerlo. Por suerte, ya son 45 años compartiendo el día a día con mi voz interior. Y ahora he aprendido a perdonarme, a aceptarme y a disfrutar de los buenos momentos haciendo callar a esa voz.

Ese ha sido mi viaje durante estos últimos días. Me he esforzado, he trabajado, he llorado, he sufrido, he reído, he crecido y sobre todo he sido un poco más humano al lado de unas personas increíbles. Muchas gracias a la organización, voluntarios, a los otros oradores y al público. Sin vosotros no hubiera sido posible. Pero sobre todo gracias a mi mujer por tener esa paciencia infinita aguantándome y a mis hijos por inspirarme.

Resumiendo, la TEDx me ha permitido poner por encima de mí una gran idea que vale la pena compartir. Los oradores, organizadores y voluntarios estamos al servicio de una causa mayor que nosotros mismos. Se trata de hacer atractivas ideas potentes para tocar el público. Al final todos trabajamos para ser el cambio que queremos ver en el mundo. Y con ello nos llevamos nuestro propio crecimiento, nuestra propia maduración.

Network traffic sniffing: tcpdump on Linux + Wireshark on Windows

Reading time: 2 – 2 minutes

From the Windows box using the CLI console (cmd):

ssh USER@HOST "tcpdump -s 0 -U -n -w - -i NETIF FILTER" | "c:\Program Files\Wireshark\Wireshark.exe" -k -i -

# USER - remote user of the linux box
# HOST - host address of the remote linux box
# NETIF - network interface to snif in the remote linux box
# FILTER - (optional) rules for filtering traffic to capture

Use case:

C:\Windows\System32\OpenSSH>ssh root@192.168.4.74 "tcpdump -s 0 -U -n -w - -i eno2 udp and not port 53" | "c:\Program Files\Wireshark\Wireshark.exe" -k -i -

Let me present a rare use case of this useful trick. I use a QNAP NAS as a gateway in my home network, where I have 5 NICs. So it’s really useful to snif traffic remotly but I have no tcpdump packet in the system. What I did is use tcpdump as Docker container and finally the commands is like that.

# sniffing SIP traffic (port 5060) on interface eth0
# remote linux host (QNAP NAS) use SSH port 55222
# docker container is created and when work is done is removed
C:\Windows\System32\OpenSSH>ssh -p 55222 admin@10.2.0.1 "cd /share/Container/tcpdump && docker run --rm --net=host corfr/tcpdump -s 0 -U -n -w - -i eth0 not port 22 and port 5060" | "c:\Program Files\Wireshark\Wireshark.exe" -k -i -

Windows 10: Internal Virtual Switch with NAT

Reading time: 2 – 4 minutes

When you are playing with Windows Hyper-V and you want to create a completely virtual internal network with private virtual machines inside your Windows 10 machine virtual switch are mandatory.

Then it’s the time to connect that virtual switch with the host machine using a virtual network interface. All those steps can be done using Hyper-V manager user interface, but you cannot control 100% of parameters like enable, or not, the NAT of the virtual internal network.

Using PowerShell the steps are:

New-VMSwitch -SwitchName NATSwitch -SwitchType Internal
New-NetIPAddress -IPAddress 10.46.1.1 -PrefixLength 24 -InterfaceAlias "vEthernet (NATSwitch)"
New-NetNAT -Name NATNetwork -InternalIPInterfaceAddressPrefix 10.46.1.0/24

Of course, change “NATSwitch” for your switch name and “10.46.1.1” for the IP address of the host virtual network card. Finally “NATNetwork” is another arbitrary name for referring to the NAT rule, and “10.46.1.0/24” is the network address of the virtual internal host network.

Running the commands looks like:

For removing what you did:

Remove-VMSwitch -Name "NATSwitch"
Remove-NetIPAddress -InterfaceAlias "vEthernet (NATSwitch)"
Remove-NetNAT -Name NATNetwork

In Windows 10 IP forwarding is not enabled and packets between interfaces are not routed. According to the Microsoft forums, you can enable IP forwarding (routing) using the following steps:

Go to Start and search on cmd or command. Right click on either cmd or command then select Run as administrator. At the command prompt type regedit. Navigate to the HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\Tcpip\Parameters\IPEnableRouter setting, right click and select Modify. Change 0 to 1 and exit the editor.

When your back at the command prompt type services.msc and navigate to the Routing and Remote Access service. Right click and select Properties. Change to Automatic and click on Start to start the service.

I had to research a long time until I found all this information, but in my case leverage my proofs of concepts to another level.