기본적으로 사용 가능한 모든 주소를 수신하는 대신 특정 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 규칙이 추가될 수 있지만 이는 포트 바인딩과 거의 동일함)을 추가하고 다른 네임스페이스에 남아 있는 경우 그러면 터널링 페이로드를 위해 추가 라우팅 계층이 필요합니다.