有人有解决方案吗反向路径过滤工作(在松散模式下)也适用于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 请求。