Comandos de rede Linux

Conheça os principais comandos no Linux para gerenciamento de rede, transferência de dados e acesso remoto, assim como o programa screen, que permite abrir vários terminais (remotos ou não) em uma mesma janela. A parte mais conceitual de redes de computadores está disponível no link.

Configuração

Alguns comandos são fundamentais para configuração de rede do computador, todos executados como super usuário. Por exemplo, o “ifconfig” informa os dispositivos e suas propriedades. A partir da versão 9 do Debian, o pacote net-tools foi depreciado em favor do iproute2. Ou seja, use o comando “ip addr” em vez de ifconfig.

Para evitar ter que conectar ou desconectar manualmente as interface de rede conforme o computador muda de lugar, existe o pacote network-manager. Nele, o usuário pode mudar de uma rede para outra usando um pequeno ícone exibido na área de notificação de sua área de trabalho gráfica com uma lista de redes disponíveis (com e sem fios) e vários tipos de conexões (DHCP, manual, rede local). Ele vai ignorar todas as interfaces de rede no “/etc/network/interfaces” para as quais ele não foi projetado – as vezes é necessário desativá-las manualmente para evitar conflito (comando “apt-get purge network-manager”). Para reiniciá-lo, os comandos são (parar é stop e começar é start):

A edição do arquivo /etc/network/interfaces permite a conexão do computador à rede, usando DHCP (Protocolo de configuração dinâmica de host) ou IP fixo. Esse arquivo contém a configuração da rede para cada dispositivo, que pode estar escrito diretamente no arquivo ou linkado em outro arquivo, conforme segue:

A última linha indica o local onde estão os arquivos de configuração para cada interface (eth0, eth1, wlan0, etc). Para verificar qual delas você deve configurar, execute o comando “dmesg | grep eth”. Veja agora o conteúdo do arquivo “/etc/network/interfaces.d/eth0.cfg” (que pode estar diretamente inserido no “/etc/network/interfaces”) para um IP fixo:

A linha “auto” lista as interfaces que devem ser ativadas automaticamente (“lo” vem de loopback, usada para a comunicação local entre diversos aplicativos e componentes do sistema, e “eth” de ethernet). Em seguida temos a configuração de cada interface, que inicia com a palavra chave iface. A palavra seguinte, inet, que especifica a familia de endereços da interface – inet para a rede TCP/IP, ipx para interfaces IPX e IPv6 para interfaces configuradas com o protocolo IPV6. Por fim, a palavra static especifica o método que a interface será configurada (neste caso, com endereço estático/fixo). Desse modo, temos: “iface lo inet loopback” para loopback e “iface eth0 inet dhcp” para DHCP. “allow-hotplug” habilita a configuração da placa no momento em que o cabo de rede é conectado.

As linhas restantes são para configurar o IP fixo, não sendo necessárias para o método DHCP. O método mais simples é a configuração dinâmica com DHCP, que requer um servidor DHCP na rede local. Ele pode indicar um hostname (“nome de máquina”) desejado, correspondendo à configuração de hostname no exemplo abaixo. O servidor DHCP então manda as configurações para a rede apropriada.

O “gateway” é o endereço do computador responsável por conectar o seu computador a outra rede. As linhas “network” e “broadcast”, assim como a “gateway”, nem sempre são necessárias.

Caso possua instalado o pacote “resolvconf” (apt-get install resolvconf), mova (ou copiei) as linhas “dns-nameservers” e “dns-search” para dentro do arquivo “/etc/resolv.conf” sem o “dns-“. O “search” (pode ser dispensável) é obtido ao executar o comando “hostname  -f” (exceto o nome da máquina). No mesmo arquivo, são indicados os servidores DNS a serem usados, um por linha, com a palavra-chave nameserver seguida por um endereço IP.

Atualização: a partir do debian 9, o arquivo /etc/resolv.conf é gerado automaticamente pelo resolvconf ao reiniciar o serviço de rede, com as informações dadas no arquivo “interfaces” – portanto não apague as informações daí. Caso esteja usando network-manager e ainda não esteja funcionando o DNS, você pode editar o arquivo de cabeçalho do resolvconf (/etc/resolvconf/resolv.conf.d/head) para incluir as linhas de namesarever.

Depois de editar o arquivo, você pode aplicar as alterações reiniciando o serviço relacionado a ele:

A última linha geralmente é um pouco mais certeira em realmente reiniciar a rede. Os comandos unidos pelo “e comercial duplo” permitem enviar a instrução de desligar e ligar a rede de uma vez só, permitindo a reinicialização da rede remotamente.

Para mudar o nome do PC, edite os arquivos “/etc/hostname” e “/etc/hosts” (nessa ordem), substituindo o hostname antigo pelo novo. Para efetivar as mudanças, reinicie o serviço (ou o sistema todo mesmo):

O arquivo “/etc/hosts” permite estabelecer uma pequena tabela de mapeamento de endereços IP e nomes de máquina: cada linha indica um endereço IP específico, seguido pela lista de quaisquer denominações associadas.

O proxy em qualquer distribuição Linux é configurado através de variáveis de sistema. Para tornar uma configuração de proxy permanente, usada em todas as subsessões, as seguintes linhas devem ser adicionadas no arquivo “/etc/profile” (https, http e ftp):

Caso o proxy não seja autenticado, basta omitir “username:password@”.

Monitoramento de rede

O ICMP (Internet Control Message Protocol) é o protocolo usado para transmitir informações complementares sobre as comunicações. Permite testar a conectividade de rede através do comando ping, que envia uma mensagem ICMP “echo request” (solicitação de eco) e o beneficiário se destina a responder com uma mensagem ICMP “echo reply” (resposta echo).

O ping testa o tráfego pela porta 80; para testar outras portas, use o nmap:

O programa “IPTraf” fornece uma interface gráfica que mostra o tráfico em sua rede em tempo real. Para isso, você deverá instalar o programa (1ª linha) e executá-lo (2ª linha):

O “iftop“, assim como o htop, permite monitoramento em tempo real, só que aqui é da rede:

Para monitorar o uso de banda por processo, existe o NetHogs. Depois de executado, você pode alternar a exibição entre a largura de banda atual em tempo real (KB/s), ou o total transferido em KB, B ou MB, utilizando a tecla m, ou filtrar por recebido (r) ou enviado (s). Para sair, basta apertar a tecla q.

O comando “netstat” permite conhecer quais conexões TCP ativas estão abertas e sendo executadas em um host de rede:

Um dos principais sniffers, o TCPDump mostra os cabeçalhos dos pacotes que passam pela interface de rede escolhida. Por exemplo, para mostrar quais as ligações de um determinado endereço à porta 80 da interface eth0:

Caso queira alterar o monitoramento para um IP de destino de tráfego, deve-se alterar “src” por “dst”; a opção “-nn” impede a resolução de DNS e “-w nome_arq” grava oa saída em um arquivo lido pelo programa. Os parâmetros adicionados são opcionais. O TCPDump exibe uma linha de texto para cada pacote capturado dividido em colunas: a hora da captura do pacote, nome do protocolo, endereços IP de origem e destino e as portas (separadas por ponto) utilizadas na transmissão de dados (o sinal de “>” indica a direção do fluxo).

O wireshark exibe o tráfego graficamente organizados com base nas camadas de protocolo. Isso permite ao usuário visualizar todos os protocolos envolvidos em um pacote. Outras ferramentas mais completas de monitoramento de rede podem ser vistas em 10 Free Server & Network Monitoring Tools that Kick Ass e 20 Command Line Tools to Monitor Linux Performance.

Uma forma de monitorar o servidor web Apache é observando seus arquivos de log, que geralmente ficam em “/var/log/apache”:

Mais detalhes na documentação de logs do Apache. Outra forma é utilizar o “apachetop”, que disponibiliza as informações em tempo real (pode ser instalado pelo comando “sudo apt-get install apachetop”).

Para saber quem está conectado no roteador, descubra o ip de seu roteador (digitando o comando “sudo route -n”) e, estando em uma rede gerenciada por ele, entre nesse endereço via navegador web, digitando seu login e senha (geralmente o que vem de fábrica é admin e 1234) – depois procure no menu a tela correspondente.

O comando “who” lista os usuário conetado ao computador: a segunda coluna mostra se está logado via console (tty – regular terminal device) ou em um pseudo console (pts – psuedo terminal slave), que pode indicar um xterm, ssh ou screen. Para verificar últimas tentativas de acesso ao computador, existe o arquivo de log /var/log/auth.log. Ao baixar dados, o acesso do usuário fica registrado através de seu IP e até mesmo nome de usuário na máquina de acesso (se tiver conta nela, no caso de um acesso restrito) ficam gravados no arquivo /var/log/syslog. Veja também o post de acesso remoto para saber mais sobre os comandos SSH e SSHPASS.

Veja mais alguns outros comandos de rede:

Com relação ao comando nmap, para buscar por portas abertas/fechadas, use a opção -Pn (“All scanned ports are filtered” significa que todas as portas estão fechadas para acesso).

Transferência de dados

Para transferir/copiar arquivos entre computadores, são muito utilizados os comandos scp (mais rápido) e rsync (mais seguro e com mais utilidades). A opção “-r” indica que o comando é recursivo, ou seja, vai copiar pastas e subpastas também. Veja o exemplo:

O rsync funciona da mesma maneira, tendo também a opção “-v” (verbose), para dar informações, onde “-progress” é para imprimir o progresso da transferência. A opção “-a” (archive) faz com que todas as permissões e atributos dos arquivos sejam mantidos, e opção “-z” (compress) compacta os dados dos arquivos antes de transferi-los. A opção “–delete” diz para apagar arquivos movidos ou deletados (ele não diferencia: apaga no destino se não existir na origem). A opção “–remove-source-files” remove os arquivos de origem após a transferência (o equivalente a mover os arquivos).

O ponto indica o diretório onde está (ou seja, copiar o arquivo/pasta “para cá”). Os número entre colchetes indicam que deve-se procurar as pastas 2014-01, 2014-02 e 2014-03. O asterisco indica para considerar todas as variações possíveis de nomes, de modo que o início do arquivo seja o informado até aquele ponto.

Outra opção interessante é o “-R”, que preserva o caminho do arquivo da origem no destino. Por exemplo, o comando “rsync foo/bar/foo.c remote:/tmp/” cria o arquivo foo.c na pasta “/tmp”; se utilizar “-R”, será criado o arquivo “/tmp/foo/bar/foo.c”. Para mais opções do comando rsync, consulte o link.

Em ambos os comandos, deverá ser digitada a senha de acesso do usuário na máquina. Existe uma forma de passar a senha como parâmetro no SSH e scp/rsync, após registro de chave pública, que é através do comando sshpass (veja mais no artigo sobre acesso remoto).

Para gravar sites com seus arquivos linkados de uma só vez, pode-se utilizar o comando wget. Veja um exemplo para o caso do site exigir login e senha de acesso (opcional):

Veja mais sobre o comando wget no post Scripts com wget.

O comando cURL (que pode ser instalado via apt-get) também é muito útil não só para download/upload, como também no caso de haver campos no link que usem o método get (adaptável do exemplo abaixo) ou mesmo o post (usando a opção -d) e outras formas de acesso com login e senha – por isso é muito utilizado em técnicas de brute force para tentar acesso. Veja um exemplo bem geral para baixar uma sequência de arquivos (parâmetro “-o”):

Esse comando baixa arquivos listas entre 00 e 18, salvando com o respectivo índice desde a primeira posição (por isso o #1). Outra utilidade desse comando é visualizar seu IP externo na internet:

Mais exemplos e opções de cURL podem ser vistos clicando no link.

Para ver comandos de serviços FTP, leia o artigo “Como enviar e receber arquivos via FTP“.

Segurança

Um firewall é um hardware e/ou software que classifica os pacotes de entrada ou saída de rede (local ou internet) e só deixa passar aqueles combinando certas condições pré-definidas. Pode ser restrito a uma determinada máquina, que filtra todo o tráfego de passagem de uma rede local para internet e vice-versa.

Para restringir o acesso à sua máquina Linux, você deve modificar os arquivos /etc/hosts.allow e arquivo /etc/hosts.deny. Esses arquivos são usados pelo tcpd (tcp wrapper) e sshd para decidir se deve ou não aceitar uma conexão vindo de outro endereço IP. Por exemplo, para permitir ligações a quaisquer serviços protegidos pela tcpd ou sshd apenas de sistemas dentro do domínio exemplo.edu, deixe o conteúdo do arquivo “/etc/hosts.allow” como (ALL é para todos os usuários, o que também pode ser alterado para conter somente o nome de um usuário específico):

Edite também o arquivo “/etc/host.deny” conforme segue para que o acesso à sua máquina a partir de todos os hosts seja negado, exceto os especificados no hosts.allow:

O iptables é uma ferramenta que controla o módulo netfilter, que fornece ao sistema operacional Linux as funções de firewall, NAT e log dos dados que trafegam por rede de computadores. Através de regras, é possível fazer com que os pacotes possam ser ou não recebidos da rede toda, de determinada máquina, interface ou mesmo porta de conexão. O Iptables trabalha através de tabelas (mangle, nat e filter – a padrão), chains (especificam a situação do tratamento dos pacotes) e regras (geralmente compostas de uma Tabela, Opção, Chain, Dados e Ação). Montes as regras em um script e torne-o executável, incluindo sua execução no fim do arquivo “/etc/rc.d/rc.local” para rodar em toda inicialização do sistema. Veja esse exemplo:

Veja as opções usadas:

  • “-F” apaga todas as regras
  • “-X” exclui uma regra pelo nome
  • “-t” permite manipular a tabela informada
  • “-A” insere uma nova regra
  • “-s” especifica a origem do pacote
  • “-p” especifica o protocolo

Os possíveis chains são PREROUTING, POSTROUTING e OUTPUT para tabela “nat” e INPUT, OUTPUT e FORWARD para tabela “filter”. As ações sempre vem após o parâmetro -j e geralmente são ACCEPT, DROP, REJECT e LOG. Ao utilizar apenas um e comercial (&), o comando é executado em background (segundo plano), enquanto que o uso de dois e comercial (&&) indica que continuará a execução do script somente se o comando anterior tenha sido bem sucedido.

O ip6tables atua sobre a rede IPv6. Quando está ativo, pode se criar dois conjuntos de regras distintas para IPv4 e IPv6, ou criar uma só e deixar fwbuilder traduzir as regras de acordo com os endereços atribuídos aos objetos.

O pacote iptables oferece uma proteção adicional de baixo nível, diretamente dentro da pilha IP do kernel, enquanto o esquema /etc/hosts.{allow,deny} está no nível de aplicativos.

Melhorando qualidade da rede

Visando melhorar a qualidade de serviços de rede, existem técnicas que envolvem a classificação o tráfego de rede em categorias, assim como sua diferenciação ao manejar esse tráfego de acordo com a categoria a qual ele pertence. O “Traffic shaping” limita a taxa de transmissão de dados para conexões relacionadas a algum serviço e/ou máquinas (hosts) para que não haja saturação da largura de banda disponível e deixe outros importantes serviços sem nada.

Os parâmetros são configurados através do comando tc (fornecido pelo pacote iproute). Como sua interface é bem complexa, o uso de ferramentas de alto nível é recomendado, como o wondershaper, que minimiza latências independente da carga da rede em cada interface (via linha de comando ou arquivo “/etc/network/interfaces”).

O roteamento dinâmico permite que os roteadores ajustem, em tempo real, os caminhos usados para transmitir pacotes IP. Cada protocolo envolve um método próprio para definir rotas (caminhos mais curtos, usam rotas anunciadas pelos pares, e assim por diante), exibidas pelo comando “route”. Quagga é um conjunto de daemons que cooperam para definir as tabelas de roteamento a serem usadas pelo kernel.

Redirecionamento de rede wi-fi para Ethernet (cabo)

Existem dispositivos (como smart TVs antigas) que só aceitam conexão de rede através de cabo (se quiser conexão sem fio, deve-se comprar um adaptador/dongle específico do fabricante, caro e difícil de encontrar). Como solução, é possível redirecionar o tráfego wireless recebido por um notebook (por exemplo) para esse dispositivo, ambos conectados via cabo de rede.

Além do cabo, será preciso configurar no notebook uma rede própria para essa finalidade. Isso é fácil de se fazer no Linux usando o Network Manager (instalado por padrão no Debian e acessível por ícone no canto superior direito). Clique no ícone dele com o botão direito e vá em “editar conexões”. Clique na aba “Ethernet” e no botão “Adicionar”. Coloque um nome nessa conexão (“Compartilhada”, por exemplo), vá para a aba “IPV4” e em “Método”, escolha “compartilhada com outros computadores”. Clique em “salvar”.

Agora, para compartilhar o wi-fi recebido no notebook para o dispositivo usando cabo, basta clicar no ícone do Network Manager e escolher essa conexão pelo nome.