Eu não acho que haja uma resposta certa definitiva para sua pergunta. Em vez disso, há uma grande variedade de maneiras de chegar perto do que você deseja. Portanto, irei fornecer algumas dicas de como fazer isso.
Se uma máquina tiver mais de 2 interfaces ( lo
conta como uma), você terá problemas para detectar automaticamente a interface certa com facilidade. Aqui estão algumas receitas de como fazer isso.
O problema, por exemplo, é se os hosts estão em uma DMZ atrás de um firewall NAT que muda o IP público para algum IP privado e encaminha as solicitações. Sua máquina pode ter 10 interfaces, mas apenas uma corresponde à pública.
Mesmo a autodetecção não funciona no caso de você estar em duplo-NAT, onde seu firewall até mesmo traduz o IP de origem em algo completamente diferente. Portanto, você não pode ter certeza de que a rota padrão leva à sua interface com uma interface pública.
Detecte-o pela rota padrão
Esta é a minha maneira recomendada de autodetectar coisas
Algo como ip r get 1.1.1.1
geralmente informa a interface que tem a rota padrão.
Se você quiser recriar isso em sua linguagem de script / programação favorita, use strace ip r get 1.1.1.1
e siga o caminho dos tijolos amarelos.
Definir com /etc/hosts
Esta é minha recomendação se você quiser ficar no controle
Você pode criar uma entrada /etc/hosts
como
80.190.1.3 publicinterfaceip
Então você pode usar este alias publicinterfaceip
para se referir à sua interface pública.
Infelizmente haproxy
não sabe esse truque com o IPv6
Use o ambiente
Esta é uma boa solução para o /etc/hosts
caso de você não estarroot
O mesmo que /etc/hosts
. mas use o ambiente para isso. Você pode tentar /etc/profile
ou ~/.profile
por isso.
Portanto, se seu programa precisa de uma variável MYPUBLICIP
, você pode incluir código como (este é C, fique à vontade para criar C ++ a partir dele):
#define MYPUBLICIPENVVAR "MYPUBLICIP"
const char *mypublicip = getenv(MYPUBLICIPENVVAR);
if (!mypublicip) { fprintf(stderr, "please set environment variable %s\n", MYPUBLICIPENVVAR); exit(3); }
Então você pode chamar seu script / programa /path/to/your/script
assim
MYPUBLICIP=80.190.1.3 /path/to/your/script
isso até funciona em crontab
.
Enumere todas as interfaces e elimine aquelas que você não deseja
A maneira desesperada se você não pode usar ip
Se você sabe o que não quer, pode enumerar todas as interfaces e ignorar todas as falsas.
Aqui já parece haver uma resposta https://stackoverflow.com/a/265978/490291 para essa abordagem.
Faça como DLNA
O jeito do bêbado que tenta se afogar no álcool
Você pode tentar enumerar todos os gateways UPnP em sua rede e, dessa forma, descobrir uma rota adequada para alguma coisa "externa". Isso pode até ser em uma rota para a qual sua rota padrão não aponta.
Para mais informações, talvez consulte https://en.wikipedia.org/wiki/Internet_Gateway_Device_Protocol
Isso dá a você uma boa impressão de qual é a sua interface pública real, mesmo se sua rota padrão apontar para outro lugar.
Tem ainda mais
Onde a montanha encontra o profeta
Os roteadores IPv6 se anunciam para fornecer o prefixo IPv6 correto. Olhar para o prefixo dá uma dica sobre se ele tem algum IP interno ou global.
Você pode escutar os quadros IGMP ou IBGP para descobrir algum gateway adequado.
Existem menos de 2 ^ 32 endereços IP. Conseqüentemente, em uma LAN não demora muito para fazer ping em todos eles. Isso lhe dá uma dica estatística sobre onde a maior parte da Internet está localizada do seu ponto de vista. No entanto, você deve ser um pouco mais sensato do que o famoso https://de.wikipedia.org/wiki/SQL_Slammer
ICMP e até ARP são boas fontes de informações de banda lateral de rede. Também pode te ajudar.
Você pode usar o endereço de Broadcast Ethernet para entrar em contato com todos os seus dispositivos de infraestrutura de rede, o que geralmente ajudará, como DHCP (mesmo DHCPv6) e assim por diante.
Essa lista adicional é provavelmente interminável e sempre incompleta, porque todos os fabricantes de dispositivos de rede estão ocupados inventando novas brechas de segurança para detectar automaticamente seus próprios dispositivos. O que geralmente ajuda muito a detectar alguma interface pública onde não deveria haver uma.
'Nuff disse. Fora.