Re: [FUG-BR] Dúvida Natd (fluxo de pacotes pelo ip fw)

2007-08-27 Por tôpico Rodolfo Zappa
Luiz Otavio Souza escreveu:
 Rodolfo Zappa escreveu:
   
 (...)
   
 Ok, mas o pacote é reavaliado desde o início das regras, ou a partir do 
 ponto do divert?

 O problema que eu tenho é o seguinte: eu quero bloquear ou liberar 
 pacotes da minha lan para a internet, baseados no ip de origem. Mas, 
 após passar pelo natd, o pacote perde a referência do ip de origem, e a 
 terceira regra abaixo, nunca é acionada.

 ${ipfw} 100 divert natd ip from any to any via ${ext_if}
 ${ipfw} 101 chek-state
 ${ipfw} 102 allow tcp from 192.168.0.25 to any 80 out via ${ext_if}

 Estou estudando o IPFW, acho a sintaxe maravilhosa e simples, os 
 controles de banda facílimos de aprender, mas o fluxo do pacote pelo 
 firewall, quando tem um divert para o natd,  são muito mal documentados 
 e completamente diferentes do PF, IPF e até do IPTABLES do netfilter.

 Por exemplo, no netfilter o fluxo é assim (simplificando):

  nat prerouting -- forward -- nat postrouting

 e quando eu quero liberar ou bloquear um pacote, baseado na origem, uso 
 a chain forward, que memso depois de pasara pelo nat, não perde a 
 referência do ip de origem.

 Alguém tem um bom doc sobre ipfw + natd, mostrando o fluxo dos pacotes 
 pelo firewall?

 Patrick, pode dar uma mãozinha de novo?

   
 
 Rodolfo,

 Os são pacotes enviados para o natd através do divert no ipfw e voltam 
 (do natd para o ipfw) na mesma regra, o processamento continua a partir 
 da linha do natd.

 Mas seu problema é que você esta procurando pelo pacote depois que ele 
 já foi nateado e ai realmente você perde a referencia ao IP interno.

 É só fazer a regra utilizando a interface interna e não a externa.

 O fluxo do ipfw (com duas placas e pacotes passando da rede interna para 
 a rede externa) é o seguinte: in via intif - out via intif - in via 
 outif - out via outif.

 Já o fluxo do natd é o seguinte:

 - O IP de origem é substituido apenas em pacotes que estão saindo pela 
 interface (out via outif) e é criado um estado para essa tradução.

 - Já os pacotes chegando na interface (in via outif) são verificados 
 contra a tabela de estados do natd e caso seja identificado como um 
 pacote traduzido ele é nateado de volta (o IP de destino dessa vez é 
 alterado para o IP interno utilizando as informações salvas na tabela de 
 estado).

 Ou seja, para o natd funcionar são necessárias duas linhas:

 # ipfw add divert natd ip from 192.168.0.0/24 to any out via bge0 # = 
 faz o nat de saída
 # ipfw add divert natd ip from any to 200.200.200.200 in via bge0 # = 
 faz o nat do retorno

 Considerando que sua rede interna seja 192.168.0.0/24 e o IP do seu 
 servidor seja 200.200.200.200.

 Como nem sempre o servidor tem IP fixo, a maioria dos exemplo simplifica 
 essas duas regras em uma única (como nos exemplos em /etc/rc.firewall), 
 mas isso normalmente acaba passando mais trafego do que o preciso pelo 
 natd (o trafego que não precisa ser nateado é ignorado, mas consome 
 alguns recursos extras, já que o natd roda no espaço usuário e os 
 pacotes precisam ser copiados do kernel para o natd e depois reinjetados 
 pelo natd através de outra copia no sentido inverso).

 []s
 Luiz
 PS: Regras check-state e stablished após o natd são potencialmente 
 perigosas, elas passam os pacotes baseados no estado de cada conexão e 
 podem confundir bastante. Faça todo trabalho sujo (fwd por exemplo) logo 
 depois do natd para evitar problemas.
 -
 Histórico: http://www.fug.com.br/historico/html/freebsd/
 Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd

 !DSPAM:8,46d19726816441013332718!


   

Luiz,

Muito grato pela informação!!!

Mas gostaria também de ler mais sobre o assunto. Neste aspecto em 
particular, o handbook é bem fraco. Já vi o ipfw-howto e o ipfw-advanced 
howto, e eles se atém muito a sintaxe, em vez da lógica do firewall 
(como o fluxo).

Além disso, muito pouca documentação sobre ipfw + natd, ambas 
documentações tratam deles em separado, ou em ambientes pobres, para 
exemplos.

Até hoje não consegui formar uma opinião, sobre a viabilidade do uso do 
natd para ambientes grandes (mais de 300 usuários simultâneos), se ele 
comporta (obviamente, num mesmo hardware que hoje tem o pf).

Apesar do pf estar atendendo, tenho cogitado mudar para o ipfw, por 
conta do maior controle de pacotes e traffic shapping do ipfw, mas o 
natd é de tirar o sono.

Pelo menos pra mim, as regras com natd não são tão claras quanto as 
regras do nat com o pf.

A propósito, alguém na lista comentou que o ipfw no freebsd 7 vem com 
nat builtin no kernel. É verdade? Faz sentido?

-- 
Cordialmente,

Rodolfo Zappa

Archive TSP - Total Solution Provider
Nosso negócio é garantir que a sua rede de informações não pare!

(21) 2567-1842
[EMAIL PROTECTED]
http://www.archive.com.br

Se a gente se lança sem vigor, sete de dez ações tomadas não dão certo. É 
extremamente difícil tomar decisões num estado de agitação. Por outro lado, se 
sem se preocupar com as 

Re: [FUG-BR] Dúvida Natd (fluxo de pacotes pelo ip fw)

2007-08-26 Por tôpico Luiz Otavio Souza
Rodolfo Zappa escreveu:
 (...)
   
 Ok, mas o pacote é reavaliado desde o início das regras, ou a partir do 
 ponto do divert?

 O problema que eu tenho é o seguinte: eu quero bloquear ou liberar 
 pacotes da minha lan para a internet, baseados no ip de origem. Mas, 
 após passar pelo natd, o pacote perde a referência do ip de origem, e a 
 terceira regra abaixo, nunca é acionada.

 ${ipfw} 100 divert natd ip from any to any via ${ext_if}
 ${ipfw} 101 chek-state
 ${ipfw} 102 allow tcp from 192.168.0.25 to any 80 out via ${ext_if}

 Estou estudando o IPFW, acho a sintaxe maravilhosa e simples, os 
 controles de banda facílimos de aprender, mas o fluxo do pacote pelo 
 firewall, quando tem um divert para o natd,  são muito mal documentados 
 e completamente diferentes do PF, IPF e até do IPTABLES do netfilter.

 Por exemplo, no netfilter o fluxo é assim (simplificando):

  nat prerouting -- forward -- nat postrouting

 e quando eu quero liberar ou bloquear um pacote, baseado na origem, uso 
 a chain forward, que memso depois de pasara pelo nat, não perde a 
 referência do ip de origem.

 Alguém tem um bom doc sobre ipfw + natd, mostrando o fluxo dos pacotes 
 pelo firewall?

 Patrick, pode dar uma mãozinha de novo?

   
Rodolfo,

Os são pacotes enviados para o natd através do divert no ipfw e voltam 
(do natd para o ipfw) na mesma regra, o processamento continua a partir 
da linha do natd.

Mas seu problema é que você esta procurando pelo pacote depois que ele 
já foi nateado e ai realmente você perde a referencia ao IP interno.

É só fazer a regra utilizando a interface interna e não a externa.

O fluxo do ipfw (com duas placas e pacotes passando da rede interna para 
a rede externa) é o seguinte: in via intif - out via intif - in via 
outif - out via outif.

Já o fluxo do natd é o seguinte:

- O IP de origem é substituido apenas em pacotes que estão saindo pela 
interface (out via outif) e é criado um estado para essa tradução.

- Já os pacotes chegando na interface (in via outif) são verificados 
contra a tabela de estados do natd e caso seja identificado como um 
pacote traduzido ele é nateado de volta (o IP de destino dessa vez é 
alterado para o IP interno utilizando as informações salvas na tabela de 
estado).

Ou seja, para o natd funcionar são necessárias duas linhas:

# ipfw add divert natd ip from 192.168.0.0/24 to any out via bge0 # = 
faz o nat de saída
# ipfw add divert natd ip from any to 200.200.200.200 in via bge0 # = 
faz o nat do retorno

Considerando que sua rede interna seja 192.168.0.0/24 e o IP do seu 
servidor seja 200.200.200.200.

Como nem sempre o servidor tem IP fixo, a maioria dos exemplo simplifica 
essas duas regras em uma única (como nos exemplos em /etc/rc.firewall), 
mas isso normalmente acaba passando mais trafego do que o preciso pelo 
natd (o trafego que não precisa ser nateado é ignorado, mas consome 
alguns recursos extras, já que o natd roda no espaço usuário e os 
pacotes precisam ser copiados do kernel para o natd e depois reinjetados 
pelo natd através de outra copia no sentido inverso).

[]s
Luiz
PS: Regras check-state e stablished após o natd são potencialmente 
perigosas, elas passam os pacotes baseados no estado de cada conexão e 
podem confundir bastante. Faça todo trabalho sujo (fwd por exemplo) logo 
depois do natd para evitar problemas.
-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd


Re: [FUG-BR] Dúvida Natd (fluxo de pacotes pelo ip fw)

2007-08-24 Por tôpico Rodolfo Zappa
João Paulo Just escreveu:
 -BEGIN PGP SIGNED MESSAGE-
 Hash: SHA1

 Rodolfo Zappa escreveu:
   
 Alguém pode me passar o fluxo de um pacote pelo firewall?

 Minha dúvida é a seguinte:

 Depois de fazer o divert para o natd, o pacote é traduzido (nateado).

 Após isso ele é re-injetado no fluxo do firewall, podendo ser reavalidao 
 pelo filtro de pacotes?

 Exemplo:

 ${ipfw} 00400 divert natd ip from any to any via ${ext_if}
 ${ipfw} 00401 check-state
 ${ipfw} 00402 deny log tcp from any to any 80 out via ${ext_if} setup 
 keep-state

 Esta terceira regra nunca é acionada.
 

 Sim. Eu faço o divert pro natd no meu servidor e em seguida, limito a
 banda com o próprio IPFW.

 - --
 João Paulo Just
 Diretor Executivo - Justsoft Informática Ltda.
 http://www.justsoft.com.br/
 - --
 Ilhéus, BA, Brasil.
 +55 75 8104 8473

Ok, mas o pacote é reavaliado desde o início das regras, ou a partir do 
ponto do divert?

O problema que eu tenho é o seguinte: eu quero bloquear ou liberar 
pacotes da minha lan para a internet, baseados no ip de origem. Mas, 
após passar pelo natd, o pacote perde a referência do ip de origem, e a 
terceira regra abaixo, nunca é acionada.

${ipfw} 100 divert natd ip from any to any via ${ext_if}
${ipfw} 101 chek-state
${ipfw} 102 allow tcp from 192.168.0.25 to any 80 out via ${ext_if}

Estou estudando o IPFW, acho a sintaxe maravilhosa e simples, os 
controles de banda facílimos de aprender, mas o fluxo do pacote pelo 
firewall, quando tem um divert para o natd,  são muito mal documentados 
e completamente diferentes do PF, IPF e até do IPTABLES do netfilter.

Por exemplo, no netfilter o fluxo é assim (simplificando):

 nat prerouting -- forward -- nat postrouting

e quando eu quero liberar ou bloquear um pacote, baseado na origem, uso 
a chain forward, que memso depois de pasara pelo nat, não perde a 
referência do ip de origem.

Alguém tem um bom doc sobre ipfw + natd, mostrando o fluxo dos pacotes 
pelo firewall?

Patrick, pode dar uma mãozinha de novo?

-- 
Cordialmente,

Rodolfo Zappa

Archive TSP - Total Solution Provider
Nosso negócio é garantir que a sua rede de informações não pare!

(21) 2567-1842
[EMAIL PROTECTED]
http://www.archive.com.br

Se a gente se lança sem vigor, sete de dez ações tomadas não dão certo. É 
extremamente difícil tomar decisões num estado de agitação. Por outro lado, se 
sem se preocupar com as conseqüências menores, abordamos os problemas com o 
espírito afiado como uma lâmina, sempre encontramos a solução em menos tempo do 
que é necessáio para respirar sete vezes. Nabeshima Naoshige (1538-1618) 




-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd


Re: [FUG-BR] Dúvida Natd (fluxo de pacotes pelo ip fw)

2007-08-24 Por tôpico João Paulo Just
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

Rodolfo Zappa escreveu:
 Ok, mas o pacote é reavaliado desde o início das regras, ou a partir do 
 ponto do divert?
 
 O problema que eu tenho é o seguinte: eu quero bloquear ou liberar 
 pacotes da minha lan para a internet, baseados no ip de origem. Mas, 
 após passar pelo natd, o pacote perde a referência do ip de origem, e a 
 terceira regra abaixo, nunca é acionada.
 
 ${ipfw} 100 divert natd ip from any to any via ${ext_if}
 ${ipfw} 101 chek-state
 ${ipfw} 102 allow tcp from 192.168.0.25 to any 80 out via ${ext_if}

Faça:

${ipfw} 102 allow tcp from 192.168.0.25 to any 80 in via ${in_if}

Na interface de saída, o IP de origem já foi traduzido. Essa regra deve
ser feita na interface de entrada. (Pelo menos é assim que eu faço)

 Estou estudando o IPFW, acho a sintaxe maravilhosa e simples, os 
 controles de banda facílimos de aprender, mas o fluxo do pacote pelo 
 firewall, quando tem um divert para o natd,  são muito mal documentados 
 e completamente diferentes do PF, IPF e até do IPTABLES do netfilter.
 
 Por exemplo, no netfilter o fluxo é assim (simplificando):
 
  nat prerouting -- forward -- nat postrouting
 
 e quando eu quero liberar ou bloquear um pacote, baseado na origem, uso 
 a chain forward, que memso depois de pasara pelo nat, não perde a 
 referência do ip de origem.
 
 Alguém tem um bom doc sobre ipfw + natd, mostrando o fluxo dos pacotes 
 pelo firewall?
 
 Patrick, pode dar uma mãozinha de novo?

- --
João Paulo Just
Diretor Executivo - Justsoft Informática Ltda.
http://www.justsoft.com.br/
- --
Ilhéus, BA, Brasil.
+55 75 8104 8473
-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.6 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFGztU8XL+vuN2d7ZwRAnE5AKCUSJHmv1qBVoT8ajgtCPEDmX+zmACgluzC
0yClkkwmeqSnAV+dvH0ffBE=
=Jwcq
-END PGP SIGNATURE-
-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd


Re: [FUG-BR] Dúvida Natd (fluxo de pacotes pelo ip fw)

2007-08-24 Por tôpico Joao Paulo Marques Mattos
Rodolfo,

Vee se esse script te ajuda... fiz ele ja faz um tempo, seria apenas um 
exemplo que separa o fluxo, se alguma coisa der errado ou nao funcionar 
verifique os logs

[]´s

JP


#!/bin/sh
# Regras de Firewall (ipfw - IP firewall and traffic shaper control program)
# Escrito por Joao Paulo Marques Mattos ([EMAIL PROTECTED])
# Data: 27/12/2002
#
#
# para que este script funcione eh necessario que seja indicado a 
localizacao
# dele no arquivo /etc/rc.conf, procure por: firewall_enable=YES
# e insira na proxima linha: firewall_script=/etc/firewall/fwrules

# define o comando do firewall (igual ao /etc/rc.firewall) para simplificar
# a referencia. facilita a leitura.
fwcmd=/sbin/ipfw

# define a interface externa e o seu IP
exteth=rl1
extIP=200.0.0.139/32

# define a interface interna
inteth=rl0

# forca a remocao das regras atuais antes de carregar
$fwcmd -f flush

# dummynet setando o pipe e a sua velocidade
#$fwcmd pipe 10 config mask src-ip 0x00ff bw 64kbit/s queue 6Kbytes
#$fwcmd pipe 11 config mask dst-ip 0x00ff bw 64kbit/s queue 6Kbytes

# Verifica todo o trafego entrante... interface externa
# em caso positivo pula para a regra 5
##
$fwcmd add skipto 5 all from any to me in recv $exteth

##
# Filtra e verifica todo trafego sainte e (com regras dinamicas)
# todo trafego entrante
##
# libera pelo NAT
$fwcmd add skipto 4 tcp from 192.168.1.10 to any keep-state out xmit 
$exteth

# ICMP GERAL
$fwcmd add skipto 4 icmp from any to any icmptypes 0,3,8,11

##
# permite todas as conexoes confiaveis - interface interna
##

# localhost
$fwcmd add allow ip from any to any via lo0

# dummynet para squid
#$fwcmd add pipe 10 log all from 192.168.1.10 to me 3128 out via $exteth
#$fwcmd add pipe 11 log all from me 3128 to 192.168.1.10 in via $exteth

# liberado somente para interface interna
$fwcmd add allow tcp from any to any out xmit $exteth setup
$fwcmd add allow udp from any to any out xmit $exteth

# uma vez que uma conexao foi estabelecida, permite que fique aberta
$fwcmd add allow tcp from any to any via $exteth established

# Libera e loga o resto do trafego da interface interna
$fwcmd add allow log ip from any to any via $inteth

$fwcmd add allow udp from any 53 to any in via $exteth

