为何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
相关产品推荐
相关产品推荐

