IPv6 Foundation Part 9: IPv6 on Mac

IPv6 Foundation Part 9 - IPv6 on Mac
All the Tricks and Commands! How IPv6 on Mac works, how to enable, disable & troubleshoot it! Find all your answers and more right here

Table of Contents

About this course

So you are interested in IPv6, which is absolutely great!

IPv6 is not only the future of networking, it is already here today! All the big players on the Internet are already IPv6 enabled and it is now time for you to join the party!

This course covers all major aspects of the new Internet Protocol and what changed, compared to IPv4. You will understand the fundamentals and be ahead of your peers that are still on the sinking ship of IPv4! As of today, there are no IPv4 addresses left and we have no other option but to go ahead and deploy IPv6.

IPv6 Act Now

IPv6 Foundation Part 9: IPv6 on Mac

Let’s have a look at IPv6 support and some history for Microsoft Windows, Apple MacOS and Linux implementations of our new Internet Protocol.

For sure, Apple MacOS or previously OS X has also been early to adopt IPv6 and its implementation in Catalina, Mojave and other recent versions can today be called complete and stable. By default IPv6 on Mac OS, is enabled and does not have to be configured manually, unless you want to.

IPv6 Configuration on Apple MacOS

The screenshot above has a manual configuration using the graphical user interface (GUI) highlighted. Usually the option selected will be Automatic on a regular client.

There are also CLI commands for MacOS that I would like to show you.

Be aware, that in general you can use most open source GNU core utilities also on a Mac by installing homebrew. I like to have some of my favorite “gnutils” handy on my Mac.

The following commands are all built-in MacOS commands, no additional 3rd party components!

How to display addresses for IPv6 on Mac in Terminal

$ ifconfig
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
options=1203<RXCSUM,TXCSUM,TXSTATUS,SW_TIMESTAMP>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
nd6 options=201<PERFORMNUD,DAD>
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
options=400
ether f0:18:98:13:23:1d
inet 172.23.5.46 netmask 0xffffff00 broadcast 172.23.5.255
inet6 fe80::ee:7e0d:8941:1be5%en0 prefixlen 64 secured scopeid 0x6
inet6 2003:c8:b711:300:c18:348e:7db5:8468 prefixlen 64 autoconf secured
inet6 2003:c8:b711:300:852:3b02:5db2:3c18 prefixlen 64 autoconf temporary
nd6 options=201<PERFORMNUD,DAD>
media: autoselect
status: active
utun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1380
inet6 fe80::fb1d:654f:cfbf:16a1%utun0 prefixlen 64 scopeid 0xf
nd6 options=201<PERFORMNUD,DAD>

I excluded about 80% of other output from this command, because it is really long. I still wanted to provide this semi-full output for you to be able to read and understand the different IPv6 addresses in this MacBook Pro which is just connected to WiFi. From what you have learned this far, you should be able to make sense of them all. Or you can read back some more.

Like stated before, you can also install the iproute2 GNU packages from homebrew to gain access to the regular GNU utils if you prefer those.

You can get the output from only one single interface with the following command:

$ ifconfig en0

How to configure a static address for IPv6 on Mac in Terminal

$ sudo ifconfig en0 inet6 2003:c8:b711:300:c18:348e:7db5:9999 prefixlen 64 alias

You need the sudo command to do this system level change, unless you are already root (su), which your regular user account should not be.

How to remove a static address for IPv6 on Mac in Terminal

$ sudo ifconfig en0 inet6 delete 2003:c8:b711:300:c18:348e:7db5:9999 prefixlen 64

To remove an address, just add the delete word and drop the alias word. That’s it. Verify correct removal with ifconfig <interface-name>, e.g. ifconfig en0.

How to display the neighbor cache for IPv6 on Mac

$ ndp -a

ndp is the MacOS tool to control and diagnose the IPv6 neighbor discovery protocol. Check out man ndp for full functionality or this very similar FreeBSD ndp man page.

How to configure a default route for IPv6 on Mac

