O IPFILTER, também conhecido como IPF, é um firewall cross-platform de código aberto que foi portado para vários sistemas operacionais, incluindo FreeBSD, NetBSD, OpenBSD e Solaris™.
O IPFILTER é um firewall kernel-side e um mecanismo NAT que pode ser controlado e monitorado por programas da área de usuário. As regras de firewall podem ser definidas ou excluídas usando ipf, as regras NAT podem ser definidas ou excluídas usando ipnat, estatísticas em tempo de execução para as partes do kernel IPFILTER podem ser informadas usando ipfstat, e ipmon pode ser usado para logar ações do IPFILTER nos arquivos de log do sistema.
O IPF foi originalmente escrito usando uma lógica de processamento de regra de que “a última regra que corresponder, ganha” e era utilizado apenas regras stateless. Desde então, IPF foi aprimorado para incluir as opções quick
e keep state
.
O FAQ IPF está em http://www.phildev.net/ipf/index.html
. Um arquivo liberado para buscas da lista de discussão IPFilter está disponível em http://marc.info/?l=ipfilter
.
Esta seção do Handbook foca no IPF no que se refere ao FreeBSD. Ele fornece exemplos de regras que contêm as opções quick
e keep state
.
O IPF está incluído na instalação base do FreeBSD como um módulo carregável do kernel, o que significa que um kernel personalizado não é necessário para habilitar o IPF.
Para usuários que preferem compilar estaticamente o suporte ao IPF em um kernel personalizado, consulte as instruções em Capítulo 8, Configurando o kernel do FreeBSD. As seguintes opções do kernel estão disponíveis:
options IPFILTER options IPFILTER_LOG options IPFILTER_LOOKUP options IPFILTER_DEFAULT_BLOCK
onde options IPFILTER
ativa o suporte para o IPFILTER, options IPFILTER_LOG
ativa o log do IPF usando o pseudo-dispositivo de log ipl
para cada regra que tenha a palavra-chave log
, IPFILTER_LOOKUP
ativa as pools IP para acelerar IP lookups, e options IPFILTER_DEFAULT_BLOCK
altera o comportamento padrão para que qualquer pacote que não corresponda a uma regra pass
do firewall seja bloqueado.
Para configurar o sistema para ativar o IPF no momento da inicialização, adicione as seguintes entradas ao /etc/rc.conf
. Essas entradas também ativarão o log e o default pass all
. Para alterar a política padrão para block all
sem compilar um kernel personalizado, lembre-se de adicionar uma regra block all
no final do conjunto de regras.
ipfilter_enable="YES" # Start ipf firewall ipfilter_rules="/etc/ipf.rules" # loads rules definition text file ipv6_ipfilter_rules="/etc/ipf6.rules" # loads rules definition text file for IPv6 ipmon_enable="YES" # Start IP monitor log ipmon_flags="-Ds" # D = start as daemon # s = log to syslog # v = log tcp window, ack, seq # n = map IP & port to names
Se a funcionalidade NAT for necessária, adicione também estas linhas:
gateway_enable="YES" # Enable as LAN gateway ipnat_enable="YES" # Start ipnat function ipnat_rules="/etc/ipnat.rules" # rules definition file for ipnat
Então, inicie o IPF:
#
service ipfilter start
Para carregar as regras de firewall, especifique o nome do arquivo do conjunto de regras usando ipf
. O comando a seguir pode ser usado para substituir as regras de firewall que está em execução:
#
ipf -Fa -f /etc/ipf.rules
onde -Fa
limpa todas as tabelas de regras internas e -f
especifica o arquivo que contém as regras a serem carregadas.
Isso fornece a capacidade de fazer alterações em um conjunto de regras personalizado e atualizar o firewall em execução com uma nova cópia das regras sem precisar reinicializar o sistema. Esse método é conveniente para testar novas regras, pois o procedimento pode ser executado quantas vezes forem necessárias.
Consulte ipf(8) para detalhes sobre as outras flags disponíveis com este comando.
Esta seção descreve a sintaxe de regras IPF usada para criar regras stateful. Ao criar regras, lembre-se de que, a menos que a palavra-chave quick
apareça em uma regra, todas as regras são lidas em ordem, com a última regra correspondente sendo a aplicada. Isso significa que, mesmo que a primeira regra que corresponder a um pacote seja pass
, se houver uma regra de correspondência posterior que seja block
, o pacote será descartado. Os conjuntos de regras de exemplo podem ser encontrados em /usr/share/examples/ipfilter
.
Ao criar regras, um caractere #
é usado para marcar o início de um comentário e pode aparecer no final de uma regra, para explicar a função dessa regra ou em sua própria linha. Todas as linhas em branco são ignoradas.
As palavras-chave usadas nas regras devem ser escritas em uma ordem específica, da esquerda para a direita. Algumas palavras-chave são obrigatórias, enquanto outras são opcionais. Algumas palavras-chave têm sub-opções que podem ser palavras-chave e também incluem mais sub-opções. A ordem das palavras-chave é a seguinte, em que as palavras mostradas em maiúsculas representam uma variável e as palavras mostradas em minúsculas devem preceder a variável que a segue:
ACTION DIRECTION OPTIONS proto PROTO_TYPE from SRC_ADDR SRC_PORT to DST_ADDR DST_PORT TCP_FLAG|ICMP_TYPE keep state STATE
Esta seção descreve cada uma dessas palavras-chave e suas opções. Não é uma lista exaustiva de todas as opções possíveis. Consulte ipf(5) para obter uma descrição completa da sintaxe de regra que pode ser usada ao criar regras IPF e exemplos para usar de cada palavra-chave.
A palavra-chave action indica o que fazer com o pacote se corresponder a essa regra. Toda regra deve ter uma ação. As seguintes ações são reconhecidas:
block
: descarta o pacote.
pass
: permite o pacote.
log
: gera um registro de log.
count
: conta o número de pacotes e bytes que podem fornecer uma indicação da frequência com que uma regra é usada.
auth
: enfileira o pacote para processamento adicional por outro programa.
call
: fornece acesso a funções embutidas no IPF que permitem ações mais complexas.
decapsulate
: remove quaisquer cabeçalhos para processar o conteúdo do pacote.
Em seguida, cada regra deve indicar explicitamente a direção do tráfego usando uma dessas palavras-chave:
in
: a regra é aplicada em um pacote de entrada.
out
: a regra é aplicada em um pacote de saída.
all
: a regra se aplica em qualquer direção.
Se o sistema tiver várias interfaces, a interface pode ser especificada junto com a direção. Um exemplo seria in on fxp0
.
Opções são opcionais. No entanto, se várias opções forem especificadas, elas deverão ser usadas na ordem apresentada aqui.
log
: ao executar a ACTION especificada, o conteúdo dos cabeçalhos do pacote será gravado no pseudo-dispositivo de log ipl(4).
quick
: se um pacote corresponder a essa regra, a ACTION especificada pela regra ocorrerá e nenhum processamento adicional das regras a seguir ocorrerá para este pacote.
on
: deve ser seguido pelo nome da interface conforme exibido pelo ifconfig(8). A regra corresponderá somente se o pacote estiver passando pela interface especificada na direção especificada.
Ao usar a palavra-chave log
, os seguintes qualificadores podem ser usados nesta ordem:
body
: indica que os primeiros 128 bytes do conteúdo do pacote serão registrados após os cabeçalhos.
first
: se a palavra-chave log
estiver sendo usada em conjunto com uma opção keep state
, esta opção é recomendada para que somente o pacote acionador seja logado e não todos os pacotes que corresponde à conexão stateful.
Opções adicionais estão disponíveis para especificar mensagens de retorno de erro. Consulte ipf(5) para mais detalhes.
O tipo de protocolo é opcional. No entanto, é obrigatório se a regra precisar especificar um SRC_PORT ou um DST_PORT, uma vez que isso requer o tipo de protocolo. Ao especificar o tipo de protocolo, use a palavra-chave proto
seguida de um número de protocolo ou nome de /etc/protocols
. Exemplos de nomes de protocolos incluem tcp
, udp
ou icmp
. Se PROTO_TYPE for especificado, mas nenhum SRC_PORT ou DST_PORT for especificado, todos os números de porta desse protocolo corresponderão a essa regra.
A palavra-chave from
é obrigatória e é seguida por uma palavra-chave que representa a origem do pacote. A origem pode ser um nome de host, um endereço IP seguido pela máscara CIDR, um pool de endereços ou a palavra-chave all
. Consulte ipf(5) para exemplos.
Não há como definir intervalos de endereços de IP que não se expressam facilmente usando a notação de formato numérico com ponto / máscara. O pacote ou port net-mgmt/ipcalc pode ser usado para facilitar o cálculo da máscara CIDR. Informações adicionais estão disponíveis na página web da ferramenta: http://jodies.de/ipcalc
.
O número da porta da origem é opcional. No entanto, se for usado, ela exige que o PROTO_TYPE seja definido primeiramente na regra. O número da porta também deve ser precedido pela palavra-chave proto
.
Diferentes operadores de comparação são suportados: =
(igual a), !=
(diferente de), <
(menor que), >
(maior que), <=
(menor ou igual a) e >=
(maior que ou igual a).
Para especificar intervalos de porta, coloque os dois números de porta entre <>
(menor que e maior que), ><
(maior que e menor que) ou :
(maior que ou igual a e menor que ou igual a).
A palavra-chave to
é obrigatória e é seguida por uma palavra-chave que representa o destino do pacote. Semelhante ao SRC_ADDR, ela pode ser um nome de host, um endereço IP seguido pela máscara CIDR, um pool de endereços ou a palavra-chave all
.
Semelhante ao SRC_PORT, o número da porta do destino é opcional. No entanto, se for usada, ela exige que o PROTO_TYPE seja definido primeiramente na regra. O número da porta também deve ser precedido pela palavra-chave proto
.
Se tcp
for especificado como o PROTO_TYPE, flags poderão ser especificadas como letras, onde cada letra representa uma das possíveis flags TCP utilizadas para determinar o estado de uma conexão. Os valores possíveis são: S
(SYN), A
(ACK), P
(PSH), F
(FIN), U
(URG), R
(RST), C
(CWN), e E
(ECN).
Se o icmp
for especificado como o PROTO_TYPE, o tipo ICMP para correspondência pode ser especificado. Consulte o ipf(5) para os tipos permitidos.
Se uma regra pass
contiver keep state
, o IPF incluirá uma entrada em sua tabela de estados dinâmicos e permitirá o tráfego os pacotes subsequentes que correspondam à conexão. O IPF pode rastrear o estado das sessões TCP, UDP e ICMP. Qualquer pacote que o IPF tenha certeza de que faz parte de uma sessão ativa, mesmo que seja um protocolo diferente, será liberado.
No IPF, os pacotes destinados a sair pela interface conectada à Internet pública são verificados primeiro na tabela de estados dinâmicos. Se o pacote corresponder ao próximo pacote esperado, compreendendo uma sessão ativa, ele sairá do firewall e o estado do fluxo da sessão será atualizado na tabela de estados dinâmicos. Os pacotes que não pertencem a uma sessão já ativa são verificados no conjunto de regras de saída. Os pacotes vindos da interface conectada à Internet pública são verificados primeiro na tabela de estados dinâmicos. Se o pacote corresponder ao próximo pacote esperado que compreende uma sessão ativa, ele sairá do firewall e o estado do fluxo da sessão será atualizado na tabela de estados dinâmicos. Os pacotes que não pertencem a uma sessão já ativa são verificados no conjunto de regras de entrada.
Várias palavras-chave podem ser adicionadas depois de keep state
. Se usadas, essas palavras-chave definem várias opções que controlam a filtragem stateful, como a configuração de limites de conexão ou o tempo de vida da conexão. Consulte ipf(5) para obter a lista de opções disponíveis e suas descrições.
Esta seção demonstra como criar um conjunto de regras de exemplo que permite apenas serviços que correspondam às regras pass
e bloqueie todo o resto.
O FreeBSD usa a interface de loopback (lo0
) e o endereço IP 127.0.0.1
para comunicação interna. O conjunto de regras do firewall deve conter regras para permitir o livre movimento desses pacotes usados internamente:
# no restrictions on loopback interface pass in quick on lo0 all pass out quick on lo0 all
A interface pública conectada à Internet é usada para autorizar e controlar o acesso de todas as conexões de entrada e saída. Se uma ou mais interfaces forem cabeadas para redes privadas, essas interfaces internas poderão exigir regras para permitir que os pacotes originados da LAN fluam entre as redes internas ou para a interface conectada à Internet. O conjunto de regras deve ser organizado em três seções principais: quaisquer interfaces internas confiáveis, conexões de saída por meio da interface pública e conexões de entrada por meio da interface pública.
Essas duas regras permitem que todo o tráfego passe por uma interface confiável LAN chamada xl0
:
# no restrictions on inside LAN interface for private network pass out quick on xl0 all pass in quick on xl0 all
As regras para as seções de saída e entrada da interface pública devem ter as regras correspondidas com mais frequência antes das regras menos comuns, com a última regra na seção bloqueando e registrando todos os pacotes para essa interface e direção.
Este conjunto de regras define a seção de saída da interface pública denominada dc0
. Essas regras mantêm o estado e identificam os serviços específicos que os sistemas internos estão autorizados para acesso público à Internet. Todas as regras usam quick
e especificam os números de porta apropriados e, quando aplicável, os endereços de destino.
# interface facing Internet (outbound) # Matches session start requests originating from or behind the # firewall, destined for the Internet. # Allow outbound access to public DNS servers. # Replace x.x.x. with address listed in /etc/resolv.conf. # Repeat for each DNS server. pass out quick on dc0 proto tcp from any to x.x.x. port = 53 flags S keep state pass out quick on dc0 proto udp from any to xxx port = 53 keep state # Allow access to ISP's specified DHCP server for cable or DSL networks. # Use the first rule, then check log for the IP address of DHCP server. # Then, uncomment the second rule, replace z.z.z.z with the IP address, # and comment out the first rule pass out log quick on dc0 proto udp from any to any port = 67 keep state #pass out quick on dc0 proto udp from any to z.z.z.z port = 67 keep state # Allow HTTP and HTTPS pass out quick on dc0 proto tcp from any to any port = 80 flags S keep state pass out quick on dc0 proto tcp from any to any port = 443 flags S keep state # Allow email pass out quick on dc0 proto tcp from any to any port = 110 flags S keep state pass out quick on dc0 proto tcp from any to any port = 25 flags S keep state # Allow NTP pass out quick on dc0 proto tcp from any to any port = 37 flags S keep state # Allow FTP pass out quick on dc0 proto tcp from any to any port = 21 flags S keep state # Allow SSH pass out quick on dc0 proto tcp from any to any port = 22 flags S keep state # Allow ping pass out quick on dc0 proto icmp from any to any icmp-type 8 keep state # Block and log everything else block out log first quick on dc0 all
Neste exemplo de regras na seção de entrada da interface pública todos os pacotes indesejáveis são bloqueados primeiro. Isso reduz o número de pacotes registrados pela última regra.
# interface facing Internet (inbound) # Block all inbound traffic from non-routable or reserved address spaces block in quick on dc0 from 192.168.0.0/16 to any #RFC 1918 private IP block in quick on dc0 from 172.16.0.0/12 to any #RFC 1918 private IP block in quick on dc0 from 10.0.0.0/8 to any #RFC 1918 private IP block in quick on dc0 from 127.0.0.0/8 to any #loopback block in quick on dc0 from 0.0.0.0/8 to any #loopback block in quick on dc0 from 169.254.0.0/16 to any #DHCP auto-config block in quick on dc0 from 192.0.2.0/24 to any #reserved for docs block in quick on dc0 from 204.152.64.0/23 to any #Sun cluster interconnect block in quick on dc0 from 224.0.0.0/3 to any #Class D & E multicast # Block fragments and too short tcp packets block in quick on dc0 all with frags block in quick on dc0 proto tcp all with short # block source routed packets block in quick on dc0 all with opt lsrr block in quick on dc0 all with opt ssrr # Block OS fingerprint attempts and log first occurrence block in log first quick on dc0 proto tcp from any to any flags FUP # Block anything with special options block in quick on dc0 all with ipopts # Block public pings and ident block in quick on dc0 proto icmp all icmp-type 8 block in quick on dc0 proto tcp from any to any port = 113 # Block incoming Netbios services block in log first quick on dc0 proto tcp/udp from any to any port = 137 block in log first quick on dc0 proto tcp/udp from any to any port = 138 block in log first quick on dc0 proto tcp/udp from any to any port = 139 block in log first quick on dc0 proto tcp/udp from any to any port = 81
Sempre que houver mensagens de log em uma regra com a opção log first
, execute ipfstat -hio
para saber quantas vezes a regra foi correspondida. Um grande número de correspondências pode indicar que o sistema está sob ataque.
O restante das regras na seção de entrada define quais conexões podem ser iniciadas a partir da Internet. A última regra nega todas as conexões que não foram explicitamente permitidas pelas regras anteriores desta seção.
# Allow traffic in from ISP's DHCP server. Replace z.z.z.z with # the same IP address used in the outbound section. pass in quick on dc0 proto udp from z.z.z.z to any port = 68 keep state # Allow public connections to specified internal web server pass in quick on dc0 proto tcp from any to x.x.x.x port = 80 flags S keep state # Block and log only first occurrence of all remaining traffic. block in log first quick on dc0 all
Para ativar o NAT, adicione estas instruções ao arquivo /etc/rc.conf
e especifique o nome do arquivo que contém as regras de NAT:
gateway_enable="YES" ipnat_enable="YES" ipnat_rules="/etc/ipnat.rules"
As regras de NAT são flexíveis e podem realizar muitas coisas diferentes para atender às necessidades dos usuários comerciais e domésticos. A sintaxe da regra apresentada aqui foi simplificada para demonstrar um uso comum. Para obter uma descrição completa da sintaxe da regra, consulte ipnat(5).
A sintaxe básica para uma regra NAT é a seguinte, onde map
inicia a regra e IF
deve ser substituído pelo nome da interface externa:
mapIF
LAN_IP_RANGE
->PUBLIC_ADDRESS
O LAN_IP_RANGE
é o intervalo de endereços IP usados pelos clientes internos. Geralmente, é um intervalo de endereços privados, como 192.168.1.0/24
. O PUBLIC_ADDRESS
pode ser o endereço IP externo estático ou a palavra-chave 0/32
que representa o endereço IP atribuído para IF
.
No IPF, quando um pacote chega ao firewall a partir da LAN com um destino público, ele primeiro passa pelas regras de saída do conjunto de regras do firewall. Em seguida, o pacote é passado para o conjunto de regras NAT, o qual é lido de cima para baixo, onde a primeira regra correspondente ganha. O IPF testa cada regra de NAT em relação ao nome da interface e ao endereço IP de origem do pacote. Quando o nome da interface de um pacote corresponde a uma regra NAT, o endereço IP de origem do pacote na LAN privada é verificado para ver se ele está dentro do intervalo de endereços IP especificado em LAN_IP_RANGE
. Se corresponder, o pacote tem seu endereço IP de origem reescrito com o endereço IP público especificado por PUBLIC_ADDRESS
. O IPF adiciona uma entrada em sua tabela NAT interna para que, quando o pacote retornar da Internet, possa ser mapeado de volta para seu endereço IP privado original antes de ser passado para as regras de firewall para processamento adicional.
Para redes que possuem um grande número de sistemas internos ou várias sub-redes, o processo de afunilar todo endereço IP em um único endereço IP público se torna um problema de recursos. Dois métodos estão disponíveis para aliviar esse problema.
O primeiro método é atribuir um intervalo de portas para usar como portas de origem. Adicionando a palavra-chave portmap
, o NAT pode ser direcionado para usar apenas portas de origem no intervalo especificado:
map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp 20000:60000
Como alternativa, use a palavra-chave auto
que informa ao NAT para determinar as portas que estão disponíveis para uso:
map dc0 192.168.1.0/24 -> 0/32 portmap tcp/udp auto
O segundo método é usar um pool de endereços públicos. Isso é útil quando existem muitos clientes na LAN para para usar um único endereço público e um bloco de endereços públicos de IP está disponível. Esses endereços públicos podem ser usados como um pool do qual o NAT seleciona um endereço IP à medida que o endereço de um pacote é mapeado ao sair.
O intervalo de endereços IP públicos pode ser especificado usando uma notação de netmask ou CIDR. Essas duas regras são equivalentes:
map dc0 192.168.1.0/24 -> 204.134.75.0/255.255.255.0 map dc0 192.168.1.0/24 -> 204.134.75.0/24
Uma prática comum é ter um servidor web ou servidor de email publicamente acessível isolado a um segmento de rede interno. O tráfego desses servidores ainda precisa passar por NAT, mas o redirecionamento de porta é necessário para direcionar o tráfego de entrada para o servidor correto. Por exemplo, para mapear um servidor web usando o endereço interno 10.0.10.25
para seu endereço IP público 20.20.20.5
, use esta regra:
rdr dc0 20.20.20.5/32 port 80 -> 10.0.10.25 port 80
Se for o único servidor web, essa regra também funcionará, pois redirecionará todas as solicitações HTTP externas para 10.0.10.25
:
rdr dc0 0.0.0.0/0 port 80 -> 10.0.10.25 port 80
O IPF possui um proxy FTP embutido que pode ser usado com o NAT. Ele monitora todo o tráfego de saída de conexões ativa ou passiva de FTP e cria dinamicamente regras de filtro temporário contendo o número de porta usado pelo canal de dados FTP. Isso elimina a necessidade de abrir grandes intervalos de portas altas para conexões de FTP.
Neste exemplo, a primeira regra chama o proxy no tráfego de saída FTP da LAN interna. A segunda regra passa o tráfego de FTP do firewall para a Internet, e a terceira regra lida com todo o tráfego não FTP da LAN interna:
map dc0 10.0.10.0/29 -> 0/32 proxy port 21 ftp/tcp map dc0 0.0.0.0/0 -> 0/32 proxy port 21 ftp/tcp map dc0 10.0.10.0/29 -> 0/32
As regras map
de FTP vem antes da regra NAT, de modo que quando um pacote corresponder a uma regra FTP, o proxy FTP crie regras temporárias de filtragem para permitir que os pacotes da sessão FTP sejam liberados e que passem pelo NAT. Todos os pacotes de rede local que não sejam FTP não corresponderão às regras de FTP, mas serão liberados pelo NAT se corresponderem à terceira regra.
Sem o proxy FTPem, as seguintes regras de firewall seriam necessárias. Note que sem o proxy, todas as portas acima de 1024
precisam ser permitidas:
# Allow out LAN PC client FTP to public Internet # Active and passive modes pass out quick on rl0 proto tcp from any to any port = 21 flags S keep state # Allow out passive mode data channel high order port numbers pass out quick on rl0 proto tcp from any to any port > 1024 flags S keep state # Active mode let data channel in from FTP server pass in quick on rl0 proto tcp from any to any port = 20 flags S keep state
Sempre que o arquivo contendo as regras de NAT for editado, execute ipnat
com -CF
para excluir as regras atuais de NAT e liberar o conteúdo da tabela de tradução dinâmica. Inclua -f
e especifique o nome do conjunto de regras NAT para carregar:
#
ipnat -CF -f /etc/ipnat.rules
Para exibir as estatísticas de NAT:
#
ipnat -s
Para listar os mapeamentos atuais da tabela NAT:
#
ipnat -l
Para ativar o modo verbose e exibir informações relacionadas ao processamento de regras, regras ativas e registros nas tabelas:
#
ipnat -v
O IPF inclui o ipfstat(8) que pode ser usado para recuperar e exibir estatísticas das regras sendo utilizadas enquanto os pacotes passam pelo firewall. As estatísticas são acumuladas desde que o firewall foi iniciado pela última vez ou desde a última vez que foram redefinidas para zero usando ipf -Z
.
A saída padrão do ipfstat
é semelhante a esta:
input packets: blocked 99286 passed 1255609 nomatch 14686 counted 0 output packets: blocked 4200 passed 1284345 nomatch 14687 counted 0 input packets logged: blocked 99286 passed 0 output packets logged: blocked 0 passed 0 packets logged: input 0 output 0 log failures: input 3898 output 0 fragment state(in): kept 0 lost 0 fragment state(out): kept 0 lost 0 packet state(in): kept 169364 lost 0 packet state(out): kept 431395 lost 0 ICMP replies: 0 TCP RSTs sent: 0 Result cache hits(in): 1215208 (out): 1098963 IN Pullups succeeded: 2 failed: 0 OUT Pullups succeeded: 0 failed: 0 Fastroute successes: 0 failures: 0 TCP cksum fails(in): 0 (out): 0 Packet log flags set: (0)
Várias opções estão disponíveis. Quando executado com -i
para entrada ou -o
para saída, o comando recuperará e exibirá a lista apropriada de regras de filtro atualmente instaladas e em uso pelo kernel. Para também ver os números das regras, inclua -n
. Por exemplo, ipfstat -on
exibe a tabela de regras de saída com os números de regra:
@1 pass out on xl0 from any to any @2 block out on dc0 from any to any @3 pass out quick on dc0 proto tcp/udp from any to any keep state
Inclua -h
para prefixar cada regra com uma contagem de quantas vezes a regra foi utilizada. Por exemplo, ipfstat -oh
exibe a tabela de regras internas de saída, prefixando cada regra com sua contagem de uso:
2451423 pass out on xl0 from any to any 354727 block out on dc0 from any to any 430918 pass out quick on dc0 proto tcp/udp from any to any keep state
Para exibir a tabela de estados em um formato similar ao top(1), use ipfstat -t
. Quando o firewall está sob ataque, essa opção fornece a capacidade de identificar e ver os pacotes de ataque. As sub-flags opcionais dão a possibilidade de selecionar o IP destino ou origem, porta ou protocolo a ser monitorado em tempo real. Consulte ipfstat(8) para detalhes.
O IPF fornece o ipmon
, que pode ser usado para gravar as informações de log do firewall em um formato legível por humanos. Isso requer que as opções IPFILTER_LOG
sejam primeiramente adicionadas a um kernel personalizado usando as instruções em Capítulo 8, Configurando o kernel do FreeBSD.
Esse comando geralmente é executado no modo daemon para fornecer um arquivo de log contínuo do sistema para que o registro de eventos passados possa ser revisado. Como o FreeBSD possui um recurso syslogd(8) integrado para rotacionar automaticamente os logs do sistema, a instrução ipmon_flags
no arquivo rc.conf
por padrão utiliza -Ds
:
ipmon_flags="-Ds" # D = start as daemon # s = log to syslog # v = log tcp window, ack, seq # n = map IP & port to names
O registro em log fornece a capacidade de revisar, após o fato, informações como quais pacotes foram descartados, de que endereços eles vieram e para onde estavam indo. Esta informação é útil para rastrear invasores.
Uma vez que o recurso de criação de log esteja ativado no arquivo rc.conf
e iniciado com o serviço ipmon start
, o IPF irá registrar apenas as regras que contêm a palavra-chave log
. O administrador do firewall decide quais regras no conjunto de regras devem ser logadas e normalmente apenas as regras de negação são registradas. É costume incluir a palavra-chave log
na última regra do conjunto de regras. Isso possibilita ver todos os pacotes que não correspondem a nenhuma das regras do conjunto de regras.
Por padrão, o modo ipmon -Ds
usa local0
como o recurso de log. Os níveis de registro a seguir podem ser usados para separar ainda mais os dados logados:
LOG_INFO - pacotes logados usando a palavra-chave "log" ao invés da ação pass ou block. LOG_NOTICE - pacotes logados que também são liberados LOG_WARNING - pacotes logados que também são bloqueados LOG_ERR - pacotes que foram logados e que podem ser considerados insuficientes devido a um cabeçalho incompleto
Para configurar o IPF para logar todos os dados em /var/log/ipfilter.log
, primeiro crie o arquivo vazio:
#
touch /var/log/ipfilter.log
Em seguida, para gravar todas as mensagens de log no arquivo especificado, inclua a seguinte instrução no arquivo /etc/syslog.conf
:
local0.* /var/log/ipfilter.log
Para ativar as alterações e instruir o syslogd(8) para ler o arquivo modificado /etc/syslog.conf
, execute service syslogd reload
.
Não se esqueça de editar o /etc/newsyslog.conf
para rotacionar o novo arquivo de log.
As mensagens geradas pelo ipmon
consistem em campos de dados separados por espaços em branco. Campos comuns a todas as mensagens são:
A data do recebimento do pacote.
O horário do recebimento do pacote. Isto está no formato HH:MM:SS.F, para horas, minutos, segundos e frações de segundo.
O nome da interface que processou o pacote.
O grupo e o número da regra no formato @0:17
.
A ação: p
para liberado (pass), b
para bloqueado, S
para um pacote com problema (short), n
não corresponde a nenhuma regra e L
para uma regra de log.
Os endereços escritos em três campos: o endereço de origem e porta separados por uma vírgula, o símbolo -> , e o endereço e porta de destino. Por exemplo: 209.53.17.22,80 -> 198.73.220.17,1722
.
PR
seguido pelo nome ou número do protocolo: por exemplo, PR tcp
.
len
seguido pelo tamanho do cabeçalho e comprimento total do pacote: por exemplo, len 20 40
.
Se o pacote for um pacote TCP, haverá um campo adicional começando com um hífen seguido por letras correspondentes a quaisquer flags que foram configuradas. Consulte ipf(5) para obter uma lista de letras e suas flags.
Se o pacote for um pacote ICMP, haverá dois campos no final: o primeiro sempre sendo “icmp” e o próximo sendo a mensagem ICMP e sub-tipo de mensagem, separados por uma barra. Por exemplo: icmp 3/3
para uma mensagem port unreachable.
All FreeBSD documents are available for download at https://download.freebsd.org/ftp/doc/
Questions that are not answered by the
documentation may be
sent to <freebsd-questions@FreeBSD.org>.
Send questions about this document to <freebsd-doc@FreeBSD.org>.