{"id":1408,"date":"2026-10-16T15:40:36","date_gmt":"2026-10-16T15:40:36","guid":{"rendered":"https:\/\/blog.miguelsarmiento.com\/?p=1408"},"modified":"2026-10-16T15:40:37","modified_gmt":"2026-10-16T15:40:37","slug":"ipv6-neighbor-discovery-nd-proxy-oh-my","status":"publish","type":"post","link":"https:\/\/blog.miguelsarmiento.com\/?p=1408","title":{"rendered":"IPv6 Neighbor Discovery (ND) Proxy, Oh My!"},"content":{"rendered":"\n<p>In a couple of blogs and I had  mentioned ND-PROXY.<\/p>\n\n\n\n<p>ND-PROXY is an IPv6 Neighbor Discover Proxy, it allows a router or a node to respond to IPv6 Neighbor Solicitations (NS) messages.<\/p>\n\n\n\n<p>It does this on behalf of hosts located on another segment within the same sub-net or prefix.<\/p>\n\n\n\n<p>It is useful for example if you have \/64 prefix and want to put wireless clients on it but do not want to use an existing prefix or you ISP only gave you a \/64 (the nerve!).<\/p>\n\n\n\n<p>I will go over a configuration on a Linux server stitching a couple of IPv6 segments.<\/p>\n\n\n\n<p><\/p>\n\n\n\n<!--more-->\n\n\n\n<h1 id=\"motivation\" class=\"wp-block-heading\"><strong>Motivation<\/strong><\/h1>\n\n\n\n<p>As stated ND-PROXY is a user space IPv6 Neighbor Discovery Proxy.<\/p>\n\n\n\n<p>According to OPN-Sense documentation and I quote:<\/p>\n\n\n\n<p><span style=\"font-variant: normal;\"><span style=\"color: #373736;\"><span style=\"letter-spacing: normal;\">\u201c<\/span><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><span style=\"letter-spacing: normal;\"><i><b>It can proxy SLAAC on-link prefixes to several downstream interfaces by proxying neighbor discovery protocol (NDP), router advertisements (RA) and duplicate address detection (DAD). For each discovered client it installs host routes automatically&#8221;.<\/b><\/i><\/span><\/span><\/span><\/span><\/span><\/p>\n\n\n\n<p>Or quoting Cisco in their &#8220;IPv6 Neighbor Discovery Proxy&#8221; document:<\/p>\n\n\n\n<p><span style=\"color: #373736;\"><span style=\"font-family: Liberation Serif, serif;\"><span style=\"font-size: medium;\"><i><b>\u201cA device operating as an IPv6 routing proxy listens to all neighbor discovery proxy messages sent on the link and responds unconditionally to neighbor solicitation lookup and neighbor-unreachability-detection messages with neighbor advertisement (setting the SVI MAC address in the TLLA option) on behalf of the destination hosts to attract the traffic to itself\u201d<\/b><\/i><\/span><\/span><\/span>.<\/p>\n\n\n\n<p>If you only got a \/64, you may want to have parts of you network talk to each and also reach the Internet but they are on different segments. They could be for example wireless devices.<\/p>\n\n\n\n<p>This happens because you cannot sub-net a \/64 network. Technically speaking you can and it is done on routers all the time, because you want control of the IP they get.<\/p>\n\n\n\n<p>This breaks SLAAC however, at this point you are not doing SLAAC on those routers.<\/p>\n\n\n\n<p>To properly proxy requests you may also want bi-directional access, if this is for wireless devices that may not be necessary, in general you need to run your proxy on the interfaces that needed on the intermediate router.<\/p>\n\n\n\n<p>We will run the lab in two parts, first we will use a manual configuration, then we will use a daemon to automatically learn the devices and proxy them.<\/p>\n\n\n\n<p>The following diagram shows the network in use:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/blog.miguelsarmiento.com\/wp-content\/uploads\/2026\/10\/nd-proxy.png\" target=\"_blank\" rel=\" noreferrer noopener\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"625\" src=\"https:\/\/blog.miguelsarmiento.com\/wp-content\/uploads\/2026\/10\/nd-proxy-1024x625.png\" alt=\"\" class=\"wp-image-1466\" srcset=\"https:\/\/blog.miguelsarmiento.com\/wp-content\/uploads\/2026\/10\/nd-proxy-1024x625.png 1024w, https:\/\/blog.miguelsarmiento.com\/wp-content\/uploads\/2026\/10\/nd-proxy-300x183.png 300w, https:\/\/blog.miguelsarmiento.com\/wp-content\/uploads\/2026\/10\/nd-proxy-768x468.png 768w, https:\/\/blog.miguelsarmiento.com\/wp-content\/uploads\/2026\/10\/nd-proxy.png 1192w\" sizes=\"auto, (max-width: 767px) 89vw, (max-width: 1000px) 54vw, (max-width: 1071px) 543px, 580px\" \/><\/a><\/figure>\n\n\n\n<p class=\"has-text-align-center\">Fig. Network Diagram.<\/p>\n\n\n\n<p>A few things to consider:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>We have a dual stack. <\/li>\n\n\n\n<li>The IPv4 network is an out-of-band network for managing devices.<\/li>\n\n\n\n<li>Router is your main router.<\/li>\n\n\n\n<li>Router could be an enterprise router connected to an ISP.<\/li>\n\n\n\n<li>Or a consumer router.<\/li>\n\n\n\n<li>Router  receives a delegation from the ISP on segment Net.<\/li>\n\n\n\n<li>Server is a device on the main segment. We have it for test purposes.<\/li>\n\n\n\n<li>Router2 is the ND-PROXY (NDP) server. <\/li>\n\n\n\n<li>Router2  connects segment Net with segment LAN.<\/li>\n\n\n\n<li>Client is a test device so we can ping devices on either side of Router2<\/li>\n\n\n\n<li>Finally we have a dnsmasq server, its use will become apparent when we automate everything.<\/li>\n<\/ul>\n\n\n\n<p>The goal is to proxy devices in \u201cLAN\u201d so they can access \u201cNet\u201d. However we also want devices in \u201cNet\u201d be able to access devices in \u201cLAN and finally devices in \u201cLAN\u201d should be able to access the Internet via Router if allowed.<\/p>\n\n\n\n<h1 id=\"configuration\" class=\"wp-block-heading\"><strong>Configuration<\/strong><\/h1>\n\n\n\n<p>We need to take care of a couple of things prior. We are using Ubuntu server for Router2. Below needs to be done according to your device OS instructions.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Enable forwarding on Router2 between e1 and e2.<\/li>\n\n\n\n<li>Enable NDP in the Linux kernel on the interfaces you want to proxy.<\/li>\n\n\n\n<li>Here we do it on e1 and e2, we do not need NDP on e0.<\/li>\n<\/ul>\n\n\n\n<h2 id=\"manual-configuration\" class=\"wp-block-heading\"><strong><em>Manual Configuration<\/em><\/strong><\/h2>\n\n\n\n<p>The reason to do a manual configuration first is because it will make a few things clear regarding how NDP works.<\/p>\n\n\n\n<p>A few things:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p style=\"margin-bottom: 0.04in;\">We give Client a static IPv6 address of fc00::500\/64.<\/p><\/li>\n\n\n\n<li><p style=\"margin-bottom: 0.04in;\">We are giving server (fc00::250:1ff:fe00:401) and Router2 (fc00::250:1ff:fe00:101) IPv6 addresses via RADVD from Router.<\/p><\/li>\n\n\n\n<li><p style=\"margin-bottom: 0.04in;\">Router has a static IPv6 addresses (fc00::1\/64, it is a router after all).<\/p><\/li>\n\n\n\n<li><p>\u201ce1\u201d is ens4, and \u201ce2\u201d is ens5 on the Ubuntu device.<\/p><\/li>\n<\/ul>\n\n\n\n<p>On Router2 we issue as root the following:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-small-font-size\">ip -6 neigh add proxy fc00::250:1ff:fe00:101 dev ens5<br>ip -6 neigh add proxy fc00::1 dev ens5<br>ip -6 neigh add proxy fc00::250:1ff:fe00:401  dev ens5<br>ip -6 neigh add proxy fc00::250:1ff:fe00:201 dev ens4<br>ip -6 neigh add proxy fc00::500 dev ens4<\/pre>\n\n\n\n<p>The first thing to notice is that we proxy the interface we want the segment to be accessed though.<\/p>\n\n\n\n<p>Here for example fc00::500 is on client via interface ens5, however you proxy it on ens4 because you want devices on \u201cNet\u201d to be able identify it.<\/p>\n\n\n\n<p>Same for all others, which brings us to the first issue, what if you have 10,000 devices you want to proxy. We will fix that next<\/p>\n\n\n\n<p>If you issue the command: \u201cip nd proxy show\u201d, it will show a list of all proxy entries (on Linux of course), on other OSes check the documentation.<\/p>\n\n\n\n<p>You will be able to ping from Client (fc00::500) router (fc00::1) and vice versa.<\/p>\n\n\n\n<p>Of course a reboot will loose the entries, so you could in principle add entries to &#8220;rc.local&#8221; and have them issued at every reboot. We will use a daemon to fix that next.<\/p>\n\n\n\n<h2 id=\"automatic-configuration\" class=\"wp-block-heading\"><strong><em>Automatic Configuration<\/em><\/strong><\/h2>\n\n\n\n<p>Several Operating systems have their own daemons that can be run, and do what we did above.<\/p>\n\n\n\n<p>Cisco has included it in their IOS (for 9000 devices), OPN-Sense and BSD use ndproxy and Linux has the ndppd daemon.<\/p>\n\n\n\n<p>Since I am using Ubuntu, I downloaded ndppd.<\/p>\n\n\n\n<p>I configured it and started the service. Nada, zilch, it was not working.<\/p>\n\n\n\n<p>After several hours of doing TCPDUMPs, trying several arguments on the configuration, etc, it would not work.<\/p>\n\n\n\n<p>Now ndppd has not being updated in a while (on GitHub at least). Someone on the forums stated they had a &#8220;go&#8221; implementation that was a re-write and claimed it worked.<\/p>\n\n\n\n<p>So I tried it. It did not work either! <\/p>\n\n\n\n<p>I was starting to despair when I came cross this, <a href=\"https:\/\/github.com\/unidoc\/unidoc-ndppd\">unidoc-ndppd<\/a>.<\/p>\n\n\n\n<p>I got it, complied it and run it. It worked!<\/p>\n\n\n\n<h2 id=\"unidocndppd\" class=\"wp-block-heading\"><strong><em>UNIDOC-NDPPD<\/em><\/strong><\/h2>\n\n\n\n<p>This is a fork of ndppd and it seems to be fairly new as of this writing. It also works on Linux and BSD, nice!<\/p>\n\n\n\n<p>After compiling, created a configuration file in he same directory and added the following (check the github README for syntax):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">proxy ens4 {<br>    rule fc00::\/64 {<br>        iface ens5<br>        autowire yes<br>    }<br>}<br><br>proxy ens5 {<br>    rule fc00::\/64 {<br>        iface ens4<br>        autowire yes<br>    }<br>}<\/pre>\n\n\n\n<p>As you can see:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p style=\"margin-bottom: 0.04in;\">I am running it on both interfaces.<\/p><\/li>\n\n\n\n<li><p style=\"margin-bottom: 0.04in;\">I proxy the prefix on both \u201cNet\u201d and \u201cLAN\u201d.<\/p><\/li>\n\n\n\n<li><p>Use autowire, which <span style=\"font-size: medium;\"><span style=\"font-weight: normal;\">add<\/span><\/span><span style=\"font-size: medium;\"><span style=\"font-weight: normal;\">s a <\/span><\/span><span style=\"font-size: medium;\"><span style=\"font-weight: normal;\">\/128 host route and removes it when it expires, <\/span><\/span><span style=\"font-size: medium;\"><span style=\"font-weight: normal;\">according to the documentation<\/span><\/span><span style=\"font-size: medium;\"><span style=\"font-weight: normal;\">.<\/span><\/span><\/p><\/li>\n<\/ul>\n\n\n\n<p><span style=\"font-size: medium;\">You can try other settings, above worked off the bat for me.<\/span><\/p>\n\n\n\n<p><span style=\"font-size: medium;\">So on Client, ping Router:<\/span><\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-small-font-size\">root@client:~# ping fc00::1<br>PING fc00::1 (fc00::1) 56 data bytes<br>64 bytes from fc00::1: icmp_seq=1 ttl=63 time=1.98 ms<br>64 bytes from fc00::1: icmp_seq=2 ttl=63 time=1.79 ms<br>64 bytes from fc00::1: icmp_seq=3 ttl=63 time=2.87 ms<br>64 bytes from fc00::1: icmp_seq=4 ttl=63 time=2.01 ms<br>64 bytes from fc00::1: icmp_seq=5 ttl=63 time=2.82 ms<br>64 bytes from fc00::1: icmp_seq=6 ttl=63 time=3.08 ms<br>64 bytes from fc00::1: icmp_seq=7 ttl=63 time=3.35 ms<\/pre>\n\n\n\n<p>Bingo. Now on server ping Client:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-small-font-size\">root@server:~# ping fc00::1548\nPING fc00::1548 (fc00::1548) 56 data bytes\n64 bytes from fc00::1548: icmp_seq=1 ttl=63 time=1.85 ms\n64 bytes from fc00::1548: icmp_seq=2 ttl=63 time=2.48 ms\n64 bytes from fc00::1548: icmp_seq=3 ttl=63 time=1.68 ms\n64 bytes from fc00::1548: icmp_seq=4 ttl=63 time=1.82 ms\n64 bytes from fc00::1548: icmp_seq=5 ttl=63 time=1.62 ms\n64 bytes from fc00::1548: icmp_seq=6 ttl=63 time=3.19 ms<\/pre>\n\n\n\n<p>The reason the IP is different from fc00::500, is because server now receives a DHCPv6 address from the dnsmaq server. Which brings me to next problem, wich we will discuss under &#8220;issues&#8221; below.<\/p>\n\n\n\n<p>This is working. We want to automate this, so I created a rc.local file, enable the rc-local service and added the following to it so it will be run after a reboot:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-small-font-size\"> #!\/bin\/bash<br><br>cd \/root\/source\/unidoc-ndppd-master\/<br>bin\/unidoc-ndppd -d -p \/var\/run\/unidoc-ndppd.pid -c ndppd.conf<br><br>exit 0<\/pre>\n\n\n\n<p>Of course, if you run this on a production system, do a make install which will put it on \/usr\/local\/sbin, then run it from there and copy the configuration file to \/etc\/.<\/p>\n\n\n\n<p>You can run this with dropped privileges, look at the github README file, something to consider.<\/p>\n\n\n\n<h2 id=\"systemd-service\" class=\"wp-block-heading\"><strong><em>Systemd Service<\/em><\/strong><\/h2>\n\n\n\n<p>Rather than use &#8220;rc.local&#8221;, on the directory you compiled unidoc-ndppd, do a &#8220;make install&#8221;.<\/p>\n\n\n\n<p>This will install unidoc-ndppd under &#8220;\/usr\/local\/sbin\/&#8221;.<\/p>\n\n\n\n<p>Then create the following file &#8220;\/etc\/systemd\/system\/unidoc-ndppd.service&#8221; and enter the following:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\" style=\"font-size:11px\">[Unit]<br>Description=NDP Proxy Daemon (UniDoc)<br>Documentation=man:ndppd(1) man:ndppd.conf(5) https:\/\/github.com\/unidoc\/unidoc-ndppd<br>#Wait for the network stack to be onlineAfter=network-online.target<br>Wants=network-online.target<br><br>[Service]<br>Type=forking<br># ndppd drops into the background natively with -d and creates a pid file PIDFile=\/run\/unidoc-ndppd.pid<br>ExecStart=\/usr\/local\/sbin\/unidoc-ndppd -d -p \/run\/unidoc-ndppd.pid -c \/etc\/ndppd.conf<br>Restart=on-failure<br>RestartSec=5s<br><br>#Basic security sandboxingProtectSystem=true<br>ProtectHome=true<br>ReadWritePaths=\/run<br><br>[Install]<br>WantedBy=multi-user.target<\/pre>\n\n\n\n<p>At a prompt then issue:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">#sudo systemctl daemon-reload<br>#sudo systemctl enable unidoc-ndppd.service<br>#sudo systemctl start unidoc-ndppd.service<\/pre>\n\n\n\n<p>Next time after a reboot NDP will run automatically.<\/p>\n\n\n\n<h1 id=\"issues\" class=\"wp-block-heading\"><strong>Issues<\/strong><\/h1>\n\n\n\n<p>Now you have NDP running.<\/p>\n\n\n\n<p>However, you are going to run into a chicken and an egg problem.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><p style=\"margin-bottom: 0in;\">You have a proxy working.<\/p><\/li>\n\n\n\n<li><p style=\"margin-bottom: 0in;\">You do not want to manually add IPv6 addresses.<\/p><\/li>\n\n\n\n<li><p style=\"margin-bottom: 0in;\">You run RADVD on Router2, your proxy stops working.<\/p>\n<ul class=\"wp-block-list\">\n<li><p style=\"margin-bottom: 0in;\">This is fairly obvious, you have a RADVD server on Router and now you have also another RADVD server on Router2.<\/p><\/li>\n\n\n\n<li><p style=\"margin-bottom: 0in;\">Since both want to advertise RA announcements (normally not an issue if these are different prefixes), here you are advertising the same!<\/p><\/li>\n<\/ul>\n<\/li>\n\n\n\n<li><p style=\"margin-bottom: 0in;\">Solution, do not advertise a prefix from Router2.<\/p><\/li>\n\n\n\n<li><p style=\"margin-bottom: 0in;\">Still, you want to give devices on segment \u201cLAN\u201d IPv6 addresses. Use dnsmasq to do so.<\/p><\/li>\n\n\n\n<li><p style=\"margin-bottom: 0in;\">Tricky though, since Router2 has no IPv6 address on the LAN interface, dnsmasq will refuse to give IPv6 addresses.<\/p><\/li>\n\n\n\n<li><p style=\"margin-bottom: 0in;\">Solution, create another server to have an IPv6 pool and more important suppress dnsmasq from advertising a default route. Router2 is already doing it.<\/p>&nbsp;<\/li>\n<\/ul>\n\n\n\n<h2 id=\"radvd\" class=\"wp-block-heading\"><strong><em>RADVD<\/em><\/strong><\/h2>\n\n\n\n<p>On router2 install radvd and create the following tidbit on its configuration file.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">interface ens5 {<br>    AdvSendAdvert on;<br>    MinRtrAdvInterval 30;<br>    MaxRtrAdvInterval 100;<br>    prefix ::\/64 {<br>        AdvOnLink off;<br>        AdvAutonomous off;<br>    };<br>};<\/pre>\n\n\n\n<p>We want this instance of radvd to advertise a default route, since it does not have an IPv6 address (and we do not want to give it one), create a dummy prefix and suppress its advertisement.<\/p>\n\n\n\n<p>Start the server and you will see that clients on the \u201cLAN\u201d segment are receiving a default route but not an IPv6 addresses.<\/p>\n\n\n\n<h2 id=\"dnsmasq\" class=\"wp-block-heading\"><strong><em>DNSMASQ<\/em><\/strong><\/h2>\n\n\n\n<p>Now wee need to configure dnsmasq so it can serve addresses.<\/p>\n\n\n\n<p>I am using Alpine server, you could use a virtual machine for example if you do not have access to a spare server.<\/p>\n\n\n\n<p>Add the following to dnsmasq.conf as follows and also give the machine a static IP addresses, in our case fc00::100\/64, make sure that enable-ra is off.<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">interface=eth1<br>bind-interfaces<br><br>dhcp-range=fc00::1000,fc00::2000<\/pre>\n\n\n\n<p>Start dmsmasq, on Client for example you will see:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-small-font-size\">root@client:~# ip add<br>\u2026<br>3: ens4: &lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc fq_codel state UP group default qlen 1000&nbsp;link\/ether 00:50:01:00:02:01 brd ff:ff:ff:ff:ff:ff&nbsp;altname enp0s4&nbsp;inet6 fc00::1548\/128 scope global dynamic&nbsp;valid_lft 7342sec preferred_lft 7042sec&nbsp;inet6 fe80::250:1ff:fe00:201\/64 scope link&nbsp;valid_lft forever preferred_lft forever<br><br>root@client:~# ip -6 route<br>fc00::1548 dev ens4 proto kernel metric 256 expires 7331sec pref medium<br>fe80::\/64 dev ens3 proto kernel metric 256 pref medium<br>fe80::\/64 dev ens4 proto kernel metric 256 pref medium<br>default via fe80::250:1ff:fe00:102 dev ens4 proto ra metric 100 expires 254sec hoplimit 64 pref medium<\/pre>\n\n\n\n<p>Interface ens4 received a \/128 addresses, this is what DHCPv6 gives you (not a \/64), this because DHCPv6 handles individual IPs to devices not networks. A RADVD server handles prefixes and RA announcements.<\/p>\n\n\n\n<p>A \/128 is still route-able because it is a sub-net of anything bigger and thus accessible if there is a suitable route. That suitable route once again is being handled by a RDVD server.<\/p>\n\n\n\n<p>Also there is only one default route entry, pointing to Router2 and not the dnsmasq server.<\/p>\n\n\n\n<p>Finally since Router, Router2, etc, have default routes (Router is receiving its route via WWW) you will be able to ping the Internet.<\/p>\n\n\n\n<p>I gave WWW a fake Internet IP of 2001::1\/64, on Client you will be able to ping it (in your particular case you should be able to ping the web via your provider).<\/p>\n\n\n\n<pre class=\"wp-block-preformatted has-small-font-size\">root@client:~# ping 2001::1<br>PING 2001::1 (2001::1) 56 data bytes<br>64 bytes from 2001::1: icmp_seq=7 ttl=62 time=13.9 ms<br>64 bytes from 2001::1: icmp_seq=8 ttl=62 time=6.87 ms<br>64 bytes from 2001::1: icmp_seq=9 ttl=62 time=10.0 ms<br>64 bytes from 2001::1: icmp_seq=10 ttl=62 time=3.71 ms<br>64 bytes from 2001::1: icmp_seq=11 ttl=62 time=6.59 ms<br>64 bytes from 2001::1: icmp_seq=12 ttl=62 time=9.82 ms<\/pre>\n\n\n\n<p>There will be a few milliseconds delayed, because the proxy needs to get into gear.<\/p>\n\n\n\n<p>Voila! You are done.<\/p>\n\n\n\n<h1 id=\"conclusions\" class=\"wp-block-heading\"><strong>Conclusions<\/strong><\/h1>\n\n\n\n<p>NDP is a useful tool. It resolves an issue which otherwise would be very difficult to fix.<\/p>\n\n\n\n<p>Of course NDP cannot sub-net a \/64, this will break SLAAC. It only can do a subnet at a time so if you want to stich several, you will have to be creative.<\/p>\n\n\n\n<p>You can also run something other than DNSMAQ, for example the KEA dhcpv6 server which has replaced the old ISC DHCP server. If you do, you do not have to worry about it interfering with RAs advertisements.<\/p>\n\n\n\n<p>Unfortunately, you have to run and additional server to give IPv6 address on the second segment. The intermediary server needs an IPv6 on the so called &#8220;WAN&#8221; side however, it can not have an IPv6 of the same prefix on the &#8220;LAN&#8221; side.<\/p>\n\n\n\n<p>Ideally you would like to run the RADVD server and the DHPCv6 server on the same router. <\/p>\n\n\n\n<p>However, since DHCP needs an IP in order to give addresses from a pool, we are out of luck. <\/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","protected":false},"excerpt":{"rendered":"<p>In a couple of blogs and I had mentioned ND-PROXY. ND-PROXY is an IPv6 Neighbor Discover Proxy, it allows a router or a node to respond to IPv6 Neighbor Solicitations (NS) messages. It does this on behalf of hosts located on another segment within the same sub-net or prefix. It is useful for example if &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/blog.miguelsarmiento.com\/?p=1408\" class=\"more-link\">Continue reading<span class=\"screen-reader-text\"> &#8220;IPv6 Neighbor Discovery (ND) Proxy, Oh My!&#8221;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,13,14,10,11],"tags":[],"class_list":["post-1408","post","type-post","status-publish","format-standard","hentry","category-cisco","category-ipv6","category-linux","category-misc","category-routing"],"_links":{"self":[{"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=\/wp\/v2\/posts\/1408","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=1408"}],"version-history":[{"count":108,"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=\/wp\/v2\/posts\/1408\/revisions"}],"predecessor-version":[{"id":1568,"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=\/wp\/v2\/posts\/1408\/revisions\/1568"}],"wp:attachment":[{"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1408"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1408"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.miguelsarmiento.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1408"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}