Internet fácil, fácil
O IP masquerade garante conexão segura de pequenas redes à Internet
Marcelo B. Lima
marcelolima@dcc.unicamp.br
Com algumas máquinas, placas de rede, cabos e com o Linux é possível construir hoje uma pequena rede
local a custos relativamente baixos e com os objetivos mais variados.
Com essas novas redes locais surge a necessidade de conexão à Internet, e para que máquinas em rede façam
parte da Internet é preciso ter um endereço IP oficial atrelado a cada uma delas. Entretanto, com a escassez de endereços IP
disponíveis pode tornar-se difícil, caro ou mesmo pouco compensador ter endereços IP oficiais alocados para todas as máquinas
numa rede. O IP masquerade permite que uma rede seja conectada à Internet usando somente um único endereço IP oficial.
O objetivo deste artigo é apresentar uma rede para IP masquerade, procurando esclarecer cada passo.
Segurança pode ser um outro bom motivo para o uso de IP masquerade e várias redes locais implementam firewalls com masquerading.
O que é IP masquerade?
O IP masquerade é um caso especial de NAT (Network Address Translation) que permite a computadores conectados
internamente numa rede local, usando endereços IP não oficiais ou inválidos, comunicarem-se com hosts na Internet via uma
"Linux box" com um único endereço IP oficial, ou seja, se existe uma máquina Linux com acesso à Internet, qualquer máquina
conectada a ela pode compartilhar esse acesso através do IP masquerade.
Um dos cenários mais comuns (figura 1) de uso são redes locais Ethernet com máquinas que usam endereços
IP não oficiais partilhando o acesso discado à Internet de uma máquina Linux. Nesses casos, essa máquina Linux, um gateway,
é configurada com duas interfaces: uma na rede local com seu respectivo endereço IP não oficial e uma outra interface,
normalmente PPP (Point to Point Protocol), conectada à Internet com endereço IP dinamicamente atribuído por um provedor de
acessos à Internet.
O processo de masquerading, no gateway, reescreve os cabeçalhos dos pacotes IP provenientes das máquinas
da rede interna e com destino à Internet, usando respectivamente nos campos endereço de origem e porta de origem, o seu endereço
IP válido e um número de porta disponível que serve para separar os tráfegos entre as diferentes sessões das várias máquinas
da rede. Todo tráfego da rede para Internet deve fluir pela máquina gateway e nenhuma máquina na rede interna pode ser "alcançada"
diretamente por computadores remotos. Para máquinas remotas é como se todas as requisições viessem de clientes da máquina Linux,
da mesma forma que ocorre num proxy. A diferença está no fato de NAT ou IP masquerade não fazer nenhum tipo de filtragem.
As máquinas "mascaradas" ficam escondidas atrás do gateway e, portanto, um bom firewall pode ser implementado usando IP
masquerade.
Endereços IP não oficiais ou inválido
A RFC 1918 define três blocos do espaço de números IP que devem ser usados somente em "redes privadas".
Pacotes usando esses endereços não podem trafegar pela Internet e por isso são considerados endereços inválidos. Esses blocos
são:
Classe |
Bloco |
Classe A |
10.0.0.0 - 10.255.255.255 |
Classe B |
172.16.0.0 - 172.31.255.255 |
Classe C |
192.168.0.0 - 192.168.255.255 |
Como habilitar IP masquerade no Kernel da máquina gateway
Para habilitar IP masquerade é preciso primeiramente compilar o kernel da máquina Linux que funcionará
como gateway, com suporte ao processo de masquerading. Algumas distribuições já trazem o kernel com suporte à IP masquerade.
Detalhes de como compilar o kernel do Linux fogem do escopo deste artigo, mas podem ser encontrados em diversos documentos na
Internet e no "Kernel-howto".
Sem muitos detalhes, abaixo estão as opções relacionadas ao IP masquerade que devem ser compiladas no kernel
- ver quadro (vale ressaltar novamente que neste artigo estamos usando as versões 2.2.x do kernel).
É importante, depois de compilar o novo kernel, não esquecer de compilar e instalar os módulos do kernel
para que módulos responsáveis pelo tratamento de protocolos complexos possam ser carregados e usados no processo de masquerading:
# make modules;
make modules_install
|
Alguns protocolos de aplicação TCP/IP não trabalham perfeitamente com IP masquerade porque eles podem
codificar ou usar endereços IP e números de porta em seu fluxo de dados. Como esses campos do cabeçalho IP são reescritos
no processo de masquerading para valores diferentes, esses protocolos não chegarão aos resultados esperados. Alguns outros
protocolos também usam os problemáticos "back-channels", como é o caso do FTP. Nesses protocolos, computadores remotos podem
fazer pedidos de conexão, usando números de portas negociados no decorrer de uma sessão, como resposta a certas requisições
das máquinas internas. O IP masquerade por si só é incapaz de tratar tais protocolos. Isso explica a necessidade de módulos
auxiliares especiais para o tratamento de protocolos com essas características. Se algum serviço ou protocolo de aplicação
não funciona depois de terminada a configuração da rede para IP masquerade, é possível que ele necessite ainda de algum
módulo ou configuração especial para fazer com sucesso o seu trabalho.
Usando o Ipchains e módulos especiais para IP masquerade
O Ipchains é uma ferramenta que permite a manipulação, por parte do usuário, das regras de filtragem usadas
pelo filtro de pacotes implementado nas versões do kernel da série 2.2.x. O objetivo de um filtro de pacotes é controlar o
fluxo de pacotes entrando e saindo de uma rede. Portanto, é uma ferramenta útil para a implementação de firewalls. Desde as
versões 1.3.x, quando IP masquerade foi introduzido como uma função do kernel no Linux, os processos de filtragem de pacotes
e masquerading são implementados juntos. Isso não mais será verdade na próxima série do kernel de produção (versões 2.4.x).
Nessa última, o processo de filtragem de pacotes será responsabilidade do módulo Iptables e o masquerading será realizado junto
com o módulo de tratamento de NAT, o Ipnatacl (isso faz mais sentido, uma vez que masquerading é um caso especial de NAT).
Depois de compilado o kernel com suporte à IP masquerade, como foi mostrado na seção anterior, usaremos
o Ipchains para incluir as regras de masquerading e carregaremos os módulos auxiliares para tratamento especial de alguns
protocolos mais complexos. Para automatizar esse trabalho pode-se criar um script (figura 2) com os comandos necessários e
invocá-lo de algum arquivo de inicialização durante o boot da máquina. Neste ponto, pressupõe-se que o leitor já tenha uma
rede local devidamente configurada e funcionando com todas as máquinas usando endereços IP não oficiais. Além disso, supõe-se
também que a máquina gateway tenha uma interface na rede e uma outra interface na Internet, seja configurada para rotear
pacotes entre essas interfaces (opção ip_forward habilitada) e que todas as máquinas na rede sejam capazes de resolver nomes
de máquinas na Internet. Montar e configurar a rede foge do escopo deste artigo, mas informações podem ser obtidas nos Howtos
ou na documentação encontrada na distribuição Linux usada.
Configurando as máquinas internas
Para fazer uso do masquerading, as demais máquinas numa rede local devem ser configuradas tendo a máquina
Linux como default gateway. Dessa forma, todo tráfego da rede interna com destino à Internet passará obrigatoriamente pelo
gateway, onde os endereços IP inválidos serão reescritos para o endereço válido dessa máquina. Como todas as comunicações com
a Internet compartilham o endereço IP do gateway, todos os pacotes voltando à rede interna são destinados ao gateway e ele
se encarrega de reescrever e enviar os pacotes para os destinos corretos dentro da rede interna. Os computadores na rede
interna não precisam necessariamente ter o Linux como sistema operacional. Windows 9x, outros sabores do Unix (Solaris, por
exemplo), Macintosh OS, OS/2, Novell, Amiga, são sistemas que podem estar instalados nessas máquinas da rede.
Oferecendo serviços internamente
Por padrão, IP masquerade não pode tratar de requisições remotas a serviços rodando em máquinas dentro da
rede interna. Assim, se um usuário quer que um servidor de FTP em uma máquina dentro da rede local usando endereço IP inválido
possa responder a essas requisições vindas da Internet, ele precisará de algum programa especial sendo executado no gateway,
para fazer "port forwarding". Um desses programas para versões do kernel 2.2.x é o ipmasqadm. O que esses programas fazem é
simplesmente redirecionar os pacotes para a máquina interna quando eles chegam destinados a um determinado número de porta
no gateway. Para o cliente remoto é como se o serviço estivesse sendo oferecido no gateway, que é a única máquina na rede
que tem um número IP válido. Vale ressaltar aqui que essa solução em nada protege esse servidor de possíveis ataques vindos
da Internet. Daí, se a rede local exige uma segurança maior e precisa oferecer um certo serviço a computadores remotos, uma
alternativa melhor é usar um proxy dedicado para o serviço. Com um proxy, pode-se fazer uma filtragem nos dados, criar logs
das comunicações e dos dados trocados e autenticar usuários.
IP masquerade e segurança
Quando uma rede local é conectada à Internet, torna-se possível o estabelecimento de um canal virtual de
comunicação entre as máquinas que fazem parte dessa rede e milhões de outros computadores espalhados pelo mundo. Em conseqüência,
essa rede pode também tornar-se alvo de ataques de pessoas localizadas nos mais remotos pontos da rede. O IP masquerade pode
ser usado para implementar um firewall, isolando as máquinas na rede interna. No entanto, a máquina responsável pelo processo
de masquerading está diretamente conectada à Internet e merece uma preocupação especial. É essencial "blindar" essa máquina
para evitar que ela seja usada como trampolim para algum atacante entrar em sua rede interna ou usá-la como origem para
ataques a outras redes remotas. O leitor é, então, fortemente estimulado a criar, no gateway, regras de filtragem de pacotes
com Ipchains e eliminar serviços desnecessários que possam apresentar vulnerabilidades de segurança, implementando, desta
forma, um firewall bastante seguro. Como fortalecer essa máquina para amenizar efeitos de ataques é assunto para um próximo
artigo.
Máquina da Rede (192.168.0.*)>(eth0:192.168.0.1) Linux
(ppp0: IP válido) Internet
* Prompt for development and/or incomplete code/drivers
(CONFIG_EXPERIMENTAL) [Y/n/?] - YES
* Enable loadable module support (CONFIG_MODULES) [Y/n/?] - YES
* Networking support (CONFIG_NET) [Y/n/?] - YES
* Packet socket (CONFIG_PACKET) [Y/m/n/?] - YES
* Kernel/User netlink socket (CONFIG_NETLINK) [Y/n/?] - YES
* Network firewalls (CONFIG_FIREWALL) [Y/n/?]- YES
* TCP/IP networking (CONFIG_INET) [Y/n/?] - YES
* IP: verbose route monitoring (CONFIG_IP_ROUTE_VERBOSE) [Y/n/?] - YES
* IP: firewalling (CONFIG_IP_FIREWALL) [Y/n/?] - YES
* IP: firewall packet netlink device
(CONFIG_IP_FIREWALL_NETLINK) [Y/n/?] - YES
* IP: always defragment (required for masquerading)
(CONFIG_IP_ALWAYS_DEFRAG) [Y/n/?] - YES
* IP: masquerading (CONFIG_IP_MASQUERADE) [Y/n/?] - YES
* IP: ICMP masquerading (CONFIG_IP_MASQUERADE_ICMP) [Y/n/?] - YES
* IP: masquerading special modules support
(CONFIG_IP_MASQUERADE_MOD) [Y/n/?] - YES
* IP: ipautofw masq support (CONFIG_IP_MASQUERADE_IPAUTOFW)
[N/y/m/?] - NO
* IP: ipportfw masq support (CONFIG_IP_MASQUERADE_IPPORTFW)
[Y/m/n/?] - YES
* IP: optimize as router not host (CONFIG_IP_ROUTER) [Y/n/?] - YES
* IP: TCP syncookie support (not enabled per default)
(CONFIG_SYN_COOKIES) [Y/n/?] - YES
* Network device support (CONFIG_NETDEVICES) [Y/n/?] - YES
|
Figura 1 - Cenário Típico |
Figura 2 - Script de inicialização para IP masquerade
#!/bin/sh
# Script para inicialização do IP masquerade no kernel 2.2.x.
# Observação: Carregue somente os módulos necessários para a sua rede.
# Neste exemplo, alguns módulos comumente usados estão sendo carregados.
/sbin/depmod -a
# Módulo para tratamento do FTP.
/sbin/modprobe ip_masq_ftp
# Este módulo suporta masquerading do RealAudio usando UDP. Sem esse
# módulo, RealAudio funcionará, mas usando TCP. Isso pode causar a redução # na qualidade do som.
/sbin/modprobe ip_masq_raudio
# Suporta o masquerading do IRC
/sbin/modprobe ip_masq_irc
# Suporta o masquerading do Quake e QuakeWorld por default. Este módulo é # para múltiplos
usuários atrás do gateway. Se você está jogando o
# Quake I, II e III, use o segundo exemplo (descomente a linha correta).
# Quake I / QuakeWorld (portas 26000 e 27000)
/sbin/modprobe ip_masq_quake
# Quake I/II/III / QuakeWorld (portas 26000, 27000, 27910, 27960)
# /sbin/modprobe ip_masq_quake ports=26000,27000,27910,27960
# Suporte o masquerading do CuSeeme
/sbin/modprobe ip_masq_cuseeme
# Faça a máquina Linux (gateway) desempenhar papel de roteador.
echo "1" > /proc/sys/net/ipv4/ip_forward
# Verifica tentativas de IP spoofing.
# Isso evita que máquinas remotas usem o gateway para mascarar seus
# ataques a outras redes.
echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
# Se o endereço IP é dinamicamente atribuído, é interessante habilitar a
# seguinte opção. Isto evita problemas com o programa Diald e seus similares.
echo "1" > /proc/sys/net/ipv4/ip_dynaddr
# Timeouts
# Isso é útil porque evita indesejáveis encerramentos de conexões TCP
# (telnet, por exemplo).
# 2 horas ou 7200 segundos: timeout para sessões TCP
# 10 segundos: timeout para tráfego depois que o TCP/IP "FIN" pacote é recebido.
# 160 segundos: timeout para tráfego UDP (importante para usuários usando ICQ)
/sbin/ipchains -M -S 7200 10 160
# Como pretende-se somente que o kernel faça masquerading das máquinas
# internas, a política default usada para o filtro de pacotes (Ipchains),
# descarta todos os outros pacotes que chegam ao gateway com endereços IP
# de destino diferentes do endereço do gateway.
/sbin/ipchains -P forward DENY
# Finalmente, habilita IP masquerade
# Observação: Neste exemplo estamos usando 192.168.0.x como endereço de
# nossa rede local e com 255.255.255.0 como máscara de rede.
/sbin/ipchains -A forward -s 192.168.0.0/24 -j MASQ
|