
これはスーパーユーザーに関する最初の質問なので、標準に達していない場合はお詫び申し上げます。
私は pop!_OS 19.10 (Ubuntu 19.10 ベース) を実行しており、そのネットワーク動作を理解しようとしています。ネットワーク インターフェイスを考慮してeth0
、次のサブネットを追加しました。
ip addr add dev eth0 192.168.2.18/24
ip addr add dev eth0 192.168.3.18/24
インターフェースは次のようになります(MACアドレスが変更されました)
1: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
inet 192.168.2.18/24 scope global enp0s31f6
valid_lft forever preferred_lft forever
inet 192.168.3.18/24 scope global enp0s31f6
valid_lft forever preferred_lft forever
を使用するとnc
、IP アドレス192.168.2.18
との間でデータを送信できます192.168.3.18
。
##################################################################################
# nc -v -l 192.168.2.18 8080
Listening on [pop-os] (family 2, port 8080)
Listening on pop-os 8080
Connection received on pop-os 55361
Hello World!
##################################################################################
# nc -v -s 192.168.3.18 192.168.2.18 8080
Connection to 192.168.2.18 8080 port [tcp/http-alt] succeeded!
Hello World!
##################################################################################
# ss -4 -n
tcp ESTAB 0 0 192.168.3.18:55361 192.168.2.18:8080
tcp ESTAB 0 0 192.168.2.18:8080 192.168.3.18:55361
質問1:住所は別々のサブネットに同じインターフェース常に相互に通信できるのでしょうか (ファイアウォールによってブロックされない限り)? これは、カーネルがルーティング テーブルを調べて、2 つのネットワークをローカルで接続できることを確認したためでしょうか? つまり、
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
192.168.3.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0
私はこれをテストしました。カーネルIP転送を調べていて、ここ:
ただし、転送がオフになっている場合、カーネルは最初にパケットがどのインターフェースから来たのかを確認します。同じインターフェースから来ていない場合、カーネルはそれを破棄します。
ただし、アドレス を使用して、192.168.2.18
他のインターフェース経由でに接続することもできます。IP 転送は無効になっています。wlan0
192.168.1.73
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port
tcp ESTAB 0 0 192.168.2.18:8080 192.168.1.73:40405
tcp ESTAB 0 0 192.168.1.73:40405 192.168.2.18:8080
質問2:異なるサブネットとインターフェース上の IP アドレスが、IP 転送を有効にせずに通信できるのはなぜですか? 同じホストに属しているからでしょうか? この動作はどこで定義されていますか? つまり、IP 転送ルールは、パケットがホストから送信され始めたときにのみ有効になるのでしょうか?
答え1
質問 1: 同じインターフェース上の別々のサブネット内のアドレスは、常に相互に通信できると想定してよいでしょうか (ファイアウォールによってブロックされない限り)? これは、カーネルがルーティング テーブルを調べて、2 つのネットワークをローカルに接続できると判断するからでしょうか? つまり、
はい。これは、見つかった「サブネット」エントリが原因ではなく、別のルーティング テーブル (「ローカル」テーブル) にある「ローカル アドレス」エントリが原因です。古い「ルート」ツールは、これらのエントリを意図的に隠している可能性が高いですが、これも時代遅れであり、最新の Linux カーネルによって保持されているルーティング情報を完全に表示することはできません。そのため、次のものを使用してください。
ip -4 route show table local
ip -6 ro ls tab local
(注: これは Linux に固有のものです。BSD では通常、ルーティング テーブルは 1 つだけであり、フラグが設定されたnetstat -rn
特別なルートが表示されますl
。他のオペレーティング システムでは、これは単なる組み込みの動作であり、必ずしもルートとして公開されるとは限りません。)
さらに、パケットは実際には物理インターフェースを使用しない代わりにカーネルは、自身のアドレスが単にルーティングされているかのように動作します。ループバックインターフェース 'lo'。
質問 2: IP 転送を有効にしなくても、異なるサブネットとインターフェース上の IP アドレスが通信できるのはなぜですか? 同じホストに属しているからでしょうか? この動作はどこで定義されていますか? つまり、IP 転送ルールは、パケットがホストから送信され始めたときにのみ有効になるのでしょうか?
はい、同じホストに属しているためです。(Linux では、同じネットワーク名前空間 (同じコンテナーなど) 上にある必要もあります。)
IP転送ルールはパケットが受け取った非ループバック インターフェイス経由 (たとえば、イーサネット経由でローカル MAC アドレスに送信) ですが、その宛先 IP がホストに属するものとして認識されません。
定義上、ローカルで生成されたパケットは「転送」されません (ローカルの送信元 IP アドレスを持つため「出力」されます)。そのため、転送ルールは適用されません。