You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何macOS配置会阻止IPv4映射IPv6的UDP响应?

macOS下IPv6套接字发送DNS请求无响应的调试问题

通过IPv6套接字向IPv4地址发送DNS请求时,请求已发出但响应始终无法到达程序。该问题最初出现在使用Netty DNS解析器的Java程序中,以下是复现问题的C代码:

#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <stdio.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <stdlib.h>

int main() {
    int sock,bytes_recv,sin_size;
    struct sockaddr_in6 server_addr6;
    // DNS Packet for www.googleapis.com
    char send_data[] = {60, 15, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 3, 119, 119, 119, 10, 103, 111, 111, 103, 108, 101, 97, 112, 105, 115, 3, 99, 111, 109, 0, 0, 1, 0, 1, 0, 0, 41, 16, 0, 0, 0, 0, 0, 0, 0};
    char recv_data[1024];

    if ((sock = socket(AF_INET6, SOCK_DGRAM, 0)) == -1) {
        perror("socket");
        exit(1);
    }

    struct in6_addr host6_addr;
    if (inet_pton(AF_INET6, "::ffff:808:808", &host6_addr) != 1) {
        perror("inet_pton");
        exit(1);
    }
    server_addr6.sin6_family = AF_INET6;
    server_addr6.sin6_port = htons(53);
    server_addr6.sin6_addr = host6_addr;

    sendto(sock, send_data, 48, 0, (struct sockaddr *)&server_addr6, sizeof(struct sockaddr_in6));

    int sin6_size = sizeof(struct sockaddr_in6);
    bytes_recv = recvfrom(sock,recv_data,1024,0,(struct sockaddr *)&server_addr6, &sin6_size);
    printf("Received:\n");
    for (int i = 0; i < bytes_recv; i ++) {
        printf(" %02x", recv_data[i]);
    }
    putchar('\n');
}

该程序使用IPv4映射IPv6地址向8.8.8.8发送DNS请求,但recvfrom调用始终无返回。

通过tcpdump -fl -i utun3 udp | grep -F '8.8.8.8'捕获到请求和响应:

14:28:10.436223 IP 10.255.226.30.60077 > 8.8.8.8.domain: 15375+ [1au] A? www.googleapis.com. (48)
14:28:10.453931 IP 8.8.8.8.domain > 10.255.226.30.60077: 15375 16/0/1 A 172.217.175.234, A 172.217.175.42, A 172.217.161.42, A 216.58.220.138, A 142.250.196.106, A 142.250.196.138, A 172.217.175.74, A 216.58.220.106, A 142.250.207.10, A 142.251.222.10, A 142.251.42.138, A 142.251.42.170, A 142.251.42.202, A 142.251.222.42, A 172.217.26.234, A 172.217.161.74 (303)

流量需通过VPN路由,但即使向未走VPN的本地路由器192.168.2.1发送请求,问题依旧。当前IPv6处于关闭状态,开启后情况无变化:

$ networksetup -getinfo Wi-Fi                                                                                                                                                             
DHCP Configuration
IP address: 192.168.2.144
Subnet mask: 255.255.255.0
Router: 192.168.2.1
Client ID: 
IPv6: Off
Wi-Fi ID: 3c:06:30:38:77:e2

已通过getsockopt查询IPV6_V6ONLY选项,返回值为0,说明该选项已禁用。使用IPv4套接字的相同代码可正常工作,且另一台Mac上的IPv6代码也无问题。

请问是否存在遗漏的系统配置?可提供更多调试信息。


内容的提问来源于stack exchange,提问作者Garuno

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 16:55:01