LinuxMan
 
Submitted by Eri on Wed, 2005-09-14 22:26.


Criando um Firewall OpenBSD utilizando PF












1. Introdução


OpenBSD é um sistema operacional UNIX de código aberto originalmente
desenvolvido na Universidade da Califórnia em Berkley. Foi desenhado
para ter uma capacidade de segurança e criptografia extremamente alta
e para ser muito resistente a ataques.


Leia o manual até o final antes de fazer testes! Não basta configurar,
é preciso habilitar!!
Esse documento é um MINI how-to, passando longe de abranger todos os
aspectos de firewalling.



1.1 Sobre o autor

Eri Ramos Bastos trabalha com Linux desde 1998, passando por diversas
distribuições e fases diferentes do pinguim. Não contente passou a
trabalhar também com a família BSD e atualmente trabalha como
consultor em soluções Linux / Unix e está disponível para ajudar a
sua empresa a implantar Linux em todos os setores.
Consultoria



1.2 Pré-requisitos


O OpenBSD já deve estar instalado na máquina e a parte de rede 100%
funcional. Vou levar em consideração que você já tem bons
conhecimentos em rotas e firewalls em outros sistemas (como Linux e
FreeBSD)
Esse tutorial se refere a versões >= 3.3 do OpenBSD.



1.3 Convenções


Vamos adotar para o cenário Firewall em modo NAT que existem 2 placas de rede: fxp0 e fxp1.
Respectivamente internet e rede local.
No cenário de firewall transparente adotamos: fxp0 e fxp1 como internet e rede local para a bridge e xl0 como interface administrativa.
Nossa rede externa será 200.200.200.0/24 e a rede interna 192.168.1.0/24.



1.4 Agradecimentos


Aos meus grandes amigos Marcello Mezzanotti [ mezzanet (at) iname.com ] e Eduardo Assais por estarem a tempos me falando de firewalls em modo bridge e mesmo assim eu demorar tanto pra botar a mão na massa.



2. Firewall em modo NAT




2.1 Habilitando a passagem de pacotes


Para poder usar o firewall, é preciso que o servidor tenha capacidade
de funcionar como gateway.
Vamos editar o arquivo /etc/sysctl.conf e modificar a seguinte linha:

  net.inet.ip.forwarding=1


Isso é equivalente no Linux a: "echo 1 > /proc/sys/net/ipv4/ip_forward"



2.1.2 Refrências:


OpenBSD Faq



2.2 Arquivos de Configuração

No mínimo 2 configurações distintas são feitas num arquivo do pf: NATs e filtros.
Essas configurações devem aparecer na seguinte ordem:



  • opções
  • normalização
  • filas (controle de banda)
  • NAT
  • Filtros


2.2.1 /etc/pf.conf


Esse arquivo é normalmente utilizado para relacionar as regras do PF.
Se nada mais explícito for informado, esse arquivo será executado na inicialização do sistema.
Para iniciar o pf durante o boot, edite o arquivo /etc/rc.conf e modifique a linha referente ao pf para:

  pf=YES  # Packet filter / NAT


Para simplificar vamos começar com uma regra padrão que permite a passagem de todos os pacotes,
Vamos também fazer o NAT de nossa rede interna.

  # Regra padrao
  pass in all
  
  # Nat das redes
  nat on fxp0 from 192.168.1.0/24 to any -> 200.200.200.1



2.2.2 Referências:



OpenBSD Faq

HOW-TO de Erwan Lemonnier



2.3 Ativando o firewall


Como dito anteriormente, é preciso ativar o pf depois de configurado.
Isso implica em colocar as regras no ar e ativar a funcionalidade.
Se você já alterou seu rc.conf e reiniciou a máquina, não é necessário ativar a funcionalidade.



2.3.1 Rodando as regras


  # pfctl -R 
  # pfctl -N


A primeira linha faz com que as regras do firewall e as políticas
sejam lidas e a segunda ativa o nat.
Caso esteja usando outro arquivo com as regras que não o pf.conf, basta inserir a opção "-f" e o nome do arquivo.



2.3.1 Ativando o PF


  # pfctl -e


