Regras para um firewall simples de internet

Esse documento tem o intuito de definir algumas regras que podem ser utilizadas para configurar um firewall em pequenas empresas. O firewall conta com duas placas de rede sendo uma ligada a rede interna configurada com ip.rede.interna que usa o dispositivo eth1 e a outra ligada na rede externa com ip real que coloquei como ip.rede.externa e usa o dispositivo eth0. Nesses dois campos é necessário trocar o valor por ips da sua estrutura.

Foi separado também um range diferenciado para a equipe de Suporte Técnico deixando configurado para que somente esses ip’s (que se encontram nesse range) possam acessar o servidor para configurá-lo. A rede conta com um squid e caso não seja exista um squid em sua rede, tire as regras criadas para a porta 3128 TCP descritas abaixo.
Um firewall é criado com regras adicionadas ao Iptables, coloquei nesse artigo algumas regras que estão listadas abaixo e são comentadas mais detalhadamente no final do documento. O script que está descrito abaixo nada mais é do que um arquivo simples em modo de execução que apaga as regras criadas no firewall e cria novas regras dependendo da configuração adicionada.
Segue abaixo um script para um firewall na integra:

echo Carregando os modulos do Firewall
/sbin/modprobe ip_tables
/sbin/modprobe iptable_filter
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ipt_LOG
/sbin/modprobe ipt_state
/sbin/modprobe ipt_MASQUERADE

echo Zerando as configuracoes do firewall atuais
iptables -F
iptables -Z
iptables -X
iptables -t nat -F

echo Colocando regras padroes INPUT (o que não estiver definido nas outras regras, seguem essas)
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

echo Colocando regras para Gateway
echo “1″ > /proc/sys/net/ipv4/ip_forward
echo “1″ > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

echo Aceitando todas solicitacoes vindas das placas internas
iptables -A INPUT -p ALL -s 127.0.0.1 -i lo -j ACCEPT
iptables -A INPUT -p ALL -s ip.rede.interna -i lo -j ACCEPT
iptables -A INPUT -p ALL -s ip.rede.externa -i lo -j ACCEPT

echo Aceitando todas solicitacoes da rede rede.do.suporte (range do suporte)
iptables -A INPUT -p ALL -s rede.do.suporte/24 -i eth1 -j ACCEPT

echo Manter comunicacoes ja estabelecidas
iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT

echo Gerando logs de pacotes fragmentados
# iptables -A INPUT -i eth0 -f -j LOG –log-prefix “Pacote INPUT fragmentado: “(os logs estão definidos para jogar os dados na tela, estão comentados, sinta-se livre para tirar o comentário #)

echo Bloqueando spoofing vindos para a interface da internet
iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth0 -s 224.0.0.0/4 -j DROP
iptables -A INPUT -i eth0 -s 240.0.0.0/5 -j DROP

echo Regras para o icmp
iptables -A INPUT -p icmp –icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp –icmp-type 0 -j ACCEPT

echo Abre as portas do squid para a rede interna
iptables -A INPUT -p TCP -i eth1 –dport 3128 -j ACCEPT

echo Abre o ssh e o webmin para a rede rede.suporte
iptables -A INPUT -p TCP -i eth1 -s rede.suporte/24 –dport 22 -j ACCEPT
iptables -A INPUT -p TCP -i eth1 –dport 10000 -j ACCEPT

echo Rejeitar acesso a 3128 de pacotes resetados
iptables -A INPUT -p TCP –dport 3128 -j REJECT –reject-with tcp-reset

echo Nao fazer log de broadcast
iptables -A INPUT -d rede.interna.255 -j DROP

echo Bloqueia o resto fazendo log na tela
#iptables -A INPUT -j LOG –log-prefix “Pacote input descartado: ” (de novo, comentado)

echo Regras padroes FORWARD
iptables -A FORWARD -p tcp –dport 443 -j ACCEPT
iptables -A FORWARD -p icmp –icmp-type 8 -j ACCEPT
iptables -A FORWARD -p icmp –icmp-type 0 -j ACCEPT

echo Colocando regras padroes FORWARD
iptables -A FORWARD -m state –state INVALID -j DROP

echo Mantendo conexoes estabelecidas
iptables -A FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT

echo Aceitando solicitacoes do DNS 200.xxx.xxx.xxx – ida e volta
iptables -A FORWARD -p udp -d 200.xxx.xxx.xxx –dport 53 -j ACCEPT

