hiredisで例を実行していますが、redisサーバーのIPに「127.0.0.2」を使用しており、正常に動作しています。実は、redisサーバーは同じマシン上で動いています。127.0.0.0.1」が「lo」のIPアドレスであることは知っていますが、「127.0.0.2」はどうでしょうか?127.0.0.1」と同じなのでしょうか?
44 None 2012-02-24
Yes:
IPv4ネットワーク標準は、ループバック目的で127.0.0.0.0/8アドレスブロック全体を予約しています。つまり、これらの16,777,214アドレス(127.0.0.0.1から127.255.255.254まで)のいずれかに送信されたパケットがループバックされることになります。IPv6のアドレスはたった1つのアドレス、 ::1だけです
様々なインターネット技術タスクフォース(IETF)の標準は、CIDR表記のIPv4アドレスブロック127.0.0.0.0/8と、この目的のためにIPv6アドレス ::1を予約しています。最も一般的に使用されるIPv4アドレスは127.0.0.1です。一般的にこれらのループバックアドレスは、ホスト名、localhostまたはloopbackにマップされています
またはRFC自体から
127.0.0.0.0/8 – このブロックは、インターネットホストのループバックアドレスとして使用するために割り当てられています。上位プロトコルからこのブロック内のアドレスに送られたデータグラムは、ホスト内でループバックされます。これは通常、ループバックに 127.0.0.0.1/32 だけを使用して実装されていますが、このブロック内のアドレスはネットワーク上のどこにも存在してはいけません [RFC1700, page 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
40 icyrock.com 2012-02-24
- “すべての
127.x.x.x
アドレスはローカルマシンに制限されていますか?”はい、そうです - “すべての
127.x.x.x
アドレスはlo
インタフェースにバインドされていますか?” はい - “
127.x.x.x
アドレスはネットワーク経由でルーティングされていますか?”いいえ、そうではありません - “127.x.x.xのアドレスはすべて同じですか?”いいえ(OSによって異なります)
127.0.0.0.0/8 – このブロックは、インターネットホストのループバックアドレスとして使用するために割り当てられています。上位プロトコルからこのブロック内のアドレスに送られたデータグラムは、ホスト内でループバックします。これは通常、ループバックのために127.0.0.0.1/32だけを使用して実装されている。RFC1122]のセクション3.2.1.3で述べられているように、127.0.0.0.0/8ブロック全体のアドレスは、どこのネットワーク上にも正当には存在しません。- RFC5735 強調します
- “
127.0.0.2
と127.0.0.1
は同じですか?”NO rfc5735によるとそうかもしれませんが、そうである必要はありません。これは実装で定義された動作です。オペレーティングシステムのマニュアルを参照してください。どのような場合でも、全範囲が予約されており、ネットワーク経由でルーティングされてはいけません
127.0.0.1
から 127.255.255.254
はすべてインターフェイス lo
にバインドされたローカルアドレスであるのに対し、 127.0.0.1
から 127.255.255.254
はインターフェイス lo
にバインドされたローカルアドレスです。これらは同じではありません。それぞれのアドレスを使って、同じポートに異なるサービスをバインドすることができます。例えば、ポート80に1,600万のウェブサーバがあり、ローカルマシンからしかアクセスできません (メモリや他のリソースが不足していなければ)
私は、127.0.0.2:80
にバインドするためのdockerサービスを設定しました。そして、/etc/hosts
にエイリアスを追加しました。これで、http://myserver
経由では接続できますが、http://127.0.0.1
やhttp://localhost
経由では接続できません。しかし、このマシンでしか利用できません。このままでは、lo
インターフェースでしか利用できません
その後、別のdockerサービスを127.0.0.3:80
にバインドし、localhost:80
にはpythonサービスを、127.0.0.4:80
には別のdockerサービスを設定しました
これはすべてのオペレーティングシステムでは動作しないかもしれません。私は Debian(9) Gnu/Linux、Linux カーネル 4.9.0-3-amd64 を使用しています。OSによっては、127.0.0.1
→ 127.255.255.254
のすべてのアドレスを同じように扱う場合があります。127.0.0.1
のみで動作するものもあります
ping のようなサービスは 0.0.0.0.0 (ipv4) を listen しているので、ping 127.127.127.127
はリスナーに受信されることに注意してください。しかし、サービスが特定のアドレスを listen している場合は、その特定のアドレスを使って接続する必要があります (使用するオペレーティングシステムによって異なります)
see also
9 ctrl-alt-delor 2017-10-01
包括的な一般的な回答ではありません(すでに1つあります)。私のこの回答では、127.0.0.2
を使って問題を解決した例を示しています
Extract:
ここでのOPは、サーバへの接続が拒否された場合に、あるソフトウェアをテストしようとしました。これは、クライアントの IP からのすべてのトラフィックを拒否する一時的な iptables
ルールによってサーバ上で行われました。クライアントはすぐに接続が拒否されたことを「見る」ことができました
この人がサーバソフトをクライアントと同じマシンに移動してループバックインタフェースを使おうとしたときに問題が発生した。ルールは127.0.0.1
からの通信を遮断するように設定されていましたが、接続が拒否されたという情報は同じルールを経て、ハングアップしたクライアントソフトには届きませんでした(おそらくタイムアウトするまで)
解決策は、127.0.0.2
をサーバアドレスとして使用し、そこへの接続を拒否するルールを設定することでした。拒否に関する情報は127.0.0.1
に行き、クライアントソフトウェアに渡すことができました
1 Kamil Maciorowski 2017-10-02