$ sudo route add -inet6 ::/0 fe80::ee:7e0d:8941:1be5%en0

On MacOS, if you set a default route via a Link-Local address (fe80::), you have to add the outgoing interface with %interface (like in the above example -> %en0) to the command, or else the operating system cannot know which interface is facing the default router!

A default route is probably the most important route for a host, because it acts as a catch-all route and all traffic that is not sent to another “more specific” destination is sent here…

With IPv6, remember the special destination in this case is ::/0, which means “all routes

How to set a generic route for IPv6 on Mac

$ sudo route add -inet6 2a02:69e0::/32 2003:c8:b711:300:::1

Apart from one default route, we might have the need for additional more specific routes or special routes, that are reachable via a different path than the default route. The syntax is essentially the same, just replace the special route ::/0 with a more specific in the same prefix/length notation that is specific for IPv6.

You do not need to include the %interface here, because we are using a global address as the next hop, which is unique and the operating system knows which interface it is connected to. It would also be possible to route via a Link-Local address again, but in this case the %en0 would be necessary like in the previous default route example!

How to remove a generic route for IPv6 on MacOS

$ sudo route delete -inet6 ::/0 fe80::ee:7e0d:8941:1be5%en0

Any route like more specifics and the default route can be removed again using the above delete command, which is identical to the command to add a route, just replace the add with a delete.

How to display the routing table for IPv6 on Mac

$ netstat -rn
Internet6:
Destination Gateway Flags Netif Expire
default fe80::%utun0 UGcI utun0
::1 ::1 UHL lo0
2003:c8:b711:300::/64 link#6 UC en0
2003:c8:b711:300:852:3b02:5db2:3c18 f0:18:98:13:23:1d UHL lo0
2003:c8:b711:300:c18:348e:7db5:1 link#6 UHLWIi en0

At last, there is the one simple command to display the Apple MacOS routing table. The command first outputs the IPv4 routing table, you need to scroll down a bit until the part that starts with Internet6.

How to do a Ping to verify connectivity for IPv6 on Mac

$ ping6 google.com
PING google.com(2a00:1450:400c:c0a::65) 56 data bytes 64 bytes from 2a00:1450:400c:c0a::65: icmp_seq=1 ttl=54 time=12.7 ms 64 bytes from 2a00:1450:400c:c0a::65: icmp_seq=2 ttl=54 time=13.0 ms 64 bytes from 2a00:1450:400c:c0a::65: icmp_seq=3 ttl=54 time=13.0 ms 64 bytes from 2a00:1450:400c:c0a::65: icmp_seq=4 ttl=54 time=12.9 ms

Huh? Yes, you’re right, the syntax and output of ping6 on Mac is exactly the same as on Linux. Ping6 is the IPv6 alternative to the old ping command that is used for IPv4. Ping is used to check if there is end-to-end reachability between your host and a destination. You can either use an IPv6 address for the destination, or use a DNS name (it works!) but be aware – when using a DNS name you cannot be 100% sure that IPv6 is used as transport instead of IPv4.

Check out the parts about Source Protocol Selection and Source Address Selection to understand which Protocol and which address is used when initiating a connection!

How to do a Traceroute to verify Routing and Path for IPv6 on Mac

$ traceroute6 google.com
traceroute to google.com (2a00:1450:400c:c0a::8b), 30 hops max, 80 byte packets
1 denuecore01.pall.as (2a02:69e0:500::1) 0.717 ms
2 denuecore00-2.pall.as (2a01:4f8:0:e0b0::25) 0.320 ms
3 core12.hetzner.de (2a01:4f8:0:3::39) 0.389 ms
4 2a01:4f8:0:3::fa (2a01:4f8:0:3::fa) 3.560 ms
5 juniper4.ffm.hetzner.de (2a01:4f8:0:3::e) 3.521 ms
6 de-cix10.net.google.com (2001:7f8::3b41:0:1) 40.654 ms
7 2001:4860::1:0:4ca2 (2001:4860::1:0:4ca2) 4.579 ms
8 2001:4860::2:0:a94a (2001:4860::2:0:a94a) 12.977 ms
9 wl-in-x8b.1e100.net (2a00:1450:400c:c0a::8b) 12.736 ms