echo Aceitando POP e SMTP
iptables -A FORWARD -p tcp -m tcp –dport 25 -d 200.xxx.xxx.xxx -j ACCEPT
iptables -A FORWARD -p tcp -m tcp –dport 110 -d 200.xxx.xxx.xxx -j ACCEPT

echo Bloqueia o resto fazendo log na tela
#iptables -A FORWARD -j LOG –log-prefix “Pacote forward descartado: “

echo Criando o PROXY transparente
iptables -t nat -A PREROUTING -i eth1 -p tcp –dport 80 -j REDIRECT –to-port 3128

echo Fazendo um Source NAT na conexão da rede interna
iptables -t nat -A POSTROUTING -s rede.interna/16 -o eth0 -j SNAT –to ip.rede.externa

echo Salvando as regras
iptables-save

echo Fim do script

Abaixo o script é aberto e totalmente comentado explicando para que serve cada linha e porque ela foi colocada. Esse texto tem a intenção de elucidar as configurações do firewall para posterior edição do script e facilitar o acesso aos dados específicos.

O primeiro passo para a criação do firewall é carregar os módulos do firewall com a execução do comando modprobe. Esses módulos são responsáveis pelas funções do iptables e devem ser executados toda vez que o firewall for iniciado. O iní­cio do software é realizado cada vez que o script é iniciado para não correr o risco de ter os módulos não sendo executados.

/sbin/modprobe ip_tables
O módulo ip_tables é o principal modólo do iptables, ele levanta os serviços do firewall.

/sbin/modprobe iptable_filter
O iptables_filter é o módulo que faz filtros de pacotes para o iptables.

/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp
Módulo que realiza o rastreamento de conexão. Os dois são necessários.

/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
Módulo que realiza o NAT (network address translate) que esconde o endereço ip real modificando o pacote dependendo de como foi configurado.

/sbin/modprobe ipt_LOG
Módulo para que o iptables gere logs de entradas.

/sbin/modprobe ipt_state
Módulo para que o iptables crie regras de bloqueio dependendo do estado do pacote.

/sbin/modprobe ipt_MASQUERADE
Módulo que realiza o MASQUERADE que esconde ou mascara o endereço ip real modificando o pacote dependendo de como foi configurado.

O segundo passo é zerar as configurações do firewall visto que novas regras serão adicionadas ao novo firewall. Os comandos abaixo fazem os passos definidos abaixo:

iptables -F
Apaga todas as regras de todas as chains.

iptables -Z
Zera os contadores de todas as chains.

iptables -X
Apaga chains definidas pelos usuários.

iptables -t nat -F
Pega a chain nat (-t) e apaga todas as regras (-F).

Agora iremos definir regras padrões para as três formas de entrada de informações no firewall. As regras padrões servem para que se uma solicitação entra, e não existe regra criada para tratar a solicitação, ela é tratada com o que diz a regra padrão. As entradas são feitas para INPUT (pacotes que chegam para o firewall, tentam acessar o host firewall), FORWARD (pacotes que atravessam o firewall) e OUTPUT (que são pacotes que saem do firewall, sendo pacotes FORWARD mas a regra se aplica na saída).

iptables -P INPUT DROP
iptables -P FORWARD DROP

iptables -P OUTPUT ACCEPT
As regras padrões são criadas para jogar fora todos pacotes que chegam ao firewall ou atravessam ele e são aceitas solicitações de saé­da. A regra padrão sempre é o deny, mas no caso do iptables, é possí­vel utilizar a regra DROP, que além de negar, joga o pacote fora, não dando resposta ao requisitante. A regra de OUTPUT é ACCEPT (aceite) visto que o bloqueio de saí­da é feito pelo FORWARD para as máquinas da rede local. Ele fica aceite para em primeiro lugar permitir que o firewall acesse qualquer porta de hosts fora dele.

A premissa de roteamento para máquinas Linux é o arquivo /proc/sys/net/ipv4/ip_forward, é ele quem controla se o forward (encaminhamento) de pacotes através do host é possí­vel ou não. O forward é a premissa que define se existe um roteamento ou não no host Linux. A configuração do ip_forward é somente um caracter que pode ser 0 para desligado e 1 para ligado.

