我最近从 Freenet6 获得了自己的静态 IPv6 /56 前缀,并尝试允许应用程序在前缀中绑定任意地址。我修改了隧道创建脚本,该gogoc
脚本用于将客户端地址(此处我们将其称为)和我已分配(此处称为)的2001:5c0:1000::cccc/128
整个子网分别分配给和。我可以绑定一个应用程序来侦听或正常,并且使用 IPv6 开放端口测试仪表明连接成功。2001:5c0:2000:5800::/56
tun
tun:1
2001:5c0::cccc
2001: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_FREEBIND
或IP_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
)意味着两件事:
2001:5c0:1103:5800::
已分配给您的界面 - 您可以ping6
通过它来发现它是否有效,但2001:5c0:1103:5800::1
不会响应/56
用于路由目的,并且仅意味着如果您想要使用该前缀 ( ) 向网络发送某些内容,则应该使用该接口inet6 2001:5c0:1103:5800::/56
将其发送出去。tun
您可以使用 找到它ip -6 route
。
至于如何做自己想做的事,你可以看看这个答案。
现在,为什么绑定有效?这是因为你可以在调用中使用网络地址bind
,它会将你的套接字绑定到有权访问给定网络的接口(特别是绑定到 0.0.0.0 绑定到所有接口,而不是绑定到该网络中的所有 IP)互联网)。