Как разрешить приложениям привязываться к любому адресу в подсети, назначенной интерфейсу?

Как разрешить приложениям привязываться к любому адресу в подсети, назначенной интерфейсу?

Недавно я получил свой собственный статический префикс IPv6 /56 от Freenet6 и пытаюсь разрешить приложениям привязывать произвольные адреса в префиксе. Я изменил скрипт создания туннеля, который gogocиспользует для назначения как клиентского адреса (здесь мы назовем его 2001:5c0:1000::cccc/128), так и всей выделенной мной подсети (здесь называемой 2001:5c0:2000:5800::/56) для tunи tun:1, соответственно. Я могу привязать приложение к прослушиванию 2001:5c0::ccccили 2001: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_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, означает две вещи:

  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-адресам в Интернете).

Связанный контент