From your configuration, I can see your system has a link-local IPv6 address (fe80::...) assigned to eth0, but no global unicast address. The key indicators are:
inet6 addr: fe80::16da:e9ff:feb6:357e/64 Scope:Link
This means your interface has basic IPv6 capability but isn't receiving or configured with a routable IPv6 address. The routing table shows:
::/0 :: !n -1 1 5400 lo
This "blackhole" route indicates your system doesn't know how to reach the IPv6 internet.
The symptoms point to several potential issues:
- Missing or incorrect default route for IPv6
- No global unicast address assigned
- Possibly no IPv6 router on your network
- Potential firewall blocking ICMPv6
First, let's check if your network actually supports IPv6:
# Check for IPv6 routers on your network
ping6 ff02::2%eth0
If you get responses, you have routers available. If not, your network may not support IPv6.
If you determine IPv6 is available but not working, try these steps:
# Enable IPv6 forwarding (if you're the router)
echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
# Request DHCPv6 configuration
dhclient -6 eth0
# Or try stateless autoconfiguration
sysctl -w net.ipv6.conf.eth0.accept_ra=1
sysctl -w net.ipv6.conf.eth0.autoconf=1
If autoconfiguration fails, you can set up IPv6 manually:
# Add global address (replace with your prefix)
ip -6 addr add 2001:db8::1/64 dev eth0
# Add default route (replace with your gateway)
ip -6 route add default via 2001:db8::1
If ping6 still fails:
# Check IPv6 connectivity to different targets
ping6 -I eth0 ipv6.google.com
ping6 -I eth0 2001:4860:4860::8888 # Google DNS
# Verify routes
ip -6 route show
# Check neighbor discovery
ip -6 neigh show
For persistent configuration, edit your network interfaces file. Example for Debian/Ubuntu in /etc/network/interfaces
:
iface eth0 inet6 static
address 2001:db8::2
netmask 64
gateway 2001:db8::1
dns-nameservers 2001:4860:4860::8888 2001:4860:4860::8844
The key observation from your configuration is that you only have a link-local address (fe80::/64) assigned to your interface, which explains why you can't reach external IPv6 hosts. The routing table shows no default IPv6 route, which is essential for global connectivity.
The most common reasons for this behavior are:
- Missing global IPv6 address assignment
- Incorrect or missing default route
- Router Advertisement (RA) not functioning properly
- Network hardware/firewall blocking IPv6 traffic
1. Checking Router Advertisement Messages
Use tcpdump to verify if you're receiving Router Advertisements:
sudo tcpdump -i eth0 icmp6 and 'ip6[40] == 134'
2. Manual Configuration (If RA isn't working)
First discover your router's link-local address:
ip -6 neigh show dev eth0
Then add a default route manually (replace with your router's address):
sudo ip -6 route add default via fe80::1 dev eth0
3. Requesting IPv6 Address via DHCPv6
sudo dhclient -6 -v eth0
For systems using systemd-networkd, create this configuration file:
[network]
Description=IPv6 Configuration
[Address]
Address=2001:db8::1/64
[Route]
Gateway=fe80::1
Destination=::/0
After configuration, verify with:
ping6 -c 4 ipv6.google.com
ip -6 route show
ip -6 addr show
- Forgetting to allow ICMPv6 through firewall (ip6tables)
- Not enabling IPv6 forwarding on the router
- Using deprecated tools like ifconfig/route instead of ip/ss
For deeper analysis:
# Check neighbor discovery
ndisc6 -r 2 fe80::1 eth0
# Check MTU issues
tracepath6 ipv6.google.com
# Full protocol analysis
sudo tshark -i eth0 -Y "icmpv6 || ipv6"