Tabla de contenido:

Cortafuegos Raspberry Pi4: 12 pasos
Cortafuegos Raspberry Pi4: 12 pasos

Video: Cortafuegos Raspberry Pi4: 12 pasos

Video: Cortafuegos Raspberry Pi4: 12 pasos
Video: Setting Up a Raspberry Pi 4 | Vilros 2024, Junio
Anonim
Cortafuegos Raspberry Pi4
Cortafuegos Raspberry Pi4

Con el nuevo Raspbery Pi 4 (RPi4) recién lanzado, decidí convertirme en un firewall de uso doméstico. Después de tropezar en Internet, encontré un gran artículo sobre el tema de Guillaume Kaddouch (https://networkfilter.blogspot.com/2012/08/building-your-piwall-gateway-firewall.html). El artículo es asombroso y debe leerlo antes de seguir adelante; hará que el proceso que se describe aquí sea más fácil. La cuestión es que ese artículo fue escrito en 2012 y está basado en la distribución ArchLinux. Nada en contra de ArchLinux, pero quería hacer esto usando la compilación Raspbian más común. El RPi4 puede manejar los requisitos de procesamiento. ¡¡Así que gracias, Guillaume, por la inspiración !! Este instructivo hará referencia a la publicación original de Guillaume ("GK" para abreviar), es probable que desee tener ambas páginas abiertas en su navegador.

Un par de cosas clave sobre mi firewall:

  • Tengo el conector ethernet incorporado (eth0) yendo a la LAN
  • El enrutador ISP está en el adaptador TRENDnet (eth1)
  • He desactivado activamente el adaptador inalámbrico (wlan0)
  • No se garantiza que esto lo lleve al 100% allí … con suerte al menos el 99%:), así que envíe sus comentarios / sugerencias
  • Este es mi primer instructable. Perdón por cualquier cosa que no siga las normas instrucables apropiadas.

Ahora, divirtámonos …

Suministros

  • Frambuesa pi 4

    • Usé la versión de 4GB, no dude en probar una versión diferente
    • Case (me gusta el FLIRC, pero esa es tu decisión)
    • Adaptador de corriente
  • Tarjeta MicroSD, 32 GB o más (utilicé una tarjeta de 64 GB)
  • Dongle Ethernet Gigabit USB3.0 de TRENDnet (Modelo: TU3-ETG)
  • Un par de cables de red RJ45
  • Teclado y ratón USB
  • Un cable Micro-HDMI a HDMI (que está conectado a un monitor HDMI)

Ese teclado, video y mouse se pueden quitar una vez que pueda poner SSH y VNC en funcionamiento.

Paso 1: Configuración inicial de RPi

Configuración inicial de RPi
Configuración inicial de RPi

Lo primero que debe hacer es poner su RPi4 en funcionamiento como un nuevo sistema. Descargue e instale la distribución completa de Raspbian (Raspbian Buster con escritorio y software recomendado). Deberá reiniciar un par de veces para que pueda expandirse y aprovechar la tarjeta MicroSD completa.

Mientras se inicia, deberá responder preguntas sobre la localidad, la red, el teclado y el mouse. Conéctese a una red y permita que se actualice.

También confirmemos que todo se actualizó correctamente y obtengamos un par de utilidades que pueden ayudar a depurar más adelante:

$ sudo apt-get update

$ sudo apt-get dist-upgrade $ sudo apt-get install htop $ sudo apt-get install tcpdump

NO instalé vim, ni hice ninguno de los pasos 8 de GK (configurar vim). Acabo de usar el editor vi, ya que de todos modos tiene la mayoría de esas características. Esto también ahorró algo de tiempo y esfuerzo.

Una vez que esté completo, configuremos el RPi4 para que podamos conectar un monitor en caliente. Mi objetivo era hacerlo funcionar sin cabeza, pero si necesito conectar un monitor, lo reconocerían.

$ sudo vi /boot/config.txt

En ese archivo:

descomentar (eliminar el símbolo # frontal): hdmi_force_hotplug = 1

descomentar: hdmi_drive = 2

opcionalmente, agregue: enable_hdmi_sound

Paso 2: trabajo en red

Redes
Redes
Redes
Redes

Si está siguiendo el sitio de GK, este es el paso 3. Pero tenga en cuenta que no seguí muchos de sus primeros pasos en el orden exacto.

Cuando comencé esto, conecté el RPi directamente a mi enrutador ISP ("junto a mi red existente"). Esto me permitió jugar con la configuración sin afectar la red. Conecte el RJ45 integrado RPi4 a su enrutador (o inalámbrico, si lo desea). Con Raspbian, la forma más sencilla de hacerlo es utilizando la GUI. Desde el escritorio, haga clic en el icono de Raspberry> Preferencias> Configuración de Raspberry Pi. Asegúrese de habilitar SSH y VNC. Esto instalará el cliente del servidor Real-VNC. Descubrí que si intenta conectarse con el cliente Tight VNC, se ajustará y requerirá alguna configuración adicional. Entonces, en este punto, instale el cliente Real-VNC en su computadora de escritorio / computadora portátil principal (no en su RPi4).

SSH no funcionará de inmediato (paso 7 de GK). Necesitamos modificar algunas configuraciones. Primero, modifiquemos el archivo de configuración ssh. Estos son los cambios que hice. Tenga en cuenta que no estudié el impacto de cada cambio aquí. Hice lo que sugirió el sitio de GK. Es posible que algunos de estos cambios NO sean necesarios.

$ sudo vi / etc / ssh / sshd_config

En ese archivo, descomente las siguientes líneas:

HostKey / etc / ssh / ssh_host_rsa_keyHostKey / etc / ssh / ssh_host_ecdsa_keySyslogFacility AUTHLogLevel INFOStrictModes yesPubkeyAuthentication yesHostBasedAuthentication no

Ignorar Rhosts sí

PrintMotd noPrintLastLog síTCPKeepAlive sí

Y agregue las siguientes líneas:

Protocolo 2UsePrivilegeSeparation yesKeyRegenerationInterval 3600ServerKeyBits 768RSAAuthentcation yesRhostsRSAAuthentication no

Y modifica las siguientes líneas:

Puerto 15507Iniciar sesiónGraceTime 60PermitRootIniciar sesión no

Hablemos rápidamente de esa primera modificación … el puerto 15507. SSH normalmente se ejecuta en el puerto 22. GK lo movió a 15507, no sé por qué. Puede modificarlo de cualquier manera o no … Si elige modificarlo, deberá agregar "-p 15507" a cualquier comando SSH con el que intente conectarse. Si decide omitirlo, esté atento a los otros lugares en los que se menciona 15507 en estas instrucciones e ignórelos, ¡particularmente las reglas del firewall!

Por último, para este paso, obtengamos la dirección IP del RPi4 para que sepamos a qué conectarnos:

$ ipconfig -a

Busque la conexión de red activa (probablemente en eth0 o wlan0) y anote esa dirección IP. Ahora tiene lo que necesita para conectarse de forma remota al RPi4. Reiniciemos antes de continuar:

$ sudo reiniciar

Paso 3: otro usuario

Otro usuario
Otro usuario

Es mejor no usar el nombre de usuario predeterminado de RPi (pi), y ciertamente debería cambiar la contraseña. Para estar seguro, agreguemos otra cuenta de usuario que pueda usar para conectarse de forma remota y continuar (paso 6 de GK). De vuelta en el RPi, agreguemos un nuevo usuario y establezcamos permisos para el usuario a SSH y emita el comando sudo:

$ sudo useradd -m -g users -G sudo, netdev -s / bin / bash [NOMBRE DE USUARIO]

$ sudo passwd [NOMBRE DE USUARIO]

Siéntase libre de cerrar sesión o reiniciar y usar esa cuenta recién creada en el futuro.

Paso 4: Archivo Syctl

Archivo Syctl
Archivo Syctl

El siguiente paso es modificar el archivo /etc/sysctl.conf (paso 9 de GK). Este archivo se usa para cambiar algunas configuraciones del kernel. Vamos a hacer exactamente lo que dice GK. A continuación, se muestra un conjunto de pasos simplificado.

$ sudo vi /etc/sysctl.conf

En ese archivo, descomente las siguientes líneas:

net.ipv4.conf.default.rp_filter = 1net.ipv4.conf.all.rp_filter = 1net.ipv4.tcp_syncookies = 1

net.ipv4.ip_forward = 1

net.ipv4.conf.all.accept_redirects = 0net.ipv4.conf.all.send_redirects = 0net.ipv4.conf.all.accept_source_route = 0net.ipv4.conf.all.log_martians = 1

Y agregue las siguientes líneas:

net.ipv4.icmp_echo_ignore_broadcasts = 1net.ipv4.icmp_ignore_bogus_error_responses = 1net.ipv4.conf.eth0.accept_redirects = 0vm.min_free_kbytes = 8192

Reinicie el servicio con estas nuevas configuraciones y reinicie:

$ sudo sysctl -p

$ sudo reiniciar

Paso 5: DHCP y DNS (parte 1)

DHCP y DNS (parte 1)
DHCP y DNS (parte 1)

Para mí, hubo dos partes dolorosas en este proceso … Configurar DHCP y DNS, y configurar las reglas del firewall. Entonces, aquí vamos con la primera parte. Si está siguiendo el sitio de GK, estamos en el paso 10.

Para hacer esto, necesitará algunos datos de su enrutador ISP (o firewall actual):

  • La dirección IP interna del enrutador
  • Una dirección IP que puede usar para la interfaz del RPi4 con el enrutador
  • Las IP de un servidor de nombres (o dos)
  • El nombre de la interfaz para la conexión LAN (por ejemplo, eth0 o eth1)
  • El nombre de la interfaz para la conexión del ISP (por ejemplo, lo que no usó para la LAN)

Es posible que también deba modificar la configuración del enrutador para darle al RPi4 una dirección IP estática (viñeta 2, arriba). Al menos, eso es lo que hice.

Primero, modifiquemos el archivo dhcpcd.conf …

$ sudo vi /etc/dhcpcd.conf

Descomente estas líneas:

persistentoption rapid_commitoption domain_name_servers, domain_name, domain_search, host_nameoption interface_mtu

Para cada interfaz de red, debe configurar los detalles de la red. Deberían verse algo como esto:

# Estático para la interfaz al ISP

interface eth1 static ip_address = 192.168.1.static routers = 192.168.1.254 static domain_name_servers = 8.8.8.8 8.8.4.4 metric 100 # Static para la interfaz a la interfaz LAN eth0 static ip_address = 10.210.212.static routers = 10.210.212.1 static domain_name_servers = 8.8.8.8 8.8.4.4 #interface wlan0 #static ip_address = 10.210.212. # static routers = 10.210.212.1 #static domain_name_servers = 8.8.8.8 # Descomente esta sección si desea forzar una dirección IP en un dispositivo. El nombre después de 'host' # no tiene sentido para el sistema. Ingrese la dirección MAC del dispositivo, así como la dirección IP deseada. Asegúrese de que esté fuera del rango de DHCP. Repita según sea necesario. #host [CUALQUIER COSA] {# hardware ethernet xx: xx: xx: xx: xx: xx; # dirección-fija 10.210.212.250; #}

Asegúrese de utilizar números que le funcionen. Las direcciones IP anteriores son para mi red, con la excepción de los servidores de nombres que son Google. Tenga en cuenta que también configuré la métrica para el ISP en 100 para forzar que sea el primer intento predeterminado para el tráfico de red. Tampoco hice nada específicamente con mi adaptador inalámbrico (wlan0). Tengo la intención de desactivar por completo esa interfaz, por lo que tenía sentido para mí.

Además, si desea forzar una dirección IP en un dispositivo (como un NAS), use esa sección inferior. Dale al anfitrión un nombre que sea significativo para ti, pero ten en cuenta que nadie lo usa. No olvide el punto y coma.

Paso 6: DHCP y DNS (parte 2)

DHCP y DNS (parte 2)
DHCP y DNS (parte 2)

El siguiente paso es modificar el archivo dnsmasq.conf …

$ sudo vi /etc/dnsmasq.conf

Necesitamos descomentar algunas líneas y editar algunas líneas. También necesitará copiar algunas configuraciones del archivo dhcpcd.conf. Otras dos preguntas que debe responder usted mismo son:

¿La LAN interna (p. Ej., Eth0) necesita DHCP y DNS? ¿Qué rango de DHCP desea para su LAN y cuánto tiempo debe durar cada arrendamiento?

Comience descomentando algunas líneas:

falso-privno-dhcp-interface = wlan0bind-interfacesdhcp-name-match = set: wpad-ignore, wpaddhcp-ignore-names = tag: wpad-ignore

Configure su servidor de nombres. Busque la línea que comienza con 'servidor =' y conviértala en algo como 'servidor = 8.8.8.8'.

Configure su rango de DHCP. Hay muchas formas de hacer esto. Elegí proporcionar las dos direcciones IP de punto final, la máscara y la duración del contrato de arrendamiento. Mi rango fue 10.210.212.20-10.210.212.240, con una máscara de red de 255.255.255.0 y un tiempo de arrendamiento de 12 horas. Te recomiendo que dejes algunas direcciones IP en la parte superior e inferior de tu rango en caso de que alguna vez necesites dar una dirección IP estática a algo.

Configure la interfaz que obtendrá DNS y DHCP (la LAN) modificando la línea 'interface =' para que sea algo como 'interface = eth0). Tenga en cuenta que le dije específicamente que NO asigne una dirección IP DHCP a mi red inalámbrica. Una vez más, tengo la intención de desactivar por completo esa interfaz, por lo que tenía sentido para mí.

Paso 7: DHCP y DNS (parte 3)

DHCP y DNS (parte 3)
DHCP y DNS (parte 3)

Una desviación de las instrucciones de GK para este último paso …

Cuando fui a reiniciar mi RPi en este punto, el proceso dnsmasq no estaba activo. Un poco de curiosidad y descubrí que mis interfaces de red eth0 y eth1 no estaban activas antes de que se iniciara dnsmasq, por lo que dnsmasq fallaría al iniciarse. Tendría que conectar un teclado y un mouse al RPi y reiniciar manualmente dnsmasq. Esto no es ideal con una configuración sin cabeza. Leí un montón de publicaciones que decían realizar varios cambios en la configuración (por ejemplo, deshabilitar la interfaz de enlace) y otras cosas. Nada de eso funcionó. Al final, decidí simplemente escribir un script de shell que se ejecutara cada 2 minutos y verificara el estado de dnsmasq. Si no se estaba ejecutando, inícielo. Supongo que esta situación no es exclusiva de mí. Entonces, esto es lo que debe hacer:

Convierta el siguiente código en un archivo llamado 'dns_masq_keepalive.sh' en su RPi.

#! / bin / bash

# Archivo: dns_masq_keepalive.sh # Agosto de 2019 # Use esto con crontab -e (* / 2 * * * * /etc/dns_masq_keepalive.sh) para asegurarse de que dnsmasq se ejecute. El servicio se detendrá solo si # todas las interfaces mencionadas en dhcpcd.conf no están activas antes de comenzar. Esto soluciona el problema. # La siguiente línea devolverá todos los trabajos activos con la palabra 'dnsmasq' en ellos. Por lo tanto, no incluya 'dnsmasq' en el nombre de este # archivo, de lo contrario lo devolverá cada vez y nunca tendrá un reinicio. dns_running = $ (ps -e | grep dnsmasq) echo $ dns_running if [-z "$ dns_running"] luego #echo No DNSMasq sudo /etc/init.d/dnsmasq restart #else #echo DNSMasq Running fi

Córtelo y péguelo si es necesario. Hagas lo que hagas, no incluyas 'dnsmasq' en el nombre. El script busca la palabra 'dnsmasq' y si el script la tiene en el nombre, asumirá que el servicio se está ejecutando. Además, cambie el nombre del archivo para que termine con '.sh'. Intructables no me dejaba subir un archivo '.sh', lo cual es bueno. Las instrucciones restantes asumen que el archivo existe en: /etc/dns_masq_keepalive.sh.

En segundo lugar, establezca permisos en el archivo para que se pueda ejecutar:

$ sudo chmod u + x /etc/dns_masq_keepalive.sh

Ahora usaremos el sistema crontab para que el programa se ejecute cada 2 minutos todos los días. Inicie crontab:

$ sudo crontab -e

Debería pedirte que edites usando vi o algo más. Cualquiera funcionará. Una vez que pueda editarlo, agregue lo siguiente al final del archivo:

* / 2 * * * * sudo /etc/dns_masq_keepalive.sh

No hay espacios en el '* / 2', pero hay espacios entre los asteriscos. Guardar y Salir. Debería decirle que el trabajo está programado o algo por el estilo.

Paso 8: el cortafuegos

El cortafuegos
El cortafuegos

El siguiente proceso doloroso es el cortafuegos (paso 11 de GK). Raspbian utiliza el conocido sistema iptables. El blog de GK proporciona tres archivos para ayudarlo a llegar allí… firewall.simple, firewall.advanced y firewall.flows. Todo el respeto a GK, pero hazlo fácil para ti mismo y usa firewall.simple. Pasé mucho tiempo tratando de averiguar el sistema y las reglas de iptables. Me alegro de haberlo hecho, pero fue doloroso. Entonces, les doy los dos archivos adjuntos para ayudarlos… firewall.simple y firewall.clear. Copie ambos archivos en su carpeta / etc y cambie los permisos para hacerlos ejecutables:

$ sudo chmod u + x /etc/firewall.simple

$ sudo chmod u + x /etc/firewall.clear

Antes de configurar cualquier regla de firewall, conecte una computadora de escritorio / portátil a su puerto RPi eth0 y confirme que obtenga una dirección IP y que tenga DNS en ejecución. La forma más sencilla de hacerlo es intentar hacer ping a un sitio genérico y luego a una dirección IP conocida. También haga ping a su enrutador RPi e ISP. Si obtiene resultados, entonces todo está bien y cualquier problema de red que encuentre probablemente será el resultado de problemas de firewall.

El primer archivo proporcionado originalmente comenzó como firewall.simple de GK (¡gracias, nuevamente, GK!). Hice un montón de cambios para que funcione en este sistema. Debe permitir al menos HTTP, HTTPS, DNS, DHCP, ping, SSH interno, VNC interno y plex. Es posible que Plex no tenga todos los puertos abiertos para todos los dispositivos posibles, pero hay un montón de publicaciones para solucionarlo. En la parte superior del archivo hay valores que deberá cambiar en la configuración de su red.

El segundo archivo, firewall.clear, está destinado a ser utilizado mientras prueba las reglas de su firewall. Cuando ejecute 'sudo /etc/firewall.clear', se borrarán todas las reglas del cortafuegos y el sistema debería estar completamente conectado a Internet. Por lo tanto, si no puede hacer que un servicio de red (como dns) funcione con las reglas firewall.simple implementadas, pero comienza a funcionar después de ejecutar firewall.clear, sabrá que tiene un problema con las reglas. Esto realmente solo será crítico cuando pruebe sus reglas.

Entonces, tenemos las reglas del firewall allí, tenemos que hacer que comiencen cuando se inicia el RPi. Para hacer eso, editaremos el archivo /etc/rc.local:

$ sudo vi /etc/rc.local

Una vez dentro, agregue lo siguiente al final del archivo:

echo "Cargando reglas de iptables" /etc/firewall.simple >> / dev / null

Si elige agregar el sistema de detección de intrusos snort, deberá editar este archivo nuevamente. Por ahora, guárdelo y reinicie.

$ sudo reiniciar

Paso 9: Syslog

Syslog
Syslog

Quedan dos pasos…

Esta es una fácil. Si todavía está allí y sigue el blog de GK, este es el paso 12. Debe hacer exactamente lo que él dice con respecto al archivo syslog. Estos son los pasos abreviados:

Conserve 2 meses de datos de syslog …

$ sudo vi /etc/logrotate.conf

Necesitamos decirle que use 'una semana' como medida, y luego mantener 12 de ellos. Necesita las siguientes dos líneas en este archivo. Creo que necesitará cambiar las líneas existentes.

semanal rotar 12

Guárdalo.

Paso 10: Detección de intrusiones con Snort

Detección de intrusiones con Snort
Detección de intrusiones con Snort

Lo último que configura GK es el sistema de snort. También recomiendo esto. Puede seguir sus reglas, y no voy a copiarlas todas aquí, con algunas modificaciones menores. Sus instrucciones son para la distribución ArchLinux. Aquí están los pocos cambios para la distribución de Raspbian que estamos usando aquí. El resto de las instrucciones funcionan bien.

Primero, no use sudo pacman -S snort para descargar e instalar snort. Haz lo siguiente:

$ sudo apt-get install snort

En segundo lugar, no puede verificar snort con sudo snort -version. Verifique la instalación con:

$ sudo snort -V

Finalmente, para que se ejecute al inicio, no modifique el archivo rc.conf, edite el archivo rc.local (nuevamente) …

$ sudo vi /etc/rc.local

Agregue las siguientes líneas al final del archivo:

echo "Cargando snort"

# / usr / sbin / snort -D -u snort -g snort -c /etc/snort/snort.conf -i eth0 -l / var / log / snort

Ahora, reinicie y todo debería funcionar mágicamente.

$ sudo reiniciar

Paso 11: disfruta

Disfrutar
Disfrutar

¡Eso debería ser!

En primer lugar, ¡no puedo agradecer lo suficiente a Guillaume Kaddouch! Él inspiró esto.

En segundo lugar, si aún no ha desconectado el teclado, el video y el mouse, puede hacerlo. Utilice SSH y VNC para volver a entrar cuando sea necesario.

Para terminar, esto puede no ser perfecto al 100%. Vuelva a publicar con cambios / sugerencias / recomendaciones. ¡Mi objetivo sería que esto sea el comienzo de la discusión y que muchas personas disfruten!

¡¡Gracias!!

PD … La imagen es un RPi4 dentro de una carcasa de aluminio FLIRC con un viejo ventilador Intel ligeramente modificado y con cremallera en la parte superior. También hay pasta térmica debajo del ventilador, en caso de que se lo pregunte. Encontré algo similar en Internet (https://www.reddit.com/r/raspberry_pi/comments/9bdgrr/it_turns_out_putting_a_heatsink_on_the_flirc_case/) y decidí probarlo yo mismo.

Paso 12: registro de cambios

A medida que se realicen cambios en este instructable, los documentaré aquí. En caso de que tenga un problema, consulte aquí para ver si tomó instrucciones o archivos antiguos.

25 de septiembre de 2019:

  • Se corrigieron las reglas de DHCP en firewall.simple
  • Se corrigió el rango de DHCP en las instrucciones (los archivos eran correctos)
  • Se agregaron asignaciones de IP fija a las instrucciones de DHCP

13 de octubre de 2019

  • Se corrigieron varios errores tipográficos
  • Creé un segundo pi para tener una tarjeta SD de prueba para intercambiar, si es necesario

Recomendado: