Comandos para encontrar o IP público ou WAN IP no Linux

Usuários de qualquer distro GNU/Linux ou UNIX podem usar vários comandos shell para obter informações de sua rede, entre estas, o número de IP na WAN que estão usando.
A informação pode ser útil para quem deseja montar scripts que façam algum tipo de uso destes dados.
Se você não é usuário avançado ou deseja apenas obter rapidamente esta informação, pode acessar qualquer uma destas páginas web — onde o valor do seu IP público é exibido em questão de segundos.

Como obter o endereço IP através do comando dig

O dig é um aplicativo de pesquisa de DNS. Seu nome corresponde a Domain Information Groper.

O dig é uma ferramenta flexível para inquirir os servidores DNS.
Pesquisa os servidores DNS presentes na rede e exibe as informações obtidas daí.

O aplicativo é muito usado por administradores para detectar erros relacionados aos servidores de nomes.
Se você não fornecer um endereço de servidor DNS específico, o dig irá tentar inquirir todos os servidores listados em /etc/resolv.conf. Caso não encontre qualquer endereço útil por lá, o dig se dirige ao host local.
No emulador de terminal digite o seguinte comando para obter unicamente a informação desejada:

dig +short myip.opendns.com @resolver1.opendns.com
202.9.131.64

Se você quiser armazenar este valor em uma variável, use o seguinte procedimento:

meuip=$(dig +short myip.opendns.com @resolver1.opendns.com)
echo "O meu endereço IP público ou WAN é $meuip"
O meu endereço IP público ou WAN é 201.9.130.64

Ficou mais apresentável, não é?
O exemplo abaixo mostra como apontar para o servidor de nomes do Google:

dig TXT +short o-o.myaddr.l.google.com @ns1.google.com
"202.9.131.64"

Outros comandos para determinar o IP WAN

Há várias outras formas de se obter esta informação, veja algumas:

  • Com o comando host:
    host myip.opendns.com resolver1.opendns.com
    Using domain server:
    Name: resolver1.opendns.com
    Address: 208.67.222.222#53
    Aliases: 
    
    myip.opendns.com has address 202.9.131.64
    Host myip.opendns.com not found: 3(NXDOMAIN)
    Host myip.opendns.com not found: 3(NXDOMAIN)
  • O comando curl, permite inquirir outros sites sobre o seu IP público:
    curl ifconfig.co
    202.9.131.64

Você conhece outras formas de determinar seu IP público? Compartilhe conosco, nos comentários. 😉

Como encontrar o seu endereço IP público online?

Há várias formas de saber qual o seu endereço IP público ou IP WAN (Wide Area Network).
Neste texto, vou mostrar alguns sites que podem fornecer esta informação rápido e fácil.
Veja abaixo:

Fácil, não é?

O IP é uma abreviatura para Internet Protocol. Este endereço é usado para identificar computadores, dispositivos móveis ou qualquer outro que se possa conectar a uma rede.
A cada dispositivo é atribuído um endereço IP.

Uma rápida pesquisa, no DuckDuckGo lista uma série de outros sites que também podem fornecer estes dados para você.

Como ajustar o valor da MTU da interface de rede no Linux

O ajuste da MTU é um dos vários que podem ser feitos na sua rede. Este pode trazer ganhos significativos, em termos de eficiência de tráfego de dados, em uma rede estável.
A sigla MTU (Maximum Transmission Unit) corresponde a Unidade de Transmissão Máxima. Está relacionada a redes TCP/IP nos sistemas operacionais GNU Linux, BSD, UNIX etc.
network ethernet cable
A MTU se refere ao tamanho (em bytes) do maior datagrama (ou pacote) que uma determinada camada de um protocolo de comunicação pode passar por vez.
Usar pacotes de dados maiores, pode aumentar a eficiência do tráfego na interface. Em redes instáveis ou com problemas, isto pode não acontecer, contudo — uma vez que basta um bit estar com defeito para demandar que o pacote seja retransmitido.
Se você tiver interesse em saber mais sobre a MTU, pode encontrar informações neste artigo, no quadro de pesquisa do site ou nos links ao final do texto.
Você pode verificar o valor atual da MTU com o comando ifconfig, no Linux.
As instruções abaixo também podem ser aplicáveis ao seu smartphone Android, se você tiver um emulador de terminal instalado.
Veja alguns exemplos:

ifconfig

O resultado pode ser um pouco extenso, a depender da quantidade de interfaces de rede presentes no seu sistema:

docker0   Link encap:Ethernet  Endereço de HW 56:84:7a:fe:87:99  
          inet end.: 172.17.42.1  Bcast:0.0.0.0  Masc:255.255.0.0
          UP BROADCAST MULTICAST  MTU:1500  Métrica:1
          pacotes RX:0 erros:0 descartados:0 excesso:0 quadro:0
          Pacotes TX:0 erros:0 descartados:0 excesso:0 portadora:0
          colisões:0 txqueuelen:0 
          RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

eth0      Link encap:Ethernet  Endereço de HW 50:b7:c3:15:da:48  
          UP BROADCAST MULTICAST  MTU:1500  Métrica:1
          pacotes RX:0 erros:0 descartados:0 excesso:0 quadro:0
          Pacotes TX:0 erros:0 descartados:0 excesso:0 portadora:0
          colisões:0 txqueuelen:1000 
          RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

lo        Link encap:Loopback Local  
          inet end.: 127.0.0.1  Masc:255.0.0.0
          endereço inet6: ::1/128 Escopo:Máquina
          UP LOOPBACK RUNNING  MTU:65536  Métrica:1
          pacotes RX:3763 erros:0 descartados:0 excesso:0 quadro:0
          Pacotes TX:3763 erros:0 descartados:0 excesso:0 portadora:0
          colisões:0 txqueuelen:0 
          RX bytes:333273 (333.2 KB) TX bytes:333273 (333.2 KB)

wlan0     Link encap:Ethernet  Endereço de HW c4:85:08:a7:0b:aa  
          inet end.: 192.168.0.112  Bcast:192.168.0.255  Masc:255.255.255.0
          endereço inet6: fe80::c685:8ff:fea5:aaa/64 Escopo:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Métrica:1
          pacotes RX:298331 erros:0 descartados:0 excesso:0 quadro:0
          Pacotes TX:216836 erros:0 descartados:0 excesso:0 portadora:0
          colisões:0 txqueuelen:1000 
          RX bytes:425353002 (425.3 MB) TX bytes:21561532 (21.5 MB)

Se quiser, é possível combinar o ifconfig com o comando grep, para obter resultados mais objetivos.
Outra forma de obter informações sobre a MTU das suas interfaces de rede é a seguinte:

ip link list
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN mode DEFAULT group default qlen 1000
    link/ether 50:b7:c3:04:da:48 brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP mode DORMANT group default qlen 1000
    link/ether c4:85:08:a5:0a:aa brd ff:ff:ff:ff:ff:ff
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default 
    link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
verificando configurações de rede no Android
Clique para ampliar.

O ifconfig é usado para configurar (e posteriormente manter) as interfaces de rede.
É usado durante o boot para configurar a maioria delas para um estado usável. Depois disto, é normalmente somente necessário durante depurações ou quando for necessária uma configuração fina do sistema.
(Manual do ifconfig)

Como alterar a MTU da interface de rede

Os comandos que seguem, necessitam ser executados com privilégios administrativos — uma vez que alteram as configurações de dispositivos importantes do seu sistema.
Só para deixar registrado, no Android, você precisa de um aparelho rooteado para poder fazer esta configuração.
Para alterar a MTU da interface eth0 para 1400, por exemplo, use o ifconfig da seguinte maneira:

sudo ifconfig eth0 mtu 1400

Para obter o mesmo resultado com o comando ip, proceda da seguinte forma:

sudo ip link set dev eth0 mtu 1400

Agora verifique se a alteração surtiu efeito com os comandos ifconfig ou ip link list.

Como alterar definitivamente a MTU da interface de rede

Para que as alterações sejam definitivas e permaneçam, mesmo que você desligue ou reinicie o sistema, é necessário editar alguns arquivos de configuração — que podem variar de acordo com o sistema operacional ou “sabor” do GNU/Linux em uso.
Nas distros baseadas no Debian (Ubuntu, Mint, Trisquel etc), edite o arquivo /etc/network/interfaces.
O exemplo, abaixo, mostra como configurar uma interface Ethernet. Adapte-o à sua realidade:

auto eth0
iface eth0 inet static
name Ethernet LAN card
address 192.168.0.2
netmask 255.255.255.0
broadcast 192.168.0.255
network 192.168.0.0
gateway 192.168.0.254
mtu 1400
post-up /etc/fw.start
post-down /etc/fw.stop

Feito isto, grave o arquivo e reinicie a interface de rede:

sudo /etc/init.d/networking restart

Nas distros baseadas no Red Hat (Fedora, CentOS etc), a configuração se dá no arquivo /etc/sysconfig/network-scripts/ifcfg-eth0:

DEVICE=eth0
BOOTPROTO=static
BROADCAST=192.168.1.255
HWADDR=00:0F:EA:91:04:07
IPADDR=192.168.1.111
NETMASK=255.255.255.0
NETWORK=192.168.1.0
MTU=1400
ONBOOT=yes
TYPE=Ethernet

Após gravar e fechar o arquivo, reinicie o serviço de rede:

sudo service network restart

ou (funciona no Debian também)

sudo service networking restart

Possíveis erros ao tentar configurar a interface de rede

A maioria dos erros pode ocorrer por que você não está executando algum comando com os privilégios administrativos que ele possivelmente requer.
Outros erros podem advir de se estar tentando aplicar um ajuste além das limitações do próprio hardware: SIOCSIFMTU: Invalid argument. Neste caso, tente usar outros valores (mais baixos) na configuração da MTU.
Se você tiver quiser ler mais sobre configuração de rede, no site, use a caixa de busca para encontrar outros artigos do seu interesse.

Referências

Exemplos de uso do comando ifconfig: https://elias.praciano.com/2015/05/como-configurar-sua-interface-de-rede-com-o-ifconfig/.
Wiki Debian: https://wiki.debian.org/NetworkConfiguration#A.2Fetc.2Fnetwork.2Finterfaces.

Como configurar o hostname no Linux com hostnamectl

Há mais de uma forma para se configurar o hostname em uma máquina no GNU/Linux. E há mais de um tipo de hostname para ser configurado.
Neste post, vou demonstrar o uso do comando hostnamectl e explicar um pouco mais sobre o seu funcionamento no GNU/Linux (independente da distro que você estiver usando).
Captura de tela do comando hostnamectl
Sinta-se à vontade para pular a parte teórica, se você estiver interessado apenas em “resolver o seu problema” — neste caso, sugiro guardar este site nos favoritos, para ler nossos artigos com mais calma depois. 😉

Classes de hostname

Há 3 classes de hostnames no Linux: static (estático), pretty (bonito) e transient (transitório).
Vamos entender melhor cada uma destas classes:

  1. static — O nome de host estático é o, já conhecido, hostname. É, geralmente, escolhido pelo usuário durante a instalação do sistema, quando o aplicativo instalador pergunta pelo “nome” que você deseja dar ao seu computador.
    O valor do nome de host estático fica armazenado em /etc/hostname.

    O maior problema com os nomes estáticos é que, por serem fixos, não vão responder a mudanças nos endereços IP — pelo menos não sem intervenção manual.

  2. transient — O transient hostname é um nome de host dinâmico, mantido pelo kernel do sistema. Ele é inicializado pelo static hostname, cujo valor padrão é localhost.
    O transient hostname pode ser alterado via DHCP ou mDNS durante a execução do sistema.

    O nome de host transitório é usado temporariamente em função da configuração de rede — e é, geralmente, revertido para static hostname, caso a conexão caia, sendo temporariamente gravado no kernel hostname. Exemplo: “dhcp-47-11”.

  3. pretty — O pretty hostname é uma nomenclatura baseada em UTF-8. Ela existe para constituir um nome de host para ser exibido ao usuário.

    O pretty hostname é uma nomenclatura de “alto nível” e não é usada pelo sistema internamente. Tem uma função cosmética e tem maior liberdade para a sua composição.
    É possível usar quase todos os caracteres alfanuméricos e especiais nele:
    “Just’n Case”, “jU5T_1N_c4s3” etc.

    As informações do pretty hostname, seu chassis type o nome de seu ícone, são armazenados no arquivo /etc/machine-info.
    O exemplo, abaixo, mostra como verificar o pretty hostname no seu sistema:

    cat /etc/machine-info
    PRETTY_HOSTNAME=ultra

O nome do host pode ser formado por uma string de até 64 caracteres. Alguns administradores de sistemas recomendam que ambos, static e transient, estejam de acordo com o FQDN (Fully-Qualified Domain Name).
Além disto, os nomes static e transient devem se limitar às letras minúsculas, com caracteres de 7 bit ASCII — sem espaçamentos, sem pontos.
Como as especificações antigas não permitiam o uso de sublinha (_), por questão de compatibilidade, evite o uso deste caractere.

Como usar o comando hostnamectl

Este texto é baseado na documentação oficial do utilitário hostnamectl e do Red Hat Linux e testado em uma máquina Ubuntu 14.04 LTS e num servidor Trisquel Linux 7 Belenos.
Para verificar o seu hostname atual, use o comando “puro”:

hostnamectl
Static hostname: infinity
         Icon name: computer
           Chassis: laptop
           Boot ID: 4500399118049a1699a169fd718a634d
  Operating System: Trisquel GNU/Linux Belenos (7.0)
            Kernel: Linux 3.16.0-31-generic
      Architecture: i686

Para alterar o hostname, use a opção set-hostname:

sudo hostnamectl set-hostname UltraBook«Samsung»
hostnamectl

Note, abaixo, as diferenças entre os hostnames static e o pretty:

   Static hostname: ultrabooksamsung
   Pretty hostname: UltraBook«Samsung»

O comportamento padrão da opção set-hostname é alterar todas as 3 classes de nomes de host (static, transient e pretty). E, como você pode ver, no exemplo anterior, o sistema readequa o nome pretty (“bonitinho”) para a classe static, retirando os caracteres especiais e uniformizando as caixas das letras — o que garante que os nomes de hosts static e pretty estejam sempre “razoavelmente” co-relacionados.
Se quiser, você pode alterar apenas uma das classes. Veja como alterar a visibilidade “bonitinha”:

sudo hostnamectl set-hostname --pretty "Meu ultra novo notebook Core i9"
hostnamectl 
   Static hostname: ultrabooksamsung
   Pretty hostname: Meu ultra novo notebook Core i9
         Icon name: computer-laptop
           Chassis: laptop
           Boot ID: 48e85c3fe4864ad9a169e8ecd98f5c65
  Operating System: Ubuntu 14.04.2 LTS
            Kernel: Linux 3.13.0-51-generic
      Architecture: x86_64

Quando a sua máquina for vista na rede, seu ícone conterá a descrição pretty.
Você vai precisar reiniciar a sua sessão no Linux, para ver todos estes valores alterados.
Há como alterar o hostname da sua máquina através da edição de um dos arquivos de configuração do sistema. Saiba mais aqui.

Referências

Como atribuir nomes aos hosts na rede.
Página do manual do comando hostnamectl: http://manpages.ubuntu.com/manpages/utopic/man1/hostnamectl.1.html. Você pode obter estas mesmas informações executando o comando man hostnamectl.
Página do manual do Red Hat: https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/Networking_Guide/ch-Configure_Host_Names.html#sec_Understanding_Host_Names.
Wikipedia: http://en.wikipedia.org/wiki/Hostname.

Atribua apelidos aos endereços IP da sua rede, editando o /etc/hosts

Com uma pequena edição no arquivo de configuração /etc/hosts, é possível atribuir um ou mais apelidos às máquinas que o cercam na rede.
Isto permite acessar máquinas remotas por nomes, poupando o trabalho de digitar números IP compridos e difíceis de memorizar.
O conteúdo típico do arquivo /etc/hosts, no Ubuntu 14.04 LTS é:

127.0.0.1	localhost
127.0.1.1	case

# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Se você tem várias máquinas virtuais em seu sistema, cada qual rodando um serviço e cada uma com seu próprio endereço IP, na rede, é muito mais fácil dar um apelido a cada uma.
Nos meus exemplos, vou usar uma máquina com um IP fixo 192.168.0.113, apelidada de infinity.
Veja como fica a edição do meu arquivo /etc/hosts, ao qual vou acrescentar alguns apelidos:

127.0.1.1	ultra     # máquina local
192.168.0.113	infinity      #servidor ftp, ssh, apache, mysql 

Claro que você pode dar mais de um apelido para cada número IP.
Com esta configuração, é possível acessar qualquer serviço hospedado na minha máquina local, por um de seus apelidos (localhost, ultra):

ping localhost

ou

ping ultra

O serviço de FTP, hospedado na máquina chamada infinity, pode ser acessado assim:

ftp 192.168.0.113

ou assim:

ftp infinity

O mesmo se aplica ao SSH:

ssh cowboy@infinity
cowboy@infinity's password: 
Welcome to Trisquel GNU/Linux 7.0, Belenos (GNU/Linux 3.16.0-31-generic i686)

Documentation: http://trisquel.info/wiki/

