2020 年以降向けのくだらない UDP ルーター。
それで、私は Roon で遊んでいますが、Roon をループさせる複雑なホーム ネットワークがあります。デバッグを開始したところ、Roon がブロードキャストメッセージを UDP/9003 に送信していることが判明しました。もちろん、私のファイアウォール/ルーターはこれらのメッセージを転送しません。それが正しいことだからです。
残念ながら、これらのブロードキャスト メッセージをローカル ネットワーク上の他の VLAN/サブネットに転送したいと考えています。私は udp-proxy-relay-redux を使い始めましたが、最初はうまくいきました。
しかし、私はまた、ポイントツーポイントインターフェイスであり、ブロードキャストを明示的にサポートしていないtun
ドライバーを利用する OpenVPN 接続経由で転送されるこれらのメッセージもとても気に入っています。これは、udp-proxy-relay-redux ではうまく機能しませんでした。Roon の動作が悪く、依然として .255 アドレスに「ブロードキャスト」を送信しようとするため、私の VPN サーバーにはアドレス xxx255 がないため、それらのアドレスはフロアにドロップされます。基本的に、ポイントツーポイント インターフェイスでは、これらの「ブロードキャスト」は別のホスト宛てのパケットとして扱われ、正当に無視されていました。
通常の UDP ソケットを使用してブロードキャスト メッセージをリッスンする代わりに、 udp-proxy-2020
libpcap を使用して UDP ブロードキャスト メッセージを「盗聴」します。これは、どのパケットを「認識」するかについてより柔軟になることができるため、libpcap/パケットインジェクションを介して他のすべての構成済みインターフェイスにパケットを送信できることを意味します。これを聞いて「えー」と思った方は、2020 年へようこそ。
私はこれを GoLang で書いているので、少なくとも、ランダムな Linux/FreeBSD ルーター/ファイアウォール上でのクロスコンパイルはかなり簡単です。醜い C のクロスコンパイルや、Python/Ruby や多数のライブラリのインストールを試みる必要はありません。
また:ははははははは!どれも真実ではありません! libpcap を使用する必要があるということは、CGO を使用してクロスコンパイルする必要があることを意味します。gopacket/pcapgo は、(イーサネット?) ネットワーク インターフェイスへの読み取りと書き込みに関して Linux のみをサポートしているためです。
依存関係リストはlibpcap
とgolang
のみであるため、ほとんどすべての Unix 系システムがサポートされます。私は 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 用のバイナリをリリースしています。
これで、startup-scripts ディレクトリに指示と起動スクリプトが追加されました。別のプラットフォームのサポートを追加する方法を見つけたら、プル リクエストを私に送ってください。
udp-proxy-2020 --help
を実行すると、コマンド ライン オプションの現在のリストが表示されます。
また、多くのオペレーティング システムでは、 root
ユーザーとして実行する必要があることに注意してください。 Linux システムは、オプションでCAP_NET_RAW
機能を付与できます。
現時点では、おそらく考慮する必要があるフラグはいくつかあるだけです。
--interface
-- リッスンする 2 つ以上のネットワーク インターフェイスを指定します。--port
-- 監視する 1 つ以上の UDP ポートを指定します。--level
-- ログ レベルを指定します: [trace|debug|warn|info|error]詳細オプション:
--fixed-ip
-- トラフィックを常に送信する @ をハードコードします。サイト間モードの OpenVPN などに役立ちます。--timeout
-- pcap タイムアウト値のミリ秒数。 (デフォルトは250ms)--cache-ttl
-- IP をキャッシュする分数。 (デフォルトは 180 分 / 3 時間) クライアントに固定 IP がないために--fixed-ip
使用できない場合、OpenVPN トンネルでクライアントにトラフィックを渡すときに問題が発生する場合は、この値を増やす必要がある場合があります。--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 パケットを 4 つのインターフェイス (eth0、eth1、eth0 上の VLAN100、および tun0) に転送します。 tun0 のクライアント IP は、一度学習されると 5 分間記憶されます。
注: 「学習」するには、クライアントが最初に udp/9003 メッセージを送信する必要があります。アプリケーションで最初にクライアントにメッセージを送信する必要がある場合は、 --fixed-ip=1.2.3.4@tun0
を指定する必要があります。ここで、 1.2.3.4
は tun0 上のクライアントの IP アドレスです。
私は、ラップトップ上で実行されている Roon クライアントを使用し、OpenVPN と Wireguard 経由で自宅のファイアウォールに接続して、両方の「ロードウォリアー」VPN 構成をテストしました。私は個人的に OpenVPN の代わりに Wireguard を使用しています。安全性とパフォーマンスが優れているからです。
Wireguard + pfSense を使用してサイト間 VPN もテストしました。 pfSense のサイト間 Wireguard VPN の指示に従い、両方のファイアウォールにudp-proxy-2020
をインストールしました。 LAN と Wireguard ネットワーク インターフェイスの両方を含めるように--interface
オプションを構成する必要があります。
udp-proxy-2020
を実行する予定と同じプラットフォーム用にビルドしている場合は、 libpcap
と必要なヘッダー (そのためには-dev
パッケージが必要な場合があります) があることを確認し、必要に応じてmake
またはgmake
実行するだけです ( BSD Make ではなく GNU Make が必要です)。
クロスプラットフォームを構築する必要がある場合は、次のターゲットのいずれかが役立つ可能性があります。
make linux-amd64
make linux-mips64
。make linux-arm
。make freebsd
make docker
で udp-proxy-2020 を実行するための Docker イメージmake help
実行すると、make ターゲットの完全なリストとそれらに関する基本情報を取得できます。
v0.0.11 以降、 udp-proxy-2020
デフォルトで、指定された--port
上に UDP リスニング ソケットを作成するようになりました。これにより、基盤となる OS が特定のクライアント (特に Roon iOS クライアント) を破壊する可能性のある ICMP ポート到達不能メッセージを発行するのを防ぎます。
--no-listen
フラグを使用する必要があるのは、 udp-proxy-2020
と同じホスト上で実行されている別のソフトウェアがある場合のみです。
v0.1.0 では、はい。ループバック インターフェイス経由でパケットを配信するには、 --deliver-local
および--no-listen
オプションを指定する必要があります。
これらのフラグはudp-proxy-2020
に関する問題をデバッグするためのものです。 udp-proxy-2020
に対してオープンしたチケットの一部としてこれらのフラグを使用するように指示された場合は、これらのフラグを使用する必要があります。
Github のリリース ページより。
いいえ、プロキシではありません。それはルーターに似ています。ホームルーター/ファイアウォールで実行する以外に変更を加える必要はありません。
正直、名前についてはあまり考えず、最初に思いついたのがこれでした。あと、ネーミングも難しいですね。
tun
インターフェイスraw
インターフェイスvti
インターフェイスLinux カーネルはこれらのインターフェイスを Linux SLL として公開し、パケットの正確なデコードを提供しないため、Linux 上の L2TP VPN トンネルは udp-proxy-2020 と互換性がないことに注意してください。
私自身はこれを行ったことはありませんが、Roon コミュニティ フォーラムの Bart Verhoeven が非常に詳細な方法を書いています。
udp-proxy-2020 は、複数の OS およびハードウェア プラットフォーム向けに構築されています。
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 でこのプロジェクトに「スター」を付けるだけで十分です。
時々、数ドルくれと言われる人がいますが、本当にお金は必要ありません。それでも数ドルを私に寄付したいのであれば、私の地元にあるセカンドハーベスト・フードバンクに寄付していただき、私よりもより良い活動にあなたのお金を使っていただけると幸いです。