E então? Foi complicada a instalação do OpenBSD?
A princípio, pode assustar (principalmente o particionamento :) ), mas, prometo que agora será mais leve!
Vamos à configuração do nosso greylisting.
Primeiramente, precisamos habilitar o sistema operacional a repassar pacotes de uma interface para a outra, e, além disso, habilitar a ativação do packet filter no boot.
Edite o /etc/sysctl.conf e descomente a seguinte linha:
Edite também o arquivo /etc/rc.conf e adicione a seguinte linha:
Agora, partiremos para a configuração da Bridge.
Para cada interface de rede, é necessário criar um arquivo de configuração. Para a interface xl0, que será ligada à Internet, crie o arquivo /etc/hostname.xl0 . Edite o arquivo e adicione o seguinte (lembre-se o que combinamos no post anterior: no lugar dos IPs representados por letras deve ser usado um IP válido na Internet):
O IP usado na interface externa (xl0) deve pertencer à mesma sub-rede dos seus servidores de e-mail.
Agora para a interface xl1, crie o /etc/hostname.xl1 e adicione no arquivo:
E, na interface xl2, crie o /etc/hostname.xl2 e adicione no arquivo:
Agora, devemos colocar todas estas interfaces como parte da bridge. Para isso, crie o arquivo /etc/bridgename.bridge0 e adicione o seguinte:
Agora, é necessário configurar o spamd. Para isso, edite o arquivo /etc/rc.conf e habilite as seguintes configurações:
O spamd pode consultar listas públicas onde são cadastrados domínios que já enviaram Spam. Isso pode ser configurado no arquivo /etc/spamd.conf . Eu nunca testei essas consultas pois faço isso em outro momento no sistema. Minha configuração é a seguinte:
É muito importante que você leia o manual do spamd.conf e entenda o que quer dizer cada linha desta, e, principalmente, como estas listas branca e negra se anulam. Basicamente, nesta configuração, estou dizendo em qual arquivo estão os IPs que não precisam ser filtrados (whitelist) e em qual arquivo estão os IPs dos quais não quero receber e-mail de maneira alguma (blacklist). Mesmo que não os utilize, crie os arquivos whitelist.conf e blacklist.conf
Agora, a parte mais divertida e elaborada desta implementação: a configuração do pf! Adianto que ela não foi desenvolvida por mim, mas sim por Graham Toal, da Universidade do Texas. O link onde ele disponibilizou isso não está mais no ar. Portanto, coloco aqui para prosperar a criação de Graham (que não é o Bell, mas sim o Toal. Thanks Graham! (os dois!) ). Enfim, fiz apenas algumas pequenas adaptações para facilitar o entendimento do arquivo, o qual está a seguir. Edite o /etc/pf.conf e copie para lá a seguinte configuração, adaptando para o seu cenário. Vou configurar o arquivo de acordo com o nosso:
# $OpenBSD: pf.conf,v 1.29 2005/08/23 02:52:58 henning Exp $
#
# See pf.conf(5) and /usr/share/pf for syntax and examples.
# Remember to set net.inet.ip.forwarding=1 and/or net.inet6.ip6.forwarding=1
# in /etc/sysctl.conf if packets are to be forwarded between interfaces.
#variaveis
ext_if="xl0" #ligada a Internet
int_if= "{ xl1, xl2 }" #interfaces da maquina. Temos tres: uma para entrada da internet
# e outras duas para ligar cada um dos dois MX's.
ip_local="aaa.bbb.ccc.ddd" #esse é o ip pelo qual você consegue conectar na bridge
mail_server= "{ eee.fff.ggg.hhh, iii.jjj.kkk.lll }" #IPs dos MXs que estao atrás da brigde
#Maquinas ou redes da sua instituicao permitidas a acessar servicos no $mail_server
ip_snmp= "{ xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx }" #esses IPs podem ter aceso à porta SNMP dos #$mail_server
ip_ssh= "{ xxx.xxx.0/24, xxx.xxx.xxx.0/24, xxx.xxx.xxx.0/24 }" #IPs podem ter acesso à porta SSH #dos $mail_server
#Tabelas usadas em conjunto com o spamd
table < spamd > persist file "/etc/blacklist.conf"
table < spamd-white > persist
table < whitelist > persist file "/etc/whitelist.conf"
set block-policy drop
#Aumentar o limite de entradas nas tabelas (Padrao: 100000)
set limit table-entries 500000
scrub on $ext_if reassemble tcp no-df random-id
# testes de redirecionamento para o spamd
# Está na whitelist? - Então passe sem ser tocado
no rdr on $ext_if \
inet \
proto tcp \
from < whitelist > \
to any
# Se chegou aqui, não está em whitelist. Está na blacklist?
# Redireciono para o spamd, o qual vai "gastar o tempo" do spammer
# e no final da "interação smtp" dirá que ele está na blacklist
rdr on $ext_if \
inet \
proto tcp \
from < spamd >\
to any \
port smtp -> 127.0.0.1 port spamd
# ainda não está na tabela dinâmica spamd-white
# redireciono para o spamd que vai tratar a mensagem
rdr on $ext_if \
inet \
proto tcp \
from !< spamd-white > \
to any \
port smtp -> 127.0.0.1 port spamd
#bloquear tudo por padrão
block in all
block out all
#libera conexao do localhost para porta de configuracao do spamd 8026
pass in quick proto tcp from 127.0.0.1 to 127.0.0.1 port 8026
#liberar ICMP
pass in quick on $ext_if proto icmp from any to any
#liberar SSH para IPs contidos nas variáveis
pass in quick on $ext_if proto tcp from $ip_ssh to $mail_server port 22 keep state
pass in quick on $ext_if proto tcp from $ip_ssh to $ip_local port 22 keep state
#SNMP
pass in quick on $ext_if proto udp from $ip_snmp to $mail_server port 161 keep state
pass in quick on $ext_if proto tcp from $ip_snmp to $mail_server port 161 keep state
pass in quick on $ext_if proto udp from $ip_snmp to $ip_local port 161 keep state
pass in quick on $ext_if proto tcp from $ip_snmp to $ip_local port 161 keep state
# permitir especificamente os pacotes que foram redirecionados acima
pass in quick on $ext_if \
inet \
proto tcp \
from < whitelist > \
to port smtp
# Pacotes permitidos passam diretamente para o mail_server
# ou seja, já estão na tabela dinâmica spamd_white
pass in quick on $ext_if \
inet \
proto tcp \
from < spamd-white > \
to port smtp
pass in on $ext_if \
route-to lo0 \
inet \
proto tcp \
from any \
to 127.0.0.1 \
port spamd
pass out quick on $ext_if \
inet \
proto tcp \
from $ext_if \
to any \
port smtp \
flags S/SA \
keep state
pass out quick on $int_if \
inet \
proto tcp \
from $int_if \
to any \
port smtp \
flags S/SA \
keep state
pass out keep state
pass quick on { lo xl0 xl1 xl2 } #nomes das interfaces. Adapte para sua configuracao.
#Mantenha lo
antispoof log quick for { lo xl0 xl1 xl2 } #nomes das interfaces. Adapte para seu caso.
#Mantenha lo
Agora, é necessário ativar a atualização da tabela do pf pelo spamd, adicionando uma entrada no crontab. Para isso, como root, faça o seguinte:
E, no arquivo, adicione as linhas:
Esta é toda a configuração necessária. Reinicie a máquina para que elas "entrem em vigor"! :D
Agora, antes de colocar em produção, faça testes enviando e-mail de fora da sua rede. Diminua os tempos configurados no /etc/rc.conf para que seu teste não demore muito (ao invés de 25 minutos como coloquei, coloque 1 minuto. Não use o valor de 1 minuto em produção. Será pouco efetivo. Eu utilizo estes valores que mostrei).
Dicas de comandos úteis
Leia os seguintes manuais
- man spamd
- man spamd-setup
- man spamdb
- man spamd.conf
Comandos do pf
- Adicionar endereço IP na tabela spamd-white:
pfctl -t spamd-white -T add xxx.yyy.zzz.www
- Ver as regras carregadas:
pfctl -s rules
- Testar o arquivo pf.conf antes de carregá-lo
pfctl -nf /etc/pf.conf
- Carregar o arquivo de configuração /etc/pf.conf
pfctl -f /etc/pf.conf
Boa sorte nas configurações! Torço para que seja útil!
A princípio, pode assustar (principalmente o particionamento :) ), mas, prometo que agora será mais leve!
Vamos à configuração do nosso greylisting.
Primeiramente, precisamos habilitar o sistema operacional a repassar pacotes de uma interface para a outra, e, além disso, habilitar a ativação do packet filter no boot.
Edite o /etc/sysctl.conf e descomente a seguinte linha:
net.inet.ip.forwarding=1 #1=Permit forwarding (routing) of packets
Edite também o arquivo /etc/rc.conf e adicione a seguinte linha:
pf=YES #Enable PF
Agora, partiremos para a configuração da Bridge.
Para cada interface de rede, é necessário criar um arquivo de configuração. Para a interface xl0, que será ligada à Internet, crie o arquivo /etc/hostname.xl0 . Edite o arquivo e adicione o seguinte (lembre-se o que combinamos no post anterior: no lugar dos IPs representados por letras deve ser usado um IP válido na Internet):
inet aaa.bbb.ccc.ddd 255.255.255.0 NONE
O IP usado na interface externa (xl0) deve pertencer à mesma sub-rede dos seus servidores de e-mail.
Agora para a interface xl1, crie o /etc/hostname.xl1 e adicione no arquivo:
inet 192.168.10.10 255.255.255.0 NONE
E, na interface xl2, crie o /etc/hostname.xl2 e adicione no arquivo:
inet 192.168.10.11 255.255.255.0 NONE
Agora, devemos colocar todas estas interfaces como parte da bridge. Para isso, crie o arquivo /etc/bridgename.bridge0 e adicione o seguinte:
add xl0
add xl1
add xl2
up
Agora, é necessário configurar o spamd. Para isso, edite o arquivo /etc/rc.conf e habilite as seguintes configurações:
spamd_flags="-v -G 25:4:864" #para entender esses números, leia o manual do spamd (man spamd)
spamd_grey=YES # use spamd greylisting if YES
spamlogd_flags="" # use eg. "-i interface" and see spamlogd(8)
O spamd pode consultar listas públicas onde são cadastrados domínios que já enviaram Spam. Isso pode ser configurado no arquivo /etc/spamd.conf . Eu nunca testei essas consultas pois faço isso em outro momento no sistema. Minha configuração é a seguinte:
all:\
:blacklist:whitelist:
whitelist:\
:white:\
:method=file:\
:file=/etc/whitelist.conf:
blacklist:\
:black:\
:msg="SPAM. Your address %A is blocked":\
:method=file:\
:file=/etc/blacklist.conf:
É muito importante que você leia o manual do spamd.conf e entenda o que quer dizer cada linha desta, e, principalmente, como estas listas branca e negra se anulam. Basicamente, nesta configuração, estou dizendo em qual arquivo estão os IPs que não precisam ser filtrados (whitelist) e em qual arquivo estão os IPs dos quais não quero receber e-mail de maneira alguma (blacklist). Mesmo que não os utilize, crie os arquivos whitelist.conf e blacklist.conf
touch /etc/whitelist.conf
touch /etc/blacklist.conf
Agora, a parte mais divertida e elaborada desta implementação: a configuração do pf! Adianto que ela não foi desenvolvida por mim, mas sim por Graham Toal, da Universidade do Texas. O link onde ele disponibilizou isso não está mais no ar. Portanto, coloco aqui para prosperar a criação de Graham (que não é o Bell, mas sim o Toal. Thanks Graham! (os dois!) ). Enfim, fiz apenas algumas pequenas adaptações para facilitar o entendimento do arquivo, o qual está a seguir. Edite o /etc/pf.conf e copie para lá a seguinte configuração, adaptando para o seu cenário. Vou configurar o arquivo de acordo com o nosso:
# $OpenBSD: pf.conf,v 1.29 2005/08/23 02:52:58 henning Exp $
#
# See pf.conf(5) and /usr/share/pf for syntax and examples.
# Remember to set net.inet.ip.forwarding=1 and/or net.inet6.ip6.forwarding=1
# in /etc/sysctl.conf if packets are to be forwarded between interfaces.
#variaveis
ext_if="xl0" #ligada a Internet
int_if= "{ xl1, xl2 }" #interfaces da maquina. Temos tres: uma para entrada da internet
# e outras duas para ligar cada um dos dois MX's.
ip_local="aaa.bbb.ccc.ddd" #esse é o ip pelo qual você consegue conectar na bridge
mail_server= "{ eee.fff.ggg.hhh, iii.jjj.kkk.lll }" #IPs dos MXs que estao atrás da brigde
#Maquinas ou redes da sua instituicao permitidas a acessar servicos no $mail_server
ip_snmp= "{ xxx.xxx.xxx.xxx, xxx.xxx.xxx.xxx }" #esses IPs podem ter aceso à porta SNMP dos #$mail_server
ip_ssh= "{ xxx.xxx.0/24, xxx.xxx.xxx.0/24, xxx.xxx.xxx.0/24 }" #IPs podem ter acesso à porta SSH #dos $mail_server
#Tabelas usadas em conjunto com o spamd
table < spamd > persist file "/etc/blacklist.conf"
table < spamd-white > persist
table < whitelist > persist file "/etc/whitelist.conf"
set block-policy drop
#Aumentar o limite de entradas nas tabelas (Padrao: 100000)
set limit table-entries 500000
scrub on $ext_if reassemble tcp no-df random-id
# testes de redirecionamento para o spamd
# Está na whitelist? - Então passe sem ser tocado
no rdr on $ext_if \
inet \
proto tcp \
from < whitelist > \
to any
# Se chegou aqui, não está em whitelist. Está na blacklist?
# Redireciono para o spamd, o qual vai "gastar o tempo" do spammer
# e no final da "interação smtp" dirá que ele está na blacklist
rdr on $ext_if \
inet \
proto tcp \
from < spamd >\
to any \
port smtp -> 127.0.0.1 port spamd
# ainda não está na tabela dinâmica spamd-white
# redireciono para o spamd que vai tratar a mensagem
rdr on $ext_if \
inet \
proto tcp \
from !< spamd-white > \
to any \
port smtp -> 127.0.0.1 port spamd
#bloquear tudo por padrão
block in all
block out all
#libera conexao do localhost para porta de configuracao do spamd 8026
pass in quick proto tcp from 127.0.0.1 to 127.0.0.1 port 8026
#liberar ICMP
pass in quick on $ext_if proto icmp from any to any
#liberar SSH para IPs contidos nas variáveis
pass in quick on $ext_if proto tcp from $ip_ssh to $mail_server port 22 keep state
pass in quick on $ext_if proto tcp from $ip_ssh to $ip_local port 22 keep state
#SNMP
pass in quick on $ext_if proto udp from $ip_snmp to $mail_server port 161 keep state
pass in quick on $ext_if proto tcp from $ip_snmp to $mail_server port 161 keep state
pass in quick on $ext_if proto udp from $ip_snmp to $ip_local port 161 keep state
pass in quick on $ext_if proto tcp from $ip_snmp to $ip_local port 161 keep state
# permitir especificamente os pacotes que foram redirecionados acima
pass in quick on $ext_if \
inet \
proto tcp \
from < whitelist > \
to port smtp
# Pacotes permitidos passam diretamente para o mail_server
# ou seja, já estão na tabela dinâmica spamd_white
pass in quick on $ext_if \
inet \
proto tcp \
from < spamd-white > \
to port smtp
pass in on $ext_if \
route-to lo0 \
inet \
proto tcp \
from any \
to 127.0.0.1 \
port spamd
pass out quick on $ext_if \
inet \
proto tcp \
from $ext_if \
to any \
port smtp \
flags S/SA \
keep state
pass out quick on $int_if \
inet \
proto tcp \
from $int_if \
to any \
port smtp \
flags S/SA \
keep state
pass out keep state
pass quick on { lo xl0 xl1 xl2 } #nomes das interfaces. Adapte para sua configuracao.
#Mantenha lo
antispoof log quick for { lo xl0 xl1 xl2 } #nomes das interfaces. Adapte para seu caso.
#Mantenha lo
Agora, é necessário ativar a atualização da tabela do pf pelo spamd, adicionando uma entrada no crontab. Para isso, como root, faça o seguinte:
#crontab -e
E, no arquivo, adicione as linhas:
#atualizacao spamdb
5 * * * * /usr/libexec/spamd-setup
Esta é toda a configuração necessária. Reinicie a máquina para que elas "entrem em vigor"! :D
Agora, antes de colocar em produção, faça testes enviando e-mail de fora da sua rede. Diminua os tempos configurados no /etc/rc.conf para que seu teste não demore muito (ao invés de 25 minutos como coloquei, coloque 1 minuto. Não use o valor de 1 minuto em produção. Será pouco efetivo. Eu utilizo estes valores que mostrei).
Dicas de comandos úteis
Leia os seguintes manuais
- man spamd
- man spamd-setup
- man spamdb
- man spamd.conf
Comandos do pf
- Adicionar endereço IP na tabela spamd-white:
pfctl -t spamd-white -T add xxx.yyy.zzz.www
- Ver as regras carregadas:
pfctl -s rules
- Testar o arquivo pf.conf antes de carregá-lo
pfctl -nf /etc/pf.conf
- Carregar o arquivo de configuração /etc/pf.conf
pfctl -f /etc/pf.conf
Boa sorte nas configurações! Torço para que seja útil!
Um comentário:
Parabens, muito legal e útil seu artigo. I love OpenBSD!
No aguardo de mais sobre o puffy =)
Postar um comentário