Revista Do Linux  
EDIÇÃO DO MÊS
  Ambientes Gráficos
  Atualidade
  Capa
  Crusoe
  Desenvolvimento Web
  Divirta-se
  Entrevista
  Estudo de Caso
  Ferramentas
  Flagship
  Linha de Comando
  Segurança
  Tecnologia

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

  

Para saber mais
 

A Revista do Linux é editada pela Conectiva S/A
Todos os Direitos Reservados.

Política de Privacidade