Como posso permitir que aplicativos se liguem a qualquer endereço em uma sub-rede atribuída a uma interface?

2

Recentemente recebi um prefixo IPv6 / 56 estático do Freenet6 e estou tentando permitir que aplicativos vinculem endereços arbitrários no prefixo. Modifiquei o script de criação de encapsulamento que gogoc usa para atribuir o endereço do cliente (aqui vamos chamá-lo 2001:5c0:1000::cccc/128 ) e toda a sub-rede que aloquei (aqui chamada 2001:5c0:2000:5800::/56 ) para tun e tun:1 , respectivamente. Eu posso ligar um aplicativo para ouvir em 2001:5c0::cccc ou 2001:5c0:5800:: muito bem, e usando testadores de porta aberta IPv6 indica que a conexão está tendo sucesso.

No entanto, o dilema é que não consigo vincular um endereço como 2001:5c0:2000:5800:1111:2222:3333:4444 , que faz parte da sub-rede que atribuí a tun:1 , obtendo EADDRNOTAVAIL como um código de erro. socat lê:

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

O aplicativo que desejo usar não suporta IP_FREEBIND ou IP_TRANSPARENT .

Existe uma configuração do kernel que eu posso usar para ligar livremente sockets? Ou talvez uma maneira de interceptar a criação de soquete de um determinado processo e anexar opções de soquete a essa criação?

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
    
por hexafraction 10.05.2014 / 18:15

1 resposta

3

A parte da configuração da sua interface, ou seja, inet6 2001:5c0:1103:5800::/56 in ip addr listagem, significa duas coisas:

  1. 2001:5c0:1103:5800:: é atribuído à sua interface - você pode ping6 para descobrir que é válido, enquanto 2001:5c0:1103:5800::1 não responderá
  2. /56 serve para fins de roteamento e significa apenas que, se você quiser enviar algo para a rede com esse prefixo ( inet6 2001:5c0:1103:5800::/56 ), ele deve sair usando a interface tun . Você pode descobrir isso usando ip -6 route .

Para saber como fazer o que você quer, você pode conferir esta resposta .

Agora, por que as ligações funcionam? É porque você pode usar um endereço de rede em bind call e ele ligará seu soquete a interface (s) que têm acesso à rede fornecida (vinculação específica a 0.0.0.0 se liga a todas as interfaces, em vez de a todos os IPs na Internet).

    
por 10.05.2014 / 21:42