在CentOS 9 Stream上配置IPv6子网NDP代理完整指南
背景和问题
在IPv6环境中,服务提供商通常会分配一个/64的子网,但默认情况下只有一个地址可用。要使整个子网内的任意IPv6地址都能被路由到您的服务器,需要配置NDP(邻居发现协议)代理。本文介绍如何在CentOS 9 Stream上实现此功能。
什么是NDP代理?
IPv6使用邻居发现协议(NDP)来替代IPv4中的ARP协议。当路由器接收到发往特定IPv6地址的数据包时,它会发送邻居请求来确定哪台设备拥有该地址。NDP代理允许您的服务器响应发往整个子网的请求,即使这些地址尚未配置在服务器上。
配置步骤
1. 启用IPv6转发
首先,需要启用IPv6转发和NDP代理功能:
# 配置IPv6转发
echo "net.ipv6.conf.all.forwarding=1" > /etc/sysctl.d/99-ipv6-proxy.conf
echo "net.ipv6.conf.default.forwarding=1" >> /etc/sysctl.d/99-ipv6-proxy.conf
echo "net.ipv6.conf.all.proxy_ndp=1" >> /etc/sysctl.d/99-ipv6-proxy.conf
echo "net.ipv6.conf.default.proxy_ndp=1" >> /etc/sysctl.d/99-ipv6-proxy.conf
# 为特定接口启用转发和代理
echo "net.ipv6.conf.enp1s0.forwarding=1" >> /etc/sysctl.d/99-ipv6-proxy.conf
echo "net.ipv6.conf.enp1s0.proxy_ndp=1" >> /etc/sysctl.d/99-ipv6-proxy.conf
# 应用配置
sysctl -p /etc/sysctl.d/99-ipv6-proxy.conf
2. 安装NDP代理守护程序(ndppd)
# 启用EPEL源
dnf install -y epel-release
# 安装ndppd
dnf install -y ndppd
3. 配置ndppd !重要!
# 创建配置文件,替换enp1s0为您的实际网络接口名称 可以ifconfig看
cat > /etc/ndppd.conf << EOF
proxy enp1s0 {
router no
rule 2001:19f0:xxxx:xxxx::/64 {
static
}
}
EOF
4. 创建PID文件目录
# 创建PID文件目录
mkdir -p /var/run/ndppd
chmod 755 /var/run/ndppd
5. 启动ndppd服务
# 启用ndppd服务开机自启
systemctl enable ndppd
# 启动ndppd服务
systemctl start ndppd
6. 添加本地路由
这是关键步骤,确保系统能处理发往子网内任意地址的流量:
# 添加本地路由 !!非常重要!!
ip -6 route add local 2001:19f0:xxxx:xxxx::/64 dev lo
7. 配置防火墙
# 允许IPv6相关流量
firewall-cmd --permanent --zone=public --add-protocol=ipv6-icmp
firewall-cmd --permanent --zone=public --add-service=dhcpv6-client
firewall-cmd --reload
验证配置
使用tcpdump监控NDP请求和响应:
# 监控NDP请求和响应 验证服务商是否支持NDP已知vultr支持
tcpdump -i enp1s0 icmp6 and '(ip6[40] = 135 or ip6[40] = 136)'
正常情况下,当有外部设备尝试访问子网内的任意地址时,您应该能看到:
- 外部设备发送邻居请求(Neighbor Solicitation)
- 您的服务器回应邻居公告(Neighbor Advertisement)
排障要点
- 确保使用正确的网络接口名称:使用
ip -6 addr show
命令检查实际的接口名称 - 检查ndppd服务状态:使用
systemctl status ndppd
确认服务正在运行 - PID文件权限问题:这通常不影响功能,只要服务显示为"active (running)"
- 务必添加本地路由:如果NDP代理工作但仍无法ping通,很可能是缺少本地路由
- 检查防火墙规则:确保允许ICMPv6流量
完整的解决方案
通过配置NDP代理和本地路由,您的CentOS 9 Stream服务器现在可以响应整个IPv6子网的请求,使子网内的任意地址都能被路由到服务器。这对于需要使用多个IPv6地址的场景(如网站托管、VPN服务等)非常有用。
这种方法比手动为每个IPv6地址配置NDP代理更加高效,能够处理整个/64子网(包含约18.4×10^18个地址)。