同じネットワークに設定されている場合、両方のネットワークカードが機能しないのはなぜですか?この問題を解決できますか?

同じネットワークに設定されている場合、両方のネットワークカードが機能しないのはなぜですか?この問題を解決できますか?

2つのロボットデバイスを自分のコンピュータに接続する必要があり、そのために異なるハードウェアに接続されている2つのネットワークカードを使用したいと思います。どちらのデバイスも同じネットワーク(どちらの場合もIPアドレス10.0.0.70と10.0.0.21、ネットマスク255.255.255.0)を使用しています。

シングルカードでネットワークを設定して設定すると、正常に動作することがわかりました。 Androidデバイスにpingを送信して接続できます。しかし、2枚目のカードを取り出したところ、2枚のカードのうち1枚だけが機能します。メインコンピュータに異なるIPアドレスを与えてみましたが、同じIPアドレスを与えてみましたが、違いはありませんでした。ホストのIPアドレスをゲートウェイとして指定しましたが、カードごとに異なり、同じで違いはありません。両方のカードが起動すると、pingに使用するインターフェイスを指定しても、いずれかのカードでpingが機能しません。

私のカーネルは4.15.0-39-generic #42~16.04.1-Ubuntu SMP Wed Oct 24 17:09:54 UTC 2018 x86_64 x86_64 x86_64 GNU/Linuxです。

両方のネットワークカードを異なるネットワークに割り当てると、一緒に機能します。ただし、ロボット装置側ではネットワーク設定を変更しないことが望ましい。これら2つのカード間でパケットをルーティングする必要はありません。

これは私が得た作業構成です。

enp3s0    Link encap:Ethernet  HWaddr 18:d6:c7:00:d9:3e  
          inet addr:10.0.1.30  Bcast:10.0.1.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:16929681 errors:0 dropped:0 overruns:0 frame:0
          TX packets:56504 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1219898415 (1.2 GB)  TX bytes:5267812 (5.2 MB)

enp6s0    Link encap:Ethernet  HWaddr 18:d6:c7:01:69:35  
          inet addr:10.0.0.22  Bcast:10.0.0.255  Mask:255.255.255.0
          inet6 addr: fe80::1ad6:c7ff:fe01:6935/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:52316 errors:0 dropped:0 overruns:0 frame:0
          TX packets:16935487 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:4325056 (4.3 MB)  TX bytes:1220948325 (1.2 GB)

最初のデバイスのIPを10.0.0.30(およびブロードキャストアドレスを10.0.0.255)に変更するとすぐに動作が停止しました。

私はKali Linuxライブディストリビューションで試してみましたが、そこでも動作しません。カリーLinuxで

ifconfig eth0 10.0.0.21 netmask 255.255.255.0 up
ifconfig eth1 10.0.0.70 netmask 255.255.255.0 up

繰り返しますが、少なくともping -Iが機能することを望みましたが、どちらか一方をpingするにはもう一方もダウンする必要があります。簡単なスイッチは、同じネットワークに接続された複数の物理ポートを持つことができますが、メインフレームコンピュータはどのようにできませんか?

答え1

デフォルトでは、LinuxのIPプロトコルドライバは技術的に「弱いシステムモデル」または「弱いホストモデル」として知られている最適化を使用します。詳しくは、この質問をご覧ください。

結論として、同じIPアドレス空間ブロックに属するIP /ネットマスクの組み合わせで2つのNICを設定するときに発信するIPアドレスルーティングを担当するコードは、これが両方のNICが接続されていることを意味すると仮定します。同じ物理ネットワークセグメントしたがって、そのうちの1つを使用して、そのブロックのIPアドレスを持つすべてのホストと通信できます。その後、そのネットワークセグメントから出るすべてのトラフィックに対して、ルーティングテーブルに最初にリストされたインターフェイスのみを使用します。同じIPアドレス空間のコピーを使用する複数の異なる物理ネットワークの概念はありません。

システムに問題がある場合リバースパスフィルタリング/proc/sys/net/ipv4/conf/*/rp_filter)有効にすると、ネットワークインターフェイスを指定しても(たとえば)ボットの1つにpingを送信することを防ぎます。eth1応答が来ると、eth1リバースパスフィルタは、その送信元IPへの通常のパスが通過することを確認します。eth0したがって、この受信パケットはeth1偽であることは間違いありません。次の機能を有効にすると、これが発生するかどうかを確認できます火星ログ環境:

for i in /proc/sys/net/ipv4/conf/*/log_martians; do
    echo 1 > $i
done

その後、ボットにpingし、出力の終わりを確認してくださいdmesg。ドロップされたパケットに関するメッセージが表示されることがあります。

お客様の状況では、発信パケットに使用するNICを決定する際に、送信元IPアドレスを考慮して、いわゆる「強力なエンドシステムモデル」または「強力なホストモデル」に従って動作するようにルーティングが必要です.まあ、Linuxできる高度なルーティング機能を使用してこれを行うことができますが、これは確かにデフォルトではなく、設定が非常に面倒です。本当にこれを行うには、設定方法に関する上記の質問の回答を参照してください。

ただし、ロボットのIPアドレスは重複しないため、ソフトウェア構成の面で最も簡単な解決策は、小型で安価なネットワークスイッチ(またはハブ)を購入し、ロボットとコンピュータのネットワークケーブルをここに接続することです。

または、最小限のハードウェアで簡単にしたい場合は、同じシステム上の複数のNICに直接接続したい場合は、異なるIPセグメントを使用するようにロボットを設定できます。

答え2

ロボットデバイスのIPが異なるため、最も簡単な方法は、2つのイーサネットインターフェイスをポートとして使用してLinuxブリッジを作成することです。似たようなもの

ip link add name br0 type bridge
ip link set enp3s0 master br0
ip link set enp6s0 master br0

それから一つ内部インターフェイスのIPアドレスbr0:

ip addr add 10.0.0.1/24 dev br0

ボックスの最後にスイッチがかかっておらず、すべてがまだ同じネットワークにあります。

そして、お願いします、Kali Linuxを使用してそのようなことをしないでください。読むこれ、日常業務のために、一部のディストリビューション(KaliもDebianベースなのでDebianベース)に切り替えてください。苦労がはるかに減るでしょう。 Kaliが使用できるすべての輝くツールもインストールできます。

答え3

21 および 70 では、2 つの重複しないサブネット 10.0.0.0/26 および 10.0.0.64/26 (/26 = マスク 255.255.255.192) を使用できます。他のインターフェイスには10.0.0.0/25が含まれていないとします。

関連情報