Strongswan ipv6 隧道路由

Strongswan ipv6 隧道路由

我正在尝试解决路由中的一个奇怪问题。我已经设置了路由器(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
}

相关内容