Índice:

Firewall Raspberry Pi4: 12 etapas
Firewall Raspberry Pi4: 12 etapas

Vídeo: Firewall Raspberry Pi4: 12 etapas

Vídeo: Firewall Raspberry Pi4: 12 etapas
Vídeo: Firewall For Your Home Or Office - For Free! How To Set Up Ipfire On Raspberry Pi. ipfire vs pfsense 2024, Novembro
Anonim
Firewall Raspberry Pi4
Firewall Raspberry Pi4

Com o novo Raspbery Pi 4 (RPi4) recém-lançado, decidi fazer para mim um firewall de uso doméstico. Depois de tropeçar na Internet, encontrei um ótimo artigo sobre o assunto de Guillaume Kaddouch (https://networkfilter.blogspot.com/2012/08/building-your-piwall-gateway-firewall.html). O artigo é incrível e você deve lê-lo antes de prosseguir - ele tornará o processo descrito aqui mais fácil. Acontece que esse artigo foi escrito em 2012 e é baseado na distro ArchLinux. Nada contra o ArchLinux, mas eu queria fazer isso usando a construção Raspbian mais comum. O RPi4 pode lidar com os requisitos de processamento. Então, obrigado, Guillaume, pela inspiração !! Este instrutível fará referência à postagem original de Guillaume ("GK" para abreviar), você provavelmente desejará ter as duas páginas abertas em seu navegador.

Algumas coisas importantes sobre meu firewall:

  • Eu tenho o conector Ethernet embutido (eth0) indo para a LAN
  • O roteador ISP está no adaptador TRENDnet (eth1)
  • Desativei ativamente o adaptador sem fio (wlan0)
  • Não é garantido que você chegue 100% lá … espero que pelo menos 99%:) então, por favor, forneça feedback / comentários
  • Este é o meu primeiro instrutível. Desculpe por qualquer coisa que não siga as normas instrutivas apropriadas.

Agora, vamos nos divertir …

Suprimentos

  • Raspberry Pi 4

    • Usei a versão de 4 GB, fique à vontade para experimentar uma versão diferente
    • Case (gosto do FLIRC, mas você decide)
    • Adaptador de energia
  • Cartão MicroSD, 32 GB ou superior (usei um cartão de 64 GB)
  • TRENDnet USB3.0 Gigabit Ethernet Dongle (Modelo: TU3-ETG)
  • Alguns cabos de rede RJ45
  • Teclado e mouse USB
  • Um cabo Micro-HDMI para HDMI (conectado a um monitor HDMI)

Esse teclado, vídeo e mouse podem ser removidos assim que você conseguir colocar o SSH e o VNC em funcionamento.

Etapa 1: configuração inicial do RPi

Configuração inicial do RPi
Configuração inicial do RPi

A primeira coisa a fazer é colocar o RPi4 em funcionamento como um novo sistema. Baixe e instale a distribuição completa do Raspbian (Raspbian Buster com desktop e software recomendado). Você precisará reiniciar algumas vezes para que possa expandir e aproveitar o cartão MicroSD completo.

Durante a inicialização, você precisará responder a perguntas sobre localidade, rede, teclado e mouse. Conecte-se a uma rede e permita a atualização.

Vamos também confirmar se tudo foi atualizado corretamente e obter alguns utilitários que podem ajudar na depuração posterior:

$ sudo apt-get update

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

NÃO instalei o vim, nem executei nenhum dos passos 8 do GK (configurar o vim). Acabei de usar o editor vi, pois ele tem a maioria desses recursos de qualquer maneira. Isso também economizou algum tempo e esforço.

Depois de concluído, vamos configurar o RPi4 para que possamos conectar um monitor a quente. Meu objetivo era fazê-lo funcionar sem cabeça, mas se eu precisar conectar um monitor, ele seria reconhecido.

$ sudo vi /boot/config.txt

Nesse arquivo:

