Unixが分割トンネリングを処理する方法

Unixが分割トンネリングを処理する方法

私はどのプログラムが通常のインターネットに接続し、どのプログラムがVPNを介してのみ通信できるかを最も簡単で汎用性が高く安全な方法でサーバーから制御できるようにしたいと思います。

現在の設定

私のルーターに接続されている1GBのRAMを搭載したRaspberry Pi 4Bサーバーがあります。 RPI に転送するポートは Wireguard インターフェイスです。ワークグループ0、転送ピアのためのすべてのプライベートデバイスとポートに使用します。

RPIでいくつかのサービスを実行しています。そのうちのいくつかはVPNにルーティングしたいのですが(例:Searx、Transmission)、残りはVPNにバインドされています。ワークグループ0インターフェイス(Jellyfinなど)と、将来のRPIにポートを公開して公開したいインターフェイス(Minecraft Serverなど)。

現在私が使用している極細糸束私のファイアウォールは次のものをブロックしません。ワークグループ0同じWireguardインターフェイスのポートと転送用のピアポートも同じです。

私の目標

私のサーバーから自分のサーバーに接続できるように、どのプログラムがどの方向に移動するかを構成できるエレガントなソリューションを見つけたいと思います。ワークグループ0どこにもインターフェイスがありますが、一部のプログラムはVPNを使用して外部の世界と通信します。

研究完了

これまで私はMulvad VPNがシンプルなWireguardインターフェイスとして使用できることを知っています。出典:アーチウィキ- 他のVPNプロバイダにも同様に適用されるようです。

また、Searxなどの一部のプログラムでは、設定を介して特定のインターフェイスに送信される要求をバインドする可能性を提供するだけでなく、設定を介してsource_ips他のインターフェイスで受信するようにアドレスをバインドすることも可能ですbind_address。つまり、発信要求を次からリダイレクトできます。 VPNをダウンロードし、私のサイトからダウンロードしてください。ワークグループ0ネットワーク。

ほとんどのVPNクライアントは、すでに任意のプログラムに対してこの分割トンネリング機能をサポートしているようです。これは、クライアントが何らかの方法でこれを行うことができることを意味します(VPN接続から特定のプログラムを削除する)!そしてオープンソースなので、解決策も知られていなければなりません。

私の質問/懸念

これでこれを行い、アウトバウンドSearxをVPNにバインドし、Webインターフェイスをワークグループ0。これは質問1を要求します。この場合、DNSはどのように機能しますか? Searchxが実行したすべてのDNS要求はVPNを介してルーティングされますか?これは自動的に設定されますか、手動で設定されますか、それともサポートされていない可能性がありますか?

私はまた、Dockerがこの都市で最もクールなツールであることを知っており、ユーザーが事前設定された環境でアプリケーションをサンドボックス化できるようにすることで、特定のコンテナへのネットワーク接続を強制することができます。これにより質問2が発生します。 RPIがあっても、この場合はdockerを使用する必要がありますか?

パフォーマンス上の理由とミニマリズムの利益のために必要な場合を除き、Dockerを式から除外したいと思います。これにより質問3が発生します。プログラムが許可しない場合でもそれをルーティングできますか?特定のインターフェイスの設定プログラミング?これはLinuxが後で行うことのようです。インターネットに複数のインタフェースが接続されている場合、プログラム自体ではなく、プログラムが使用するインタフェースを決定するのはOSのようです。これに対する責任は誰にありますか?

明らかに、VPNクライアントがこれを行うことを知っていると、質問3はあまり意味がなく、可能になりますが、実装方法がわかりません。

最後に、質問4はより一般的な質問です。プログラムはIPアドレスを知る必要がありますか? Searxでは、発信インターフェイスではなく発信IPを指定する必要があるためです。ほとんどのVPNには固定IPがあるため、とにかく問題にならないようです。そうですか?

小さなメモ

私が言ったようにDockerについて聞いたことはありませんが、使用を避けようとしています。

私はiptablesについて聞いたことがありますが、どのように使用しているのかわからず、UFWと衝突することも知っています。

答え1

同様の問題があります。最初は次のように解決しました。このガイドiptablesを使用してください。この方法を使用するには、トラフィックがVPNを使用する必要があるユーザーを作成する必要があります。 iptablesはアプリケーション固有のフィルタリングをサポートしていないためです。

Fedoraに移行すると、ファイアウォールがiptablesの低レベル使用と競合する可能性があることを心配し、最終的にネットワークネームスペースを使用して分割トンネリングを管理する代替方法を見つけました。デフォルトでは、ネットワークネームスペースを設定し、VPNトンネルをデフォルト/専用パスに設定し、ネームスペース内でプライベートにするアプリケーションを実行します。特定のユーザーを維持する必要がないという点が大きな利点だと思います。

一つある名前空間-openvpn Pythonスクリプト名前空間を簡単に作成し、その中でopenvpnを実行できます。このリポジトリのドキュメントは非常に技術的ですが、名前空間-openvpnを使用した急流ガイド。ここに含まれる情報のほとんどはすべてのアプリケーションに適用され、一度読んでみると、ユーザー固有/iptablesアプローチよりも設定がはるかに簡単であることがわかりました。

関連情報