Introdução
Existem muitos artigos sobre como configurar o FreeBSD e o PF no Runet, mas todos eles estão dispersos e não sistemáticos. E para qualquer coisa mais ou menos interessante, como roteamento por meio de um firewall (Policy Based Routing), você deve ler a documentação original, por exemplo, o OpenBSD PF FAQ . No entanto, existem diferenças na sintaxe de comando do FreeBSD e do OpenBSD. Nesta série de artigos, tentamos sistematizar e analisar as capacidades do PF do simples ao complexo. Com certeza, este artigo introdutório será semelhante a todos os outros artigos sobre Filtro de pacotes. Portanto, aqueles que já estão familiarizados com os recursos básicos não se interessarão. No entanto, não se pode prescindir de uma introdução, e a carne estará nos próximos artigos.
PF - Packet Filter é um firewall originalmente criado pelo projeto OpenBSD. Transferido para o FreeBSD em 2003. Em 2004 foi integrado ao sistema principal. Características principais:
- Filtragem baseada em endereços, portas, protocolos, interfaces
- NAT - Source NAT, substituição do endereço do remetente. Destino nat, falsificação do endereço do destinatário, encaminhamento de porta
- Scrub - normalização do tráfego de rede. Ajuda com alguns tipos de ataques dos com base na formação de pacotes especialmente preparados
- SYN-proxy - Proteção contra ataques de inundação de SYN
- Balanceamento de conexões
- — pfcync , , CARP, ,
- ( IP-, 2 )
- —
- — IP
- — ,
- (anchors) — , IPTables Linux
- pfstat
A principal diferença do mesmo IPTables é o esquema incomum de trabalho. O processamento em lote não termina após a primeira correspondência de regra. Ou seja, se você definir a primeira regra para "negar tudo" , o pacote não será descartado, mas será marcado como proibido, irá mais longe de acordo com as regras e, se nenhuma regra permitir, será descartado . É importante entender e usar isso. No entanto, se desejado, esse comportamento pode ser substituído pelo parâmetro rápido na regra.
Gestão e comandos úteis
Para habilitar o PF, basta especificar as opções no arquivo "/etc/rc.conf":
pf_enable="YES" # pf pf_flags="" # pfctl pf_rules="/etc/pf.conf" # pflog_enable="YES" # pflog pflog_flags="" # pflog pflog_logfile="/var/log/pflog" #
Comandos de firewall básicos:
pfctl - # Habilitar firewall
pfctl -d # Desabilitar firewall
pfctl -nf # Verifique a sintaxe do arquivo
pfctl -f # Releia regras do arquivo
pfctl -Rf # Releia regras de filtro do arquivo
pfctl -Nf # Releia regras NAT do arquivo
pfctl -sa # Ver todos os estados
pfctl -s # Ver regras de filtragem
pfctl -sn # Ver regras NAT
pfctl -s Âncoras -v # Ver árvore de âncoras
pfctl -ss # Ver conexões atuais
Estrutura do arquivo de configuração e configurações básicas
O arquivo de configuração consiste em seções:
- Macros
- Mesas
- Opções
- Regras de normalização de tráfego (scrub)
- Filas, priorização e controle de velocidade
- Tradução de endereço NAT
- Filtragem de pacotes
As regras geralmente têm a seguinte sintaxe:
action [direction] [log] [quick] [on interface] [af] [proto protocol] [from src_addr [port src_port]] [to dst_addr [port dst_port]] [flags tcp_flags] [state]
action - o que deve ser feito com a
direção do pacote - in out,
log direction - se o pacote entrará em pflog
rapidamente - se o pacote cair sob esta regra, então não haverá processamento adicional. Esta regra será a última para o pacote de
interface - o nome da interface de rede
af - família de endereços, inet ou inet6, IPv4 ou IPv6, respectivamente
protocolo - protocolo da camada 4, por exemplo: tcp, udp, icmp
scr_addr, dst_addr - source e
endereços de destino src_port, dst_port - portas
tcp_flags - sinalizadores tcp
estado - opções para salvar o estado. Por exemplo, manter o estado significaria que a conexão é mantida na tabela de estados e os pacotes de resposta podem passar. Comportamento padrão.
Pegue o servidor da web mais simples em um vácuo. É necessário abrir conexões de entrada nas portas tcp 22, 80, 443 (ssh, http, https). Você também precisa abrir conexões de saída nas portas tcp 22, 80, 443 (ssh, http, https) e udp 53, 123 (dns e ntp). Proibir tudo o mais.
# ee pf.conf #macros section permit_tcp_ports="22,80,443" permit_udp_ports="53,123" #table section # #options section set block-policy return # , set skip on lo0 # , #scrub section scrub in all # #Queueing section # #nat section # , #filtering section block all # , , . pass in proto tcp to port { $permit_tcp_ports } # pass out proto tcp to port { $permit_tcp_ports } # tcp pass out proto udp to port { $permit_udp_ports } # udp pass out inet proto icmp # icmp
Em seguida,
inserimos o comando de verificação de sintaxe: pfctl -nf pf.conf
Se não houver mensagens de erro, insira o comando para aplicar as regras:
pfctl -f pf.conf
Para verificar, vamos ver as regras de filtragem:
# pfctl -sr scrub in all fragment reassemble block return all pass out proto tcp from any to any port = ssh flags S/SA keep state pass out proto tcp from any to any port = http flags S/SA keep state pass out proto tcp from any to any port = https flags S/SA keep state pass out proto udp from any to any port = domain keep state pass out proto udp from any to any port = ntp keep state pass out inet proto icmp all keep state pass in proto tcp from any to any port = ssh flags S/SA keep state pass in proto tcp from any to any port = http flags S/SA keep state pass in proto tcp from any to any port = https flags S/SA keep state
Como você pode ver, as macros são expandidas em regras separadas para cada porta, a ordem é alterada automaticamente. Caso contrário, tudo está como deveria ser.
Resultado
Descobrimos o que é o Filtro de Pacotes, aprendemos seus principais recursos. Descobri a estrutura da configuração do PF e suas principais seções. Criamos a configuração mais simples, que, no entanto, é bastante funcional, incluindo macros, normalização de pacotes e filtragem de pacotes de entrada e saída. No próximo artigo, daremos uma olhada mais de perto nas regras de filtragem, gerenciamento de estado e sinalizadores.
Nossa solução, Internet Control Server, é um gateway de segurança construído sobre o FreeBSD. Este sistema foi escolhido por causa de sua estabilidade, velocidade da pilha de rede, suporte ZFS integrado no kernel e falta de problemas de licença. Além disso, trabalhar com o FreeBSD é agradável, embora não seja simples. Mas teremos o maior prazer em compartilhar essa experiência com você!