如何允许应用程序绑定到分配给接口的子网中的任何地址?

如何允许应用程序绑定到分配给接口的子网中的任何地址?

我最近从 Freenet6 获得了自己的静态 IPv6 /56 前缀,并尝试允许应用程序在前缀中绑定任意地址。我修改了隧道创建脚本,该gogoc脚本用于将客户端地址(此处我们将其称为)和我已分配(此处称为)的2001:5c0:1000::cccc/128整个子网分别分配给和。我可以绑定一个应用程序来侦听或正常,并且使用 IPv6 开放端口测试仪表明连接成功。2001:5c0:2000:5800::/56tuntun:12001:5c0::cccc2001:5c0:5800::

然而,困境在于我无法绑定像 一样的地址2001:5c0:2000:5800:1111:2222:3333:4444,它是我分配给 的子网的一部分tun:1,并获取EADDRNOTAVAIL错误代码。socat内容如下:

2014/05/10 12:12:06 socat[16940] E bind(3, {AF=10 [2001:5c0:2000:5800:1111:2222:3333:4444]:9876}, 28): Cannot assign requested address

我希望使用的应用程序不支持IP_FREEBINDIP_TRANSPARENT

是否有一个内核设置可以用来隐式地自由绑定套接字?或者也许是一种从给定进程拦截套接字创建并将套接字选项附加到该创建的方法?

ip addr:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 04:7d:7b:XX:XX:XX brd ff:ff:ff:ff:ff:ff
3: wlan0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 9c:b7:0d:XX:XX:XX brd ff:ff:ff:ff:ff:ff
5: wlan1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:c0:ff:XX:XX:XX brd ff:ff:ff:ff:ff:ff
    inet 192.168.2.8/24 brd 192.168.2.255 scope global wlan1
       valid_lft forever preferred_lft forever
    inet6 fe80::2c0:ffff:feff:70d1/64 scope link 
       valid_lft forever preferred_lft forever
11: tun: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none 
    inet6 2001:5c0:1103:5800::/56 scope global 
       valid_lft forever preferred_lft forever
    inet6 2001:5c0:1000:b::5225/128 scope global 
       valid_lft forever preferred_lft forever

答案1

界面配置的部分(即列表inet6 2001:5c0:1103:5800::/56中的部分ip addr)意味着两件事:

  1. 2001:5c0:1103:5800::已分配给您的界面 - 您可以ping6通过它来发现它是否有效,但2001:5c0:1103:5800::1不会响应
  2. /56用于路由目的,并且仅意味着如果您想要使用该前缀 ( ) 向网络发送某些内容,则应该使用该接口inet6 2001:5c0:1103:5800::/56将其发送出去。tun您可以使用 找到它ip -6 route

至于如何做自己想做的事,你可以看看这个答案

现在,为什么绑定有效?这是因为你可以在调用中使用网络地址bind,它会将你的套接字绑定到有权访问给定网络的接口(特别是绑定到 0.0.0.0 绑定到所有接口,而不是绑定到该网络中的所有 IP)互联网)。

相关内容