I'd recommend getting it directly from a DNS server.
- The DNS response protocol is standardised (the format will stay compatible).
- Historically, DNS services (OpenDNS, Google Public DNS, ..) tend to survive much longer and are more stable, more scalable, and generally more looked-after than whatever new hip whatismyip.com HTTP service is hot today.
- This method is inherently faster (be it only by a few milliseconds!).
dig @resolver1.opendns.com ANY myip.opendns.com +short
Perhaps alias it in your
bashrc so it's easy to remember
alias wanip='dig @resolver1.opendns.com ANY myip.opendns.com +short'
Responds with a plain ip address:
$ wanip 220.127.116.11 # or, 2606:4700:4700::1111
(Abbreviated from https://ss64.com/bash/dig.html):
usage: dig [@global-dnsserver] [q-type] <hostname> <d-opt> [q-opt] q-type one of (A, ANY, AAAA, TXT, MX, ...). Default: A. d-opt ... +[no]short (Display nothing except short form of answer) ... q-opt one of: -4 (use IPv4 query transport only) -6 (use IPv6 query transport only) ...
ANY query type returns either an AAAA or an A record. To prefer IPv4 or IPv6 connection specifically, use the
-6 options accordingly.
To require the response be an IPv4 address, replace ANY with
A; for IPv6, replace it with
AAAA.Note that it can only return the address used for the connection. For example, when connecting over IPv6, it cannot return the A address.
Alternative servers and examples
In addition to OpenDNS, there are similar DNS services provided by Akamai and Google:
$ dig @ns1-1.akamaitech.net ANY whoami.akamai.net +short 18.104.22.168 $ dig @ns1.google.com TXT o-o.myaddr.l.google.com +short "22.214.171.124"
Example alias that specifically requests an IPv4 address:
alias wanip4='dig @resolver1.opendns.com A myip.opendns.com +short -4' $ wanip4 126.96.36.199
And for IPv6:
alias wanip6='dig @resolver1.opendns.com AAAA myip.opendns.com +short -6' $ wanip6 2606:4700:4700::1111
If the command is not working for some reason, there may be a problem with the upstream provider, the command-line tool, or something else. To help understand why it is not working, run the command without the
+short option to reveal the details of the DNS query. For example:
$ dig @resolver1.opendns.com ANY myip.opendns.com ;; Got answer: ->>HEADER<<- opcode: QUERY, status: NOERROR ;; QUESTION SECTION: ;myip.opendns.com. IN ANY ;; ANSWER SECTION: myip.opendns.com. 0 IN AAAA 2606:4700:4700::1111 ;; Query time: 4 msec ;; WHEN: Fri Apr 11 00:00:01 GMT 2011