I’m sure every one reading this post has the kindergarden level of knowledge of ping (when it works), the hard part is when ping does not work. Ping can do so much more.
Pinging 101
If you successfully ping an IP address you get a response like
PING 2001:db8::7(2001:db8::7) 56 data bytes 64 bytes from 2001:db8::7: icmp_seq=1 ttl=64 time=0.705 ms 64 bytes from 2001:db8::7: icmp_seq=2 ttl=64 time=0.409 ms
Forwarding
If the route is through servers, then the servers need to be enabled for forwarding. For example
- Linux: sudo sysctl -w net.ipv6.conf.all.forwarding=1
- z/OS: IPCONFIG DATAGRAMFWD
If forwarding is not specified, the ping request will come in on one interface and be thrown away.
Pinging to a multicast address
With multicast you can send the same data to multiple destinations on a connection(interface), or on a host.
You can issue
ping ff02::1%tap1
where
- ff02::1 is a multi cast address – ff02 is for everything on this link
- %tap1 says use the interface tap1. Without it, ping does not know which link to send it to.
Wireshark shows the source was fe80::5460:31ff:fed4:4587 which is the address of the interface used to send out the request.
The output was
PING ff02::1%tap1(ff02::1%tap1) 56 data bytes
64 bytes from fe80::5460:31ff:fed4:4587%tap1: icmp_seq=1 ttl=64 time=0.082 ms
64 bytes from fe80::7:7:7:7%tap1: icmp_seq=1 ttl=255 time=3.36 ms (DUP!)
64 bytes from fe80::5460:31ff:fed4:4587%tap1: icmp_seq=2 ttl=64 time=0.082 ms
64 bytes from fe80::7:7:7:7%tap1: icmp_seq=2 ttl=255 time=3.01 ms (DUP!)
64 bytes from fe80::5460:31ff:fed4:4587%tap1: icmp_seq=3 ttl=64 time=0.083 ms
64 bytes from fe80::7:7:7:7%tap1: icmp_seq=3 ttl=255 time=3.22 ms (DUP!)
The z/OS host, has two IP addresses for the interface – and both of them replied.
Pinging from a different address on the machine
I had a server where there as
- an Ethernet connection to my laptop. The server end of the connection had address 2001:db8::2
- an Ethernet like connection to z/OS running through a tunnel. The device (interface) was called tap1.
To ping to the multicast address, as if it came from 2001:db8::2, the address of an Ethernet connection on the same machine, you can use
ping -I 2001:db8::2 ff02::1%tap1
Wireshark shows the source was 2001:db8::2.
The output was
PING ff02::1%tap1(ff02::1%tap1) from 2001:db8::2 : 56 data bytes 64 bytes from 2001:db8:1::9: icmp_seq=1 ttl=255 time=3.15 ms 64 bytes from 2001:db8:1::9: icmp_seq=2 ttl=255 time=1.22 ms 64 bytes from 2001:db8:1::9: icmp_seq=3 ttl=255 time=3.21 ms
without the duplicate responses (I do not know why). (It may be due to the global address 2001… compare with the link-local address 9e80…)
You might use this ping from a different address when checking a firewall. The firewall may be restricting the source of a packet.
The problems of ping using a different address on the machine
I had a wireless connection, and an Ethernet connection to my laptop. If I pinged through my server to z/OS, the “return address” was from the wireless connection. z/OS was not configured for this, so the reply to the ping was lost.
Even trying to force the interface id to use with
ping -I enp0s31f6 2001:db8:1::9
The wireless connection was chosen, and ping gave a message
ping: Warning: source address might be selected on device other than: enp0s31f6
I had to give my Ethenet connection an address, and change the route to add the src
sudo ip -6 addr add 2001:db8::7 dev enp0s31f6
sudo ip route replace 2001:db8:1::/64 via fe80::a2f0:9936:ddfd:95fa dev enp0s31f6 … src 2001:db8::7
Only then did the ping request get to z/OS – but z/OS did not know how to get back to my laptop!
A normal Wireshark trace