Last login: Fri May  1 11:09:44 2015 from 192.168.0.112
cowboy@infinity:~$ 

Se você tem um servidor Apache na máquina, pode acessar do seu navegador, fornecendo o apelido no lugar do endereço IP: http://infinity ou apenas “infinity/” (veja a imagem).

página padrão do Apache no Trisquel Linux
Clique para ampliar

O mesmo vale pro servidor de impressão CUPS http://infinity:631:
CUPS default printers page
Clique para ampliar.

Há inúmeros outros casos em que você pode simplificar seu acesso a outros dispositivos na rede, através da edição do arquivo de configuração /etc/hosts.
Note que é necessário que os IPs destas máquinas seja fixo — ou você se arrisca a acessar uma máquina diferente com o mesmo apelido, quando houver alguma reinicialização.

Como editar o arquivo /etc/hosts

O arquivo /etc/hosts é um arquivo de texto simples e você deve evitar editá-lo em processadores de texto mais complexos (que não foram feitos para editar código).
O arquivo associa endereços IP a hostnames — um a cada linha.
Veja as regras de edição:

  • Cada IP pode ser associado a um apelido ou mais (separados por espaços):
    192.168.0.21 cups impressoras serv_imp
  • Comentários podem ser feitos com “#”. Tudo o que vier depois deste caractere e até o fim da linha será ignorado.
  • Nomes de hosts ou hostnames devem conter apenas caracteres alfanuméricos — mas sempre começando com caracteres alfabéticos.

Após a edição e gravação do arquivo, já é possível usar o novo hostname. Não há necessidade de reiniciar o computador ou qualquer serviço no sistema — exceto em casos em que o arquivo está sendo mantido em cache por alguma aplicação.

O servidor BIND — Berkeley Internet Name Domain Server — implementa o servidor de nomes para sistemas UNIX.
O BIND acrescenta ou substitui as funções do arquivo /etc/hosts e é uma solução mais confiável.

Em que casos o uso do /etc/hosts pode ser o mais indicado

Atualmente, a tabela de hosts foi substituída pelo uso do DNS. Ainda assim, de acordo com o manual, ela é amplamente usada para:

  1. bootstrapping — Muitos sistemas tem uma pequena tabela hosts, contendo o endereço e o nome para alguns hosts importantes na rede local. Isto é útil quando o DNS ainda não estiver sendo executado, por exemplo, durante a inicialização do sistema.
  2. NIS — Sites que usam o NIS, confiam na tabela de hosts para guardar sua relação de hosts.
    Mesmo podendo usar o DNS, muitos sites NIS, ainda usam esta tabela como backup.
  3. nós isolados — Pequenas redes, com máquinas simples ou sites isolados da rede, usam a tabela de hosts, contida no /etc/hosts em vez do DNS.
    Em situações com raras mudanças nas informações locais e a rede não estando conectada à Internet, o DNS oferece pouca vantagem.

O arquivo HOSTS na história

Muito antes de termos tantos dispositivos conectados à Internet, os poucos sites que se encontravam conectados, tinham um arquivo chamado “HOSTS.TXT”, que provia um mapeamento entre os nomes dos hosts e seus endereços na rede, de maneira simples, que dava pra qualquer pessoa ou programa ler.
À medida em que a quantidade de máquinas conectadas à rede foi crescendo, a quantidade de cópias do arquivo HOSTS foi aumentando e foi-se percebendo o quanto mantê-lo atualizado era ineficiente.
Propôs-se que a Stanford Research Institute Network Information Center (NIC) centralizasse o arquivo HOSTS, mantendo=o atualizado, em 1974.
Esta solução funcionou bem por quase uma década.
O aumento constante da quantidade de dispositivos conectados, contudo, passou a exigir que outra solução fosse adotada.
Para ter uma idéia, no fim da década de 80, o arquivo estava se tornando muito grande.
Novos dispositivos entravam na rede, outros mudavam de nome ou deixavam de existir, constantemente.
Alguns sites passavam a noite toda fazendo o download e a sincronização do seu HOSTS.TXT com o arquivo de Stanford. Ao fim do trabalho, ele já estava desatualizado — e era comum vir com erros, que se propagavam pela rede, causando transtornos.
A necessidade de se solucionar estes problemas, levou à concepção do BIND, desde 1983 e implementado pouco antes da década de 1990.

Referência: http://www.livinginternet.com/i/iw_dns_history.htm