1. 程式人生 > >在 CentOS 7 上搭建 Cisco AnyConnect VPN

在 CentOS 7 上搭建 Cisco AnyConnect VPN

因為最近的干擾力度變大,考慮到 AnyConnect 是思科的安全遠端接入解決方案,隱蔽性要好一些,所以決定在伺服器上搭建 AnyConnect 以提供給 iOS 裝置使用,原來的 Cisco IPSec VPN 廢棄,Shadowsocks 保留用於安卓和PC的連線。

AnyConnect 有以下優勢:

  1. 待機不會斷開
  2. 能夠下發路由表給客戶端(未測試)
  3. 穩定
  4. 耗電量較低

1. 安裝 ocserv (OpenConnect server)

ocserv 是一個 OpenConnect SSL VPN 協議服務端,0.3.0 版後相容使用 AnyConnect SSL VPN 協議的終端。
官方主頁:

http://www.infradead.org/ocserv/

ocserv 已經在 epel 倉庫中提供了,所以可以直接通過 yum 安裝

1
2
$ yum install epel-release
$ yum install ocserv

2. 生成證書

這裡你需要先仔細閱讀官方文件,簡單的來說,如下幾步

  1. 建立工作資料夾
1
2
$ mkdir CA
$ cd CA
  1. 生成 CA 證書
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ certtool --generate-privkey --outfile ca-key.pem
$ cat >ca.tmpl <<EOF
cn = "VPN CA" organization = "Big Corp" serial = 1 expiration_days = 3650 ca signing_key cert_signing_key crl_signing_key EOF $ certtool --generate-self-signed --load-privkey ca-key.pem \ --template ca.tmpl --outfile ca-cert.pem
  1. 生成本地伺服器證書
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ certtool --generate-privkey --outfile server-key.pem
$ cat >server.tmpl <<EOF cn = "www.example.com" organization = "MyCompany" serial = 2 expiration_days = 3650 encryption_key signing_key tls_www_server EOF $ 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 放到 /etc/ssl/certs,server-key.pem 放到 /etc/ssl/private

3. 配置 ocserv

1
$ sudo vim /etc/ocserv/ocserv.conf

主要修改以下部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#ocserv支援多種認證方式,這是自帶的密碼認證,使用ocpasswd建立密碼檔案
#ocserv還支援證書認證,可以通過Pluggable Authentication Modules (PAM)使用radius等認證方式
auth = "plain[/etc/ocserv/ocpasswd]"

#證書路徑
server-cert = /etc/ssl/certs/server-cert.pem
server-key = /etc/ssl/private/server-key.pem

#最大使用者數量
max-clients = 16

#同一個使用者最多同時登陸數
max-same-clients = 10

#tcp和udp埠
tcp-port = 4433
udp-port = 4433

#執行使用者和組
run-as-user = ocserv
run-as-group = ocserv

#分配給VPN客戶端的IP段
ipv4-network = 10.12.0.0
ipv4-netmask = 255.255.255.0

#DNS
dns = 8.8.8.8
dns = 8.8.4.4

#註釋掉route的欄位,這樣表示所有流量都通過 VPN 傳送
#route = 192.168.1.0/255.255.255.0
#route = 192.168.5.0/255.255.255.0

4. 建立使用者

1
2
#username為你要新增的使用者名稱
$ sudo ocpasswd -c /etc/ocserv/ocpasswd username

5. 配置系統設定

  1. 開啟核心轉發
1
2
$ sudo sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
$ sudo sysctl -p
  1. 配置 iptables 規則

你可以參考Linode 的文章來配置 iptables

1
2
3
4
#IP段和venet0介面要根據自己的情況修改
$ sudo iptables -t nat -A POSTROUTING -s 10.12.0.0/24 -o venet0 -j MASQUERADE
$ sudo iptables -A FORWARD -s 10.12.0.0/24 -j ACCEPT
$ sudo iptables-save > /etc/sysconfig/iptables

6. 測試

現在我們可以開啟伺服器試試了

1
$ sudo ocserv -c /etc/ocserv/ocserv.conf -f -d 1

拿起你的 iOS 裝置,下載思科的 AnyConnect 客戶端,連線你的伺服器。

出現問題可以看debug的返回資訊,如果資訊不詳細,可以把 1 改成 10。

如果沒有問題,那麼就可以配置成開機運行了。

1
2
$ sudo systemctl enable ocserv
$ sudo systemctl start ocserv

a. 下發路由

我想這個功能是最激動人心的,因為我們手機如果長期連線,那麼肯定是某些服務走 VPN,而國內的網站可以走手機自己的網路體驗最好。

但是這裡的一個問題是,AnyConnect 有下發路由表的 64 條數限制。

所以我們只能保證下某幾個常用的服務是可用的,比如 Google Facebook 以及 Twitter

編輯配置檔案

1
$ sudo vim /etc/ocserv/ocserv.conf

新增 route = 的欄位即可