fwgen - gerador de regras de firewall iptables

Publicado por Pedro Fernandes (última atualização em 30/01/2020)

[ Hits: 976 ]

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: [email protected]
#
########################################



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

Script bem simples para eniar e-mail com arquivo em anexo.

Compactar e descompactar arquivos de forma simples

Cria cabeçalhos para shell scripts

Grave arquivos em pendrive sem sistema de arquivos

Mudar aleatoriamente o papel de parede no GNOME 3


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts