デフォルトでは、利用可能なすべてのアドレスを受信するのではなく、特定のIPアドレスから着信接続のみを受信するようにLinuxwireguardモジュールを設定する方法はありますか?これに関するドキュメントが見つかりません。
答え1
WireGuardのLinuxカーネルモジュールは、トンネルに使用するインターフェイスのIPアドレスを選択できません。
特にOPに続きコメントIPv4にバインドせずにIPv6にのみバインドするには、次のように常にIPv4を使用します。外部互換モジュールまたはアップストリームモジュール:
int wg_socket_init(struct wg_device *wg, u16 port) {
struct socket *new4 = NULL, *new6 = NULL; struct udp_port_cfg port4 = { .family = AF_INET, .local_ip.s_addr = htonl(INADDR_ANY), .local_udp_port = htons(port), .use_udp_checksums = true }; #if IS_ENABLED(CONFIG_IPV6) int retries = 0; struct udp_port_cfg port6 = {
ret = udp_sock_create(net, &port4, &new4); if (ret < 0) { pr_err("%s: Could not create IPv4 socket\n", wg->dev->name); goto out; }
IPv4ソケットの作成(および可能であればIPv6)は必須であり、常に使用されますINADDR_ANY
。
質問のタイトルを解決するには、コードを複数回修正する必要があります。
- 使用または無効にするプロトコルを選択し、
INADDR_ANY
およびIN6ADDR_ANY_INIT
/&in6addr_any
(前の箇条書きと対話可能)の代わりに使用するアドレスを選択し、- もちろん、コードのすべての部分を変更すると、他のことが予想されます。
その後、ユースケースとOS間の互換性を実現するには、WireGuardのユーザースペースバリアントや他のカーネル(FreeBSDなど)バリアントに対してもこれを行う必要があります。
また、いくつかの目的のユースケースの場合:
WireGuardトンネルエンベロープが単一のアドレス、単一のインターフェイス、または単一のIPバージョン(IPv6のみ)でのみ接続できるようにします。
ファイアウォールを使用して、このアドレスまたはインターフェイス、またはIPバージョン/製品ファミリにのみアクセスするように制限します。
複数の異なる WireGuard インターフェイスが異なるインターフェイスで同じポートを使用できるようにします。
これを別のポートに設定し、NATルール(通常は初期受信ケースの事前ルーティングにはDNAT、初期送信ケースの事後ルーティングにはSNAT)を使用して、表示されるポートを使用した実際のポートと一致させます。
ホストでUDPポートバインディングを防止する
少なくとも最初に作成されたときにWireGuardを独自の名前空間に隠すと、WireGuardポートはその中に残ります。その後、トンネルエンベロープ(つまり、どこにいてもこのUDPポート)に到達するために、ルーティングの追加層(おそらくNATルールが追加されるかもしれませんが、これはポートバインディングとほぼ同じです)を追加し、他の名前空間に残っている場合はトンネリングペイロードには追加のルーティング層が必要です。