Activar SSH y WIFI en una Raspberry PI con Raspbian, en el primer arranque y sin teclado ni monitor

1   Antecedentes

Por defecto, cuando instalamos una distribución Raspbian en una Raspberry PI no tendrá el servicio SSH activo ni tampoco acceso a través de WIFI, solo Ethernet.

Si dicha Raspberry PI no tiene una conexión Ethernet y no la tenemos conectada a una pantalla y un teclado, no habrá forma de conectar.

Veamos cómo solucionarlo, considerando que las dos particiones de la tarjerta microSD se han montado en /media/jcea/boot/ y /media/jcea/rootfs/.

2   Activar servicio SSH

Una vez que hemos grabado la tarjeta de memoria microSD, montamos lo que será la partición de arranque boot y creamos dentro un fichero vacío llamado ssh.

Por ejemplo:

# touch /media/jcea/boot/ssh

Cuando Raspbian arranca por primera vez comprueba si existe ese fichero /boot/ssh. Si es así, activa el servicio SSH para que podemos acceder a la Raspberry PI de forma remota. El fichero se borrará automáticamente tras ese primer arranque.

2.1   Desactivar el usuario por defecto

Si encendemos la Raspberry PI ahora y está conectada a internet, va a empezar a recibir inmediatamente intentos de conexión automáticos provenientes de infinidad de direcciones. Se trata de la radiación de fondo de internet.

Si conectamos una máquina con vulnerabilidades conocidas a internet, será encontrada y explotada automáticamente en muy poco tiempo.

Dado que el usuario por defecto de las instalaciones Raspbian es pi con la clave raspberry, activar el servicio SSH en una Raspberry PI conectada a internet es un suicidio rápido.

Lo que debemos hacer, pues, es cambiar la clave de acceso del usuario: pi. Para ello podemos editar a mano el fichero etc/shadow en la partición root de la tarjeta microSD.

Lo que yo hago es buscar el hash del usuario pi y sustituirlo por un asterisco. Esto tiene el efecto de desactivar completamente el acceso a través de ese usuario.

2.2   Poner un certificado SSH al usuario root y activarle SSH

Si desactivamos el usuario pi, tendremos que entrar con otro usuario. Yo uso el usuario administrador o root.

En vez de ponerle una clave de acceso normal y corriente, yo recomiendo utilizar un certificado SSH. Para ello debemos copiar nuestra clave pública SSH en el fichero root/.ssh/. Por ejemplo:

# mkdir /media/jcea/rootfs/root/.ssh
# cp /home/jcea/.ssh/id_rsa.pub /media/jcea/rootfs/root/.ssh/authorized_keys

Advertencia

En general es mala idea utilizar root como un usuario de trabajo, pero esta instalación mínima es el primer paso para una configuración profunda automatizada posterior a través de tecnologías como Ansible.

3   Preconfiguración WIFI

Si no podemos conectar la Raspberry PI por Ethernet, podemos configurar el sistema WIFI [1] en el primer arranque, tal y como hemos hecho con el SSH.

[1] La Raspberry PI 3B incluye capacidad WIFI de serie. Si tenemos un modelo anterior podemos usar WIFI conectando un adaptador WIFI a través de un puerto USB de la Raspberry PI.

Para ello creamos un fichero wpa_supplicant.conf en la partición boot de la tarjeta microSD, con un formato similar a [2]:

country=ES
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
    ssid="My_ssid"
    scan_ssid=1
    psk="My_pass"
    key_mgmt=WPA-PSK
    }

En este fichero debemos indicar el código de país correcto en el parámetro country, reemplazar My_ssid por la identificación de nuestra red WIFI y My_pass por la clave de acceso.

Como en el caso del ssh, si ese fichero existe en el primer arranque, Raspbian configurará la WIFI y borrará el fichero de /boot/wpa_supplicant.conf.

[2]

