如何允許應用程式綁定到分配給介面的子網路中的任何位址?

如何允許應用程式綁定到分配給介面的子網路中的任何位址?

我最近從 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

至於如何做自己想做的事,你可以看看這個答案

現在,為什麼綁定有效? It's because you can use a network address in bindcall, and it will bind your socket to interface(s) which have access to the given network (specifically binding to 0.0.0.0 binds to all interfaces, rather than to all of the IPs in the網際網路).

相關內容