【问题标题】:Binding to fe80::%<scope>绑定到 fe80::%<scope>
【发布时间】:2015-11-08 01:08:07
【问题描述】:

试图让守护进程绑定到fe80::%en0

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

如果您想从链路另一端的对等方接收数据包,那么必须指定完整的链路本地地址似乎很愚蠢。

代码如下:

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 

值似乎都匹配,但 bind 返回 EADDRNOTAVAIL。我需要启用一些魔术套接字选项才能使其工作吗?还是我需要专门检查该链接本地 IP 前缀,然后将其解析为 scope_id/zone_id 描述的接口的完整地址?

【问题讨论】:

  • 不能只绑定未指定的地址吗?
  • :: 一样,当然,但它不等价。
  • 请解释为什么它在您的上下文中有所不同。通常情况下,你要绑定到未指定的地址进行监听。
  • 嗯,不,您将绑定到未指定的地址以在每个接口上绑定该特定端口。我只想从链路本地对等方接收数据报。绑定到 in6addr_any 意味着我也会在与其他范围的接口上接收数据报。
  • 您通常绑定到子网地址而不是主机上配置的地址吗?

标签: c macos posix ipv6


【解决方案1】:

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

【讨论】:

  • 主机每个接口可以有多个本地链接地址吗?
  • 是的,多个本地链接地址不是很常见,但肯定不是闻所未闻。
  • 它们的主要用例是什么?
  • 我主要将它们视为默认网关,例如在数据中心中,每个 LAN 上的地址 fe80::1 可用作默认网关,除了路由器的链路本地地址。原因之一是某些 Cisco IOS 版本只能使用链路本地地址执行 HSRP。
猜你喜欢
  • 2016-11-13
  • 2015-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-13
  • 1970-01-01
  • 2015-07-14
相关资源
最近更新 更多