linux 下連接 l2tp vpn

CCNS 在機房架了 l2tp 的 vpn server, 最近覺得有點需要,就查了一下怎麼在 linux 下連 l2tp vpn。 發現自己手動設定蠻麻煩的,用 network manager 管理比較簡單, 但 network manager l2tp 的外掛目前只發行在 debian sid , 又不想手動編譯;google 發現 [有人成功在 stretch 裡 裝 debian sid 裡舊的版本,是可以運作的][l2tp cross sid] , 就試成功了。

以前有 ssh 登入權限的時候,會用 ccns 機房的機器當 ssh 跳板上 ptt: ssh -J lab.ccns.ncku.edu.tw bbsu@ptt.cc 。 後來機房大翻修,一些機器也虛擬化,帳號就被洗掉了,也沒再要。 有個社員自己會用 l2tp 開 vpn,在機房變得很潮後, 就把 l2tp server 架到機房去,變 ccns 共用 vpn。 一開始剛架好時試了,手動設定一直失敗, 今天心血來潮,又嘗試終於成功連上了。

l2tp 手動設定

手動設定就是裝 xl2tpd 寫 config, 就會多出一個 ppp 網路裝置, 要自己用 route 把封包導過去。 如果要加密還要裝 openswan 或其它 swan 系列。 之前試過手動設定失敗, 今天又試第一次還是失敗。

我看過幾篇教學,有 arch wiki 的 也有 github 上別人寫的文件 。 後來在 github 上那篇又重試了一遍, 整理重寫了複製貼上的 config 才成功; 後面那些手動 route 好像也不是那麼難了, echo "c my-vpn" > /var/run/xl2tpd/l2tp-control 相當於啟動連上 l2tp 並創建一個 ppp 網路裝置, 之後的 route 就是把預設路由改成該 ppp。

一開始我連 l2tp ipsec openswan 之間是什麼關係都沒弄清楚, 分不清楚教學到底是在教 l2tp client 還是 l2tp server。 現在裝好了才發現一直卡住的 ipsec 部份, 其實是加密部份而已,不是必須的。 另外就是 ipsec 有個雷點, 幾篇教學是寫 ipsec auto --add my-l2tp , 但我的版本應該是 ipsec up my-l2tp , 翻了整篇手冊頁想破頭, 還是不確定 auto 和 add 到底要對應到哪個命令。

network manager 介面

試幾次 xl2tp 都連不上,看到 network manager 有個外掛 network manager l2tp 能在圖型介面上 直接連上 l2tp vpn,就抱著姑且一試的心態試了。 該外掛有提供預編譯好的套件,但 debian stretch 沒有支援, 只有目前的 sid 未來的 buster 有。 但我也懶得自己編譯,要裝的東西太多了,放棄。

試著去下載 ubuntu 預編好的 deb 包,直接用 apt 安裝。 可以開出圖形介面,但連不上。 又 google 了一下, 找到 一篇部落格文章說可以裝 debian sid 的版本 , 在 debian stretch 也能用,但文內的版本是 1.2.8, 現在 sid 已經更新到 1.2.10, 試了現在的 1.2.10,和 ubuntu 一樣有介面但不能連。

舊 debian archieve

後來直接問部落格作者,看他有沒有留當時的 deb 包。 他簡介還蠻有趣的,是 linux user 和 火腿族 , 目前主要掛在 mastodon 上, 所以我就開了塵封已久的 g0v 的 mastodon 發訊息給他。 結果他說也沒在用 vpn 了,傳了一個 debian snapshot 的網站給我, 裡面收錄了所有版本的 debian package,不只是每個 debian 版本, 連同一 debian 版本中每一次更新都有。 我就從上面抓了 sid 的 1.2.8-2 下來裝,就能動了。

deb 包就是 apt 在操作的最小單位,每個包會記錄相依的其它包, 在用 dpkg 安裝時就是檢查有滿足就直接安裝,沒滿足就報錯。 而 apt 不只可以從倉庫安裝,也可以直接安裝本機的 deb 包, 只要你傳入的名稱明顯是路徑,像是用 ./ 開頭。 而且 apt 還會幫處理相依性問題,但只會從系統的 apt 設定的網路倉庫抓, 所以如果是載下來在本機要手動安裝的二個相依的 deb 包,就沒辦法自動安裝。

以 network-manager-l2tp 和 network-manager-l2tp-gnome 二個包來說, 可以先裝被 network-manager-l2tp 相依的 network-manager-l2tp-gnome, 再裝 network-manager-l2tp, 之後再把 network-manager-l2tp-gnome 標記為自動安裝, 未來 apt remove 後 network-manager-l2tp-gnome 也會被標成不需要, 可以自動刪除。 或是就在安裝時把所有包的檔名都傳入, apt 會檢測到其中數個包相依,就會自動處理相依性。

install_once() {
    apt install ./network-manager-l2tp_1.2.8-2_amd64.deb \
                ./network-manager-l2tp-gnome_1.2.8-2_amd64.deb
}
install_and_mark() {
    apt install ./network-manager-l2tp-gnome_1.2.8-2_amd64.deb
    apt install ./network-manager-l2tp_1.2.8-2_amd64.deb
    apt-mark auto network-manager-l2tp-gnome
}

l2tp ipsec 連線設定

網愛社的人的用法是設 l2tp 的帳號密碼, ipsec 則是用一個 pre share key,也和密碼差不多。 其它欄位都留空。(server 網址當然不能留空, 在 network manager 介面裡,看要打 domain name 或 ip 都可以。) 詳情可以看 一開始提到那篇 github 連接 l2tp 的教學。