Same again, Traceroute is used to see the different routing (Layer 3) hops along the path of a packet that is transferred between the local host and a remote destination. The MacOS terminal command is also traceroute6 and it is the IPv6 alternative to the IPv4 traceroute command. You can either use an IPv6 address for the destination, or use a DNS name (it works!) but be aware – when using a DNS name you cannot be 100% sure that IPv6 is used as transport instead of IPv4.

Same as with Ping, check out the parts about Source Protocol Selection and Source Address Selection again to understand which Protocol and which address is used when initiating a connection.

How to see live Packet Loss using mtr for IPv6 on Mac

My Traceroute mtr IPv6 output

You know what traceroute is and why it is so helpful. The Linux utility My Traceroute (mtr), which is also available for MacOS via homebrew, does a kind of a live traceroute and sends packets every second. You are able to see live where packet loss happens or latency increases. I love this tool and highly recommend you try it out, for IPv6 and IPv4!

How to disable IPv6 on Mac

I cannot recommend disabling IPv6 on MacOS and suggest learning enough about it so you can configure and use it to its fullest potential. Still, in some cases you might want or even need to disable it.

The procedure to disable IPv6 on Catalina is the same as to disable IPv6 on Mojave and earlier Versions such as High Sierra an so on. 

First, find out what your “Network Service” is called, that you want to disable IPv6 on:

$ networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
WiFi
iPhone USB
iPad USB
Bluetooth PAN
Thunderbolt Bridge
Mac: Device VPN

Now you can use this name in the following command to disable IPv6 on your Mac:

$ networksetup -setv6off WiFi

The WiFi keyword is coming from the output of the above command which lists all network services the Mac can see.

Verify with ifconfig, if all addresses have been removed accordingly.

Now that you know how to disable IPv6 on MacOS, I’m sure you can’t wait to turn it on again, because it is great and we love it:

How to enable IPv6 on Mac

I’m so glad you want to (re-) enable IPv6 on your Mac and it is not hard at all, just find out what your corresponding interface is called using this command:

$ networksetup -listallnetworkservices
An asterisk (*) denotes that a network service is disabled.
WiFi
iPhone USB
iPad USB
Bluetooth PAN
Thunderbolt Bridge
Mac: Device VPN

Now you can use this name in the following command to enable IPv6 on your Mac:

$ networksetup -setv6automatic WiFi

After a couple of seconds you should have your Link-Local address(es) auto-generated using EUI-64 and maybe global addresses and routing active, check with ifconfig for addresses, netstat -rn for the IPv6 routing table and the other commands from this chapter.

Thank You

Thank you for attending the Original IPv6 Foundation Master Class! You can bookmark this site to use it as a quick reference in case you need to re-read something and you can share this page to social media and your friends and colleagues. Stay tuned to this blog for more in-depth stories like this one.

Recommended Resources for additional reading

Apart from the links throughout this course I recommend the following resources for additional information:

  1. The Internet Society (ISOC) IPv6 Portal
  2. Test your IPv6 connectivity on test-ipv6.com
  3. The official IANA list of assigned IPv6 address space is very interesting
  4. The Google IPv6 deployment statistics
  5. The RIPE NCC IPv6 working group and mailing list

Book recommendations on IPv6

I can recommend the following 3 books (Amazon referral links) which I enjoyed reading:

This concludes IPv6 Foundation Part 9: IPv6 on Mac of the original IPv6 Foundation Master Class.

Previous Part: IPv6 Foundation Part 8: IPv6 on Linux

Next Part: IPv6 Foundation Part 10: IPv6 DNS, Monitoring & Address Management

Share this post

Share on pocket
Share on reddit
Share on facebook
Share on twitter
Share on linkedin
Share on xing