
我正在嘗試解決路由中的一個奇怪問題。我已經設定了路由器(Turis,運行客製化的 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 總是製定一些政策。在我之前的設定中,我必須添加一些內容才能將資料包傳遞到隧道中,但我對策略清單為空感到有點困惑。
好吧,那有什麼問題嗎?為什麼我的 ipv6 封包首選最通用的路由 ::/0?
謝謝!
答案1
問題是, ipsec 將其規則插入不同的路由表( table 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
}