Welcome to this series on Cisco’s implementation of IPv6. We recently concluded a vendor-independent series on IPv6 on the Intense School site. I suggest that you go through that series first because it already lays a solid foundation on IPv6 concepts. You can find the first article in that series here.

We will make this series as practical as possible; therefore, we will be using GNS3 for our lab scenarios. Let’s begin with a basic network diagram as shown below.

I am using a 3725 with 12.4T IOS for RTR_A and a 7206 with 15.2S IOS for CORE_RTR. I have used two different software images so that we see the differences and/or additions between newer and older IOS versions.

Enabling IPv6 on interfaces

The first thing we want to do is enable IPv6 on the routers’ interfaces. By default, IPv6 is not enabled on interfaces.

You can enable IPv6 on an interface either by assigning an IPv6 address to the interface (using the ipv6 address command) or by issuing the ipv6 enable interface configuration command. Let’s use the ipv6 enable command on RTR_A’s Fa0/0 interface and then configure a global unicast address on its Fa0/1 interface using the ipv6 address command.

Notice that in both cases, a link-local address is automatically configured on the router’s interface as highlighted in blue above. I can test connectivity to the host connected on the same link as RTR_A’s Fa0/0 interface. The link-local IPv6 address of that host is highlighted below:

Now, I will try to ping the host’s link-local address and see if I get a response. Notice that I don’t specify the “%39” part in my ping because that is the zone index local to that host. Refer to this article on the IPv6 scoped address architecture for more information on this.

The ping was successful. This tells us that link-local addresses are sufficient for communication between neighbors.

Hint: When you ping a link-local IPv6 address on a Cisco router, it will ask you to specify the output interface. The reason behind this is also explained in the IPv6 scoped address architecture article. When specifying the output interface, you must specify the full name without spaces.

By assigning an IPv6 address on RTR_A’s Fa0/1 interface, we have gone ahead of ourselves. Let’s take a look at the ipv6 address command in detail:

The first option allows us to specify the name of a general prefix. We will talk about general prefixes in the next article but in a nutshell, they help reduce the burden of addressing by allowing you to define a shorter general prefix (e.g. a /48) from which other longer prefixes (e.g. /64) can be defined.

The second and third options are similar except that when configuring link-local addresses, we do not need to specify a prefix length. Finally, the last option allows the router to perform stateless address autoconfiguration on that interface.

With the exception of the general prefix and autoconfig options, we will now look at the two remaining options one after the other. We will use RTR_A’s Fa0/1 interface as our test interface; therefore I will remove the IPv6 address currently configured on it.

As you can see, when I remove the IPv6 address, the link-local address also goes away because that interface does not have the ipv6 enable command. This tells us that assigning an IPv6 address on an interface even without the ipv6 enable command automatically enables IPv6 on that interface, but if we remove the ipv6 address command and there is also no ipv6 enable command on that interface, IPv6 is disabled on that interface.

Moving on, let’s statically configure a link-local address on this Fa0/1 interface. Although link-local addresses will always be automatically configured when IPv6 is enabled on an interface, an administrator may find it easier to remember that his router is at fe80::1:1 rather than fe80::c003:6ff:fe44:0. Link-local addresses will always begin with fe80::/64 followed by the interface identifier.

Note: The link-local prefix is actually fe80::/10 but since the 54 bits that follow it are 0s, the prefix is effectively fe80::/64.

As you can see, since I didn’t specify a prefix length after typing the IPv6 address, the router automatically expects that I’m specifying a link-local address, but just to be on the safe side and avoid mistakes, I specify the link-local option.

To see the second option, I will configure a global unicast address on the same interface. The format will vary depending on what I want to configure. If I’m configuring a full IPv6 address, the format is ipv6_address/prefix_length. However, if I want the router to generate the interface ID using the EUI-64 format, the format is prefix/prefix length eui-64. You can learn about the EUI-64 format from this article.

I noticed that if you override the default or automatically generated link-local address, the interface ID is also overridden. Therefore, any new address that you generate using the EUI-64 format will use the new interface ID and not the normal MAC address conversion; an already generated address will not change. Let me show you what I mean:

As you can see, this new address uses the interface ID “0:0:a:1” as configured on the link-local address.

At this point, let’s go over to the CORE_RTR and configure an IPv6 address for it using the 2001:db8:1000::/64 prefix.

Hint: Since I used the EUI-64 method to generate the interface ID and I have not altered the automatically generated link-local address, you can see that the interface ID of both the link-local address and the global unicast address are the same.

I can ping to verify connectivity between my routers:

Notice that when pinging a global unicast IPv6 address, there is no need to specify what interface to ping through since global unicast addresses are supposed to be unique all over the world, just like IPv4 public addresses.

Enabling IPv6 routing

Even though we have enabled IPv6 on our interfaces, the routers are basically acting as IPv6 hosts right now because we have not enabled IPv6 routing (forwarding) on them. IPv4 routing is enabled by default on Cisco routers but we need to explicitly enable IPv6 routing by using the ipv6 unicast-routing command.

Before IPv6 routing is enabled on routers, they will only send neighbor advertisement and neighbor solicitation messages. However, once IPv6 routing is enabled on routers, they begin sending router advertisement messages and also respond to router solicitation messages.

Common IPv6 show commands

Let us look at common show commands for IPv6 on Cisco routers. The first one which I used many times above is the show ipv6 interface brief command. As you can see, the syntax is very similar to the show ip interface brief command although the output looks a bit different.

We also have the show ipv6 interface <interface_name> command, which gives you more IPv6 details about a particular interface including neighbor discovery information and IPv6 multicast groups.

More specific to IPv6 is the show ipv6 neighbors command, which shows us the neighbor cache of the router.

Finally, we can see the IPv6 routing table through the show ipv6 route command.


This brings us to the end of this introductory article on Cisco IPv6. We have seen how to enable IPv6 on interfaces and also how to enable IPv6 routing on Cisco routers. Finally, we looked at common IPv6 show commands including show ipv6 route and show ipv6 neighbors.

In the next article, we will look at stateless address autoconfiguration for Cisco routers and also discuss general prefixes. I hope you have found this article insightful and I look forward to the next article in the series.

References and further reading