从我的供应商到客户端的 Linux/Debian IPV6 路由不起作用。
IPV4 NAT/路由可以使用iptables
和可靠地工作dnsmasq
,但是,即使在 IPv6 上启用转发,我也无法使其工作。
RADVD 正在发布新网络,但是我无法访问任何公共 IPv6 地址。
简图
SW
| +---------+
+--->| client |
PUBLIC PRIVATE | +---------+
|
~/-(PR)-+ +---(ER)---+ | C0 +--(CL)---+
public |P0 E0 | extender | E1 +--->| client |
vendor |<----->| router |<------->| +---------+
| +----------+ |
~/---------+ | +---------+
+--->| client |
| +---------+
Where:
PR ISP Public router
P0 Public network interface
ER extender router Debian based, trying to configure
E0 Public network interface
E1 Private network interface
CL Test Client
C0 Private network interface
使用radvdump
ER 显示公共路由(编辑地址)
...
route 2600:..:5b10::/60
{
AdvRoutePreference high;
AdvRouteLifetime 1209600;
}; # End of route definition
在 ER 上,radvd
我在 E1 (2600:..:5b11) 上发布一个新的 /64 网络,
CL 收到发布的网络并使用 2600:..:5b11 网络上的全局地址配置自身。
ER 可以 ping6 并连接到:ipv6.google.com、P0、E0、E1 和 C0
CL 可以 ping6 并连接到:E0 和 E1,但 .. 不能 .. P0(也不是任何公共地址)
在ER->E1上tcpdump
显示ER的周期性路由器通告。
当我在 CL 上 ping 公共地址时,这是 ER-E1 上的捕获:
fe80::..:d477 is ER-E1
fe80::..:dff6 and 2600:..:5b11:..:f48 are CL-C0
fe80::..:f380 is PR-p0
2607:f8b0:4002:c0c::8a is ipv6.google.com
IP6 fe80::..:d477 > ff02::1: ICMP6, router advertisement, length 56
IP6 2600:..:5b11:..:f48 > 2607:f8b0:4002:c0c::8a: ICMP6, echo request, seq 1, length 64
IP6 fe80::..:dff6 > fe80::..:d477: ICMP6, neighbor solicitation, who has fe80::..:d477, length 32
IP6 fe80::..:d477 > fe80::..:dff6: ICMP6, neighbor advertisement, tgt is fe80::..:d477, length 24
IP6 fe80::..:d477 > fe80::..:dff6: ICMP6, neighbor solicitation, who has fe80::..:dff6, length 32
IP6 fe80::..:dff6 > fe80::..:d477: ICMP6, neighbor advertisement, tgt is fe80::..:dff6, length 24
IP6 fe80::..:d477 > ff02::1: ICMP6, router advertisement, length 56
CL 上的 Ping 刚刚挂起(直到超时),没有任何消息。
在 ER->E0 tcpdump
(简化)上:
IP6 2600:..:5b11:..:f48 > 2607:f8b0:4002:c0c::8a: ICMP6, echo request, seq 1, length 64
IP6 fe80::..:c446 > fe80::19d7:1db3:c381:23a: ICMP6, neighbor advertisement, tgt is fe80::..:c446, length 24
IP6 fe80::..:c446 > fe80::..:f380: ICMP6, neighbor solicitation, who has fe80::..:f380, length 32
IP6 fe80::..:f380 > fe80::..:c446: ICMP6, neighbor advertisement, tgt is fe80::..:f380, length 24
IP6 fe80::..:f380 > fe80::..:c446: ICMP6, neighbor solicitation, who has fe80::..:c446, length 32
IP6 fe80::..:c446 > fe80::..:f380: ICMP6, neighbor advertisement, tgt is fe80::..:c446, length 24
ER 路由表 (eth0=E0 eth1=E1)
2600:..:5b10::13 dev eth0 proto kernel metric 256 pref medium
2600:..:5b10::/64 dev eth0 proto kernel metric 256 expires 1209445sec pref medium
2600:..:5b10::/64 dev eth0 proto kernel metric 303 mtu 1500 pref medium
2600:..:5b11::/64 dev eth1 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth1 proto kernel metric 256 pref medium
default via fe80::..:f380 dev eth0 metric 303 mtu 1500 pref medium
default via fe80::..:f380 dev eth0 proto ra metric 1024 expires 1645sec hoplimit 64 pref medium
此时不涉及防火墙,甚至 ip6tables 也不涉及。
在 ER 上,我为所有默认设置了forwarding=1 和 proxy_ndp=1。
答案1
正如您所看到的,ping echo 请求在 E1 上到达并在 E0 上发出,因此在 ER 上,一切正常。
但是,您在 PR 上遇到了问题:当 ping echo 回复到达时,它将有一个目标地址2600:...:5b11:...:f48
。然而,PR 只知道5b10/60
P0 后面的子网,它不知道还有一个5b11/64
可通过 E0 到达的子网。所以我的猜测(必须在接口转储上验证这一点)是 PR2600:...:5b11:...:f48
在 P0 上进行邻居请求,但 ER 没有应答(因为它不拥有该地址),因此 PR 丢弃数据包。
我从未尝试过以这种方式设置包含子网的 IPv6,所以我不确定该推荐什么。我首先尝试的是在 E0 上通告5b11/64
,并查看此附加信息是否使 P0 转发数据包。
编辑
我发现NDPPD,邻居发现协议代理恶魔。如果 PR 确实发送了邻居请求但没有得到答复,则在 ER 上使用 ndppd 可能会解决此问题。
我自己还没用过。