如果配置為同一網路,為什麼兩個網卡無法工作,我可以解決這個問題嗎?
我需要將兩個機器人設備連接到我的電腦上,為此我想使用連接到這些不同硬體的兩個網卡。兩個設備碰巧使用相同的網路(IP 地址 10.0.0.70 和 10.0.0.21,網路遮罩 255.255.255.0 在這兩種情況下)。
我發現,如果我配置並建立任何單個卡的網路,它就沒有問題:我可以 ping 機器人設備,並且我可以與它建立所有其他連接。但是,一旦我放第二張卡,兩張卡中只有一張在工作。我嘗試給主電腦不同的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。
如果我將它們分配到不同的網路,兩個網卡可以一起工作。然而,最好不要更改機器人設備一側的網路設置。我不需要在這兩張卡之間路由數據包。
這是我得到的工作配置:
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 live 發行版下嘗試過,即使在那裡它也不起作用。Kali 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 -我應該工作,但不,要 ping 任何一個,另一個必須關閉。任何簡單的交換機怎麼會有多個物理埠連接到同一個網路而大型電腦卻不能?
由於機器人設備具有不同的 IP,最簡單的方法是使用兩個乙太網介面作為埠創建一個 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 用於此類事情。閱讀這篇文章,幫自己一個忙,並切換到一些用於日常工作的發行版(基於 Debian,因為 Kali 也是基於 Debian)。你會遇到更少的麻煩。Kali 擁有的所有閃亮工具也可以安裝。
預設情況下,Linux 的 IP 協議驅動程序使用技術名稱為“弱端系統模型”或“弱主機模型”的優化。有關更多詳細資訊,請參閱此問題。
歸根結底,當您使用屬於同一 IP 地址空間塊的 IP/網路遮罩組合配置兩個 NIC 時,負責路由傳出 IP 地址的程式碼將假定這意味著這兩個 NIC 都連接到同一個物理網段,因此它們中的任何一個都可用於與該塊中具有 IP 地址的任何主機通信。然後它只使用恰好在路由表中首先列出的介面來處理到該網段的所有傳出流量。它沒有使用相同 IP 地址空間副本的多個不同物理網路的概念。
如果您的系統碰巧啟用了反向路徑過濾(路由到該源 IP 將通過,因此這個傳入的數據包必須是偽造的。如果啟用log_martians設置,您可以查看是否發生這種情況:
/proc/sys/net/ipv4/conf/*/rp_filter``eth1``eth1``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 段。