This shows the request and the reply.
Why can ping fail?
If you only get the request data in the Wireshark trace, this means no reply was sent back.
This could be for many reasons including
- The IP address (2001:db8::1:0:0:9 in the wireshark output above) could not be reached. This could be due to
- A fire wall dropped it
- It could not be routed on
- The address did not exist
- The response could not be sent back
- A firewall blocked it
- There is no routing from the destination back to the originator
- There is no routing on an intermediate hop
Example of failure
I had a radvd configuration which included
prefix 2001:db8:0:0:1::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr on; }; route 2001:db8::/64 { AdvRoutePreference medium; AdvRouteLifetime 3100; };
The 2001:db8:0:0:1::/64 says traffic for 2001:db8:0:0 is on this system, and traffic for 2001:db8::/64 is off this host.
When ping tried to reply – it tried to send the packet to 2001:db8::/64 – which was routed to the same host and so IP just dropped the packet.
I needed 2001:db8:0:0:1::/80. This says traffic for 2001:db8:0:0:1 is on this system. I also used 2001:db8::/80 which is 2001:db8:0:0:0/80 is off this host. The /80 gave the finer granularity.
Once you know these things, it is obvious. This is called experience.
Another example of a failure
As part of writing up another blog post, I created my network to use only address fc00:…
With this, ping failed to work.
The reason for this was that at the back-end, I could see the source was an 2001:db8:… address, which was not configured in my back-end.
On my front end system my Ethernet device had
2: enp0s31f6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000 inet6 fc::7/128 scope global valid_lft forever preferred_lft forever inet6 2001:db8::4cca:6215:5c30:4f5e/64 scope global temporary dynamic valid_lft 84274sec preferred_lft 12274sec inet6 2001:db8::51d8:9a9f:784:3684/64 scope global dynamic mngtmpaddr noprefixroute valid_lft 84274sec preferred_lft 12274sec inet6 fe80::9b07:33a1:aa30:e272/64 scope link noprefixroute valid_lft forever preferred_lft forever
I deleted this using
sudo ip -6 addr del 2001:db8::4cca:6215:5c30:4f5e/64 dev enp0s31f6
and ping worked!
When I added it back in, ping continued to work. I cannot find which interface address ping uses.
Of course I could have used
ping -I fc::7 fc:1::9
to which interface address to use!
A failure with a hint
I had a WiresShark output

The destination Unreachable had
Internet Control Message Protocol v6
Type: Destination Unreachable (1)
Code: 3 (Address unreachable)
...
Internet Protocol Version 6, Src: fc:1::9, Dst: fc::a
Internet Control Message Protocol v6
This is saying that at the server end of the link to z/OS, where the server end had address fc:1::3 ( see the data at the start of the black line) was unable to deliver the packet to dst: fc::a. This shows the problem is with the server in the middle rather than z/OS.
The solution turned out to be more complex than I first though.
I tried
sudo ip -6 route add fc::/64 dev eno1 via fc::7
but this gave
RTNETLINK answers: No route to host
On the laptop I did
ip -6 addr
which gave me
enp0s31f6: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 state UP qlen 1000 inet6 fc::7/128 scope global valid_lft forever preferred_lft forever inet6 fe80::9b07:33a1:aa30:e272/64 scope link noprefixroute valid_lft forever preferred_lft forever
back on the server I replaced fc::7 with fe80::9b07:33a1:aa30:e272
sudo ip -6 route add fc::/64 dev eno1 via fe80::9b07:33a1:aa30:e272
and then ping worked!
Digging into this I found the documentation on Neighbourhood discovery section 8 says
For static routing, this requirement implies that the next- hop router’s address should be specified using the link-local address of the router.
Sometimes
sudo ip -6 route add fc::/64 dev eno1 via fc::7
worked fine. ip -6 route gave
fc::7 dev eno1 metric 1024 pref medium fc::/64 via fc::7 dev eno1 metric 1024 pref medium fc:1::/64 dev tap1 metric 1024 pref medium
I think this just goes to show that this is a complex area, and there are things happening which I do not understand.
Thank you for the level of detail. This is redbooks on steroids.
LikeLike