descomente (remova o símbolo # frontal): hdmi_force_hotplug = 1

descomente: hdmi_drive = 2

opcionalmente, adicione: enable_hdmi_sound

Etapa 2: Rede

Networking
Networking
Networking
Networking

Se você está acompanhando no site do GK, este é o passo 3. Mas lembre-se, eu não segui muitos dos primeiros passos dele na ordem exata.

Quando comecei isso, conectei o RPi diretamente ao meu roteador ISP ("próximo à minha rede existente"). Isso me permitiu brincar com a configuração sem afetar a rede. Conecte o RJ45 integrado do RPi4 ao roteador (ou sem fio, se desejar). Com o Raspbian, a maneira mais fácil de fazer isso é usando a GUI. Na área de trabalho, clique no ícone do Raspberry> Preferências> Configuração do Raspberry Pi. Certifique-se de habilitar SSH e VNC. Isso instalará o cliente do servidor Real-VNC. Descobri que se você tentar se conectar com o cliente Tight VNC, ele terá problemas e exigirá algumas configurações adicionais. Portanto, neste ponto, instale o cliente Real-VNC em seu desktop / laptop principal (não em seu RPi4).

O SSH não funcionará imediatamente (etapa 7 do GK). Precisamos modificar algumas configurações. Primeiro, vamos modificar o arquivo de configuração ssh. Aqui estão as alterações que fiz. Lembre-se de que não estudei o impacto de todas as alterações aqui. Fiz o que o site da GK sugeriu. Algumas dessas mudanças podem NÃO ser necessárias.

$ sudo vi / etc / ssh / sshd_config

Nesse arquivo, descomente as seguintes linhas:

HostKey / etc / ssh / ssh_host_rsa_keyHostKey / etc / ssh / ssh_host_ecdsa_keySyslogFacility AUTHLogLevel INFOStrictModes yesPubkeyAuthentication yesHostBasedAuthentication não

Ignorar Rhosts sim

PrintMotd noPrintLastLog yesTCPKeepAlive sim

E adicione as seguintes linhas:

Protocolo 2UsePrivilegeSeparation yesKeyRegenerationInterval 3600ServerKeyBits 768RSAAuthentcation yesRhostsRSAAuthentication não

E modifique as seguintes linhas:

Porta 15507LoginGraceTime 60PermitRootLogin não

Vamos falar rapidamente sobre a primeira modificação … porta 15507. SSH normalmente roda na porta 22. GK mudou para 15507 - não sei por quê. Você pode ir de qualquer maneira modificá-lo ou não … Se você optar por modificá-lo, precisará adicionar "-p 15507" a qualquer comando SSH com o qual tentar se conectar. Se você decidir pulá-lo, fique de olho nos outros lugares que 15507 é mencionado nestas instruções e ignore-os, principalmente as regras de firewall!

Por último, para esta etapa, vamos obter o endereço IP do RPi4 para que saibamos o que conectar:

$ ipconfig -a

Encontre a conexão de rede ativa (provavelmente em eth0 ou wlan0) e anote o endereço IP. Agora você tem o que precisa para se conectar remotamente ao RPi4. Vamos reiniciar antes de continuar:

$ sudo reboot

Etapa 3: Outro usuário

Outro usuário
Outro usuário

É melhor não usar o nome de usuário RPi padrão (pi) e você certamente deve alterar a senha. Para ficar seguro, vamos adicionar outra conta de usuário que você pode usar para se conectar remotamente e continuar (etapa 6 do GK). De volta ao RPi, vamos adicionar um novo usuário e definir permissões para o usuário SSH e emitir o comando sudo:

$ sudo useradd -m -g users -G sudo, netdev -s / bin / bash [NOME DE USUÁRIO]

$ sudo passwd [NOME DE USUÁRIO]

Sinta-se à vontade para sair ou reiniciar e usar a conta recém-criada daqui para frente.

Etapa 4: Arquivo Syctl

Arquivo Syctl
Arquivo Syctl

O próximo passo é modificar o arquivo /etc/sysctl.conf (passo 9 do GK). Este arquivo é usado para alterar algumas configurações do kernel. Vamos fazer exatamente o que GK diz para fazer. Aqui está um conjunto simplificado de etapas.

$ sudo vi /etc/sysctl.conf

Nesse arquivo, descomente as seguintes linhas:

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

E adicione as seguintes linhas:

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 o serviço com essas novas configurações e reinicie:

$ sudo sysctl -p

$ sudo reboot

Etapa 5: DHCP e DNS (parte 1)

DHCP e DNS (parte 1)
DHCP e DNS (parte 1)

Para mim, esse processo teve duas partes dolorosas … Configurar DHCP e DNS e configurar as regras de firewall. Então, aqui vamos nós com a primeira parte. Se você está acompanhando no site da GK, estamos na etapa 10.

Para fazer isso, você precisará de algumas informações do seu roteador ISP (ou firewall atual):

  • O endereço IP interno do roteador
  • Um endereço IP que você pode usar para a interface do RPi4 com o roteador
  • Os IPs para um servidor de nomes (ou dois)
  • O nome da interface para a conexão LAN (por exemplo, eth0 ou eth1)
  • O nome da interface para a conexão do ISP (por exemplo, tudo o que você não usou para a LAN)

Você também pode precisar modificar as configurações do roteador para dar ao RPi4 um endereço IP estático (marcador 2, acima). Pelo menos foi o que eu fiz.

Primeiro, vamos modificar o arquivo dhcpcd.conf …

$ sudo vi /etc/dhcpcd.conf

Remova o comentário dessas linhas:

persistentoption rapid_commitoption domain_name_servers, domain_name, domain_search, host_nameoption interface_mtu

Para cada interface de rede, você precisa definir os detalhes da rede. Eles devem ser parecidos com isto:

# Estático para a interface com o 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 a interface com a interface 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 seção se quiser forçar um endereço IP em um dispositivo. O nome depois de 'host' # não tem significado para o sistema. Digite o endereço MAC do dispositivo, bem como o endereço #IP desejado. Certifique-se de que esteja fora da faixa de dhcp. Repita conforme necessário. #host [QUALQUER COISA] {# hardware ethernet xx: xx: xx: xx: xx: xx; # endereço fixo 10.210.212.250; #}

Certifique-se de usar números adequados para você. Os IPs acima são para minha rede, com exceção dos servidores de nomes que são do Google. Observe que também defino a métrica do ISP para 100 para forçar que seja a primeira tentativa padrão para o tráfego de rede. Eu também não fiz nada especificamente com meu adaptador sem fio (wlan0). Pretendo desligar completamente essa interface, então fez sentido para mim.

Além disso, se você quiser forçar um endereço IP em um dispositivo (como um NAS), use essa seção inferior. Dê ao host um nome que seja significativo para você, mas saiba que ele nunca será usado por nada. Não se esqueça dos pontos e vírgulas.

Etapa 6: DHCP e DNS (parte 2)

DHCP e DNS (parte 2)
DHCP e DNS (parte 2)

A próxima etapa é modificar o arquivo dnsmasq.conf…

$ sudo vi /etc/dnsmasq.conf

Precisamos descomentar algumas linhas e editar algumas linhas. Você também precisará copiar algumas configurações do arquivo dhcpcd.conf. Duas outras perguntas que você precisa responder são:

A LAN interna (por exemplo, eth0) precisa de DHCP e DNS? Qual intervalo de DHCP você deseja para sua LAN e qual deve ser a duração de cada aluguel?

Comece descomentando algumas linhas:

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

Defina o seu servidor de nomes. Procure a linha que começa com 'server =' e torne-a algo como 'server = 8.8.8.8'.

Defina o seu intervalo de DHCP. Existem muitas maneiras de fazer isso. Escolhi fornecer os dois IPs de endpoint, a máscara e a duração do lease. Meu intervalo era 10.210.212.20-10.210.212.240, com uma máscara de rede de 255.255.255.0 e tempo de aluguel de 12 horas. Eu recomendo que você deixe alguns IPs no topo e no fundo do seu intervalo, caso precise fornecer um IP estático a algo.

Defina a interface que obterá DNS e DHCP (a LAN) modificando a linha 'interface =' para ser algo como 'interface = eth0). Observe que eu disse especificamente a ele para NÃO atribuir um endereço IP DHCP à minha rede sem fio. Mais uma vez, pretendo desligar completamente essa interface, então fez sentido para mim.

Etapa 7: DHCP e DNS (parte 3)

DHCP e DNS (parte 3)
DHCP e DNS (parte 3)

Um desvio das instruções de GK para esta última etapa …

Quando fui reiniciar meu RPi neste ponto, o processo dnsmasq não estava ativo. Uma pequena pesquisa e descobri que minhas interfaces de rede eth0 e eth1 não estavam ativas antes de dnsmasq ser iniciado, então dnsmasq iria falhar na inicialização. Eu teria que conectar um teclado e mouse ao RPi e reiniciar manualmente o dnsmasq. Isso não é ideal com uma configuração sem cabeça. Eu li um monte de postagens que diziam para fazer várias alterações nas configurações (por exemplo, desativar a interface de ligação) e outras coisas. Nada disso funcionou. No final, decidi simplesmente escrever um script de shell que seria executado a cada 2 minutos e verificar o status do dnsmasq. Se não estava em execução, inicie-o. Presumo que esta situação não seja exclusiva para mim. Então, aqui está o que você precisa fazer:

Transforme o código a seguir em um arquivo chamado 'dns_masq_keepalive.sh' em seu RPi.

#! / bin / bash

# Arquivo: dns_masq_keepalive.sh # Agosto de 2019 # Use com crontab -e (* / 2 * * * * /etc/dns_masq_keepalive.sh) para certificar-se de que dnsmasq seja executado. O serviço irá parar se # todas as interfaces mencionadas em dhcpcd.conf não estiverem ativas antes de começar. Isso resolve o problema. # Esta próxima linha retornará todos os trabalhos ativos com a palavra 'dnsmasq' neles. Portanto, não inclua 'dnsmasq' no nome deste # arquivo, caso contrário, ele retornará todas as vezes e você nunca terá uma reinicialização. dns_running = $ (ps -e | grep dnsmasq) echo $ dns_running if [-z "$ dns_running"] then #echo Não DNSMasq sudo /etc/init.d/dnsmasq restart #else #echo DNSMasq Executando fi

Recorte e cole se precisar. Faça o que fizer, não inclua 'dnsmasq' no nome. O script procura a palavra 'dnsmasq' e, se o script a tiver no nome, presumirá que o serviço está em execução. Além disso, renomeie o arquivo para que termine com '.sh'. O Intructables não me deixou fazer upload de um arquivo '.sh' - o que é bom. As instruções restantes assumem que o arquivo existe em: /etc/dns_masq_keepalive.sh.

Em segundo lugar, defina as permissões no arquivo para que ele possa ser executado:

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

Agora usaremos o sistema crontab para fazer o programa rodar a cada 2 minutos todos os dias. Inicie o crontab:

$ sudo crontab -e

Ele deve solicitar que você edite usando o vi ou qualquer outra coisa. Qualquer um vai funcionar. Depois de editá-lo, adicione o seguinte ao final do arquivo:

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

Sem espaços entre '* / 2', mas espaços entre os asteriscos. Salve e saia. Deve informar que o trabalho está agendado ou algo parecido.

Etapa 8: O Firewall

O Firewall
O Firewall

O próximo processo doloroso é o firewall (etapa 11 do GK). Raspbian usa o conhecido sistema iptables. O blog do GK oferece três arquivos para ajudá-lo a chegar lá… firewall.simple, firewall.advanced e firewall.flows. Todo respeito ao GK, mas facilite para você e use firewall.simple. Passei muito tempo tentando descobrir o sistema e as regras do iptables. Estou feliz por ter feito isso, mas foi doloroso. Então, eu apresento os dois arquivos em anexo para ajudá-lo… firewall.simple e firewall.clear. Copie ambos os arquivos para a pasta / etc e altere as permissões para torná-los executáveis:

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

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

Antes de configurar qualquer regra de firewall, conecte um desktop / laptop em sua porta RPi eth0 e confirme se ele obtém um endereço IP e tem DNS em execução. A maneira mais fácil de fazer isso é tentar executar ping em um site genérico e, em seguida, em um endereço IP conhecido. Também execute ping no seu RPi e roteador ISP. Se você obtiver resultados, tudo está bem e quaisquer problemas de rede que você encontrar agora provavelmente serão resultado de problemas de firewall.

O primeiro arquivo fornecido originalmente começou como arquivo firewall.simple do GK (obrigado, novamente, GK!). Fiz várias alterações para que funcionasse neste sistema. Deve permitir pelo menos HTTP, HTTPS, DNS, DHCP, ping, SSH interno, VNC interno e plex. O Plex pode não ter todas as portas abertas para todos os dispositivos possíveis, mas existem vários posts para consertar isso. No início do arquivo estão os valores que você precisará alterar para a configuração da sua rede.

O segundo arquivo, firewall.clear, deve ser usado durante o teste das regras de firewall. Quando você executa 'sudo /etc/firewall.clear', todas as regras de firewall são apagadas e o sistema deve estar totalmente conectado à Internet. Portanto, se você não conseguir fazer um serviço de rede (como dns) funcionar com o firewall. Regras simples em vigor, mas ele começa a funcionar depois de executar firewall.clear, você sabe que tem um problema de regra. Isso realmente só será crítico ao testar suas regras.

Então, temos as regras de firewall aí, precisamos fazer com que elas sejam iniciadas quando o RPi iniciar. Para fazer isso, vamos editar o arquivo /etc/rc.local:

$ sudo vi /etc/rc.local

Uma vez dentro, adicione o seguinte ao final do arquivo:

echo “Carregando regras de iptables” /etc/firewall.simple >> / dev / null

Se você optar por adicionar o sistema de detecção de intrusão snort, precisará editar este arquivo novamente. Por enquanto, basta salvá-lo e reiniciar.

$ sudo reboot

Etapa 9: Syslog

Syslog
Syslog

Faltam dois passos …

Este é fácil. Se você ainda está aí e acompanhando o blog de GK, esta é a etapa 12. Você precisa fazer exatamente o que ele diz em relação ao arquivo syslog. Aqui estão as etapas abreviadas:

Mantenha 2 meses de dados do syslog …

$ sudo vi /etc/logrotate.conf

Precisamos dizer a ele para usar 'uma semana' como medida e, em seguida, manter 12 delas. Você precisa das duas linhas a seguir neste arquivo. Acredito que você precisará alterar as linhas existentes.

rotação semanal 12

Salve isso.

Etapa 10: Detecção de intrusão com Snort

Detecção de intrusão com Snort
Detecção de intrusão com Snort

A última coisa que o GK configura é o sistema snort. Eu também recomendo isso. Você pode seguir as regras dele, e não vou copiá-las todas aqui, com algumas pequenas modificações. Suas instruções são para a distribuição ArchLinux. Aqui estão algumas mudanças para a distribuição Raspbian que estamos usando aqui. O resto das instruções funcionam bem.

Primeiro, não use sudo pacman -S snort para baixar e instalar o snort. Faça o seguinte:

$ sudo apt-get install snort

Em segundo lugar, você não pode verificar o snort com sudo snort -version. Verifique a instalação com:

$ sudo snort -V

Finalmente, para que ele seja executado na inicialização, não modifique o arquivo rc.conf, edite o arquivo rc.local (novamente) …

$ sudo vi /etc/rc.local

Adicione as seguintes linhas ao final do arquivo:

eco “Carregando snort”

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

Agora, reinicie e tudo deve funcionar magicamente.

$ sudo reboot

Etapa 11: aproveite

Aproveitar
Aproveitar

Deve ser isso!

Em primeiro lugar, não posso agradecer o suficiente a Guillaume Kaddouch! Ele inspirou isso.

Em segundo lugar, se você ainda não desconectou seu teclado, vídeo e mouse, você pode. Use SSH e VNC para voltar, quando necessário.

Para terminar, isso pode não ser 100% perfeito. Por favor, poste de volta com alterações / sugestões / recomendações. Meu objetivo seria que isso fosse o início de uma discussão e muita gente curtindo!

Obrigado!!

PS… A foto é um RPi4 dentro de um gabinete de alumínio FLIRC com uma velha ventoinha Intel ligeiramente modificada e presa com zíper na parte superior. Há pasta térmica embaixo do ventilador também, caso você esteja se perguntando. Encontrei algo semelhante na Internet (https://www.reddit.com/r/raspberry_pi/comments/9bdgrr/it_turns_out_putting_a_heatsink_on_the_flirc_case/) e decidi tentar eu mesmo.

Etapa 12: Log de mudanças

Conforme as alterações forem feitas neste instrutível, irei documentá-las aqui. Caso tenha algum problema, verifique aqui se você pegou instruções ou arquivos antigos.

25 de setembro de 2019:

  • Regras de DHCP corrigidas em firewall.simple
  • Intervalo de DHCP corrigido nas instruções (os arquivos estavam corretos)
  • Adicionadas atribuições de IP fixo às instruções DHCP

13 de outubro de 2019

  • Vários erros de digitação corrigidos
  • Criei um segundo pi para que eu tivesse um SDcard de teste para trocar, se necessário

Recomendado: