特定埠範圍的路由流量
我有一個 Ubiquiti Dream Machine (UDM),它是一個項目的一部分,該項目正在用不同的拓撲替換網路拓撲。這涉及 Internet 流量和 VoIP(Asterisk)。在分階段引入新拓撲的過程中,由於我們在配置 Asterisk 伺服器時的限制,我有以下要求:
10.0.0.1
在 UDM 上,我需要將埠中指向的所有 UDP 流量重新路由50000-55000
到10.0.10.1
介面上br8
我懷疑這可以通過 UI 實現,但我可以通過 SSH 訪問 UDM,我可以在其中修改
iptables
和ip route
配置。在UDM上,路由表是這樣的:
# ip route 10.0.0.0/24 dev br3 proto kernel scope link src 10.0.0.1 10.0.1.0/24 dev br5 proto kernel scope link src 10.0.1.1 10.0.2.0/24 dev br6 proto kernel scope link src 10.0.2.1 10.0.3.0/24 dev br4 proto kernel scope link src 10.0.3.1 10.0.10.0/24 dev br8 proto kernel scope link src 10.0.10.1 10.1.1.0/24 dev br0 proto kernel scope link src 10.1.1.1 10.2.2.0/24 dev br2 proto kernel scope link src 10.2.2.1 192.168.1.0/24 dev eth4 proto kernel scope link src 192.168.1.86
關於拓撲的重要說明:10.0.10.0/24 網路是新舊拓撲之間的 VoIP 流量橋接,那裡的舊 VoIP 伺服器具有以下路由表:
# ip route 192.168.1.248/29 dev eth1 proto kernel scope link src 192.168.1.250 10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.1 10.0.1.0/24 dev eth3 proto kernel scope link src 10.0.1.1 10.0.10.0/24 dev eth2 proto kernel scope link src 10.0.10.10 10.0.0.0/8 via 10.0.10.1 dev eth2 default via 192.168.1.254 dev eth1
一些網路看起來有衝突,但它們並沒有真正相互交談。這兩個伺服器之間的唯一通信是
br8
連接到eth2
舊伺服器上的 UDM 上的 VLAN,僅用於 VoIP 流量。路由正在按我的預期工作。VoIP 正在通過伺服器
10.0.10.10
,從舊世界和新世界都可以看到。當我撥打 VoIP 電話時,SIP 協商正確進行,這意味著每部電話都能看到伺服器並進行雙向通話。我唯一的問題是,當 RTP 語音流量開始流動時,有時其中一部電話(取決於發起呼叫的一方)將其發送到舊的 VoIP 伺服器地址(原為 10.0.0.1)而不是新的 10.0。 10.10。儘管被重新配置為使用新地址,並且儘管剛剛與新地址進行了 SIP 協商,但仍會發生這種情況!這是一個星號配置問題,會在 SIP 邀請中發送錯誤的地址,從而欺騙電話。Asterisk 伺服器認為這一切都是一樣的,因為他自己的身份是 10.0.0.1 和 10.0.10.10,但這僅在舊世界中是正確的,在新世界中不是……
因此,在單向音頻通話期間,我在 UDM 上看到了這種流量:
# tcpdump -q -n -c 20 -i any host 10.0.10.10 or host 10.0.2.1833 or host 10.0.10.47 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on any, link-type LINUX_SLL (Linux cooked v1), capture size 262144 bytes 12:20:55.545461 IP 10.0.10.47.5032 > 10.0.0.1.50042: UDP, length 172 12:20:55.545461 IP 10.0.10.47.5032 > 10.0.0.1.50042: UDP, length 172 12:20:55.545461 IP 10.0.10.47.5032 > 10.0.0.1.50042: UDP, length 172 12:20:55.565464 IP 10.0.10.47.5032 > 10.0.0.1.50042: UDP, length 172 12:20:55.565464 IP 10.0.10.47.5032 > 10.0.0.1.50042: UDP, length 172 12:20:55.565464 IP 10.0.10.47.5032 > 10.0.0.1.50042: UDP, length 172 12:20:55.570260 IP 10.0.2.183.50030 > 10.0.10.10.54736: UDP, length 172 12:20:55.570260 IP 10.0.2.183.50030 > 10.0.10.10.54736: UDP, length 172 12:20:55.570313 IP 10.0.2.183.50030 > 10.0.10.10.54736: UDP, length 172 12:20:55.570317 IP 10.0.2.183.50030 > 10.0.10.10.54736: UDP, length 172 12:20:55.570764 IP 10.0.2.183.50030 > 10.0.10.10.54736: UDP, length 172 12:20:55.570764 IP 10.0.2.183.50030 > 10.0.10.10.54736: UDP, length 172 12:20:55.570807 IP 10.0.2.183.50030 > 10.0.10.10.54736: UDP, length 172 12:20:55.570810 IP 10.0.2.183.50030 > 10.0.10.10.54736: UDP, length 172 12:20:55.571077 IP 10.0.2.183.50030 > 10.0.10.10.54736: UDP, length 172 12:20:55.571077 IP 10.0.2.183.50030 > 10.0.10.10.54736: UDP, length 172 12:20:55.571109 IP 10.0.2.183.50030 > 10.0.10.10.54736: UDP, length 172 12:20:55.571111 IP 10.0.2.183.50030 > 10.0.10.10.54736: UDP, length 172 12:20:55.585465 IP 10.0.10.47.5032 > 10.0.0.1.50042: UDP, length 172 12:20:55.585465 IP 10.0.10.47.5032 > 10.0.0.1.50042: UDP, length 172
去 10.0.10.10 的流量可以,去 10.0.0.1 的流量不行。我想重定向它,但我需要你的幫助。
(我知道可以,甚至應該通過某種方式修復 Asterisk 伺服器配置來嘗試解決方案,但是那裡有限制,我只負責重新路由解決方案。詢問重新路由是我的唯一目的這裡的問題)。
UDM 上的目前iptables 配置是這樣的:
# iptables-save # Generated by iptables-save v1.6.1 on Thu May 13 12:28:34 2021 *nat :PREROUTING ACCEPT [149794:35652606] :INPUT ACCEPT [59043:3818189] :OUTPUT ACCEPT [205240:13204474] :POSTROUTING ACCEPT [179113:10974505] :UBIOS_INPUT_JUMP - [0:0] :UBIOS_OUTPUT_JUMP - [0:0] :UBIOS_POSTROUTING_JUMP - [0:0] :UBIOS_POSTROUTING_USER_HOOK - [0:0] :UBIOS_PREROUTING_JUMP - [0:0] -A PREROUTING -j UBIOS_PREROUTING_JUMP -A INPUT -j UBIOS_INPUT_JUMP -A OUTPUT -j UBIOS_OUTPUT_JUMP -A POSTROUTING -j UBIOS_POSTROUTING_JUMP -A UBIOS_POSTROUTING_JUMP -j UBIOS_POSTROUTING_USER_HOOK -A UBIOS_POSTROUTING_USER_HOOK -o eth4 -m comment --comment 00000001095216660481 -j MASQUERADE COMMIT # Completed on Thu May 13 12:28:34 2021 # Generated by iptables-save v1.6.1 on Thu May 13 12:28:34 2021 *mangle :PREROUTING ACCEPT [21051971:19450922056] :INPUT ACCEPT [11815594:10852127372] :FORWARD ACCEPT [9222781:8597163389] :OUTPUT ACCEPT [11762182:10802741148] :POSTROUTING ACCEPT [21125153:19406413016] COMMIT # Completed on Thu May 13 12:28:34 2021 # Generated by iptables-save v1.6.1 on Thu May 13 12:28:34 2021 *filter :INPUT ACCEPT [11703464:10819984868] :FORWARD ACCEPT [9222781:8597163389] :OUTPUT ACCEPT [11762124:10802734194] :UBIOS_FORWARD_IN_USER - [0:0] :UBIOS_FORWARD_JUMP - [0:0] :UBIOS_FORWARD_OUT_USER - [0:0] :UBIOS_FORWARD_USER_HOOK - [0:0] :UBIOS_INPUT_JUMP - [0:0] :UBIOS_INPUT_USER_HOOK - [0:0] :UBIOS_IN_GEOIP - [0:0] :UBIOS_LAN_IN_USER - [0:0] :UBIOS_LAN_LOCAL_USER - [0:0] :UBIOS_LAN_OUT_USER - [0:0] :UBIOS_OUTPUT_JUMP - [0:0] :UBIOS_OUTPUT_USER_HOOK - [0:0] :UBIOS_OUT_GEOIP - [0:0] :UBIOS_WAN_IN_USER - [0:0] :UBIOS_WAN_LOCAL_USER - [0:0] :UBIOS_WAN_OUT_USER - [0:0] -A INPUT -j UBIOS_INPUT_JUMP -A FORWARD -j UBIOS_FORWARD_JUMP -A OUTPUT -j UBIOS_OUTPUT_JUMP -A UBIOS_FORWARD_IN_USER -i eth4 -m comment --comment 00000001095216663481 -j UBIOS_WAN_IN_USER -A UBIOS_FORWARD_IN_USER -i br0 -m comment --comment 00000001095216663482 -j UBIOS_LAN_IN_USER -A UBIOS_FORWARD_IN_USER -i br2 -m comment --comment 00000001095216663483 -j UBIOS_LAN_IN_USER -A UBIOS_FORWARD_IN_USER -i br3 -m comment --comment 00000001095216663484 -j UBIOS_LAN_IN_USER -A UBIOS_FORWARD_IN_USER -i br4 -m comment --comment 00000001095216663485 -j UBIOS_LAN_IN_USER -A UBIOS_FORWARD_IN_USER -i br5 -m comment --comment 00000001095216663486 -j UBIOS_LAN_IN_USER -A UBIOS_FORWARD_IN_USER -i br6 -m comment --comment 00000001095216663487 -j UBIOS_LAN_IN_USER -A UBIOS_FORWARD_IN_USER -i br8 -m comment --comment 00000001095216663488 -j UBIOS_LAN_IN_USER -A UBIOS_FORWARD_JUMP -j UBIOS_FORWARD_USER_HOOK -A UBIOS_FORWARD_OUT_USER -o eth4 -m comment --comment 00000001095216663481 -j UBIOS_WAN_OUT_USER -A UBIOS_FORWARD_OUT_USER -o br0 -m comment --comment 00000001095216663482 -j UBIOS_LAN_OUT_USER -A UBIOS_FORWARD_OUT_USER -o br2 -m comment --comment 00000001095216663483 -j UBIOS_LAN_OUT_USER -A UBIOS_FORWARD_OUT_USER -o br3 -m comment --comment 00000001095216663484 -j UBIOS_LAN_OUT_USER -A UBIOS_FORWARD_OUT_USER -o br4 -m comment --comment 00000001095216663485 -j UBIOS_LAN_OUT_USER -A UBIOS_FORWARD_OUT_USER -o br5 -m comment --comment 00000001095216663486 -j UBIOS_LAN_OUT_USER -A UBIOS_FORWARD_OUT_USER -o br6 -m comment --comment 00000001095216663487 -j UBIOS_LAN_OUT_USER -A UBIOS_FORWARD_OUT_USER -o br8 -m comment --comment 00000001095216663488 -j UBIOS_LAN_OUT_USER -A UBIOS_FORWARD_USER_HOOK -m comment --comment 00000001095216663481 -j UBIOS_FORWARD_IN_USER -A UBIOS_FORWARD_USER_HOOK -m comment --comment 00000001095216663482 -j UBIOS_FORWARD_OUT_USER -A UBIOS_INPUT_JUMP -j UBIOS_INPUT_USER_HOOK -A UBIOS_INPUT_USER_HOOK -i eth4 -m comment --comment 00000001095216663481 -j UBIOS_WAN_LOCAL_USER -A UBIOS_INPUT_USER_HOOK -i br0 -m comment --comment 00000001095216663482 -j UBIOS_LAN_LOCAL_USER -A UBIOS_INPUT_USER_HOOK -i br2 -m comment --comment 00000001095216663483 -j UBIOS_LAN_LOCAL_USER -A UBIOS_INPUT_USER_HOOK -i br3 -m comment --comment 00000001095216663484 -j UBIOS_LAN_LOCAL_USER -A UBIOS_INPUT_USER_HOOK -i br4 -m comment --comment 00000001095216663485 -j UBIOS_LAN_LOCAL_USER -A UBIOS_INPUT_USER_HOOK -i br5 -m comment --comment 00000001095216663486 -j UBIOS_LAN_LOCAL_USER -A UBIOS_INPUT_USER_HOOK -i br6 -m comment --comment 00000001095216663487 -j UBIOS_LAN_LOCAL_USER -A UBIOS_INPUT_USER_HOOK -i br8 -m comment --comment 00000001095216663488 -j UBIOS_LAN_LOCAL_USER -A UBIOS_LAN_IN_USER -d 10.0.10.10/32 -j LOG -A UBIOS_LAN_IN_USER -d 10.0.10.10/32 -m comment --comment 00000001095216662480 -j RETURN -A UBIOS_LAN_IN_USER -s 10.0.10.10/32 -j LOG -A UBIOS_LAN_IN_USER -s 10.0.10.10/32 -m comment --comment 00000001095216662481 -j RETURN -A UBIOS_LAN_IN_USER -s 10.0.2.0/24 -m comment --comment 00000001095216666481 -j RETURN -A UBIOS_LAN_IN_USER -s 10.0.3.0/24 -m comment --comment 00000001095216666482 -j RETURN -A UBIOS_LAN_IN_USER -s 10.0.1.0/24 -m comment --comment 00000001095216666483 -j RETURN -A UBIOS_LAN_IN_USER -s 10.2.2.0/24 -m comment --comment 00000001095216666484 -j RETURN -A UBIOS_LAN_IN_USER -s 10.0.10.0/24 -m comment --comment 00000001095216666485 -j RETURN -A UBIOS_LAN_IN_USER -s 10.1.1.0/24 -m comment --comment 00000001095216666486 -j RETURN -A UBIOS_LAN_IN_USER -s 10.0.0.0/24 -m comment --comment 00000001095216666487 -j RETURN -A UBIOS_LAN_IN_USER -j LOG -A UBIOS_LAN_IN_USER -m comment --comment 00000001097364144127 -j RETURN -A UBIOS_LAN_LOCAL_USER -j LOG -A UBIOS_LAN_LOCAL_USER -m comment --comment 00000001097364144127 -j RETURN -A UBIOS_LAN_OUT_USER -d 10.0.2.0/24 -m comment --comment 00000001095216666481 -j RETURN -A UBIOS_LAN_OUT_USER -d 10.0.3.0/24 -m comment --comment 00000001095216666482 -j RETURN -A UBIOS_LAN_OUT_USER -d 10.0.1.0/24 -m comment --comment 00000001095216666483 -j RETURN -A UBIOS_LAN_OUT_USER -d 10.2.2.0/24 -m comment --comment 00000001095216666484 -j RETURN -A UBIOS_LAN_OUT_USER -d 10.0.10.0/24 -m comment --comment 00000001095216666485 -j RETURN -A UBIOS_LAN_OUT_USER -d 10.1.1.0/24 -m comment --comment 00000001095216666486 -j RETURN -A UBIOS_LAN_OUT_USER -d 10.0.0.0/24 -m comment --comment 00000001095216666487 -j RETURN -A UBIOS_LAN_OUT_USER -j LOG -A UBIOS_LAN_OUT_USER -m comment --comment 00000001097364144127 -j RETURN -A UBIOS_WAN_IN_USER -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment 00000001095216663481 -j RETURN -A UBIOS_WAN_IN_USER -m conntrack --ctstate INVALID -m comment --comment 00000001095216663482 -j DROP -A UBIOS_WAN_IN_USER -m comment --comment 00000001097364144127 -j DROP -A UBIOS_WAN_LOCAL_USER -m conntrack --ctstate RELATED,ESTABLISHED -m comment --comment 00000001095216663481 -j RETURN -A UBIOS_WAN_LOCAL_USER -m conntrack --ctstate INVALID -m comment --comment 00000001095216663482 -j DROP -A UBIOS_WAN_LOCAL_USER -m comment --comment 00000001097364144127 -j DROP -A UBIOS_WAN_OUT_USER -m comment --comment 00000001097364144127 -j RETURN COMMIT
我在網上閱讀了關於按照以下方式做我想做的事情的可能性:
- 標記要在 iptables 中路由的數據包(使用 mangle)
- 為這些數據包使用第二個路由表(添加到 /etc/iproute2/rt_tables)
- 調整該表以將東西發送到需要去的地方
雖然我了解一般概念,但我不是網路專家,我對這些概念不熟悉,我迷失在細節中。我不確定如何標記,以及在第二個表中需要重複多少主路由表。對於這些命令和配置,我將不勝感激。提前致謝!
那麼,如何將 UDM 上指向的所有 UDP 流量
10.0.0.1
在埠中重新路由50000-55000
到介面上的 10.0.10.1br8
?
我終於讓它工作了,所以我將回答我自己的問題。描述為終端命令序列的解決方案不是永久性的,它不會在重新啟動或升級後繼續存在,但我想在教學上專注於路由解決方案(這是我的問題的標題)並將腳本的永久性問題留在最後(更簡單地解釋一下,因為網際網路上還有其他地方可以幫助解決這個問題)。
你應該和我一樣並使用這個解決方案嗎?可能不是。有“警告”,請參閱有關該問題的一些評論。我將嘗試解釋如何做路由技巧,但我不一定推薦它用於其他情況……
創建一個新的路由表:
echo "74 myroutes" >> /etc/iproute2/rt_tables
檢查與
cat /etc/iproute2/rt_tables
將預設路由添加到新路由表:
ip route add default via 10.0.10.10 dev br8 table myroutes
檢查與
ip route list table myroutes
請注意,我可以保持這個非常簡單,因為這裡只有少數非常特定的數據包通過(僅通過特定埠到特定主機)。所以使用這張表的東西都可以朝著
iptables
同一個方向前進,因為它已經被標記徹底“預選”了,見下文。將選中的數據包標記在
iptables
iptables -t mangle -I PREROUTING -p udp -m udp --dport 50000:55000 -d 10.0.0.1 -j MARK --set-mark 0x74
通過添加日誌行來檢查您的條件:
iptables -t mangle -I PREROUTING -p udp -m udp --dport 50000:55000 -d 10.0.0.1 -j LOG --log-prefix "I just marked a packet: "
(記得之後刪除該行。要刪除
iptables
我所做的破壞規則
iptables -L -t mangle -n -v --line-numbers
,然後使用規則編號來執行類似的操作iptables -t mangle -D PREROUTING 2
)確保在繼續之前正確標記預期的數據包!
用於
ip rule
告訴核心將您的新路由表用於那些標記的數據包所以我從這些規則開始:
# ip rule list 0: from all lookup local 32000: from all lookup main 32500: from 192.168.1.86 lookup 201 32766: from all lookup 201 32767: from all lookup default
我需要在第一個規則之前插入我的規則,這比添加新規則要復雜一些(感謝@AB 在使
ip rule
的優先級高於local
中提供的幫助)。警告一句,不要通過弄亂規則將自己鎖定在伺服器之外
local
,這會將您的所有網路都破壞到 UDM 中。網路是進入 UDM 的唯一途徑 :-)…所以以下命令的順序很重要,刪除只能local
在新的“首選項”位置添加相同的規則後完成:ip rule add pref 10 lookup local ip rule add pref 5 fwmark 0x74 lookup myroutes ip rule delete pref 0
所以讓我們檢查一下我們現在有什麼:
# ip rule list 5: from all fwmark 0x74 lookup myroutes 10: from all lookup local 32000: from all lookup main 32500: from 192.168.1.86 lookup 201 32766: from all lookup 201 32767: from all lookup default
通過對比這兩個命令的結果進行檢查:
# ip route get 10.0.0.1 local 10.0.0.1 dev lo src 10.0.0.1 cache <local> # ip route get 10.0.0.1 mark 0x74 10.0.0.1 via 10.0.10.10 dev br8 src 10.0.10.1 mark 0x74 cache
**就是這樣!**現在一切正常,RTP 流量再次流向正確的位置,儘管 Asterisk 伺服器的配置有問題。
使更改在重新啟動和升級後永久生效
非常簡短(不是這個問題的重點)這裡是如何使這些更改在 Ubiquiti UDM 上永久生效。您必須首先安裝udm-utilities並使用如下名稱保存下面的腳本
/mnt/data/on_boot.d/10-add-myroutes.sh
並使用
chmod 700
. 它將作為root
.下面的腳本在啟動時執行上述命令。在需要的地方,有一些技巧可以確保它可以多次執行而不會創建重複的條目。
#!/bin/sh # fail-safe mechanism in case our boot script is causing broken networking # and we need to reboot and rescue by killing script before it runs: sleep 180 grep -qxF '74 myroutes' /etc/iproute2/rt_tables || echo "74 myroutes" >> /etc/iproute2/rt_tables ip route add default via 10.0.10.10 dev br8 table myroutes iptables -t mangle -C PREROUTING -p udp -m udp --dport 50000:55000 -d 10.0.0.1 -j MARK --set-mark 0x74 || iptables -t mangle -I PREROUTING -p udp -m udp --dport 50000:55000 -d 10.0.0.1 -j MARK ip rule list | grep $'10:\tfrom all lookup local' || ip rule add pref 10 lookup local ip rule list | grep $'5:\tfrom all fwmark 0x74 lookup myroutes' || ip rule add pref 5 fwmark 0x74 lookup myroutes # the following logic is a bit different: for safety, we want to ensure the delete only happens when the other "local" line is there ip rule list | grep $'10:\tfrom all lookup local' && ip rule delete pref 0
ip rule delete pref 0
如果進行更改,請在沒有本地規則的情況下對您可能無法訪問設備的部分非常小心。如果發生這種情況,請重新啟動,在腳本一開始處於 3 分鐘睡眠狀態時快速重新登錄,然後將其殺死(出於自衛!)。
這是“基於策略的路由”的任務 基於策略的路由允許您配置複雜的路由方案。例如,您可以根據各種標準路由數據包,例如源地址、數據包元數據和包括協議。
我不確定是否可以在 UDM 上完成 - 但這裡是 USG 的連結:
https://help.ui.com/hc/en-us/articles/360005460813-UniFi-USG-Advanced-Policy-Based-Routing-