OSは0.0.0.0への接続要求をどのように解決しますか?


2

私が理解しているように、0.0.0.0は、このホストのすべてのネットワークインターフェイス(127.0.0.1を含む)を意味します。

あるホスト(OS linux)に3つのインターフェース192.0.2.40、203.0.113.150、および127.0.0.1があるとします。

192.0.2.40:777には、ServerAがあります。203.0.113.150:777には、ServerBがあります。OSは0.0.0.0への接続要求をどのように解決しますか?同じポート(777)が異なるサーバー(ServerAまたはserverB)をリッスンしているとき、およびthisホストのターミナルで行うときに接続される理由telnet 0.0.0.0 777


@DavidPostill Linux OSが0.0.0.0をlocalhostに重複してリダイレクトした理由を教えてください。分かりませんか?
パベル

同意した、いわゆる複製は何でもない。
プラグウォッシュ

回答:


6

これは、ソースアドレスとして(つまり、ソケットをローカルインターフェイスにバインドするとき)だけを意味します。宛先アドレスとしては、この意味はありません。技術的には違法なアドレスです。

しかし、もともとBSDはそれをループバック接続として扱い、Linuxはそれを引き継いでいるようです。

IPv4の場合、net/ipv4/route.cルートルックアップ時にすべてゼロの宛先が処理されます。

struct rtable *ip_route_output_key_hash_rcu(...) {
    ...
    if (!fl4->daddr) {
        fl4->daddr = fl4->saddr;
        if (!fl4->daddr)
            fl4->daddr = fl4->saddr = htonl(INADDR_LOOPBACK);
        dev_out = net->loopback_dev;
        fl4->flowi4_oif = LOOPBACK_IFINDEX;
        res->type = RTN_LOCAL;
        flags |= RTCF_LOCAL;
        goto make_route;
    }
    ...
}

これは、「宛先が空の場合、127.0.0.1を入力し、loインターフェース経由でルーティングする」に変換されます。OSは、localhostに接続しようとしたふりをします。

IPv6でも同じことがプロトコルレベルで処理されます(個別にTCPおよびUDPによって)。たとえば、次のものnet/ipv6/tcp_ipv6.cが含まれます。

static int tcp_v6_connect(...) {
    ...
    /*
     *  connect() to INADDR_ANY means loopback (BSD'ism).
     */
    if (ipv6_addr_any(&usin->sin6_addr)) {
        if (ipv6_addr_v4mapped(&sk->sk_v6_rcv_saddr))
            ipv6_addr_set_v4mapped(htonl(INADDR_LOOPBACK),
                           &usin->sin6_addr);
        else
            usin->sin6_addr = in6addr_loopback;
    }
    ...
}

その間net/ipv6/udp.c

int udpv6_sendmsg(...) {
    ...
    if (!ipv6_addr_any(daddr))
        fl6.daddr = *daddr;
    else
        fl6.daddr.s6_addr[15] = 0x1; /* :: means loopback (BSD'ism) */
    ...
}

説明してくれて、ありがとうございます。したがって、私の例では、telnet 0.0.0.0 777接続を拒否されます。ただし、ServerCも使用している場合は、ServerCに127.0.0.0:777接続します。私はそれを正しく理解していますか?
パベル

これは理論であるため、あなたの答えは受け入れませんが、具体的な質問に対する具体的な答えは受け入れません。
パベル

3
「OSの仕組み[...]」という質問については、そのOSのソースコードは、可能な限り具体的なものです。
-grawity

@PavelK答えは具体的かつ正確であり、あなたはそれを受け入れるべきです。
ジェニーD

@JennyDあなたは決してあきらめませんか?しかし、それで十分です。あなたは投票することができますが、私はしません。
パベル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.