[FUGSPBR] Gateway com Firewall que não ta qurendo funcionar
Patrick Tracanelli
eksffa em bsd.com.br
Seg Abr 1 20:13:16 BRT 2002
Cristian,
Vamos assumir (entre outras coisas) que a sua rede deveria ser separada
nao apenas logicamente, mas tambem fisicamente. Da forma como voce
descreveu as provaveis solucoes iriam amenizar o seu problemas, mas
qualquer engracadinho com um sniffer poderia te dar alguma dor de
cabeca. Voce tem que pensar exatamente o que voce pode - e o que voce
quer - fazer. Por exemplo. A solucao de colocar uma bridge entre o seu
roteador e as redes eh valida, mas voce controlaria apenas o trafego e
as acoes dos hosts que fossem passar pela bridge (em direcao ao router,
obviamente). Nesse caso, se o seu NT fica antes do roteador (o que me
pareceu ser o fato - pelo q vc explicou) a bridge nao controlaria nada,
visto que esses usuarios da rede2 tentariam se logar como admins da rede
1 no NT - mesmo barramento fisico, antes do roteador.
Entao qual uma solucao seria dividir as redes fisica e logicamente. Se
voce tiver carta branca pra fazer isso dentro da sua faculdade, nao
pense duas vezes.
O esquema ficaria assim:
[rede1]
/\
||
[roteador] <==> [FreeBSD]
||
\/
[rede2]
Nem tenho ideia como vai sair esse esquema ai no seu cliente de email,
hehehe, mas espero q seja legivel. Tambem nao sei se hoje voce usa IPs
verdadeiros (nao reservados) nessas redes. Se voce usa, nao vai fazer
muita diferenca a divisao logica das redes, mas a o principal - a fisica
- vai estar pronta.
Voce pode optar por esse freebsd ser uma bridge (ateh transparente, se
necessario) ou ser uma maquina agindo como gateway/firewall e limitador
de banda. Se voce for usar redes reservadas, voce vai ter que fazer NAT.
Detalhe que agora, voce nao tem 2 placas de rede, e sim 3. Uma pro
roteador - que te leva pra internet - e uma pra cada rede. Vamos assumir
que voce vai usar redes reservadas.
no rc.conf:
----------
hostname="freebsd.seilaoq.ufsc.br"
defaultrouter="IP-DO-ROTEADOR"
ifconfig_fxp0="inet 200.IP.VERDADEIRO netmask 255.maskara.externa"
ifconfig_fxp1="inet 192.168.0.1 netmask 255.255.255.0"
ifconfig_fxp2="inet 192.168.1.1 netmask 255.255.255.0"
network_interfaces="fxp0 fxp1 fxp2 lo0"
gateway_enable="YES"
firewall_enable="YES"
firewall_type="OPEN"
natd_enable="YES"
natd_flags="-l -f /etc/natd.conf"
natd_interface="fxp0"
----
no /etc/natd.conf:
-------
# Interface Real segundo a RFC a qual eu esqueci :Pp
interface fxp0
# Definicoes de portas Dinamicas, tipo FTP, Netmeeting, DCC (IRC) CUCME
etc...
dynamic yes
same_ports yes
use_sockets yes
# forward de redes privadas pra redes publicas via NATd
# redirect_port se um dia precisar...
Com isso voce vai esar fazendo NAT no esquemao divert natd all from any
to any.
Essa entrada vai estar sendo lida em /etc/rc.firewall automaticamente.
Acontece que, quando sua rede ja estiver funcionando, voce vai querer
mudar o firewall_type no rc.conf pro caminho do seu conjunto de regras.
Ai voce tem que se lembrar de setar o divert via ipfw manualmente. A
regra mais basica: ipfw add divert natd all from any to any via fxp0
Depois voce melhora ela, adicionando divert apenas pra suas 2 redes.
Bom, a estrutura fisica nesse modelinho ai, vai estar assim:
O seu hub da rede 1 vai se conectar na fxp1 do freebsd
o Hub da rede 2 vai se conectar na fxp2 do freebsd
O roteador vai se conectar na fxp0 do freebsd.
Se voce nao tiver um switch ou hub entre o freebsd e o roteador, o cabo
deve ser crossover.
Bom, nesse ponto, vamos assumir que todas as maquinas da sua rede 1 e
rede 2 ja tem que estar pingando a internet -via netd ou via gateway
simplesmente, se sua rede for verdadeira. Se isso nao estiver
acontecendo, repense suas configuracoes.
O gateway dos clientes de cada laboratorio sera o endereco IP da
interface interna do freebsd, ou seja, 192.168.0.1 pro lab 1 e
192.168.1.1 pro lab2. O servidor DNS pode ser qualquer 1, dentro ou fora
da rede privada, visto que ate agora voce nao restringiu nada no seu
firewall, e qualquer IP verdadeiro ou nao pode ser alcancado. Se puder
coloque esse proprio FreeBSD rodando um DNS Cache, assim ja serve pras
duas redes - ou sei la, use o seu DNS atual, nao sei como ta hoje.
Estando isso funcionando, agora voce precisa definir suas regras de
firewall... crie um arquivo e aponte-o no rc.conf (entrada firewall_type)
por exemplo, firewall_type="/usr/local/etc/minhas.regras"
dentro dele, lembre-se que voce tem que fazer o divert - ja que voce nao
vai estar usando mais o rc.firewall. A desvantagem de nao usar o
rc.firewall eh que as vezes agente esquece de algumas regras que por
boas maneiras, devem existir... por exemplo:
seu-arquiv-de-regras:
-----
## Bloco 1 - coizera basica
add 00001 check-state
#ranca fora se nao usar keep-state em lugar nenhum
add 100 natd all from any to any via fxp0
# depois nao se eskeca de melhorar essa regra
add 110 pass all from any to any via lo0
add 120 deny log all from any to 127.0.0.0/8
add 130 deny log ip from 127.0.0.0/8 to any
add 400 deny log tcp from any to 192.168.0.0/16 frag
add 500 deny log tcp from any to 192.168.0.0/16 tcpflags syn,rst
add 600 deny log tcp from any to 192.168.0.0/16 tcpflags syn,fin
## bloco 2 - mais um pokim de seguranca
add 700 deny log all from 10.0.0.0/8 to any in via fxp0
add 800 deny log all from 172.16.0.0/12 to any in via fxp0
add 900 deny log all from 192.168.0.0/26 to any in via fxp0
#eh obvio q vc nao vai querer redes privadas entrando pelo link publico
add 950 allow log tcp from <host-confiavel> to me 22 in setup via fxp0
keep-state
add 955 deny log tcp from any to me 22 in
#ssh - minimo
## bloco 3 - ordem na casa
add 1000 deny tcp from 192.168.0.0/24 to 192.168.1.0/24 in via fxp1
add 1100 deny tcp from 192.168.1.0/24 to 192.168.0.0/24 in via fxp2
# aki vc estabelece que nao havera comunicacao entre a suas 2 redes
#daki pra baixo voce faz o resto, separando quem pode e nao pode fazer oq
#(por exemplo, quem pode ler email, de onde pra onde etc...)
## bloco 3 - dummynet
add 5000 pipe 1 all from 192.168.1.0/24 to any out # UPLoad
add 5100 pipe 2 all from any to 192.168.1.0/24 in # DownLoa
pipe 1 config bw 64Kbit/s # Tunel 1 64Kbps UPLoad
pipe 2 config bw 128Kbit/s # Tunel 2 128Kbps Download
----
Acho que pelo que entendi do que voce precisa, essas regras ai devem ser
o bastante pra satisfazer suas necessidades iniciais. Claro que elas sao
apenas exemplos de como voce deve agir. Eu fiz isso de cabeca entao pode
haver algum erro - mas acho q nao tem nao - enfim, voce vai melhorar
muito isso de acordo com a sua rede...
-------------
Agora vamos la, e se voce decidiu nao fazer seu freebsd um gateway, e
prefere fazer ele agir como bridge? Se eu fosse tentar explicar
basicamente o que eh bridge esse email ia ficar chato de ler... voce
deve ter o conceito basico... entao vamos la...
obviamente voce precisade: suporte a bridge no kernel.
Passado isso, suas configuracoes vao ser via o (poderoso) sysctl(8):
# Faz essa Box uma bridge.
sysctl -w net.link.ether.bridge_ipfw=1
sysctl -w net.link.ether.bridge=1
sysctl -w net.link.ether.bridge_cfg=fxp0,fxp1,fxp2
Pronto, agora seu freebsd virou uma bridge (super complexo hein?)
Voce nao precisar por nem IP nas interfaces, elas ja vao estar se
comunicando diretamente apos isso... se voce nao definir IP, isso quer
dizer que (thchanan) eh uma bridge transparente, ou seja, os gateways da
sua rede interna vao continuar sendo o seu roteador la na outra ponto,
visto que eles nao vai nem saber que existe um freebsd no meio da
jogada... Talvez essa seja a forma mais fera de se fazer firewall (ao
menos eh a que eu mais gosto...). E com ipfw eh ainda mais fera do que
com ipfilter.
Bom, quando voce ta fazendo firewall com bridge, lembre-se que voce tem
que mudar um pouco os seus conceitos, e fazer suas regras apoiando-se
nos "in/out via interface" muito mais do que baseado em IP (o ideal eh
sempre as duas formas, claro). Outra coisa, voce fica restrito `a
algumas funcionalidades.
Mais uma coisa.. quando voce ta usando filtering-bridge, voce deve
pensar na ordem de controle dos pacotes, visto que os mesmos podem
passar uma unica vez, ou varias outras pelo firewall, dependendo da
opcao net.inet.ip.fw.one_pass do sysctl(8).
Enfim, sao varias coisinhas que voce tem que ficar atento. O melhor eh
ler "man ipfw", "man dummynet", "man bridge" entre outros, que vao te
dar boas nocoes de como agir...
Mas pra te ajudar, o ipfw tem a opcao bridged, que identifica os pacotes
que passaram pela bridge. Pra voce aprender como agir, dependendo do
pacote, sugiro o seguinte:
ipfw add count log all from any to any bridged
Ai da uma linda rapido nos logs (pra debugar um pouquinho do que ta
acontecendo no seu firewall).
Lembre-se usar bridge transparente pode ser solucao ou problema,
dependendo do quao bem voce se der com ela ;) Pra mim eh fera :)
Vale atentar tambem pro tuning basico do seu kernel, se voce for usar
bridge. Simplesmente por causa dos nMBUffers e dos nmbclusters que voce
vai estar separando pro seu stack tcp/ip. E claro, quanto voce tem de
memoria real disponivel na sua bridge :)
man tuning - pode ajudar
-----------------------------------------------------
No seu kernel voce vai precisar de:
(colar do meu kernel checklist ekeke)
--------------------------------------
## IPFIREWALL:
options IPFIREWALL # suporte a ipfirewall
options IPFIREWALL_VERBOSE # suporte aos logs do ipfirewall
options IPFIREWALL_FORWARD # suporte a ipfw fwd
options IPFIREWALL_VERBOSE_LIMIT=500 #limite do log alterado,
evita local DoS
options IPFIREWALL_DEFAULT_TO_ACCEPT #politica de firewall
(aberta)
options INCLUDE_CONFIG_FILE #obvio
options IPSTEALTH #stealth forwarding
## NATD:
options IPDIVERT #suporte a NAT via socks de divert
## BRIDGE:
options BRIDGE #suporte a bridging
## DUMMYNET:
options DUMMYNET #suporte ao dummynet
options HZ=1000 #altera o clock
## Network Tuning Basico:
options NMBCLUSTERS=70000 # mem usada pelos clusters
options NMBUFS=70000 # mem usada por cada cluster.
##
mais uma dica pessoal, pra te ajudar em um tuning geral no kernel,
defina maxusers no minimo igual a sua quantidade de RAM
(por exemplo, meus servers tem maxusers=512 quando eu tenho 512MB de
memoria principal)
Evite colocar maxusers=0 porque voce vai no padrao de auto tuning do
freebsd, padrao esse ainda bastante conservador. E pra um firewall legal
nao eh bom ser conservador :>
Se necessario, mude o send buffer e receive buffer do stack tcp/ip do
freebsd (se tu tiver com freebsd 4.5 nem vai precisar mexer, anao ser em
casos extremos).
Tem um artigo que o Matt Dillon (VM/Soft Updates/tuning -etc etc)
escreveu, que saiu em daily.daemonnews.org sobre tuning... da uma lida
que nao vai se arrepender (eu nao lembro a url de cabeca).
Acho que soh isso basta.
Abracos,
Paz Profunda,
Patrick Tracanelli
+-----------------------------------------------+---------+
| Patrick Leandro Tracanelli do Carmo | ( ) |
| Parallel Processing & BSD Unix enthusiastic | (O_O) |
| FreeBSD 5.0-CURRENT i386 SMP #21 | \`-'/ w|
| Faculdade de Tecnologia Taquaritinga / Unesp | ( )__||
|===============================================| /m`m\ |
| eksffa em bsd.com.br, eksffa em fatectq.com.br | FreeBSD |
+-----------------------------------------------+---------+
Long live Hanin Elias, Kim Deal!!! ;-)
~
~
----
Para sair da lista envie um e-mail para majordomo em fugspbr.org
com as palavras "unsubscribe fugspbr" no corpo da mensagem.
Mais detalhes sobre a lista de discussão freebsd