名前空間とWireguardを共有する方法は?

名前空間とWireguardを共有する方法は?

wg0$ DAYJOB管理ネットワーク内の信頼できるシステムへのワイヤーガード接続(インターフェース名)があります。通常、wg0を使用したくありません。みんな私のトラフィックは172.16.0.0/12の範囲のIPアドレスにのみ適用されます。これは、次のスタンザを使用して簡単に実行できます/etc/wireguard/wg0.conf

[Peer]
# ...
AllowedIPs  = 172.16.0.0/12

ただし、Firefox プロファイルでは、トラフィックが 172.16.0.0/12 に移動しなくても、すべてが wg0 経由でルーティングされることを望みます。また、DNSの場合は通常dnscrypt-proxy + dnsmasqを使用しますが、wg0トラフィックの場合は$ DAYJOBのネームサーバーを使用したいと思います。

私はできます。ほぼip netnsvethペアを使用してネットワーク名前空間を作成して、これらの制約を一致させます。名前空間内で、デフォルトのresolv.confを代替ネームサーバーを含むresolv.confに置き換えることができます。唯一の問題は、wg0を次のように使用する方法がまだ見つかっていないことです。ただパケットがネームスペースから外れる方法。

  • デフォルト以外のDNSを使用する:✓
  • 名前空間から172.16.0.0/12へのトラフィックはwg0を介して正しくルーティングされます。 ✓
  • 名前空間から出る他のすべてのトラフィックもwg0を通過します。 ✗

ラインバッカーnetns関連ドキュメントしかし、それでも名前空間外のwireguardインターフェイスが必要ないと仮定しているようです。私は名前空間の外にあるすべてがまだWireguardインターフェイスにアクセスできるようにしたいです。

いくつかのソース:1、同様の操作にはVLANを使用することをお勧めします。ただし、wireguardインターフェイスはVLANをサポートしていないようです。何が起こるかは次のとおりです。

$ sudo ip link add link wg0 name wg0.4 type vlan id 4
$ sudo ip netns add ns-wg-test-1
$ sudo ip link set wg0.4 netns ns-wg-test-1
$ sudo ip netns exec ns-wg-test-1 su -c "/bin/bash -l" $USER
$ sudo ip addr add 192.168.126.2 dev wg0.4
$ sudo ip link set dev wg0.4 up
RTNETLINK answers: Cannot assign requested address

今、私は問題のあるさまざまな選択肢の間で対立しています。

可能性1:2番目のWireguardインターフェイスを追加します。これはで行われなければなりません/etc/wireguard/wg1.conf。これが可能なのか良い考えなのかは不明です。複数のワイヤガードインターフェイスと冗長構成を持つことはエレガントではないようです。

可能性2:ip routeルールのいくつかの組み合わせを追加して、名前空間iptables -Aから出るすべてのエントリを強制的にwg0として指定します。しかし、あるインターフェイスからのすべての着信トラフィックを別のインターフェイスに強制的にルーティングする方法を明確に説明する例やドキュメントを見たことはありません。繰り返しますが、私はこれが良いアプローチであるかどうかについてある程度懐疑的です。

可能性3:Wireguardのドキュメントを信頼してください。 wg0をネームスペース内に配置し、ネームスペース外のすべての172.16.0.0/12トラフィックがネームスペースに接続されているvethペアを通過するように指示します。名前空間内には、vethペアのすべてのエントリをwg0に渡すルーティング/ファイアウォールルールがあります。このソリューションの問題は、機能していても名前空間が常にアクティブでなければならないことです。今朝、名前空間を有効にしているかどうかにかかわらず、172.16.0.0/12へのトラフィックが常にwg0への道を見つけるようにしたいと思います。

したがって、質問は次のとおりです。名前空間外のWireGuardへのアクセスを維持しながら、WireGuardインターフェイスをネットワーク名前空間と共有するための最良かつ最も標準的な方法は何ですか?

これは意見に基づくものではありません。強力で効率的で安全でスクリプト可能な実際の例を見ると、答えが正しいことがわかります。クロスプラットフォームである必要はありません。私はVoid Linux(時にはArch Linux)でのみこれを行います。

あるいは、ベンチャー全体が悪い考えであるか、何らかの理由で実装が不可能な場合、否定的な答えには、理由を説明する主張、証拠、および引用が含まれる可能性があります。より良い結果が出ない場合は、まだ正しいとマークします。

ベストアンサー1

したがって、質問は次のとおりです。名前空間外のWireGuardへのアクセスを維持しながら、WireGuardインターフェイスをネットワーク名前空間と共有するための最良かつ最も標準的な方法は何ですか?

IMO、良いアプローチは、次を使用することです。ポリシーベースのルーティングこのために。たとえば、「インターフェイスAからのすべてのパケットはルートテーブルBを使用する必要があります。ここで、インターフェイスAはnetnsの外部のveth / bridgeインターフェイスであり、ルートテーブルBにはwireguardインターフェイスを介したパスのみが含まれます(もちろん、元のネットワークに戻るルーティング) iproute2))名前空間)。

# echo "100 dayjob" >> /etc/iproute2/rt_tables
# ip route add <wireguard glue net> dev wg0 table dayjob
# ip route add default via <wireguard gw> dev wg0 table dayjob
# ip route add <netns net> dev <veth/bridge interface> table dayjob
# ip rule add iif <veth/bridge interface> lookup table dayjob

おすすめ記事