绑定到 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 地址,您必须自动发现它们并为每个地址创建一个套接字。
正在尝试让守护程序绑定到 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 地址,您必须自动发现它们并为每个地址创建一个套接字。