Linux 路由問題
對於我正在進行的驅動程序測試,我需要通過第三台充當路由器的 Linux 機器連接 2 台 Linux 機器。每台機器都有一個專有網路設備,有兩個埠,一個埠在子網 11.xxx 下,第二個在子網 12.xxx 下。我遠端連接的服務埠在 10.xxx 子網下。該測試僅在 11 和 12 子網中的專有設備上進行。
機器配置的插圖:
A(11.0.0.1) <-> B(11.0.0.2) ||- C(11.0.0.3)
A(12.0.0.1)-|| B(12.0.0.2) <-> C(12.0.0.3)
(圖解的字面說明:A的第一個埠連接到B的第一個埠,B的第二個埠連接到C的第二個埠,A的第二個埠和C的第一個埠斷開。)
我已將 B(路由機器)配置為轉發 IP 請求。然後我使用
ip route
shell 命令配置 A 和 C,如下所示:一種
ip route add "12.0.0.0/16" via 11.0.0.2
乙
ip route add "11.0.0.0/16" via 12.0.0.2
這行得通。我用任何數據包大小從A ping 12.0.0.3並且它可以工作,反之亦然。問題是我的 TCP 程式碼在A和C之間不能正常工作。它僅適用於A + B和B + C等相鄰機器。
一個通過 TCP 發送
"Hello World!"
字元串的簡單 python 腳本可以工作,但是當同一個腳本發送大於 1450 字節的消息時,什麼都不會通過。兩台主機之間建立了連接,但資訊未通過。重要的是在這裡再次提到大於 1450 字節的數據包的 ping 是有效的。我想我可能在路由機器的配置上做錯了,或者
ip route
.什麼可能導致這樣的問題?
只是一個想法,MTU(最大傳輸單元)通常是 1500 字節。使用 ifconfig 檢查。1450 聽起來非常接近 1500 - IP+TCP 標頭。如果您提高所有機器上兩個介面的 MTU,那麼您是否能夠傳輸更大的 TCP 數據包?
ifconfig <device> mtu 2000
我不知道 1450 字節以上的 ping 數據包是否有效。
- 確保路由器 (11.0.0.2 / 12.0.0.2) 上沒有防火牆。使用 iptables -F。
- 確保啟用了 ip 轉發。如果您只是更改 /etc/sysctl.conf,它需要重新啟動。使用 sysctl net.ipv4.ip_forward 查看是否啟用了 ip 轉發。
- 如果上述事情不起作用,則在所有三個節點上執行 wireshark 或至少 tcpdump,然後執行你的程序。