echo “1″ > /proc/sys/net/ipv4/ip_forward
O comando acima sempre adiciona o dado 1 no arquivo, configurando o mesmo para funcionar o roteamento, premissa básica de firewall e roteador.

echo “1″ > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
O comando acima sempre adiciona o dado 1 no arquivo icmp_echo_ignore_broadcasts, esse arquivo é responsável por fazer o firewall ignorar pacotes echo de broadcasts. A prática de broadcast echo é realizada para detectar hosts ativos na internet e realizar acessos ou invasões.

Para funcionamento do firewall com outros serviços e para fazer o transporte de mensagens, o firewall precisa aceitar todas solicitações vindas de suas placas internas. Para isso é configurado o host para aceitar os endereços de loopback e os endereços de todas suas placas com a regra ACCEPT.
iptables -A INPUT -p ALL -s 127.0.0.1 -i lo -j ACCEPT
iptables -A INPUT -p ALL -s ip.rede.interna -i lo -j ACCEPT
iptables -A INPUT -p ALL -s ip.rede.externa -i lo -j ACCEPT

A partir desse momento é realizada somente regras INPUT. O script possui todas as regras separadas por tipo, primeiro utilizaremos regras INPUT, depois FORWARD, depois OUTPUT e assim por diante.
A regra abaixo libera o range inteiro da equipe de Suporte Técnico para que tenha acesso irrestrito ao firewall podendo acessar qualquer porta do firewall, não da internet. Como a regra é INPUT (chegando ao host), máquinas da rede rede.suporte/24 podem acessar qualquer porta de qualquer protocolo (-p ALL) no host firewall. O -i serve para identificar de onde o pacote pode vir. A eth1 é a placa da rede interna. Então máquinas do suporte podem acessar o firewall somente pela LAN.
iptables -A INPUT -p ALL -s rede.suporte/24 -i eth1 -j ACCEPT

iptables -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
Essa regra utiliza o critério state para o pacote. Ele verifica qual é o estado do pacote para permitir ou negar a utilização do mesmo. Com esse comando estamos deixando que pacotes de conexões já estabelecidas ou solicitadas possam acessar o firewall. Isso é importante para manter comunicações TCP/IP.

# iptables -A INPUT -i eth0 -f -j LOG –log-prefix “Pacote INPUT fragmentado: ”
O comando acima serve para que pacotes que cheguem pela placa eth0 sejam colocados em LOG com o prefixo (texto antes do log) definido acima. O log irá aparecer na tela (tty) que se está utilizando e não é gerado em arquivo.
O # é utilizado para comentar a linha do firewall, indicando que a regra não está sendo aplicada mas caso exista a necessidade, somente é necessário descomentar a linha.

iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP
iptables -A INPUT -i eth0 -s 224.0.0.0/4 -j DROP
iptables -A INPUT -i eth0 -s 240.0.0.0/5 -j DROP
Esses comando servem para restringir o spoofing vindo da internet. Eles definem que redes privatas, que não deveriam estar trafegando na internet acessem o firewall, o confundindo se passando por máquinas da rede interna.

iptables -A INPUT -p icmp –icmp-type 8 -j ACCEPT
iptables -A INPUT -p icmp –icmp-type 0 -j ACCEPT
Essas regras servem para controlar o ICMP da rede. Elas definem que o tipo 8 e 0 de ICMP podem chegar ao firewall que são Echo Reply e Echo request permitindo que o firewall lance solicitações Echo (ping) e as responda.

iptables -A INPUT -p TCP -i eth1 –dport 3128 -j ACCEPT
Essa regra abre as portas do squid para a rede interna para que as máquinas possam acessar a internet indo buscar informações de hosts e páginas pelo Squid.

iptables -A INPUT -p TCP -i eth1 -s rede.suporte/24 –dport 22 -j ACCEPT
iptables -A INPUT -p TCP -i eth1 -s rede.suporte/24 –dport 10000 -j ACCEPT
Abre o acesso ao ssh e o webmin para a rede rede.suporte/24 através da rede eth1 da rede interna que é o range do suporte.

iptables -A INPUT -p TCP –dport 3128 -j REJECT –reject-with tcp-reset
Essa regra rejeita o acesso a porta 3128 do Squid de pacotes resetados criados pela rede.

iptables -A INPUT -d rede.interna.255 -j DROP
Como iremos fazer abaixo log de todos os pacotes que não se encaixarem nas regras acima, e para não encher de logs de broadcast, iremos descartar pacotes broadcast primeiro.

