我正在尝试解决路由中的一个奇怪问题。我已经设置了路由器(Turris,运行自定义的 OpenWRT),并使用 Strongswan 隧道建立 ipv6 连接。这对路由器本身来说很好,因为它的 ipv6 连接工作正常(通过隧道,我的提供商不提供原生 ipv6)。
TL;DR:路线的选择与我预期的不一样,作为最通用的路线,::/0 似乎总是被优先考虑,尽管 /64 匹配可用。
但当我尝试将其扩展到我的家庭网络时,我遇到了一个问题,但无法找到原因。
尽管 ipsec 可以工作,但我得到了一个 ipsec0 接口和这些路由:
Kernel IPv6 routing table
Destination Next Hop Flags Metric Ref Use Iface
::/0 :: U 1024 0 2 ipsec0
2a01:490:19:42::/64 :: U 1024 0 0 br-lan
这里,2a01:490:19:42::/64 是我为本地网络专用的等级,2a01:490:19:42::1 是该网络上路由器的 IP 地址。
以下是一些观察结果:
1) 当我从本地网络上的计算机 ping 2a01:490:19:42::1 时,路由器会响应,但会将响应发送到 ipsec0 接口。我不知道为什么。br-lan 上更具体的前缀 2a01:490:19:42::/64 不应该受到青睐吗?它似乎正确地选择了源 IP 地址 2a01:490:19:42::1。
2) 当我尝试从本地网络向其他站点(例如 ping6 stackexchange.com)发送数据包时,也会发生同样的事情。数据包到达路由器,被转发,服务器发送响应,路由器收到响应...并将其发送回 ipsec0 接口。
3) 没有 xfrm 策略。ip xfrm pol
什么也没有返回。但是 Strongswan 正在运行,而且我印象中 Strongswan 总是会创建一些策略。在我之前的设置中,我必须添加一些策略才能将数据包传递到隧道中,但我对策略列表为空感到有点困惑。
好吧,那到底出了什么问题?为什么最通用的路由 ::/0 会成为我的 ipv6 数据包的首选?
谢谢!
答案1
问题是,ipsec 将其规则插入到不同的路由表(表220
)中,并创建了一条策略来将流量引导到那里:
root@turris:/etc/config# ip rule list
0: from all lookup local
220: from all lookup 220
32766: from all lookup main
32767: from all lookup default
但该表220
仅包含进入 ipsec 隧道的默认路由,而不包含本地网络:
root@turris:/etc/config# ip -6 r show table 220
default dev ipsec0 proto static src 2a01:490:19:42::1 metric 1024
这不可避免地导致所有数据包都被转发到隧道中。
路由器本身的网络能够工作只是因为它们被接受但未被路由。
我通过指示 strongswan 将路由规则插入主表来解决这个问题,方法是设置charon.routing_table = 254
(main 的 id,如 所示/etc/iproute2/rt_tables
)。我的strongswan.conf
现在看起来像这样:
charon {
# load_modular = yes
plugins {
include strongswan.d/charon/*.conf
}
routing_table = 254 # main
}