De acordo com as Leis 12.965/2014 e 13.709/2018, que regulam o uso da Internet e o tratamento de dados pessoais no Brasil, ao me inscrever na newsletter do portal DICAS-L, autorizo o envio de notificações por e-mail ou outros meios e declaro estar ciente e concordar com seus Termos de Uso e Política de Privacidade.
Colaboração: Ali Faiez Taha
Data de Publicação: 17 de fevereiro de 2012
Nativo no Sistema Operacional OpenBSD e já portado para outros baseados em BSD, tais como FreeBSD, PCBSB, NetBSD e etc.
Permite fazer NAT, controle de banda, priorização de pacotes e etc.
A grande vantagem do PF, sobre outros tipos de sistemas de Firewall, é possibilidade de criação de macros ( que são variáveis, como em programas, definidas pelo usuário e que podem armazenar ips, interfaces, etc ), tabelas ( listagem de endereços que são filtrados por uma única regra ), scrub ( reprocessamento de pacotes para normalização e desfragmentação ), NAT e regras de filtragem que podem ser feitas de acordo com o modo em que chegam as interfaces de uma máquina.
Um bom tutorial sobre o PF: http://www.openbsd.org/faq/pf/pt/index.html
O objetivo desta dica é criar uma rede Intranet controlada através do Firewall PF. O Sistema Operacional utilizado é o FreeBSD 9.0
O servidor contém duas placas de rede, uma com IP A.B.C.D e a outra que controla a Intranet e com IP 192.168.0.X.
Nas distribuições *BSD o Kernel já está preparado para trabalhar com o PF.
Pode-se fazer alterações no Kernel do FreeBSD e efetuar configurações nos arquivos relacionados ao Firewall PF.
Editar o Kernel e adicionar o seguinte conteúdo
device pf device pflog device pfsync options ALTQ options ALTQ_CBQ # Class Bases Queuing (CBQ) options ALTQ_RED # Random Early Detection (RED) options ALTQ_RIO # RED In/Out options ALTQ_HFSC # Hierarchical Packet Scheduler (HFSC) options ALTQ_PRIQ # Priority Queuing (PRIQ) options ALTQ_NOPCC # Required for SMP build
Essa configuração permite que se tenha Firewall sincronizados (pfsync) e controle de uso de banda (ALTQ). Pode-se alterar as configurações para um firewall mais simples.
Siga o tutorial citado acima para fazer uma configuração de acordo com suas necessidades.
Depois do Kernel compilado e instalado, deve-se configurar o arquivo de inicialização (/etc/rc.conf) com os seguintes parâmetros:
pf_enable="YES" pf_rules="/etc/pf.conf" pf_flags="" pflog_enable="YES" pflog_logfile="/var/log/pf/pflog" pflog_flags=""
Isso diz que o Firewall PF está habilitado, indica o arquivo de configuração
e os logs gerados pelo Firewall serão armazenados em (/var/log/pf/pflog
)
O próximo passo é configurar o arquivo de controle do Firewall PF
(/etc/pf.conf
)
# Rede INTRANET controlada ext_if = "rl0" ext_addr = "A.B.C.D/32" int_if = "vr0" int_ip = "192.168.0.1/32" int_net = "192.168.0.0/24" portas_tcp = "{ 25, 80, 443, 8000, 50000 }" portas_udp = "{ 50000 }" popimap = "{ 110, 995, 143, 993 }" # Tabela contendo todos endereços IP atribuidos ao firewall table < private > const { 127/8, 192.168/16, 172.16/12, 10/8 } table < firewall > const { self } table < intranet > const { 192.168.0.0/24 } table < permitidos > const { A.B.C.D/32, E.F.G.H/32 } table < rdesktop > const {A.B.C.D/32, E.F.G.H/32 } table < scanners > persist file "/etc/scanners" # Regras para limites set limit { states 10000, frags 5000 } set optimization normal set block-policy drop set require-order yes set loginterface $ext_if set loginterface $int_if # Faz scrub em pacotes que chegam scrub all # Redireciona as conexões na porta 3189 para o IP 192.168.0.2 nat on $ext_if from $int_net to any -> ($ext_if) rdr on $ext_if inet proto tcp from < rdesktop > to $ext_addr port 3389 -> 192.168.0.2 port 3389 # Define o política padrao - Libera tudo pass in all pass out all # Libera RDESKTOP para IPs permitidos pass in on $ext_if inet proto tcp from < rdesktop > to < permitidos > port 3389 # Bloqueio de "OS Fingerprinting" do nmap (opção -O), que tenta # descobrir o sistema operacional do host. # Bloqueia os pacotes TCP que tem flags que podem levar a # identificacao do SO. block in log quick proto tcp flags FUP/WEUAPRSF block in log quick proto tcp flags WEUAPRSF/WEUAPRSF block in log quick proto tcp flags SRAFU/WEUAPRSF block in log quick proto tcp flags /WEUAPRSF block in log quick proto tcp flags SR/SR block in log quick proto tcp flags SF/SF # Aceita tráfego em qualquer direção na interface de loopback pass quick on lo0 all pass out quick on lo0 all # RFC1918 block drop in quick on $ext_if from < private > to any block drop out quick on $ext_if from any to < private > # Início regras extras # Bloqueia todos os pacotes de entrada mas permite o SSH. # Permite passar todos os pacotes de saída e faz os logs dos pacotes bloqueados. # Permite uma taxa de conexão 1/10, ou seja: 10 conexões por minutoi, e máximo de 10 conexões. block in log on $ext_if all pass in on $ext_if inet proto tcp from < rdesktop > to any port 3389 pass in on $ext_if proto tcp from any to $ext_if port 22 \ flags S/SA (max-src-conn 10, max-src-conn-rate 1/10, \ overload < scanners > flush global) # Bloqueia o acesso dos proibidos por excesso de tentativas de SSH block drop in log on $ext_if proto tcp from < scanners > to $ext_if port 22 pass in on $ext_if proto tcp from any to $ext_if port $portas_tcp flags S/SA pass in on $ext_if proto udp from any to $ext_if port $portas_udp # traceroute pass in on $ext_if inet proto udp from any to any port 33433 >< 33626 pass in on $ext_if inet proto icmp all icmp-type echoreq # #regras de saída # pass out on $ext_if proto { tcp, udp, icmp } all # Regras para segurar E-Mail interno só para o servidor. block out log on $int_if proto tcp from $int_net to any port 25 pass out on $int_if proto tcp from $int_net to $int_ip port 25 block in log on $int_if proto tcp from any to any port smtp block out log on $int_if proto { tcp, udp } from $int_net to any port $popimap # Fim das regras extras # Ativa proteção contra SPOOF na interface interna antispoof quick for $int_if inet # Permite conexões ssh vindas apenas da rede interna, e se for # de um computador confiável, 192.168.0.2. usa "block return" de # forma que um TCP RST é enviado para derrubar conexões bloqueadas. # usa "quick" para que esta regra não seja invalidada por alguma # regra "pass" abaixo. block return in quick on $int_if proto tcp from ! 192.168.0.2 to $int_if port ssh flags S/SA # Permite apenas os IPs permitidos a fazer conexão SSH pass in log on $ext_if proto tcp from < permitidos > to ! < firewall > \ port ssh flags S/SA synproxy state # Limita em 10 conexões SSH simultaneas, vindas dos IPs autorizados pass in quick on $ext_if inet proto tcp from < permitidos > to $ext_addr \ port 22 flags S/SA (max-src-states 10) pass in quick on $ext_if inet proto { tcp, udp } from < permitidos > to $ext_if \ port 80 flags S/SA # Permit incoming ICMP echo requests to this host pass in quick log-all on $ext_if inet proto icmp all icmp-type 8 code 0 # Libera NETBIOS apenas para a Intranet pass in log proto { tcp, udp } from < intranet > to < intranet > port { 137, 138, 139 } ### Bloqueia acesso externo para portas 137,138 e 139 block out log proto { tcp, udp } from < intranet > to $ext_if port { 137, 138, 139 }
Examine as regras e veja o que está sendo permitido e o que está sendo negado.
O serviço SMTP está bem controlado? Como ele está para a rede Interna?
E os controles de conexão SSH? Como estão?
Tem algum NAT rodando? Como identificar?
E a rede NetBIOS? Está controlada?
Colocar no arquivo (/etc/sysctl.conf
) o seguinte, para permitir
redirecionamento de Pacotes IP:
net.inet.ip.forwarding=1
Isso deve ser feito pois o Firewall PF vai trabalhar como roteador também.
Criar o diretório /var/log/pf
e o arquivo /var/log/pf/pflog
, onde
serão armazenados os logs do Firewall.
Ajustar o recurso de Rotação de Logs no arquivo /etc/newsyslog.conf
. Com a
configuração abaixo será armazenado logs de 365 dias.
/var/log/pf/pflog 600 365 100 @T00 JB /var/run/pflogd.pid
O comando pfctl
é essencial. Sua utilização é bastante simples e apresenta
poucos argumentos de controle.
Alguns comandos úteis:
Desabilitar o Firewall | pfctl -d |
Habilitar o Firewall | pfctl -e |
Ativar as regras do Firewall | pfctl -f /etc/pf.conf |
Limpar as regras do Firewall | /sbin/pfctl -F rules |
Lista as tabelas existentes | pfctl -s Tables |
Lista o conteúdo de uma tabela | pfctl -t permitdos -T show |
Adicionar um IP a uma tabela | pfctl -t spammers -T add 218.70.0.0/16 |
Elimina uma IP de uma tabela | pfctl -t spammers -T delete 218.70.0.0/16 |
Limpa as regras de NAT e recarrega o Firewall | /sbin/pfctl -F nat && /sbin/pfctl -N /etc/pf.conf |
Limpa todas as regras de filtro e recarrega o Firewall | /sbin/pfctl -F rules && /sbin/pfctl -R /etc/pf.conf |
Mostra informações dos filtros (estatísticas e contadores) | pfctl -s info |
Mostra a lista atual de filtros de MAPs e redirecionamento e sessões ativas | /sbin/pfctl -s state |
Estatísticas de cada regra individual | /sbin/pfctl -s rules -v |
Mostra o uso da memória | pfctl -s memory |
Mostra informações gerais | pfctl -s info |
Mostra todas as informações do Firewall | pfctl -s all |
Mais detalhes do comando pfctl | man pfctl |
O arquivo /var/log/pf/pflog é um arquivo binário. Deve-se usar o tcpdump para examinar o seu conteúdo | tcpdump -i pflog0 |
Leitura dos logs de atividades do PF | tcpdump -n -e -ttt -r /var/log/pf/pflog |
Criar uma tabela a partir de um arquivo texto que contém uma lista de endereços
IP que fazem SPAM: Acrescentar ao arquivo (/etc/pf.conf
) o seguinte trecho:
table persist file "/etc/spammers" block in on rl0 from to any
This policy contains information about your privacy. By posting, you are declaring that you understand this policy:
This policy is subject to change at any time and without notice.
These terms and conditions contain rules about posting comments. By submitting a comment, you are declaring that you agree with these rules:
Failure to comply with these rules may result in being banned from submitting further comments.
These terms and conditions are subject to change at any time and without notice.
Comentários