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セグメントを使用するようにロボットを設定できます。