fwgen - gerador de regras de firewall iptables
Publicado por Pedro Fernandes (última atualização em 30/01/2020)
[ Hits: 3.439 ]
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
########################################
ytmp - Youtube no console com youtube-dl + mplayer.
Script para renomear vários arquivos ao mesmo tempo.
Filtro para importação de extrato do Banco do Brasil para Kmymoney
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Programa fora de escala na tela do pc (34)
Instalação dualboot Windows 11 e Debian 13 (0)
Eu queria adicionar a incon do wifi e deixa transparente no fluxbox no... (0)