#iptables -A INPUT -j LOG –log-prefix “Pacote input descartado: ”
Faz log de todos os pacotes que não se encaixarem nas regras acima. Logo após a criação dos logs, os pacotes que não se encaixaram nas regras acima irão ser tratados pela regra padrão que é de DROP, descartar o pacote.

iptables -A FORWARD -p tcp –dport 443 -j ACCEPT
iptables -A FORWARD -p icmp –icmp-type 8 -j ACCEPT
iptables -A FORWARD -p icmp –icmp-type 0 -j ACCEPT
Algumas regras comuns em firewall que permitem o FORWARD de pacotes para a porta 443 que é SSL (conexão segura). Essa regra permite toda a rede acessar essa porta. Também permite que solicitações Echo Reply e Echo Request possa trafegar pelo firewall, permitindo o ping entre as redes interna e externa.

iptables -A FORWARD -m state –state INVALID -j DROP
Essa regra descarta todos os pacotes que possuem o estado de Invalido em seu cabeçalho.

iptables -A FORWARD -m state –state RELATED,ESTABLISHED -j ACCEPT
Com esse comando estamos deixando que pacotes de conexões já estabelecidas ou solicitadas possam atravessar o firewall. Isso é importante para manter comunicações TCP/IP entre hosts de direferentes redes.

iptables -A FORWARD -p udp -d 200.xxx.xxx.xxx –dport 53 -j ACCEPT
Essa regra é adicionada para permitir que as máquinas da rede acessem o servidores DNS que se encotram nos endereços 200.xxx.xxx.xxx. A conexão entre estação e servidor DNS é realizada pela porta 53 em protocolo UDP e com isso é possí­vel baixar dados de DNS através da rede.

iptables -A FORWARD -p tcp -m tcp –dport 25 -d 200.xxx.xxx.xxx -j ACCEPT
iptables -A FORWARD -p tcp -m tcp –dport 110 -d 200.xxx.xxx.xxx -j ACCEPT
Essa regra permite que as máquinas da rede local baixem e enviem e-mails utilizando somente o servidor 200.xxx.xxx.xxx.

#iptables -A FORWARD -j LOG –log-prefix “Pacote forward descartado: ”
Fazendo log de todos os pacotes que não se aplicaram as regras acima para gerarem logs na tela. Como abaixo os pacotes são testados pela regra padrão do FORWARD que é DROP, todos os pacotes que chegaram até aqui serão descartados. O comando se encontra comentado pois não está sendo executado.

iptables -t nat -A PREROUTING -i eth1 -p tcp –dport 80 -j REDIRECT –to-port 3128
Essa regra serve para criar o serviço de PROXY transparente, com isso as solicitações na porta 80 TCP que são solicitações de páginas, são encaminhadas para a porta 3128 que é a porta do Proxy. Com isso é realizado o registro e verificação de todos os sites acessados pela rede interna. O Proxy transparente exige que se faça adição de comando na configuração do SQUID. Com esse comando não se faz necessário cadastrar o proxy nos software Internet Explorer ou Mozilla Firefox visto que as soliticações são encaminhadas automaticamente.

iptables -t nat -A POSTROUTING -s rede.interna/16 -o eth0 -j SNAT –to ip.rede.externa
Essa regra fax o chamado source NAT que é o mascaramento das solicitações saí­ntes. Com isso os pacotes da rede interna que vão para a internet saem com o endereço ip do firewall. Ao pacote retornar para o servidor (firewall), o mesmo sabe que foi realizado o NAT e encaminha o pacote para a máquina da rede interna.

iptables-save<>Salva as regras do firewall na tabela do Iptables

Finalizado o script.

Para ter o firewall funcionando, somente se faz necessário colocar as regras acima em um arquivo com o comando vi script_algumacoisa e dar permissão de execução para o script com o comando “chmod 700 script”. Com isso para rodar o firewall só é necessário executar o script com o comando “./script_algumacoisa”.

Após esse processo é só verificar como se comporta seu novo componente de segurança da rede.

Rodrigo de Oliveira Menezes

permalinkPermalink CommentComments (0)

Leave a Reply

Modelo de CSS feito por RamblingSoul | O tema Tomodachi foi desenvolvido por Theme Lab