redisサーバーIPとして「127.0.0.2」を使用しているhiredisでサンプルを実行していますが、正しく実行されています。実際、redisサーバーは同じマシンで実行されています。「127.0.0.1」が「lo」のIPアドレスであることは知っていますが、「127.0.0.2」はどうですか?「127.0.0.1」と同じですか?
redisサーバーIPとして「127.0.0.2」を使用しているhiredisでサンプルを実行していますが、正しく実行されています。実際、redisサーバーは同じマシンで実行されています。「127.0.0.1」が「lo」のIPアドレスであることは知っていますが、「127.0.0.2」はどうですか?「127.0.0.1」と同じですか?
回答:
はい:
IPv4ネットワーク標準では、ループバックのために127.0.0.0/8アドレスブロック全体が予約されています。つまり、これらの16,777,214アドレス(127.0.0.1〜127.255.255.254)のいずれかに送信されたパケットはループバックされます。IPv6には単一のアドレス:: 1しかありません。
さまざまなインターネットエンジニアリングタスクフォース(IETF)標準では、この目的のためにIPv4アドレスブロック127.0.0.0/8がCIDR表記とIPv6アドレス:: 1で予約されています。使用される最も一般的なIPv4アドレスは127.0.0.1です。通常、これらのループバックアドレスは、ホスト名、localhost、またはループバックにマップされます。
またはRFC自体から:
127.0.0.0/8-このブロックは、インターネットホストループバックアドレスとして使用するために割り当てられます。上位レベルのプロトコルによってこのブロック内の任意のアドレスに送信されたデータグラムは、ホスト内でループバックする必要があります。これは通常、ループバックに127.0.0.1/32のみを使用して実装されますが、このブロック内のアドレスはどこのネットワークにも表示されません[RFC1700、5ページ]。
楽しみのために、pingで試してください:
$ ping 127.127.127.127
PING 127.127.127.127 (127.127.127.127) 56(84) bytes of data.
64 bytes from 127.127.127.127: icmp_req=1 ttl=64 time=0.110 ms
64 bytes from 127.127.127.127: icmp_req=2 ttl=64 time=0.065 ms
^C
--- 127.127.127.127 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.065/0.087/0.110/0.024 ms
127.x.x.x
アドレスはローカルマシンに制限されていますか?」はい127.x.x.x
アドレスがlo
インターフェイスにバインドされていますか」はい127.x.x.x
アドレスはネットワーク経由でルーティングされていますか?」127.0.0.0/8-このブロックは、インターネットホストループバックアドレスとして使用するために割り当てられます。高レベルのプロトコルによって
このブロック内の任意のアドレスに送信されたデータグラムは、ホスト内でループバックします。これ
は通常、ループバックに127.0.0.1/32のみを使用して実装されます。
[RFC1122]で説明され、セクション3.2.1.3は、全体127.0.0.0/8ブロック内のアドレスは、合法的に、任意のネットワークの任意の場所に表示されません。— RFC5735
127.0.0.2
と同じ127.0.0.1
?」NOながら127.0.0.1
にして127.255.255.254
、インターフェイスにバインドされたすべてのローカルアドレスですlo
。それらは同じではありません。各アドレスを使用して、異なるポートを同じサービスにバインドできます。たとえば、ポート80の1600万のWebサーバー、ローカルマシンからのみアクセス可能(最初にメモリまたは他のリソースが不足しない場合)
にバインドするdockerサービスをセットアップしました127.0.0.2:80
。次に、エイリアスをに追加しました/etc/hosts
。今私は経由して接続することができhttp://myserver
ますが、ない経由http://127.0.0.1
かhttp://localhost
。ただし、このマシンでのみ使用できます。そのまま、lo
インターフェイス上でのみ。
次に、バインドする別のdockerサービスを設定し127.0.0.3:80
、Pythonサービスをオンにして、別のドッカーサービスをlocalhost:80
オンにし127.0.0.4:80
ます。
これは、すべてのオペレーティングシステムで機能するとは限りません。Debian(9)Gnu / Linux、Linuxカーネル4.9.0-3-amd64を使用しています。いくつかのOSは、すべてのアドレスを扱うこと127.0.0.1
→ 127.255.255.254
同じ。一部のものはでのみ動作し127.0.0.1
ます。
また見なさい
包括的な一般的な答えではありません(既にあります)。私のこの答えは127.0.0.2
、問題を解決するために使用された例を示しています。
エキス:
そこのOPは、サーバーへの接続が拒否された場合に、いくつかのソフトウェアをテストしようとしました。これはiptables
、クライアントIPからのすべてのトラフィックを拒否する一時的なルールによってサーバーで実行されました。クライアントは、接続が拒否されたことをすぐに「見る」ことができました。
この人は、サーバーソフトウェアをクライアントと同じマシンに移動し、ループバックインターフェイスを使用しようとしたときに問題が発生しました。ルールは通信をブロックするように設定されて127.0.0.1
いましたが、接続が拒否された情報には同じルールが適用され、ハングしたクライアントソフトウェアには到達しませんでした(おそらくタイムアウトまで)。
解決策は127.0.0.2
、サーバーアドレスとして使用し、接続を拒否するルールを設定することでした。拒否に関する情報127.0.0.1
はクライアントソフトウェアに送信され、クライアントソフトウェアに渡されました。