[Anterior: Redundância de Firewall com CARP e pfsync] [Conteúdo]
[ COMP1 ] [ COMP3 ]
| |
---+------+-----+------- xl0 [ OpenBSD ] fxp0 -------- ( Internet )
|
[ COMP2 ]
Existem vários computadores na rede interna; o diagrama mostra apenas três, mas o número real é irrelevante. Esses computadores são estações de trabalho usadas para navegar na Internet, ler mensagens de correio eletrônico, usar programas de bate-papo virtual, etc., exceto COMP3, que também roda um pequeno servidor Web. A rede interna usa o bloco de rede 192.168.0.0 / 255.255.255.0.
O firewall OpenBSD é um Celeron 300 com duas placas de rede: uma 3com 3c905B (xl0) e uma Intel EtherExpress Pro/100 (fxp0). Ele possui uma conexão a cabo com a Internet e faz NAT para compartilhar o acesso com a rede interna. O endereço IP na interface externa é atribuído dinamicamente pelo Provedor de Acesso à Internet.
ext_if="fxp0"
int_if="xl0"
tcp_services = "{ 22, 113 }"
icmp_types = "echoreq"
comp3="192.168.0.3"
As primeiras duas linhas definem as interfaces de rede onde a filtragem acontecerá. Definindo elas aqui, se precisarmos mover esse sistema para outra máquina com hardware diferente, podemos alterar apenas essas duas linhas e o resto das regras continuarão utilizáveis. A terceira e quarta linha listam os números de portas TCP dos serviços que serão abertos para a Internet (SSH e ident/auth) e os tipos de pacotes ICMP que terão permissão de alcançar a máquina do firewall. Finalmente, a última linha define o endereço IP de COMP3.
Nota: Caso a conexão com a Internet necessite do PPPoE, então filtragem e NAT devem acontecer na interface tun0 e não em fxp0.
set block-policy return
set loginterface $ext_if
Todo sistema Unix possui uma interface "loopback". Esta é uma interface de rede virtual que é utilizada por aplicativos para conversarem entre si dentro do sistema. No OpenBSD, a interface loopback é a lo(4). É recomendado desabilitar qualquer filtragem nas interfaces loopback; use set skip para fazer isso.
set skip on loNote que nós estamos usando skip no grupo de interface lo inteiro, dessa maneira nós podemos mais tarde adicionar interfaces loopback adicionais e não precisamos nos preocupar em alterar essa parte do nosso arquivo de regras.
match in all scrub (no-df)
nat on $ext_if from !($ext_if) to any -> ($ext_if)
O "!($ext_if)" poderia ser facilmente substituído por "$int_if" nesse caso, mas caso você tenha múltiplas interfaces internas, você precisaria ter que adicionar mais regras NAT, ao passo que, com essa estrutura, a NAT será feita em todas as interfaces protegidas.
Já que o endereço IP da interface externa é atribuído dinamicamente, parêntesis devem ser colocados em volta da interface de tradução, assim o PF notará qualquer alteração no endereço.
Como queremos que o proxy FTP funcione, adicionaremos uma âncora NAT também:
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr on $int_if proto tcp from any to any port 21 -> 127.0.0.1 port 8021
Note que essa regra somente captura conexões destinadas à porta 21. Caso usuários se conectem a servidores FTP em outras portas, então uma lista deve ser utilizada para especificar as portas de destino, por exemplo: from any to any port { 21, 2121 }.
A última regra de redirecionamento captura qualquer tentativa de conexão vinda da Internet em direção à porta TCP 80 no firewall. Tentativas legítimas de conexão nessa porta serão de usuários tentando acessar o servidor Web da rede. Essas tentativas de conexão devem ser redirecionadas para COMP3:
rdr on $ext_if proto tcp from any to any port 80 -> $comp3
block in
Nesse ponto todo o tráfego tentando entrar em uma interface será bloqueado, mesmo os da interface de rede interna. As regras seguintes abrem o firewall de acordo com os objetivos descritos acima, e abrem também quaisquer interfaces virtuais que se façam necessárias.
Tenha em mente que o pf pode bloquear o tráfego que entra e sai de uma interface. Para simplificar sua vida, você pode escolher fazer a filtragem de tráfego em apenas uma direção em vez de bloquear entrada e saída. Em nosso caso optamos por filtrar o tráfego de entrada, mas uma vez filtrada a entrada não tentaremos obstruir sua saída, portanto faremos o seguinte:
pass out keep state
Precisamos ter uma âncora para o ftp-proxy(8):
anchor "ftp-proxy/*"É bom usar também a proteção contra falsificações:
antispoof quick for { lo $int_if }
Agora abrimos as portas usadas pelos serviços que estarão disponíveis para a Internet. Primeiro, o tráfego que é destinado ao firewall em si:
pass in on $ext_if inet proto tcp from any to ($ext_if) \
port $tcp_services flags S/SA keep state
Especificar as portas na macro $tcp_services simplifica a abertura de serviços adicionais para a Internet através da simples edição da macro e recarregamento do conjunto de regras. Serviços UDP também podem ser abertos com a criação de uma macro $udp_services e a adição de uma regra de filtragem, similar a anterior, que especifique proto udp.
Além de ter uma regra rdr que redireciona o tráfego do servidor Web para COMP3, ainda PRECISAMOS permitir a passagem do tráfego através do firewall:
pass in on $ext_if inet proto tcp from any to $comp3 port 80 \
flags S/SA synproxy state
Para aumentar um pouco a segurança, faremos uso do Proxy de Pacotes TCP SYN com o intuito de proteger o servidor Web.
Tráfego ICMP precisa ser permitido:
pass in inet proto icmp all icmp-type $icmp_types keep state
Similar à macro $tcp_services, a macro $icmp_types pode ser facilmente editada para alterar os tipos de pacotes ICMP que terão permissão de passar pelo firewall. Note que essa regra se aplica a todas as interfaces de rede.
Agora o tráfego deve passar "de" e "para" a interface interna. Assumiremos que os usuários da rede interna sabem o que estão fazendo e não nos causarão problemas. Essa não é necessariamente uma suposição válida; um conjunto de regras muito mais restritivo pode ser apropriado para muitos ambientes.
pass in quick on $int_if
Tráfego TCP, UDP e ICMP pode sair do firewall com destino à Internet de acordo com a linha "pass out keep state" anterior. A informação de estado das conexões é mantida de forma que pacotes que retornam passarão pelo firewall.
# Macros
ext_if="fxp0"
int_if="xl0"
tcp_services="{ 22, 113 }"
icmp_types="echoreq"
comp3="192.168.0.3"
# Opções
set block-policy return
set loginterface $ext_if
set skip on lo
# Scrub
match in all scrub (no-df)
# Nat/rdr
nat on $ext_if from !($ext_if) -> ($ext_if:0)
nat-anchor "ftp-proxy/*"
rdr-anchor "ftp-proxy/*"
rdr pass on $int_if proto tcp to port ftp -> 127.0.0.1 port 8021
rdr on $ext_if proto tcp from any to any port 80 -> $comp3
# Regras de filtragem
block in
pass out keep state
anchor "ftp-proxy/*"
antispoof quick for { lo $int_if }
pass in on $ext_if inet proto tcp from any to ($ext_if) \
port $tcp_services flags S/SA keep state
pass in on $ext_if inet proto tcp from any to $comp3 port 80 \
flags S/SA synproxy state
pass in inet proto icmp all icmp-type $icmp_types keep state
pass in quick on $int_if
|
[Anterior: Redundância de Firewall com CARP e pfsync] [Conteúdo]