El formato del fichero wpa_supplicant.conf ha cambiado entre Raspbian Wheezy/Jessie y la actual Raspbian Stretch.

El formato que se documenta es el actual.

4   Configuración de dirección IP estática

Nota

Yo prefiero no utilizar direcciones IP estáticas en mi red por cuestiones tales como cambios de router, renumeración de la red, cambios de DNS, que estoy en redes fuera de mi control, etc. Más adelante explicaré una técnica útil a la hora de localizar la Raspberry PI cuando tiene una dirección IP dinámica asignada por DHCP.

Si conectamos la Raspberry PI tal cual a nuestra red, nuestro router le asignará una dirección IP dinámica, desconocida. Para prescindir de la asignación DHCP que hace nuestro router, tendremos que editar el fichero etc/dhcpcd.conf en la partición root de la tarjeta microSD. Al final del fichero debemos añadir algo tipo:

interface eth0
static ip_address=192.168.1.40/24
static ip6_address=fd51:42f8:yyyy:xxxx::ff/64
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 8.8.8.8 fd51:42f8:caae:d92e::1

interface wlan0
static ip_address=192.168.1.20/24
#static ip6_address=fd51:42f8:xxxx:yyyy::ff/64
static routers=192.168.1.1
static domain_name_servers=192.168.1.1 8.8.8.8

Aquí estaremos dando direcciones IP estáticas tanto para WIFI como para Ethernet, y tanto en IPv4 como en IPv6. Naturalmente, los detalles dependen de cada red local y debemos conocer qué debemos meter ahí.

5   Primer arranque

Ahora debemos desmontar las particiones boot y root de la tarjeta microSD, desenchufar la tarjeta de nuestro ordenador y enchufarla en la Raspberry PI.

Esperamos unos segundos hasta que se apague la luz amarilla de actividad en la tarjeta microSD. En ese momento la Raspberry PI debería estar conectada por WIFI y accesible a través de SSH.

Además, en este primer arranque, Raspbian configurará también automáticamente la partición root de la tarjeta microSD para que la utilice por completo. Es decir, aprovechará toda la capacidad de la tarjeta.

6   BONUS: Localizar la Raspberry PI cuando utiliza una dirección IP dinámica

Como he dicho antes, yo prefiero no utilizar direcciones IP estáticas, a menos que haya un buen motivo para ello. Nos queda el problema entonces de localizar la Raspberry PI en nuestra red local.

Mi enfoque habitual es configurar el sistema operativo para emitir balizas en la red, utilizar técnicas de DNS dinámico y VPNs. Para realizar esa configuración, no obstante, se requiere localizar la Raspberry PI en su primer arranque, cuando todavía no tiene instaladas y configuradas todas esas virguerías.

La técnica que yo empleo es simple, basada en lo que describo en Cómo obtener la dirección IP de una máquina si conoces su dirección ethernet:

  1. Sacamos un listado de la tabla ARP de nuestra red:

    $ for i in {1..254}; do ping -c 1 192.168.0.$i & done
    $ arp -n | grep -v incom | sort >/tmp/z
    
  2. Encendemos la Raspberry PI y le damos unos segundos para que se conecte a la red. Lo más sencillo es esperar a que se apague la luz amarilla de actividad de la tarjeta microSD.

  3. Volvemos a barrer toda la red y vemos qué máquina nueva ha aparecido:

    $ for i in {1..254}; do ping -c 1 192.168.0.$i & done
    $ diff -u0 <(cat /tmp/z) <(arp -n | grep -v incom | sort)
    --- /dev/fd/63  2017-12-10 03:01:35.359106799 +0100
    +++ /dev/fd/62  2017-12-10 03:01:35.359106799 +0100
    @@ -6,0 +7 @@
    +192.168.0.23             ether   b8:27:XX:XX:XX:XX   C                     wlo2
    

Vemos que ha aparecido una nueva máquina. Es nuestra Raspberry PI, con la dirección IP 192.168.0.23.