Sunday, March 7, 2010

Roteador em GNU/Linux com apenas uma interface de rede.

Roteador em GNU/Linux com apenas uma interface de rede.

Olá, pessoal.

Já faz um bom tempo que eu não posto nada devido ao tempo que tenho ocupado com outras atividades. No entanto, esta semana ajudei um amigo a resolver um problema que achei que deveria postar. Na verdade é um problema que já resolvi de outras formas diferentes, mas agora resolvi de um jeito bem simples.

O problema era o seguinte: uma máquina que deveria ser o roteador entre a rede interna e a rede externa e possuía apenas uma interface de rede. Não faz muito sentido fazer isso, mas funciona bem quando se quer filtrar o tráfego em uma única máquina, por exemplo.

Inicialmente a visão física da rede era a seguinte:
Antes da configuração


Depois da configuração



Apesar de não fazer qualquer alteração física na rede, a visão lógica da rede fica da seguinte forma depois da configuração:




O conteúdo deste post está baseado na distribuição GNU/Linux Ubuntu Server 9.10 (Karmic Koala) no roteador, rede interna 192.168.0.0/24 e rede externa 192.168.15.0/24. Suponha que a interface eth0 já possui um endereço da rede externa, 192.168.15.243, por exemplo. Tanto faz o sistema operacional das máquinas da rede interna desde que você saiba configurá-los na rede.

Vamos à solução?

Passo 1: Criar a interface virtual de rede.
Na máquina que queremos como roteador, supondo que a interface física e única de rede esteja mapeada em eth0, vamos criar a interface virtual eth0:1.
Neste caso teremos uma mesma interface de rede, com um único endereço físico, respondendo por dois endereços de rede diferentes. Vou mostrar um método temporário e um método permanente. No método temporário as configurações serão apagadas quando o computador for desligado. Já no método permanente as configurações vão permanecer mesmo que o computador seja desligado.

Método temporário

$ sudo ifconfig eth0:1 192.168.0.1 netmask 255.255.255.0 up

Método permanente
Abra, edite e salve o arquivo /etc/network/interfaces
Após a última linha do arquivo, adicione as linhas abaixo:

#Interface virtual de rede
auto eth0:1
iface eth0:1 inet static
address 192.168.0.1
netmask 255.255.255.0


Reinicie as configurações de rede

$ sudo /etc/init.d/networking restart


Passo 2: Ativar o roteamento e a tradução de endereços.
A ativação do roteamento é sempre temporária a menos que o kernel seja recompilado. Por isso, no final do post há um script completo que pode ser colocado na inicialização do sistema para que o roteamento seja sempre ativado.

Ativando roteamento

$ sudo bash -c 'echo "1" > /proc/sys/net/ipv4/ip_forward'


Ativando tradução de endereços da rede interna para rede externa.

$ sudo iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE


Passo 3: Criar um script para ser executado na inicialização do sistema.
Este script foi criado pensando em uma interface virtual temporária. Caso você opte por uma interface virtual permanente, basta excluir a parte que cria a interface virtual do script.

#Início
#Criando e configurando a interface virtual de rede
ifconfig eth0:1 192.168.0.1 netmask 255.255.255.0 up


#Ativando roteamento

echo "1" > /proc/sys/net/ipv4/ip_forward


#Ativando tradução de endereços
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE


#Fim


Supondo que você salve o script no arquivo /home/user/script/configRoteador.sh
Para que esse script seja executado em toda inicialização do sistema basta colocar uma chamada no arquivo /etc/rc.local antes do comando exit 0.

sh /home/user/script/configRoteador.sh

exit 0

Agora, basta configurar o gateway dos computadores da rede interna para o novo roteador 192.168.0.1
Com o esquema desse post você pode ter em uma única máquina, com uma única interface de rede, vários serviços sendo executados como firewall, filtro de pacotes, compartilhamento de arquivos, etc.

Espero que o conteúdo do post seja útil para mais alguém.

[]s

Monday, July 27, 2009

Broadcom bcm43xx em modo Monitor e Kismet no Ubuntu

Hoje em dia não é difícil encontar um laptop que tenha como interface wireless uma placa Broadcom. Apesar de não serem tão flexíveis quanto placas Atheros, as placas Broadcom apresentam um desepenho suficiente para maioria das tarefas cotidianas que necessitem de acesso a uma rede wireless.

Até algum tempo atrás essas placas não possuiam bom suporte no GNU/Linux. Seus usuários eram obrigados a utilizar um driver para Windows e o aplicativo Ndiswrapper ou trocar de placa wireless para ter acesso à rede. O desempenho não era tão significativo com o Ndiswrapper e alguns problemas não permitiam associar a uma BSSID escondida usando WPA.

Como o número de usuários GNU/Linux que utilizam essa placas tem crescido, a distribuição Ubuntu já vem com um driver "Broadcom STA wireless driver" que funciona muito bem, exceto pelo fato de não dar suporte ao modo Monitor da placa. Ou seja, se você é daqueles usuários que gosta de, uma vez ou outra, usar um sniffer para captura de pacotes, ou simplesmente para verificar a saúde da sua rede, esse driver certamente é um problema.

Mas se você ainda acredita na sua placa Broadcom e pretende usar seu modo Monitor, os passos são simples. Para aqueles que usam Ubuntu é muito simples, uma vez que já existem pacotes prontos nos repositórios oficiais. Para aqueles que usam outras distribuições, basta pegar o driver disponível em http://bcm43xx.berlios.de

O conteúdo deste post está baseado na distribuição GNU/Linux Ubuntu 9.04 (Jaunty Jackalope), mas não deve ser difícil de adaptar os passos para outras distribuições.

Primeiro passo: Instalar o pacote b43-fwcutter.
Este pacote contém o fwcutter, uma ferramenta para extrair firmware. Este pacote também fará o download dos firmwares necessários e já fará a instalação automaticamente.
$sudo apt-get install b43-fwcutter

Segundo passo: Desabilitar o driver nativo que já vem instalado com a distribuição.
Para desabilitar o driver, vá em
System -> Administration -> Hardware Drivers
Selecione "Broadcom STA Wireless Driver" e clique em "Deactivate". Feche a janela.
Pronto, o driver foi desativado.

Terceiro passo: Reiniciar os módulos.
Existem outras formas de reiniciar os módulos carregados, no entanto, a maneira mais simples de reiniciar os módulos é reiniciando o computador.
$sudo reboot

Quarto passo: Verificar instalação dos módulos.
Se tudo aconteceu como o planejado os novos módulos devem estar carregados e prontos para serem utilizados após a reinicialização.
$lsmod | grep b43
b43 131484 0
mac80211 217464 1 b43
led_class 12036 1 b43
input_polldev 11912 1 b43
ssb 41220 1 b43

Quinto passo: Colocando a interface no modo Monitor.
No meu caso, a interface wireless Broadcom foi mapeada para wlan0.
$sudo iwconfig wlan0 mode monitor

Agora você pode usar seu sniffer preferido seja kismet, airodump ou outro de sua preferência.

Sexto passo: Configurando o Kismet.
Para usar o Kismet é necessário configurar o arquivo /etc/kismet/kismet.conf. Usando seu editor de texto preferido, altere as linhas as seguintes linhas e salve o arquivo. Substitua seu_usuario pelo usuário que usa normalmente.
suiduser=seu_usuario
source=b43,wlan0,bcm43

Sétimo passo: Colocando a interface no modo Managed.
Após usar o seu sniffer, você irá notar que não está associado a nenhuma rede. Quando no modo Monitor, a placa não está e não pode ser associada a nenhum BSSID.
Provavelmente, após usar seu sniffer você terá problemas para associar-se novamente. Para isso, é necessário que a placa volte a ser configurada para seu modo Managed.
$sudo ifconfig wlan0 down
$sudo iwconfig wlano mode managed
$sudo ifconfig wlan0 up
$sudo dhclient

Pronto, agora você está pronto para usar um sniffer sempre que quiser.

Tuesday, June 9, 2009

Criando uma LAN com VirtualBox

Criando uma LAN com VirtualBox


Este post ensina a criar uma pequena LAN utilizando um único computador, rodando GNU/Linux, com três máquinas virtuais sobre o VirtualBox. Claro que para isso o computador deve ter um bom processador e uma quantidade aceitável de memória. Acredito que com 1GB ou 2GB já é possível criar essa LAN de máquinas virtuais.

