インターフェイスに割り当てられたサブネット内の任意のアドレスにアプリケーションをバインドできるようにするにはどうすればよいでしょうか?

インターフェイスに割り当てられたサブネット内の任意のアドレスにアプリケーションをバインドできるようにするにはどうすればよいでしょうか?

最近、Freenet6 から独自の静的 IPv6 /56 プレフィックスを取得し、アプリケーションがプレフィックス内の任意のアドレスをバインドできるようにしようとしています。 をgogoc使用するトンネル作成スクリプトを変更して、クライアント アドレス (ここでは と呼びます2001:5c0:1000::cccc/128) と割り当てたサブネット全体 (ここでは と呼びます2001:5c0:2000:5800::/56) の両方をそれぞれ と にtun割り当てましたtun:1。 または でリッスンするようにアプリケーションをバインドすることは問題なくでき2001:5c0::cccc2001:5c0:5800::IPv6 オープン ポート テスターを使用すると、接続が成功していることが示されます。

2001:5c0:2000:5800:1111:2222:3333:4444しかし、問題は、 に割り当てたサブネットの一部である のようなアドレスをバインドできずtun:1EADDRNOTAVAILエラー コードが返されることです。次のようになります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次の 2 つのことを意味します。

  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 ではなく、すべてのインターフェイスにバインドされます)。

関連情報