Agora suas regras estão no ar!


3. Trabalhando em modo transparente (Bridge)


Um dos grandes trunfos do OpenBSD como firewall é a facilidade de implementar bridges.
Uma bridge, em seu conceito original, é apenas um dispositivo que interliga dois seguimentos diferentes da rede, normalmente utilizado para ampliar seu sinal.


Mas o que isso tem haver com firewall?


Tudo. Imagine ligar um dispositivo desse entre seu roteador e seu switch de servidores. Mas imagine que esse dispositivo totalmente invisível para qualquer um na sua rede local ou internet possa fazer controles de pacotes IP, como origem, destino, portas, protocolos. Todo o conceito de um firewall rodando em um ambiente totalmente invisível de qualquer ponto.
Um firewall que não pode ser comprometido por não ter portas abertas e nem mesmo IP configurado.



3.1 Referências


Foldoc


3.2 Configurações iniciais


Vamos parar todos os serviço iniciados pelo OpenBSD. O único daemon que deixaremos rodando será o SSH.
Edite o arquivo rc.conf e configure as linhas referentes aos serviços indesejados para NO.

  portmap=NO              # Note: inetd(8) rpc services need portmap too
  inetd=NO                # almost always needed
  sendmail_flags=NO
  spamd_flags=NO          # for normal use: "" and see spamd-setup(8)



3.3 Configurando a bridge


Como já convencionado, nossas duas placas da bridge serão fxp0 (internet) e fxp1 (rede local).
Essa placas deverão ser ativadas, apesar de não ter IP. Para isso iremos fazer:

  echo up > /etc/hostname.fxp0
  echo up > /etc/hostname.fxp1


Em seguir iremos editar o arquivo /etc/bridgename.bridge0 e adicionamos o seguinte conteúdo:

  add fxp0
  add fxp1
  blocknonip fxp0
  blocknonip fxp1
  up


Apenas com isso nossa bridge já está funcional. Basta reiniciar a máquina e começar a utilizar.
Realmente funciona muito bem. Imediatamente após o boot já está no ar. Não é possível notar nenhuma diferença na rede.



3.4 Implementando regras

No nosso exemplo iremos utilizar a configuração "de dentro sai tudo e de fora só entra o que for permitido".
Iremos supor 4 servidores e 5 serviços:

SERVIÇO IP
www 200.200.200.5
ftp 200.200.200.6
smtp 200.200.200.7
pop 200.200.200.7
ssh 200.200.200.8


Para tal a regra seria:

  pass in quick on fxp1 all
  pass out quick on fxp1 all
  
  block in log on fxp0 all
  
  pass in on fxp0 proto tcp from any to 200.200.200.5 port = http keep state
  pass in on fxp0 proto tcp from any to 200.200.200.6 port = ftp keep state
  pass in on fxp0 proto tcp from any to 200.200.200.7 port { smtp, pop3 } keep state
  pass in on fxp0 proto tcp from any to 200.200.200.8 port = ssh keep state
  
  pass out on fxp0 inet proto icmp all icmp-type 8 code 0 keep state
  
  pass out on fxp0 proto udp all modulate state
  pass out on fxp0 proto tcp all keep state



3.4.1 Referências


OpenBSD Bridging Firewall Configuration



4. Usando SETs


Podemos utilizar algumas variáveis para facilitar a nossa vida dentro
dos scripts.
Numa situação em que desejamos bloquear certas redes de tentar acesso vindo do mundo exterior temos normalmente uma regra assim:

  block in quick on fxp0 from 10.0.0.0/8 to any
  block in quick on fxp0 from 172.16.0.0/12 to any
  block in quick on fxp0 from  192.168.0.0/16 to any
  block in quick on fxp0 from 255.255.255.255/32 to any



4.1 Diminuindo o trabalho


Podemos substituir as 4 linhas acima pela linha abaixo:

  block in quick on fxp0 from { 10.0.0.0/8 , 172.16.0.0/12, 192.168.0.0/16, 255.255.255.255/32 } to any


ATENÇÃO!! Observe os espaços em branco antes e depois dos números
dentro das chaves!



4.2 Usando variáveis


