为 IPv6 启用 rp_filter 宽松 (#2) 模式

为 IPv6 启用 rp_filter 宽松 (#2) 模式

有人有解决方案吗反向路径过滤工作(在松散模式下)也适用于IPv6不仅适用于 IPv4?

我的设置是机器 1 直接连接到机器 2,而机器 1 也连接到外网。

目标流量是这样的: 客户端(来自外网)向 machine1 发送请求,然后 machine1 将请求转发到 machine2。

明显的问题:当数据包被 machine1 处理时,它将其转发到连接到 machine2 的端口,但带有客户端的源 IP。这通常会被视为欺骗 ip - 但这就是 rp_filter 的用途,对吧?

通常在 machine1 上我会这样做(对于 IPv4): echo 2 > /proc/sys/net/ipv4/conf/<interface_to_outside_net>/rp_filter 并且一切都会工作,但是对于 IPv6 情况并非如此,因为 rp_filter 尚未在 IPv6 的内核中实现。我知道的唯一解决方案是设置 ip6tables。

当前的设置: ip6tables -t raw -N RPFILTER ip6tables -t raw -A RPFILTER -m rpfilter -j RETURN ip6tables -t raw -A RPFILTER -m rpfilter --loose -j ACCEPT ip6tables -t raw -A PREROUTING -j RPFILTER

但由于某种原因,流量永远不会到达 machine2,并且在客户端我会超时。

在 machine1 上使用 tcpdump 我只得到 TCP 握手的 SYN:

14:18:50.390292 IP6 fd11:3456:789a:1::4.34184 > fd12:3456:789a:1::1.1111: Flags [S], seq 701159610, win 28800, options [mss 1440,sackOK,TS val 6066549 ecr 0,nop,wscale 7], length 0

没有其他的...

有什么建议吗?

答案1

剧透

/etc/network/interfaces/这个问题实际上与我没有使用而是“仅”使用设置IPv6地址有关ip a a ...。我从来没有想过这会有所不同,但这一次却是这样。

得出解决方案的步骤:

在调查过程中,我从 machine2 向 machine1 进行了简单的 ping6,这奇怪地解决了我遇到的问题。

之后,TCP 握手被正确创建,我能够执行curl -g -6 ..我想做的目标命令,我终于同意了!

但后来我想……这没有意义,为什么 ICMPv6 不处理这个问题?这让我想到我应该检查 ndp ( ip -6 neigh show) 表,该表实际上向我显示 machine1 的条目有失败的

这意味着由于某种原因 ICMPv6 无法交换邻居请求/广告。

最后我记得简单的电脑重新启动通常可以解决所有问题,但由于我仅使用ip a a ...此配置我的接口会刷新我的配置,所以我所做的是配置/etc/network/interfaces/正确的 IPv6 地址并重新启动计算机。

这是所有问题的根源;)

解决方案:

对于 IPv6 的松散模式,不要对 rp_filter 执行任何操作 ==> 默认情况下启用它。

只需确保您已正确配置接口即可:)

PS:有谁知道我搞砸了什么吗?为什么我不能简单地使用ip address add....?谢谢。

答案2

类似的问题,感谢您注意到我检查ip -6 neigh show

就我而言,端点不属于同一网络 ID(前缀)。

例子:

机器 A fd00:1:1/64%eth0 只会向来自 eth0 的 fd00:1:1 的邻居请求消息应答其 MAC 地址。

如果机器 A 也有一个 fd00:2::1/64%eth1,那么它不会回答来自 eth0 的 fd00:2::1 请求。

相关内容