Linux 下基于路由 IPsec 的花式實踐

動機

IPsec 轉(zhuǎn)發(fā)流量有兩種方式逐纬,一種是基于策略,另外一種是基于路由削樊。本文將嘗試闡述基于路由的 IPsec 核心概念和實現(xiàn)原理并引出一些花式玩法豁生。

IPsec 帶給計算機世界的困惑

在計算機世界里面,核心的一個概念就是路由嫉父,其定義了某個指定的數(shù)據(jù)包要從哪個接口出去的規(guī)則沛硅。很多軟件和命令都是基于這個事實來設(shè)計的眼刃。譬如 iproute 包绕辖,各類路由軟件,iptables 等等擂红。

但是在 IPsec 的世界里面仪际,默認(rèn)是根據(jù)內(nèi)核里面的規(guī)則直接就進行了封裝和轉(zhuǎn)發(fā)围小,這導(dǎo)致用戶理解困難,軟件無法正常運作树碱。舉例而言肯适,你沒有辦法通過增加一條路由來告訴計算機某個地址要通過 IPsec 隧道來走。

要解決這個問題成榜,就只能用計算機世界里面最常用的手段:增加一層封裝框舔,虛擬出來一個設(shè)備,使其符合原來的世界規(guī)則赎婚。

這樣從設(shè)計上來說就變成了:

  1. IPsec 只管建立通道和進行封裝轉(zhuǎn)發(fā)
  2. 虛擬設(shè)備只管數(shù)據(jù)包怎么處理和路由

打通虛擬設(shè)備和 IPsec 的任督二脈

要從實際上解決這個問題刘绣,有兩種方法。

第一種方法:VTI (Virtual Tunnel Interface) 的原理

最初往 Linux 增加 VTI 功能的作者提到:Virtual tunnel interface is a way to represent policy based IPsec tunnels as virtual interfaces in linux. This is similar to Cisco's VTI (virtual tunnel interface) and Juniper's representaion of secure tunnel (st.xx). The advantage of representing an IPsec tunnel as an interface is that it is possible to plug Ipsec tunnels into the routing protocol infrastructure of a router. Therefore it becomes possible to influence the packet path by toggling the link state of the tunnel or based on routing metrics.

這表明了 VTI 是一種虛擬網(wǎng)絡(luò)設(shè)備挣输。在 Linux 的實現(xiàn)中該設(shè)備主要作用是將經(jīng)過這個設(shè)備的網(wǎng)絡(luò)流量打上標(biāo)簽纬凤,IPsec的策略根據(jù)這個標(biāo)簽和相關(guān)信息來判斷流量該怎么轉(zhuǎn)發(fā)岳瞭。

看到這個做法寸痢,對 iptables 熟悉的同學(xué)肯定馬上就聯(lián)想到了 iptables 打標(biāo)簽給 tc 來控制流量,通過 iptables 打標(biāo)簽來給 iproute 來控制路由等做法瞒窒。是的完丽,他們是師出同門恋技,做法上是類同的。所以逻族,如果你通過 iptables 給網(wǎng)絡(luò)流量打上標(biāo)簽猖任,也是能夠?qū)崿F(xiàn)讓其數(shù)據(jù)包被 IPsec 轉(zhuǎn)發(fā)的效果的。

第一種方法:VTI 的實踐

  1. 要實現(xiàn)這種做法瓷耙,需要在 IPsec 的配置里面約定好標(biāo)簽(配置項為mark)的值朱躺。
  2. VTI 里面 local 和 remote 地址至少需要有一項跟 IPsec 里面的 left,remote相同搁痛,key 的參數(shù)要跟 IPsec 里面的 mark 一致长搀。
  3. VTI 設(shè)備本身可以單獨配置地址,該地址可以用來做 NAT 等
sudo ip tunnel add vti6 mode vti local ${local_ip) remote 0.0.0.0 key 6
sudo ip addr add ${tunnel_ip) dev vti6
sudo ip link set vti6 up
sudo ip route add ${remote_site_lan) dev vti6 src ${tunnel_ip)
sudo iptables -t nat -A POSTROUTING -o vti6 -j SNAT --to-source ${tunnel_ip}

第一種方法:花式玩法 iptables 篇

如果要僅僅通過 iptables 打標(biāo)簽就使得數(shù)據(jù)包通過 IPsec 轉(zhuǎn)發(fā)鸡典,那么要怎么做呢源请?

參考下面的命令:

sudo iptables -t mangle -I PREROUTING -s ${remote_peer} -j MARK --set-mark 0x6
sudo iptables -t mangle -I PREROUTING -d ${remote_site_lan} -j MARK --set-mark 0x6
sudo iptables -t mangle -I OUTPUT -d ${remote_site_lan} -j MARK --set-mark 0x6

小竅門:可以通過 ip xfrm policy 查看 ipsec 的策略,包括其 mark 值等彻况∷可以通過 iptables -L 來查看 mark 的匹配情況。tcpdump 是看不到 mark 值的纽甘,因為 mark 值在內(nèi)核維護良蛮,不體現(xiàn)在包的內(nèi)容上面。

注意:

  1. 要注意發(fā)送出去的地址跟規(guī)則相符合悍赢,必要的話可以做個 SNAT
  2. 可以通過抓 remote_peer 的包來判斷包是不是通過 IPsec 發(fā)送出去决瞳。

第一種方法:VTI 的作用和用其他虛擬設(shè)備的可能性

用 tuntap 設(shè)備货徙,然后用 iptables fwmark 是不是可以和 VTI 有同樣的效果呢?
如果是這樣皮胡,那么 VTI 里面的 local 和 remote 有什么用途呢痴颊?

第一種方法:一些解答 - VTI 的地址

VTI 代碼里面會去檢查 IPsec 相關(guān)的策略(代碼net/ipv4/ip_vti.c),這里涉及到 local 和 remote 地址屡贺,所以這兩個地址不能隨意設(shè)置蠢棱,要不然就會被拒絕轉(zhuǎn)發(fā)。從某種意義上來說甩栈,做這個檢查是多余的裳扯,會使得系統(tǒng)耦合比較重。不過既然VTI作者的本意是通過 VTI 來表示 IPsec谤职,這本身也是無可厚非饰豺。

第一種方法:另一種玩法實踐 - 用 tuntap 設(shè)備

ip tuntap add tuntap mode tap ${tap_name}
ip link set ${tap_name} up
ip addr add ${tunnel_ip} dev ${tap_name}
ip route add ${remote_site_lan} dev ${tap_name} src ${tunnel_ip}
iptables -t mangle -A PREROUTING -s ${remote_peer} -j MARK --set-mark ${mark}
iptables -t mangle -A OUTPUT -o ${tap_name} -j MARK --set-mark ${mark}

你會看到 tap 設(shè)備的狀態(tài)是 link down,NO-CARRIER允蜈,不過沒關(guān)系冤吨,照樣能用,只要數(shù)據(jù)包丟到內(nèi)核去了就會被處理掉饶套。

第二種方法:內(nèi)部封裝(GRE封裝)

在 Strongswan 里面提到了 GRE 封裝漩蟆,相當(dāng)于IPsec將GRE封裝的包傳過去,然后 GRE 封裝里面又有源地址和目的地址妓蛮。這種做法其實只要允許兩個 Peer 之間加密就好了怠李,底層怎么路由,封裝 IPsec 都不管蛤克。我們常見的 L2TP捺癞,譬如 IP over IP 等等,其實也都是屬于這個范疇的构挤。

這種做法的缺點是兩端需要單獨再起一個服務(wù)來實現(xiàn)這些封裝髓介。

參考鏈接

https://www.spinics.net/lists/netdev/msg202714.html
https://wiki.strongswan.org/projects/strongswan/wiki/RouteBasedVPN
https://vincent.bernat.ch/en/blog/2017-route-based-vpn
https://www.juniper.net/documentation/software/screenos/screenos6.3.0/630_ce_VPN.pdf
https://www.inetzero.com/bgp-over-ipsec/
https://www.juniper.net/documentation/en_US/junos/topics/topic-map/security-route-based-ipsec-vpns.html
https://github.com/strongswan/strongswan/blob/master/testing/tests/ikev2/nat-virtual-ip/hosts/moon/etc/nat_updown
https://networkengineering.stackexchange.com/questions/10342/backup-ip-for-site-2-site-vpn-juniper-srx
https://kb.juniper.net/InfoCenter/index?page=content&id=KB14330
https://wiki.strongswan.org/projects/strongswan/wiki/Strongswanconf
https://libreswan.org/wiki/Route-based_VPN_using_VTI
https://www.ibm.com/support/knowledgecenter/en/SST55W_4.3.0/liaca/liaca_cfg_ipsec_vti.html
https://elixir.bootlin.com/linux/v4.1/source/net/ipv4/ip_vti.c#L78

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市筋现,隨后出現(xiàn)的幾起案子唐础,更是在濱河造成了極大的恐慌,老刑警劉巖矾飞,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件一膨,死亡現(xiàn)場離奇詭異,居然都是意外死亡洒沦,警方通過查閱死者的電腦和手機豹绪,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來微谓,“玉大人森篷,你說我怎么就攤上這事输钩〔蛐停” “怎么了仲智?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長姻氨。 經(jīng)常有香客問我钓辆,道長,這世上最難降的妖魔是什么肴焊? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任前联,我火速辦了婚禮,結(jié)果婚禮上娶眷,老公的妹妹穿的比我還像新娘似嗤。我一直安慰自己,他們只是感情好届宠,可當(dāng)我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布烁落。 她就那樣靜靜地躺著,像睡著了一般豌注。 火紅的嫁衣襯著肌膚如雪伤塌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天轧铁,我揣著相機與錄音每聪,去河邊找鬼。 笑死齿风,一個胖子當(dāng)著我的面吹牛药薯,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播救斑,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼果善,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了系谐?” 一聲冷哼從身側(cè)響起巾陕,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎纪他,沒想到半個月后鄙煤,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡茶袒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年梯刚,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薪寓。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡亡资,死狀恐怖澜共,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锥腻,我是刑警寧澤嗦董,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站瘦黑,受9級特大地震影響京革,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜幸斥,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一匹摇、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧甲葬,春花似錦廊勃、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至钠至,卻和暖如春葛虐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背棉钧。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工屿脐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人宪卿。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓的诵,卻偏偏與公主長得像,于是被迫代替她去往敵國和親佑钾。 傳聞我的和親對象是個殘疾皇子西疤,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,864評論 2 354