Wireguardは受信アドレスを指定します。

Wireguardは受信アドレスを指定します。

デフォルトでは、利用可能なすべてのアドレスを受信するのではなく、特定の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ルールが追加されるかもしれませんが、これはポートバインディングとほぼ同じです)を追加し、他の名前空間に残っている場合はトンネリングペイロードには追加のルーティング層が必要です。

おすすめ記事