1

ovs-ofctl と mininet で SDN を学び始めており、いくつかのチュートリアルに従ってスイッチを構成していますが、何かがわかりません。

トポロジを次のように開始すると:

sudo mn --topo single,2 --controller remote --switch ovsk

h1 と h5 の間に単純なフローを追加する場合は、次のようにします。

sh ovs-ofctl add-flow s1 in_port=1,actions=output:2
sh ovs-ofctl add-flow s1 in_port=2,actions=output:1

ホスト間の接続をテストすると、すべて問題ありません。

しかし、今、すべてのフローを削除すると、次のようになります。

sh ovs-ofctl add-flow s1 in_port=1,dl_type=0x806,nw_dst=10.0.0.2,actions=output:2
sh ovs-ofctl add-flow s1 in_port=2,dl_type=0x806,nw_dst=10.0.0.1,actions=output:1

ここで ping を実行しようとすると、到達可能性はありませんが、実行すると:

sh ovs-ofctl add-flow s1 action=NORMAL

これで、ホスト間で再度 ping を実行できるようになりました。

ここで何が欠けていますか?コマンドで指定するだけでは、 ARP トラフィックを使用するイーサネットだけdl_type=0x806を許可するのに十分ではありませんか? ping がそこで失敗するのはなぜですか?

4

1 に答える 1

1

主な理由は、関連するすべてのプロトコル間の混乱だと思います。

(1) ping は、ICMP、特に ICMP エコー要求および ICMP エコー応答メッセージを使用して行われます。これらのメッセージは IP パケットにカプセル化され、さらにイーサネット パケットにカプセル化されます。この場合、イーサネットの次のヘッダー フィールド (実際には一般に ethertype と呼ばれ、ここでは dl_type と呼ばれていると思います) は IP、0x0800 に設定されます。

Wireshark で ICMP パケットを読み取る方法に関するより詳細なガイドは、こちらにあります

(2) ARP は、エンドシステムが IP アドレスと MAC アドレスを照合するために必要です。ARP はイーサネット フレームに直接カプセル化され、イーサネットの次のヘッダーは値 0x806 に設定されます。

したがって

sh ovs-ofctl add-flow s1 in_port=1,dl_type=0x806,nw_dst=10.0.0.2,actions=output:2

すべての非 ARP イーサネット フレームをドロップしながら、ARP パケットのみの通過を許可します。したがって、ping パケットがドロップされています。

(3) 最後の質問は、これが機能する理由です。

sh ovs-ofctl add-flow s1 action=NORMAL

私は OVS の詳細に精通していません。hereから私が理解していることから、 action=NORMAL は OVS を通常の Linux ブリッジとして機能させ、通常のイーサネット ブリッジ操作を行い、通常の MAC 学習ルールに基づいてすべてのフレームを転送します。

また、このルールには一致部分がないため、すべてのパケットに一致するはずです。これがどのように機能するかわかりません。

sh ovs-ofctl add-flow s1 in_port=1,dl_type=0x806,nw_dst=10.0.0.2,actions=NORMAL

(4) このリファレンスの下部に表があり、一般的なネットワーク プロトコルに一致する openflow ルールがリストされています。

于 2021-12-13T13:57:52.930 に答える