Configuração de FW de Borda

Aqui vamos configurar o Firewall de borda, este é o Firewall que vai ficar virado para a internet.

O que precisamos:

  • Nome: fw
    • Interface LAN: eth0
    • Interface WAN: eth1
    • IP LAN: 192.168.1.34
    • Rede LAN: 192.168.1.0/24
    • IP WAN1: 200.200.200.1
    • IP WAN2: 200.200.200.2
    • IP GW Provedor: 200.200.200.254
    • Rede WAN: 200.200.200.0/24
  • IP DNS1: 192.168.1.30
  • IP DNS2: 192.168.1.31
  • IP Email: 192.168.1.33
  • IP FW-LAN: 192.168.1.35

Agora vamos configurar as interfaces de rede

vim /etc/network/interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    address 192.168.1.34
    netmask 255.255.255.0
    network 192.168.1.0
    broadcast 192.168.1.255
    
auto eth1
iface eth1 inet static
    address 200.200.200.1
    netmask 255.255.255.0
    network 200.200.200.0
    broadcast 200.200.200.255
    gateway 200.200.200.254
    
auto eth1:0
iface eth1:0 inet static
    address 200.200.200.2
    netmask 255.255.255.0
    network 200.200.200.0
    broadcast 200.200.200.255

Agora vamos habilitar o roteamento neste servidor

sed -i 's/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/g' /etc/sysctl.conf

Agora vamos carregar esta configuração

sysctl -p

Agora vamos criar o diretório que vai armazenar os arquivo de controle do FW

mkdir -p /etc/firewall

Agora vamos criar o arquivo que vai controlar os módulos do kernel que vão ser carregados

vim /etc/firewall/kernel_modulos
### OPCOES DO KERNEL ###
### HABILITA REPASSE DE PACOTES ###
echo 1 > $PSNI/ip_forward
# HABILITAR PROTECAO CONTRA SYNFLOOD
echo 1 > $PSNI/tcp_syncookies
# HABILITAR VERIFICACAO DE ROTA DE ORIGEM (PROTECAO P/ IP SPOOFING)
for RP in $PSNI/conf/*/rp_filter ; do echo 1 > $RP ; done
# CONTROLE DE ICMPP
echo 0 > $PSNI/icmp_echo_ignore_all
echo 1 > $PSNI/icmp_echo_ignore_broadcasts

### CARREGANDO MÓDULOS ##
${MODPROBE} ip_conntrack
${MODPROBE} ip_conntrack_ftp
${MODPROBE} ip_nat_ftp

Agora vamos criar o arquivo que faz o controle dos repositórios do Debian

vim /etc/firewall/libera_repositorios
### LIBERA ATUALIZAR OS REPOSITORIOS ###
for END in $(cat ${REPOSITORIOS} | grep -v "^#" | sort)
do
${IPTABLES} -A OUTPUT -d ${END} -j ACCEPT ${COM} "REPOSITORIOS"
${IPTABLES} -A FORWARD -d ${END} -s ${REDE_LAN} -j ACCEPT ${COM} "REPOSITORIOS"
${IPTABLES} -A POSTROUTING -t nat -s ${REDE_LAN} -d ${END} ${TCP} -m multiport --dports 21,80,443 -j MASQUERADE ${COM} "MASQUERADE REPOSITORIOS"
done

Agora vamos criar o arquivo que vai conter os repositórios do Debian

vim /etc/firewall/repositorios
#ARQUIVOS DE CONTROLE DOS REPOSTORIOS
#INSIRA UM REPOSITORIO POR LINHA
#REPOSITORIO OFICIAL
ftp.br.debian.org
ftp.us.debian.org
#REPOSITORIO DA PUC
ftp.pucpr.br
# REPOSITORIO DE ATUALIZACOES FREQUENTES
Volatile.debian.org
# REPOSITORIO DE ATUALIZACOES DE SEGURANCA
security.debian.org
# REPOSITORIO BACKPORT
www.backports.org
www.debian-multimedia.org
# PHP5 BACKPORT
packages.dotdeb.org
# GPG
pgp.uni-mainz.de

Agora vamos criar o arquivo que contém as variáveis que vão ser utilizadas no script

vim /etc/firewall/variaveis
### CORES UTILIZADAS NO SCRIPT ###
GREY="\033[01;30m"
RED="\033[01;31m"
GREEN="\033[01;32m"
YELLOW="\033[01;33m"
BLUE="\033[01;34m"
PURPLE="\033[01;35m"
CYAN="\033[01;36m"
WHITE="\033[01;37m"
CLOSE="\033[m"
 
 
###  CAMINHO DAS VARIAVEIS DO IPV4 NO KERNEL ###
PSNI=/proc/sys/net/ipv4
 
### REDES ###
REDE_LAN='192.168.1.0/24'
 
### INTERFACES DE REDE ###
IF_LAN='eth0'
IF_WAN='eth1'
 
### LAN ###
LAN_DNS1="192.168.1.30"
LAN_DNS2="192.168.1.31"
LAN_MAIL="192.168.1.33"
FWLAN="192.168.1.35"
 
### EXTERNOS ###
EXT_COPELF1="200.200.200.1"
EXT_COPELF2="200.200.200.2"
 
### PORTAS ###
SSH_PORT="22"
DNS_PORT="53" 
HTTP_PORT="80"
HTTPS_PORT="443"
AUTH_PORT="113"
NTP_PORT="123"
PGP_PORT="11371"
MAIL_PORT="25,80,110,143,443,465,587,993,995"
 
### Comandos ###
IPTABLES=$(which iptables)
MODPROBE=$(which modprobe)
COM="-m comment --comment"
TCP="-p tcp -m tcp" 
UDP="-p udp -m udp"
ICMP="-p icmp --icmp-type"
LIMIT="-m limit --limit" 
MULTIPORT="-m multiport --dports"
LOG="LOG --log-prefix"
LOG_LEV="--log-level info"
PRE_EXT="${IPTABLES} -A PREROUTING -t nat -i ${IF_WAN} "
POS_EXT="${IPTABLES} -A POSTROUTING -t nat -o ${IF_WAN} "
IN_OU_FO="INPUT OUTPUT FORWARD"
IN_OU="INPUT OUTPUT"
IN_FO="INPUT FORWARD"
OU_FO="OUTPUT FORWARD"
 
### DIRETORIOS E ARQUIVOS ###
REGRAS=/etc/firewall/
REPOSITORIOS=${REGRAS}repositorios

Agora vamos criar o script de FW

vim /etc/init.d/rc.firewall 
#!/bin/sh
#Autor: Douglas Q. dos Santos
#Data: 13/01/2013
### BEGIN INIT INFO
# Provides:             rc.firewall
# Required-Start:       $remote_fs $syslog
# Required-Stop:        $remote_fs $syslog
# Default-Start:        2 3 4 5
# Default-Stop:         
# Short-Description:    Firewall e rotas
### END INIT INFO
 
#CARREGA AS VARIAVEIS PARA O SCRIPT
. /etc/firewall/variaveis
. /etc/firewall/kernel_modulos
 
 
case $1 in 
  start)
    echo "${GREEN}[         Iniciando Firewall         ]${CLOSE}"
 
    ### LIMPANDO REGRAS E CADEIAS ANTERIORES ###
    ${IPTABLES} -t filter -F
    ${IPTABLES} -t nat -F
    ${IPTABLES} -t mangle -F
    ${IPTABLES} -t filter -X
    ${IPTABLES} -t nat -X
    ${IPTABLES} -t mangle -X
 
    ### LIMPANDO AS POLITICAS DEFAULT ###
    for END in ${IN_OU_FO} 
    do
    ${IPTABLES} -P ${END} ACCEPT
    done
 
    ### DEFININDO POLITICA PADRAO DROP ###
    for END in ${IN_OU_FO} 
    do
    ${IPTABLES} -P ${END} DROP
    done
 
    ### LIBERAR LOOPBACK ###
    ${IPTABLES} -A INPUT -s 127.0.0.1/32 -j ACCEPT ${COM} "Libera a loopback"
    ${IPTABLES} -A OUTPUT -d 127.0.0.1/32 -j ACCEPT ${COM} "Libera a loopback"
 
 
    ### CONTRA ATAQUES 
    for END in ${CHAINS2}
    do 
    ${IPTABLES} -A ${END} -m state --state INVALID -j DROP ${COM} "PACOTES COM ESTADO INVALIDO OU MAL FORMADOS"
    done
 
    ### PACOTES FRAGMENTADOS ###
    for END in ${IN_OU_FO}
    do
    ${IPTABLES} -A ${END} -f -j DROP ${COM} "Pacotes fragmentados"
    done
 
    ### LIBERAR RETORNO DE CONEXOES ###
    for END in ${IN_OU_FO} 
    do
    ${IPTABLES} -A ${END} -m state --state ESTABLISHED,RELATED -j ACCEPT
    done
    
    ###  LIBERAR SSH ###
    ${IPTABLES} -A INPUT -s ${REDE_LAN} ${TCP} --dport ${SSH_PORT} -j ACCEPT ${COM} "LIBERA ${REDE_LAN} ACESSAR O SSH"
    ${IPTABLES} -A OUTPUT -d ${REDE_LAN} ${TCP} --dport ${SSH_PORT} -j ACCEPT ${COM} "SAIDA DE SSH PARA LAN"
 
 
    ### LIBERAR NTP ###
    ${IPTABLES} -A INPUT ${UDP} --dport ${NTP_PORT} -j ACCEPT ${COM} "SERVICO NTP"
    ${IPTABLES} -A OUTPUT ${UDP} --dport ${NTP_PORT} -j ACCEPT ${COM} "SERVICO NTP"
 
 
    ### LIBERAR EMAIL ###
    ### FORWARDS PARA SERVICOS DE EMAIL PORTAS 25,80,110,143,443,465,587,993,995 ###
    ${IPTABLES} -A FORWARD ${TCP} ${MULTIPORT} ${MAIL_PORT} -d ${LAN_MAIL} -j ACCEPT ${COM} "SERVICOES DE EMAIL"
    ${IPTABLES} -A FORWARD ${TCP} ${MULTIPORT} ${MAIL_PORT} -s ${LAN_MAIL} -j ACCEPT ${COM} "SAIDA DO EMAIL"
 
    ### REDIRECIONAMENTOS PARA SERVICOS DE EMAIL PORTAS 25,80,110,143,443,465,993,995 ###
    #AQUI ESTAMOS DIRECIONANDO AS REQUISIÇÕES DA INTERNET VINDAS PARA O IP 200.200.200.1 PARA O SERVIDOR DE EMAIL
    ${PRE_EXT} -d ${EXT_COPELF1} -p tcp ${MULTIPORT} ${MAIL_PORT} -j DNAT --to ${LAN_MAIL} ${COM} "SERVICO DE EMAIL"
    ${POS_EXT} -s ${LAN_MAIL} -p tcp ${MULTIPORT} ${MAIL_PORT} -j SNAT --to ${EXT_COPELF1} ${COM} "SAIDA DO EMAIL"

 
    ### LIBERAR DNS ###
    ### FORWARDS PARA SERVICOS DE DNS PORTA 53 ###
    ### AQUI FOI LIBERADO OS DNS CONSULTAREM OS ROOT MASTER PARA FAZER CONSULTAS RECURSIVAS PARA DMZ ###
    for END in ${IN_OU_FO}
    do
    ${IPTABLES} -A ${END} ${TCP} --dport ${DNS_PORT} -d ${LAN_DNS1} -j ACCEPT ${COM} "SERVICO DNS TCP"
    ${IPTABLES} -A ${END} ${UDP} --dport ${DNS_PORT} -d ${LAN_DNS1} -j ACCEPT ${COM} "SERVICO DNS UDP"
    ${IPTABLES} -A ${END} ${TCP} --dport ${DNS_PORT} -d ${LAN_DNS2} -j ACCEPT ${COM} "SERVICO DNS TCP"
    ${IPTABLES} -A ${END} ${UDP} --dport ${DNS_PORT} -d ${LAN_DNS2} -j ACCEPT ${COM} "SERVICO DNS UDP"
    done
 
    ### LIBERA SAIDA DOS SERVIDORES DNS TCP/UDP E SERVIDOR LOCAL -> DNSSERVERS ###
    ${IPTABLES} -A FORWARD ${TCP} --dport ${DNS_PORT} -s ${LAN_DNS1} -j ACCEPT ${COM} "SERVICO DNS1"
    ${IPTABLES} -A FORWARD ${TCP} --dport ${DNS_PORT} -s ${LAN_DNS2} -j ACCEPT ${COM} "SERVICO DNS2"
    ${IPTABLES} -A FORWARD ${UDP} --dport ${DNS_PORT} -s ${LAN_DNS1} -j ACCEPT ${COM} "SERVICO DNS1"
    ${IPTABLES} -A FORWARD ${UDP} --dport ${DNS_PORT} -s ${LAN_DNS2} -j ACCEPT ${COM} "SERVICO DNS2"
    ${IPTABLES} -A OUTPUT ${TCP} --dport ${DNS_PORT} -d ${LAN_DNS1} -j ACCEPT ${COM} "ACESSO SERVICO DNS1"
    ${IPTABLES} -A OUTPUT ${TCP} --dport ${DNS_PORT} -d ${LAN_DNS2} -j ACCEPT ${COM} "ACESSO SERVICO DNS2"
    ${IPTABLES} -A OUTPUT ${UDP} --dport ${DNS_PORT} -d ${LAN_DNS1} -j ACCEPT ${COM} "ACESSO SERVICO DNS1"
    ${IPTABLES} -A OUTPUT ${UDP} --dport ${DNS_PORT} -d ${LAN_DNS2} -j ACCEPT ${COM} "ACESSO SERVICO DNS2"

    ### REDIRECIONAMENTOS PARA SERVICO DE DNS PORTA 53 TCP/UDP ###
    #AQUI ESTAMOS DIRECIONANDO AS REQUISIÇÕES VINDAS PARA O IP 200.200.200.1 PARA O NS1 E VINDAS PARA O IP 200.200.200.2 PARA O NS2
    ${PRE_EXT} -d ${EXT_COPELF1} ${TCP} --dport ${DNS_PORT} -j DNAT --to ${LAN_DNS1} ${COM} "SERVICO DNS1"
    ${POS_EXT} -s ${LAN_DNS1} ${TCP} --dport ${DNS_PORT} -j SNAT --to ${EXT_COPELF1} ${COM} "SAIDA DNS1"
    ${PRE_EXT} -d ${EXT_COPELF2} ${TCP} --dport ${DNS_PORT} -j DNAT --to ${LAN_DNS2} ${COM} "SERVICO DNS2"
    ${POS_EXT} -s ${LAN_DNS2} ${TCP} --dport ${DNS_PORT} -j SNAT --to ${EXT_COPELF2} ${COM} "SAIDA DNS2"
    ${PRE_EXT} -d ${EXT_COPELF1} ${UDP} --dport ${DNS_PORT} -j DNAT --to ${LAN_DNS1} ${COM} "SERVICO DNS1" 
    ${POS_EXT} -s ${LAN_DNS1} ${UDP} --dport ${DNS_PORT} -j SNAT --to ${EXT_COPELF1} ${COM} "SAIDA DNS1"
    ${PRE_EXT} -d ${EXT_COPELF2} ${UDP} --dport ${DNS_PORT} -j DNAT --to ${LAN_DNS2} ${COM} "SERVICO DNS2"
    ${POS_EXT} -s ${LAN_DNS2} ${UDP} --dport ${DNS_PORT} -j SNAT --to ${EXT_COPELF2} ${COM} "SAIDA DNS2"
    
    ### REDIRECIONAMENTO PARA PORTA 80 DESCOMENTAR AS LINHAS ABAIXO E MUDAR O SERVIDOR ###
    #${PRE_EXT} -d ${EXT_COPELF3} ${TCP} --dport ${HTTP_PORT} -j DNAT --to ${LAN_WEB} ${COM} "WEB GLPI"
    #${IPTABLES} -A FORWARD -s ${LAN_WEB}  ${TCP} --dport ${HTTP_PORT} -j ACCEPT ${COM} "LAN WEB"
    #${IPTABLES} -A FORWARD -d ${LAN_WEB}  ${TCP} --dport ${HTTP_PORT} -j ACCEPT ${COM} "LAN WEB"
    #${IPTABLES} -t nat -A POSTROUTING -s ${LAN_WEB} ${TCP} --dport ${HTTP_PORT} -j SNAT --to ${EXT_COPELF3} ${COM} "LAN WEB"
 
 
    ### PGP PRECISAMOS DESSAS REGRAS PARA IMPORTAÇÃO DE CHAVES PARA REPOSITÓRIOS ###
    ${IPTABLES} -A INPUT ${TCP} --dport ${PGP_PORT} -j ACCEPT ${COM} "SERVICO PGP"
    ${IPTABLES} -A OUTPUT ${TCP} --dport ${PGP_PORT} -j ACCEPT ${COM} "SERVICO PGP"
    ${IPTABLES} -A FORWARD ${TCP} --dport ${PGP_PORT} -d ${REDE_LAN} -j ACCEPT ${COM} "SERVICO PGP"

    ### CONTROLE DE ICMP ###
    for END in ${IN_OU_FO}
    do
    ${IPTABLES} -A ${END} ${ICMP} 0 ${LIMIT} 1/s -j ACCEPT ${COM} "Controle de ping"
    ${IPTABLES} -A ${END} ${ICMP} 8 ${LIMIT} 1/s -j ACCEPT ${COM} "Controle de ping"
    done
    ${IPTABLES} -t nat -A POSTROUTING ${ICMP} 0 ${LIMIT} 1/s -j MASQUERADE ${COM} "Controle de ping"
    ${IPTABLES} -t nat -A POSTROUTING ${ICMP} 8 ${LIMIT} 1/s -j MASQUERADE ${COM} "Controle de ping"

    ### Port SCANNER e PS E SF
    for END in ${IN_OU_FO} 
    do
    ${IPTABLES} -A ${END} ${TCP} --tcp-flags ALL FIN,URG,PSH -j DROP ${COM} "PS e SF"
    ${IPTABLES} -A ${END} ${TCP} --tcp-flags SYN,RST SYN,RST -j DROP ${COM} "PS e SF"
    ${IPTABLES} -A ${END} ${TCP} --tcp-flags SYN,FIN SYN,FIN -j DROP ${COM} "PS e SF"
    ${IPTABLES} -A ${END} ${TCP} --tcp-flags ALL NONE        -j DROP ${COM} "PS e SF"
    ${IPTABLES} -A ${END} ${TCP} --sport 0 --tcp-flags FIN,SYN,RST,ACK SYN -j DROP ${COM} "PS e SF"
    ${IPTABLES} -A ${END} ${TCP} --syn ${LIMIT} 2/s -j ACCEPT ${COM} "PS e SF"
    ${IPTABLES} -A ${END} ${TCP} --tcp-flags SYN,ACK,FIN,RST RST ${LIMIT} 1/s -j ACCEPT ${COM} "PS e SF"
    ${IPTABLES} -A ${END} ${TCP} --tcp-flags SYN,ACK,FIN,RST RST ${LIMIT} 1/s -j ACCEPT ${COM} "PS E SF"
    ${IPTABLES} -A ${END} ${TCP} --dport ${AUTH_PORT} -j REJECT --reject-with tcp-reset ${COM} "Nega identificacao"
    ${IPTABLES} -A ${END} ${TCP} -j REJECT --reject-with tcp-reset ${COM} "Reseta conexoes em portas desconhecidas"
    done
 
    ## VAMOS MASCARAR A SAIDA DO FW-LAN
    ${IPTABLES} -A POSTROUTING -t nat -s ${FWLAN} -j MASQUERADE ${COM} "MASQUERADE FW-LAN"
    
    ### REGRAS DE MASQUERADE REPOSITORIOS ###
    ${IPTABLES} -A POSTROUTING -t nat -s ${REDE_LAN} ${TCP} ${MULTIPORT} 21,80,443 -j MASQUERADE ${COM} "Masquerade da DMZ"
    
    ### LIBERA REPOSITORIOS ###
    #. /etc/firewall/libera_repositorios 
 
   echo "${GREEN}[         Firewall Iniciado          ]${CLOSE}"
 
  ;;
  stop)
   echo "${RED}[         Parando Firewall ...       ]${CLOSE}";
    ### LIMPANDO REGRAS E CADEIAS ANTERIORES ###
    ${IPTABLES} -t filter -F
    ${IPTABLES} -t nat -F
    ${IPTABLES} -t mangle -F
    ${IPTABLES} -t filter -X
    ${IPTABLES} -t nat -X
    ${IPTABLES} -t mangle -X
 
    ### LIMPANDO AS POLITICAS DEFAULT ###
    ${IPTABLES} -P INPUT ACCEPT
    ${IPTABLES} -P FORWARD ACCEPT
    ${IPTABLES} -P OUTPUT ACCEPT
 
    ### REGRAS DE MASQUERADE PARA LAN ###
    ${IPTABLES} -A POSTROUTING -t nat -s ${REDE_LAN} -j MASQUERADE ${COM} "Masquerade da LAN com o firewall em stop"
 
   echo  "${RED}[         Firewall Parado            ] ${CLOSE}";
 
  ;;
   status)
   echo  "${RED}########################################################################################";
   echo  "*******************************Table Filter*********************************************${CLOSE}";
   ${IPTABLES} -t filter -L -n
   echo  "${RED}########################################################################################";
   echo  "********************************Table Nat***********************************************${CLOSE}";
   ${IPTABLES} -t nat -L -n
   ;;
 
   restart)
     $0 stop
     $0 start
   ;;
 
  *)
   echo  "${RED}Opcoes Validas:(start|stop|restart|status)${CLOSE}"
  ;;
esac

Agora vamos dar permissão ao nosso script

chmod +x /etc/init.d/rc.firewall

Agora vamos colocar ele na inicialização do sistema

insserv -f -v rc.firewall

Agora precisamos ajustar o dns do nosso servidor FW para ser o ns1 e ns2

vim /etc/resolv.conf
nameserver 192.168.1.30
nameserver 192.168.1.31

Agora vamos testar o nosso script

/etc/init.d/rc.firewall restart
[         Parando Firewall ...       ]
[         Firewall Parado             ] 
[         Iniciando Firewall          ]
[         Firewall Iniciado            ]

Agora precisamos ajustar o Gateway dos servidores ns1, ns2, email e fw-lan para utilizarem o 192.168.1.34, pois ele que vai mandar todo mundo para a internet e vai direcionar as requisições para os ips públicos para os seus devidos servidores :D

Para ajustar o gw deles precisamos mudar o gateway deles em /etc/network/interfaces como ex no servidor ns1

vim /etc/network/interfaces
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
        address 192.168.1.30
        netmask 255.255.255.0
        network 192.168.1.0
        broadcast 192.168.1.255
        gateway 192.168.1.34

Agora é só reiniciar o servidor para ele pegar as novas configurações

Agora no ns1 vamos testar a conexão com a internet

ping www.terra.com.br -c 2
PING www.terra.com.br (200.154.56.80) 56(84) bytes of data.
64 bytes from www.terra.com.br (200.154.56.80): icmp_req=1 ttl=54 time=17.4 ms
64 bytes from www.terra.com.br (200.154.56.80): icmp_req=2 ttl=54 time=17.1 ms

--- www.terra.com.br ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 17.188/17.298/17.408/0.110 ms

Vamos ver a tabela de rotas do servidor ns1

route -n
Tabela de Roteamento IP do Kernel
Destino         Roteador        MáscaraGen.    Opções Métrica Ref   Uso Iface
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.1.34    0.0.0.0         UG    0      0        0 eth0