我现在的情况是:
pppd
进行 PPPoE 拨号;ppp0
网卡,pppd
和局端协商到一个 IPv4 地址和一个 fe80::/10
的 IPv6 link-local 地址;fe80::/10
地址每十分钟给我个 Router Advertisement,里面包含一段 2408:8256:3075:BEEF::/64
( BEEF 那段每次拨号会变)。现在的问题是局端 RA 给我的 2408:8256:3075:BEEF::/64
这段地址只在 ppp0
网卡上存在(我猜是 pppd
给自动配上的?),此时我应该怎么办?直接分配这个 /64 给内网设备?如果是,用啥工具实现?
尝试过用 wide-dhcpv6-client
通过 ppp0
向局端再请求一个 /64,但是抓包显示局端回复 NoPrefixAvailable,是不是说局端就只给之前那个 /64 ?
感谢各位的回复,目前看起来问题已经解决了,当前的状况如下:
不过现在我还是不清楚 ppp0 上的 /64 是谁申请并且绑定上去的,猜测是 pppd?
感谢 @domosekai 一语点破,RA 和 PD 拿到的 /64 是完全不同的含义,总结下给后来人解惑:
pppd
进行 PPPoE 拨号后拿到的 fe80::/10
的 link-local 地址用于和局端通信获取 RA 或者进行 DHCPv6-PD 请求;ppp0
网卡上的 /64 地址是 Linux 内核的 IPv6 协议栈在接收到局端的 RA 后自动配置的;如果用 systemd-networkd 的 IPv6AcceptRA
则会禁用内核的 RA 处理,转而用 networkd 自带的运行在用户态的 RA 协议处理。wide-dhcpv6-client
进行 PD 获取 /64 的要点是要设置 sla-len = 0
(默认是16),不然会失败。 1
rio OP 补充:用这位老哥的[土办法]( https://forum.dd-wrt.com/phpBB2/viewtopic.php?p=1101319&sid=407bf03903486e59b4a2dd884386db42) 强制将 `ppp0` 上的那段 /64 分配给内网,但是因为每次拨号都会变,所以是不是还需要一个办法自动化这个过程?
|
2
Livid MOD 感觉给内网设备分配 IPv6 地址这件事情应该是内网里自己的 DHCPv6 服务器做的事情。
|
3
Livid MOD |
4
Livid MOD ISP 给了你 /64,然后你可以自己继续自由分配这个 /64 里面的 /128
|
5
Livid MOD |
6
rio OP @Livid 现在的问题是我不知道 Linux 上这个 PD 怎么配置,你的例子和网上的教程大部分都是使用 Unifi 或者 OpenWRT 这样的专用系统,对标准 Linux 系统没有指导意义😂
|
7
Livid MOD |
8
zro 2020-11-06 15:57:18 +08:00
|
9
rio OP @Livid 如果我手动把 ppp0 上的那段 /64 配置到 lan 网卡上,通过 dnsmasq 也可以分配 IPv6 地址给内网设备并且上网(就是这里 https://forum.dd-wrt.com/phpBB2/viewtopic.php?sid=407bf03903486e59b4a2dd884386db42&p=1101319 提供的土办法)。
现在我不太确定的地方是 ppp0 获取到的这段 /64 是否应该分配给内网?如果是的话,用什么软件包自动实现这个过程呢? 因为我看别人的教程好像是 ISP 给路由器一个 /64,但是路由器通过 DHCPv6 再请求一个新的 /64 再分配给内网设备(比如这个 http://www.routereflector.com/2016/10/enabling-ipv6-via-pppoe-on-a-telecom-italia-tim-link/ )。 |
10
XiaoxiaoPu 2020-11-06 16:36:12 +08:00
|
11
XiaoxiaoPu 2020-11-06 16:43:18 +08:00
你看的教程,其实就是自动获取 ISP 给你分配的前缀,并且把这个前缀通告到 lan 里。
「现在我不太确定的地方是 ppp0 获取到的这段 /64 是否应该分配给内网?如果是的话,用什么软件包自动实现这个过程呢?」教程里的 WIDE-DHCPv6 就是自动实现这个过程的软件。 |
12
Xymmh 2020-11-06 16:44:37 +08:00 via Android
@rio 只给 /64 不是不行,是可以正常分配给内网的,不用纠结这个。这是一种 ISP 很常规的 IPV6 分配方法(比如大部分教育网)。
分配方法可以是中继或者透传 你说的直接分配给内网应该相当于中继?应该是没有问题的。 |
14
rio OP @XiaoxiaoPu 按照你给的这个链接我也试过,wide-dhcpv6-client 会通过 ppp0 向局端发起请求,然后局端回复 NoPrefixAvailable,所以就回到最开始的问题了,如果局端只给分配一个 /64,并且这个 /64 被 pppd 分给了 ppp0 网卡,然后我该怎么自动把这个 /64 也分给内网设备呢?
|
15
XiaoxiaoPu 2020-11-06 16:51:15 +08:00
@rio 改一下你的 ppp 配置的 dhcp 客户端,使用 wide-dhcpv6
|
16
v2tudnew 2020-11-06 16:55:19 +08:00
运营商要是给个 60%前缀就好办了,你也应该试试光猫拨号能不能弄到 /60%,也许是系统问题
|
17
LnTrx 2020-11-06 16:59:11 +08:00
要确认运营商是否只给一段 /64,推荐的做法是临时改成光猫拨号,查看 IPv6 连接信息,以排除拨号配置层面的问题
|
18
XiaoxiaoPu 2020-11-06 17:01:26 +08:00
ppp 有点忘了,上面一条可能不太对,如果不能修改配置的话,可以试试用 hook script 自动生成 radvd.conf
|
19
rio OP @XiaoxiaoPu 想过用 ipv6-up script,但是实测发现 script 获取到的的 IPv6 地址是 fe80::/10 的 link-local 。RA 得到的 /64 不知道是什么东西给配置到 ppp0 网卡上去的😂
|
21
XiaoxiaoPu 2020-11-06 17:24:27 +08:00
@rio
你的 wide-dhcpv6 配置文件是按你找到的那个教程弄的吗?试试把 rapid-commit 去掉? 获取的是 link-local 地址,可能是因为脚本被拉起的比较早,这时候公网 IPv6 地址还没加上,可以考虑加个后台循环等待检测的逻辑 |
22
bubuyu 2020-11-06 17:27:33 +08:00
济南联通是 /60
|
23
rio OP @XiaoxiaoPu 诶改了下配置,再用 wide-dhcpv6-client 似乎可以获取单独再获取一段 /64 了…… 要点似乎是要把 sla-len 8 改成 sla-len 0 才行
|
24
XiaoxiaoPu 2020-11-06 18:46:56 +08:00
@rio 看了下文档,sla-id 跟获取的前缀组合在一起,会作为往 interface 通告的前缀 (sla-len 是 sla-id 的 bit 长度)。你获取的前缀就是 /64 的,所以 sla-len 需要设为 0 。
|
25
XiaoxiaoPu 2020-11-06 18:47:40 +08:00
如果你的运营商给你 /48,那么是可以把 sla-len 设为 8 的。
|
26
rio OP @XiaoxiaoPu 嗯,而且 sla-len 不写的话默认值是 16 很迷……
现在更加奇怪的是我在 ppp0 上抓包看不到任何 wide-dhcpv6-client 发起的 dhcpv6 pd 的请求,不知道它从哪里变出来一块 /64 来放到了 lan 网卡上😂 |
27
zwy100e72 2020-11-06 19:41:23 +08:00
之前在推特上我一直认为可以用 DHCP-PD + SLAAC 的方式配置 ... 那现在看到 NoPrefixAvailable 感觉是不太行了
要么就是请求的 prefix 太大超过了限制,这种情况的话考虑调小一点 sla-len 可能有用 [2][2] 还有一种方式,就是我说的转发 RA + NA + NS,也就是[这里][1] 提到的 relay 模式 [1]: https://openwrt.org/docs/guide-user/network/ipv6/start "Router Advertisement & DHCPv6" [2]: https://openwrt.org/docs/guide-user/network/ipv6/dhcp6c "Interface Settings" |
28
zwy100e72 2020-11-06 19:48:47 +08:00
默认配置 sla-len = 16 是因为,ipv6 network id 长度是 48 bit [1]. 建议尝试下 sla-len = 4,看看能不能分到 /60 的 prefix
[1]: https://ipcisco.com/lesson/subnetting-in-ipv6/ |
30
matrix67 2020-11-06 20:06:29 +08:00
@rio 说到光猫,楼主吟诗的光猫原因找到没有,hackernews 上说是 huawei 的一个专利,专门查有没有环路的。感觉还是国内论坛上可能有华为的工程师知道原委,哈哈。
感觉这样的行为是工程师最极致的浪漫,不亚于 linus 把他 3 个女儿[1]生日硬编码到内核中啊。 [1] 程序员生女儿这个梗在他身上比较明显。 |
31
cwbsw 2020-11-06 20:08:12 +08:00
大家基础知识掌握得不行啊,RA 宣告的前缀正常情况下是不能继续往下游分割的,非要用这个前缀的话需要 NDP Proxy 转发 ND 报文,类似于 ARP Proxy 。
|
34
zwy100e72 2020-11-06 21:00:33 +08:00
@rio 你拿到的 /64 应该是一个地址而不是一个前缀,前缀可以继续分下去,地址不行。地址只是 /64 网段中的一个地址,这时候如果想要别的地址,那就得通过 NDP Proxy 来转发 ND 报文才行。
|
35
XiaoxiaoPu 2020-11-06 21:36:42 +08:00
@cwbsw 楼主的设备就是软路由,IPv6 网络是 PPP 拨号来的,不是 RA 来的
|
36
dndx 2020-11-06 21:43:35 +08:00 via iPhone 1
既然都有了 /64,直接给内网设备 SLAAC 就可以,这样最简单。如果 ISP 给的段比 /64 再小才需要用 DHCPv6 来分配 /128 。
ROS 上这个很好配置。我写过一个文章就是把 ISP PD 给用户的 /64 用 Router Advertisements (RA) 在内网上广播,内网上的机器就会自动根据 prefix 分配地址。Linux 上看了一下应该可以用 radvd 来生成 RA 广播。 ROS 可以参考: https://idndx.com/routeros-meets-comcast-ipv6/ |
37
dndx 2020-11-06 21:46:15 +08:00 via iPhone
不管你的 /64 是怎么来的,只要 ISP 把整个 /64 都路由到了你这一端,直接跑 radvd 给内网宣告就行。如果 ISP 变态只路由了一个单独的地址到你这那就无解了。(最起码我们这边的电信不是这样的,因为不符合 RFC 和最佳实践)
|
38
cwbsw 2020-11-06 23:15:28 +08:00
|
39
mrtqiangqiang 2020-11-06 23:41:58 +08:00 via Android
问下 深圳 联通 ipv4 是公网吗
|
40
zro 2020-11-06 23:48:24 +08:00
@dndx #36 想核实一下,DHCPv6 w/Prefix Delegation 里的 w/是 with 的缩写吗? Thank you.
|
41
rio OP @cwbsw 请问你说的「没前缀」具体是指什么?我现在通过 DHCPv6 PD 能拿到两个 /64 了,加上 ppp0 上自带的那个 /64,一共是三个。再请求一个 /64 被局端回复 NoPrefixAvailable 。
|
42
rio OP @mrtqiangqiang 默认不是,我刚装的时候申请了换成公网。
|
43
dndx 2020-11-07 01:17:40 +08:00
@zro 是的,不过貌似除了 DHCP-PD,国内也可能是通过 PPPoE 拿到的 prefix 。重点是把拿到的 prefix 用 RA 广播到局域网上。至于路由 ISP 那边应该是已经把整个 /64 都路由到你这了所以不用担心。
|
44
dndx 2020-11-07 01:25:07 +08:00
好吧,看了一下文档,通过 PPPoE 拿到的 prefix 其实也是先 PPPoE 建立了后再 DHCPv6-PD,所以楼主的情况猜测是 pppd 或者什么别的 daemon 在接口上自动请求了一个 prefix 。
参考: https://www.juniper.net/documentation/en_US/release-independent/nce/topics/concept/subscriber-management-dual-stack-dhcpv6-pd-over-pppoe-nce.html |
45
rio OP @dndx 我现在想怎么让 pppd 不自动配置那个 /64 的 prefix 到 ppp0 网卡上去,因为放这里没啥用,我想把它直接分给另外一个 vlan 。
|
46
zro 2020-11-07 01:38:14 +08:00
@dndx #43 国内确实像你说的,同时在用 OpenWRT 和 ROS,OP 还能拿多一个 IP,相比之下 OpenWRT 要好用些,理由是 ROS 的 RA 广播时间有点长,有些设备从来不关的话,会查到一堆 v6,不能直接看出当前 IP 是哪一个,哪些 IP 是过期的~
|
47
domosekai 2020-11-07 01:41:15 +08:00
PD 的前缀是通过 DHCPv6 申请并下发的,不申请就没有。
你说的 ppp0 上的通过 RA 下发的地址是自动的,收到 RA 后绑定地址是内核行为,受 accept_ra 参数控制,和 pppd 无关 |
48
zro 2020-11-07 01:43:15 +08:00
@rio #45 这个很久之前在哪个 v6 论坛有说过,利用 iptable 把 PPPoE v6 的数据包 drop 掉,然后另一个接口跟它桥接,就能拿过来用了,但现在想不起关键字了,或者是论坛不在,找不到了~唉,其实我也想用这种方法的。。。
|
49
domosekai 2020-11-07 01:45:20 +08:00 1
另外,这两个地址是不同的东西,PD 的前缀是给你整个 /64 子网,上一级的路由表直接指向你,而 RA 只是告诉你 WAN 口所在子网的前缀,你的网关只是其中一员,可以分配若干个地址自己使用但不拥有整个 /64 子网,上级路由不指向你
|
50
ericFork 2020-11-07 01:46:09 +08:00
如果确定 PD 拿到的只有 /64,那么 ndppd 是你唯一的最优解
|
52
wazon 2020-11-07 02:00:25 +08:00
@zro 你说的会不会是这篇 https://koolshare.cn/thread-46415-1-1.html
|
53
zro 2020-11-07 02:07:15 +08:00
@wazon #52 如果你指的是方案 3 的话,有点像但又不太像,ebtables 处理不了 PPPoE 的数据的,这个适合上游已经有 v6 了,倒是挺适合用在第二步,第一步当然是 iptable 来处理 PPPoE 的包~
|
54
rio OP @domosekai 非常感谢解惑!我现在终于明白了 RA 和 PD 的区别!所以不应该直接去打 ppp0 上 RA 得到的 /64 的主意,因为这个 /64 并没有分给我,虽然不知道同一个 /64 还有谁……另外就是如果 ISP 只给我 RA 一个 /128 其实也可以?
|
55
mrtqiangqiang 2020-11-07 10:38:12 +08:00 via Android
@rio 直接 10010 ?
|
56
domosekai 2020-11-07 15:07:02 +08:00
@rio RA 下发的肯定是 /64,其他的无法进行 SLAAC,只能用 DHCPv6 获取。你的理解没错,你不知道同一个 /64 还有谁,所以最好不要用。但是在没有 PD 的环境下也可以打这个 /64 的主意,这时你的网关就要帮内网设备代理应答上一级的 NS,相当于 IPv4 的 ARP 代理,这个工具就是上面说到的 ndppd 。顺便说一句,安卓手机在 IPv6 下开热点时,就是用这个方法共享本机的前缀,移网是没有 PD 的。
|
57
rio OP @domosekai 多谢解释!我想起来了,SLAAC 要求最小前缀就是 /64 。如此说来,有些教育网只给 /128 的话就是通过 DHCPv6 分配的了,这种情况下连代理 NDP 都不行呢,只能做 NAT6,对吧?
另外我看到的信息是安卓不支持 DHCPv6,也就是说如果不能 RA /64 然后 SLAAC 的话就直接无法使用 IPv6 了,想想也是醉了…… |
58
rio OP @mrtqiangqiang 好些年头了,不太记得当时怎么搞的了……
|
59
flynaj 2020-11-07 16:29:27 +08:00
就目前而言你还是用 openwrt 最简单方便,/64 这个是默认必须分配的。你要请求 pd
|
60
domosekai 2020-11-07 17:10:23 +08:00
@rio 对,安卓的问题是谷歌坚持 IPv6 不能走 v4 的老路,既然地址数量充足就不需要再逐一分配,而是让设备自主决定地址,方便物联网也省电也保护隐私,有他的道理但是也有实际的困难,尤其是企业、学校这种 managed network
|
61
tia 2020-11-07 18:30:20 +08:00
|
64
tia 2020-11-07 18:39:22 +08:00
现在根本不需要 dhcpv6 了,直接 openwrt 的 odhcpd+ra+ndp 一条龙
|
65
dreamage 2020-11-07 19:00:19 +08:00
看了帖子赶紧把外网 IPv6 打开试试,拿到个 /60
|
66
qbqbqbqb 2020-11-08 11:55:10 +08:00
@rio 简单地说,此 /64 非彼 /64 。通过 Router Advertisement 得到的是“单个地址”,而非“前缀”,PD 得到的才是前缀。RA 里的"/64"其实就是相当于 ipv4 里子网掩码的含义。
|
67
rio OP @qbqbqbqb 嗯,现在理解这个意思了。比较容易迷糊的点在于 RA 的 /64 虽然我不拥有整个 /64 段,但是因为地址空间够大,多生成一些用其实也是可行的,比如开了 privacy extension 后生成的多个随机地址。
|
70
rio OP @domosekai 我其实在想……RA 给我的那个 /64,应该没有别人了吧?我刚看了个运营商部署 IPv6 的最佳实践,似乎 RA 给 CPE 单独的 /64 是个推荐做法? https://www.ripe.net/publications/docs/ripe-690
|
71
yov123456 2020-11-08 21:38:43 +08:00
我这电信给的是 /56…
|
72
domosekai 2020-11-08 22:27:35 +08:00
@rio 不是,此文的意思是给 WAN 口的前缀要使用一个单独的 pool,和 PD 下发的前缀分开,不是说这个 pool 里只有你。另外,有多少人其实不重要,重要的是上级路由表的下一跳不是你。
|
73
rio OP @domosekai 比如深圳联通 RA 给我的是 2408:8256:3075:BEEF::/64 我从其中随机选一个地址用,那么局端的上级路由表应该是写的啥呢?
|
75
domosekai 2020-11-10 10:28:49 +08:00
|