コマンドラインでパブリック(WAN)IPアドレスを取得する方法はありますか?私はISPから割り当てられた動的IPアドレスを持つルーター(LANネットワーク)の後ろにいます。
外部Webサービス(ifconfig.me
など)を使用した解決策を見たことがありますが、外部サービスがなくても実行できるかどうかを知りたいです。
システムに2つのイーサネットデバイスがあり、eth0
とeth1
とeth0
がLANに接続されていると仮定します。たとえば、IP 192.168.1.Xとeth1
デバイスが次のifconfig
コマンドを使用してWAN側のIPを取得するISP(WAN)。
注:最初の2つの方法は、2つのイーサネットデバイスがあるコンピューターに対してそれらを実行し、そのうちの1つがISP(ケーブルモデムおよび/またはDSLに接続されていることを前提としていますモデム)。このシナリオでは、インターネット上のIPアドレス(WAN IP)でイーサネットデバイス(eth1)が構成されます。
第1の方法
+------------------------+
+--------+ WAN IP | Computer that wants | LAN IP
|Internet|--------------| to know WAN IP |------------
+--------+ 54.234.1.33 | +------+ +------+ | 192.168.1.1
+-| eth1 |------| eth0 |-+
+------+ +------+
% ifconfig eth1 | awk '/inet / { print $2 }' | sed -e s/addr://
54.234.1.33
ip
コマンドも使用できます。
% ip addr show eth1 | awk '/inet/ {print $2}' | sed 's#/.*##'
54.234.1.33
第2の方法
LAN上にのみ存在するシステムからこれを見つける必要がある場合は、パスフレーズなしのsshキーをセットアップし、LANマシンのアカウントに追加して、WANでシステムにリモートアクセスできるようにします。そのようにアクセスします。
+----------------+
+--------+ WAN IP +-------------+ LAN IP | Computer that |
|Internet|----------------|remote-server|-----------------| wants to know |
+--------+ 54.234.1.33 +----+-----+----+ 192.168.1.x +----+ WAN IP |
|eth1| |eth0| |eth0|------------+
+----+ +----+ +----+
% ssh ruser1@remote-server "ifconfig eth1 | awk '/inet / { print \$2 }' | sed -e s/addr://"
54.234.1.33
3番目の方法
WANアクセスを持つボックスにsshできず、LinksysやNetgearボックスなどのホームルーター/スイッチを使用している場合。 HTTPステータスページを介して、そのデバイスからIPを取得できる場合があります。私も過去にこれをやったことがあります。これは whatismyip.comフォーラムの投稿 で説明されていることと似ています。
192.168.1.2
+----------------+
+--------+ WAN IP +-------------+ LAN IP | Computer that |
|Internet|----------------|router/switch|-----------------| wants to know |
+--------+ 54.234.1.33 +-------------+ 192.168.1.x +----+ WAN IP |
192.168.1.1 |eth0|------------+
+----+
# something like this....
% wget -q -O - http://<username>:<password>@192.168.1.1/Status_Router.asp | grep "ipaddress" | cut -d" " -f2
注:このアプローチは、Linksys、Netgearなどのブランドであるかどうかにかかわらず、使用しているルーター/スイッチに大きく依存します。それぞれに、WAN IPが付いた独自の一意のページがあります。
4番目の方法
WAN IPアドレスを報告する外部インターネットサイトに対してクエリを送信します。
注:元の質問では、このアプローチの代替案を探していると述べていましたが、この回答がすべてのベースをカバーするようにここに入れています。
+---------------+
+-------------+ +--------+ +------+ LAN IP | Computer that |
|whatsmyip.com|---|Internet|---|router|---------------| wants to know |
+-------------+ +--------+ +------+ 192.168.1.x +----+ WAN IP |
you're 54.234.1.33 |eth0|-----------+
+----+
# 1st server
% wget -qO - ipv4bot.whatismyipaddress.com
54.234.1.33
# 2nd server
% curl 'https://api.ipify.org?format=json'
{"ip":"54.234.1.33"}
% curl 'https://api.ipify.org?format=txt'
54.234.1.33
# 3rd server
% curl -s checkip.dyndns.org | sed 's#.*Address: \(.*\)</b.*#\1#'
54.234.1.33
追加情報はこちらから入手できます: HOWTO:コマンドラインから外部IPアドレスを確認する
あなたのシステムにcurlがインストールされているなら(ほとんどの場合)、
curl ifconfig.me
UPNPを使用してNATルーターの背後にいる場合は、miniupnpcを使用してIPアドレスを検出できます。
# debian/ubuntu setup:
# Sudo apt-get install miniupnpc
# get WAN IP address from UPNP router:
upnpc -s | grep ^ExternalIPAddress | cut -c21-
あなたはスクリプトでそれを使用することができます。 cronのように:
#!/bin/bash
#
# In this example, lynx is used as http client. you could also use something else
# like wget etc.
# debian/ubuntu lynx setup:
#
# apt-get install lynx
#
EXTIP=`upnpc -s | grep ^ExternalIPAddress | cut -c21-`
DDNSURL="http://your-ddns-service.com/update/my/ip/to/$EXTIP"
TFILE=/tmp/.WAN_IP
if [ -f $TFILE ]; then
OXTIP=`head -1 $TFILE`
else
touch $TFILE
OXTIP="NULL"
fi
if [ "$EXTIP" != "$OXTIP" ]; then
mv $TFILE "$TFILE~"
echo "$EXTIP" > $TFILE
lynx -source $DDNSURL > /dev/null
echo "================================"
date
echo "WAN_IP = $EXTIP"
fi
ほとんどの場合、外部サービスを使用する必要がない、または使用できない場合、ルータは外部IPを取得する方法を提供する必要があります(他の回答ですでに示されています)。外部サービスの場合、他のほとんどの回答ではWebサービスが使用されます。 Unix SEでのこの答え は、代わりにDNSを使うことを提案します。
たとえば、 Dig
と OpenDNS をリゾルバとして使用します。
Dig +short myip.opendns.com @resolver1.opendns.com
Sshまたはcurlを使ってルーターから情報を取得します。
私はパブリックIPをdyndnsに尋ねるのにcurlを使っていますが、そのようなコマンドはあなたには当てはまりませんね。
curl http://checkip.dyndns.org 2> /dev/null| Perl -pe 's,.*Address: (\d+\.\d+\.\d+\.\d+).*,$1,'
残念ながら、NATのようなリモートサービスへの連絡を含まないメカニズムを検出する方法はありません。 NATは、壊れたサービスを除いて、本質的にユーザーに対して完全に透過的であり、NATディスカバリー用の標準プロトコルはありません。
しかし、外部サービスに関する限り、私が書いた速くて簡単なものident.meを提案しなければなりません。これはあなたがIPv4とIPv6の両方のために使うことができます。最も単純な形式の場合はcurl ident.me
を使用でき、完全なAPIは http://api.ident.me/ に記載されています。
ルーターが NAT PMP (ポートマッピングプロトコル)をサポートしている場合は、natpmpを使ってパブリックIPを取得することができます。
Natpmpcと呼ばれるLinux natpmpライブラリへのコマンドラインインターフェースがあります。 ubuntuでは、natpmp-utilsパッケージに入っています。私のルータはnatpmpをサポートしているようには見えないので、natpmpcユーティリティがあなたのパブリックIPアドレスを返すかどうかは定かではありません。
あなたが探しているlinuxコマンドはあなたが直接インターネットに接続していると仮定してifconfig
です。
そうでなくてプロキシや特別なルーティングを通してアクセスするのであれば(他の人が示すように)最も簡単な方法は他のホストにログイン/アクセスしてそこからチェックすることです。
また、あなたはあなたの友好的な近所のシステム管理者とこの質問について話し合うのを好むかもしれません。