想用 CentOS 做个软路由,结果接到光猫上之后一直获取不到 PD 前缀,OP 则正常。
我的 ISP 限制了必须使用 DUID-LL 的方式请求,对两个系统抓 DHCPv6 包做分析之后发现 CentOS 的 DUID-Type 是 LLT ,而 OP 是 LL
dhclient 有一个参数-D 根据说明设置为 LL 就可以使用 DUID-LL 的方式了,但我直接运行 dhclient -6 -D LL eth0 抓包发现仍在使用 DUID-LLT 。
请问 CentOS 大神如何修改 centos 的 DHCPv6 客户端的请求方式?
1
ttvast 257 天前 via Android
推荐使用 wide-dhcp6c 。ISC dhclient 感觉不好用
|
2
mantouboji 256 天前
那就换 CentOS 9 、Fedora 39 、Ubuntu 24.04 试试看。都啥年月了还 7 。你家是什么党国命脉所在吗?
|
3
username1919810 OP @ttvast 我又装了 ubuntu server ,也换了 wide 。现在抓包记录里倒是看到运营商回复了 reply 分配了前缀,但是 ifconfig 看到网卡还是没有地址
|
4
cnbatch 256 天前
实在奇怪,用 Linux 做软路由的话,不是 OpenWRT 更好吗?
既然 OpenWRT 能够正确处理,那就直接用 OpenWRT 嘛。 |
5
ttvast 256 天前 via Android
@username1919810 wide 是要配置文件的啊要 send na 和 pd 的
|
7
username1919810 OP @ttvast 配置了呀,抓包看到正常请求了 pd 前缀一类流程,但是网卡就是没 ip 没 dns 没路由。
debian12 倒是能拿到 ip ,但是没 10 秒钟就没了 |
8
ranaanna 256 天前
sysctl -w net.ipv6.conf.eth0.accept_ra=2 ?
|
9
username1919810 OP @ranaanna #8 我看了一些日文博客说要关闭 RA 。。。
|
10
zuijiapangzi 256 天前
用 nmcli 改改看?
|
11
ranaanna 256 天前 via Android
@username1919810 问题就出在这里啦,不接受 ra ,怎么会得到 ipv6 。肯定看错了。而且,既然是做路由器,那肯定是打开了 ipv6 forwarding ,这时 accept_ra=1 都还拿不到地址呢。一条简单的命令可以,试试看吧
|
12
username1919810 OP @zuijiapangzi #10 之前没接触过 CentOS ,不了解这个 TvT
|
13
username1919810 OP @ranaanna #11 很奇怪,总之我这个运营商只提供一个/56 的 PD 前缀,是拿不到 IPv6 地址的。centos 本身用的 IPv6 要自己给自己分配。
我照着仅有的几个博客配置还是没配出来 QAQ https://zenn.dev/koyashiro/scraps/d05ff8a0ddeeef#comment-8f1f7638d131b9 https://quintrokk.subness.net/?p=1979#toc2 https://benedicam-te.blogspot.com/2020/05/map-e-router-by-debian-box-iptables.html |
14
ranaanna 256 天前 via Android
@username1919810 很正常没什么奇怪的呀,ipv6 PD 就那么几种方式,要么 dhcpv6 要么 slaac 要么两种结合,都试试就可以了。运营商一般也不可能收到请求傻到只给一个 pd 前缀又不给一个地址的徒增客户麻烦的,所以很有可能的原因是客户不要。得到前缀后分配给其他 interfaces 是手工的,是“要自己给自己分配”,但有现成的脚本可以完成。总之没理由 openwrt 可以 linux 不行的。但是最初的问题是得不到前缀,后来似乎变成 wan 侧得不到地址?
https://wiki.debian.org/IPv6PrefixDelegation |
15
ttvast 256 天前
@username1919810 配置文件贴出来看看呢?开启 debug 看看调试信息呢?
|
16
username1919810 OP @ranaanna #14 日本 NTT 就是这么奇怪,只给一个 PD 前缀的😂并且 DUIDType 必须是 LinkLayer 否则不响应。现在在 CentOS 上 dhclient 发出请求完全没回复(无法设置请求 IA_PD ,抓包显示只请求了 IA_NA ,但是 NTT 是不回复这个的)
Debian 系 systemd 版本在 252 以上的 NTT 倒是正常回复,但是接口分配不到 IP ,只有路由表里有一条到 NTT 网关的路由,还有一个在 lo 接口上的 PD 前缀的路由 |
17
username1919810 OP @ttvast #15 dhclient 吗?晚上回去看看
|
18
ranaanna 255 天前
首先,centos 7 太老了,dhclient 版本太老( 4.2.x ? 不支持 PD hint ),所以可能不成功,但是说它“无法设置请求 IA_PD”似乎有点荒谬。其次,运营商不太可能自找麻烦不给 wan 侧地址,这个无非就是 dhcp 或 slaac ,所以说要试一下 wan 侧地址到底是 dhcp ,还是 auto ,还是 dhcp+accept_ra=2 (当然啦,有了前缀,运行一个脚本给 wan 侧也分配一个地址,不知道在日本也是通行的做法?)。总之请附带贴出/etc/network/interfaces, 以及/etc/sysctl.conf
|
19
ranaanna 255 天前
抱歉前面说错了,现在明白“无法设置请求 IA_PD”是什么意思了,应该是不能设置请求的 identifier 的意思,应该还是版本太老的原因
|
20
ttvast 255 天前 via Android
@username1919810 我说的是 wide ,我以前用 centos7 时基本确定 dhclient 不支持 pd ,所以用的 wide 。
|
21
username1919810 OP @ranaanna 我直接运行 dhclient -6 -P -D p2p1 后抓包数据看到正常发出了 IA_PD 请求,NTT 服务器也回复了带前缀的 reply 消息。但是 p2p1 没有被分配 IP ,而我在 ifcfg-p2p1 里设置的 DHCPV6C_OPTIONS=-P 无效。
|
22
username1919810 OP @ttvast 应该是支持的,我这里是 4.2.5 ,加参数 P 可正常发出 PD 前缀请求
|
23
username1919810 OP @ranaanna 这个是 network-scripts 里的配置,sysctl.conf 目前没有关于 IPV6 的配置项
|
24
ranaanna 255 天前
几个问题:
1. IPV6_AUTOCONF=no 确定 p2p1 不是通过 neighbor discovery 获得 ipv6 地址? 2. DHCPC6C=yes 确定 p2p1 是通过 dhcp 获得 ipv6 地址? 3. DHCPV6C_OPTIONS="-P" 确定 p2p1 通过 dhcp 获得 stateful 地址?如果是 stateless ,需要用-S ,并且用-S 缺省就是用 DUID-LL 。总之,还是要搞清楚 wan 侧地址的获取方式。另外还有两个问题: 4. 做路由器,没有 IPV6FORWARDING=yes? 5. IPV6INIT=yes 似乎应为 no ,因为之后并不需要手工设置 p2p1 的 address 和 gateway |
25
ttvast 255 天前 via Android
@username1919810 发出 pd 请求有什么用,怎么分配 pd ?使用了 pd 以后,wan 口的 v6 地址其实是可有可无的。因为 lan 口也能分配公网 v6 地址。
|
26
ranaanna 255 天前
所以现在的问题就是出于这个配置,dhclient 在请求 PD 的同时还用 DUID-LLT 请求 stateful 地址,当然,就得不到地址了
|
27
username1919810 OP @ranaanna #24 因为目前没有第二个网卡,所以需求是路由器自身能上网就可以了,所以不开启 forwarding 。NTT 的 IPoE 确定是通过纯 DHCPv6 ,stateful 的方式拿到一个 PD 前缀,拿不到 IPv6 地址。IPV6INIT 的话是给这个接口开启 V6 吧 如果不写应该是直接关闭 V6 ?
|
28
username1919810 OP @ttvast #25 拿到后 centos 给自身分配 IP ,DHCPv6 Server 那边是不给地址的,单提供一个 PD 前缀
|
29
ranaanna 255 天前
@username1919810 #32 那就自己用拿到的 prefix 给网卡手工分配地址呗。不过运营商不通过 slaac 给个地址也是一件奇葩的事,这应该是举手之劳都算不上。也不知道 openwrt 是如何做到适配的。记得前几年 openwrt 在 ipv6 配置上似乎还饱受诟病的。IPV6INIT 如果是 slaac 是不需要 yes 的,缺省也是 no
|
30
ttvast 255 天前 via Android
@username1919810 上海电信可以给 ppp0 分一个 ip 然后再给一个/56 的 pd ,wide 可以指定多个内网 lan ,每个 lan 口不同的 sla-id 。centos7 的 network-script 没有那么强大的功能
|
32
username1919810 OP @ranaanna #29 这边 NTT 就像是有大病。。千兆宽带只给一个/64 的地址,万兆宽带只给一个/56 前缀。。
千兆宽带可以手动配静态地址,万兆不行。我试过万兆手动指定地址是不通的。老哥有联系方式吗?有偿帮忙看看?😂 |
33
username1919810 OP |
34
ranaanna 255 天前
@username1919810 #32 其实同意 @ttvast #25 ,有了 PD 的 prefix ,就可以给其他网卡分配 ipv6 地址和默认网关,wan 侧的地址其实可有可无,但是你这里又是单网卡,要分配地址,目前能想到的是用虚拟网卡,其他也想不出有什么办法。所以正如前面网友说的,既然 openwrt 能用就用呗,或者直接用运营商的 ONU 以及“国产”路由器,插上就有网,反正是单栈 ipv6 ,完全不用折腾都是公网 ip ,岂不更好
|
35
username1919810 OP @ranaanna #34 主要是想做一个 NAT0 的 V4 环境( V4 走 4in6 隧道),如果在 openwrt 路由器上那最好的情况也就是 NAT1 吧。实现 centos 本机能通过 IPv6 上网就行了。
话说如果运营商那边不给地址,只下发 PD 前缀和 DNS 、路由信息的话是不是代表着不能直接上网?需要系统自己给自己从前缀里分配一个地址? |
36
ranaanna 255 天前
@username1919810 debian 可以参考 https://wiki.debian.org/IPv6PrefixDelegation ,但前提是多网卡,单网卡如果是所述情况为真(只给一个/56 ),没用
|
37
ranaanna 255 天前
@username1919810 #35 是的需要自己给自己,但是估计被分配地址的那张网卡,不能是获取前缀的那张
|
38
username1919810 OP @ranaanna #37 回头看了一眼抓的包,发现千兆宽带是用 SLAAC 直接分配了一个/64 前缀。。万兆是 DHCPv6 发一个 PD 前缀
这样的话感觉要自己虚拟一个网卡装 radvd 之类的包去从 PD 前缀里分配 IP 就行了? 明天试一下 |
39
Senorsen 255 天前
@ttvast 大概因为 openwrt 加了一些常见网络规则约束和 workaround 从而限制了灵活性,其实还是可以试试,毕竟是开箱即用,openwrt 也支持自定义 iptables/nftables 规则来增加一些自己的特定需求,如果不是特别复杂的话。
10 年前我也是用 Debian Linux 自己写 iptables 搭软路由+科学上网,后来迁移到 openwrt 了,因为 openwrt 上的科学上网插件越来越多和成熟了,自己去维护 Linux 里各种网络规则/端口映射/出入站 vpn 规则很麻烦,封装了几个脚本和轮子增加了约束又感觉做的没 openwrt 现成好。供参考 |
40
ttvast 255 天前
@Senorsen 前不久用小米万兆的 docker ,发现只要路由器工作在 ap 模式下,容器内部系统就无法联网。后来研究了好久,发现是 openwrt 的 firewall 规则,对于 masq 的配置,只能用于目标 zone ,也就是说,lan->wan 的 masq 是在 wan 里定义的。docker->lan 如果也要 masq ,必须在 lan zone 里定义 masq ,这样一来,岂不是变成 wan->lan 也要 masq 了? 实在不理解 wrt 为什么会犯那么低级的错误。
|
41
Senorsen 255 天前
@ttvast 前不久么…大概 21 年的新版本加了个 NAT Rules tab 能解决这个问题,相当于增加自定义 POSTROUTING chain 规则,它可以实现选择特定一些 IP/CIDR -> 特定一个 outbound interface (e.g. WAN) 进行 SNAT/masquerade 。
( POSTROUTING chain 只能指定 outbound interface ,不能指定 inbound interface ,所以没法指定 lan -> wan 则 masquerade ,这点跟 iptables/nftables 是一致的) |