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

Download 7032.fwgen




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.

  



Esconder código-fonte

#!/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

########################################

Scripts recomendados

Album de fotografias v1.1

Album virtual para WEB

APACHE - Script para gerenciar usuários do apache

Ubuntu - Removendo kernels antigos

Calculadora (Free Pascal)


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts