[FUG-BR] IPFW + NATD + FTP ATIVO

Rodolfo Zappa listas-rod em zappa.eti.br
Sexta Julho 27 23:21:03 BRT 2007


Galera,

Antes de alguém vir com sermão, já pesquisei muito no histórico da lista 
de no google, ok?

Estou montando um gateway de internet para uma lan pequena, cujas regras 
de firewall estou fazendo em IPFW.

Esta é a primeira vez que utilizo o IPFW, pois antes utilizava o PF.
Diga-se de passagem, que achei o IPFW muito mais flexível, enxuto e de 
sintaxe mais fácil de aprender que o PF.

O problema que eu tive, foi para colocar o maldito ftp ativo (clientes 
na minha lan acessando servidores na internet) funcionando através do nat.

O ftp passivo funciona, com a seguinte regra:

#---- Regra pra liberar FTP passivo (eh phoda!)
${ipfwcmd} 03999 ${skipto} tcp from any 1024-65535 to any 10240-65535 
out via ${ext_if} setup keep-state

Mas ficam muitas portas liberadas, e preferiria ter somente o ftp ativo.

Para isto, estou iniciando o natd com a seguinte linha no rc.conf:

firewall_enable="YES"
firewall_script="/usr/local/etc/ipfw.sh"
natd_enable="YES"
natd_interface="fxp0"
natd_flags="-dynamic -m -use_sockets -u -punch_fw 100:200"

Para as regras do punch_fw ficarem logo após destas:

#---- Divert para nat e checkagem de regras dinâmicas
${ipfwcmd} 00010 divert natd ip from any to any in via ${ext_if}
${ipfwcmd} 00011 check-state

O problema é que o punch coloca regras liberando o tráfego da máquina 
cliente em direção ao servidor na porta 20, e vice-versa, mas a conexão 
de retorno do servidor não funciona (o cliente não consegue listar os 
diretórios depois de conectado).

Perguntas:
1) A regra que o punch coloca não tem a opção setup keep-state. É assim 
mesmo?
2) A regra do punch tem que ficar onde exatamente? Ela está depois do 
divert in e check-state e antes das regras de skipto.

Abaixo, segue meu script de firewall completo.

Por favor, me enviem uma luz.

-------------------------------------------------
#!/bin/sh

#------- Variáveis de ambiente
ipfw='ipfw'
ipfwcmd='ipfw -q add'
skipto='skipto 65500'

ext_if='fxp0'
lan_if='rl0'

src_num='300'
src_free='192.168.0.34'

dst_num='500'
dst_free='200.177.225.0/24'

tcp_num='2000'
tcp_out='21 22 25 53 110 123 143 80 443 567 993 995'

udp_num='3000'
udp_out='53'

icmptypes='0,3,8,11,12,13,14'

#---- Limpa geral (exceto set 31)
${ipfw} -q -f flush

#---- Libera tráfego oriundo próprio do firewall
${ipfwcmd} 00001 allow all from any to any via lo
${ipfwcmd} 00002 allow all from me to any out via ${ext_if} setup 
keep-state uid root

#---- Libera tráfego na interface da LAN
${ipfwcmd} 00003 allow all from any to any via ${lan_if}

#---- Divert para nat e checkagem de regras dinâmicas
${ipfwcmd} 00010 divert natd ip from any to any in via ${ext_if}
${ipfwcmd} 00011 check-state

#---- Tráfego de saída
for src in ${src_free} ; do
    ${ipfwcmd} ${src_num} ${skipto} all from ${src} to any out via 
${ext_if} keep-state
    src_num=$(echo "${src_num} + 1" | bc)
done

for dst in ${dst_free} ; do
    ${ipfwcmd} ${dst_num} ${skipto} all from any to ${dst} out via 
${ext_if} keep-state
    dst_num=$(echo "${dst_num} + 1" | bc)
done

for tcp in ${tcp_out} ; do
    ${ipfwcmd} ${tcp_num} ${skipto} tcp from any to any ${tcp} out via 
${ext_if} setup keep-state
    tcp_num=$(echo "${tcp_num} + 1" | bc)
done

for udp in ${udp_out} ; do
    ${ipfwcmd} ${udp_num} ${skipto} udp from any to any ${udp} out via 
${ext_if} keep-state
    udp_num=$(echo "${udp_num} + 1" | bc)
done
   
${ipfwcmd} 03998 ${skipto} icmp from any to any icmptypes ${icmptypes} 
out via ${ext_if} keep-state

#---- Regra pra liberar FTP passivo (eh phoda!)
${ipfwcmd} 03999 ${skipto} tcp from any 1024-65535 to any 10240-65535 
out via ${ext_if} setup keep-state

#---- Tráfego de entrada
${ipfwcmd} 05000 deny all from any to any frag in via ${ext_if}
${ipfwcmd} 05001 deny tcp from any to any established in via ${ext_if}

${ipfwcmd} 05010 deny all from 0.0.0.0/8 to any in via ${ext_if}        
# loopbak
${ipfwcmd} 05011 deny all from 127.0.0.0/8 to any in via ${ext_if}      
# loopbak
${ipfwcmd} 05012 deny all from 10.0.0.0/8 to any in via ${ext_if}       
# RFC 1928
${ipfwcmd} 05013 deny all from 172.16.0.0/12 to any in via ${ext_if}    
# RFC 1918
${ipfwcmd} 05014 deny all from 192.168.0.0/16 to any in via ${ext_if}   
# RFC 1918
${ipfwcmd} 05015 deny all from 169.254.0.0/16 to any in via ${ext_if}   
# DHCP auto-config
${ipfwcmd} 05016 deny all from 192.0.2.0/24 to any in via ${ext_if}     
# Reservado
${ipfwcmd} 05017 deny all from 204.152.64.0/23 to any in via ${ext_if}  
# Sun Cluster
${ipfwcmd} 05018 deny all from 224.0.0.0/3 to any in via ${ext_if}      
# Class D e E

${ipfwcmd} 05100 allow icmp from any to me icmptypes ${icmptypes} via 
${ext_if} limit src-addr 2
${ipfwcmd} 05101 allow tcp from any to me 22 in via ${ext_if} limit 
src-addr 2

${ipfwcmd} 05200 deny log all from any to any in via ${ext_if}
${ipfwcmd} 05201 deny log all from any to any out via ${ext_if}

#---- Regra skip to para nat do tráfego de saída
${ipfwcmd} 65500 divert natd ip from any to any out via ${ext_if}
${ipfwcmd} 65501 allow ip from any to any

#---- Bloqueia tudo por default
${ipfwcmd} 65534 deny log all from any to any

-- 
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
rodolfo em archive.com.br
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) 






Mais detalhes sobre a lista de discussão freebsd