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

在macOS上通过代码设置utun接口的IPv4子网掩码

解决macOS下utun接口子网掩码配置不生效的问题

你的问题核心在于BSD系系统(包括macOS)要求sockaddr结构体必须设置sa_len字段,而你的代码中遗漏了这一步,导致内核无法正确解析子网掩码的配置。此外,直接覆盖接口flags的操作也可能清除utun接口必需的属性。

关键修改点

  1. 设置sockaddr_in的sin_len字段:macOS的sockaddr结构体包含长度标识字段,必须显式设置为sizeof(struct sockaddr_in),否则内核无法正确识别结构体内容。
  2. 正确设置接口UP状态:不要直接赋值ifr.ifr_flags = IFF_UP,而是先获取当前flags,再通过位或操作追加IFF_UP,避免清除IFF_POINTOPOINT等utun接口必需的属性。

修改后的核心函数

以下是修复后的set_addr_and_bring_up函数:

int
set_addr_and_bring_up(const char *if_name, const char *ipv4_address, const char *ipv4_netmask)
{
    int sock, ret = -1;
    struct ifreq ifr = {0};
    struct sockaddr_in *addr = (struct sockaddr_in *)&ifr.ifr_addr;

    sock = socket(AF_INET, SOCK_DGRAM, 0);
    if (sock < 0) {
        perror("socket");
        return -1;
    }

    snprintf(ifr.ifr_name, sizeof(ifr.ifr_name), "%s", if_name);

    // 设置IPv4地址:添加sin_len字段
    addr->sin_len = sizeof(struct sockaddr_in);
    addr->sin_family = AF_INET;
    inet_pton(AF_INET, ipv4_address, &addr->sin_addr);
    if (ioctl(sock, SIOCSIFADDR, &ifr) == -1) {
        perror("ioctl (SIOCSIFADDR)");
        goto done;
    }

    // 设置子网掩码:同样需要设置sin_len
    addr->sin_len = sizeof(struct sockaddr_in);
    addr->sin_family = AF_INET;
    inet_pton(AF_INET, ipv4_netmask, &addr->sin_addr);
    if (ioctl(sock, SIOCSIFNETMASK, &ifr) == -1) {
        perror("ioctl (SIOCSIFNETMASK)");
        goto done;
    }

    // 正确设置UP状态:先获取原有flags,再追加IFF_UP
    if (ioctl(sock, SIOCGIFFLAGS, &ifr) == -1) {
        perror("ioctl (SIOCGIFFLAGS)");
        goto done;
    }
    ifr.ifr_flags |= IFF_UP;
    if (ioctl(sock, SIOCSIFFLAGS, &ifr) == -1) {
        perror("ioctl (SIOCSIFFLAGS)");
        goto done;
    }

    ret = 0;

done:
    close(sock);
    return ret;
}

验证

运行修改后的程序后,用ifconfig <utun接口名>查看,子网掩码应该会显示为你设置的255.255.255.0。同时可以用netstat -rn检查路由表,确认该接口的路由条目使用了正确的子网掩码。

补充说明

utun是点到点(POINTOPOINT)类型接口,macOS的ifconfig输出中inet 1.2.3.4 --> 0.0.0.0里的0.0.0.0是对端地址,子网掩码的设置不会改变这个字段,但会影响系统基于该接口的路由计算。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 15:15:55