之前寫的一個:[dev][ipsec] 基於路由的VPrivateN
一
我們默認用strongswan的時候基於策略的. 也就是policy. 基於策略的ipsec中, policy承擔了兩部分功能
一是訪問權限的控制功能, 另一個是路由的功能. linux kernel做完路由之后會在查詢policy,從而確定要將包轉發給哪一個SA.
二
基於一中的描述, 我們現在要做基於路由的ipsec, 也就是說將路由功能從policy中去除出來, 在路由表中使用路由條目來做.
於是在這里需要解決的就是路由指向下一條的問題, 而這個下一條就是Ipsec SA.
三
現在引入一個概念叫做VTI(Vitual Tunnel Interface), VTI是內核中的一種設備. 使用如下命令添加:
ip link add name vti1 type vti key VTI_KEY local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR
我們看見, 創建vti時指定了一個key, 這個key便是與SA之間的關聯. 見下面的例子如何完成這樣一個關聯:
# ip link add name vti1 type vti key VTI_KEY local LOCAL_IPv4_ADDR remote REMOTE_IPv4_ADDR # ip link set vti1 up # ip addr add LOCAL_VIRTUAL_ADDR/24 dev vti1 # ip xfrm state add src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR spi SPI PROTO ALGR mode tunnel # ip xfrm state add src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR spi SPI PROTO ALGR mode tunnel # ip xfrm policy add dir in tmpl src REMOTE_IPv4_ADDR dst LOCAL_IPv4_ADDR PROTO mode tunnel mark VTI_KEY # ip xfrm policy add dir out tmpl src LOCAL_IPv4_ADDR dst REMOTE_IPv4_ADDR PROTO mode tunnel mark VTI_KEY
這樣呢. 這個新增的VTI就等價於SA, 我們只有正常的配置路由, 將流量路由到這個VTI上, 便等於完成了基於路由的IPsec.
四
三里邊我們使用iproute工具做的配置, strongsan里同樣如此. 在配置的時候, 比如有一個mark的配置項,用來關聯SA
mark_in = mark_out = 42
五
基於一中的分析. 我們在基於路由的場景下將police的功能進行了分離. 所以policy的原有的策略控制功能和定義並沒有發生變化.
雙端還是可以自由的協商出需要的安全策略.
六
VTI是有很多局限性的, 最新的kernel里新增了類型名叫做xfrm的interface, 作為VTI的下一代. 見:
https://lwn.net/Articles/757391/
七
基於二, 我們解決這個問題的方法有很多, 只要能達成路由到SA的包轉發.
處理VTI, XFRM, 還可以用GRE.
見:https://wiki.strongswan.org/projects/strongswan/wiki/RouteBasedVPN
八
所有問題的關鍵,都在於將作為工具的interface將SA進行關聯.
VTI用了 key/mark (mark_in = mark_out = 42)
XFRM用了 interface Id (if_id_in|out in swanctl.conf)
GRE在strongswan中使用這樣一個配置: (local|remote_ts=dynamic[gre] in swanctl.conf)
另外, 如果你使用strongswan的話, 需要改一下這個, 因為基於策略時他會在路由表里加東西: charon.install_routes=0