kiwix / libkiwix

Common code base for all Kiwix ports
https://download.kiwix.org/release/libkiwix/
GNU General Public License v3.0
112 stars 54 forks source link

Add IPV6 support #1065

Closed aryanA101a closed 1 month ago

aryanA101a commented 4 months ago

Originally posted by @aryanA101a in https://github.com/kiwix/kiwix-tools/issues/545#issuecomment-1964903540

aryanA101a commented 3 months ago

I have made some progress in adding ipv6 support to libkiwix.

I have some findings to share:

Suppose my computer's wireless interface has this address config

eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.32.100  netmask 255.255.255.0  broadcast 192.168.32.255
        inet6 fe80::682:41cd:4e8e:25a7  prefixlen 64  scopeid 0x20<link>
        ether 30:d1:6b:f5:7a:31  txqueuelen 1000  (Ethernet)
        RX packets 51417098  bytes 57088680516 (53.1 GiB)
        RX errors 0  dropped 117  overruns 0  frame 0
        TX packets 14994882  bytes 2248629898 (2.0 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

and I run kiwix-serve viki.zim -6 -p 2000 (-6 for ipv6) since I have not given any explicit ipv6 addr, it'll serve at ::0 (all the ipv6 interfaces) but for the end user we are showing them a genuine ip address The Kiwix server is running and can be accessed in the local network at: http://[fe80::682:41cd:4e8e:25a7]:2000

according to this

ip_addr kiwix::getBestPublicIp() {
  std::map<std::string,ip_addr>  interfaces = getNetworkInterfaces();

#ifndef _WIN32
  const char* const prioritizedNames[] =
      { "eth0", "eth1", "wlan0", "wlan1", "en0", "en1" };

Everything is as intended as of now. But, the thing is the ip address it is serving on is of link local ipv6 type. And this type of address has its own type of shenanigans to work with.

curl http://[fe80::682:41cd:4e8e:25a7]:2000
curl: (7) Couldn't connect to server

Adding %interface_name to the address makes it work curl http://[fe80::682:41cd:4e8e:25a7%eth0]:2000

And as per my findings, I could not find a way to access this linklocal address in the browser.

There's also a global ipv6 address it works as intended, but to test it I had to manually assign a global ipv6 address to my interface and by default it was not configured for my system.

@mgautierfr can you check if your interface is configured for a global ipv6 address

mgautierfr commented 3 months ago

My ipv6 address is a local link too. Maybe (I'm not sure) interfaces get a public ipv6 only if we are in a ipv6 network ? I have great doubts that my current network is ipv6.