求助: 搭建 IPv6 软路由遇到的问题 ( 主要是 RA 消息方面 )

135 天前
 ac169

问题总结(如果你时间宝贵直接看前三条即可)

  1. Linux 的 IP Forward 到底是怎么一个流程, A 网卡流入需要 Forward 到 B 网卡的包, 对于 B 网卡来说是内核直接发给他的, 还是退回到 INPUT 之前再 Forward, 这个描述好像不是很恰当!

  2. Linux 网络接口 SLAAC 模式下 IPv6 有子接口 ID 的参数吗? OpenWRTip6hint 参数

  3. Linux 网络接口如何过滤不需要的 RA 消息, 只使用制定的 RA 消息. 及 OpenWRTip6class 参数

目标:

参考:

问题:

......

ra-param=ens1, 120, 3600
dhcp-range=ens1, ::, constructor:ens1, ra-only, 1h

ra-param=ens*, 120, 3600
dhcp-range=ens*, ::, constructor:ens*, ra-only, 1h

enable-ra

......

分析:

多网卡 Linux 默认情况下, 自身也不开启任何 DHCP(v6)或 RA 服务, 只要任意一个接口上游有 RA 或 DHCP(v6)所有网卡都能获得或者是生成地址, 且之前使用的 radvd 实现 RA 也都有这个问题, 所以我怀疑是系统方面的问题居多(不排除 RA 服务的问题).

尝试:

  1. 设置内核参数 net.ipv6.conf.*.forwarding = 0 问题依旧

  2. 防火墙拦截: 很遗憾 FORWARD 链 filter 没有任何 RA 包, 只有 INPUT OUTPUT 链 filter 表中有, 测试 INPUT 链拦截无作用, 测试 OUTPUT 链能成功但是只能这个拦截, 无法分类只拦截其他接口, 因为 OUTPUT 链 ICMPv6 除了 --icmpv6-type router-advertisement 类似参数之外不能使用 mac-source 模块, 不知道咋实现区分了. 各位有建议吗?

1463 次点击
所在节点    Linux
7 条回复
yanqiyu
134 天前
1. 包进来先经过 prerouting hook ,然后对比路由表决定是流向本机还是流出去,相应决定走 input 还是 forward 的 hook ,文档可以看 nftable 的 hook 的文档
https://wiki.nftables.org/wiki-nftables/index.php/Netfilter_hooks
2-3.服务器的文档,dnsmasq 我记得超级难用,大概是类似于,::1, ::FFFF:FFFF:FFFF:FFFF 的语法指定 range
然后 dnsmasq 可以指定监听的接口,要我来折腾我会一个接口开一个 dnsmasq
然后 ra 不会被 forward 出去,你在别的接口看到的 ra (大概率)是 dnsmasq 被设置成了每个接口发包
pagxir
134 天前
如果你的每个接口都挂在一个网桥下,那么它本就该如此,跟转不转发没有关系。如果不是一个桥下的,那就是你的 ra 配置不对,你需要每个接口配置单独的前缀。
ac169
134 天前
谢谢!

@yanqiyu

1. 其实更多的是这个现象让我对以前的知识产生了怀疑.

2. " ... 多网卡 Linux 默认情况下, 自身也不开启任何 DHCP(v6)或 RA 服务, 只要任意一个接口上游有 RA 或 DHCP(v6)所有网卡都能获得或者是生成地址, 且之前使用的 radvd 实现 RA 服务也都有这个问题 ... " 所以我怀疑是系统方面的问题居多.

3. 另外, 不论是 radvd 还是 dnsmasq 官方文档和能找到的案例, 基本都没有涉及到多网口多子 IPv6 网的情况. 参数多少部分理解起来很抽象. dnsmasq 可以指定监听的接口, 好像还可以忽略某些端口, 但是现实是我这边是有多个端口,难道要启动多个监听吗?


@pagxir

"... 每个接口都挂在一个网桥下 ..." 这个问题如何判断! 我只知道网卡物理接口都是独立存在的,没有手动创建过桥接类型的网卡, 系统启动之后 lspci 识别的也是独立的, 且型号都不同.
yanqiyu
134 天前
@ac169 各开一个很合理,多个子网处理起来也和一个子网一样,各开各的 dnsmasq 能解决很多麻烦
ac169
134 天前
@yanqiyu

此前搜索料一番,又分别做如下尝试

1.RADVD 服务开启 UnicastOnly on;
2.dnsmasq 服务配置文件分开配置且加上 interface 等参数;

结果是没有任何改变, 在 Linux 和 局域网机器上都抓包过, 包括防火墙日志上都看过, 使用 radvd 也看过, 其实可以清晰的看到是两个接口分别发的.所以, 至少目前 " ... 你在别的接口看到的 ra (大概率)是 dnsmasq 被设置成了每个接口发包 ... " 这个猜测基本可以排除了

其实还有最重要的一点, 这点之前也提到过,那就是这个多网卡的机器在安装完系统后, 只将一个网口接到仅有 RA 模式的 IPv6 路由器上,其他所有也同时接口都获得了 IPv6 地址, 因为这个 RA 都不是机器自己产生的, 所以个人还是认为系统方面处理 RA 机制问题的可能性大, 防火墙/内核参数
mantouboji
134 天前
莫名其妙,我也有两个网卡的机器,咋就只有一个网卡能得到地址,另一个网卡就没呢? Fedora 39 。

你这什么具体信息也不给出来,谁知道你都设置了些什么?
ac169
133 天前
@mantouboji

其实, 我有描述过, 比如:

" ... 多网卡 Linux 默认情况下, 自身也不开启任何 DHCP(v6)或 RA 服务, 只要任意一个接口上游有 RA 或 DHCP(v6)所有网卡都能获得或者是生成地址 ... "

" ... 其实还有最重要的一点, 这点之前也提到过,那就是这个多网卡的机器在安装完系统后, 只将一个网口接到仅有 RA 模式的 IPv6 路由器上,其他所有接口也同时都获得了 IPv6 地址 ... "

" ... 尝试 设置内核参数 net.ipv6.conf.*.forwarding = 0 问题依旧 ..."


其实, 这个系统就是新安装的, 没有做过什么设置, 如果非要说有设置顶多就是 net.ipv6.conf.*.forwarding = 0 我尝试过一些值, 包括也恢复过问题依旧.


" ... 我也有两个网卡的机器,咋就只有一个网卡能得到地址,另一个网卡就没呢 ... " 你另外一个卡是接线或者说激活状态吗?

如果真的说是系统版本问题, 我觉得是我喜闻乐见的, 必将换一个版本再简单不过了.

我找时间换个版本试试吧

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1004613

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX