2016年5月10日 星期二

Linode CentOS 7主機搭建Cisco AnyConnect VPN

iPhone的shadowsocks在牆外似乎不作用,所以找了一個除了PPTP以外的代理方式

1. 安裝ocserv ( OpenConnect server )

因為ocserv已經在epel 的庫中提供了,可以直接用yum安裝
ocserv.x86_64 : OpenConnect SSL VPN server
直接用yum裝即可
# yum install epel-release (如果你還沒裝epel的話)
# yum install ocserv

2. 準備證書

# cd ~
# mkdir certificates
# cd certificates
在此目錄下新建一個 ca.tmpl的CA證書模版,內容為:
cn = "xx.xx.xx.xx"
organization = "xx.xx.xx.xx"
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key

生成CA密鑰
$ certtool --generate-privkey --outfile ca-key.pem
生成CA證書
$ certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem
生成伺服器憑證,這裡注意cn項必須對應你伺服器的功能變數名稱或IP,server.tmpl
cn = "Your hostname or IP"
organization = "xx.xx.xx.xx"
expiration_days = 3650
signing_key
encryption_key
tls_www_server

生成密鑰
$ certtool --generate-privkey --outfile server-key.pem
生成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
把證書移動到合適的地方
$ cp ca-cert.pem /etc/ocserv
$ cp server-cert.pem /etc/ocserv
$ cp server-key.pem /etc/ocserv

3. 準備配置文件

修改 /etc/ocserv/ocserv.conf
# 登陸方式,目前先用密碼登錄
auth = "plain[/etc/ocserv/ocpasswd]"
 
# 允許同時連接的用戶端數量
max-clients = 4
 
# 限制同一用戶端的並行登陸數量
max-same-clients = 2
 
# 服務監聽的IP(伺服器IP,可不設置)
listen-host = 1.2.3.4
 
# 服務監聽的TCP/UDP埠(選擇你喜歡的數位)
tcp-port = 4433
udp-port = 4434
 
# 自動優化VPN的網路性能
try-mtu-discovery = true
 
# 確保伺服器正確讀取用戶證書(後面會用到用戶證書)
cert-user-oid = 2.5.4.3
 
# 伺服器憑證與金鑰
server-cert = /etc/ssl/private/my-server-cert.pem
server-key = /etc/ssl/private/my-server-key.pem
 
# 用戶端連上vpn後使用的dns
dns = 8.8.8.8
dns = 8.8.4.4
 
# 注釋掉所有的route,讓伺服器成為gateway
#route = 192.168.1.0/255.255.255.0
 
# 啟用cisco用戶端相容性支援
cisco-client-compat = true

這邊要注意tcp-portudp-port不要設9000,以免跟php-fpm的port衝突

4. 測試server

創建測試帳號(test)
$ ocpasswd -c /etc/ocserv/ocpasswd test
Enter password:
Re-enter password:

開啟NAT轉發:(這步我略過,查機器上的設定檔,net.ipv4.ip_forward已開啟)
$ sudo sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
$ sudo sysctl -p

啟動ocserv服務
# ocserv -f -d 1
然後打開手機上的Cisco Anyconnect新建一個VPN,添加服務器:
IP:端口
ex.
xx.xx.xx.xx:4433
連線就能輸入密碼運行

4. 創建客戶端證書,省得老輸入密碼

$ cd ~/certificates/
$ vim user.tmpl
cn = "some random name"
unit = "some random unit"
expiration_days = 365
signing_key
tls_www_client

創建user密鑰
$ certtool --generate-privkey --outfile user-key.pem
創建user證書
$ certtool --generate-certificate --load-privkey user-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template user.tmpl --outfile user-cert.pem
將證書和金鑰轉為PKCS12的格式,好導入Anyconnect,期間會要求你輸入帳號密碼,就輸入用ocpasswd產生的帳號密碼
$ certtool --to-p12 --load-privkey user-key.pem --pkcs-cipher 3des-pkcs12 --load-certificate user-cert.pem --outfile user.p12 --outder
Generating a PKCS #12 structure...
Loading private key list...
Loaded 1 private keys.
Enter a name for the key: test
Enter password:
Confirm password:

然後把user.p12這個證書放到一個可以直接被訪問的地方,用safari打開安裝,導入成功後將對應的VPN => 進階 => 憑證 => 選擇你導入的憑證

為了讓伺服器能夠認得這張證書,我們再來修改一下/etc/ocserv/ocserv.conf配置
$ vim /etc/ocserv/ocserv.conf
# 改為證書登陸,注釋掉原來的登陸模式
auth = "certificate"
 
# 證書認證不支援這個選項,注釋掉這行
#listen-clear-file = /var/run/ocserv-conn.socket
 
# 啟用證書驗證
ca-cert = /etc/ocserv/ca-cert.pem

重啟ocserv
# kill -9 ocserv_pid
# ocserv -f -d 1

使用客戶端證書這方式我只有在公司網路環境才成功走代理,在家裡和3G網路VPN Log只顯示連線成功,但是瀏覽器打開iplocationfinder.com 檢查結果是失敗的 => 查不到原因,所以可能還是改為輸入帳號密碼登入為主  => 20160920已解決

5. 智能分流

因為人在大陸直接全局翻牆會造成大陸國內網站訪問巨慢的問題,所以必須在服務器端設route table推送到客戶端
https://github.com/CNMan/ocserv-cn-no-route
直接將 cn-no-route.txt 之中的 no-route 寫進 /etc/ocserv/ocserv.conf

最後一樣重啟ocserv服務

Windows客戶端下載
https://openconnect.github.io/openconnect-gui/

參考資料:
http://ifreedomlife.com/2015/04/20/Setup-Cisco-AnyConnect-VPN-on-CentOS7/ 在 CentOS 7 上搭建 Cisco AnyConnect VPN
https://www.logcg.com/archives/1343.html  使用ocserv搭建 Cisco Anyconnect 服务器 (主要)


沒有留言:

張貼留言