fwgen - gerador de regras de firewall iptables
Publicado por Pedro Fernandes (última atualização em 30/01/2020)
[ Hits: 3.157 ]
Homepage: https://github.com/PedroF37
Script gerador de regras de firewall iptables.
O script tem três perfis:
- máquina que acessa apenas como cliente sem rodar serviços, apenas com uma interface
- máquina gateway de rede com duas interfaces e rodando serviços para a rede local
- máquina servidor de internet.
O usuário escolhe o tipo de script que quer e as regras são geradas e salvas em um arquivo já pronto, incluindo com o "#!/bin/sh", cabeçalho etc.
O script não pede as interfaces, isso fica por conta do usuário, abrir o script e especificar as interfaces. O script deixa já pronto, exemplo:
# Interface externa
EXT=""
As regras são básicas, e com certeza os scripts não impedem que o pentágono e a NSA invadam as máquinas, mas pelo menos deve ser um ponto de partida.
Cabe a quem quiser usar abrir os script gerados e adaptar e melhorar. Não confiem em mim.
Eu não confio na minha mãe e ela pariu-me, então não vejo motivo para confiar cegamente em mim.
#!/bin/bash ######################################## # # Titulo: fwgen # # Descrição: # # Script gerador de regras de firewall # iptables. # # Funcionamento: # # O script gera regras simples, mas eficazes # (espero) para proteger a máquina nas # seguintes situações: # # Máquina isolada com apenas uma interface # que conecta na internet apenas como cliente # sem rodar nenhum servidor. # # Máquina servidor gateway de rede local. # Com duas interfaces de rede, rodando # vários serviços para a rede local # # Máquina servidor dedicado # tipo servidor Web e coisa do género. # # O usuário especifica o tipo de # script que quer e são geradas # as regras equivalentes. # (Poucas e básicas!!!) # # O script armazenas as regras em um # outro script que o usuário DEVERÁ # posteriormente adaptar, adicionando # e/ou removendo regras que melhor se # adaptem á sua situação. # # Também as portas liberadas são poucas # e apenas sugestões, deverá depois # adicionar ou remover as portas que não usa. # As interfaces o script não pede e não armazena # então novamente o usuario abre o script # depois de gerado e adiciona as interfaces. # # Exemplo: # # Interface externa # EXT=" " # # Interface interna # INT=" " # # Rede local (12.168.11.0/24) # LNET=" " # # Autor: Pedro fernandes # # Email: pedrobfernandes32@protonmail.com # ######################################## ######################################## # Constantes ######################################## ARQ_SINGLE="/home/$USER/fw_single" ARQ_GW="/home/$USER/fw_gw" ARQ_INTERNET="/home/$USER/fw_internet" ######################################## ######################################## # Funções ######################################## adicional() { echo " ######################################## # Proteçoes do kernel: # Desativa o suporte ao ICMP redirects for i in /proc/sys/net/ipv4/conf/*/accept_redirects; do echo 0 > \"\$i\" done # Desativa o source routing for i in /proc/sys/net/ipv4/conf/*/accept_source_route; do echo 0 > \"\$i\" done # Ativa o rp_filter (caminho reverso) for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > \"\$i\" done # Ativa o syncookies (DDOS) echo 1 > /proc/sys/net/ipv4/tcp_syncookies # Desativa o suporte ao ping broadcast echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts " } ######################################## fw_single() { clear echo " #!/bin/sh ######################################## # Script simples de firewall para # máquina com apenas uma interface # que acessa a internet como cliente apenas ######################################## # Variáveis # Onde está o iptables IPT=\"\$(which iptables)\" # Rede local (ex: 192.168.1.0/24) LNET=\"\" ######################################## # Limpa as regras Filter \"\$IPT\" -F \"\$IPT\" -X ######################################## # Permite pacotes na loopback \"\$IPT\" -A INPUT -i lo -j ACCEPT # Aceita pacotes vindos da rede local. # Esta regra serve caso queira por exemplo # compartilhar arquivos com máquinas na sua # rede local. Por exemplo com o pc da sala etc. #\"\$IPT\" -A INPUT -s \"\$LNET\" -j ACCEPT # Ou: #\"\$IPT\" -A INPUT -s \"ip da máquina com quem quer compartilhar\" -j ACCEPT # Pode abrir também apenas as portas necessárias. # Nesse caso usaria algo assim. Presumindo que fosse # usar o samba para compartilhar arquivos com o windows # ou linux do pc da sala. #\"\$IPT\" -A INPUT -s \"rede local ou ip da máquina da sala\" -p tcp -m multiport --dports 139,445 -j ACCEPT #\"\$IPT\" -A INPUT -s \"rede local ou ip da máquina da sala\" -p udp -m multiport --dports 137,138 -j ACCEPT # Permite pacotes de resposta e relacionados da internet e da # rede local. # Com esta, linha se não quiser compartilhar arquivos # com outras máquina na sua casa, ainda consegue receber # respostas a conexões iniciadas por você, tanto da rede local # quanto da internet. # Mas se a regra acima ficar comentada, as máquinas da sua rede # local não conseguem iniciar conexões com a sua máquina. \"\$IPT\" -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # Descarta tudo o resto \"\$IPT\" -A INPUT -j DROP # Alternativamente: #\"\$IPT\" -A INPUT -s \"\$LNET\" -j REJECT #\"\$IPT\" -A INPUT -j DROP # Desta forma rejeita os pacotes da rede local # dando uma resosta e consumindo menos banda # descarta (DROP) pacotes da internet " >> $ARQ_SINGLE sed -i '1d' $ARQ_SINGLE echo "Script salvo em $ARQ_SINGLE" sleep 2 return } ######################################## fw_gw() { clear echo " #!/bin/sh ######################################## # Script de firewall para gateway de rede # rodando serviços como dhcp, dns interno # proxy, servidor de arquivos samba etc. ######################################## # Variáveis # Onde está o iptables IPT=\"\$(which iptables)\" # Interface externa (ex: eth0) EXT=\"\" # Interface interna (ex: eth1) INT=\"\" # Rede local (ex: 192.168.1.0/24) LNET=\"\" # Portas tcp acessiveis para rede local (ou internet) PTCP_GW_PROXY=\"67,80,8080,3128,445,139\" # Portas udp acessiveis para rede local (ou internet) PUDP_GW_PROXY=\"67,53,138,139,123\" ######################################## # Limpa regras Filter \"\$IPT\" -F \"\$IPT\" -X # Limpa regras NAT \"\$IPT\" -t nat -F \"\$IPT\" -t nat -X " >> $ARQ_GW adicional >> $ARQ_GW ######################################## echo " ######################################## # Compartilha a conexão e proxy transparente # Caso não queira compartilhar por proxy # explicito. # Caso não queira usar proxy é só remover ou deixar # comentada a linha do proxy. #modprobe iptable_nat #echo 1 > /proc/sys/net/ipv4/ip_forward #\"\$IPT\" -t nat -A POSTROUTING -s \"\$LNET\" -o \"\$EXT\" -j MASQUERADE #\"\$IPT\" -t nat -A PREROUTING -i \"\$INT\" -s \"\$LNET\" -p tcp --dport 80 -j REDIRECT --to-port 3128 # Ou se usar o dansguardian ou e2gardian etc e quiser transparente como o squid: #\"\$IPT\" -t nat -A PREROUTING -i \"\$INT\" -s \"\$LNET\" -p tcp --dport 80 -j REDIRECT --to-port 8080 # Neste caso deixa o squid como transparente, e remove a porta 3128 das portas tcp permitidas acima em: # PTCP_GW_PROXY ######################################### # Regras de entrada para o servidor # Permite pacotes na loopback \"\$IPT\" -A INPUT -i lo -j ACCEPT # Permite pacotes da rede local (todas as portas) \"\$IPT\" -A INPUT -i \"\$INT\" -s \"\$LNET\" -j ACCEPT # Alternativamente, (na minha opinião até melhor): # Portas tcp permitidas #\"\$IPT\" -A INPUT -i \"\$INT\" -s \"\$LNET\" -p tcp -m multiport --dports \"\$PTCP_GW_PROXY\" -j ACCEPT # Portas udp permitidas #\"\$IPT\" -A INPUT -i \"\$INT\" -s \"\$LNET\" -p udp -m multiport --dports \"\$PUDP_GW_PROXY\" -j ACCEPT # Ping #\"\$IPT\" -A INPUT -i \"\$INT\" -s \"\$LNET\" -p icmp --icmp-type 8 -j ACCEPT # Echo-reply #\"\$IPT\" -A INPUT -i \"\$INT\" -s \"\$LNET\" -p icmp --icmp-type 0 -j ACCEPT # Permite pacotes relacionados e de resposta da internet #\"\$IPT\" -A INPUT -i \"\$EXT\" -m state --state RELATED,ESTABLISHED -j ACCEPT ######################################## # Regras de encaminhamento, caso faça nat e não # proxy explicito # Permite pacotes da rede local para a internet #\"\$IPT\" -A FORWARD -i \"\$INT\" -s \"\$LNET\" -o \"\$EXT\" -j ACCEPT # Permite pacotes de resposta e relacionados # da internet para a rede local #\"\$IPT\" -A FORWARD -i \"\$EXT\" -d \"\$LNET\" -o \"\$INT\" -m state --state RELATED,ESTABLISHED -j ACCEPT ######################################## # Regras de bloqueio # Rejeita pacotes da rede local, que não # tenham sido aceitos por regras anteriores # Usa target REJECT para dar resosta \"\$IPT\" -A INPUT -i \"\$INT\" -s \"\$LNET\" -j REJECT # Descarta tudo o resto que não foi # aceite pelas regras anteriores \"\$IPT\" -A INPUT -j DROP \"\$IPT\" -A FORWARD -j DROP " >> $ARQ_GW sed -i '1d' $ARQ_GW echo "Script salvo em $ARQ_GW" sleep 2 return } ######################################## fw_internet() { clear echo " #!/bin/sh ######################################## # Script de firewall para um servidor # de internet. ######################################## # Variáveis # Onde está o iptables IPT=\"\$(which iptables)\" # portas tcp que vão ficar abertas PTCP_WEB=\"80,443,53,22\" # Portas udp que vão ficar abertas PUDP_WEB=\"53\" ######################################## # Limpa regras Filter \"\$IPT\" -F \"\$IPT\" -X " >> $ARQ_INTERNET adicional >> $ARQ_INTERNET echo " # Desativa o roteamento. echo 0 > /proc/sys/net/ipv4/ip_forward " >> $ARQ_INTERNET echo " ######################################## # Regras de entrada # Permite pacotes na loopback \"\$IPT\" -A INPUT -i lo -j ACCEPT # Permite conexões nas portas autorizadas # Portas tcp \"\$IPT\" -A INPUT -p tcp -m multiport --dports \"\$PTCP_WEB\" -j ACCEPT # Portas UDP. (Só tem uma porta na variável), mas # uso o parametro multiport, assim pode adicionar # mais portas. \"\$IPT\" -A INPUT -p udp -m multiport --dports \"\$PUDP_WEB\" -j ACCEPT # Limita pings a 1 por segundo. (Dizem que proteje, não faço a minima ideia!!!) \"\$IPT\" -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/s -j ACCEPT # Permite pacotes de resposta e relacionados \"\$IPT\" -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT ######################################### # Regras de bloqueio \"\$IPT\" -A INPUT -j DROP \"\$IPT\" -A FORWARD -j DROP " >> $ARQ_INTERNET sed -i '1d' $ARQ_INTERNET echo "Script salvo em $ARQ_INTERNET" sleep 2 return } ######################################## ######################################## # Testes ######################################## # Não quero root. # Primeiro verifica se está como quer # e depois então dá apermissão de # execução e move como root para o # local apropriado. clear if [[ "$UID" -eq 0 ]]; then echo "Este scritp não roda como root." >&2 exit 1 fi ######################################## ######################################## # Começa aqui ######################################## clear echo " Escolha tipo de firewall desejado: 1. Firewall simples apenas para acessar a internet. 2. Firewall para um gateway de rede. 3. Firewall para servidor de internet. 0. Saír " read -p "Digite: [0-3] > " case "$REPLY" in 1) fw_single ;; 2) fw_gw ;; 3) fw_internet ;; 0) echo "Saíndo do script......" sleep 2 exit ;; *) echo "Opção inválida." >&2 sleep 2 exit 1 ;; esac echo " Abra o script, revise, adicione as interfaces correspondentes ao seu caso, e adicione mais portas e regras ou remova regras e portas que se enquadrem ou não á sua situação. No final opcionalmente renomeie o script e torne -o executavel: \"chmod 755 script\"; e mova -o para o local apropriado para ser usado. NÃO CONFIE CEGAMENTE NAS REGRAS DO SCRIPT!!! É apenas um exemplo, ou ponto de partida. " ######################################## exit 0 ########################################
APACHE - Script para gerenciar usuários do apache
Ubuntu - Removendo kernels antigos
Nenhum comentário foi encontrado.
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Como renomear arquivos de letras maiúsculas para minúsculas
Imprimindo no formato livreto no Linux
Vim - incrementando números em substituição
Efeito "livro" em arquivos PDF
Como resolver o erro no CUPS: Unable to get list of printer drivers
Melhores Práticas de Nomenclatura: Pastas, Arquivos e Código (2)
Preciso resolver um erro de DPKG (0)
Não to conseguindo resolver este problemas ao instalar o playonelinux (1)
[Python] Automação de scan de vulnerabilidades
[Python] Script para analise de superficie de ataque
[Shell Script] Novo script para redimensionar, rotacionar, converter e espelhar arquivos de imagem
[Shell Script] Iniciador de DOOM (DSDA-DOOM, Doom Retro ou Woof!)
[Shell Script] Script para adicionar bordas às imagens de uma pasta