建置使用帳號及密碼認證的 OpenConnect Server – 1

建置方式可以參考以下二篇文章:
頭城國小資訊組 | 在 Ubuntu 16.04.1 Server 上建置 OpenConnect SSL VPN Server
頭城國小資訊組 | 在 CentOS 7.x 上建置 OpenConnect SSL VPN Server

本來一直都是直接使用 key 來做認證,但在手機及平板上沒有對應的程式可以使用,所以改用帳號及密碼來做認證,OpenConnect Server 可以同時使用 key 及帳號密碼認證。
1. 修改 /etc/ocserv/ocserv.conf 設定檔
# vim /etc/ocserv/ocserv.conf
取消使用憑證認證
# sed -i ‘s/^auth = “certificate”/#auth = “certificate”/’ /etc/ocserv/ocserv.conf
在 auth 認證區段加入
auth = “plain[passwd=/etc/ocserv/ocpasswd]”[@more@]2. 建立帳號及密碼
# /usr/bin/ocpasswd -c /etc/ocserv/ocpasswd test
Enter password:
Re-enter password:

3. 測試有沒有建立使用者
# grep tces /etc/ocserv/ocpasswd | awk -F: ‘{print $1}’
test

4. 重新啟動 OpenConnect Server
# systemctl restart ocserv

5. 檢查系統是否有正常啟動
# systemctl status ocserv

OpenConnect Client – Android 手機篇

這裡以 Android 手機為例
1. 在 Google Play 商店搜尋 Cisco AnyConnect,選擇 安裝
[@more@]
2. 選擇 接受

3. 安裝中

4. 選擇 開啟

5. 選擇 OK

6. 選擇 連線

7. 選擇 新增新的 VPN 連線…

8. 輸入伺服器位址

9. 選擇 完成

10. 選擇 右上角功能,再選擇 Settings

11. 預設 封鎖不信任的伺服器

把它取消

12. 把 AnyConnect VPN 的鈕往右邊移動

13. 選擇 繼續

14. 輸入 使用者名稱

15. 輸入 密碼

16. 選擇 確定

17. 已連線成功,畫面上方會出現一個鎖頭,代表現在在 VPN 模式

17. 如果要關閉,請把 開啟 往左邊移動

OpenConnect Client – iPad 平板篇

1. 在 Apple App Store 搜尋 Cisco AnyConnect

[@more@]2. 進行安裝

3. 選擇 確定

4. Cisco AnyConnect 主畫面

5. 選擇 設定

6. 把 封鎖不信任的伺服器

改成不封鎖

7. 選擇 連線 / 新增 VPN 連線…

8. 輸入 VPN Server 資訊,最後按 儲存

9. 輸入完畢 VPN Server 相關資訊

10. 把 AnyConnect VPN 鈕往右邊移動

11. 如果出現這一個畫面,表示沒有做第五步驟的設定

12. 選擇 繼續

13. 輸入帳號,然後按 連線

14. 輸入密碼,然後按 連線

15. 連線成功,畫面左上角出現 VPN 圖示

OpenConnect Client – macOS Sierra 系統篇

改用 Cisco AnyConnect,一樣官方網站上要加入會員及一定層級才可以下載,在網路上搜尋找到的,純屬測試。
1. 按二下掛載檔案

[@more@]2. 底下為安裝畫面

3. 執行 Cisco AnyConnect

4. 輸入連線 IP

5. 選擇 Connect

6. 選擇 Change Setting…

7. 取消 Block connections to untrusted servers

8. 勾選 Always trust this server and import the certificate,選擇 Connect Anyway

9. 輸入帳號

10. 輸入密碼

11. 連線完成

12. 選擇 Quit Cisco AnyConnect 結束連線

OpenConnect Client – Windows 系統篇 帳號密碼登入

改用 Cisco AnyConnect Secure Mobility Client 進行測試,不過 Cisco 官方網站並不提供下載,有興趣的人自行在網路上搜尋一下,應該可以找的到。
之前使用 OpenConnect GUI 是使用憑證來登入,所以不用帳號密碼,因為是自己一個人使用,如果是多人使用的,可能會改用帳號及密碼來進行管理。

1. 修改 OpenConnect 設定檔
取消使用憑證
# sed -i ‘s/^auth = “cert/#auth = “cert/’ /etc/ocserv/ocserv.conf
改採用帳號密碼認證

#auth = “plain[passwd=./sample.passwd]”
修改成
auth = “plain[passwd=/etc/ocserv/ocpasswd]”
[@more@]2. 建立帳號及密碼
# /usr/bin/ocpasswd -c /etc/ocserv/ocpasswd username
Enter password:
Re-enter password:

# grep username /etc/ocserv/ocpasswd  | awk -F: ‘{print $1}’
username

3. 重新啟動 ocserv
# systemctl restart ocserv

4. 安裝 Cisco AnyConnect Secure Mobility Client

5. 底下為安裝畫面

6. 執行 Cisco AnyConnect Secure Mobility Client

7. 選擇右下角的設定

8. 取消 Block connections to untrusted servers

9. 輸入 OpenConnect Server IP,然後選 Connect

10. 選擇 Connect Anyway

11. 輸入帳號

12. 輸入密碼

13. 連線畫面

14. 連線成功

15. 選擇 Quit 結束

16. 連線前後 IP 的變化
連線前,教育部學術網路

連線後,中華電信網路

OpenConnect Client – Windows 系統篇 使用憑證登入

OpenConnect Client 下載網址:https://github.com/openconnect/openconnect-gui/releases
目前最新版本是 1.4.1 版

2. 準備好 Client 端要使用的檔案
Server:ca-cert.pem
Client:home-cert.pemhome-key.pem

[@more@]3. 執行桌面上下載下來的 openconnect-gui-1.4.1-win32.exe

4. 安裝畫面

5. 執行 OpenConnect VPN Client 圖示

6. 選擇右下黑色三角形

7. 選擇 New profile

8. 輸入各項設定
    1. 設定名稱
    2. https://sever’IP:443
    3. Server ‘ca 憑證
    4. Client ‘ca 憑證
    5. Client’ key
    最後按 Save

9. 按 Connect

10. 連線成功之後會變成 綠色

11. 不使用時可以選擇 Disconnect 斷線

12. 完全不用時,可以選擇 Close 關閉

13. 連線前後 IP 的變化
連線前,教育部學術網路

連線後,中華電信網路

在 Ubuntu 16.04.1 Server 上建置 OpenConnect SSL VPN Server

參考網站:
折腾笔记:架设OpenConnect Server给iPhone提供更顺畅的网络生活 – 比特客栈的文艺复兴
Ubuntu ocserv搭建
使用ocserv搭建 Cisco Anyconnect 服務器 | 落格博客
Setup OpenConnect VPN Server for Cisco AnyConnect on Ubuntu 14.04 x64 – Vultr.com

1. 安裝 ocserv
# apt-get install ocserv

2. 安裝建立憑證時所需套件
# apt install gnutls-bin

3. 建立目錄及切換目錄
# mkdir certificates
# cd certificates[@more@]4. 建立 CA 金鑰
# certtool –generate-privkey –outfile ca-key.pem
Generating a 3072 bit RSA private key…

建立 ca.tmpl
# cat ca.tmpl
cn = “VPN CA”
organization = “Home”
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key

# certtool –generate-self-signed –load-privkey ca-key.pem –template ca.tmpl –outfile ca-cert.pem

複製 ca-cert.pem 到 /etc/ocserv 目錄
# cp ca-cert.pem /etc/ocserv

5. 建立本機 Server 證書
# certtool –generate-privkey –outfile server-key.pem
Generating a 3072 bit RSA private key…

建立 server.tmpl
# cat server.tmpl
cn = “nas.test.com”
organization = “Home”
serial = 2
expiration_days = 3650
encryption_key
signing_key
tls_www_server

# certtool –generate-certificate –load-privkey server-key.pem –load-ca-certificate ca-cert.pem –load-ca-privkey ca-key.pem –template server.tmpl –outfile server-cert.pem

將 server-cert.pem 和 server-key.pem 複製到 /etc/ocserv
# cp server-cert.pem server-key.pem /etc/ocserv

6. 產生使用者端證書(連線時可以不用輸入帳號及密碼)
# cat gen-client-cert.sh
#!/bin/bash
USER=$1
CA_DIR=$2
SERIAL=`date +%s`
certtool –generate-privkey –outfile $USER-key.pem
cat << _EOF_ >user.tmpl
cn = “$USER”
unit = “users”
serial = “$SERIAL”
expiration_days = 3650
signing_key
tls_www_client
_EOF_
certtool –generate-certificate –load-privkey $USER-key.pem –load-ca-certificate $CA_DIR/ca-cert.pem –load-ca-privkey $CA_DIR/ca-key.pem –template user.tmpl –outfile $USER-cert.pem
openssl pkcs12 -export -inkey $USER-key.pem -in $USER-cert.pem -name “$USER VPN Client Cert” -certfile $CA_DIR/ca-cert.pem -out $USER.p12

更改檔案權限
# chmod 700 gen-client-cert.sh

建立目錄來存放使用者證書
# mkdir home
# 切換目錄
# cd home
# home 是使用者的名稱,.. 是指 ca 證書所在的目錄
# ../gen-client-cert.sh home ..
可以直接按 Enter 鍵跳過,就不用設定密碼
Signing certificate…
Enter Export Password:
Verifying – Enter Export Password:

產生之後可以將 home.p12 複製給使用者用戶端導入即可

7. 修改 /etc/ocserv/ocserv.conf 設定檔
# cp /etc/ocserv/ocserv.conf /etc/ocserv/ocserv.conf.$(date +%F)
取消 pam 認證
# sed -i ‘s|^auth = “pam|#auth = “pam|’ /etc/ocserv/ocserv.conf
採用 certificate 認證
# sed -i ‘s/#auth = “certificate”/auth = “certificate”/’ /etc/ocserv/ocserv.conf
設定同一個用戶最多的登入數
# sed -i ‘s/max-same-clients = 2/max-same-clients = 10/’ /etc/ocserv/ocserv.conf
設定憑證檔的位置
# sed -i ‘s|server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem|server-cert = /etc/ocserv/server-cert.pem|’ /etc/ocserv/ocserv.conf
# sed -i ‘s|server-key = /etc/ssl/private/ssl-cert-snakeoil.key|server-key = /etc/ocserv/server-key.pem|’ /etc/ocserv/ocserv.conf
# sed -i ‘s|ca-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem|ca-cert = /etc/ocserv/ca-cert.pem|’ /etc/ocserv/ocserv.conf
從證書中提取用戶名的方式,這裡提取的是證書中的 CN 欄位作為用戶名
# sed -i ‘s/cert-user-oid = 0.9.2342.19200300.100.1.1/cert-user-oid = 2.5.4.3/’ /etc/ocserv/ocserv.conf
分配給 VPN 用戶端的 IP 網段
# sed -i ‘s/ipv4-network = 192.168.1.0/ipv4-network = 10.12.0.0/’ /etc/ocserv/ocserv.conf
設定 DNS
# sed -i ‘s/dns = 192.168.1.2/dns = 8.8.8.8/’ /etc/ocserv/ocserv.conf
註解 route,讓 Ocserv 伺服器成為 Gateway
# sed -i ‘s/^route = 10.10.10.0/# route = 10.10.10.0/’ /etc/ocserv/ocserv.conf
# sed -i ‘s/^route = 192.168.0.0/# route = 10.10.10.0/’ /etc/ocserv/ocserv.conf
優化 VPN 的網路性能
# sed -i ‘s/^(try-mtu-discovery = ).*$/1”true/’ /etc/ocserv/ocserv.conf

For sed
# cat sed-script
s|^auth = “pam|#auth = “pam|
s/#auth = “certificate”/auth = “certificate”/
s/max-same-clients = 2/max-same-clients = 10/
s|server-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem|server-cert = /etc/ocserv/server-cert.pem|
s|server-key = /etc/ssl/private/ssl-cert-snakeoil.key|server-key = /etc/ocserv/server-key.pem|
s|ca-cert = /etc/ssl/certs/ssl-cert-snakeoil.pem|ca-cert = /etc/ocserv/ca-cert.pem|
s/cert-user-oid = 0.9.2342.19200300.100.1.1/cert-user-oid = 2.5.4.3/
s/ipv4-network = 192.168.1.0/ipv4-network = 10.12.0.0/
s/dns = 192.168.1.2/dns = 8.8.8.8/
s/^route = 10.10.10.0/# route = 10.10.10.0/
s/^route = 192.168.0.0/# route = 10.10.10.0/
s/^(try-mtu-discovery = ).*$/1true/

# sed -i -f sed-script /etc/ocserv/ocserv.conf

8. 設定網路 Forward
# sed -i ‘s/#net.ipv4.ip_forward=1/net.ipv4.ip_forward=1/’ /etc/sysctl.conf
# sysctl -p /etc/sysctl.conf

10. 設定防火牆規則
# iptables -t nat -A POSTROUTING -s 10.12.0.0/24 -o eth0 -j MASQUERADE
# iptables -A FORWARD -i vpns+ -j ACCEPT
# iptables -A FORWARD -o vpns+ -j ACCEPT

11. 儲存防火牆規則
# iptables-save > /etc/sysconfig/iptables

12. 設定開機時啟動
# systemctl enable ocserv
Synchronizing state of ocserv.service with SysV init with /lib/systemd/systemd-sysv-install…
Executing /lib/systemd/systemd-sysv-install enable ocserv

12. 啟動 OpenConnect Server
# systemctl start ocserv
# systemctl status ocserv

在 CentOS 7.x 上建置 OpenConnect SSL VPN Server

關於 OpenConnect 可以參考:
用樹莓派架設SSL VPN 最低成本打造窮人翻牆梯 – 技術專欄 – 網管人NetAdmin
本篇文章參考:
CentOS 7 安装 ocserv (OpenConnect Server) 并实现证书登录 – 奇遇·奇玉
在 CentOS 7 上搭建 Cisco AnyConnect VPN · ifreedomlife
老天尊的死期: Linode CentOS 7主機搭建Cisco AnyConnect VPN

1. 新增 epel  套件庫
# yum install epel-release

2. 更新套件庫
# yum update[@more@]3. 安裝 ocserv 套件
# yum install ocserv

4. 建立目錄及切換目錄
# mkdir certificates
# cd certificates

5. 建立 CA 金鑰
# certtool –generate-privkey –outfile ca-key.pem
Generating a 2048 bit RSA private key…

建立 ca.tmpl
# cat ca.tmpl
cn = “VPN CA”
organization = “Home”
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key

# certtool –generate-self-signed –load-privkey ca-key.pem –template ca.tmpl –outfile ca-cert.pem

複製 ca-cert.pem 到 /etc/ocserv 目錄
# cp ca-cert.pem /etc/ocserv

6. 建立本機 Server 證書
# certtool –generate-privkey –outfile server-key.pem
Generating a 2048 bit RSA private key…

建立 server.tmpl
# cat server.tmpl
cn = “nas.test.com”
organization = “Home”
serial = 2
expiration_days = 3650
encryption_key
signing_key
tls_www_server

# certtool –generate-certificate –load-privkey server-key.pem –load-ca-certificate ca-cert.pem –load-ca-privkey ca-key.pem –template server.tmpl –outfile server-cert.pem

將 server-cert.pem 和 server-key.pem 複製到 /etc/ocserv
# cp server-cert.pem server-key.pem /etc/ocserv

