Autor: Koji
Data: 08/07/2001
NAT em FreeBSD
1 . Introdução
2 . Primeiros preparativos
3 . NAT a nível de aplicação
4 . NAT a nível de interface
5 . Configuração dos clientes
6 . Mas informação
1 . Introdução
Leste pequeno articulo explicará de uma maneira fácil e rápida o procedimento para compartir a conexão a Internet com outros computadores (Windows, Linux, *BSD, etc) usando nosso FreeBSD como servo, ou neste caso como gateway e de uma maneira totalmente transparente para os clientes.
Para isso usaremos NAT, Network A ddress Translation (Tradução de direções de rede).
Como veis dividimos o doc em 6 apartados para fazê-lo mas
entretido e mas comprensible.
* O ponto 1 explica ... o que estais lendo agora ;-)
* O ponto 2 já entra na configuração de nosso
FreeBSD, mas as mudanças que aqui façamos serão validos tanto se fazemos NAT
a nível de interface como se fazemos NAT a nível de aplicação
* O ponto 3 abarcará o NAT a nível de aplicação. Sem
dúvida para minha é a melhor opção se temos um PC caseiro com um modem, ainda que se
preferimos fazê-lo via interface também valerá
* O ponto 4, tratará sobre NAT a nível de interface
. Quiçá esta é a melhor opção para redes complexas com firewall e
que usam tipos de conexão a Internet que não estão baseadas em modem
* O ponto 5, abarcasse a configuração dos computadores
clientes para estabelecer como gateway a nosso FreeBSD. Explicaremos por em cima
o procedimento para Windows 9X, *BSD e Linux.
* O ponto 6, explica onde encontrar mas informação sobretudo
o que se explica neste doc
vamos lá :-)
2 . Primeiros preparativos
Como comentámos anteriormente, o que aqui se explica se tem de fazer tanto se fazemos NAT a nível de aplicação como a nível interface.
Primeiramente devemos dotar a nosso FreeBSD de gateway ou
porta de enlace já que vai ser o que 'sirva' ao resto de clientes da rede
como gateway.
Para dotar a FreeBSD disto temos que pôr a linea gateway_enable="YES"
em nosso /etc/rc.conf. Esta linha é a referência para que os
arquivos de início possam executar o comando sysctl -w
net.inet.ip.forwarding=1. Este comando ativa o ip forwading o qual nos permitirá
converter nosso FreeBSD num gateway. Para aqueles interessados em saber
em que script de início se executa tal comando que revisem o arquivo /etc/rc.network.
Se tocámos o arquivo /etc/rc.conf as mudanças não se ativarão
até iniciar de novo a maquina, assim que se vos parece, o mas cómodo é
estabelecer o /etc/rc.conf com a variável que indicámos
anteriormente, e fazer uso do comando sysctl para já dispor do ip
forwading sem ter que reiniciar
3. NAT a nível de aplicação
Este tipo de NAT o faremos junto com PPP. O mecanismo é singelo, tão só temos de passar o parâmetro -nat ao lançar o programa ppp como de costume e com seus parâmetros que púnhamos anteriormente.
ej: ppp -nat -background inet ('inet' é o nome de nossa etiqueta no ppp.conf, muda-a pela que tua tenhas definida)
Isso é todo, a partir desse momento nosso FreeBSD fará NAT com o resto de clientes. Fácil verdade? :-)
NOTA: Em versões antigas de FreeBSD (<=3.x) usava-se o parâmetro -alias. Se por casualidade ao usar -nat te dá algum tipo de erro de opção não reconhecida usa o -alias
4 . NAT a nível de interface
Se desejamos usar NAT em alguma interface (ed0, tun0
, etc.) o procedimento é algo mas longo.
Primeiramente devemos compilar nosso FreeBSD para que suporte firewall, neste caso
ipfw (IP Firewall). A verdade é que as ultimas versões de FreeBSD
(>=4.x) já trazem um modulo compilado para o uso de ipfw , mas
por desgraça não vem ativado com IPDIVERT, assim que a única
solução será compilar um novo kernel. Para isso devereis compilar um kernel
com as seguintes opções:
options IPFIREWALL
options IPDIVERT
Uma vez compilado o kernel com estas opções, faremos uso do programa natd e de umas réguas que agora poremos:
/sbin/ipfw -f flush
/sbin/ipfw add divert natd all from any to any via <interface>
(Mudai <interface> pelo interface que tenhais para sair a internet
ed0, tun0, etc.)
/sbin/ipfw add pass all from any to any
E agora poremos em marcha o natd:
natd -interface <interface> (Mudai <interface> pelo interface que tenhais para sair a internet, ed0, tun0, etc.)
E isso é todo. As réguas obviamente ativam o 'divert' para o interface que lhe indiquemos, e o programa natd será o encarregado de estar à escuta no interface indicado para ir 'traduzindo' a informação que lhe chega desde internet e desde os computadores clientes.
Todo isto é unicamente o que precisámos para fazer este tipo de NAT, mas como podeis ver, o ter que teclear todas estas réguas e demais cada vez que iniciemos nosso FreeBSD o fazem uma tarefa pesada. Para fazê-lo mas cómodo usaremos os scripts de início. Primeiramente tocaremos o arquivo /etc/rc.conf:
firewall_enable="YES"
firewall_type="/etc/firewall.rules"
firewall_logging="YES"
firewall_script="/etc/rc.firewall"
natd_enable="YES"
natd_interface="ed0"
Tentai colocar as linhas com este ordem, a minha me funcionou bem. Quiçá o mas importante a comentar seja a segunda linha, que especifica o arquivo onde estarão ubicadas as anteriores réguas que tínhamos tecleado a mão e a ultima linha que especifica o interface do programa natd. Muda ed0 pelo que te corresponda. As restantes ativam o firewall e o programa natd
Uma vez feitos estas mudanças em etc //rc.conf criaremos o arquivo /etc/firewall.rules para pôr as anteriores réguas do ipfw. Ficaria algo assim:
-f flush
add divert natd all from any to any via <interface> (Mudai
<interface> pelo interface que tenhais para sair a internet, ed0
, tun0, etc.)
add pass all from any to any
E guardámos o arquivo.
Agora cada vez que reiniciemos nosso FreeBSD todo será automático e não nos teremos
que preocupar de ativar natd nem agregar nenhuma régua ipfw
Antes de acabar este apartado me gostaria comentar uma coisa para todos
aqueles que estejais usando modem com PPP (interface tun0) e
estejais provando este procedimento.
Já que nós usámos PPP para conectar a internet, não podemos fazer uso
destes scripts de início para que todo seja automático. A IP de internet
só
temo-la após executar PPP e portanto as réguas de ipfw e
a activación de natd *SÓ* funcionarão se já arrancámos PPP
e dispomos de uma IP previamente. Soluções?
Para começar modificar ligeiramente nosso /etc/rc.conf e colocar só as opções seguintes:
firewall_enable="YES"
firewall_type="open"
firewall_logging="YES"
firewall_script="/etc/rc.firewall"
E agora nos fazemos a pergunta .. como ativamos as réguas ipfw
automaticamente? Uma das opções séria fazer uso do arquivo ppp.linkup.
Este arquivo esta destinado a executar o que nós queiramos justamente
após estabelecer-se a conexão PPP. Portanto nos vem muito
bem.
Só precisámos criar o arquivo /etc/ppp/ppp.linkup e pôr o
seguinte:
inet:
!bg /sbin/ipfw -f flush
!bg /sbin/ipfw add divert natd all from any to any via tun0.
!bg /sbin/ipfw add pass all from any to any
!bg natd -interface tun0.
Assegurai-vos sobretudo de respeitar os espaços, enters, enters dobres, e sangrado. É dizer, deveria de estar o arquivo tal como veis este texto, senão possivelmente vos dará algum erro de script failed. Também assegurai-vos de substituir inet: pela etiqueta que useis vocês em vosso /etc/ppp/ppp.conf para conectar a internet. E finalmente o interface tun0 se de desse o caso de que usais outro.
E crio que isso é todo ;-) agora depois de executar PPP e estabelecer-se a
conexão, o arquivo que criámos (/etc/ppp/ppp.linkup) se
encarregará de estabelecer as réguas ipfw
5 . Configuração dos clientes
Agora que já temos o servo FreeBSD ativado para fazer NAT só nos fica configurar os clientes, assim que os separaremos para que este mas ordenado:
* CASO WINDOWS 9X *
No caso de Windows especificaremos a IP de nosso FreeBSD no icono rede,
propriedades tcpip de nossa targeta, pestana porta de enlace.
Também não deveríamos de esquecer-nos de configurar os DNS. Para isso no mesmo
lado mas pestana DNS. Aqui poremos as DNS que usemos
normalmente para Internet, e para que nosso Windows seja capaz de resolvê-las.
* CASO FreeBSD *
Só deveremos estabelecer a variável defaultrouter="IP GATEWAY"
pondo a IP de nosso FreeBSD que faz NAT no arquivo /etc/rc.conf
Agora só nos ficasse reiniciar para ativar as mudanças. Se não queremos
reiniciar podemos adicionar o comando seguinte:
route add default IP_GATEWAY (Mudando IP_GATEWAY pela IP do server que faz NAT)
* CASO OpenBSD e NetBSD *
Nestes dois BSD só deveremos colocar a IP de nosso gateway no arquivo
/etc/mygate e reiniciar para fazer efetivos as mudanças. Se não
desejámos reiniciar podemos usar o mesmo comando que explicámos em FreeBSD:
route add default IP_GATEWAY (Mudando IP_GATEWAY pela IP do server que faz NAT)
* CASO LINUX *
No caso de linux pode variar segun a distribuição, o que se podemos assegurar que este comando ativa a rota para o gateway:
route add default gw IP_GATEWAY (Mudando IP_GATEWAY pela IP do server que faz NAT)
Olhar a documentação de vosso linux para fazer efetivos as mudanças cada vez que se inicie vosso Linux
Para acabar, e se estais configurando qualquer *BSD ou Linux como cliente, não vos olvideis de tocar o arquivo /etc/resolv.conf para estabelecer os servos de nomes.
6 . Mas informação
Compilação do kernel: FAQ e Handbook de FreeBSD
NAT: man natd
Rotas: man route
Outras variáveis: /etc/defaults/rc.conf
ipfw: man ipfw
Configuração PPP: /usr/share/examples/ppp
Para terminal dizer, que para qualquer comentário, erro ou qualquer outra coisa podeis escrever-me a koji @jet.é