{"id":1348,"date":"2026-10-14T14:55:15","date_gmt":"2026-10-14T14:55:15","guid":{"rendered":"https:\/\/blog.miguelsarmiento.com\/?p=1348"},"modified":"2026-10-14T14:55:16","modified_gmt":"2026-10-14T14:55:16","slug":"ipv6-delegation-follow-up-ndproxy-oh-my","status":"publish","type":"post","link":"https:\/\/blog.miguelsarmiento.com\/?p=1348","title":{"rendered":"IPv6 Delegation, Follow Up, NDProxy, Oh My!"},"content":{"rendered":"\n<p><br>This is a follow up to my PfSense blog.<\/p>\n\n\n\n<p>One thing that I mentioned in passing is that your ISP does not have to give you a global address on your WAN interface. Your LAN needs one if you want to access the Internet.<\/p>\n\n\n\n<!--more-->\n\n\n\n<h2 id=\"ula-vs-linklocal-addresses\" class=\"wp-block-heading\"><strong>ULA vs Link-Local addresses<\/strong><\/h2>\n\n\n\n<p>There are two ways for a an ISP or you if you are using your own internal router, to give a device an IPv6 address.<\/p>\n\n\n\n<h3 id=\"ula-addresses\" class=\"wp-block-heading\"><strong><em>ULA addresses<\/em><\/strong><\/h3>\n\n\n\n<p>You a get a Unique Local IPv6 (ULA) address on the WAN interface.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>These ULA addresses are of the form FC00::\/7.<\/li>\n\n\n\n<li>This is not a routable prefix on the Internet.<\/li>\n\n\n\n<li>The prefix above is exactly similar to the old 10.0.0.0\/8 super-net.<\/li>\n\n\n\n<li>They can be used for local communications within a site.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"link-local-addreses\" class=\"wp-block-heading\"><strong><em>Link Local Addreses<\/em><\/strong><\/h3>\n\n\n\n<p>You do not get a prefix on the WAN interface.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You only receive a default route<\/li>\n\n\n\n<li>The default route is via the prefix fe80::\/10. <\/li>\n\n\n\n<li>These prefixes are labeled as link local addresses.<\/li>\n\n\n\n<li>They are automatically configured on interfaces.<\/li>\n\n\n\n<li>They talk to neighbors via the Network Discovery Protocol (NDP).<\/li>\n\n\n\n<li>They can also talk to neighbors via routing protocols.<\/li>\n\n\n\n<li>Any routing protocol will work on them!<\/li>\n\n\n\n<li>Link-local addresses cannot be routed beyond the local link.<\/li>\n<\/ul>\n\n\n\n<h3 id=\"configuration\" class=\"wp-block-heading\"><strong><em>Configuration<\/em><\/strong><\/h3>\n\n\n\n<p>One way of doing this for example is to use the following snippet on you RADVD configuration.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">interface eth0 {\n    AdvSendAdvert on;\n    # No prefix blocks defined here\n};<\/pre>\n\n\n\n<p>This basically is just advertising a default route via the link-local address of the RAVD server. <\/p>\n\n\n\n<p>This brings me to another point, unlike a DHCPv6 server, a RADVD server needs to see all segments that need IPv6 routing information or SLAAC configuration.<\/p>\n\n\n\n<p>Thus, a RADVD server needs multiple interfaces (if you have 100 network segments or VLANS that would be quite a device!), or a L2\/L3 device that has all of those VLANS defined. The default route is the RADVD server itself. Thus, RADVD servers are always devices capable of routing.<\/p>\n\n\n\n<p>However there is a scenario in which you may have two network segments not directly connected, in that case we could use an NDPROXY sever. We will discuss this later on.<\/p>\n\n\n\n<p>I have not encountered yet an ISP that will give you ULA addresses, all of the ISPs that I have used and provided me with IPv6 prefixes (corporate or consumer wise) have always given me a link-local address on the WAN interface and the corresponding default route through it.<\/p>\n\n\n\n<p>This is in my opinion the more cleaner, logical and simpler way of implementing routing for IPv6 devices.<\/p>\n\n\n\n<p>Every vendor implements the above mechanism differently. On Linux the snippet stated is used.<\/p>\n\n\n\n<p>On Cisco routers:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>On the router delegating prefixes, enable IPv6 on the interface but do not configure an IPv6 address.\n<ul class=\"wp-block-list\">\n<li>The router will advertised a default route via ND (network discovery protocol).<\/li>\n\n\n\n<li>Since it does not have an IPv6 address, ND will not advertised a prefix to the clients.<\/li>\n<\/ul>\n<\/li>\n\n\n\n<li>On clients you have two ways of requesting the default route:\n<ul class=\"wp-block-list\">\n<li>Enable IPv6 and let the client request a default route using <strong><em>\u201cipv6 address autoconfig default\u201d<\/em><\/strong>.<\/li>\n\n\n\n<li>By default the client will request a prefix and a default route. In our case since no prefix was configured none is given.<\/li>\n\n\n\n<li>The command will also overwrite a default route learned by other means.<\/li>\n\n\n\n<li>Or you can use&nbsp;\u201c<em><strong>ipv6 nd autoconfig default-route\u201d<\/strong><\/em>, this also requests a default route.<\/li>\n\n\n\n<li>It uses the RAs advertisements via ND.<\/li>\n\n\n\n<li>In this case it only requests a default route regardless if you configured a prefix or not.<\/li>\n\n\n\n<li>This is used for example if you have a DHCPv6 server and it is handling pool of prefixes given to clients.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n\n\n<h2 id=\"ndproxy\" class=\"wp-block-heading\"><strong>NDPROXY<\/strong><\/h2>\n\n\n\n<p>An NDPROXY server, is a server that allows you to connect different IPv6 segments that otherwise would not to be able to connect however, devices on those networks need to be on the same network.<\/p>\n\n\n\n<p>For more information you can check the following:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.cisco.com\/c\/en\/us\/td\/docs\/wireless\/controller\/9800\/17-18\/config-guide\/b_wl_17_18_cg\/m-nd-proxy.pdf\" data-type=\"link\" data-id=\"https:\/\/www.cisco.com\/c\/en\/us\/td\/docs\/wireless\/controller\/9800\/17-18\/config-guide\/b_wl_17_18_cg\/m-nd-proxy.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">Neighbor Discovery Proxy (Cisco)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.cisco.com\/c\/en\/us\/td\/docs\/switches\/lan\/catalyst9600\/software\/release\/17-14\/configuration_guide\/ip\/b_1714_ip_9600_cg\/ipv6_neighbor_discovery_proxy.pdf\" data-type=\"link\" data-id=\"https:\/\/www.cisco.com\/c\/en\/us\/td\/docs\/switches\/lan\/catalyst9600\/software\/release\/17-14\/configuration_guide\/ip\/b_1714_ip_9600_cg\/ipv6_neighbor_discovery_proxy.pdf\" target=\"_blank\" rel=\"noreferrer noopener\">IPv6 Neighbor Discovery Proxy (Cisco)<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/community.fortinet.com\/fortigate-3\/technical-tip-neighbor-discovery-protocol-ndp-and-configuring-nd-proxy-156720\" data-type=\"link\" data-id=\"https:\/\/community.fortinet.com\/fortigate-3\/technical-tip-neighbor-discovery-protocol-ndp-and-configuring-nd-proxy-156720\" target=\"_blank\" rel=\"noreferrer noopener\">Fortinet<\/a><\/li>\n\n\n\n<li><a href=\"https:\/\/www.juniper.net\/documentation\/us\/en\/software\/junos\/neighbor-discovery\/topics\/topic-map\/ndp-dad-proxy.html\" data-type=\"link\" data-id=\"https:\/\/www.juniper.net\/documentation\/us\/en\/software\/junos\/neighbor-discovery\/topics\/topic-map\/ndp-dad-proxy.html\" target=\"_blank\" rel=\"noreferrer noopener\">NDP Proxy and DAD Proxy (Juniper)<\/a><\/li>\n<\/ul>\n\n\n\n<p>One of the main points that you should get, is that NDPROXY does not allow you to subnet \/64 into smaller networks. This will break SLAAC.<\/p>\n\n\n\n<p>A couple of scenarios in which an NDPROXY is useful.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>You have WI-FI clients and  you can only get \/64 or you want to put them on a particular network that is secure by some means.<\/li>\n\n\n\n<li>You have two network segments that are connected to their own gateways. You want devices on those IPV6 network two be on the same IPv6 network.<\/li>\n<\/ul>\n\n\n\n<p>You may asked that in the first example it makes sense since perhaps your ISP gave you a \/64 and you want to use WI-FI. <\/p>\n\n\n\n<p>On the second scenario however, if you have a \/56 for example why would you use an NDPROXY router.<\/p>\n\n\n\n<p>You could span your L2 domains into a bigger L2 domain, this could become un-manageable, you could have broadcast storms, etc.<\/p>\n\n\n\n<p>You are migrating to a new physical segment and you want to keep the same numbering scheme, using an NDPROXY makes sense.<\/p>\n\n\n\n<p>NDPROXY is similar to IPv4 proxy ARP, other than they work on different versions of the Internet Protocol of course.  <\/p>\n\n\n\n<h2 id=\"summary\" class=\"wp-block-heading\"><strong>SUMMARY<\/strong><\/h2>\n\n\n\n<p>This note came about because I saw once again on forums confusion among others regarding this mechanism.<\/p>\n\n\n\n<p>I also read that some confuse NDPROXY as allowing them to subnet a \/64 segment, which it will not do.<\/p>\n\n\n\n<p>Hopefully, this will be informative.<\/p>\n\n\n\n<p>For additional information look at this <a href=\"https:\/\/oneuptime.com\/blog\/post\/2026-03-20-ipv6-link-local-next-hops\/view\" data-type=\"link\" data-id=\"https:\/\/oneuptime.com\/blog\/post\/2026-03-20-ipv6-link-local-next-hops\/view\" target=\"_blank\" rel=\"noreferrer noopener\">blog<\/a> article. Unlike some others is it useful and to the point.<\/p>\n\n\n\n<p>There you have it.<\/p>\n\n\n\n<p>Ciao.<\/p>\n\n\n\n<p>&nbsp;<\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>This is a follow up to my PfSense blog. One thing that I mentioned in passing is that your ISP does not have to give you a global address on your WAN interface. Your LAN needs one if you want to access the Internet.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[13,14,10,11],"tags":[],"class_list":["post-1348","post","type-post","status-publish","format-standard","hentry","category-ipv6","category-linux","category-misc","category-routing"],"_links":{"self":[{"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=\/wp\/v2\/posts\/1348","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1348"}],"version-history":[{"count":51,"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=\/wp\/v2\/posts\/1348\/revisions"}],"predecessor-version":[{"id":1454,"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=\/wp\/v2\/posts\/1348\/revisions\/1454"}],"wp:attachment":[{"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1348"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1348"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1348"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}