7. 產生使用者端證書(連線時可以輸入帳號及密碼)
# cat gen-client-cert.sh
#!/bin/bash
USER=$1
CA_DIR=$2
SERIAL=`date +%s`
certtool –generate-privkey –outfile $USER-key.pem
cat << _EOF_ >user.tmpl
cn = “$USER”
unit = “users”
serial = “$SERIAL”
expiration_days = 9999
signing_key
tls_www_client
_EOF_
certtool –generate-certificate –load-privkey $USER-key.pem –load-ca-certificate $CA_DIR/ca-cert.pem –load-ca-privkey $CA_DIR/ca-key.pem –template user.tmpl –outfile $USER-cert.pem
openssl pkcs12 -export -inkey $USER-key.pem -in $USER-cert.pem -name “$USER VPN Client Cert” -certfile $CA_DIR/ca-cert.pem -out $USER.p12

更改檔案權限
# chmod 700 gen-client-cert.sh

建立目錄來存放使用者證書
# mkdir home
# 切換目錄
# cd home
# home 是使用者的名稱,.. 是指 ca 證書所在的目錄
# ../gen-client-cert.sh home ..
可以直接按 Enter 鍵跳過,就不用設定密碼
Signing certificate…
Enter Export Password:
Verifying – Enter Export Password:

產生之後可以將 home.p12 複製給使用者用戶端導入即可

8. 修改 /etc/ocserv/ocserv.conf 設定檔
# cp /etc/ocserv/ocserv.conf /etc/ocserv/ocserv.conf.$(date +%F)
取消 pam 認證
# sed -i ‘s/auth = “pam”/#auth = “pam”/’ /etc/ocserv/ocserv.conf
採用 certificate 認證
# sed -i ‘s/#auth = “certificate”/auth = “certificate”/’ /etc/ocserv/ocserv.conf
設定同一個用戶最多的登入數
# sed -i ‘s/max-same-clients = 2/max-same-clients = 10/’ /etc/ocserv/ocserv.conf
設定憑證檔的位置
# sed -i ‘s|#server-cert = /etc/pki/ocserv/public/server.crt|server-cert = /etc/ocserv/server-cert.pem|’ /etc/ocserv/ocserv.conf
# sed -i ‘s|#server-key = /etc/pki/ocserv/private/server.key|server-key = /etc/ocserv/server-key.pem|’ /etc/ocserv/ocserv.conf
# sed -i ‘s|#ca-cert = /etc/pki/ocserv/cacerts/ca.crt|ca-cert = /etc/ocserv/ca-cert.pem|’ /etc/ocserv/ocserv.conf
從證書中提取用戶名的方式,這裡提取的是證書中的 CN 欄位作為用戶名
# sed -i ‘s/cert-user-oid = 0.9.2342.19200300.100.1.1/cert-user-oid = 2.5.4.3/’ /etc/ocserv/ocserv.conf
分配給 VPN 用戶端的 IP 網段
# sed -i ‘s/#ipv4-network = 192.168.1.0/ipv4-network = 10.12.0.0/’ /etc/ocserv/ocserv.conf
# sed -i ‘s/#ipv4-netmask = 255.255.255.0/ipv4-netmask = 255.255.255.0/’ /etc/ocserv/ocserv.conf
設定 DNS
# sed -i ‘s/#dns = 192.168.1.2/dns = 8.8.8.8/’ /etc/ocserv/ocserv.conf
# 解決 GnuTLS error (at worker-vpn.c 問題
# sed -i ‘s/isolate-workers = true/isolate-workers = false/’ /etc/ocserv/ocserv.conf

9. 設定網路 Forward
# echo “net.ipv4.ip_forward = 1” >> /etc/sysctl.conf
# sysctl -p /etc/sysctl.conf

10. 設定防火牆規則
# iptables -t nat -A POSTROUTING -s 10.12.0.0/24 -o eth0 -j MASQUERADE
# iptables -A FORWARD -i vpns+ -j ACCEPT
# iptables -A FORWARD -o vpns+ -j ACCEPT

11. 儲存防火牆規則
# iptables-save > /etc/sysconfig/iptables

12. 設定開機時啟動
# systemctl enable ocserv
Created symlink from /etc/systemd/system/multi-user.target.wants/ocserv.service to /usr/lib/systemd/system/ocserv.service.

12. 啟動 OpenConnect Server
# systemctl start ocserv
# systemctl status ocserv