Quando instalamos e operamos apenas um firewall, fica simples colocar
nossos IPs, interfaces e regras diretamente no script, mas algum tempo
e alguns clientes depois, começamos a sentir a necessidade de
facilitar o trabalho. Dessa forma podemos usar variáveis como abaixo:

  PLACA_EXTERNA="fxp0"
  IPS_INVALIDOS="{ 10.0.0.0/8 , 172.16.0.0/12, 192.168.0.0/16, 255.255.255.255/32 }"
  block in quick on $PLACA_EXTERNA from $IPS_INVALIDOS to any



5. Utilizando FTP


Para quem já está acostumado com NAT, no Linux, por exemplo, sabe que
é necessário inserir alguns módulos extras no kernel, ou então
utilizar o cliente ftp como passivo. O problema da segunda opção é
quando temos muitos usuários leigos na rede, que se atrapalham e não
conseguem utilizar FTP. No OpenBSD isso é um pouco chato. Precisamos
utilizar proxy de FTP. Não se preocupe, pois para o cliente final fica
transparente. Não é preciso configurar nada nas estações.
6.1 Habilitando no inetd.conf
Infelizmente precisamos colocar esse serviço no inetd. Se alguém tiver
conhecimento de outra forma, por favor me avise.
Adicione a seguinte regra no /etc/inetd.conf

  ftp-proxy stream tcp nowait root /usr/libexec/ftp-proxy ftp-proxy -n -V -D3 -u nobody -m 55000 -M 57000 -t 300



5.2 Configurando o pf.conf


Adicione as seguintes linhas (levando em consideração que sua
interface interna é fxp1):

  #Proxy FTP
  rdr on fxp1 proto tcp from any to any  port 21 -> 127.0.0.1 port 8081



5.3 Configurando o pf.conf


Acrescente as seguintes linhas:

  # Proxy FTP
  block in on fxp0 proto tcp from any to any port = 8081 keep state
  FTPPORTS="{ 55000 >< 57000 }"   # Range de portas usadas pelo FTP ativo
  pass in quick on fxp0 proto tcp from any port 20 to fxp0 port $FTPPORTS flags S/SA keep state



5.4 Configurando o /etc/services


Adicione a seguinte linha:

  ftp-proxy       8081/tcp                # ftp-proxy



5.5 Referências


Using Active FTP Clients Through an OpenBSD 3.0 Firewall



6. Exemplos



6.1 pf.conf


  PLACA_EXT="fxp0"
  PLACA_INT="fxp1"
  Spoofados="{10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16, 255.255.255.255/32}"
  
  # Nat das redes
  nat on $PLACA_EXT from $REDE_INT to any -> IP_EXT
  #Proxy transparente - CONFIGURE O SQUID!!!!
  rdr on fxp1 from any to ! 200.182.250.0/24 port 80 -> 127.0.0.1 port 3128
  #Proxy FTP
  rdr on fxp1 proto tcp from any to ! 200.182.250.0/24  port 21 -> 127.0.0.1 port 8081
  
  # Regra padrao
  pass in all
  # Mata pacotes estranhos
  scrub in all
  # Bloqueando IPs Spoofados
  block in quick on $PLACA_EXT from $Spoofados to any
  # Bloqueando acesso externo ao Squid
  block in on $PLACA_EXT proto tcp from any to any port 3128 flags S/SA keep state
  # Proxy FTP
  block in on $PLACA_EXT proto tcp from any to any port = 8081 keep state
  FTPPORTS="{ 55000 >< 57000 }"   # Range de portas usadas pelo FTP ativo
  pass in quick on $PLACA_EXT proto tcp from any port 20 to $PLACA_EXT
  port $FTPPORTS flags S/SA keep state
  # DROP em redes / ips maliciosos/indesejados
  block in on $PLACA_EXT from 207.46.197.0/24 to any # :^)
  block in on $PLACA_EXT from  to any 208.225.90.0/24 # :-)



6.3 Referências


Configurando um Squid "Ninja"



7. Outras referências


PF-HOW-TO
PF Man page

OpenBSD.org




Last Change: 16/12/2003 11:39 -


GoogleAds