net.ipv4.ip_forward=1 を有効にすると、正確に何が起こりますか?

net.ipv4.ip_forward=1 を有効にすると、正確に何が起こりますか?

私がこの状況にあり、デバイスMで正常にMITMを実行するために、ローカルネットワーク上の2つのデバイス(たとえばAとB)のARPキャッシュに感染するプログラムを書いているとします。プログラムはMデバイスで実行されます。デバイスMでコマンドを使用してIP転送を有効にすると、sysctl net.ipv4.ip_forward=1デバイスAからBへのHTTP接続が問題なく確立され、デバイスMからのトラフィックが表示されます。

ただし、同じ状況でデバイスMでコマンドを使用してIP転送を無効にした後、ARPキャッシュが破損してsysctl net.ipv4.ip_forward=0デバイスAからBへのHTTP接続を確立できません。デバイスMでは、デバイスAのTCP SYNパケットを見ることができます。私のプログラムでは、デバイスMからSYNパケットを受信し、パケットのsrc MACアドレスをMのMACアドレス(AのMACアドレス)に変更し、dst MACアドレスをBのMACアドレス(MのMACアドレス)に変更します。ネットワークに注入します。私はネットワーク層から何も修正しません。 TCPdump コマンドを使用して、B 内のパケットに新しい src および dst MAC があることを確認できます。これは、パケットがBに到着したことを意味します。しかし、Bはパケットに応答せず、その理由を理解できません。

もしそうなら、問題はip_forward=1このMITMの状況に特別なものがあるかということです。明確に言えば、すべてのマシンはLinuxです。デバイスMで転送を有効にした後は、パケットのMACアドレスを変更する必要はありません。ちょうどキャッシュを中毒し、そこからすべてがうまくいきました。

答え1

Mのコアは、宛先IPアドレスがパケットがMのためではないことを示すパケットを受信します。それは何をしますか?

当時ip_forward=0は「これがなぜ私に送られたのか分からないし、気にしない。ゴミ箱に捨てられるぞ!」

vs ip_forward=1、「まあ、それは私がすることではありません。しかし、受信者がどこにいるのかを知っているので、正しいMACアドレスに送り返します」

つまりip_forward=1あなたカーネルは自動的にMACアドレスを変更するので、MACアドレスを変更する必要はありません。

答え2

最小限のサンプル実験がnet.ipv4.ip_forward=1重要です

次のトポロジを検討してください。

Internet --- Wi-Fi --- Computer 1 --- Ethernet --- Computer 2

たとえば、コンピュータ2にWi-Fiがないため、コンピュータ2がコンピュータ1を介してインターネットにアクセスできるようにしたいとします。私はこれが基本的にコンピュータ1をルーターに置き換えることを意味すると思います。

存在する:https://askubuntu.com/questions/3063/share-wireless-connection-with-wired-ethernet-port/1502850#1502850私は2つのUbuntuノートブックを使ってこの設定をうまく実装しました。

sudo sysctl net.ipv4.ip_forward=1

これがなければ、コンピュータ1はコンピュータ2のIPパケットをインターネットに転送しないので、これは重要なステップである。

を介してnet.ipv4.ip_forward=0コンピュータ2からコンピュータ1にアクセスできますが、コンピュータ1を超えてインターネットにアクセスすることはできません。

コンピュータ1でできる1つの素晴らしいことは、net.ipv4.ip_forward=1パケットフローを観察することです。

sudo wireshark -k -f 'icmp' -i enp1s0f0 -i wlp2s0

コンピュータ2でこれを行う場合:

ping example.com

したがって、各 ping は 4 つの Wireshark ラインを生成し、コンピュータ 1 がコンピュータ 2 からの要求パケットを消費してインターネットに転送し、インターネットから返信を受けてコンピュータ 2 に送信する方法を明確に見ることができます。

         Time         Source           Dest             Hw src             Hw dst  Protocol
1 0.000000000     10.42.0.70  93.184.216.34  54:e1:ad:b5:5b:08  fc:5c:ee:24:fb:b4      ICMP  request  id=0x79ee, seq=8/2048, ttl=64 (reply in 4)
2 0.000074761  192.168.1.123  93.184.216.34  04:7b:cb:cc:1b:10  9c:53:22:17:e2:0e      ICMP  request  id=0x79ee, seq=8/2048, ttl=63 (reply in 3)
3 0.098882299  93.184.216.34  192.168.1.123  9c:53:22:17:e2:0e  04:7b:cb:cc:1b:10      ICMP  reply    id=0x79ee, seq=8/2048, ttl=51 (request in 2)
4 0.098952451  93.184.216.34     10.42.0.70  fc:5c:ee:24:fb:b4  54:e1:ad:b5:5b:08      ICMP  reply    id=0x79ee, seq=8/2048, ttl=50 (request in 1)

基本的に、マルチネットワークインタフェースを持つLinuxを実行しているすべてのシステムがルータとして機能できると考えるのは興味深いものです。

テストコンピュータ1 = Lenovo ThinkPad P14s、コンピュータ2 = Lenovo ThinkPad P51(Wi-Fiオフ)、両方Ubuntu 23.10を実行します。

答え3

ARP キャッシュを破壊すると、A と B はそれぞれ M の MAC アドレスと B と A の IP アドレスを使用して M にデータグラムの送信を開始します。したがって、これらのデータグラムはレイヤ2(イーサネット)のMに渡されますが、レイヤ3(IP)の他のデバイスに転送されます。これらのデータグラムをレイヤ3受信者(IPアドレスベース)に送信するには、MはIP転送を実行する必要があります。

net.ipv4.ip_forward=0IP転送を無効またはnet.ipv4.ip_forward=1有効にできます。


IP転送が必要なのはなぜですか?

見てオープンシステム相互接続モデル。そこであなたは見つけるでしょう

  • HTTPレイヤ7
  • TCPレイヤ4
  • レイヤ3 IP
  • イーサネットレイヤ2

ARP中毒はレイヤ2に影響します。

ARP中毒がない場合、AからBへのHTTPメッセージはTCPストリーム(ポート80で指定)でラップされ、IPとともにBのIPアドレスに送信されます。 BのIPアドレスはBのイーサネットアドレスに関連付けられています(ハブまたはスイッチを介して)。 AからBへ、またはその逆に直接移動します。 IPを転送する必要はありません。

Mを指すようにAとBのARPキャッシュに感染すると、次のことが起こります。 AからBへのHTTPメッセージは、TCPストリーム(ポート80で指定)でラップされ、IPを介してBのIPアドレスに送信されます。 BのIPアドレスはMのイーサネットアドレスに関連付けられ、データグラムはMに送信されます。Mは、このデータグラムの意図された受信者ではありません。

HTTP接続が正しく機能するためには、MはIPデータグラムを渡す必要があります。AからBへ、またはその逆。これは、上記の設定を使用してカーネルを介して、またはこれらのデータグラムを受信して​​再送信する特別なプログラムによって発生する可能性があります。

関連情報