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_ANYIN6ADDR_ANY_INIT/ &in6addr_any(이전 글머리 기호와 상호작용 가능) 대신 사용할 주소를 선택하고 ,
  • 물론 코드의 모든 부분을 변경하면 다른 사항이 예상됩니다.

그런 다음 사용 사례와 OS 간 호환성을 달성하려면 WireGuard의 사용자 공간 변형 및 기타 커널(예: FreeBSD) 변형에 대해서도 이 작업을 수행해야 합니다.


또한 일부 원하는 사용 사례의 경우:

  • WireGuard 터널 봉투가 단일 주소, 단일 인터페이스 또는 단일 IP 버전(예: IPv6만)에서만 연결할 수 있도록 허용합니다.

    방화벽을 사용하여 이 주소나 인터페이스 또는 IP 버전/제품군에만 액세스하도록 제한하세요.

  • 여러 개의 서로 다른 WireGuard 인터페이스가 서로 다른 인터페이스에서 동일한 포트를 사용할 수 있도록 허용합니다.

    이를 다른 포트에 설정하고 NAT 규칙(일반적으로 초기 수신 사례의 사전 라우팅에는 DNAT, 초기 송신 사례의 사후 라우팅에는 SNAT)을 사용하여 표시되는 포트가 사용된 실제 포트와 일치하도록 만듭니다.

  • 호스트에서 UDP 포트 바인딩 방지

    최소한 처음 생성될 때 WireGuard를 자체 네임스페이스에 숨기면 WireGuard 포트가 그 안에 유지됩니다. 그런 다음 터널 엔벨로프(즉, 어디에 있든 이 UDP 포트)에 도달하기 위해 라우팅의 추가 계층(아마도 NAT 규칙이 추가될 수 있지만 이는 포트 바인딩과 거의 동일함)을 추가하고 다른 네임스페이스에 남아 있는 경우 그러면 터널링 페이로드를 위해 추가 라우팅 계층이 필요합니다.

관련 정보