Recientemente obtuve un prefijo IPv6 /56 estático de Freenet6 y estoy tratando de permitir que las aplicaciones vinculen direcciones arbitrarias en el prefijo. Modifiqué el script de creación de túneles que gogoc
uso para asignar tanto la dirección del cliente (aquí la llamaremos 2001:5c0:1000::cccc/128
) como toda la subred que he asignado (aquí llamada 2001:5c0:2000:5800::/56
) a tun
y tun:1
, respectivamente. Puedo vincular una aplicación para que escuche 2001:5c0::cccc
o 2001:5c0:5800::
simplemente bien, y el uso de probadores de puerto abierto IPv6 indica que la conexión se está realizando correctamente.
Sin embargo, el dilema radica en que no puedo vincular una dirección como 2001:5c0:2000:5800:1111:2222:3333:4444
, que es parte de la subred que asigné tun:1
, y aparece EADDRNOTAVAIL
un código de error. socat
lee:
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
La aplicación que deseo utilizar no es compatible con IP_FREEBIND
o IP_TRANSPARENT
.
¿Existe alguna configuración del kernel que pueda utilizar para liberar implícitamente los sockets? ¿O tal vez una forma de interceptar la creación de sockets a partir de un proceso determinado y adjuntar opciones de socket a esa creación?
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
Respuesta1
La parte de la configuración de su interfaz, es decir, inet6 2001:5c0:1103:5800::/56
la ip addr
lista, significa dos cosas:
2001:5c0:1103:5800::
está asignado a su interfaz; puedeping6
verificar si es válido, pero2001:5c0:1103:5800::1
no responde/56
sirve para fines de enrutamiento y solo significa que si desea enviar algo a la red con ese prefijo (inet6 2001:5c0:1103:5800::/56
), debe salir usando latun
interfaz. Puedes averiguarlo usandoip -6 route
.
Para saber cómo hacer lo que quieres,puedes ver esta respuesta.
Ahora bien, ¿por qué funcionaron las ataduras? Esto se debe a que puede usar una dirección de red en la bind
llamada y vinculará su socket a las interfaces que tienen acceso a la red dada (específicamente vincular a 0.0.0.0 se vincula a todas las interfaces, en lugar de a todas las IP en el Internet).