Seu roteador deve saber seu próprio endereço IP externo, o meu faz, e se eu fizer login na página de status eu posso lê-lo.
o software pode ler também: por exemplo, eu uso o seguinte na minha /etc/ddclient.conf
use=web, web='http://192.168.2.1/status_main.stm', web-skip='var wan_ip="'
O que permite que o ddclient
software obter o endereço IP externo a partir dessa página no meu roteador. Seu roteador provavelmente será diferente em detalhes, mas provavelmente semelhante em operação geral.
A coisa conveniente sobre sites como http://icanhazip.com é que eles funcionam para todos, não há necessidade de encontrar o roteador e a senha para entrar nele para ler os parâmetros de conexão.
upnp é outra maneira de fazer isso, por exemplo: https://stackoverflow.com/questions/799557/trying-to-get-nats-external-ipaddress-with-inatexternalipaddresscallback-in-c-s