2016年に発掘せずにシェルから外部IPアドレスを取得しますか?

2016年に発掘せずにシェルから外部IPアドレスを取得しますか?

この問題: "Bashから外部IPアドレスを取得するには?

digを呼び出して問題を解決します。

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

これは単一のUDPパケットを含むため、可能な限り最速のソリューションです。

しかし、これはOpenDNSという1つのウェブサイトにすぎません。他のオプションはありますか?

そしてデフォルトでは提供されていないdigを使用してください。別のオプションがありますか?


ノート:ポート53の(ローカル)リダイレクトのためにOpenDNSサービスがローカルで機能しないため、この問題を解決する必要があります。ついに理由を見つけました(リダイレクトを忘れました)。まず、次のコマンドを使用してdnssecが正しく機能していることを確認します(adフラグがローカルから欠落しています)。

dig pir.org +dnssec +multi

このコマンドを使用して、ISPがOpenDNS解決をリダイレクトしていることを確認することもできます。

host -t txt which.opendns.com 208.67.220.220

リダイレクトされると、次のような答えが得られます。"I am not an OpenDNS resolver."

答え1

別のオプションはGoogle DNSです。

myip(){   dig @8.8.8.8 -t txt o-o.myaddr.l.google.com |
          grep "client-subnet" |
          grep -o "\([0-9]\{1,3\}\.\)\{3\}\([0-9]\{1,3\}\)" ;   }

システムにdigがない場合、ホストはまったく同じです。

myip(){   host -t txt o-o.myaddr.l.google.com 8.8.8.8 |
          grep -oP "client-subnet \K(\d{1,3}\.){3}\d{1,3}";   }

-PGNU grep (Perl 様) および基本 (BRE) 正規表現が表示されます。

もちろん、オリジナルのウェブサイトも動作します。
破棄:

myip(){   dig myip.opendns.com @208.67.220.222  |
          grep "^myip\.opendns\.com\."             |
          grep -o "\([0-9]\{1,3\}\.\)\{3\}\([0-9]\{1,3\}\)"  ; }

ホストと一緒に:

myip(){   host myip.opendns.com 208.67.220.222  |
          grep -oP "^myip\.opendns\.com.* \K(\d{1,3}\.){3}(\d{1,3})" ; }

上記の2つのスニペットは、次の4つのOpenDNSリゾルバーアドレスのいずれかで機能します。

echo 208.67.22{0,2}.22{0,2}

後で直接DNS解決が失敗した場合は、カールを使用して次のサイト(URL)のいずれかにアクセスしてください。

IFS=$'\n' read -d '' -a urls <<-'_end_of_text_'
api.ipify.org
bot.whatismyipaddress.com/
canhazip.com/
checkip.dyndns.com/
corz.org/ip
curlmyip.com/
eth0.me/
icanhazip.com/
ident.me/
ifcfg.me/
ifconfig.me/
ip.appspot.com/
ipecho.net/plain
ipof.in/txt
ip.tyk.nu/
l2.io/ip
tnx.nl/ip
wgetip.com/
whatismyip.akamai.com/
_end_of_text_

次のように配列アドレスを呼び出します。

$ i=5; curl -m10 -L "http://${urls[i]}"
116.132.27.203

一部のWebサイトではhttpsも機能する可能性があります。

答え2

私はこれらの項目の多くがあなたのネットワークトラフィックおよび/またはあなたがこの情報を要求したサービスをスニッフィングしている誰かにあなたを識別できるビーコンであると結論付けました。

お客様のプライバシーを保護するサービスに対してHTTPSクエリを実行することをお勧めします。

wget -qqO- 'https://duckduckgo.com/?q=what+is+my+ip' \
  | grep -Pow 'Your IP address is \K[0-9.]+'

(組み込みシステムまたは他の制限付きシステムを使用していて(libpcre)がない場合は、代わりgrep -Pにそれを使用してください
… | grep -ow 'Your IP address is [0-9.]*[0-9]' | grep -ow '[0-9][0-9.]*'  。)

あなた(および/またはあなたのIPの他の人)がプライバシーに焦点を当てたサービスを使用していない場合ダック検索エンジンの場合、これはシグナルかもしれません(あなたのクエリ自体はサードパーティが解釈することはできませんが、クエリが多すぎるという事実が過度に過ぎるかもしれません)。 Googleでも同じことができますが、Googleはwgetや同様のユーティリティへのアクセスを明示的に拒否するため、ユーザーエージェントを偽造する必要があります。

wget -U Mozilla/5.0 -qqO- 'https://www.google.com/search?q=what+is+my+ip' \
  | grep -Po '>\K[0-9.]{7,}(?=<.{0,99}>Your public IP)'

これはGoogleの利用規約に違反する可能性があります。

おそらく正規表現を変更する必要があるようです。クラスIPv6の場合〜から[0-9.][0-9a-f:]そうだったらどうだったのか分からないデュアルスタック

答え3

私は以下を使用します:

dig @1.1.1.1 TXT whoami.cloudflare.com +short | tr -d \"

または以下を使用してhost

$ host=whoami.cloudflare.com
$ host -t TXT "$host" 1.1.1.1 | sed -En "s/^$host.+"'"([^"]*)"/\1/p'

関連情報