Wie kann ich Anwendungen die Bindung an jede beliebige Adresse in einem einer Schnittstelle zugewiesenen Subnetz ermöglichen?

Wie kann ich Anwendungen die Bindung an jede beliebige Adresse in einem einer Schnittstelle zugewiesenen Subnetz ermöglichen?

Ich habe vor Kurzem ein eigenes statisches IPv6 /56-Präfix von Freenet6 erhalten und versuche, Anwendungen das Binden beliebiger Adressen im Präfix zu ermöglichen. Ich habe das Tunnelerstellungsskript geändert, das gogocverwendet wird, um sowohl die Clientadresse (hier nennen wir es 2001:5c0:1000::cccc/128) als auch das gesamte von mir zugewiesene Subnetz (hier genannt 2001:5c0:2000:5800::/56) tunbzw. zuzuweisen tun:1. Ich kann eine Anwendung binden, um auf 2001:5c0::ccccoder 2001:5c0:5800::zuzuhören, und die Verwendung von IPv6-Open-Port-Testern zeigt an, dass die Verbindung erfolgreich ist.

Das Dilemma besteht jedoch darin, dass ich eine Adresse wie nicht binden kann 2001:5c0:2000:5800:1111:2222:3333:4444, die Teil des von mir zugewiesenen Subnetzes ist tun:1, und EADDRNOTAVAILals Fehlercode erhalte. socatlautet:

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

Die Anwendung, die ich verwenden möchte, unterstützt IP_FREEBINDoder nicht IP_TRANSPARENT.

Gibt es eine Kerneleinstellung, mit der ich Sockets implizit frei binden kann? Oder vielleicht eine Möglichkeit, die Socket-Erstellung von einem bestimmten Prozess aus abzufangen und dieser Erstellung Socket-Optionen beizufügen?

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

Antwort1

Der Teil Ihrer Schnittstellenkonfiguration, nämlich inet6 2001:5c0:1103:5800::/56in der ip addrAuflistung, bedeutet zweierlei:

  1. 2001:5c0:1103:5800::ist Ihrer Schnittstelle zugewiesen - Sie können ping6es herausfinden, um herauszufinden, ob es gültig ist, während 2001:5c0:1103:5800::1es nicht reagiert
  2. /56dient zu Routing-Zwecken und bedeutet lediglich, dass, wenn Sie etwas mit diesem Präfix ( ) an das Netzwerk senden möchten inet6 2001:5c0:1103:5800::/56, es über die Schnittstelle hinausgehen soll tun. Sie können dies mithilfe von herausfinden ip -6 route.

Um zu erfahren, wie Sie tun können, was Sie wollen,Sie können diese Antwort überprüfen.

Warum funktionierten die Bindungen? Weil Sie im bindAufruf eine Netzwerkadresse verwenden können, die Ihren Socket an Schnittstellen bindet, die Zugriff auf das angegebene Netzwerk haben (insbesondere die Bindung an 0.0.0.0 bindet an alle Schnittstellen und nicht an alle IPs im Internet).

verwandte Informationen