V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
username1919810
V2EX  ›  宽带症候群

CentOS7 如何设置 DHCPv6 客户端的 DUID 类型为 Link-Layer?

  •  
  •   username1919810 · 260 天前 · 1479 次点击
    这是一个创建于 260 天前的主题,其中的信息可能已经有所发展或是发生改变。

    想用 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 客户端的请求方式?

    43 条回复    2024-03-12 11:48:02 +08:00
    ttvast
        1
    ttvast  
       260 天前 via Android
    推荐使用 wide-dhcp6c 。ISC dhclient 感觉不好用
    mantouboji
        2
    mantouboji  
       259 天前
    那就换 CentOS 9 、Fedora 39 、Ubuntu 24.04 试试看。都啥年月了还 7 。你家是什么党国命脉所在吗?
    username1919810
        3
    username1919810  
    OP
       259 天前 via iPhone
    @ttvast 我又装了 ubuntu server ,也换了 wide 。现在抓包记录里倒是看到运营商回复了 reply 分配了前缀,但是 ifconfig 看到网卡还是没有地址
    cnbatch
        4
    cnbatch  
       259 天前
    实在奇怪,用 Linux 做软路由的话,不是 OpenWRT 更好吗?
    既然 OpenWRT 能够正确处理,那就直接用 OpenWRT 嘛。
    ttvast
        5
    ttvast  
       259 天前 via Android
    @username1919810 wide 是要配置文件的啊要 send na 和 pd 的
    ttvast
        6
    ttvast  
       259 天前 via Android
    @cnbatch openwrt 不灵活
    username1919810
        7
    username1919810  
    OP
       259 天前 via iPhone
    @ttvast 配置了呀,抓包看到正常请求了 pd 前缀一类流程,但是网卡就是没 ip 没 dns 没路由。
    debian12 倒是能拿到 ip ,但是没 10 秒钟就没了
    ranaanna
        8
    ranaanna  
       259 天前
    sysctl -w net.ipv6.conf.eth0.accept_ra=2 ?
    username1919810
        9
    username1919810  
    OP
       259 天前
    @ranaanna #8 我看了一些日文博客说要关闭 RA 。。。
    zuijiapangzi
        10
    zuijiapangzi  
       259 天前
    用 nmcli 改改看?
    ranaanna
        11
    ranaanna  
       259 天前 via Android
    @username1919810 问题就出在这里啦,不接受 ra ,怎么会得到 ipv6 。肯定看错了。而且,既然是做路由器,那肯定是打开了 ipv6 forwarding ,这时 accept_ra=1 都还拿不到地址呢。一条简单的命令可以,试试看吧
    username1919810
        12
    username1919810  
    OP
       259 天前
    @zuijiapangzi #10 之前没接触过 CentOS ,不了解这个 TvT
    username1919810
        13
    username1919810  
    OP
       259 天前
    @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
    ranaanna
        14
    ranaanna  
       259 天前 via Android
    @username1919810 很正常没什么奇怪的呀,ipv6 PD 就那么几种方式,要么 dhcpv6 要么 slaac 要么两种结合,都试试就可以了。运营商一般也不可能收到请求傻到只给一个 pd 前缀又不给一个地址的徒增客户麻烦的,所以很有可能的原因是客户不要。得到前缀后分配给其他 interfaces 是手工的,是“要自己给自己分配”,但有现成的脚本可以完成。总之没理由 openwrt 可以 linux 不行的。但是最初的问题是得不到前缀,后来似乎变成 wan 侧得不到地址?
    https://wiki.debian.org/IPv6PrefixDelegation
    ttvast
        15
    ttvast  
       258 天前
    @username1919810 配置文件贴出来看看呢?开启 debug 看看调试信息呢?
    username1919810
        16
    username1919810  
    OP
       258 天前
    @ranaanna #14 日本 NTT 就是这么奇怪,只给一个 PD 前缀的😂并且 DUIDType 必须是 LinkLayer 否则不响应。现在在 CentOS 上 dhclient 发出请求完全没回复(无法设置请求 IA_PD ,抓包显示只请求了 IA_NA ,但是 NTT 是不回复这个的)
    Debian 系 systemd 版本在 252 以上的 NTT 倒是正常回复,但是接口分配不到 IP ,只有路由表里有一条到 NTT 网关的路由,还有一个在 lo 接口上的 PD 前缀的路由
    username1919810
        17
    username1919810  
    OP
       258 天前
    @ttvast #15 dhclient 吗?晚上回去看看
    ranaanna
        18
    ranaanna  
       258 天前
    首先,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
    ranaanna
        19
    ranaanna  
       258 天前
    抱歉前面说错了,现在明白“无法设置请求 IA_PD”是什么意思了,应该是不能设置请求的 identifier 的意思,应该还是版本太老的原因
    ttvast
        20
    ttvast  
       258 天前 via Android
    @username1919810 我说的是 wide ,我以前用 centos7 时基本确定 dhclient 不支持 pd ,所以用的 wide 。
    username1919810
        21
    username1919810  
    OP
       258 天前 via iPhone
    @ranaanna 我直接运行 dhclient -6 -P -D p2p1 后抓包数据看到正常发出了 IA_PD 请求,NTT 服务器也回复了带前缀的 reply 消息。但是 p2p1 没有被分配 IP ,而我在 ifcfg-p2p1 里设置的 DHCPV6C_OPTIONS=-P 无效。
    username1919810
        22
    username1919810  
    OP
       258 天前 via iPhone
    @ttvast 应该是支持的,我这里是 4.2.5 ,加参数 P 可正常发出 PD 前缀请求
    username1919810
        23
    username1919810  
    OP
       258 天前
    @ranaanna 这个是 network-scripts 里的配置,sysctl.conf 目前没有关于 IPV6 的配置项
    ranaanna
        24
    ranaanna  
       258 天前
    几个问题:
    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
    ttvast
        25
    ttvast  
       258 天前 via Android
    @username1919810 发出 pd 请求有什么用,怎么分配 pd ?使用了 pd 以后,wan 口的 v6 地址其实是可有可无的。因为 lan 口也能分配公网 v6 地址。
    ranaanna
        26
    ranaanna  
       258 天前
    所以现在的问题就是出于这个配置,dhclient 在请求 PD 的同时还用 DUID-LLT 请求 stateful 地址,当然,就得不到地址了
    username1919810
        27
    username1919810  
    OP
       258 天前
    @ranaanna #24 因为目前没有第二个网卡,所以需求是路由器自身能上网就可以了,所以不开启 forwarding 。NTT 的 IPoE 确定是通过纯 DHCPv6 ,stateful 的方式拿到一个 PD 前缀,拿不到 IPv6 地址。IPV6INIT 的话是给这个接口开启 V6 吧 如果不写应该是直接关闭 V6 ?
    username1919810
        28
    username1919810  
    OP
       258 天前
    @ttvast #25 拿到后 centos 给自身分配 IP ,DHCPv6 Server 那边是不给地址的,单提供一个 PD 前缀
    ranaanna
        29
    ranaanna  
       258 天前
    @username1919810 #32 那就自己用拿到的 prefix 给网卡手工分配地址呗。不过运营商不通过 slaac 给个地址也是一件奇葩的事,这应该是举手之劳都算不上。也不知道 openwrt 是如何做到适配的。记得前几年 openwrt 在 ipv6 配置上似乎还饱受诟病的。IPV6INIT 如果是 slaac 是不需要 yes 的,缺省也是 no
    ttvast
        30
    ttvast  
       258 天前 via Android
    @username1919810 上海电信可以给 ppp0 分一个 ip 然后再给一个/56 的 pd ,wide 可以指定多个内网 lan ,每个 lan 口不同的 sla-id 。centos7 的 network-script 没有那么强大的功能
    ranaanna
        31
    ranaanna  
       258 天前
    @ttvast 严格来说是给一个/64 网段和一个/56 网段,可以让家宽用户最多组 1+2^8 个 ipv6 子网,不只给一个地址的
    username1919810
        32
    username1919810  
    OP
       258 天前
    @ranaanna #29 这边 NTT 就像是有大病。。千兆宽带只给一个/64 的地址,万兆宽带只给一个/56 前缀。。
    千兆宽带可以手动配静态地址,万兆不行。我试过万兆手动指定地址是不通的。老哥有联系方式吗?有偿帮忙看看?😂
    username1919810
        33
    username1919810  
    OP
       258 天前
    @ranaanna #29 最奇怪的问题是,我换了 Ubuntu 、Debian 几个不同的系统镜像,换了 wide 、dhcpcd 、dhclient 几个不同的 DHCPv6 客户端,抓包监视发现都能正确完成 DHCPv6 solicit 、advertise 、request 、reply 的过程,但是执行 ip a 发现除了 Debian12 能在网卡上成功分配 IP 成功路由(但是没有 DNS 信息,能 ping 通网关,持续不到 10s 就掉线),其他都在完成 DHCPv6 请求之后网卡上没 IP ,手动设置静态 IP 路由也不通。 @ttvast
    ranaanna
        34
    ranaanna  
       258 天前
    @username1919810 #32 其实同意 @ttvast #25 ,有了 PD 的 prefix ,就可以给其他网卡分配 ipv6 地址和默认网关,wan 侧的地址其实可有可无,但是你这里又是单网卡,要分配地址,目前能想到的是用虚拟网卡,其他也想不出有什么办法。所以正如前面网友说的,既然 openwrt 能用就用呗,或者直接用运营商的 ONU 以及“国产”路由器,插上就有网,反正是单栈 ipv6 ,完全不用折腾都是公网 ip ,岂不更好
    username1919810
        35
    username1919810  
    OP
       258 天前
    @ranaanna #34 主要是想做一个 NAT0 的 V4 环境( V4 走 4in6 隧道),如果在 openwrt 路由器上那最好的情况也就是 NAT1 吧。实现 centos 本机能通过 IPv6 上网就行了。

    话说如果运营商那边不给地址,只下发 PD 前缀和 DNS 、路由信息的话是不是代表着不能直接上网?需要系统自己给自己从前缀里分配一个地址?
    ranaanna
        36
    ranaanna  
       258 天前
    @username1919810 debian 可以参考 https://wiki.debian.org/IPv6PrefixDelegation ,但前提是多网卡,单网卡如果是所述情况为真(只给一个/56 ),没用
    ranaanna
        37
    ranaanna  
       258 天前
    @username1919810 #35 是的需要自己给自己,但是估计被分配地址的那张网卡,不能是获取前缀的那张
    username1919810
        38
    username1919810  
    OP
       258 天前
    @ranaanna #37 回头看了一眼抓的包,发现千兆宽带是用 SLAAC 直接分配了一个/64 前缀。。万兆是 DHCPv6 发一个 PD 前缀
    这样的话感觉要自己虚拟一个网卡装 radvd 之类的包去从 PD 前缀里分配 IP 就行了?

    明天试一下
    Senorsen
        39
    Senorsen  
       258 天前
    @ttvast 大概因为 openwrt 加了一些常见网络规则约束和 workaround 从而限制了灵活性,其实还是可以试试,毕竟是开箱即用,openwrt 也支持自定义 iptables/nftables 规则来增加一些自己的特定需求,如果不是特别复杂的话。
    10 年前我也是用 Debian Linux 自己写 iptables 搭软路由+科学上网,后来迁移到 openwrt 了,因为 openwrt 上的科学上网插件越来越多和成熟了,自己去维护 Linux 里各种网络规则/端口映射/出入站 vpn 规则很麻烦,封装了几个脚本和轮子增加了约束又感觉做的没 openwrt 现成好。供参考
    ttvast
        40
    ttvast  
       257 天前
    @Senorsen 前不久用小米万兆的 docker ,发现只要路由器工作在 ap 模式下,容器内部系统就无法联网。后来研究了好久,发现是 openwrt 的 firewall 规则,对于 masq 的配置,只能用于目标 zone ,也就是说,lan->wan 的 masq 是在 wan 里定义的。docker->lan 如果也要 masq ,必须在 lan zone 里定义 masq ,这样一来,岂不是变成 wan->lan 也要 masq 了? 实在不理解 wrt 为什么会犯那么低级的错误。
    Senorsen
        41
    Senorsen  
       257 天前
    @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 是一致的)
    Senorsen
        42
    Senorsen  
       257 天前
    ttvast
        43
    ttvast  
       257 天前
    @Senorsen 只是一个感叹而已。用第三方的轮子,就会收到第三方的限制,等我自己 hack 添加功能了,过两年轮子也更新了,又是搞脑子。所以还是彻底不用第三方的东西比较省心。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6022 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 02:10 · PVG 10:10 · LAX 18:10 · JFK 21:10
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.