Linux

使用多個 NIC 時的 UDP 內部路由問題

  • March 2, 2017

我有一台有兩個乙太網埠的伺服器,每個埠都執行在一個單獨的 NIC(eth0 和 eth1)上。我想將 eth0 連接到一台單獨的機器,該機器通過 UDP 流式傳輸影片(並且沒有其他流量),而另一個介面(eth1)連接到網路網關/路由器。

我不在乎 udp 流量埠是否沒有連接到更廣泛的網路。

謝謝!

編輯:由於這個問題被擱置,我想根據下面的評論進一步澄清我的系統。我的系統由一台執行 linux 的機器組成,帶有兩個乙太網 NIC。我在其中一個埠上接收到從直接 LAN-LAN 連接到安全攝像頭的 UDP 流,即使我已經能夠讀取從攝像頭傳入的數據包,tcpdump我還沒有看到任何通過gstreamer我打算通過它來顯示影片。

兩個埠都有一個靜態 IP 地址,配置如下所示:

eth0      Link encap:Ethernet  HWaddr 5C:F8:21:34:80:F6
     inet addr:192.168.1.233  Bcast:192.168.1.255  Mask:255.255.255.0
     inet6 addr: fe80::5ef8:21ff:fe34:80f6%132688/64 Scope:Link
     UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
     RX packets:1237 errors:0 dropped:0 overruns:0 frame:0
     TX packets:90 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:1000
     RX bytes:113089 (110.4 KiB)  TX bytes:14016 (13.6 KiB)
     Interrupt:99

eth1      Link encap:Ethernet  HWaddr 5C:F8:21:34:80:F7
     inet addr:192.168.1.234 Bcast:192.168.1.255 Mask:255.255.255.0
     UP BROADCAST MULTICAST  MTU:1500  Metric:1
     RX packets:0 errors:0 dropped:0 overruns:0 frame:0
     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:1000
     RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
     inet addr:127.0.0.1  Mask:255.0.0.0
     inet6 addr: ::1%132688/128 Scope:Host
     UP LOOPBACK RUNNING  MTU:65536  Metric:1
     RX packets:330 errors:0 dropped:0 overruns:0 frame:0
     TX packets:330 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:1
     RX bytes:277171 (270.6 KiB)  TX bytes:277171 (270.6 KiB)

和內部路由表:

Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         192.168.1.1     0.0.0.0         UG        0 0          0 eth1
192.168.1.0     0.0.0.0         255.255.255.0   U         0 0          0 eth1
192.168.1.1     0.0.0.0         255.255.255.255 UH        0 0          0 eth1

相機在 address 上192.168.1.239,並直接通過 UDP 廣播到我的伺服器。(目標 MAC 被硬編碼到數據包中)它正在廣播 MJPEG 流,當我獲取保存的數據包時,tcpdump我可以將其重建為 MJPEG。

但是,當我使用gstreamer以下命令時:

gst-launch-1.0 udpsrc multicast-iface=eth0, port=1234 ! filesink location=foo

foo不保存任何數據。我過去曾使用這台機器使用 gstreamer 保存 udp 流,但不是在使用兩個埠時。IE,影片來自另一台機器,通過路由器,到有問題的伺服器。

那麼,為什麼伺服器清楚地看到和理解(至少沒有丟棄它們)的這些數據包不能到達我的 gstreamer 程序?

通常,您會從另一位 RFC1918(私有)空間分配您的交叉連接它自己的 /30 子網。所以你會做這樣的事情:

  • 192.168.1.234/24 是您在 eth1 上的 LAN
  • 192.168.255.1/30是這台機器,在eth0上(交叉連接)
  • 192.168.255.2/30為影片源,在其端交叉

如果您將 192.168.255.1 和 192.168.255.2 作為 UDP 連接的 IP 地址,它將流過 eth0。

可以使用與 LAN 相同的子網(使用 /32 路由、策略路由或橋接技巧)來執行此操作,但所有這些都更複雜,並且更容易出現混淆隨機程序的問題。

(/x 符號的快速解釋:這是指定網路遮罩的一種簡短方法,通過計算 1 的數量

$$ binary! $$從左邊/最高有效位開始。所以 /30 表示網路遮罩 255.255.255.252。)

引用自:https://unix.stackexchange.com/questions/348418