Instalação e configuração de servidor DHCP + DNS + Firewall da LAN + Debian Squeeze

  • Domínio que vamos utilizar: douglasqsantos.com.br
  • Faixa de ip: 192.168.1.0/24
  • Ip do Servidor: 192.168.1.35

Prepare o seu sistema com o seguinte script http://wiki.douglasqsantos.com.br/doku.php/confinicialsqueeze_en para que não falte nenhum pacote ou configuração.

Vamos atualizar os repositórios e fazer um upgrade do sistema

aptitude update && aptitude dist-upgrade -y

Agora vamos instalar o bind

aptitude install bind9 dnsutils -y

Agora vamos parar ele para fazer algumas manutenções

/etc/init.d/bind9 stop

Vamos criar os diretorios necessários

mkdir -p /var/lib/named/etc
mkdir -p /var/lib/named/dev
mkdir -p /var/lib/named/var/log
mkdir -p /var/lib/named/var/cache/bind
mkdir -p /var/lib/named/var/cache/bind/dynamic
mkdir -p /var/lib/named/var/run/bind/run
mknod /var/lib/named/dev/null c 1 3
mknod /var/lib/named/dev/random c 1 8
mknod /var/lib/named/dev/zero c 1 8

Vamos acertar as permissões

chmod 666 /var/lib/named/dev/{null,random,zero}
chown -R bind:bind /var/lib/named/var/*

Vamos acertar a localização dos diretórios e as permissões

mv /etc/bind /var/lib/named/etc
ln -sf /var/lib/named/etc/bind /etc/bind
cp /etc/localtime /var/lib/named/etc
chown -R bind:bind /var/lib/named/etc/bind
chown -R root:bind /var/lib/named/var/cache/bind/dynamic
chmod -R 775 /var/lib/named/var/cache/bind/dynamic

Vamos fazer backup do arquivo de configuração

cp -Rfa /etc/default/bind9{,.bkp}

Vamos informar para o bind aonde fica a jaula

vim /etc/default/bind9
RESOLVCONF=yes 
OPTIONS="-u bind -t /var/lib/named" 

Acertando o arquivo que controla a consulta de dns

vim /etc/resolv.conf
domain douglasqsantos.com.br
nameserver 192.168.1.35

Gerando a chave para o DHCP poder atualizar as zonas de DNS

cd /etc/bind/
dnssec-keygen -r /dev/urandom -a hmac-md5 -b 128 -n USER dhcpupdate

Agora vamos visualizar o conteudo da nossa chave, vamos utilizar ela no arquivo de zonas e no arquivo de configuração do DHCP.

cat /etc/bind/K*.key
dhcpupdate. IN KEY 0 3 157 +AxtjQ+EUNBCD2JfPyA/UA==

Vamos acertar algumas opções do bind

vim /etc/bind/named.conf.options
#/etc/bind/named.conf.options
options {
 directory "/var/cache/bind";
 managed-keys-directory "/var/cache/bind/dynamic";
 auth-nxdomain no;
 listen-on-v6 { any; };
 listen-on { 127.0.0.1/32; 192.168.1.0/24; };
 allow-query { any; };
 recursion no;
 version "Nao Disponivel";
 ### Habilita DNSSEC ###
 dnssec-enable no;
 dnssec-validation no;
 dnssec-lookaside auto;
};
 
#Controles 
include "/etc/bind/rndc.key";
controls {
        inet 127.0.0.1 port 953 allow { 127.0.0.1; } keys { rndc-key; };
};
 
#LOGS
logging {
 channel xfer-log {
 file "/var/log/named.log";
 print-category yes;
 print-severity yes;
 print-time yes;
 severity info;
 };
 category xfer-in { xfer-log; };
 category xfer-out { xfer-log; };
 category notify { xfer-log; };
 
 channel update-debug {
 file "/var/log/named-update-debug.log";
 severity  debug 3;
 print-category yes;
 print-severity yes;
 print-time      yes;
 };
 channel security-info    {
 file "/var/log/named-auth-info.log";
 severity  info;
 print-category yes;
 print-severity yes;
 print-time      yes;
 };
 category update { update-debug; };
 category security { security-info; };
 
 };

Vamos acertar as referências de arquivos para o bind

vim /etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.internal-zones";

Criando o arquivo que vai conter as zonas internas

vim /etc/bind/named.conf.internal-zones
#Definindo quem vão ser os nossos hosts internos, ex: a nossa rede e a maquina local
acl "internal_hosts" {
 192.168.1.0/24;
 127.0.0.1/32;
};
 
 
#Definição da View interna
view "internal" {
 
#Definindo quais clientes vão poder consultar essa view
 match-clients {
 internal_hosts;
 };
 
#O nossos clientes da view interna vão poder efetuar consultas recursivas
 recursion yes;
 
 
#Zonas hint aonde temos as definições dos root masters
 zone "." {
 type hint;
 file "/etc/bind/db.root";
 };
 
#Zonas internas
 zone "localhost" {
 type master;
 file "/etc/bind/db.local";
 };
 
zone "127.in-addr.arpa" {
 type master;
 file "/etc/bind/db.127";
 };
 
 zone "0.in-addr.arpa" {
 type master;
 file "/etc/bind/db.0";
 };
 
 zone "255.in-addr.arpa" {
 type master;
 file "/etc/bind/db.255";
 };
 
 #As consultas para o dominio douglasqsantos.com.br vamos mandar para o servidor ns1 e ns2
 zone "douglasqsantos.com.br" {
 type forward;
 forwarders { 192.168.1.30; 192.168.1.31; };
 };

 #Dominios locais
 zone "douglasqsantos.com.br" {
 type master;
 file "db.douglasqsantos.com.br.internal";
 allow-transfer { none; };
 allow-update { key dhcpupdate; };
 };
 
#Zona reversa do dominio na rede 192.168.1.0/24
zone "1.168.192.in-addr.arpa" {
type master;
file "db.1.168.192.internal";
allow-transfer { none; };
allow-update { key dhcpupdate; };
};   
 
#Chave para sincronismo entre dhcp e dns que visualizamos com o cat /etc/bind/K*.key
key "dhcpupdate" {
algorithm hmac-md5;
secret "+AxtjQ+EUNBCD2JfPyA/UA==";
};
 
};

Criando a zona interna do domínio

vim /var/lib/named/var/cache/bind/db.douglasqsantos.com.br.internal
$TTL 86400
@ IN SOA  dns.douglasqsantos.com.br. root.dns.douglasqsantos.com.br. (
                2013011301  ; Serial
                 3600       ; Refresh
                 1800        ; Retry
                 1209600      ; Expire
                 3600 )     ; Minimum
 
;
 
@               IN      NS   douglasqsantos.com.br.
douglasqsantos.com.br. IN TXT "v=spf1 a mx ip4:192.168.1.0/24 -all"
mail.douglasqsantos.com.br IN TXT "v=spf1 a -all"
 
@               IN      NS   ns1.douglasqsantos.com.br.
@               IN      NS   ns2.douglasqsantos.com.br.
@               IN      MX   0 mail.douglasqsantos.com.br.
 
;NAME SERVERS
@               IN      A    192.168.1.35
ns1             IN      A    192.168.1.35
ns2             IN      A    192.168.1.35
dns             IN      A    192.168.1.35
ldap        IN  A    192.168.1.35
ldap2       IN  A    192.168.1.35
kdc1        IN  A    192.168.1.35
kdc2        IN  A    192.168.1.35
 
;MAIL SERVERS
mail            IN      A    192.168.1.35
imap            IN      CNAME mail
pop             IN      CNAME mail
smtp            IN      CNAME mail
webmail         IN      CNAME mail
 
;WEB SERVERS
www             IN      A    192.168.1.35
ftp             IN      CNAME www
mailadmin       IN      CNAME www
 
; Dominio Kerberos
_kerberos                                               IN TXT           "douglasqsantos.com.br"
_kerberos.srv                                           IN TXT           "douglasqsantos.com.br"
_kerberos._tcp                                          IN SRV 10 1 88   ldap.douglasqsantos.com.br.
_kerberos._udp                                          IN SRV 10 1 88   ldap.douglasqsantos.com.br.
_kerberos-adm._tcp                                      IN SRV 10 1 749  ldap.douglasqsantos.com.br.
_kerberos-master._udp                                   IN SRV 0  0 88   ldap.douglasqsantos.com.br.
_kpasswd._udp                                           IN SRV 10 1 464  ldap.douglasqsantos.com.br.
_ldap._tcp                                              IN SRV 10 1 389  ldap.douglasqsantos.com.br.
 
; Busca de Informações de LDAP e Samba
_ldap_dc                                                IN TXT           "dc=douglasqsantos,dc=com,dc=br"
_samba_pdc_domain                                       IN TXT           "DOUGLASQSANTOS"
_samba_pdc_ip_address                                   IN TXT           "192.168.1.35"

Agora vamos criar a zona inversa

vim /var/lib/named/var/cache/bind/db.1.168.192.internal
$TTL 86400
@ IN SOA  dns.douglasqsantos.com.br. root.dns.douglasqsantos.com.br. (
                        2013130101  ; Serial
                        3600       ; Refresh
                        1800        ; Retry
                        604800      ; Expire
                        3600 )     ; Minimum
 
; 
@       IN  NS   douglasqsantos.com.br.
@               IN  NS   ns1.douglasqsantos.com.br.
@               IN  NS   ns2.douglasqsantos.com.br.
@               IN  MX   0 mail.douglasqsantos.com.br.
 
;NAME SERVERS
35      IN  PTR    douglasqsantos.com.br.
35      IN  PTR    ns1.douglasqsantos.com.br.
35      IN  PTR    ns2.douglasqsantos.com.br.
35      IN  PTR    dns.douglasqsantos.com.br.
 
;LDAP e Kerberos
35  IN  PTR    ldap.douglasqsantos.com.br.
35  IN  PTR    ldap2.douglasqsantos.com.br.
35  IN  PTR    kdc1.douglasqsantos.com.br.
35  IN  PTR    kdc2.douglasqsantos.com.br.
 
;MAIL SERVERS
35    IN    PTR    mail.douglasqsantos.com.br.
 
;WEB SERVERS
35      IN  PTR    www.douglasqsantos.com.br.

Agora vamos reiniciar o nosso bind

/etc/init.d/bind9 restart

Vamos testar uma consulta

nslookup www
Server:     192.168.1.35
Address:    192.168.1.35#53
 
Name:   www.douglasqsantos.com.br
Address: 192.168.1.35

Vamos testar o reverso

host 192.168.1.35
35.1.168.192.in-addr.arpa domain name pointer dns.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa domain name pointer ns1.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa domain name pointer ns2.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa domain name pointer www.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa domain name pointer kdc1.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa domain name pointer kdc2.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa domain name pointer ldap.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa domain name pointer mail.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa domain name pointer ldap2.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa domain name pointer douglasqsantos.com.br.

Vamos testar o reverso agora pelo dig

dig -x 192.168.1.35

; <<>> DiG 9.7.3 <<>> -x 192.168.1.35
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 62752
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 10, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;35.1.168.192.in-addr.arpa. IN  PTR

;; ANSWER SECTION:
35.1.168.192.in-addr.arpa. 86400 IN PTR kdc1.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa. 86400 IN PTR kdc2.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa. 86400 IN PTR ldap.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa. 86400 IN PTR mail.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa. 86400 IN PTR ldap2.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa. 86400 IN PTR dns.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa. 86400 IN PTR douglasqsantos.com.br.
35.1.168.192.in-addr.arpa. 86400 IN PTR ns1.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa. 86400 IN PTR ns2.douglasqsantos.com.br.
35.1.168.192.in-addr.arpa. 86400 IN PTR www.douglasqsantos.com.br.

;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 86400   IN  NS  ns1.douglasqsantos.com.br.
1.168.192.in-addr.arpa. 86400   IN  NS  ns2.douglasqsantos.com.br.
1.168.192.in-addr.arpa. 86400   IN  NS  douglasqsantos.com.br.

;; ADDITIONAL SECTION:
douglasqsantos.com.br.        86400   IN  A   192.168.1.35
ns1.douglasqsantos.com.br.        86400   IN  A   192.168.1.35
ns2.douglasqsantos.com.br.        86400   IN  A   192.168.1.35

;; Query time: 0 msec
;; SERVER: 192.168.1.35#53(192.168.1.35)
;; WHEN: Sun Jan 13 21:02:43 2013
;; MSG SIZE  rcvd: 325

Instalação e Configuração do DHCP

Agora vamos instalar o servidor DHCP

aptitude install isc-dhcp-server -y

Vai ocorrer um erro a respeito da interface de rede mais isso vamos corrigir mais a frente

Agora vamos fazer o backup do arquivo do dhcpd

cp -Rfa /etc/dhcp/dhcpd.conf{,.bkp}

Vamos editar o arquivo de configuração do dhcp server

vim /etc/dhcp/dhcpd.conf
#Definindo o dominio
option domain-name "douglasqsantos.com.br"; 
#Definindo os servidores de DNS
option domain-name-servers 192.168.1.35, 192.168.1.30;
#Definindo o servidor de NetBios(WINS)
option netbios-name-servers 192.168.1.35;
#Definindo o tipo de netbios
option netbios-node-type 8;
#Defindo o broadcast da nossa rede
option broadcast-address 192.168.1.255;
#Defindo que o servidor é autoritativo para a rede
authoritative;
#Estilo de atualização do servidor DNS, este metodo vai ser o padrão de atualização do dns
#ele gera um registro (RR) TXT nos arquivos de zonas do DNS e os atualiza
ddns-update-style interim; 
#Força o servidor dhcp fazer atualizações para os endereços ips estáticos
update-static-leases on;
#Defindo o tipo de log que vai ser enviado para o syslog
log-facility local7;
#Defindo a chave de atualização entre o dhcp e o dns a chave que visualizamos com cat /etc/bind/K*.key
key dhcpupdate {
algorithm hmac-md5;
secret +AxtjQ+EUNBCD2JfPyA/UA==;
}
#defindo a zona que vamos efetuar atualizações
zone douglasqsantos.com.br. { 
   primary 127.0.0.1; 
   key dhcpupdate; 
} 
#definindo a zona que vamos efetuar atualizações para reverso
zone 1.168.192.in-addr.arpa. { 
   primary 127.0.0.1; 
   key dhcpupdate; 
}
 
#Tempo de emprestimo de um ip
default-lease-time 600; 
#tempo maximo de emprestimo de um ip
max-lease-time 7200;
#Declaração da sub-net
subnet 192.168.1.0 netmask 255.255.255.0 { 
#Declaração do range de ips disponiveis para emprestimo
range 192.168.1.100 192.168.1.200; 
#Define qual a subrede para este escopo
option subnet-mask 255.255.255.0;
#define qual o router para esse escopo
option routers 192.168.1.35; 
} #Fim do escopo

#Definindo um ip fixo
host douglas-xp {
 hardware ethernet 08:00:27:CE:16:56;
 fixed-address 192.168.1.21;
}

Definir em qual interface o dhcp vai trabalhar

vim /etc/default/isc-dhcp-server
[...]
INTERFACES="eth0"

Agora vamos fazer um ajuste no rsyslog

echo "local7.debug /var/log/dhcpd.log" >> /etc/rsyslog.conf

Agora vamos reiniciar o rsyslog

/etc/init.d/rsyslog restart

Agora vamos subir o servidor de dhcp

/etc/init.d/isc-dhcp-server restart
Stopping ISC DHCP server: dhcpd failed!
Starting ISC DHCP server: dhcpd.

Podemos acompanhar o trabalho do dhcp em /var/log/dhcpd.log

tail -f /var/log/dhcpd.log 
Jan 13 21:14:25 fw-lan dhcpd: Copyright 2004-2010 Internet Systems Consortium.
Jan 13 21:14:25 fw-lan dhcpd: All rights reserved.
Jan 13 21:14:25 fw-lan dhcpd: For info, please visit https://www.isc.org/software/dhcp/
Jan 13 21:14:25 fw-lan dhcpd: Internet Systems Consortium DHCP Server 4.1.1-P1
Jan 13 21:14:25 fw-lan dhcpd: Copyright 2004-2010 Internet Systems Consortium.
Jan 13 21:14:25 fw-lan dhcpd: All rights reserved.
Jan 13 21:14:25 fw-lan dhcpd: For info, please visit https://www.isc.org/software/dhcp/
Jan 13 21:14:25 fw-lan dhcpd: Wrote 0 deleted host decls to leases file.
Jan 13 21:14:25 fw-lan dhcpd: Wrote 0 new dynamic host decls to leases file.
Jan 13 21:14:25 fw-lan dhcpd: Wrote 0 leases to leases file.

Vamos ver um exemplo de maquina que pegou o ip e foi registrada no DNS

tail -f /var/log/dhcpd.log
Jan 13 21:15:11 fw-lan dhcpd: DHCPDISCOVER from 08:00:27:ce:16:56 via eth0
Jan 13 21:15:11 fw-lan dhcpd: DHCPOFFER on 192.168.1.21 to 08:00:27:ce:16:56 via eth0
Jan 13 21:15:11 fw-lan dhcpd: Added new forward map from xp.douglasqsantos.com.br to 192.168.1.21
Jan 13 21:15:11 fw-lan dhcpd: added reverse map from 21.1.168.192.in-addr.arpa. to xp.douglasqsantos.com.br
Jan 13 21:15:11 fw-lan dhcpd: DHCPREQUEST for 192.168.1.21 (192.168.1.35) from 08:00:27:ce:16:56 via eth0
Jan 13 21:15:11 fw-lan dhcpd: DHCPACK on 192.168.1.21 to 08:00:27:ce:16:56 via eth0

Note que o cliente pegou um ip e foi registrado como xp.douglasqsantos.com.br

Agora vamos testar o dns para ver se esta resolvendo mesmo

nslookup xp.douglasqsantos.com.br
Server:     192.168.1.35
Address:    192.168.1.35#53

Name:   xp.douglasqsantos.com.br
Address: 192.168.1.21

Agora vamos testar o reverso desta maquina

dig -x 192.168.1.21

; <<>> DiG 9.7.3 <<>> -x 192.168.1.21
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 49744
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3

;; QUESTION SECTION:
;21.1.168.192.in-addr.arpa. IN  PTR

;; ANSWER SECTION:
21.1.168.192.in-addr.arpa. 300  IN  PTR xp.douglasqsantos.com.br.

;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 86400   IN  NS  ns2.douglasqsantos.com.br.
1.168.192.in-addr.arpa. 86400   IN  NS  douglasqsantos.com.br.
1.168.192.in-addr.arpa. 86400   IN  NS  ns1.douglasqsantos.com.br.

;; ADDITIONAL SECTION:
douglasqsantos.com.br.        86400   IN  A   192.168.1.35
ns1.douglasqsantos.com.br.        86400   IN  A   192.168.1.35
ns2.douglasqsantos.com.br.        86400   IN  A   192.168.1.35

;; Query time: 0 msec
;; SERVER: 192.168.1.35#53(192.168.1.35)
;; WHEN: Sun Jan 13 21:16:46 2013
;; MSG SIZE  rcvd: 168

Como pode ser notado temos agora o DHCP trabalhando em conjunto com o DNS

Configuração do Firewall

Aqui vamos precisar habilitar o roteamento de pacotes no servidor

Vamos avisar o kernel que queremos habilitar o roteamento

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

Agora vamos habilitar o roteamento manualmente, porém ele vai subir no boot do sistema

sysctl -p

Agora vamos criar um diretório para armazenar os arquivos que vão conter as nossas politicas e os ips liberados

mkdir -p /etc/firewall

Agora vamos criar o arquivo que vai conter os ips que vão ter acesso full a internet

vim /etc/firewall/ips_liberados
#ARQUIVO PARA DEFINICAO DOS IPS QUE TERÃO ACESSO FULL NA INTERNET
#INSERIR UM IP POR LINHA
#IP DA DIRETORIA
192.168.1.21
#IP GERENTE DE VENDAS
192.168.1.160
#IP TI
192.168.1.170

Agora vamos criar o arquivo que vai conter as politicas de ping

vi /etc/firewall/politicas_ping
#ARQUIVO DE CONFIGURACAO PARA AS POLITICAS DE PING
#INFORMAR UMA POLITICA POR LINHA
INPUT
FORWARD
OUTPUT

Agora vamos criar o arquivo que vai conter as politicas de ataque

vim /etc/firewall/politicas_ataques
#ARQUIVO PARA DEFINICAO DAS POLITICAS CONTRA ATAQUES
#INSERIR CADA POLITICA EM UMA LINHA
INPUT
FORWARD
OUTPUT

Agora vamos criar o arquivo que vai conter as politicas de DNS

vim /etc/firewall/politicas_dns
#ARQUIVO DE CONTROLE DAS POLITICAS PARA DNS
#INSIRA UMA CHAIN POR LINHA
INPUT
FORWARD
OUTPUT

Caso tenha mais de uma rede podemos liberar da seguinte forma

vim /etc/firewall/redes
#REDE FINANCEIRO
10.100.0.0/24
#REDE CONTABILIDADE
10.101.0.0/24
#REDE VENDAS
10.102.0.0/24

Agora vamos criar o script de Firewall que vai ler as nossas regras

vim /etc/init.d/rc.firewall
#!/bin/sh
### BEGIN INIT INFO
# Provides:          rc.firewall
# Required-Start:    $network $remote_fs $syslog
# Required-Stop:     $network $remote_fs $syslog
# Should-Start:      $named
# Should-Stop:       $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Firewall
# Description:       Regras de firewall para a rede interna
#        última atualização 13/01/2013 por Douglas.
### END INIT INFO
 
### 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"
 
### Comandos ###
IPTABLES=$(which iptables)
MODPROBE=$(which modprobe)
COM="-m comment --comment"
 
### PORTAS ###
DNS_PORT="53"
 
###  CAMINHO DAS VARIAVEIS DO IPV4 NO KERNEL ###
PSNI=/proc/sys/net/ipv4
 
### LIMITA OS PINGS ###
MAX_TAM="512" MAX_SEG="1"
 
### CAMINHO DAS REGRAS ###
REGRAS=/etc/firewall/
IPS_LIBERADOS=${REGRAS}ips_liberados
CHAINS_DNS=${REGRAS}politicas_dns
CHAINS_PING=${REGRAS}politicas_ping
CHAINS_ATAQUES=${REGRAS}politicas_ataques
REDES=${REGRAS}redes
### 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 ICMP
echo 0 > $PSNI/icmp_echo_ignore_all
echo 1 > $PSNI/icmp_echo_ignore_broadcasts
 
### CARREGANDO MODULOS ###
${MODPROBE} ip_conntrack
${MODPROBE} ip_conntrack_ftp
${MODPROBE} ip_nat_ftp
${MODPROBE} ip_conntrack_irc
${MODPROBE} ip_nat_irc
 
 
### DEFININDO ALGUNS ENDEREÇOS DE REDE ###
LO='127.0.0.0/8'        # Endereco de Loopback
LAN='192.168.1.0/24'        # Rede interna da empresa (IP/Mascara)
IF_INT='eth0'       # Placa de rede ligada na rede interna
 
case $1 in
    start)
        echo "${GREEN}[        Iniciando Firewall       ]${CLOSE}"
 
    ### APAGANDO REGRAS EXISTENTES ###
    ${IPTABLES} -t filter -F
    ${IPTABLES} -t nat -F
    ${IPTABLES} -t mangle -F
    ${IPTABLES} -t filter -X
    ${IPTABLES} -t nat -X
    ${IPTABLES} -t mangle -X
 
    ### DEFININDO POLITICA PADRAO ACCEPT ###
    ${IPTABLES} -P INPUT ACCEPT
    ${IPTABLES} -P FORWARD ACCEPT
    ${IPTABLES} -P OUTPUT ACCEPT
 
 
    ### DEFININDO POLITICA PADRAO DROP ###
#   ${IPTABLES} -P INPUT DROP
#   ${IPTABLES} -P FORWARD DROP
#   ${IPTABLES} -P OUTPUT ACCEPT
 
    ### LIBERAR LOOPBACK ###
    ${IPTABLES} -A INPUT -s ${LO} -j ACCEPT ${COM} "Liberando conexoes da ${LO}"
    ${IPTABLES} -A OUTPUT -s ${LO} -j ACCEPT ${COM} "Liberando conexoes da ${LO}"
 
    ### LIBERAR SSH ###
    ${IPTABLES} -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT ${COM} "Libera acesso a porta 22"
 
    ### LIBERAR CONECTIVIDADE SOCIAL DA CAIXA ECONOMICA ###
    ${IPTABLES} -A FORWARD -s ${LAN} -d 10.101.0.0/24 -j ACCEPT ${COM} "Libera conectividade social"
    ${IPTABLES} -t nat -A PREROUTING -s ${LAN} -d 200.201.174.0/24 -j RETURN ${COM} "Libera conectividade social"
    ${IPTABLES} -t nat -A PREROUTING -p tcp -d 200.201.160.0/24 --dport 2631 -j ACCEPT
    ${IPTABLES} -A FORWARD -p tcp -d 200.201.160.0/24 --dport 2631 -j ACCEPT
    ${IPTABLES} -t nat -A PREROUTING -p tcp -d 200.201.160.0/24 --dport 80 -j ACCEPT
    ${IPTABLES} -A FORWARD -p tcp -d 200.201.160.0/24 --dport 80 -j ACCEPT
    ${IPTABLES} -t nat -A PREROUTING -p tcp -d 200.201.166.0/24 --dport 80 -j ACCEPT
    ${IPTABLES} -A FORWARD -p tcp -d 200.201.166.0/24 --dport 80 -j ACCEPT
 
    ### LIBERAR RETORNO DE CONEXOES ###
    ${IPTABLES} -A INPUT   -m state --state ESTABLISHED,RELATED -j ACCEPT
    ${IPTABLES} -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
    ${IPTABLES} -A OUTPUT  -m state --state ESTABLISHED,RELATED -j ACCEPT
 
    ### LIBERAR REDES DESCOMENTE AS LINHAS ABAIXO CASO TENHA MAIS DE UMA REDE QUE DESEJA LIBERAR ###
#   for END in $(cat ${REDES} | grep -v "^#")
#   do
#   ${IPTABLES} -A FORWARD -s ${END} -j ACCEPT ${COM} "LIBERA REDES TI"
#   ${IPTABLES} -t nat -A POSTROUTING -s ${END} -j MASQUERADE ${COM} "LIBERA REDES TI"
#   done
 
    ### REDIRECT DE PORTA ###
    ${IPTABLES} -A PREROUTING -t nat -p tcp -m tcp -s ${LAN} --dport 8081 -j REDIRECT --to-port 3128 ${COM} "Redireciona porta 8081 para 3128"
 
    ### LIBERAR ALGUNS IPS PARA DIRETORIA, GERENCIA, TI ###
    for END in $(cat ${IPS_LIBERADOS} | grep -v "^#")
    do
    ${IPTABLES} -A FORWARD -m iprange --src-range ${END} -j ACCEPT ${COM} "LIBERA IPS"
    ${IPTABLES} -t nat -A POSTROUTING -m iprange --src-range ${END} -j MASQUERADE ${COM} "LIBERA IPS"
    done
 
        ### BLOQUEANDO IPS PARA BLOQUEAR IPS PODEMOS INSERIR ELES ABAIXO SEPARADOS POR ESPAÇO ###
        #BLOQ_IPS="10.0.0.159 10.0.0.10 10.0.0.51 10.0.0.52  10.0.0.54 10.0.0.56 10.0.0.57 10.0.0.58 10.0.0.60"
        #for BLOQUEIO in ${BLOQ_IPS}
        #do
        #   ${IPTABLES} -I INPUT   -s ${BLOQUEIO} -j DROP ${COM} "Bloqueio de maquinas especificas"
        #done
 
    ### CASO QUEIRA LIBERAR ALGUMAS ESTAÇOES PODEMOS LIBERAR ELAS ABAIXO SEPARANDO POR ESPAÇO ###
    # Define os IPs das máquinas que serão liberadas (separadas por espaco)
    #        |Nerso  | Xerox     |Xerox     |Xerox     |Jose     |Monitor Erp
    #HOST_IPS="10.0.0.9 10.0.0.150 10.0.0.152 10.0.0.153 10.0.0.101 10.0.1.205 10.0.0.239 10.0.1.167"
        #
    #for HOSTIPS in $TI_IPS $HOST_IPS
    #do
    #  ${IPTABLES} -A FORWARD -s $HOSTIPS -j ACCEPT ${COM} "Libera maquinas especiais"
    #  ${IPTABLES} -A PREROUTING -t nat -s $HOSTIPS -j RETURN ${COM} "Libera maquinas especiais"
    #done
 
 
    ### BLOQUEAR ALGUMAS PORTAS ###
    ### DEFINE ALGUMAS PORTAS QUE SERÃO BLOQUEADAS (SEPARADAS POR ESPACO) ###
        #PORT_BLOQ="3128 8080 8081 80 443"
        #
        #for PORTBLOQ in $PORT_BLOQ
        #do
        #${IPTABLES} -A FORWARD -p tcp -m tcp --dport $PORTBLOQ -j DROP ${COM} "Bloqueia a porta ${PORTBLOQ}"
        #done
 
    ### LIBERAR CAMERAS DE MONITORAMENTO PODEMOS DESCOMENTAR AS LINHAS ABAIXO###
    #CAP_IP1="192.168.1.220"
    #CAM_PORTS1="4077,8080"
    #${IPTABLES} -A FORWARD -p tcp -m multiport --dports ${CAM_PORTS1} -d ${CAP_IP1} -j ACCEPT ${COM} "Libera camera de monitoramento 01"
    #${IPTABLES} -A PREROUTING -t nat -i ${IF_EXT} -p tcp -m multiport --dports ${CAM_PORTS1} -j DNAT --to ${CAP_IP1} ${COM} "Libera camera de monitoramento 01"
 
 
    ### BLOQUEAR ALGUMAS PORTAS USE AS REGRAS ABAIXO CASO UTILIZE PROXY ###
    ### DEFINE ALGUMAS PORTAS QUE SERÃO BLOQUEADAS (SEPARADAS POR ESPACO) ###
    #PORT_BLOQ="3128 8080 8081 80 443"
        #
    #for PORTBLOQ in $PORT_BLOQ
    #do
    #  ${IPTABLES} -A FORWARD -p tcp -m tcp --dport $PORTBLOQ -j DROP ${COM} "Bloqueia a porta ${PORTBLOQ}"
    #done
 
 
    ### LIBERAR ACESSOS AO PROGRAMA RAIS CASO UTILIZE DESCOMENTE AS LINHAS ABAIXO ###
    #${IPTABLES} -A FORWARD -p tcp -m tcp -d 161.148.185.46/32 --dport 3007 -j ACCEPT
    #${IPTABLES} -t nat -A PREROUTING -i eth0 -p tcp -m tcp -d 161.148.185.46/32 --dport 3007 -j RETURN
    #${IPTABLES} -t nat -A POSTROUTING -o eth0 -p tcp -m tcp -d 161.148.185.46/32 --dport 3007 -j MASQUERADE
 
    ### LIBERAR ACESSO DA REDE LOCAL PARA O SERVIDOR ###
    ${IPTABLES} -A INPUT -s ${LAN} -j ACCEPT ${COM} "Libera rede ${LAN}"
 
        ### LIBERA SANTANDER NAO FUNCIONA COM PROXY CASO TENHA PROBLEMAS COM O SANTANDER DESCOMENTE AS LINHAS ABAIXO###
        #${IPTABLES} -A FORWARD -d 200.220.178.3  -j ACCEPT
        #${IPTABLES} -A FORWARD -d 200.220.179.4  -j ACCEPT
        #${IPTABLES} -A FORWARD -d 200.220.187.4  -j ACCEPT
        #${IPTABLES} -A FORWARD -d 200.220.186.3  -j ACCEPT
        #${IPTABLES} -A FORWARD -d 200.220.187.18 -j ACCEPT
 
        ### CONTROLE DOS PINGS (ICMP) ###
        for END in $(cat ${CHAINS_PING} | grep -v "^#")
        do
        ${IPTABLES} -A ${END} -p icmp -j DROP -m length --length ${MAX_TAM}: ${COM} "RESTRICAO AO TAMANHO DOS ECHOS A 512BYTES"
        ${IPTABLES} -A ${END} -p icmp --icmp-type 0 -m limit --limit ${MAX_SEG}/s -j ACCEPT ${COM} "ECHO REPLY RETORNO"
        ${IPTABLES} -A ${END} -p icmp --icmp-type 8 -m limit --limit ${MAX_SEG}/s -j ACCEPT ${COM} "ECHO REQUEST SOLICITACAO"
        done
 
    #### ALGUMAS PROTECOES ADICIONAIS ###
    ### PROTECAO CONTRA SYN-FLOOD ###
    ${IPTABLES} -A INPUT -p tcp -m tcp --tcp-flags ALL FIN,URG,PSH -j DROP ${COM} "Protecao contra syn-flood"
    ${IPTABLES} -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP ${COM} "Protecao contra syn-flood"
    ${IPTABLES} -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP ${COM} "Protecao contra syn-flood"
    ${IPTABLES} -A INPUT -p tcp -m tcp --tcp-flags ALL NONE -j DROP ${COM} "Protecao contra syn-flood"
    ${IPTABLES} -A INPUT -p tcp -m tcp --sport 0 --tcp-flags FIN,SYN,RST,ACK SYN -j DROP ${COM} "Protecao contra syn-flood"
    ${IPTABLES} -A FORWARD -p tcp --syn -m limit --limit 2/s -j ACCEPT ${COM} "Protecao contra syn-flood"
 
    ### PROTECAO CONTRA PING DA MORTE ###
    ${IPTABLES} -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT ${COM} "Protecao contra DOS"
 
    ### PROTECAO CONTRA PORT SCANNERS ###
    ${IPTABLES} -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT ${COM} "Protecao contra Port Scanners"
 
    ### NEGAR IDENT ###
    ${IPTABLES} -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset ${COM} "Nega Identidade"
    ${IPTABLES} -A FORWARD -p tcp --dport 113 -j REJECT --reject-with tcp-reset ${COM} "Nega Identidade"
 
    ### RESET EM CONEXOES PARA PORTAS DESCONHECODAS ###
    ${IPTABLES} -A INPUT -p tcp -j REJECT --reject-with tcp-reset ${COM} "Reseta conexoes em portas desconhecidas"
 
    ### HABILITANDO MASQUERADE DA REDE INTERNA ###
    ${IPTABLES} -A POSTROUTING -t nat -s ${LAN} -j MASQUERADE ${COM} "Masquerade da Rede"
 
    echo "${GREEN}[        Firewall Iniciado        ]${CLOSE}"
;;
 
  stop)
    echo "${RED}[        Parando Firewall ...     ]${CLOSE}"
    ### APAGANDO REGRAS EXISTENTES ###
    ${IPTABLES} -t filter -F
    ${IPTABLES} -t nat -F
    ${IPTABLES} -t mangle -F
    ${IPTABLES} -t filter -X
    ${IPTABLES} -t nat -X
    ${IPTABLES} -t mangle -X
 
    ### DEFININDO POLITICA PADRAO ACCEPT ###
    ${IPTABLES} -P INPUT ACCEPT
    ${IPTABLES} -P FORWARD ACCEPT
    ${IPTABLES} -P OUTPUT ACCEPT
 
 
    ### FAZENDO NAT DA REDE ###
    ${IPTABLES} -t nat -A POSTROUTING -s ${LAN} -j MASQUERADE ${COM} "Masquerade da Rede"
 
 
    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 de execução em nosso script

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

Agora vamos colocar ele na inicialização do servidor

insserv -f -v rc.firewall

Agora vamos testar o nosso script

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

Referências