Exibindo o estado das conexões TCP no Linux

Em um post anterior apresentei um comando que exibia apenas o número de conexões ativas em um servidor/desktop Linux. Dessa vez apresento um comando que exibi o estado de todas as conexões:

$ netstat -a -n| sed '/^tcp/!d'|cut -c 68-|sort|uniq -c|sort -n

1 SYN_RECV
3 CLOSING
7 FIN_WAIT1
8 SYN_SENT
17 LISTEN
18 CLOSE_WAIT
18 FIN_WAIT2
656 TIME_WAIT
688 ESTABLISHED

No exemplo acima são exibidas as conexões de um servidor de e-mail.

Descobrindo qual ftp é o mais rápido

Imagine que você precisa baixar um arquivo e ao verificar descobre que existem vários mirrors que disponibilizam o mesmo arquivo. Por alguns segundos, você para e pensa “e agora? qual eu escolho?” Bem, de duas uma: ou vai no chute escolhendo qualquer um, ou começa a baixar e se verificar que está muito lento desiste e começa em outro mirror.

Pois bem, como diria o seu Creisson: Seus problemas acabaram! O comando netselect, efetua alguns testes de desempenho em endereços ftp passados como parâmetro.

# netselect -vv ftp.debian.org ftp.br.debian.org
Running netselect to choose 1 out of 2 addresses.
............
ftp.debian.org 177 ms 19 hops 90% ok ( 9/10) [ 568]
ftp.br.debian.org 9999 ms 30 hops 0% ok
568 ftp.debian.org

Existe também outro comando (para quem utiliza ubuntu/debian) que cria um arquivo sources.list (endereço dos repositórios para instalação/atualização de pacotes) baseando-se nos mirrors do próprio apt: netselect-apt

# netselect-apt
Using distribution stable.
Retrieving the list of mirrors from www.debian.org...
--22:06:36-- http://www.debian.org/mirror/mirrors_full
=> `mirrors_full'
Resolving www.debian.org... 194.109.137.218
Connecting to www.debian.org[194.109.137.218]:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 165,115 [text/html]
100%[==========================================>] 165,115 65.38K/s
22:06:40 (65.27 KB/s) - `mirrors_full' saved [165115/165115]
>Choosing a main Debian mirror using netselect.
netselect: unknown host debian.mirror.cygnal.ca
netselect: unknown host cdn.mirror.garr.it
netselect: unknown host debian.marked.no
netselect: unknown host mirrors.terrabox.com
Running netselect to choose 1 out of 297 addresses.
................................................
The fastest server seems to be:

http://mirror.eftel.com/debian/

Choosing a non-US Debian mirror using netselect.
netselect: unknown host debian.mirror.cygnal.ca
netselect: unknown host cdn.mirror.garr.it
Running netselect to choose 1 out of 212 addresses.
................................................
The fastest non-US server seems to be:

http://linux.iq.usp.br/debian-non-US/

Writing sources.list.
Done.
#


Technorati : , , ,

Dig, consultando DNS

Para quem não conhece, o Dig (Domain Information Groper) é um utilitário para consultas a DNS. Ele é normalmente utilizado para identificar problemas de DNS por ser uma ferramenta flexivel, fácil de utilizar e permitir um retorno das pesquisas de fácil compreensão.

o comando básico é:

# dig @servidor nome tipo

onde:

  • servidor: é o endereço IP ou nome do servidor smtp que será consultado;
  • nome: é o nome domínio que estamos consultando;
  • tipo: é o tipo de consulta. Pode ser MX (serviço de e-mail), A (endereço), ANY (todas as informações), etc. Se não preenchido o tipo padrão é A.

Existem várias opções de consulta, a que acho mais interessante é a +trace. Quando ela é utilizada, a saída apresenta todas as respostas desde os rootservers, incluindo qual deles respondeu. Um exemplo:

# dig @dns1.univali.br www.inf.ufsc.br A +trace

Qualquer outra informação: man dig ;)

SSH sem senha para acesso remoto (utilizando chave pub/priv)

?? possível que você efetue o acesso entre seus servidores sem fornecer senhas. Existem duas maneiras de realizar isso, uma é utilizando Kerberos e criando uma rede Single Sign-On e a outra é utilizando chaves pública/privada nos servidores. Neste post abordo a segunda solução, e quem sabe num futuro não muito distante eu descreva a segunda :)

Na maquina cliente (a maquina de onde partirá o acesso a um servidor sem pedir pela senha) crie um par de chaves publica/privada com o comando:

neto@servidorcliente# ssh-keygen -b 4096 -t rsa

onde:

  • -b informa o tamanho da chave em bits (1024, 2048, 4096)
  • -t informa o tipo da chave (RSA/DSA)

após gerar a chave, é solicitado o diretório onde será armazenado a chave (/home/neto/.ssh/id.rsa) aceite o padrão. Em seguida será solicitado a senha e a confirmação da senha. Como a intenção é logar sem auntenticação, deixe essa senha em branco.

Copie o conteúdo do arquivo /home/neto/.ssh/id.rsa.pub do servidor cliente para o arquivo /home/neto/.ssh/authorized_keys no sevidor, utilize os comandos:

# cd /home/neto/.ssh
# scp id_rsa.pub neto@servidor:id_rsa-cliente
# ssh neto@servidor
# cat id_rsa-cliente >> .ssh/authorized_keys

Agora você poderá efetuar logoff e ao logar novamente com o usuário, a senha não será mais solicitada.

Caso queira utilizar o usuário root, não esqueça de liberar no arquivo /etc/ssh/sshd_config o acesso via ssh (PermitRootLogin yes)

Trunk de portas ethernet no Linux

Com o bonding é possivel transformar duas portas ethernet 100Mbits em uma porta (bond0) de 200Mbits no Linux. Essa mesma tecnologia é chamada de smarttrunk pela Enterays e Link aggregation pela Cisco. Pode-se utilizar o bonding em várias situações como por exemplo a Alta Disponibilidade (link entre as duas máquinas). As configurações apresentadas abaixo, foram testadas em um RedHat Enterprise 2.1, mas também são passados as linhas de comando para ser configurada em qualquer distribuição.

<update>
Foi publicado um artigo na Howto Forge que ensina a configurar o bonding no Debian.
</update>

<update2>
Esta técnica também é conhecida por Link Aggregation e é definida pela IEEE 802.3ad.
</update2>

O Kernel deverá ter suporte ao Bonding (Network device support -> Bonding driver support na compilação)

No /etc/modules.conf insira as linhas:
Alias bond0 bonding
probeall bond0 eth0 eth1 bonding # para carregar os módulos das outras eth antes de montar o bond
options bond0 miimon=100 updelay=200 downdelay=200

No /etc/sysconfig/network-scripts/ifcfg-bond0 insira:
DEVICE=bond0
IPADDR=192.168.1.1
NETMASK=255.255.255.0
NETWORK=192.168.1.0
BROADCAST=192.168.1.255
ONBOOT=yes
BOOTPROTO=none
USERCTL=no

Todas as interfaces que pretencerão ao balanceamento deverão ter seu /etc/sysconfig/network-scripts/ifcfg-ethX definidos assim:
DEVICE=eth0
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=no
BOOTPROTO=none

Deve-se indicar qual interface será escrava (SLAVE=yes) nesse caso a interface eth0 sera master e a eth1 devera ser slave.

Caso a distribuição não suporte o parametro SLAVE e MASTER no ifcfg-ethx, a configuração manual pode ser configurada desta maneira:

Sem inserção de módulos:
# /sbin/ifconfig bond0 192.168.1.1 up
# /sbin/ifenslave bond0 eth0
# /sbin/ifenslave bond0 eth1

Com inserção de módulos:
# /sbin/insmod bonding
# /sbin/ifconfig bond0 up
# /sbin/ifenslave bond0 eth0
# /sbin/ifenslave bond0 eth1
# /sbin/modprobe bonding miimon=100 updelay=200 downdelay=200
# /sbin/ifconfig bond0 192.168.1.1 netmask 255.255.255.0
# /sbin/ifconfig bond0 up
# /sbin/route add default gw 192.168.1.254

Opções do módulo

  • mode= Possiveis valores são: 0 (politica de round-robing, default) , 1 (Politica de backup ativo), e 2 (XOR);
  • miimon= Utilize um valor inteiro para a frequência (em ms) do monitoramento de link MII. Valor igual a zero (padrão) significa que o monitoramento do link será desabilitado. Um bom valor caso você queira utilizar o monitoramento é 100;
  • downdelay= Utilize um valor inteiro para definir o tempo de atraso para desabilitado o link após ser detectada uma falha (em ms) . Deve ser multiplo de miimon, sendo o valor padrão zero;
  • updelay= Utilize um valor inteiro para definir o tempo de atraso para habilitar o link após ser detectado o estado de “link up” (em ms) . Deve ser multiplo de miimon, sendo o valor padrão zero;
  • arp_interval= Utilize um valor inteiro para a frequência do monitoramento arp (em ms). o Valor padrão é zero e significa que o monitoramento arp esta desabilitado. Este campo só é válido em modo active_backup;
  • arp_ip_target= Um endereço IP para utilizar quando o arp_interval é > 0. Este é o alvo da requisição arp que determina a saúde do link com o alvo. Especifique este valor no formato ddd.ddd.ddd.ddd.

Acho que é isso… espero ter ajudo… Um Abraço, Neto.

Ferramentas de monitoramento

Monitoramento de Tráfego

Abaixo são apresentadas algumas ferramentas úteis para análise e monitoramento do serviço de rede, processos, entre outros.

  • iptraf: É um monitor de rede baseado na biblioteca ncurses que gera diversas estatísticas de rede incluindo informações TCP, contadores UDP, informações de ICMP e OSPF, carga de ethernet entre outros.
  • ethstatus: É outro utilitário de monitoramento baseado em console que apresenta dados estatísticos sobre a interface ethernet. Ele é similar ao iptraf, porém foi feito para atuar como uma aplicação permanente para o monitoramento de carga de rede.
  • pktstat: Apresenta em tempo real, uma lista de conexões ativas em uma interface de rede, e quanto de banda está sendo utilizada por ela.
  • iftop: o iftop é para o uso de rede, oque o top é para o uso de CPU. Ele escuta o tráfego de rede em uma determinada interface e apresenta uma tabela de uso corrente de banda por pares de hosts.
  • vnstat: Ferramenta de monitoramento baseado em console que apresenta dados de entrada/saída e permite armazenar dados históricos para análise. Também faz um “gráfico” de uso por horário. Não é necessário estar logado como root, pois captura as informações do /proc.

Monitoramento de processos

  • whowatch: É um utilitário semelhante ao comando who que apresenta informações sobre os usuários logados na máquina em tempo real. Além das informações padrão (login tty, host, processos do usuário) é apresentado o tipo da conexão (telnet/ssh) e permite exibir detalhes sobre os processos, informações do sistema, entre outros.

<Update 17/01/2006>
- Adicionado o vnstat;
</Update 17/01/2006>

Portas do e-mule

Caso você utiliza o e-mule para algum fim não ilícito (baixar imagens de distribuições open source, etc) e está com aquele problema de ID baixo (a mula fica com uma venda preta nos olhos) que impossibilida downloads rápidos ou demora para baixar algum item que possuem vários “distribuidores”, você pode melhorar seu status.

Isso normalmente acontece quando o modem ADSL está em modo router (o endereço IP válido fica no modem, e não no computador).

Para ter um ID alto no e-mule basta desviar no ADSL as portas externas 4672/UDP e 4662/TCP para a máquina que está rodando o e-mule.

Conexões TCP ativas no Linux

Caso você precise saber o número de conexões ativas atualmente em um servidor linux, utilize o comando:

awk '{ if (/Tcp:.[0-9]/ == 1) {print "Conexões ativas: " $10 } }' /proc/net/snmp

Problema ao exibir um site quando há balanceamento de carga

Certo dia, ao balancear um determinado endereço (www.dominio.com) entre dois servidores utilizando um roteador (Enterasys XPedition 8600), tive um problema com algumas partes do site que “apontavam” para o endereço que estava sendo balanceado utilizando ou tags html ou abrindo arquivos com o fopen do PHP. O resultado final era a demora ou não apresentação dessas páginas que faziam a referência para o próprio domínio.

Após alguma análise e pesquisa descobri que o roteador não aceitava conexões provenientes de um dos membros do balanceamento para o endereço virtual e porta que estava sendo compartilhando entre ambas as máquinas.

A resolução do problema foi mais simples que a descoberta. Como se tratavam de dois servidores Linux, adicionei no /etc/hosts de cada uma das máquinas, uma entrada de www.dominio.com apontando para o endereço de loopback (127.0.0.1). Assim, qualquer tentativa do servidor acessar conteúdos em www.dominio.com seria redirecionada para ele mesmo.

Dica: não cheguei a testar esse problema com o balanceamento feito pelo Director (LVS). Mas de qualquer forma é interessante adotar essa medida para assegurar um correto e rápido funcionamento do site.