Construindo um Firewall / Proxy com o Fedora Core 4

O objetivo deste documento é mostrar a instalação e configuração de um servidor que será firewall e proxy. O sistema utilizado será o Fedora Core 4. Como o propósito é a segurança, todas as configurações necessárias para tornar este servidor o mais seguro possível serão realizadas.

[ Hits: 84.244 ]

Por: Sandro Venezuela em 10/02/2006


Configuração do Firewall



A seguir, vamos configurar o firewall, onde para isto utilizaremos o script abaixo, que bloqueia tudo que não seja necessariamente importante, como por exemplo, Instant Messaging, P2P, BitTorrent, etc:

#!/bin/bash

FW=/sbin/iptables

if [ -z $FW ]; then
  echo "iptables: Command not found"
  exit 1
fi

SYSCTL=/sbin/sysctl

if [ -z $SYSCTL ]; then
  echo "sysctl: Command not found"
  exit 1
fi

PROBE=/sbin/modprobe

if [ -z $PROBE ]; then
  echo "modprobe: Command not found"
  exit 1
fi

ETH0="192.168.0.0/24"
NET="0/0"
LO="127.0.0.1"
PA="1024:65535"
CONFIG_DIR="/etc/firewall"

set_policy() {
  # POLICY is DROP or ACCEPT
  local POLICY=$1

  $FW -P INPUT $POLICY
  $FW -P OUTPUT $POLICY
  $FW -P FORWARD $POLICY
}

flush() {
  $FW -F
  $FW -F -t nat
  $FW -X
  $FW -X -t nat
}

allow_loopback() {
  $FW -A INPUT -j ACCEPT -i lo -d $LO
  $FW -A OUTPUT -j ACCEPT -o lo -s $LO
}

allow_icmp() {
  local FILE=$(cat $CONFIG_DIR/icmp_types.conf | grep -v ^#)

  $FW -N ALLOW_ICMP

  for TYPE in $FILE
    do
    $FW -A ALLOW_ICMP -j ACCEPT -p icmp --icmp-type $TYPE -d $ETH0
  done

  $FW -A ALLOW_ICMP -j ACCEPT -m limit --limit 1/s
  $FW -A ALLOW_ICMP -j DROP

  $FW -A INPUT -j ALLOW_ICMP -p icmp
  $FW -A OUTPUT -j ALLOW_ICMP -p icmp
  $FW -A FORWARD -j ALLOW_ICMP -p icmp
}

service_ports() {
  local FILE=$(cat $CONFIG_DIR/service_ports.conf | grep -v ^#)

  for PORT in $FILE
    do
    # Allow LAN to acess the firewall and the internet
    $FW -A INPUT -j ALLOW_TCP -p tcp -s $ETH0 --sport $PA -d $NET --dport $PORT
    $FW -A OUTPUT -j ALLOW_TCP -p tcp -s $NET --sport $PORT -d $ETH0 --dport $PA
    $FW -A FORWARD -j ALLOW_TCP -p tcp -s $ETH0 --sport $PA -d $NET --dport $PORT
    $FW -A FORWARD -j ALLOW_TCP -p tcp -s $NET --sport $PORT -d $ETH0 --dport $PA

    # Allow the firewall to access the internet
    $FW -A INPUT -j ALLOW_TCP -p tcp -i ppp0 --sport $PORT --dport $PA
    $FW -A OUTPUT -j ALLOW_TCP -p tcp -o ppp0 --sport $PA --dport $PORT
  done
}

adm_ports() {
  local FILE=$(cat $CONFIG_DIR/admin_ports.conf | grep -v ^#)

  for PORT in $FILE
    do
    $FW -A INPUT -j ALLOW_TCP -p tcp -s $ETH0 --sport $PA -d $NET --dport $PORT
    $FW -A OUTPUT -j ALLOW_TCP -p tcp -s $NET --sport $PORT -d $ETH0 --dport $PA
  done
}

allow_tcp() {
  $FW -N ALLOW_TCP

  $FW -A ALLOW_TCP -j ACCEPT -p tcp --syn
  $FW -A ALLOW_TCP -j ACCEPT -p tcp -m state --state ESTABLISHED,RELATED

  # Drop undesirable packages TCP
  $FW -A ALLOW_TCP -j LOG --log-prefix "FIREWALL: NEW without syn: " -p tcp ! --syn -m state --state NEW
  $FW -A ALLOW_TCP -j DROP -p tcp ! --syn -m state --state NEW

  # Drop packages TCP badly formed
  #$FW -A ALLOW_TCP -j LOG --log-prefix "FIREWALL: Badly formed: " -m unclean
  #$FW -A ALLOW_TCP -j DROP -m unclean

  # Port Scanner
  local FILE=$(cat $CONFIG_DIR/tcp_flags.conf | grep -v ^#)

  for FLAGS in $FILE
    do
    $FW -A ALLOW_TCP -j LOG --log-prefix "FIREWALL: ($FLAGS): " -p tcp --tcp-flags ALL $FLAGS
    $FW -A ALLOW_TCP -j DROP -p tcp --tcp-flags ALL $FLAGS
  done

  $FW -A ALLOW_TCP -j DROP

  adm_ports
  service_ports
}

accept_dns_conn() {
  # To resolv internal network
  $FW -A INPUT -j ACCEPT -p udp -s $ETH0 --sport $PA -d $NET --dport 53
  $FW -A OUTPUT -j ACCEPT -p udp -s $NET --sport 53 -d $ETH0 --dport $PA
  $FW -A FORWARD -j ACCEPT -p udp -s $ETH0 --sport $PA -d $NET --dport 53
  $FW -A FORWARD -j ACCEPT -p udp -s $NET --sport 53 -d $ETH0 --dport $PA
}

accept_proxy() {
  $FW -t nat -A PREROUTING -j REDIRECT -p tcp -s $ETH0 --dport 80 -i eth0 --to-port 3128
}

accept_internet() {
  $FW -t nat -A POSTROUTING -j MASQUERADE -s $ETH0 -o ppp0
}

setup_kernel() {
  # Load Modules
  $PROBE ip_nat_ftp
  $PROBE ip_conntrack_ftp

  # Disable IP Spoofing attack
  $SYSCTL -w net.ipv4.conf.all.rp_filter=2 > /dev/null 2>&1

  # Enable IP Forward
  $SYSCTL -w net.ipv4.ip_forward=1 > /dev/null 2>&1

  # Kill Timestamps
  $SYSCTL -w net.ipv4.tcp_timestamps=0 > /dev/null 2>&1

  # Enable protection Cookie TCP syn
  $SYSCTL -w net.ipv4.tcp_syncookies=1 > /dev/null 2>&1

  # Disable ICMP broadcast
  $SYSCTL -w net.ipv4.icmp_echo_ignore_broadcasts=1 > /dev/null 2>&1

  # Enable protection to bad error message
  $SYSCTL -w net.ipv4.icmp_ignore_bogus_error_responses=1 > /dev/null 2>&1

  # It certifys that packages routed in the origin had been discarded
  $SYSCTL -w net.ipv4.conf.all.accept_source_route=0 > /dev/null 2>&1

  # Change TTL value
  $SYSCTL -w net.ipv4.ip_default_ttl=255 > /dev/null 2>&1

  # Ratemask to ICMPs: 0 3 4 5 8 11 12
  $SYSCTL -w net.ipv4.icmp_ratemask=6457 > /dev/null 2>&1

  # Recommended values of datagram TCP thinking about DOS and DRDOS attack
  $SYSCTL -w net.ipv4.tcp_fin_timeout=30 > /dev/null 2>&1
  $SYSCTL -w net.ipv4.tcp_keepalive_time=1800 > /dev/null 2>&1
  $SYSCTL -w net.ipv4.tcp_window_scaling=0 > /dev/null 2>&1
  $SYSCTL -w net.ipv4.tcp_sack=0 > /dev/null 2>&1
}

start() {
  echo "Starting Firewall: "
  set_policy DROP
  allow_loopback
  allow_icmp
  allow_tcp
  accept_dns_conn
  accept_proxy
  accept_internet
  setup_kernel
}

stop() {
  echo "Stopping Firewall: "
  set_policy ACCEPT
  flush
}

status() {
  echo ">> Showing table default: "
  $FW -L
  echo ""
  echo ">> Showing table nat: "
  $FW -L -t nat
}

restart() {
  stop
  start
}

# Start of the firewall script
case "$1" in

  start)
    start
  ;;

  stop)
    stop
  ;;

  restart)
    restart
  ;;

  status)
    status
  ;;

  internet)
    accept_internet
  ;;

  *)
    echo "Usage: $0 {start|stop|restart|status}"
    exit 1
  ;;

