Recentemente, recebi um prefixo IPv6/56 estático da Freenet6 e estou tentando permitir que aplicativos vinculem endereços arbitrários no prefixo. Modifiquei o script de criação de túnel gogoc
usado para atribuir o endereço do cliente (aqui vamos chamá-lo de 2001:5c0:1000::cccc/128
) e toda a sub-rede que aloquei (aqui chamada de 2001:5c0:2000:5800::/56
) para tun
e tun:1
, respectivamente. Posso vincular um aplicativo para escutar 2001:5c0::cccc
ou 2001:5c0:5800::
perfeitamente, e usar testadores de porta aberta IPv6 indica que a conexão está sendo bem-sucedida.
No entanto, o dilema reside no fato de não conseguir vincular um endereço como 2001:5c0:2000:5800:1111:2222:3333:4444
, que faz parte da sub-rede à qual atribuí tun:1
, obtendo EADDRNOTAVAIL
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 de kernel que eu possa usar para vincular implicitamente soquetes? 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
Responder1
A parte da configuração da sua interface, nomeadamente inet6 2001:5c0:1103:5800::/56
na ip addr
listagem, significa duas coisas:
2001:5c0:1103:5800::
é atribuído à sua interface - você podeping6
descobrir que é válido, mas2001:5c0:1103:5800::1
não responderá/56
serve para fins de roteamento, e significa apenas que se você quiser enviar algo para a rede com aquele prefixo (inet6 2001:5c0:1103:5800::/56
), ele deverá sair pelatun
interface. Você pode descobrir isso usandoip -6 route
.
Para saber como fazer o que você quer,você pode conferir esta resposta.
Agora, por que as ligações funcionaram? É porque você pode usar um endereço de rede na bind
chamada e ele vinculará seu soquete às interfaces que têm acesso à rede fornecida (especificamente a ligação a 0.0.0.0 liga-se a todas as interfaces, em vez de a todos os IPs no Internet).