Mostrando postagens com marcador redes. Mostrar todas as postagens
Mostrando postagens com marcador redes. Mostrar todas as postagens

iperf - medindo a performance da sua rede


Introdução:
O iperf é um comando que permite mensurar de forma simples e direta a taxa de transmissão da sua rede.
São necessários dois computadores, um operando em modo servidor e outro em modo cliente.

Instalação:
O programa está disponível na forma de pacotes para as distribuições Debian e Ubuntu (e possivelmente para as distros da família Red Hat, como Cent OS e Fedora), bastando utilizar o comando
apt-get install iperf
Sintaxe:
iperf [opções]

Resumo das principais opções (para todas as outras, veja a página de manual - man iperf)

-p define a porta de trabalho ao invés da porta padrão (5001).

-u Envia pacotes UDP ao invés de TCP (ambas as máquinas precisam trabalhar com o mesmo tipo de pacotes)

-f X
Define a unidade a ser exibida, onde pode ser:
k: kbits
m: megabits
K: KBytes
M: MBytes

-m Exibe o MTU do segmento

-C permite que cliente e servidor sejam de versões diferentes (modo de compatibilidade)

Opções específicas do modo cliente
-c Executa em modo cliente

Opções específicas do modo servidor
-s Executa em modo servidor

Uso:
Para utilizar, basta executar o programa no modo servidor em uma máquina:

e na outra em modo cliente (informando o endereço IP da máquina servidora):

O teste dura aproximadamente 10 segundos. Durante esse tempo, o programa tenta enviar a maior quantidade de bytes possíveis, e exibe um relatório como o da imagem anterior em seguida (em ambas as máquinas). No caso, foram transferidos 207 MB, e a taxa de transferência calculada foi de 174 MBits/s.

Pacotes para Desktop: remmina

Remmina (http://remmina.sf.net) é um gerenciador de conexões remotas para desktop. Ele suporta os principais protocolos de conexões remotas:

  • VNC (modo cliente e servidor)
  • RDP (Remote Desktop, utilizado em Servidores Windows)
  • SSH 
  • NX (No Machine - http://nomachine.com )
  • SFTP (transferencia de arquivos segura, parecida com o SCP do protocolo SSH)
  • XDMCP (Terminal X Remoto)
O Remmina funciona através de um sistema de Plugins, facilitando a inclusão de novos protocolos. O software está disponível na forma de pacotes para as principais distribuições (Debian, Ubuntu, Fedora, etc). 

Para o Debian Wheezy, você provavelmente vai querer instalar os seguintes pacotes:
  • remmina: pacote principal
  • remmina-plugin-gnome: plugin de integração com Gnome (permite salvasr as senhas no sistema de Gerenciamento de Senhas do Gnome)
  • remmina-plugin-vnc: plugin para o protocolo VNC
  • remmina-plugin-rdp: plugin para o protocolo Remote Desktop
  • remmina-plugin-xdmcp: plugin para o protocolo XDMCP
Algumas screenshots da interface do programa:
Janela Principal

Opções de conexão do protocolo RDP

Conectado a um servidor Windows 2003


Questionário para Vaga de Suporte em Provedor


Remexendo uns emails antigos, encontrei esse questionário para uma vaga de suporte, que me foi enviado há alguns anos atrás. É interessante, porque lembro que algumas perguntas como AS, vlans e switch camada 3 eu não fazia a menor idéia do que era, e hoje já sei. Em compensação outras (como hldc e limpar estatísticas de interface, ambos em cisco) eu não sabia e continuo sem saber, :-) . De qualquer forma, achei o nível da maioria das perguntas válido para testar os conhecimentos em Linux e redes em geral. Coloco as respostas depois. (não vale colar!)


Redes

1 – Qual o seu nível de tcp/ip? Descreva alguns protocolos usados para vpn com suas portas.

2 – Você usaria tcp ou udp para uma vídeo conferência? Por quê?

3 – O que é um socket?

4 – Quais são os tipos de icmp mais utilizados além do 0 e 8? Cite 3.

5 – Quantos  hosts e subredes podem existir na máscara 255.255.248.0?

6 – Já trabalhou com redes altamente segmentadas (diversas subredes pequenas e grandes)?

7 – Qual a diferença entre rede infraestrutura e ad-hoc?

8 – O que é um AS?

9 – O que é uma bridge?

Linux

1 – Qual o seu nível de linux? Descreva os serviços e deamons que já instalou e configurou.

2 – Conhece shell scripts? Já utilizou os comandos cat, echo, grep, sed, awk, cut e etc?

3 – Sabe configurar virtual hosts no apache?

4 – Qual comando para se verificar as conexões ativas em uma máquina?

5 – Quais os comandos para se verificar as rotas de uma máquina?

6 – Está familiar com o tcpdump? Qual opção do tcpdump se usa para mostrar os pacotes de uma determinada máquina?

7 – Conhece algum software de monitoramento de tráfego de links, nms e ids (um de cada)?

8 – Qual seu nível de sql? Select, update e etc.

9 -  Que opção em uma regra do iptables especifíca conexões estabelecidas?

10 – O que deve ser configurado no /proc para que o linux faça forward de pacotes?

11 – Quais distros já administrou?


Ativos de rede (roteadores , switches e etc)

1 – Qual o seu nível de ativos de rede? Fale sobre os equipamentos que já administrou e configurou.

2 – Já utilizou vlan com switches de camada 3?

3 – É possível utilizar o protocolo ppp em um roteador cisco? E o hdlc?

4 – Qual comando mostras as estatísticas de uma interface?

5 – Qual comando limpa as estatísticas de uma interface?


Firewall Linux - iptables - Parte 3


Comandos, opções e módulos

Comandos:
Toda regra iptables tem obrigatoriamente um comando e opcionalmente um ou mais parâmetros.

Comandos (são sempre em letras maiúsculas). A maioria dos comandos exige o nome de uma chain, em outros isso é opcional, e finalmente para alguns utiliza-se apenas o comando em si.

Observação: dados entre chaves ( [xxx] ) especificam um valor opcional. Dados entre sinais de maior e menor ( <xxx> ) especificam um valor obrigatório. Acostume-se com esse padrão, pois ele é utilizado nas páginas de manual.


-A <chain>: Acrescenta uma regra ao final de uma chain.

-I <chain> [posição]: Insere uma regra em uma posição específica da chain. Caso a posição não seja informada, a regra será criada na posição 1.

-D <chain> [posição]: Deleta uma regra em uma chain. Existem duas formas de deleção: Repetindo o comando de inserção e trocando o -A/-I por -D ou deletando pelo número da regra na chain. Ex: "iptables -D INPUT 1" apaga a primeira regra da chain INPUT da tabela filter.

-L [chain]: Lista as regras. Se for informada uma chain específica, é listada apenas as regras daquela chain. Caso contrário, todas as chains são listadas. Para listar o número (ou posição) da regra dentro da chain, acrescente a opção "--line-numbers". Esse número é utilizado como referencia para as opções -I, -D e -R

-R <chain> <posição>: permite trocar uma regra com uma já existente na posição informada. Informa-se a regra atual através do nome da chain em que ela se encontra e sua posição dentro da chain (obtida com -L CHAIN --line-numbers) e a nova definição da regra.

-F <chain>: Esvazia a chain informada (apaga todas as suas regras). Caso não seja informada uma chain, todas as chains da tabela são esvaziadas.

-N <nova_chain>: Cria uma nova chain. Deve ser informado um nome que ainda não esteja em uso.

-X <nome_chain>: Apaga uma chain criada pelo usuário (com o comando -N). A chain precisa estar vazia e não ser referenciada por nenhuma regra.

-Z [chain]: Zera os contadores de pacotes e bytes de todas as chains, apenas da chain informada ou apenas de uma regra específica (informada pelo número) dentro de uma chain. Caso seja utilizado junto com -L o contador é zerado e exibido em seguida.

-P <chain> <política>: altera a política (POLICY) padrão de uma chain.

-E <nome_atual> <nome_novo>: renomeia uma chain criada com o comando -N

Opções/parametros:
Observações:
  • De um modo geral, a ordem das opções não importa. No entanto, é comum escrever os comandos no formato dos exemplos desse artigo, pois facilita a leitura e compreensão da regra.
  • Regras que não contém a opção "-j" não fazem nada com um pacote que combine com suas opções, mas contabilizam a sua passagem e podem servir para contabilidade de dados (geração de gráficos e relatórios, por exemplo).
  • As opções -i, -o, -s, -d, --dport, e --sport (e possivelmente outras, confira a página de manual!) podem ser precedidas de um sinal de exclamação (!), que inverte seu significado.
Sempre que um pacote combina com uma regra que define uma ação (opção "-j"), seu processamento é interrompido na chain atual. A excessão é a ação LOG, que faz com que o pacote seja logado nos logs do firewall (via syslog) e continua para ser processado.

-t <tabela> : Especifica em qual tabela (filter, nat ou mangle) o comando (que pode ser de criação/edição/exclusão/listagem de regras ou chains) será executado. Caso essa opção não seja informada, o comando é executado na tabela filter

Ex:

iptables -t nat -A PREROUTING ... # Cria uma regra na chain PREROUTING da tabela nat

iptables -t filter -A FORWARD ... # Cria uma regra na chain FORWARD da tabela FILTER

iptables -A FORWARD ...           # Faz a mesma coisa que a regra anterior, observe para a tabela filter o "-t filter" é opcional.

iptables -t nat -L  ...           # Visualiza as regras em todas as chains da tabela nat



-n : não resolve endereços IP para nomes, acelerando a exibição dos dados na tela. Normalmente utilizado com o comando -L.

-v : modo verboso, aumenta a exibição de detalhes. Normalmente utilizado com o comando -L.

-x : não utiliza letras (abreviações) na contagem de bytes e pacotes. Normalmente utilizado com o comando -L.

Ex:
observe a saída do seguinte comando, primeiro sem a opção -x:

root:~ # iptables -nvL FORWARD | head -1

Chain FORWARD (policy DROP 6752K packets, 407M bytes)

root:~ # iptables -nvxL FORWARD | head -1

Chain FORWARD (policy DROP 6745998 packets, 407067635 bytes)

A contagem de bytes é a mesma, mas a saída sem -x é mais fácil de visualizar. Por outro lado, utilizando-se o -x facilita a criação de scripts para contabilidade de pacotes.

-p : permite especificar o protocolo desejado. O protocolo pode ser citado pelo nome ou pelo número. Veja a relação de nomes e números de protocolos no arquivo /etc/protocols. Para criar uma regra que bata com qualquer protocolo, coloque "all".

Ex:

iptables -A FORWARD -p udp ...            # Cria uma regra utilizando o protocolo UDP na chain FORWARD da tabela filter

iptables -t nat -A PREROUTING -p tcp ...  # Cria uma regra utilizando o protocolo TCP na chain PREROUTING da tabela nat

iptables -t nat -A POSTROUTING -p all ... # Cria uma regra combinando com qualquer protocolo na chain POSTROUTING da tabela nat

Observação:


  • Ao utilizar "-p all", não se informa número de portas de origem/destino, porque nem todo protocolo utiliza o conceito de porta.
  • Procure evitar ao máximo o uso indiscriminado de "-p all", pois acaba tornando seu firewall permissivo demais. Quando você não souber quais portas/endereços precisa liberar para que determinado serviço funcione, faça uma análise do tráfego com um analisador como o tcpdump (modo texto) ou o wireshark (modo gráfico).
  • -s : permite especificar o endereço IP de origem. Se o valor for o endereço de um equipamento, basta colocar o endereço IP. Caso seja o endereço de uma rede, é necessário informar também a máscara de rede.  Para especificar uma regra que bata com qualquer valor no endereço de origem, coloque 0/0. Para especificar uma regra que não bata com determinado endereço de origem, utilize a exclamação (!).

Ex:
iptables -A FORWARD -p udp -s 192.168.1.0/255.255.255.0 # Tabela filter, chain FORWARD, protocolo UDP, toda a rede 192.168.1.0 ...

iptables -A FORWARD -p udp -s 192.168.1.0/24            # Outra maneira de escrever a regra anterior

iptables -t nat -A  PREROUTING -p tcp -s 192.168.1.213

iptables -A FORWARD -p tcp -s !192.168.5.220 ... # essa regra bate com qualquer endereço de origem, exceto o 192.168.5.220.

-d : Semelhante ao -s, porém especifica o endereço IP de destino.

Ex:

iptables -A FORWARD -p udp -d 192.168.1.0/255.255.255.0 # Tabela filter, chain FORWARD, protocolo UDP, toda a rede 192.168.1.0 ...

--sport : permite especificar a porta (tcp/udp) de origem.

Ex:

iptables -A FORWARD -p udp -d 192.168.1.0/24 --sport 25 ...

iptables -A FORWARD -p tcp -s 192.168.1.23 --sport 25 ...


--dport : permite especificar a porta (tcp/udp) de destino.

iptables -A FORWARD -p udp -d 192.168.1.0/24 --dport 25 ...

iptables -A FORWARD -p tcp -s 192.168.1.23 --dport 25 ...


-i : define a interface de rede por onde o pacote vai entrar.

Obs: só pode ser utiliza em chains relativas a entrada de pacotes na máquina, como INPUT, PREROUTING e FORWARD.

-o : define a interface de rede por onde o pacote vai sair.

Obs: só pode ser utiliza em chains relativas a saída de pacotes da máquina, como OUTPUT, POSTROUTING e FORWARD.

-j : Especifica para o TARGET (alvo) da regra, ou seja o que vai ser feito com o pacote que combine com a regra definida.

-m : permite o uso dos "match modules", que são modulos que extendem as funcionalidades do iptables. O iptables costuma já vir com um conjunto de módulos pré-instalados, e é possível instalar mais módulos, recompilando o iptables E o kernel. Abaixo uma lista com os principais módulos. Para ver quais sua distribuição possui, bem como a forma de utilização, veja a página de manual do iptables (man iptables):


  • multiport: permite criar regras que combinam com mais de uma porta de origem ou destino. Nesse caso utiliza-se --sports ou --dports, respectivamente. As portas podem ser informadas no formato lista (por exemplo "--dports 22,23,25,110", que englobaria apenas para as portas citadas) ou no formato range (faixa de portas, "--sport 1:1023", que englobaria todas as portas entre 1 e 1023)
  • mac: analisa o endereço de hardware (MAC address) de origem do pacote. Apenas pode ser utilizado em CHAINS de entrada (INPUT, FORWARDING, PREROUTING, etc).
  • state: permite classificar a conexão quanto ao estado (NEW, INVALID, RELATED, ESTABLISHED, entre outros).
  • limit: permite criar regras que trabalham baseadas em quantidade X tempo (1 por segundo, 5 por minuto, etc).
  • iprange: permite informar um range de endereços IP de origem ou destino.
  • string: procura por uma string (texto) dentro do pacote.
  • time: cria regras com base na data/hora de chegada do pacote (a regra só é valida dentro do período de tempo especificado).
  • tos: analisa o campo TOS (Type Of Service) do cabeçalho IP (normalmente utilizado para QOS).
  • addrtype: analisa pacotes segundo o tipo (UNICAST, BROADCAST, LOCAL, etc).
  • ah: combina com pacotes AH (authentication header) do IPsec.
  • esp: combina com pacotes ESP do IPsec.
  • comment: permite inserir comentários de até 256 caracteres em uma regra.
  • connlimit: permite restringir a quantidade de conexões paralelas/simultâneas a um servidor por endereço IP ou range de endereços.

Firewall Linux - iptables - Parte 2


Conceitos: Tabelas, Chains, Targets e Política Padrão.

Tabelas:
No iptables, o tratamento dos pacotes é realizado em tabelas. Cada tabela realiza basicamente um tipo operação nos pacotes, conforme vemos a seguir:

1) Tabela filter: Filtragem de pacotes (quem pode acessar o quê, e sob quais condições)
2) Tabela nat: Modificações nos endereços e/ou portas de origem e de destino dos pacotes.
3) Tabela mangle: Alterações avançadas no pacote: inserção de marcas (tags), alteração da prioridade do pacote na "fila" de envio da placa de rede, etc (não vai ser coberta aqui.)

Chains (cadeias, no sentido de correntes ou fluxos):
São contêineres para as regras. O iptables vem com um grupo padrão de chains em cada tabela, e os usuários podem criar chains adicionais, para facilitar a gerência das regras. As chains padrão são (nem todas as tabelas possuem todas as chains):

INPUT: trata os pacotes que estão entrando na máquina e não vão sair, ou seja, o destino final do pacote é a própria máquina firewall.

OUTPUT: trata dos pacotes que foram criados na própria máquina e vão sair dela.

FORWARD: trata os pacotes que atravessam a máquina (entram por uma placa de rede e saem por outra. Ex: pacotes com origem na rede local com destino à Internet ou vice-versa).

PREROUTING: trata os pacotes antes (PRE) da decisão de roteamento (ROUTING). É utilizada para alterar o DESTINO dos pacotes (DNAT) na tabela nat.

POSTROUTING: trata os pacotes após (POST) a decisão de roteamento (ROUTING). É utilizada para alterar a ORIGEM dos pacotes (SNAT) na tabela nat.

Observação: o nome das chains padrão sempre é em letras maiusculas.

Targets (ou alvos):
Define o que é feito com o pacote que combine com a regra. Alguns targets (os que fazem alterações nos pacotes) só podem ser utilizados na tabela NAT.

Observação: é possível a criação de regras sem target. Um pacote que combine com essas regras apenas incrementa a contagem de bytes e pacotes da regra (útil para contabilidade de pacotes.) Para visualizar a contagem de pacotes das

ACCEPT: Aceita os pacotes que batam com a descrição da regra

REJECT: Rejeita os pacotes que batam com a regra. É enviada uma mensagem de rejeição ao emissor do pacote.

DROP: Ignora os pacotes que batam com a regra. É semelhante ao REJECT, porém não é enviada nenhuma mensagem ao emissor.

RETURN: Cancela o processamento do pacote na chain atual e o envia de volta à chain onde estava anteriormente.

SNAT: Altera o campo de origem (source) do pacote IP, podendo alterar também a porta de origem.

DNAT: Altera o campo de destino (destination) do pacote IP, podendo alterar também a porta de destino.

REDIRECT: Faz um DNAT onde apenas a porta de destino pode ser escolhida. O endereço IP de destino sempre é o da própria máquina firewall. Utilizado para proxy tranparente.

MASQUERADE: Mascaramento de IP. Tipo especial de SNAT, utilizado principalmente para compartilhar conexões com IPs dinâmicos, como conexões dial-up (internet discada) e ADSL (Velox, por exemplo).

MARK: "Marca" o pacote com uma etiqueta, para processamento posterior (inclusive por outros programas que não o iptables). A "marca" existe apenas no próprio firewall (programas em outras máquinas não conseguem visualizar a marcação).

TCPMSS: Permite alterar o tamanho máximo do pacote, para solucionar (ou prevenir) problemas de transmissão de dados. Só pode ser utilizada com o protocolo TCP (opção -p tcp)

TOS: Permite alterar o campo TOS (Type Of Service) do cabeçalho IP.

QUEUE/NFQUEUE: Permite enviar o pacote para programas compilados com suporte a biblioteca libipq. Os programas podem manipular o pacote e devolvê-lo ao iptables.

LOG: Cria uma entrada de LOG do pacote que combina com a regra. A entrada é registrada através do SYSLOG. Após ser registrado no sistema de log, o pacote continua seguindo pela chain, para ser processado por outras regras.

ULOG: Uma mistura de QUEUE com LOG, onde o pacote é enviado para um programa para fins de LOG. Isso permite, por exemplo, logar pacotes em bancos de dados (como o MySQL) para facilitar a geração de relatórios.

Caso especial: nome de uma chain personalizada. Faz com que o pacote que bata com aquela regra seja redirecionado para uma chain personalizada (criada pelo usuário) para ser tratado pelas regras desta chain.

Policy (política padrão):
Por mais completas que sejam, suas regras de firewall nunca irão cobrir todas as possibilidades. Por isso, alteramos a POLICY (política padrão) da chain. Um pacote que atravesse toda uma CHAIN sem combinar com nenhuma REGRA é tratado pela POLICY padrão da chain. As POLICY são ACCEPT, REJECT e DROP, e têm o mesmo comportamento dos TARGETS definidos anteriormente. A POLICY padrão das CHAINS é ACCEPT (se um pacote não bater com nenhuma regra ele é aceito)  Normalmente, coloca-se a política padrão de chains como INPUT e FORWARD como DROP. Com isso, tudo o que não for explícitamente liberado será bloqueado.

Firewall Linux - iptables - Parte 1


Introdução

Historia do Firewall Linux:
Kernel 2.0 (Jan/1999): ipfwadm
Kernel 2.2 (Dez/1999): ipchains, stateless, dependia de programas externos para realizar NAT
Kernel 2.4 (Jan/2001) e
Kernel 2.6 (Dez/2003): iptables, stateful, realiza nat independente de programas externos.

Statefull X Stateless:
Uma conexão normalmente é composta de diversos pacotes. O firewall statefull associa o primeiro pacote da conexão aos demais, e consegue distinguir qual a relação desse pacote com os demais (ex: se o pacote é de uma conexão nova (NEW) ou já estabelecida (ESTABLISHED), entre outros tipos). Isso facilita as regras e checagens, além de permitir maior controle sobre operações como geração de LOGs.

Iptables ou Netfilter?
Algumas vezes vemos escrito que o firewall do Linux é o iptables. Outras vezes, que é o netfilter. Afinal, qual o correto? Na verdade, ambas as definições estão corretas:

Netfilter é a tecnologia de firewall integrada ao kernel.
Iptables é a ferramenta (programa) que configura essa tecnologia.

Outras ferramentas:
O iptables é parte de uma "família" de ferramentas que configuram diferentes protocolos de rede:
iptables: protocolo IPv4.
ip6tables: protocolo IPv6.
arptables: protocolo ARP.
ebtables: protocolo ethernet (utilizado em bridges).

Ligando equipamentos com Wake-On-Lan (WOL)

Introdução:
Wake On Lan é uma tecnologia que pemite ligar ("acordar") um ativo de rede (micros, servidores, roteadores, switches, etc) que esteja desligado, através do envio de um pacote especial chamado MagicPacket para a placa de rede do computador.

Limitações:
* Funciona apenas em redes cabeadas, ou seja, não funciona em redes wireless.
* O equipamento que será ligado e o que vai enviar o MagicPacket precisam estar no mesmo segmento de rede. MagicPackets são pacotes de broadcast e portanto não atravessam roteadores.
* Placas de rede mais antigas (MUITO antigas)podem não ter suporte à tecnologia.

Verificando o suporte:
Verificar se sua placa de rede tem suporte a WOL é fácil: em caso de placas de rede on-board, basta acessar a BIOS do computador, procurar pela opção e colocar como "Yes" ou "Enabled". Costuma ficar na parte de gerenciamento de energia (Power Management). Procure por opções como WOL, Wake On Lan, Power On By PCI devices, Power On By PCIE devices, etc. Veja as imagens abaixo.





Caso a sua bios não mostre uma dessas opções, nem tudo está perdido (a minha por exemplo não mostra, no entanto o WOL funciona perfeitamente). Entre no Linux, e utilize o comando ethtool, que verifica e configura opções nas placas de rede.

Nota: utilizo WOL em um host Xen e percebi que a interface eth0 é uma interface virtual. A interface real é a peth0 (provavelmente o "p" é de physical (física)). Se esse for o seu caso, certifique-se de informar a interface correta (peth0).

[root@debian ~]# ethtool eth0
Settings for eth0:
        Supported ports: [ TP ]
        Supported link modes:   10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Supports auto-negotiation: Yes
        Advertised link modes:  10baseT/Half 10baseT/Full
                                100baseT/Half 100baseT/Full
                                1000baseT/Full
        Advertised auto-negotiation: Yes
        Speed: 1000Mb/s
        Duplex: Full
        Port: Twisted Pair
        PHYAD: 1
        Transceiver: internal
        Auto-negotiation: on
        Supports Wake-on: g
        Wake-on: d
        Link detected: yes
A parte que nos interessa são as linhas "Supports Wake-on" e "Wake-on". "Supports Wake-on" mostra os tipos de tecnologias de WOL que a placa suporta (existem mais de uma). No caso essa placa suporta apenas o modo "g", que é justamente WOL via MagicPacket. A linha "Wake-on" mostra quais tecnologias WOL estão ativos atualmente na placa. No nosso caso, está mostrando "d", de "disabled". Ou seja, essa placa suporta WOL via MagicPacket mas atualmente a opção está desligada.

Ativando o suporte via software:
Para ativar o suporte a WOL (com MagicPacket), utilize o seguinte comando:
/sbin/ethtool -s eth0 wol g
Ao reiniciar a máquina, essa configuração é perdida. Assim é necessário acrescentar essa linha ao arquivo /etc/rc.local, para que ela seja executada a cada boot (nota: a última linha do arquivo /etc/rc.local tem de ser exit 0). Isso habilita o WOL via MagicPacket na interface selecionada (eth0) a cada boot. O problema é que durante o processo de desligamento da máquina, a interface de rede é desligada. Para evitar isso, é necessário editar o arquivo /etc/init.d/halt. Procure logo no começo do arquivo pela linha NETDOWN=yes e troque para NETDOWN=no.

Despertando
Para despertar a máquina, é necessário executar um cliente WOL em outro computador.

Linux:
instale o pacote wakeonlan (apt-get install wakeonlan)

execute o comando wakeonlan (em alguns casos o comando pode se chamar wol, mas a sintaxe é a mesma):
wakeonlan MAC-ADDRESS 
onde MAC-ADDRESS é o endereço de hardware (MAC) da máquina que se deseja ligar. Para descobrir o endereço MAC de uma interface, digite o comando ifconfig e procure por HWaddr.
Se a máquina cliente (onde o comando wakeonlan é executado) possui mais de uma interface de rede, é necessário informar o endereço de broadcast da rede à qual o micro a ser despertado pertence, com a opção -i. Nesse caso o comando ficaria:
wakeonlan -i 192.168.1.255 AA:BB:CC:11:22:33 
Supondo-se uma rede 192.168.1.0/24 e um equipamento com MAC AA:BB:CC:11:22:33.

Existe a possibilidade de informar a porta UDP a ser utilizada, com a opção -p. O padrão é 9. Minha máquina normalmente é despertada com a porta 7 (embora eu nunca tenha testado com outras), então meu comando fica assim:
wakeonlan -i 192.168.1.255 -p 7  AA:BB:CC:11:22:33
A última opção é a -f, que permite o uso de um arquivo com os endereços de diversos equipamentos a serem ligados. Útil por exemplo para ligar vários equipamentos em uma hora específica, visando algum tipo de manutenção (atualização/execução de antí-virus, por exemplo).

Existem também clientes WOL para o modo gráfico, como o GWakeOnLan (http://code.google.com/p/gwakeonlan/ ), escrito em GTK:



Roteadores com DD-WRT instalado:
Se o seu roteador possui instalada a distro DD-WRT (o meu tem, e eu recomendo), você pode cadastrar vários equipamentos na interface gráfica, e realizar o WOL a partir de lá:



Windows:
Uma busca no Google mostra que existem diversos clientes disponíveis para Windows. Infelizmente, como eu nunca utilizei nenhum, não tenho um específico para indicar. Se alguém tiver um pra sugerir, pode mandar a dica para antipragas@gmail.com, que eu atualizo o post (ou colocar nos comentários).

Uma última observação: um problema que me ocorre às vezes é quando o micro é ligado e desligado na sequência (sem que o sistema operacional seja carregado), ou quando ele é desligado sem o procedimento normal (em caso de falta de energia, por exemplo), o WOL fica indisponível até o proximo boot. Desconfio que seja devido ao fato da minha BIOS não dar suporte à tecnologia. Em casos como esse, basta ligar o equipamento normalmente (pelo botão de power) e após o shutdown/restart correto o funcionamento volta ao normal.

Criando um mirror local do debian no centos

Introdução:
É possível criar um mirror do Debian em uma equipamento rodando outras distribuições, como CentOS, RedHat e similares. Na verdade, as instruções abaixo são genéricas e em teoria servem para qualquer distribuição. Antes que alguém pergunte o porque de fazer isso eu explico: tenho um cliente que utiliza CentOS por padrão. Porém surgiu a oportunidade de utilizar alguns equipamentos da SUN. O problema é que essa arquitetura (Sparc) não é suportada pelo CentOS. Assim, fiz a instalação do Debian (que suporta a arquitetura Sparc) e resolvi criar um mirror interno para acelerar as futuras instalações/atualizações.

Instalando as dependências:
O programa debmirror é escrito em PERL. Sendo assim, precisamos instalar alguns módulos dessa linguagem para poder executar o programa. Abaixo a lista de arquivos necessários e onde localizá-los:

Arquivos/pacotes disponíveis no próprio CentOS (copiar do CD ou instalar via "yum install"):
perl-libwww-perl-5.805-1.1.1.noarch.rpm
perl-Compress-Zlib-1.42-1.fc6
perl-Digest-SHA1-2.11-1.2.1.i386.rpm
perl-Net*
rsync
bzip2
Arquivos que devem ser baixados da internet:
http://packages.sw.be/perl-Digest-MD5-M4p/perl-Digest-MD5-M4p-0.01-1.2.el5.rf.i386.rpm
http://packages.sw.be/perl-LockFile-Simple/perl-LockFile-Simple-0.206-1.el5.rf.noarch.rpm
Por fim, baixe o próprio debmirror neste endereço:
http://archive.ubuntu.com/ubuntu/pool/universe/d/debmirror/debmirror_20070123ubuntu1.tar.gz
Não coloquei aqui, mas você também precisa de um servidor web (como o apache) ou FTP (como o proftpd), para servir os arquivos aos clientes (a menos que pretenda utilizar algum outro método menos usual, como NFS).

Você pode checar a página de manual online, no seguinte endereço:
http://pwet.fr/man/linux/commandes/debmirror

com tudo instalado, basta fazer a configuração normalmente, conforme o artigo anterior:

Entendendo a saída do comando ifconfig

Vamos analisar a saída do comando ifconfig abaixo:


# ifconfig
eth0      Link encap 10Mbps Ethernet  HWaddr 00:00:C0:90:B3:42
          inet addr 172.16.1.2 Bcast 172.16.1.255 Mask 255.255.255.0
          UP BROADCAST RUNNING  MTU 1500  Metric 0
          RX packets 3136 errors 217 dropped 7 overrun 26
          TX packets 1752 errors 25 dropped 0 overrun 0

ppp0      Link encap:Point-to-Point Protocol
          inet addr:187.15.72.157  P-t-P:200.200.200.200  Mask:255.255.255.255
          UP POINTOPOINT RUNNING MULTICAST  MTU:1400  Metric:1
          RX packets:1504239 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1155539 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:1905349557 (1.7 GiB)  TX bytes:81721536 (77.9 MiB)

imq0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
          UP RUNNING NOARP  MTU:1500  Metric:1
          RX packets:2647959 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2647730 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:30
          RX bytes:1987468198 (1.8 GiB)  TX bytes:1987198741 (1.8 GiB)
Descrição dos campos:
Link encap: Tipo de conexão do link (ethernet, ponto-a-ponto, etc)
HWAddr: Endereço de hardware (MAC Address) da interface. Nem todas as interfaces possuem. Nesse caso, pode aparecer como 00-00-00- ... ou simplesmente não aparecer.
UP BROADCAST RUNNING  MTU 1500  Metric 0: Indica as características da interface de rede:
  • UP/RUNNING: indica que a inteface está ativa.
  • BROADCAST/MULTICAST: indica que a interface suporta esta modalidade de tráfego (broadcast / unicast)
  • MTU: Quantidade máxima de bytes que a interface pode transmitir/receber a cada operação.
  • Metric: Não é utilizado.
  • NOARP: Indica que a interface não suporta operações com endereços de hardware (MAC)
inet addr: endereço IPv4 da interface (não é orbigatório).
inet6 addr: endereço IPv6 da interface (não é orbigatório).
P-t-P: Indica o endereço da "outra ponta" da conexão (apenas para conexões ponto-a-ponto).
Bcast: Endereço de Broadcast da interface (apenas se houver um endereço IPv4 configurado).
Mask: Máscara de rede  da interface (apenas se houver um endereço IPv4 configurado).
RX e TX: Contabiliza os pacotes recebidos (RX) e enviados (TX), bem como os descartados por motivos diversos na transmissão e recepção.
errors: pacotes que não puderam ser transmitidos/recebidos devido a erros (nos próprios pacotes).
dropped: normalmente indica erros de configuração/comunicação. Ex: um equpamento está operando em half-duplex, enquanto o outro está em full-duplex.
overruns: a interface possui duas filas (ou buffers), uma de transmisão e outra de recepção, com um determinado tamanho. Quando essa fila "enche", os pacotes excedentes são descartados como overruns. Em suma: a interface de rede está tentando receber/transmitir mais pacotes/segundo do que o sistema como um todo (interfaces de rede, processador, etc) suporta.
frame: quadros (frames) mal formados.
carrier: erro no link físico. Má fiação, cabos de rede e energia juntos, etc.
collisions: Colisões de rede. Comuns em ambientes com HUBS. Não deveriam ocorrer em ambientes com switches. Se for o caso, cheque a configuração dos equipamentos no tocante ao modo DUPLEX (HALF/FULL) utilizado.
txqueuelen: tamanho da fila (buffer) de transmissão. Normalmente não é necessário alterar o valor padrão.
RX bytes / TX bytes: quantidade de bytes recebidos / transmitidos. (medido em Mebibytes/Gibibytes - http://en.wikipedia.org/wiki/Mebibyte)

Derrubando Conexões já estabelecidas no Squid

O Problema:
Imagine a seguinte situação: você detecta (via sqstat, por exemplo) uma conexão a um site que deveria ser proibido, mas ainda não consta nas suas listas de bloqueio. Assim, você faz insere o site na lista e efetua o reload do squid (normalmente com "/etc/init.d/squid reload" OU "squid -k reconfigure"). As novas conexões são bloqueadas, mas as já existentes permanecem. Dar um restart implicaria em um downtime (ainda que apenas de 1 minuto) na rede toda.

A Solução: Bloquear via negação de rota

1) Descobrir o endereço IP do host de destino:

ping mediafarm02.cdn.embratel.net.br
PING mediafarm02.cdn.embratel.net.br (200.214.220.66) 56(84) bytes of data.
64 bytes from 200.214.220.66: icmp_seq=1 ttl=246 time=2.10 ms

2) Rejeitar a rota para o host desejado.
route add -host 200.214.220.66 reject

3) Checando com o comando route. Perceba que não há indicação de roteador nem interface para o destino selecionado, e que há um sinal de exclamação mostrando que a rota foi rejeitada.


Alguns segundos após a criação da rota, a conexão dá timeout e é finalizada. Posteriormente, essa rota pode ser removida, pois novas conexões serão tratadas diretamente pelo squid.

Bloqueando Programas de Bate-Papo: Google Talk

Bloqueando Programas de Bate-Papo: Google Talk
Para bloquear o acesso aos seus programas de bate-papo, o google disponibiliza algumas URLs a serem bloqueadas papExistem duas versões do Google Talk: a versão aplicativo de desktop (que precisa ser instalada), e a versão web (disponível no Orkut, iGoogle e Gmail)


Gadget Web (dentro do GMail)
Basta bloquear as seguintes URLs:
chatenabled.mail.google.com
mail.google.com/mail/channel/bind
Obs: O bloqueio deste endereço não interfere no funcionamento normal do Gmail.


Gadget Web (Orkut e iGoogle)
Nesse caso, bloqueie a seguinte URL:
talkgadget.google.com/talkgadget/popout?hl=pt-BR
Programa Google Talk
Para o programa de desktop as URLs são as seguintes:
talk.google.comtalkx.l.google.com
Referência:
http://www.google.com/support/chat/bin/answer.py?hl=pt-BR&answer=161980

Configurando o squid e iptables para proxy transparente


Introdução:
Proxy transparente é uma forma de se implementar um proxy em uma rede sem que haja a necessidade de configurá-lo nos aplicativos clientes. Na verdade, na maioria das vezes o cliente nem se dá conta de que há um proxy na rede, a menos que haja algum controle limitando acesso. Embora alguns (a maoiria?) dos profissionais não goste do proxy transparente (e eu me incluo nessa turma), algumas vezes é um mal necessário.

Funcionamento:
No modo normal de proxy, os equipamentos são configurados explicitamente para enviar os dados para o proxy. No proxy transparente, os equipamentos não sabem da existência do proxy. Assim, eles enviam os dados para o gateway da rede, que intercepta os dados e os envia para o proxy.

Observação:
Devido ao fato do cliente não saber da presença do proxy, não é possível utilizar autenticação no squid com proxy transparente (o cliente não tem como enviar os dados para um equipamento que ele não sabe que está lá ...). Existem porém outras alternativas como o NoCat.net/ .

Habilitando:
São necessárias duas configurações: habilitar o squid para trabalhar em modo transparente e realizar o desvio dos dados no firewall/gateway (aqui veremos a configuração do iptables). 

Configurando o squid:
Existem duas formas de realizar a configuração, dependendo da sua versão do squid. Todas as configurações são realizadas no arquivo de configuração do squid (normalmente em /etc/squid/squid.conf)

Versão 2.6 (e anteriores):
http_port 3128
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
Versão 2.7 em diante:

http_port 3128 transparent # (beeem mais simples, não é?)

Configurando o IP Tables (independente da versão do squid):

Considerações:
O endereço IP do servidor com o squid é 10.10.14.2, o squid está rodando na porta 3128 e a interface de rede do firewall conectada à rede local é a eth0.

1) Se o squid ficar na mesma máquina que o FW (não recomendável por questões de segurança)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
2) Se o squid ficar em uma máquina diferente (recomendado)
iptables -t nat -A PREROUTING -i eth0 -p tcp -s !10.10.14.2 --dport 80 -j DNAT --to-destination 10.10.14.2:3128

Bloqueando Programas de Bate-Papo: MSN / Windows Live Messenger

Bloqueando Programas de Bate-Papo: MSN / Windows Live Messenger


Portas:
Por padrão, o WLM utiliza a porta 1863. No entanto, se essa porta estiver bloqueada, ele desvia o tráfego para as portas 80 e 443 (utilizadas para navegação Web).

Detecção de Rede: TCP 7001, UDP 9, 7001
WhiteBoard (Quadro Branco):  TCP 1503

URLs:
https://Login.live.com
http://Login.live.com
https://*.contacts.msn.com
https://*.storage.msn.com
http://*.storage.msn.com
http://c.msn.com
http://*.messenger.msn.com
http://g.msn.com
http://crl.microsoft.com
http://messenger.hotmail.com:1863
http://gateway.messenger.hotmail.com
http://config.messenger.msn.com
https://ows.messenger.msn.com
https://rsi.hotmail.com
http://sqm.microsoft.com
http://*.edge.messenger.live.com
http://relay.data.edge.messenger.live.com
http://rad.msn.com
http://appdirectory.messenger.msn.com
https://images.messenger.msn.com
http://spaces.live.com
http://relay.voice.messenger.msn.com
http://sup.live.com
http://sup.live.com/whatsnew/whatsnewservice.asmx
http://vp.sip.messenger.msn.com

Referência:
http://support.microsoft.com/kb/960820/en-us
http://support.microsoft.com/kb/927847/en-us
http://support.microsoft.com/kb/2027572/en-us

Problemas relacionados a servidores NTP

Estes são alguns problemas que encontrei em servidores NTP que administro e que resolvi (após bater cabeça por um tempinho ...). Ficam aqui as soluções para quem precisar:

Erro:
sendto(200.160.0.8): Bad file descriptor

Sintomas:
Aparecem linhas como as abaixo no seu log de sistema (geralmente no arquivo /var/log/messages ou /var/log/syslog):

Jul 14 10:21:39 server ntpd[29169]: bind() fd 4, family 2, port 123, addr 0.0.0.0, in_classd=0 flags=8 fails: Address already in use
Jul 14 10:21:39 server ntpd[29169]: bind() fd 4, family 10, port 123, addr ::, in6_is_addr_multicast=0 flags=0 fails: Address already in use
Jul 14 10:21:39 server ntpd[29169]: bind() fd 4, family 2, port 123, addr 127.0.0.1, in_classd=0 flags=0 fails: Address already in use
Jul 14 10:21:39 server ntpd[29169]: bind() fd 4, family 2, port 123, addr 172.20.32.6, in_classd=0 flags=8 fails: Address already in use
Jul 14 10:21:40 server ntpd[29169]: sendto(200.160.0.8): Bad file descriptor
Jul 14 10:21:41 server ntpd[29169]: sendto(200.189.40.8): Bad file descriptor
Jul 14 10:32:55 server ntpd[29368]: sendto(200.160.0.8): Bad file descriptor
Jul 14 10:32:57 server ntpd[29368]: sendto(200.192.232.8): Bad file descriptor
Jul 14 10:32:57 server ntpd[29368]: sendto(200.160.0.8): Bad file descriptor
Jul 14 10:32:59 server ntpd[29368]: sendto(200.192.232.8): Bad file descriptor
Jul 14 10:32:59 server ntpd[29368]: sendto(200.189.40.8): Bad file descriptor


Onde server é o nome do seu servidor e os IPs entre parênteses são os IPs dos servidores públicos configurados nos arquivos de configuração (os IPs acima são do projeto brasileiro NTP.br, que disponibiliza servidores atualizados pelo Relógio Atômico do Observatório Nacional - http://www.on.br - , que por sua vez é o responsável pela Hora Legal Brasileira).

Causa:
Existe mais de um processo do servidor NTP (ntpd) rodando na máquina.

Solução:
Pare o serviço do NTP. Em distribuições da família Debian (Ubuntu, Kurumin, Knoppix, etc) e da família Red Hat (Fedora, Mandriva, CentOS, etc) normalmente isso é realizado com /etc/init.d/ntp stop. Em outras distribuições (SlackWare, Gentoo, ?) o processo pode ser diferente, mas não muito. Após parar o serviço, execute um killall ntpd para matar quaisquer processos que possam ter restado e inicie novamente o serviço NTP com /etc/init.d/ntp start (ou comando equivalente em sua distribuição) e o problema deve estar resolvido. Obs: todos os comandos acima necessitam de permissões de root para serem executados.

Dica:
Observe a seguinte linha, retirada do trecho de log acima:

Jul 14 10:21:39 server ntpd[29169]: bind() fd 4, family 2, port 123, addr 0.0.0.0, in_classd=0 flags=8 fails: Address already in use

Em programas com suporte a rede (geralmente programas servidores), bind() é o ato de associar um programa ou processo a uma determinada porta de rede. Observe que o próprio programa já mostra o erro que está ocorrendo: Address already in use, ou seja, o endereço já está em uso por outro processo. Esse tipo de erro é um tanto comum e a mensagem costuma vir parecida com essas, facilitando assim encontrar a solução.


Erro:
O serviço exibe uma mensagem de erro ao iniciar, sobe mas não sincroniza a hora com os servidores externos.

Sintomas:

Aparecem linhas como as abaixo no seu log de sistema (geralmente no arquivo /var/log/messages ou /var/log/syslog):
Jul 14 10:38:11 server ntpdate[30521]: no server suitable for synchronization found
Jul 14 10:38:11 server ntpd:  failed
Jul 14 10:38:11 server ntpd[30525]: ntpd 4.2.0a@1.1190-r Sat May  5 12:55:34 EDT 2007 (1)
Jul 14 10:38:11 server ntpd: ntpd startup succeeded
Jul 14 10:38:18 server ntpd[30525]: kernel time sync disabled 0041
Jul 14 10:38:28 server ntpd[30525]: kernel time sync enabled 0001

Causa:
Servidores inválidos ou inexistentes referenciados nos arquivos de configuração /etc/ntp/ntpservers /etc/ntp/step-tickers).

Solução:
Haviam servidores NTP internos que já haviam sido removidos da rede, mas continuavam configurados nos arquivos citados acima. Com isso, mesmo com os servidores do projeto NTP.br no arquivo de configuração principal, o serviço falhava e não se recuperava. Após remover os IPs dos servidores, o serviço passou a funcionar como um relógio ;-)

Sites para teste de velocidade de conexão

Seguem alguns sites para realizar testes para saber a velocidade de sua conexão com a Internet. Tenha sempre em mente que os resultados podem ser influenciados por uma série de fatores, por isso é sempre recomendável repetir o teste em diferentes dias da semana e em diferentes horários (manhã, noite, madrugada, etc). Também é necessário parar ou fechar todos os programas que recebem ou enviam dados da Internet (exceto o navegador que vai realizar o teste), para que não interfiram no resultado do teste.

Velocímetro RJNET:




Um dos mais antigos que conheço, e velho conhecido das pessoas aqui do Rio de Janeiro, é disponibilizado gratuitamente mesmo a quem não é cliente da RJNET, um provedor de Internet carioca. Uma grande vantagem dele é não fazer uso de nenhuma tecnologia adicional (como Flash ou Java), apenas HTML Uma desvantagem é que ele testa apenas a velocidade de download, não realizando testes de upload. Outro problema é que, devido ao congestionamento de links, pessoas afastadas do RJ podem ter resultados diferentes da realidade.

SpeedTeste.net






Uma página com um teste muito interessante: ela identifica o local de origem de sua conexão (ou ao menos tenta: no meu caso, estou no Rio de Janeiro e ele me sugere o servidor de Rondonópolis) e sugere uma lista de servidores próximos para você escolher em qual você deseja realizar o teste. Os servidores são exibidos em um mapa, bastando clicar no servidor desejado para que o teste seja iniciado. O site exige Flash (que está presente na maioria dos navegadores atuais) e realiza testes de download e upload. Ao final do teste, são exibidas as seguintes informações sobre o teste:
Velocidades de download e upload, qual o seu Provedor de Internet (e a classificação que os usuários do site dão a ele), a localização/nome do servidor escolhido para o teste e a distância presumida entre você e o servidor de teste, em milhas (1 milha = 1,6 quilômetros), além de dois botões Copy Forum Link e Copy Direct Link, que geram e copiam para a área de transferência um link para uma imagem semelhante a essa abaixo, que contém os resultados do teste.

Liberar Windows Update via Proxy

Estes são os domínios que devem ser liberados no proxy para que as máquinas com Windows possam realizar o WindowsUpdate:
microsoft.com
windowsupdate.com
download.microsoft.com
download.windowsupdate.com
update.microsoft.com
Encontrou algum erro? Falta alguma coisa? Deixe um comententário!

Como descobrir os processos associados as portas no Linux


Obs: Esse artigo é sobre ferramentas de rede Linux. Caso precise de uma ferramenta para windows, veja esse artigo sobre o TCPView . 
Existem diversas formas simples de descobrir qual processo está escutando em determinada porta no Linux. Este artigo trata de duas dessas ferramentas: o fuser e o lsof

fuser:
O fuser serve para indicar o usuário e o processo que estão acessando determinado arquivo/diretório. Para descobrir qual processo está associado a uma porta TCP/UDP (e o nome do usuário dono do processo) basta executar:
fuser -n protocolo porta
Por exemplo: em uma máquina Linux típica, ao se executar o comando
debian:~# fuser -vn tcp 22
obteremos como resposta
                     USER        PID   ACCESS COMMAND
22/tcp:            root         2694   F....          sshd
que mostra que o processo sshd, de propriedade do usuário root e com o PID 2694, está conectado à porta 22.

lsof:
o lsof tem uma funcionalidade semalhante à do fuser: ele serve para indicar quais arquivos/diretórios estão abertos (sendo acessados) e por quem. Para exibir processos associados a portas TCP/UDP execute:
lsof -i [PROTOCOLO]:porta
Utilizando um exemplo semelhante ao anterior, executando o comando
debian:~# lsof -i TCP:22
O resultado seria similar a esse:
COMMAND PID     USER   FD   TYPE   DEVICE SIZE NODE NAME
sshd                2694     root     3u     IPv6     6348                TCP     *:ssh (LISTEN)
As mesmas informações (nome do processo, PID e usuário dono) são exibidas aqui, entre outras.

O lsof possui ainda algumas vantagens em relação ao fuser:


O protocolo pode ser omitido
Nesse caso, os parâmetros ficariam assim
debian:~# lsof -i :22
Seriam exibidas as conexões para ambos os protocolos (TCP e UDP), caso houvessem.

Riqueza de detalhes: o lsof exibe mais informações que o fuser, como a versão do protocolo IP utilizada (IPv4 ou IPv6), em quais endereços IP/hostnames a porta está sendo utilizada e o estado atual da conexão(LISTENESTABLISHED, SYN_SENT, etc). Caso o processo escute em todos os endereços disponíveis, é exibido um * (como em *:ssh). Se o processo utilizar apenas um endereço IP, seria exibido esse endereço seguido da porta (por exemplo 192.168.1.100:ssh).

Dnsmasq - Um servidor DHCP/DNS para pequenas e médias redes

Em algumas situações o uso dos servidores DNS e DHCP "tradicionais" (ISC DHCP Server e Bind, respectivamente) pode não ser o ideal, seja por falta de recursos (memória e processamento), espaço em disco ou até mesmo pela relativa complexidade de configuração. Em situações como essas, eu costumo utilizar o dnsmasq.

O dnsmasq é um servidor DHCP com um forwarder DNS integrado, ou seja, ele apenas encaminha as consultas DNS para outro servidor, e efetua um cache do resultado para acelerar futuras consultas. Embora essa característica não vá ser abordada aqui, vale ressaltar que o dnsmasq também suporta o protocolo TFTP, podendo atuar por exemplo como servidor TFTP para redes LTSP ou para a atualização e boot de equipamentos que suportem esse protocolo.


Características Principais:
  • Servidor DHCP que opera no modo dinâmico e também no modo estático (IP "amarrado" a um endereço MAC)
  • O servidor DNS faz a leitura do arquivo /etc/hosts da máquina. Caso você utilize essa feature na sua rede, basta manter o arquivo do servidor (não é necessário criar e manter um arquivo para cada máquina da rede).
  • Faz o registro das máquinas do DHCP no DNS automaticamente. Com isso, quando você executa um ping no hostname de uma máquina, recebe de volta seu endereço IP. Quando se utiliza a dupla ISC + Bind isso precisa ser configurado à parte.
  • O servidor DNS faz cache das resoluções de nome, permitindo um aumento de performance, além de diminuir a carga nos servidores DNS externos.
  • Os servidores externos a serem utilizados são lidos à partir do /etc/resolv.conf ou outro arquivo à sua escolha.
  • É possível a criação de registros MX e SRV (se você não sabe o que são esses registros, então não se preocupe, pois você não precisa deles ...).
  • Suporta o protocolo IPv6.
  • Suporta o protocolo TFTP, podendo ser utilizado para efetuar boot via rede em equipamentos diskless, como thinclients.
