使用多個 NIC 時的 UDP 內部路由問題
我有一台有兩個乙太網埠的伺服器,每個埠都執行在一個單獨的 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。)