ndpresponder 是一个 Go 程序,监听网络接口上的 ICMPv6 邻居请求(Neighbor Solicitation),并按照 RFC 4861 IPv6 邻居发现协议规范回复邻居通告(Neighbor Advertisement)。
邻居通告的源 IPv6 地址与邻居请求中的目标地址保持一致,使 ndpresponder 能够在某些 KVM 虚拟服务器上正常工作——这类环境中 NDP 使用链路本地地址,但 ebtables 会丢弃来自链路本地地址的出站数据包。
程序同时响应单播(is-alive)和组播(who-has)邻居请求,确保路由器邻居缓存过期后 IPv6 地址仍然可达。
本程序使用 Go 编写,编译安装命令:
env CGO_ENABLED=0 go install github.com/oneclickvirt/ndpresponder@main也可使用 Docker 容器方式运行:
docker build -t localhost/ndpresponder 'github.com/oneclickvirt/ndpresponder#main'
docker run -d --name ndpresponder --network host localhost/ndpresponder [参数]程序可对一个或多个子网内的任意地址响应邻居请求,建议将子网范围尽量缩小。
sudo ndpresponder -i eth0 -n 2001:db8:3988:486e:ff2f:add3:31e3:7b00/120-i指定网络接口名称。-n指定需要响应的 IPv6 子网,可重复使用以指定多个子网。
systemd 单元文件示例参见 ndpresponder.service。
程序可对 Docker 网络中已分配的容器地址响应邻居请求。容器连接到网络时,程序会向网关路由器通告新地址的存在。
docker network create --ipv6 --subnet=172.26.0.0/16 \
--subnet=2001:db8:1972:beb0:dce3:9c1a:d150::/112 ipv6exposed
docker run -d \
--restart always --cpus 0.02 --memory 64M \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
--cap-drop=ALL --cap-add=NET_RAW --cap-add=NET_ADMIN \
--network host --name ndpresponder \
localhost/ndpresponder -i eth0 -N ipv6exposed-i指定网络接口名称。-N指定 Docker 网络名称,可重复使用以指定多个网络。
通过设置 NDPRESPONDER_LOG 环境变量调整日志级别,可选值为 DEBUG、INFO、WARN、ERROR、FATAL。
sudo NDPRESPONDER_LOG=WARN ndpresponder [参数]
docker run -e NDPRESPONDER_LOG=WARN [其他参数]本项目基于 yoursunny/ndpresponder 的原始工作改进而来,感谢其提供的优秀基础实现。