Iptables

特定埠範圍的路由流量

  • May 22, 2021

我有一個 Ubiquiti Dream Machine (UDM),它是一個項目的一部分,該項目正在用不同的拓撲替換網路拓撲。這涉及 Internet 流量和 VoIP(Asterisk)。在分階段引入新拓撲的過程中,由於我們在配置 Asterisk 伺服器時的限制,我有以下要求:

10.0.0.1在 UDM 上,我需要將埠中指向的所有 UDP 流量重新路由50000-5500010.0.10.1介面上br8

我懷疑這可以通過 UI 實現,但我可以通過 SSH 訪問 UDM,我可以在其中修改iptablesip 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-

引用自:https://serverfault.com/questions/1063428