Algumas considerações iniciais:
- Para esse experimento foi utilizado o VirtualBox 2.2.4 em Ubuntu Desktop 9.04 (Jaunty Jackalope) - Este é o Host.
- Esta versão de VirtualBox já possui suporte facilitado para bridges virtuais, o que torna prático o trabalho de criação de uma rede local interna.
- Admite-se o uso da distribuição Ubuntu em todo experimento, mas não deve ser difícil utilizar uma distribuição diferente para o mesmo experimento.
- Não são abordadas as instalações dos SOs das máquinas virtuais, apenas as configurações.
- Os comandos descritos devem ser digitados dentro de um terminal (gnome-terminal, por exemplo).
- Admite-se que se tenha conhecimentos básicos de SO, Redes, Linux e algumas ferramentas como VIM, por exemplo.

Configurando as máquinas virtuais.
No VirtualBox foram criadas 3 máquinas virtuais:
- Guest 1: Servidor, Ubuntu Server 9.04.
O guest 1 será um roteador (gateway para os demais guests) e servidor de alguns serviços básicos de rede.
Para o guest 1, foram configuradas duas placas de rede:
Adapter 1 ativada em NAT.

Adapter 2 ativada em Internal Network, name virtualNetwork.


- Guest 2: Cliente, Windows XP.
Adapter 1 ativada em Internal Network, name virtualNetwork.


- Guest 3: Cliente, Ubuntu Desktop 9.04.
Adapter 1 ativada em Internal Network, name virtualNetwork.


Depois de configuradas as máquinas virtuais, a rede ficará assim:


Configurando o Guest 1.
Depois do boot do guest 1 é possível observar que apenas a interface eth0 (externa) é configurada.
$ifconfig

Passo 1: Configurando a segunda interface para IP estático.
$sudo vim /etc/network/interfaces

Passo 1.1:Adicione as seguintes linhas no final do arquivo, salve e feche o arquivo.
# The second network interface
auto eth1
iface eth1 inet static
address 192.168.10.1
netmask 255.255.255.0

Passo 2: Reiniciando as configurações de rede.
$sudo /etc/init.d/networking restart

Passo 3: Ativando o roteamento (eth0 <-> eth1).
$sudo echo "1" > /proc/sys/net/ipv4/ip_forward

Passo 4: Configurando tradução de endereços para rede interna.
$sudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE

Os passos 3 e 4 alteram tabelas dinâmicas do sistema e devem ser executados toda vez que guest 1 for inicializado.
Dica: Criar um script que execute os passos 3 e 4 automaticamente. Crie um script chamado configRouter.sh e coloque-o em /etc/rc.* (* depende do seu modo de inicialização).
#! /bin/bash
# ativando roteamento
echo "1" > /proc/sys/net/ipv4/ip_forward
# configurando tradução de endereços para rede interna
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE

Alterando permissão de execução do script.
$sudo chmod 744 configRouter.sh

Executando o script.
$sudo ./configRouter.sh

Configurando o Guest 2.
Passo único: Configure a Conexão Local do Windows XP para
Endereço IP: 192.168.10.2
Máscara de sub-rede: 255.255.255.0
Gateway Padrão: 192.168.10.1
Servidor DNS preferencial: 208.67.222.222
Servidor DNS alternativo: 208.67.220.220

Observe que o gateway padrão é o Guest 1.
Os endereços de servidores DNS utilizados são os endereços do OpenDNS (www.opendns.com). Para mais informações visite o site.

Configuração o Guest 3.
Passo 1: Configurando a primeira interface para IP estático.
$sudo vim /etc/network/interfaces

Passo 1.1: Adicione as seguintes linhas no final do arquivo, salve e feche o arquivo.
# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.10.3
netmask 255.255.255.0
network 192.168.10.0
broadcast 192.168.10.255
gateway 192.168.10.1

Passo 2: Configurando os servidores DNS.
$sudo /etc/resolv.conf

Passo 2.1: Adicione as seguintes linhas no final do arquivo, salve e feche o arquivo.
nameserver 208.67.222.222
nameserver 208.67.220.220

