Networking

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

  • May 10, 2014

我最近從 Freenet6 獲得了我自己的靜態 IPv6 /56 前綴,並試圖允許應用程序在前綴中綁定任意地址。我修改了隧道創建腳本,gogoc用於將客戶端地址(這裡我們稱之為2001:5c0:1000::cccc/128)和我分配的整個子網(這裡稱之為2001:5c0:2000:5800::/56)分別分配給tuntun:1。我可以綁定一個應用程序來監聽2001:5c0::cccc2001:5c0:5800::很好,並且使用 IPv6 開放埠測試器表明連接成功。

但是,困境在於我無法綁定像 一樣的地址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

您的界面配置部分,即inet6 2001:5c0:1103:5800::/56ip 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 綁定到所有介面,而不是綁定到網際網路)。

引用自:https://unix.stackexchange.com/questions/128805