# Pra ter certeza de que nao passara nada que nao for permitido
$fwcmd add deny log ip from any to any

##
# Somente passarao por estas regras em duas circunstancias:
# 1) Qualquer pacote sainte que recebeu a flag keep-state
# 2) Qualquer pacote entrante que encontrar uma regra dinamica
##

# NAT
$fwcmd add 4 divert natd all from any to any out xmit $exteth

# dummynet
$fwcmd add pipe 11 log all from any 80 to 192.168.1.10 in via $exteth

# Interface interna
$fwcmd add allow ip from any to any via $inteth

# conexoes iniciadas pelo servidor
$fwcmd add allow tcp from any to any out xmit $exteth setup
$fwcmd add allow udp from any to any out xmit $exteth

# uma vez que uma conexao foi estabelecida, permite que fique aberta
$fwcmd add allow tcp from any to any via $exteth established

# ICMP (para ping e traceroute funcionarem)
$fwcmd add allow icmp from any to any

# DNS
$fwcmd add allow udp from any 53 to any 1024-65535 in via $exteth

# Liberacao de todo resto com log para debug
$fwcmd add allow log all from any to any

# Pra ter certeza de que nao passara nada que nao for permitido
$fwcmd add deny log all from any to any

##
# Somente passarao por estas regras trafego entrante. Precisamos
# definir o que queremos aceitar ou nao. A flag ckeck-state
# ira disparar a regra dinamica e pular para a 4
##

$fwcmd add 5 divert natd all from any to any in recv $exteth
$fwcmd add check-state

# conexoes iniciadas pelo servidor
$fwcmd add allow tcp from any to any out xmit $exteth setup
$fwcmd add allow udp from any to any out xmit $exteth

# uma vez que uma conexao foi estabelecida, permite que fique aberta
$fwcmd add allow tcp from any to any via $exteth established

# UDP - DNS
$fwcmd add allow udp from any 53 to any in
$fwcmd add allow udp from any to any 53 in

# ICMP (para ping e traceroute funcionarem)
$fwcmd add allow icmp from any to any

# rejeita o resto
$fwcmd add deny log all from any to any

-
Histórico: http://www.fug.com.br/historico/html/freebsd/

Re: [FUG-BR] Dúvida Natd (fluxo de pacotes pelo ipfw)

2007-08-24 Por tôpico João Paulo Just
Em Sex, Agosto 24, 2007 10:28 am, Joao Paulo Marques Mattos escreveu:
 Rodolfo,

 Vee se esse script te ajuda... fiz ele ja faz um tempo, seria apenas um
 exemplo que separa o fluxo, se alguma coisa der errado ou nao funcionar
 verifique os logs

 []´s

 JP

Scriptzão danado de grande, xará :P Vou aproveitar pra aprender mais com ele.

-- 
João Paulo Just
Diretor Executivo - Justsoft Informática Ltda.
http://www.justsoft.com.br/
--
Ilhéus, BA, Brasil.
+55 75 8104 8473


-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd


[FUG-BR] Dúvida Natd

2007-08-23 Por tôpico Rodolfo Zappa
Alguém pode me passar o fluxo de um pacote pelo firewall?

Minha dúvida é a seguinte:

Depois de fazer o divert para o natd, o pacote é traduzido (nateado).

Após isso ele é re-injetado no fluxo do firewall, podendo ser reavalidao 
pelo filtro de pacotes?

Exemplo:

${ipfw} 00400 divert natd ip from any to any via ${ext_if}
${ipfw} 00401 check-state
${ipfw} 00402 deny log tcp from any to any 80 out via ${ext_if} setup 
keep-state

Esta terceira regra nunca é acionada.



-- 
Cordialmente,

Rodolfo Zappa

Archive TSP - Total Solution Provider
Nosso negócio é garantir que a sua rede de informações não pare!

(21) 2567-1842
[EMAIL PROTECTED]
http://www.archive.com.br

E não sabendo que era impossível, ele foi lá e fez. 
(Autor desconhecido)

Se a gente se lança sem vigor, sete de dez ações tomadas não dão certo. É 
extremamente difícil tomar decisões num estado de agitação. Por outro lado, se 
sem se preocupar com as conseqüências menores, abordamos os problemas com o 
espírito afiado como uma lâmina, sempre encontramos a solução em menos tempo do 
que é necessário para respirar sete vezes.
(Nabeshima Naoshige, 1538-1618) 

-
Histórico: http://www.fug.com.br/historico/html/freebsd/
Sair da lista: https://www.fug.com.br/mailman/listinfo/freebsd