Passo 3: Reiniciando as configurações de rede.
$sudo /etc/init.d/networking restart

Agora basta fazer alguns testes de conectividade. É isso!
Um abraço.

Monday, June 1, 2009

DDNS-client atrás de NAT

DDNS no Linux
O serviço DDNS, além de gratuito, é uma ótima alternativa para quem deseja ter um domínio, mas não dispõe de um IP fixo.
Grande parte dos usuários domésticos requisita um novo IP a cada nova conexão com seu ISP. Sendo assim, um serviço de DNS que permita ao cliente atualizar suas entradas no DNS sempre que uma nova conexão com a Internet é estabelecida é bastante legal. Eis que surge o DDNS.
O endereço do serviço no site do fabricante é http://www.winco.com.br/ddns/
Lá podem ser encontradas várias informações sobre o serviço, bem como os clientes para sistemas operacionais Windows e Linux.
Os clientes para Windows são ótimos e bem completos. No entanto, o mesmo não ocorre para os clientes em Linux.
Os clientes para Linux são textuais e bem pouco intuitivos. Além do mais, existem apenas 2 casos de uso no site que, ao meu ver, não cobrem o caso de grande parte dos usuários: Um computador com Linux (cliente) atrás de um NAT (realizado num router DSL, por exemplo).
Dessa forma, criei um tutorial, baseado naqueles disponíveis no site do fabricante, que ensina como modificar o cliente em Linux para o que eu chamo de caso 3.

Caso 3: Não possui endereço IP Fixo e ESTÁ atrás de um NAT.

Lembrando que o IP resolvido será o seu IP externo dinâmico, então, cuidado com as configurações do seu router DSL ;)
1) Os programas de DDNS devem ser instalados no diretório /usr/local/sbin. Se esse diretório não existir, ele deve ser criado. Após a criação do mesmo, execute o comando:

$cd /usr/local/sbin

$tar zxf ddns-linux-1.0.tgz

2) Edite o arquivo /usr/local/sbin/ddns.sh e configure as seguintes linhas:
DOMINIO="seudominio.winconnection.net" #Seu end. DDNS (ex.: meuendereco) ou "seudominio.ddns.com.br" #Seu end. DDNS
SENHA="xxxxxxxxxx" #A sua senha para o domínio
INTERFACE="ppp0" #Coloque aqui o endereco correto da interface de rede Ex.: ppp0, eth0, etc

ALTERAÇÃO SUGERIDA -> Procure as seguintes linhas no arquivo ddns.sh
#Vamos ver se o endereco mudou
${BINDIR}/getip $INTERFACE > ${TMPDIR}/ddns.ip.new

Apague ou comente a linha "${BINDIR}/getip $INTERFACE > ${TMPDIR}/ddns.ip.new". Para comentar a linha basta colocar um "#" antes do início da linha.

Adicione a seguinte linha no lugar da linha apagada ou abaixo da linha comentada.
html2text http://checkip.dyndns.org | cut -c21-35 | tail -1 > ${TMPDIR}/ddns.ip.new

O resultado deste trecho será algo assim:
#Vamos ver se o endereco mudou
#${BINDIR}/getip $INTERFACE > ${TMPDIR}/ddns.ip.new
html2text http://checkip.dyndns.org | cut -c21-35 | tail -1 > ${TMPDIR}/ddns.ip.new

Eu prefiro comentar as linhas que não usarei como forma de backup. Caso algo dê errado, é possível voltar ao estado anterior.

3) Crie as seguinte entradas no crontab do root (usando crontab -e ) da seguinte forma:

*/1 * * * * /usr/local/sbin/ddns.sh

0,30 * * * * /usr/local/sbin/ddns-refresh.sh

Pronto. O DDNS For Linux está pronto para ser usado.

Para verificar se tudo deu certo, execute em um terminal:
$ nslookup seudominio.ddns.com.br

Espero que seja útil.
Um abraço.

Thursday, May 7, 2009

Reativando

Depois de muito tempo sem postar nada. Estou reativando o blog para publicar tudo aquilo de interessante que chegar até mim sobre o mundo da computação. Espero publicar assuntos interessantes e sempre manter o blog atualizado. É isso.