--------------------------------------------------------------------- -- Instalar Gentoo de manera segura con / y swap cifrados con LUKS -- --------------------------------------------------------------------- - Gentoo - Que es Gentoo? - Es un sistema operativo basado en el kernel de Linux que utiliza el sistema de paquetes Portage - Al contrario que las distros basadas en binarios, los respositorios son de código y son compilados localmente por el usuario - Nombrado por el pingüino Gentoo que es el mas rápido nadando bajo el agua - Ventajas y desventajas vs otras distros - Ventajas - Documentación - La wiki y el handbook son de las mejores documentaciones al respecto del funcionamiento, configuración y uso de Linux, de hecho, muchas veces cuando se busca como hacer cosas en Debian o Redhat, se linkea a la documentación de Gentoo - Aprendizaje - Tanto en la instalación como en la administración se aprende muchísimo sobre el verdadero funcionamiento de GNU/Linux - Cuando falla algo (porque siempre falla algo), tienes que aprender como funciona para solucionarlo - Esto hace que se te ocurran ideas de como mejorar procesos o crear programas - No es tan difícil como lo venden - Comunidad - Dadas las características del S.O, la comunidad de Gentoo suele tener un conocimiento relativamente mas alto sobre los aspectos de bajo nivel de Linux respecto a otras distros - Tiene una de las comunidades mas útiles, entorno a 1000 usuarios en el IRC, foros, listas de correo - Activamente desarrollado (paquetes nuevos, versiones nuevas de paquetes, parches a paquetes, actualización documentación...) - Eficiencia - Se crean binarios optimizados a las características de la maquina, en vez de tener un binario para todas las maquinas - El sistema de los USE flags permite al usuario seleccionar que partes del código compilar. El resultado son binarios mas peque;os que cargan mas rápido y usan menos memoria. - Seguridad - Dado que se instala solo se la parte del código que se va a utilizar, esto reduce el tamaño del código, su complejidad y dependencias, lo que resulta en mayor seguridad - Existe el proyecto Hardened Gentoo que se centra en incrementar la seguridad de Gentoo Linux en varios modos - Al compilarlo tu, te aseguras que el binario que creas *solo* es del código fuente del programa, sin añadidos (sourceforge) - Desventajas - Tiempo - La compilación requiere su tiempo físico, hay paquetes que no tardan nada, pero hay otros como glibc, webkit-gtk o libreoffice que tardan *mucho* - La compilación requiere su tiempo de procesador, lo que puede ser un problema para dispositivos como la raspberry pi, no obstante se puede hacer un crosscompiling, compilando en un ordenador mas potente pero optimizándolo para el hw de la rpi - La instalación requiere su tiempo, en instalar mi primer Gentoo tarde una semana, a medida que pasa el tiempo se tarda menos, pero aun así se tarda - Esto implica que no es una distribución para un apuro - src - wiki.gentoo.org/wiki/Benefits_of_Gentoo - danielmiessler.com/blog/gentoo-vs-debian - Fuentes de información - *Wiki Gentoo*: wiki.gentoo.org - *Handbook Gentoo*: wiki.gentoo.org/wiki/Handbook:Main_Page - *IRC*: #gentoo en freenode (iamben es un crack sin vida) - Foro: forums.gentoo.org - Wiki Arch: wiki.archlinux.org - Listas de correo: gentoo.org/get-involved/mailing-lists/all-lists.html - Portage - emerge ( screenshot emerge -pv package) - USE flags ( screenshot equery u package) - Archivos - make.conf - package.use - package.keywords - package.mask - Portage tree firmado por gpg - Herramientas auxiliares - eix - equery - layman pentoo - LUKS - Que es LUKS? - Linux Unified Key Setup: Es el estándar de cifrado de discos duros de Linux. - Cryptsetup es la herramienta que aplica el estándar utilizando el modulo del kernel DM-crypt - Añade una capa de propiedades encima del modulo básico de dm-crypt, por ejemplo: - Compatibilidad via estandarización - Seguro contra ataques de baja entropía (Salt) - Soporta multiples claves - Efectiva revocación de claves - Soporta varios algoritmos de cifrado en cascada - Backup LUKS headers Guarda toda la información necesaria para la configuración en el encabezado de la partición cryptsetup luksHeaderBackup --header-backup-file cryptsetup luksHeaderRestor --header-backup-file - Libre - src - gitlab.com/cryptsetup/cryptsetup - gitlab.com/cryptsetup/cryptsetup/wikis/FrequentlyAskedQuestions - wiki.gentoo.org/wiki/DM-Crypt_LUKS - wiki.gentoo.org/wiki/Dm-crypt - wiki.archlinux.org/index.php/Disc_encryption - LVM - Que es LVM? - Logical Volume Manager - Permite crear meta dispositivos que aportan una capa de abstracción entre el sistema de archivos y el almacenamiento físico. - La estructura es la siguiente: - Los Discos duros, particiónes, sistemas RAID u otros medios de almacenamiento son inicializados como volúmenes físicos (PVs) - Los volúmenes físicos (PV) se agrupan en grupos de volúmenes (VG). - Los volúmenes lógicos (LV) se almacenan en los grupos de volúmenes, estos son los meta dispositivos en los que se instalara el sistema operativo. - Propiedades: - Snapshots y mirroring: (fácil backup): - Volúmenes delgados (thin volumes): NPI pero parece interesante - Permite tener una partición entre varios dispositivos físicos - Soporta RAID - src - wiki.gentoo.org/wiki/LVM - Instalación - Cargar la live y seguir los pasos del handbook hasta llegar a la estructura de particiónes - Cifrar el sistema completo - Esquema de particiónes - Generalmente se crean tres particiónes una para boot otra para swap y luego para root. Aquí sin embargo se van a crear dos particiónes - Una para boot que no ira cifrada - Otra cifrada con LUKS para contener el LVM, LVM se configurara para contener dos particiónes lógicas, una para swap y otra para root - Creación de particiónes con fdisk y formateo con sus respectivos mkfs (apoyarse en el apartado del handbook de Gentoo si no se sabe como hacer esto) /dev/sda1 bootable, ext2, 30MB /dev/sda2 ext4 .*MB - Decision de modo de cifrado - 1.Los contenidos de /boot en el mismo disco duro y utilizando el header de LUKS para almacenar la información de descifrado. En este caso se obtiene el siguiente esquema: Contraseña usuario -- cifra --> archivo LUKS de random data -- cifra --> partición disco duro - 2.Los contenidos de /boot y un archivo gpg protegido por la contraseña en un pendrive. Siguiente esquema Contraseña usuario -- cifra --> archivo gpg de random data openssl -- cifra --> archivo LUKS de random data -- cifra --> partición disco duro - En ambas aproximaciones, LUKS toma la contraseña de cifrado dada por el usuario para cifrar un string de datos random que es la contraseña que se usa para cifrar el disco duro - Diferencias de aproximación - La seguridad del segundo reside únicamente en que la información de autenticación se divide físicamente en dos medios, el equipo físico y el USB que se supone que esta siempre con la persona - La segunda tiene el problema que si pierdes el USB estas jodido, y si haces un backup tienes el mismo problema que en la primera opción, el hecho de que la información de autenticación esta físicamente en un medio que no te acompaña allá donde vayas - La seguridad en cuanto a robustez criptográfica de las dos es la misma ya que el cifrado final del disco duro se realiza por el mismo medio. - Nota: Soporte de LUKS de multiples contraseñas para descifrar el disco y la revocación de claves - Esto lo hace cifrando para cada usuario el archivo LUKS y guardando la información en un key slot del header - Cifrado de /dev/sda2 - Cargar los módulos necesarios (si no los ha cargado ya la live, comprobar con lsmod) modprobe dm-crypt modprobe aes modprobe sha256 (cargar otros si lo pide el algoritmo de cifrado que queréis usar - Cifrar /dev/sda2 cryptsetup luksFormat --debug -i 15000 -c aes-xts-plain64:sha512 -s 512 /dev/sda2 --debug Estaba teniendo problemas de algoritmos de cifrado, y al ver que pasaba puse esta opción y se arreglo solo xD -i Numero de milisegundos utilizados por el programa para procesar la contraseña, este valor es el recomendado para portátiles antiguos con poca capacidad de procesado (aumenta la seguridad pero también hace que tarde mas en descifrar el disco, buscar el compromiso) -c Algoritmo de cifrado, tanto Gentoo wiki como Arch wiki sugieren este, en respectivas pag hay una comparativa de algoritmos -s Tamaño de la clave - Creación de LVM - Abrir el contenedor cryptsetup luksOpen /dev/sda2 main Este comando creara el dispositivo /dev/mapper/main - Creación volumen fisico pvcreate /dev/mapper/main - Creación de grupo de volúmenes vgcreate crypto /dev/mapper/main - Creación de volúmenes lógicos - Creación volumen swap lvcreate -L 2G -n swap crypto - Descubrir el espacio restante vgdisplay Buscar el valor de "PE total", también se puede sacar información de allocated y free - Creación de volumen root lvcreate -L XG -n root crypto Donde X es el valor restante de la partición obtenida del paso anterior - Formateo mkswap /dev/mapper/crypto-swap mkfs.ext4 /dev/mapper/crypto-root - Modificación de /etc/fstab - src - https://wiki.gentoo.org/wiki/DM-Crypt_LUKS - https://wiki.archlinux.org/index.php/Dm-crypt/Device_encryption - http://www.0xrage.com/?p=129 - Importar las claves gpg de Gentoo para verificar el tarball y el primer árbol de portage (ya que estamos todavía en la live) https://wiki.gentoo.org/wiki/Handbook:AMD64/Working/Features https://www.gentoo.org/downloads/signatures/ - el primer emerge-webrsync no se puede verificar porque en el entorno chrooteado no esta instalado todavía gpg, por ello mientras que se esta descargando navegar a /mnt/gentoo/var/tmp/portage/webrsync* y desde la live checkear la gpgsig.... Meeeeh pero si no estas preparado emerge-webrsync borra los archivos antes de que puedas verificar la firma... - Lo primero emerger gpg para hacer un rsync decente - editar make.conf para poner algunas useflags necesarias para todos los paquetes (os pongo las mías) USE="X bindist dbus mmx sse sse2 alsa jpeg png -gnome -dvd -cdr -ipv6 -systemd -gtk -gtk3" - emerge -pv app-crypt/gnupg - Seguir https://wiki.gentoo.org/wiki/Handbook:AMD64/Working/Features Pulling validated Gentoo ebuild tree snapshots para emerger arboles firmados - emerge-webrsync - Emergear paquetes imprescindibles - app-portage/gentoolkit - app-portage/eix - *app-editors/vim* xD - app-misc/vlock - app-misc/screen - net-misc/dhcpcd - net-analyzer/nmap - sys-boot/grub USEFLAG: sys-boot/grub device-mapper - sys-kernel/genkernel USEFLAG: sys-kernel/genkernel cryptsetup - app-text/wgetpaste Programa para pegar archivos en servicios pastebind y te devuelve la url, *muy útil* para preguntar cosas en el IRC pegando los logs - Configurar y compilar el kernel - *Recomendado* Manual - Seguir https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Kernel - Paquetes afectados que introducen flags de kernel: - Disable ipv6 from kernel: Networking support/Networking options/The IPv6 protocol - Enable cyphers: Cryptographic API - https://wiki.gentoo.org/wiki/Xorg - https://wiki.gentoo.org/wiki/Ethernet - https://wiki.gentoo.org/wiki/Wifi Cuidado que si no activas todas las opciones del kernel no conecta el wifi! Y no seas capullo como yo y carga los drivers del kernel como módulos y emergea el linux-firmware si dmesg se queja de Set FW Cmd fail!! - https://wiki.gentoo.org/wiki/Dm-crypt - https://wiki.gentoo.org/wiki/LVM - https://wiki.gentoo.org/wiki/Kernel/Gentoo_Kernel_Configuration_Guide - https://wiki.gentoo.org/wiki/ALSA - https://wiki.gentoo.org/wiki/Power_management/Guide - https://wiki.gentoo.org/wiki/Openvpn - Compilar el kernel - Generar la initramfs Es un mini sistema cargado por el kernel que es capaz de descifrar el contenido de /dev/sda2 para poder cargarlo después genkernel --luks --lvm initramfs - Automático - Si por alguna razón vemos que algo falta y creemos que puede ser por la configuración que hemos elegido de kernel se puede generar un kernel masivo que tiene la mayor parte de las opciones típicas activadas. Pero si lo hacemos sin tener cuidado la partición LVM no funcionara (al menos a mi), por lo que hay que ejecutar genkernel --luks --lvm --menuconfig --install all Y en el menu de menuconfig hay que activar las opciones de kernel de LUKS y LVM, a mi las de LUKS me las cargaba como módulos, pero había algunas de LVM que no estaban activadas! - Instalar grub - Remergear grub con device-mapper - echo sys-boot/grub device-mapper >> /etc/portage/package.use/grub - Antes de generar la configuración de grub, editar la configuración del generador de grub.cfg /etc/default/grub añadiendo> GRUB_DISABLE_LINUX_UUID=true GRUB_CMDLINE_LINUX="crypt_root=/dev/sda2 root=/dev/mapper/crypto-root resume=/dev/mapper/crypto-swap rootfstype=ext4 udev dolvm" crypt_root: partición donde se encuentra el contenedor LUKS (no tiene porque ser /dev/sda2) root: partición real en la que se encuentra root resume: partición real donde se encuentra la swap rootfstype: filesystem de root dolvm: hacer que cargue lvm - src https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Bootloader www.funtoo.org/Rootfs_over_encrypted_lvm wiki.archlinux.org/index.php/Dm-crypt/System_configuration#Bootloader - Realizar check de signature del kernel - Primero realizar las firmas del contenido de boot. Para ello ejecutar el script mkkernelsig. Esto creara las firmas gpg ascii en /etc/kernel/signatures. Si se compila un nuevo kernel hay que volver a correr este programa - Agregar el programa kernel.check a /etc/init.d y añadirlo a openrc con rc-update add kernel.check boot - El único fallo que tiene el script es que en el arranque hace el check dos veces :?. Por lo demás va de lujo - (los dos scripts están al final del archivo) - Configurar el sistema - Seguir https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/System - Configurar internet - Arrancar desde boot rc-update add dhcpcd default ya no es necesario hacer ln -s de net.enp7s0 (aunque yo soy to chungo que si que lo hago, me gusta levantar yo la red que quiera (ethernet o wireless, por lo que no a;ado ni dhcpcd ni net.* a rc-update) - Configurar internet manualmente https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Networking - Ethernet - Wireless emerge wpa_supplicant iw USEFLAG: net-wireless/wpa_supplicant -hs2-0 https://wiki.gentoo.org/wiki/Wpa_supplicant - hacer scan ifconfig wlp8s0 up iw dev wlan0 scan - Configurar wpa_supplicant https://wiki.gentoo.org/wiki/Wifi https://wiki.gentoo.org/wiki/Handbook:AMD64/Networking/Wireless/en - Configure alsa - https://wiki.gentoo.org/wiki/ALSA - Una vez que hayamos a;adido alsa al make.conf hacer un emerge --ask --changed-use --deep -pv @world , en verde saldrán las recompilaciones por cambio de useflags y sus respectivas dependencias - Seguir installing system tools handbook https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Tools - system logger - sys-process/fcron - Instalar las X - Instalar el servidor X - https://wiki.gentoo.org/wiki/Xorg/Guide/en - Window manager: *i3* :D emerge x11-misc/i3lock x11-misc/i3status x11-wm/i3 - src http://i3wm.org/docs - Session manager x11-misc/slim - src https://wiki.gentoo.org/wiki/SLiM - Seguridad Red - tor emerge -pv net-misc/socat net-misc/tor net-proxy/torsocks USEFLAGS: net-misc/tor tor-hardening - openvpn emerge -pv net-misc/openvpn USEFLAGS:net-misc/openvpn passwordsave - dnscache emerge -pv net-dns/dnsmasq - analisis red emerge -pv net-analyzer/nmap net-analyzer/tcpdump - firewall emerge -pv net-firewall/iptables - Herramientas interesantes - Administracion - sys-process/htop # Administrador de procesos mejorado - x11-apps/xrandr # Interfaz de dispositivos con xorg - x11-terms/rxvt-unicode# Terminal USEFLAGS: x11-terms/rxvt-unicode 256-color perl xft - x11-misc/urxvt-perls # Scripts de perl para urxvt - x11-misc/xclip # Clipboard de las X - sys-apps/pmount # Herramienta para montar usb sin permisos de root - media-gfx/imagemagick # Conversor de archivos, imágenes, pdf, djvu... USEFLAGS: media-gfx/imagemagick djvu jpeg perl png xml - x11-apps/xmodmap # Utilidad para modificar el mapeado del teclado - x11-apps/setxkbmap# Utilidad para controlar el keyboard layout - Personal - app-admin/pass # Gestor de contraseñas - app-misc/task # Gestor de tareas - media-gfx/feh # Visor de imágenes - app-office/libreoffice-bin # Editor de textos - app-text/evince # Visor de pdf djvu - media-fonts/terminus-font # Fuente texto - media-video/mplayer # Visor de videos/música USEFLAGS: media-video/mplayer dvd dvdnap - net-irc/weechat # Cliente de IRC y con plugin bitlbee de XMPP - net-im/mcabber # Cliente de XMPP - www-client/uzbl # Browser Required USEFLAGS # required by virtual/libgudev-215-r3::gentoo[-systemd] # required by net-misc/modemmanager-1.4.10::gentoo # required by app-misc/geoclue-2.2.0::gentoo[modemmanager] # required by net-libs/webkit-gtk-2.4.9-r200::gentoo[geoloc] # required by www-client/uzbl-2012.05.14::gentoo[-gtk3] # required by uzbl (argument) >=sys-fs/udev-216 gudev # required by net-libs/webkit-gtk-2.4.9-r200::gentoo[webgl] # required by www-client/uzbl-2012.05.14::gentoo[-gtk3] # required by uzbl (argument) >=x11-libs/cairo-1.14.2 opengl - Cargar configuraciones personales (en mi caso, supongo que faltaran mas) - Normal user /home .bashrc .vim .vimrc .xinitrc .Xresources .i3 .config/uzbl .local/share/uzbl .mcabber .weechat - Root /etc slim.conf openvpn init.d/macchanger init.d/openvpn.pia /usr share/slim/themes/unix_shell share/sounds/bell.wav /home .bashrc .vim .vimrc .xinitrc .Xresources .i3 .config/uzbl .local/share/uzbl - Openrc scripts - init script de macchanger - Script para cambiar la mac de las interfaces de red - init script de openvpn - Trucos - Gentoo - Instalar por ethernet, mas complicado con wifi (wpa_supplicant) - Update world emerge -t --update --deep --with-bdeps=y --newuse world && eix-update && perl-cleaner all && python-updater && eclean distfiles && eclean packages - Instalación de paquetes - eix - emerge -pv - emerge -? error! -> pastebin + IRC - Si algún programa falla o se comporta raro: - Primero mira en la wiki el paquete para ver si te falta alguna USE flag o alguna configuración del kernel - Luego acude a #gentoo y pregunta - Si en algún momento tienes un ebuild que esta en 99999, es decir, que tira de git tienes que actualizarlo tu a mano, utilizando smart-live-rebuild --quickpkg --no-erraneous-merge --unprivileged-user - Si tienes algún echo en tu bashrc, scp fallara, para ello englóbalo en case $- in *i*) echo .. esac - Modificar el mapeo de una tecla - Con x11-apps/xev se coge el keycode de la tecla que queremos cambiar - Guardamos la configuración de xmodmap en un archivo en el home xmodmap -pke > ~/.xmodmap - Editamos la configuración - La cargamos cada vez que se inicien las X, en .xinitrc a;adimos if [ -s ~/.xmodmap ];then xmodmap ~/.xmodmap fi - src - wiki.archlinux.org/index.php/Xmodmap - Portátil - Mostrar la batería en el prompt - Añadir a .bashrc, y en la parte de export PS1 poner el resultado de $battery_prompt donde se quiera del prompt function batleft(){ bat_capacity_file="/sys/class/power_supply/BAT1/capacity" bat_status_file="/sys/class/power_supply/BAT1/status" if [[ -f $bat_capacity_file && -f $bat_status_file ]];then battery_left="$(cat $bat_capacity_file)" battery_status="$(cat $bat_status_file | sed -r 's/^(.).*/\1/')" if [[ $battery_left -ge 60 ]];then battery_prompt="\e[0;32m\]{$battery_status$battery_left}" elif [[ $battery_left -lt 60 && $battery_left -ge 20 ]];then battery_prompt="\e[0;33m\]{$battery_status$battery_left}" elif [[ $battery_left -lt 20 && $battery_left -ge 10 ]];then battery_prompt="\e[0;31m\]{$battery_status$battery_left}" else battery_prompt="\e[0;31m\]{$battery_status$battery_left}!!!" fi else battery_prompt="\e[0;31m\]{NO BAT!!!}" fi export PS1="\[\e[38;5;43m\]\u\[\e[38;5;23m\]@\[\e[38;5;43m\]\h$battery_prompt\[\e[38;5;43m\](\[\e[38;5;32m\]\j\[\e[38;5;43m\])\[\033[0m\]\w: " } PROMPT_COMMAND=batleft - Si no carga el PS1 es porque no es una interactive shell, para ello crear el archivo .bash_profile con las siguientes lineas if [ "$BASH" ];then if [ -f ~/.bashrc ]; then . .bashrc fi fi - Scripts ################## ## kernel.check ## ################## #!/sbin/runscript # # Written by Lyz (lyz at riseup net) description="Init script to check the signature of the kernel in the unencrypted boot partition" gpg_signature_dir=/etc/kernel/signatures depend() { need localmount root after fsck before net hostname alsasound } start() { ebegin "Checking Kernel signatures" process_status=0 [ -z "$(df -h | grep boot)" ] && mount /boot cd "$gpg_signature_dir" for i in *;do gpg_test="$(gpg --keyring /root/.gnupg/pubring.gpg --verify "$i" "/boot/$(echo "$i" | sed 's/.asc//')" 2>&1)" [[ -n "$(echo "$gpg_test" | grep "Good signature")" ]] && continue process_status=1 while true;do eerror "***CAUTION*** The signature of $i DOESN'T MATCH!!!" echo -e '\e[0;31m !!! \e[0;m Probably your kernel has been compromised' echo -e '\e[0;31m !!! \e[0;m What do you want to do?' echo -e '\t 0) *Shutdown* and load the system from a live' echo -e '\t 1) Continue with the init process' read -p '>> ' choice case $choice in 0) telinit 0;; 1) break;; esac done done umount /boot eend $process_status } # vim: set ts=4 : ################# ## mkkernelsig ## ################# #!/bin/bash # Program to make kernel signatures # # Written by Lyz (lyz at riseup net) gpg_signature_dir=/etc/kernel/signatures [ ! -d "$gpg_signature_dir" ] && mkdir "$gpg_signature_dir" [ -z "$(df -h | grep boot)" ] && mount /boot # Load the files while read i;do files+=( "$(echo "$i" | sed 's/\/boot\///')" ) done < <(find /boot -maxdepth 1 -type f ) for i in $(seq 0 $(( ${#files[@]} - 1 )));do input_filename="/boot/${files[$i]}" output_filename="$gpg_signature_dir/$(echo "${files[$i]}" | sed 's/\/boot\///').asc" # Test if exist a valid gpg signature of the file gpg_test="$(gpg --verify "$output_filename" "$input_filename" 2>&1)" [[ -n "$(echo "$gpg_test" | grep "Good signature")" ]] && echo "Good signature of file "${files[$i]}"" && continue # Sign the rest read -p "Signing file ${files[$i]}" gpg -ba -o "$output_filename" "$input_filename" done ################ ## macchanger ## ################ #!/sbin/openrc-run # # Written by Lyz (lyz at riseup net) description="Changes MAC address of the network interfaces" depend() { need localmount before net } start() { ebegin "sed 's/hwrng/random/'" if [ -a /dev/hwrng ];then rm /dev/hwrng ln -s /dev/random /dev/hwrng fi for interface in $(ifconfig -a | grep flags | cut -d ':' -f1); do [ $interface == lo ] && continue ebegin "Setting new MAC address for the interface $interface" ifconfig $interface down macchanger -A $interface &> /dev/null ifconfig $interface up eend $? "Failed to change the MAC address of $interface" done } stop() { for interface in $(ifconfig -a | grep flags | cut -d ':' -f1); do [ $interface == lo ] && continue ebegin "Resetting the MAC address of interface $interface" ifconfig $interface down macchanger -p $interface &> /dev/null ifconfig $interface up eend $? "Failed to reset the MAC address of interface $interface" done }