2020 年及以後的蹩腳 UDP 路由器。
所以我正在和 Roon 一起玩,我有一個複雜的家庭網絡,這讓 Roon 陷入困境。我開始調試,結果發現 Roon 向 UDP/9003 發送廣播訊息。我的防火牆/路由器當然不會轉發這些訊息,因為這是正確的做法。
不幸的是,我真的希望將這些廣播訊息轉送到本地網路上的其他 VLAN/子網路。我開始使用 udp-proxy-relay-redux,一開始效果很好。
但我也非常喜歡透過 OpenVPN 連接轉發的這些訊息,這些訊息利用tun
驅動程序,這是一個點對點接口,並且明確不支援廣播。這對於 udp-proxy-relay-redux 效果不佳,因為 Roon 表現不佳,仍然嘗試向 .255 位址發送“廣播”,然後這些廣播被丟棄在地板上,因為我的 VPN 伺服器沒有位址 xxx255。基本上,在點對點介面上,這些「廣播」被視為發送到另一台主機的封包並被理所當然地忽略。
udp-proxy-2020
不使用普通的 UDP 套接字來偵聽廣播訊息,而是使用 libpcap 來「嗅探」UDP 廣播訊息。這意味著它對於「看到」的資料包可以更加靈活,因此它可以透過 libpcap/資料包注入將它們發送到所有其他配置的介面。如果這讓你感到“奇怪”,那麼,歡迎來到 2020 年。
我是用 GoLang 編寫的,因此至少交叉編譯到隨機的 Linux/FreeBSD 路由器/防火牆上相當容易。沒有醜陋的交叉編譯 C 或嘗試安裝 Python/Ruby 和一堆函式庫。
還有:哈哈哈哈哈哈哈哈哈!這些都不是真的!需要使用 libpcap 意味著我必須使用 CGO 進行交叉編譯,因為 gopacket/pcapgo 僅支援 Linux 讀取和寫入(乙太網路?)網路介面。
幾乎所有類別 Unix 系統都受支持,因為依賴項列表只有libpcap
和golang
。我在 MacOS 上進行開發,特別針對 pfSense/FreeBSD 和 Ubiquiti USG、EdgeRouter 和 DreamMachine/Pro,因為這些在 Roon 用戶社群中很常見。
如果您使用的是基於 Linux RedHat 或 Debian 的發行版,最簡單的安裝方法是取得適當的.rpm
或.deb
檔案並使用套件管理器進行安裝。然後編輯/etc/udp-proxy-2020.conf
並透過以下方式啟動: systemctl start udp-proxy-2020
。
還有一個適用於 AMD64 和 ARM64 上的 Linux 的 docker 映像(如 Ubiquiti UDM)。
請注意,對於 Docker 部署,您應該使用主機網路。
我發布了適用於 Intel、ARM 和 MIPS 硬體的 Linux、FreeBSD (pfSense) 和 MacOS 的二進位檔案。
現在啟動腳本目錄中提供了說明和啟動腳本。如果您知道如何添加對另一個平台的支持,請向我發送拉取請求!
執行udp-proxy-2020 --help
以取得目前命令列選項清單。
另外,請注意,在許多作業系統上,您需要以root
使用者身分執行它。 Linux 系統可以選擇授予CAP_NET_RAW
功能。
目前您可能只需要擔心幾個標誌:
--interface
-- 指定要偵聽的兩個或多個網路介面。--port
-- 指定一個或多個要監控的 UDP 連接埠。--level
-- 指定日誌等級:[trace|debug|warn|info|error]進階選項:
--fixed-ip
-- 硬編碼@以始終向其發送流量。對於站點到站點模式下的 OpenVPN 等非常有用。--timeout
-- pcap 超時值的毫秒數。 (預設為250毫秒)--cache-ttl
-- 快取 IP 的分鐘數。 (預設值為 180 分鐘/3 小時)如果您在 OpenVPN 隧道上將流量傳遞到用戶端時遇到問題,並且由於客戶端沒有固定 IP 而無法使用--fixed-ip
則可能需要增加此值。--no-listen
-- 不監聽指定的 UDP 連接埠以避免衝突--deliver-local
-- 在環回介面上本地傳送資料包當然還有其他標誌,運行./udp-proxy-2020 --help
以獲得完整列表。
例子:
udp-proxy-2020 --port 9003 --interface eth0,eth0.100,eth1,tun0 --cache-ttl 300
將在四個介面上轉送 udp/9003 封包:eth0、eth1、eth0 和 tun0 上的 VLAN100。 tun0 上的客戶端 IP 一旦獲知就會被記住 5 分鐘。
注意:「學習」需要客戶端先發送udp/9003報文!如果您的應用程式需要先向客戶端發送訊息,那麼您需要指定--fixed-ip=1.2.3.4@tun0
,其中1.2.3.4
是 tun0 上客戶端的 IP 位址。
我已經測試了兩種「公路戰士」VPN 配置,其中 Roon 用戶端在我的筆記型電腦上運行,並透過 OpenVPN 和 Wireguard 連接回我的家庭防火牆。我個人使用 Wireguard 而不是 OpenVPN,因為它更安全且效能更好。
我還使用 Wireguard + pfSense 測試了網站到網站 VPN。我按照 pfSense 站點到站點 Wireguard VPN 說明進行操作,並在兩個防火牆上安裝了udp-proxy-2020
。您必須設定--interface
選項以包含 LAN 和 Wireguard 網路介面。
如果您正在為打算運行udp-proxy-2020
同一平台進行構建,那麼您只需確保擁有libpcap
和必要的標頭(您可能需要一個-dev
包)並根據需要運行make
或gmake
(我們需要GNU Make ,而不是BSD Make)。
如果您需要建立跨平台,那麼以下目標之一可能會幫助您:
make linux-amd64
make linux-mips64
(適用於 Ubiquiti USG/EdgeRouter 的 Linux/MIPS64 big-endian)make linux-arm
:make freebsd
(pfSense 2.6)make docker
您可以透過執行make help
來取得 make 目標的完整清單以及有關它們的基本資訊。
從 v0.0.11 開始, udp-proxy-2020
現在預設在指定的--port
上建立 UDP 偵聽套接字。這可以防止底層作業系統發出 ICMP 連接埠不可達訊息,該訊息可能會破壞某些用戶端(特別是 Roon iOS 用戶端)。
您唯一需要使用--no-listen
標誌的情況是,如果有另一個軟體與udp-proxy-2020
在同一主機上執行。
從 v0.1.0 開始,是的。您需要指定--deliver-local
和--no-listen
選項,以便它透過環回介面傳送封包。
這些標誌用於調試udp-proxy-2020
的問題。當我指示您這樣做時,您應該使用這些標誌作為您為udp-proxy-2020
開立的票證的一部分。
來自 Github 上的發布頁面。
不,這不是代理。它更像是路由器。除了在家庭路由器/防火牆上運行之外,您不需要進行任何更改。
老實說,我並沒有對這個名字想太多,這是我首先想到的。另外,命名也很難。
tun
接口,如 OpenVPN 使用的接口raw
接口,例如 Wireguard 使用的接口vti
接口請注意,Linux 上的 L2TP VPN 隧道與 udp-proxy-2020 不相容,因為 Linux 核心將這些介面公開為 Linux SLL,而 Linux SLL 不提供封包的準確解碼。
所以我自己還沒有這樣做,但 Bart Verhoeven 在 Roon 社群論壇上寫了這個非常詳細的操作方法。
udp-proxy-2020 是為多個作業系統和硬體平台建構的:
darwin-amd64
linux-amd64
linux-arm64
(RasPi 2 V1.2以上版本、Ubiquiti UniFi Dream Machine)linux-armv7
(RasPi 2 V1.1及以下版本)linux-armv6
linux-armv5
linux-mips64
(Ubiquiti USG/EdgeRouter)freebsd-amd64
(與 x86 上的 pfSense 搭配使用)freebsd-arm64
(Netgate SG-1100 和 SG-2100)freebsd-armv7
(Netgate SG-3100)老實說,只要給我發一封電子郵件表示感謝或在 GitHub 上「星標」這個專案就足夠了,謝謝。
偶爾會有人問要不要給我幾塊錢,但我真的不需要錢。如果你仍然願意為我捐幾塊錢,我寧願你捐給我當地的第二個豐收食物銀行,它可以讓你的錢比我更好地發揮作用。