Monthly Archive for April, 2015

Strongswan ikev2 VPN 配置

Why

  • ikev2 支持 mobike, 會極大提高 VPN 連接穩定性. (基本不掉線, 即使是移動設備上在 Mobile Network 和 Wifi 之間切換時.)
  • 基於 ipsec (第三層協議), 受到的干擾較小 (至少目前).

Server (Linux) (假設 IP 為 1.2.3.4)

參考 linux上用strongswan搭建ikev2協議vpn 編譯安裝 Strongswan (必須是 5.0+版本, Debian / Ubuntu 的 repository 里貌似只有 Strongswan 4), 生成服務器端的 CA 和 server 的證書和密鑰 (caCert.pem, caKey.pem, serverKey.pem, clientCert.pem)並放到 “/etc/ipsec.d/” 里對應目錄下. (client 端證書可以不需要, windows 7 以及 Linux / Android 上的 Strongswan 客戶端均可以使用 eap-mschapv2 方式用戶名 / 密碼驗證.)

/etc/ipsec.conf

config setup
    uniqueids=no #允許多設備同時在線

conn ipke2vpn 
    keyexchange=ikev2
    ike=aes256-sha1-modp1024!
    esp=aes256-sha1!
    dpdaction=clear
    dpddelay=300s
    rekey=no
    left=%defaultroute
    leftsubnet=0.0.0.0/0
    leftauth=pubkey
    leftcert=serverCert.pem
    leftid="C=US, O=strongSwan, CN=1.2.3.4"
    right=%any 
    rightsourceip=192.168.250.0/24
    rightauth=eap-mschapv2
    rightsendcert=never
    eap_identity=%any
    auto=add

/etc/ipsec.secrets

: RSA serverKey.pem
: PSK "Password"
username: EAP "Password"
username: XAUTH "Password"

‘: PSK “Password”‘ 這行是 L2TP / IPsec VPN 的配置. IKEv2 可以不需要.

/etc/strongswan.conf

charon {
        dns1 = 8.8.8.8
        dns2 = 8.8.4.4
}

Server 端通用 VPN 配置 (PPTP / OpenVPN / L2TP 等通用, 只要 VPN 設置的虛擬IP段屬於 192.168.0.0/16)

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 192.168.16.0/16 -j MASQUERADE

配置完後, 系統啟動時應該自動開啟 VPN Server, 你也可以手工啟動 / 關閉 VPN

ipsec start
ipsec stop
ipsec start --nofork # 將 log 輸出到當前終端用於調試.

Windows 7 / 8 Client

使用系統自帶的 VPN Client

導入服務器生成的 CA 證書: mmc -> File -> Add / Remove Snap-in -> 左側選擇 Certificates -> 點擊 Add 按鈕 -> 選擇 “Computer Account” (重要) -> Local Computer -> OK. 然後右擊左側列表裡 “Trusted Root Certificates” -> All Tasks -> Import, 選擇 caCrt.pem 文件並導入.

  • 只需要導入 CA 證書. Server 證書客戶端不需要
  • 必須使用上面的方式導入證書. 直接使用 “certmgr.msc” 導入的證書屬於 “Current User”, 無法被 VPN 連接使用.
  • 你也可以使用可信 CA 簽發的 Server 證書 (如 SartSSL), 這樣所有 VPN 客戶端 均不需要導入 CA.

在 Windows 系統網絡管理面板里建立一個 VPN 連接, “Host name or IP address of destination” 里填寫 VPN Server 的 IP 地址 1.2.3.4. VPN 連接配置如下:

Screenshot 2015-03-16 11.16.27

連接時, 輸入服務器 ipsec.secrets 里 配置的 EAP 方式的用戶名和密碼 “username”, “Password”.

Android

使用 Strongswan VPN Client 應用.

將 CA 證書文件 caCrt.pem 複製到 Android 內置存儲里, 然後在 Settings -> Security -> Install from internal storage 導入.

Strongswan VPN Client VPN Profile 配置

android_strongswan_ikev2_config

  • Android 系統導入根證書後, 有時會彈出 “Network may be monitored” 的 notification. 屏蔽方法是安裝 Xposed 框架的 “Network Monitored Blocker” module.
  • Android 的 Strongswan 客戶端使用了 Android 的 VPN API, 每次連接 VPN 時都會提示用戶確認. 自動連接的方法是安裝 XPosed 的 “VpnDialog Xposed module” 並在 module settings 里將 “Strongswan VPN Client” 這個應用加入列表. (但每次連接 VPN 時仍然會有個 toast 消息, 無法消除)
  • Android 4.4.2 及以下版本存在 Bug, 會導致 Stronswan 連接 VPN 後若較長時間不使用, VPN 會斷開, 但 Notification Area 里仍然存在 “VPN Connected” 的消息無法消除, 並且無法重新連接 VPN, 必須重啟設備. 解決這個 Bug 的唯一方法是升級到 Android 4.4.3 或 5.0.

Linux Strongswan ikev2 client

適用於桌面 Linux / 路由器等設備, 將 Strongswan 配置為 VPN Client 模式.

編譯安裝 Strongswan. 將 VPN Server 的 CA 證書 caCrt.pem 複製到 /etc/ipsec.d/cacerts/ 里.

/etc/ipsec.secrets 與 服務器端的完全相同.

/etc/ipsec.conf

conn ikev2-rw
    keyexchange=ikev2
    ike=aes256-sha1-modp1024!
    esp=aes256-sha1!
    right=1.2.3.4
    rightid=%1.2.3.4
    # 部分 strongswan 版本可能上面那行無效,需要明確指定 rightid 為服務端設置的 leftid  值
    #rightid="C=US, O=strongSwan, CN=1.2.3.4"
    rightsubnet=0.0.0.0/0
    rightauth=pubkey
    leftsourceip=%config
    leftsendcert=never
    leftauth=eap-mschapv2
    eap_identity=username
    auto=start

另外, 我發現 Linux 連接 ikev2 VPN Server 後, 會無法訪問本地局域網內其他機器, 貌似因為 ikev2 VPN 自動添加的路由表 (table id 和優先級都是 220. ip route show table 220) 比系統默認路由表優先級高. Workaround:

    ip rule add from 192.168.0.0/16 table main prio 1

如果想共享 VPN Connection 給局域網內其它機器:

    sysctl -w net.ipv4.ip_forward=1
    iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ipsec+ -j MASQUERADE

則其它機器將 Gateway 設為 192.168.1.2 即可自動通過 VPN 訪問 Internet. 還可以再加上 chnroutes.

Update:
某日更新後發現 Linux strongswan ikev2 客戶端連接不會創建單獨的虛擬網卡了,而直接將獲取的虛擬 IP 追加綁定到默認網卡 (eth0)上(使用 ip address 可以看到)。那麼客戶端的NAT規則就不能寫 MASQUERADE 了,必須寫

    # 192.168.250.2 是客戶端分配到的虛擬網段地址
    iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 192.168.250.2

很麻煩。不知道能不能設置回讓 strongswan 單獨創建一個虛擬網卡。