esac

exit 0

Para finalizar ainda temos os seguintes arquivos de configurações, que devem ficar no diretório /etc/firewall, utilizados pelo script acima:

Arquivo icmp_types.conf:

0
3/0
3/1
3/2
3/3
3/4
4
5
8
11
12

Arquivo service_ports.conf:

20
21
22
25
80
110
143
443
3128

Arquivo admin_ports.conf:

# Only administration ports, but only for INPUT and OUTPUT
22

Arquivo tcp_flags.conf:

# Flags TCP that they cannot happen in a normal
# communication, thus indicating possible sweepings

FIN,SYN
FIN,RST
FIN,URG,PSH
NONE
RST,URG
RST,PSH
SYN,RST
SYN,URG
SYN,PSH
SYN,URG,PSH

Agora, para que o script do firewall seja iniciado juntamente com o servidor, estaremos copiando o mesmo no diretório /etc/init.d, com o nome de firewall, e depois criaremos um link simbólico no diretório /etc/rc3.d apontando para ele, com o nome de S99firewall.

Página anterior     Próxima página

Páginas do artigo
   1. Instalação do Fedora Core 4
   2. Procedimento de Segurança Pós-Instalação
   3. Configuração do Firewall
   4. Configuração do Proxy
   5. Outras configurações
   6. Considerações Finais
Outros artigos deste autor

Integrando o Amavisd-new, SpamAssassin e ClamAV com o Postfix no SuSE 9.3

Instalando a placa de rede wireless DWL-G520+ no Fedora Core 3

Instalando o QEMU no Fedora Core 4

Configurando uma VPN IPSec Openswan no SUSE Linux 9.3

Leitura recomendada

Como construir um firewall de baixo custo para sua empresa (parte 3)

Gerenciando regras de Iptables com Firewall Builder

Iptables + módulo recent

Montando regras iptables

L7-filter (funcionando) no Slackware 10.2

  
Comentários
[1] Comentário enviado por removido em 13/02/2006 - 01:24h

interessante sua dica de segurança de "pós instalação", gostei do artigo.
e como tu escreveveu que sugestões são bem vindas, creio que poderias ter entrado pelo menos um pouco no "famoso" squid.

[2] Comentário enviado por agk em 14/02/2006 - 09:55h

Muito bom, bastante abrangente, o script de firewall está bem completo, parabéns.

[3] Comentário enviado por james_avelar em 02/08/2006 - 20:05h

PÓS INSTALAÇÂO FC4

Brother fiz tudo ai certinho!!
Mas depois de reiniciar o FC4 não consegue montar:
LABEL=/home
LABEL=/tmp
LABEL=/var

Ai tem de entrar e reparar o sistema de arquivos, ai não sei como fazer, pois tentei re-editar o /etc/fstab e não consigo!!
Espero uma luz ai pq preciso usar o FC4 ainda amanhã!!
t+++

[4] Comentário enviado por leloguitar em 29/08/2006 - 11:01h

ETH0="192.168.0.0/24"
NET="0/0"

essa variavel eth0 se refere a rede, entao se minha rede for a eth1 no caso seria

ETH1="192.168.0.0/24"
NET="0/0"

???

serve pra squid autenticado tb???
proxy_auth ???

[5] Comentário enviado por rdebraga em 13/08/2007 - 18:48h

no caso de eu usar duas placas de rede uma com Ip válido e outra com ip invalido como fica a configuração ?

att

[6] Comentário enviado por kikoxela em 20/01/2009 - 10:46h

Nosssa esse tutorial é demais estava com umas duvida e estou entendendo melhor como rola cada coisa legal parabens pelo tutorial .
realmente bom .
como voce mesmo disse da para deixar mais seguro vou procura saber ai vou postar.
blz .


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts