LinuxでさまざまなOpenVPNトンネルを介してさまざまなユーザーをルーティングする方法は?

LinuxでさまざまなOpenVPNトンネルを介してさまざまなユーザーをルーティングする方法は?

設定:

サーバー/クライアントIPがそれぞれ10.10.1.1/10.10.1.2、10.10.2.1/10.10.2.2、および10.10の「client1」、「client2」、および「client3」というラベルの付いた複数の静的キーOpenVPNクライアント/サーバー構成があります。 3.1/10.10.3.2 は、それぞれ Linux サーバーと Linux クライアントでホストされています (それぞれ、異なる tunX インターフェイスを使用する 3 つの openvpn プロセスがあります)。私のLinuxクライアントシステムには、「client1」、「client2」、「client3」という3人のユーザーがいます。私のサーバーは、10.10.1.2のclient1からの着信トラフィックが1つのIPからインターネットに出て(iptablesの-j SNATを介して)、10.10.2.2のclient2が別のIPに出るようにNATを実行するように設定されています。

質問:

クライアント Linux システムが OpenVPN トンネルを介して各ユーザーのトラフィックを正しい OpenVPN サーバー IP に正しくルーティングできるようにする方法はありません。デフォルトでは、私はclient1のすべてのインターネットトラフィックがOpenVPNサーバーの1つのインターネット接続IPから出て行き、client2のトラフィックが別のIPから出たくなり、追加したいユーザーの数に応じて進みます。 。ただし、これはすべての異なるクライアントユーザーをホストする1つのシステムで実行する必要があります。 iptables機能には、ユーザーIDでパケットにタグを付け、そのタグに基づいてIPパスを設定することが含まれていることがわかりますが、実際に実装する方法はわかりません。

この問題に役立つiptables/netfilter/etcの専門家はいますか?

答え1

iptables生成プロセスのUIDに基づいてパケットにタグを付けることができます。 (詳細)ルーティング(ip ruleman ipまたはman ip-rule;キーワード「fwmark」)とDNATにこのNetfilterマークを使用できます。どちらがより簡単で良いかわかりません。

編集1 各ユーザーについて:

iptables -t mangle -A PREROUTING -m owner --uid-owner $user -j MARK --set-mark $usermark
# one line in /etc/iproute2/rt_tables (numbers don't matter)
ip route add default via $user_gw_ip dev $user_if src $user_if_local_ip table $user_table
ip rule add type unicast fwmark $usermark priority 100 table $user_table

関連情報