绑定到 fe80::%<scope>

Binding to fe80::%<scope>

正在尝试让守护程序绑定到 fe80::%en0

我不是 100% 确定这是可能的,但看起来 link-本地地址应该很有用。

如果您想接受来自 link 另一端的对等方的数据包,必须指定完整的 link-本地地址似乎很愚蠢。

代码如下所示:

if (DEBUG_ENABLED4) {
    if (salocal.ss_family == AF_INET) {
        char            buffer[INET_ADDRSTRLEN];
        struct sockaddr_in  *addr = (struct sockaddr_in *)&salocal;

        inet_ntop(addr->sin_family, &addr->sin_addr, buffer, sizeof(buffer));
        DEBUG4("[FD %i] Binding to address %s port %u -- bind(%i, %p, %u)",
               this->fd, buffer, ntohs(addr->sin_port), this->fd, &salocal, salen);
    } else if (salocal.ss_family == AF_INET6) {
        char            buffer[INET6_ADDRSTRLEN];
        struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&salocal;

        inet_ntop(addr->sin6_family, &addr->sin6_addr, buffer, sizeof(buffer));
        DEBUG4("[FD %i] Binding to address %s port %u scope ID %i -- bind(%i, %p, %u)",
               this->fd, buffer, ntohs(addr->sin6_port), addr->sin6_scope_id,
               this->fd, &salocal, salen);
    }
}
rad_suid_up();
rcode = bind(this->fd, (struct sockaddr *)&salocal, salen);
rad_suid_down();

调试输出如下所示:

Sat Nov  7 19:58:28 2015 : Debug: [FD 12] Binding to address fe80:: port 1812 scope ID 4 -- bind(12, 0x7fff599dc4d0, 28)
Sat Nov  7 19:58:28 2015 : Error: Failed binding to auth address fe80:: port 1812 bound to server default: EADDRNOTAVAIL: Can't assign requested address
Sat Nov  7 19:58:28 2015 : Error: /usr/local/freeradius/etc/raddb/sites-enabled/default[215]: Error binding to port for fe80:: port 1812

Ifconfig 输出如下所示:

en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
    options=10b<RXCSUM,TXCSUM,VLAN_HWTAGGING,AV>
    ether a8:20:66:xx:xx:xx 
    inet6 fe80::aa20:66ff:fe1a:8bcd%en0 prefixlen 64 scopeid 0x4 

值似乎都匹配,但绑定 returns EADDRNOTAVAIL。是否需要启用一些魔术套接字选项才能使其正常工作?或者我是否需要专门检查 link 本地 IP 前缀,然后将其解析为 scope_id/zone_id 描述的接口的完整地址?

简而言之:如果您想绑定到特定地址,则必须指定该地址。一个主机可以有多个 link-本地地址。如果您想自动绑定到所有 link-local 地址,您必须自动发现它们并为每个地址创建一个套接字。