Instalação:
A instalação pode ser feita através do código fonte (disponível no site do dnsmasq ), através de pacotes RPM (também disponíveis no site ). Em sistemas Debian (e provavelmente em seus derivados) basta utilizar o APT:
aptitude install dnsmasq
Que irá instalar o pacote junto com todas as suas dependências.

Configuração:
Após a instalação, e com o serviço ativo, vamos à configuração. Surpresa !!! Inicialmente, não é necessária nenhuma configuração (supondo-se que as configurações de rede da sua máquina - incluindo a parte de servidores DNS - esteja correta). No entanto, existem algumas opções que são interessantes, pois permitem melhorar a performance e a segurança da instalação. Vamos à elas então:
  • domain-needed: não encaminha requisições DNS que não contenham um domínio. Essas requisições normalmente são referentes à rede local e devem ser tratadas pelo servidor de DNS local.
  • bogus-priv: não encaminha requisições de endereços não-roteáveis.
  • filterwin2k: filtra algumas requisições inúteis geradas por máquinas com Windows 2000/XP. Obs: não ative essa opção caso você utilize Kerberos, SIP, XMMP or Google-talk.
  • resolv-file=: permite indicar um arquivo de onde o dnsmasq vai ler os endereços dos servidores DNS a serem utilizados. Se essa opção não for utilizada, os endereços são obtidos através do /etc/resolv.conf
  • local=: permite definir qual o seu domínio local. Consultas a esse domínio serão respondidas utilizando-se o arquivo de hosts (/etc/hosts) e o DHCP.
  • address=: permite forçar um IP para determinado destino. Por exemplo, a linha "address=/orkut.com/127.0.0.1" impede a navegação no orkut, pois aponta o domínio http://orkut.com para 127.0.0.1 (localhost).
Estas são apenas algumas opções básicas. Para uma lista mais completa, verifique a documentação do projeto em http://thekelleys.org.uk/dnsmasq/docs. Lá você confere o manual e um arquivo de configuração de exemplo.

Dica: como descobrir via shell com que IP a máquina está saindo para a internet?

Algumas vezes uma máquina está conectada a internet indiretamente, através de um firewall ou de um proxy com múltiplos links de internet. Os comandos abaixo permitem descobrir qual IP a máquina está utilizando na internet. Os três meios abaixo utilizam programas simples, que estão disponíveis na maioria das distribuições (e até mesmo em algumas instalações Unix) e que normalmente são instalados por padrão.

Utilizando o wget (todo o comando deve ficar em uma única linha):
echo $(wget -qO- http://www.whatismyip.com/automation/n09230945.asp)
Utilizando o lynx:
lynx -dump http://www.whatismyip.com/automation/n09230945.asp|grep -v ^$
Utilizando o links2:
links2 -dump http://www.whatismyip.com/automation/n09230945.asp
Bônus: Pegando o IP de uma interface de rede específica:
(LANG=C;ifconfig eth0|grep "inet addr"|cut -f2 -d:|cut -f1 -d" ")
Obviamente, para pegar o endereço de uma interface diferente basta colocar o nome dessa interface no lugar de eth0
É interessante que o comando seja colocado entre parênteses, para não modificar o valor da variável de ambiente LANG da sua sessão de shell atual (que controla o idioma em que os aplicativos são exibidos).

Gerando um inventário da rede com o PsInfo - SysInternals

O PsInfo é um utilitário fornecido gratuitamente pela Microsoft. Sua função é exibir informações sobre a instalação do Windows, no micro local e também em máquinas da rede.

Baixando e instalando:
O PsInfo é fornecido no PsTools, juntamente com mais 11 aplicativos. O pacote pode ser baixado em http://technet.microsoft.com/en-us/sysinternals/bb896649.aspx . Após o download, basta extrair os arquivos em uma pasta que esteja no PATH, como por exemplo a pasta de instalação do Windows (normalmente c:\windows).

Utilizando:
Basta executar um Prompt de Comando e executar o programa com os parâmetros desejados. Para ver a lista de parâmetros disponíveis, digite:
c:\>psinfo /?

Usage: psinfo [-h] [-s] [-d] [-c [-t delimiter]] [filter] [\\computer[,computer[,..]]|@file [-u Username [-p Password]]]
Breve descrição das opções:
-u: Informa o nome de usuário a ser utilizado para login no computador remoto (opcional)
-p: Informa a senha para o nome de usuário informado.
-h: mostra os hotfixes (atualizações) instalados.
-s: mostra o software instalado
-d: mostra informações sobre os volumes e discos.
-c: exibe a saída no formato CSV (valores separados por vírgula). Útil para gerar uma planilha a ser  importada para o Excel.
-t: Permite alterar o caracter separador de campos ao exportar para CSV.
filter: permite filtrar quais campos serão exibidos
computer: Nome do computador de onde as informações devem ser obtidas. Se o nome não for informado, serão obtidas as informações do computador local. Para obter as informações de todo o domínio, utilize \\*.
@file: Para obter as informações de computadores específicos, crie um arquivo de texto e coloque o nome de cada computador em uma linha. Por exemplo, crie um arquivo chamado micros.txt e coloque os nomes das máquinas desejadas (micro01, micro02, micro03) um em cada linha.

Exemplos de Uso:
1) Exibir informações do computador local:
c:\>psinfo

PsInfo v1.75 - Local and remote system information viewer
Copyright (C) 2001-2007 Mark Russinovich
Sysinternals - www.sysinternals.com

System information for \\hostname:
Uptime:                    Error reading uptime
Kernel version:            Microsoft Windows XP, Uniprocessor Free
Product type:              Professional
Product version:           5.1
Service pack:              3
Kernel build number:       2600
Registered organization:
Registered owner:          XXX
Install date:              2/4/2009, 22:20:35
Activation status:         Error reading status
IE version:                6.0000
System root:               C:\WINDOWS
Processors:                1
Processor speed:           2.3 GHz
Processor type:            Intel(R) Celeron(R) CPU
Physical memory:           1022 MB
Video driver:              Intel(R) 82865G Graphics Controller

2) Exibir hotfixes informações do computador Micro04:
c:\>psinfo -h \\Micro04
3) Criar planilha com os dados dos computadores Micro01, Micro02 e Micro03:
Crie um arquivo de texto com os nomes dos computadores, um por linha:
Micro01
Micro02
Micro03
No nosso exemplo esse arquivo se chamará "micros.txt". Agora execute o seguinte comando:
c:\>psinfo -c -t ; @micros.txt >> planilha.csv
E está pronto!!! Agora o arquivo já pode ser aberto no Excel (ou outro programa de Planilha Eletrônica, como o Calc do OpenOffice). Um detalhe importante é que o psinfo não gera o nome das colunas. Caso você deseje o nome das colunas, você pode copiar a primeira linha deste arquivo http://docs.google.com/Doc?docid=dcskhq47_61wcdhcscp&hl=en e colar no início do arquivo planilha.csv.

O resultado final fica parecido com isso: