¿Cómo puedo permitir que las aplicaciones se vinculen a cualquier dirección en una subred asignada a una interfaz?

¿Cómo puedo permitir que las aplicaciones se vinculen a cualquier dirección en una subred asignada a una interfaz?

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 gogocuso 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 tuny tun:1, respectivamente. Puedo vincular una aplicación para que escuche 2001:5c0::cccco 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 EADDRNOTAVAILun código de error. socatlee:

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_FREEBINDo 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::/56la ip addrlista, significa dos cosas:

  1. 2001:5c0:1103:5800::está asignado a su interfaz; puede ping6verificar si es válido, pero 2001:5c0:1103:5800::1no responde
  2. /56sirve 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 la tuninterfaz. Puedes averiguarlo usando ip -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 bindllamada 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).

información relacionada