使用ocserv搭建 Cisco Anyconnect 服务器
前段时间的appleID被盗事件闹的沸沸扬扬,我果断回到狱中升级了9.0.这下好了,Shadowsocks不能用了。这一点来讲我还是挺羡慕Android手机的……使用 Surge 让 iOS 走 Shadowsocks实现科学上网。
总之,我们还是来在iOS的VPN上下下功夫吧。如今的VPN已经被认证的差不多了,因为它们虽然加密安全,但禁不住特征检测——好吧,毕竟说这东西就不是为了隐匿而生的。目前倒是我思科大爹还有个anyconnect在活着,不是它多么坚挺,而是用的企业太多,没法禁,而且,它还有断线自动连接,自动国内外按需分流等诸多的好处——最大一点:不需要越狱。
注意:
我使用的是Digital Ocean的VPS,Ubuntu 15.04 ,整个的配置步骤是我一边配一边记录的,是完全可行的,但由于系统环境复杂,每个人都不尽相同,所以你具体操作的时候可能仍旧需要灵活运用!
0、关于PAC的问题
我们经常说,Cisco 的 AnyConnect 是无法使用PAC的,因为它的机制不同,不是代理而是 VPN,所以本文使用的方法是从服务器直接下发一些路由条目——由于客户端限制,我们总是不能下发完整的路由表(只有200来条),这一点始终是广大 AnyConnect 的一块心病。总之,其实还有另外的一个办法,对于那些需要全局vpn但又想区分网络的企业,Cisco 还是有对应办法的。
那就是让服务器走代理。?
这就需求你有一台中国的vps来作为前置,并且这台vps使用比如 Shadowsocks 等工具连到你的国外 vps 上,然后再在中国 vps 上搭建ocserv,然后给它配置pac文件,这样ocserv就会根据你的代理策略来实现路由。总之,如果你想尝试这个方法,请直接跳转页面底部的 [参考文章] 小节,“移步 Anyconnect VPN使用PAC来智能分流” 这篇文章进行参考。
1、配置环境
这一步参考我之前写的一篇文章——如果你的vps是全新的,否则跳过吧~
2、架设OpenConnectServer
2.1下载源码
从这里查看ocserv的最新版本号,你不需要点到FTP里看,只要安装格式替换链接路径就行了。比如现在最新的版本是0.10.8,那么你就把地址写成这样:ftp://ftp.infradead.org/pub/ocserv/ocserv-0.10.8.tar.xz ,好,我们现在来下载源码:
1
2
|
wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.10.8.tar.xz
tar xvf ocserv–0.10.8.tar.xz
|
2.2 安装依赖
下载解压好了代码,就需要安装一些依赖了,些是需要的,有些则是可选的,这里我们尽可能的安装所有依赖,万一将来用得着呢!毕竟也就十来兆的大小。
1
2
3
4
|
sudo apt–get install build–essential pkg–config libgnutls28–dev libreadline–dev libseccomp–dev libwrap0–dev libnl–nf–3–dev liblz4–dev
cd ocserv–0.10.8
./configure
|
如果没有什么问题,那就可以安装了,比如我这里的结果是这样的:
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
|
ummary of build options:
version: 0.10.8
Host type: x86_64–unknown–linux–gnu
Install prefix: /usr/local
Compiler: gcc
CFlags: –g –O2 –Wall
PAM auth backend: no
Radius auth backend: no
GSSAPI auth backend: no
Anyconnect compat: yes
TCP wrappers: yes
systemd: no
(socket activation)
seccomp: yes
Compression: yes
LZ4 compression: no
readline: yes
libnl3: yes
glibc (sha2crypt): yes
local talloc: yes
local protobuf–c: yes
local PCL library: yes
local libopts: yes
local http–parser: yes
|
2.3 编译安装
使用make命令来编译和安装:
1
2
3
|
make
sudo make install
|
3、配置OpenConnectServer
3.1准备证书
安装证书工具 apt–get install gnutls–bin
1
2
3
4
5
|
cd ~
mkdir certificates
cd certificates
|
在此目录下创建一个名为 ca.tmpl 的CA证书模板,写入如下语句:
1
2
3
4
5
6
7
8
|
cn = “Logcg.com”
organization = “logcg.com”
serial = 1
expiration_days = 3650
ca
signing_key
cert_signing_key
crl_signing_key
|
使用 certtool —generate–privkey —outfile ca–key.pem 生成CA密钥;
使用certtool —generate–self–signed —load–privkey ca–key.pem —template ca.tmpl —outfile ca–cert.pem 生成CA证书;
然后我们生成服务器证书,这里注意cn项必须对应你服务器的域名或IP,模板名称是server.tmpl ,内容如下:
1
2
3
4
5
6
|
cn = “Your hostname or IP”
organization = “logcg.com”
expiration_days = 3650
signing_key
encryption_key
tls_www_server
|
使用 certtool —generate–privkey —outfile server–key.pem 生成密钥;
使用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证书;
把证书移动到合适的地方:
1
2
3
|
cp ca–cert.pem /etc/ssl/private/my–ca–cert.pem
cp server–cert.pem /etc/ssl/private/my–server–cert.pem
cp server–key.pem /etc/ssl/private/my–server–key.pem
|
3.2 准备配置文件
我们把配置文件放到ocserv默认读取的位置:
1
2
3
|
mkdir /etc/ocserv
cd ~/ocserv–0.10.8
cp doc/sample.config /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
34
35
|
# 登陆方式,目前先用密码登录
auth = “plain[/etc/ocserv/ocpasswd]”
# 允许同时连接的客户端数量
max–clients = 4
# 限制同一客户端的并行登陆数量
max–same–clients = 2
# 服务监听的IP(服务器IP,可不设置)
listen–host = 1.2.3.4
# 服务监听的TCP/UDP端口(选择你喜欢的数字)
tcp–port = 9000
udp–port = 9001
# 自动优化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
|
3.3 测试服务器
现在,我们就可以来测试一下服务器了,使用命令来创建一个测试账号:
1
2
3
|
root@iZ289z55gmrZ:~/ocserv–0.10.8# ocpasswd -c /etc/ocserv/ocpasswd test
Enter password:
Re–enter password:
|
如果你使用的也是Ubuntu系统,那你可以按照我写的这篇文章来开启NAT转发;
使用 iptables –t nat –L 来验证转发是否开启成功:
1
2
3
4
5
6
7
8
9
10
11
12
13
|
root@iZ289z55gmrZ:~# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all — 192.168.1.0/24 anywhere
|
这时,我们就可以使用 ocserv –f –d 1 命令来启动下服务啦!
打开你手机上的Cisco Anyconnect新建一个VPN,添加服务器IP就是你的vps的 IP:端口
好了,如果你看到如下信息,那服务器应该已经能够正常运行了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
root@iZ289z55gmrZ:~# ocserv -f -d 1
Parsing plain auth method subconfig using legacy format
Setting ‘plain’ as primary authentication method
listening (TCP) on 0.0.0.0:110…
listening (UDP) on 0.0.0.0:9000…
ocserv[16104]: main: initialized ocserv 0.10.8
ocserv[16105]: sec–mod: reading supplemental config from files
ocserv[16105]: sec–mod: sec–mod initialized (socket: /var/run/ocserv–socket.16104)
ocserv[16109]: GnuTLS error (at worker–vpn.c:468): A TLS fatal alert has been received.: Unknown certificate
ocserv[16104]: main: 60.0.14.48:9890 user disconnected
ocserv[16105]: sec–mod: using ‘plain’ authentication to authenticate user (session: FXS0l)
ocserv[16104]: main: 60.0.14.48:36627 user disconnected
ocserv[16105]: sec–mod: initiating session for user ‘test’ (session: FXS0l)
ocserv[16104]: main[test]: 60.0.14.48:9663 new user session
ocserv[16104]: main[test]: 60.0.14.48:9663 user logged in
ocserv[16104]: main: 60.0.14.48:46429 user disconnected
ocserv[16104]: main[test]: 60.0.14.48:9663 user disconnected
ocserv[16105]: sec–mod: temporarily closing session for test (session: FXS0l)
ocserv[16105]: sec–mod: initiating session for user ‘test’ (session: FXS0l)ocserv[16104]: main[test]: 60.0.14.48:38135 new user session
ocserv[16104]: main[test]: 60.0.14.48:38135 user logged in
|
3.4 优化OpenConnectServer
好了,既然服务器已经可以跑起来,那么我们就可以优化它了,首先,来写个启动脚本——毕竟,不能每次都用调试模式启动不是吗?
如果你和我一样使用的是 Ubuntu 15.04 而不是旧版,那么你需要参考这篇文章来找回一下upstart才能使用下边的脚本。
1
2
3
4
5
|
cd /etc/init.d
ln –s /lib/init/upstart–job ocserv
cd /etc/init
vi ocserv.conf
|
在配置文件中写入如下脚本:
1
2
3
4
5
6
7
8
9
10
11
12
|
#!upstart
description “OpenConnect Server”
start on runlevel [2345]
stop on runlevel [06]
respawn
respawn limit 20 5
script
exec start–stop–daemon —start —pidfile /var/run/ocserv.pid —exec /usr/local/sbin/ocserv — –f >> /dev/null 2>&1
end script
|
这样,我们就可以使用 service ocserv start 和 service ocserv stop来控制服务了。
3.5 创建客户端证书,省的老输入密码
1
2
|
cd ~/certificates/
vi user.tmpl
|
写入如下内容:
1
2
3
4
5
|
cn = “some random name”
unit = “some random unit”
expiration_days = 365
signing_key
tls_www_client
|
1
2
3
4
5
6
7
|
//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:
1
|
certtool —to–p12 —load–privkey user–key.pem —pkcs–cipher 3des–pkcs12 —load–certificate user–cert.pem —outfile user.p12 —outder
|
期间会要求你输入证书名字和密码。
然后你需要把这个证书放到一个可以被直接访问的地方,然后通过URL将user.p12文件导入AnyConnect,具体位置在诊断标签页的证书栏目下,导入成功之后,将对应的VPN设置的高级设置部分的证书栏目,改为导入的这张证书。
现在,为了让服务器能够认得这张证书,我们再来修改一下配置:
1
2
3
4
5
6
7
8
9
10
|
vi /etc/ocserv/ocserv.conf
# 改为证书登陆,注释掉原来的登陆模式
auth = “certificate”
# 证书认证不支持这个选项,注释掉这行
#listen-clear-file = /var/run/ocserv-conn.socket
# 启用证书验证
ca–cert = /etc/ssl/private/my–ca–cert.pem
|
这样,我们使用 service ocserv start 来启动它即可!
4、智能分流
好了,一般来讲,如果你的是一个稳定且速度不慢的国外vps,那你现在就可以开始享受生活了!不过,我们的任务还没用结束,手动切换总不能说的上是智能,我们使用现成的。
https://github.com/don-johnny/anyconnect-routes/blob/master/routes
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
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
|
# Dropbox
route = 108.160.0.0/255.255.0.0
route = 199.47.0.0/255.255.0.0
route = 205.189.0.0/255.255.0.0
# Facebook
route = 58.26.0.0/255.255.0.0
route = 210.149.0.0/255.255.0.0
route = 31.13.0.0/255.255.0.0
route = 66.220.0.0/255.255.0.0
route = 69.63.0.0/255.255.0.0
route = 69.171.0.0/255.255.0.0
route = 74.119.0.0/255.255.0.0
route = 173.252.0.0/255.255.0.0
route = 199.201.0.0/255.255.0.0
route = 204.15.0.0/255.255.0.0
route = 1.9.0.0/255.255.0.0
# Github
route = 192.30.0.0/255.255.0.0
route = 23.235.0.0/255.255.0.0
route = 199.27.0.0/255.255.0.0
route = 104.156.0.0/255.255.0.0
# Google
route = 8.6.0.0/255.255.0.0
route = 8.8.0.0/255.255.0.0
route = 8.15.0.0/255.255.0.0
route = 8.34.0.0/255.255.0.0
route = 8.35.0.0/255.255.0.0
route = 23.236.0.0/255.255.0.0
route = 23.251.0.0/255.255.0.0
route = 64.9.0.0/255.255.0.0
route = 64.233.0.0/255.255.0.0
route = 66.102.0.0/255.255.0.0
route = 66.249.0.0/255.255.0.0
route = 70.32.0.0/255.255.0.0
route = 72.14.0.0/255.255.0.0
route = 74.125.0.0/255.255.0.0
route = 104.132.0.0/255.252.0.0
route = 104.154.0.0/255.254.0.0
route = 104.196.0.0/255.252.0.0
route = 107.167.0.0/255.255.0.0
route = 107.178.0.0/255.255.0.0
route = 108.59.0.0/255.255.0.0
route = 108.170.0.0/255.255.0.0
route = 108.177.0.0/255.255.0.0
route = 130.211.0.0/255.255.0.0
route = 142.250.0.0/255.254.0.0
route = 146.148.0.0/255.255.0.0
route = 162.216.0.0/255.255.0.0
route = 162.222.0.0/255.255.0.0
route = 172.217.0.0/255.255.0.0
route = 172.253.0.0/255.255.0.0
route = 173.194.0.0/255.255.0.0
route = 173.255.0.0/255.255.0.0
route = 192.158.0.0/255.255.0.0
route = 192.178.0.0/255.254.0.0
route = 199.192.0.0/255.255.0.0
route = 199.223.0.0/255.255.0.0
route = 207.223.0.0/255.255.0.0
route = 209.85.0.0/255.255.0.0
route = 216.58.0.0/255.255.0.0
route = 216.239.0.0/255.255.0.0
#google ext 2015-08-27
route = 111.168.0.0/255.255.0.0
# Twitter
route = 8.25.0.0/255.255.0.0
route = 192.133.0.0/255.255.0.0
route = 199.16.0.0/255.255.0.0
route = 192.229.0.0/255.255.0.0
route = 104.244.0.0/255.255.0.0
route = 199.59.0.0/255.255.0.0
route = 199.96.0.0/255.255.0.0
# Wikimedia
route = 91.198.0.0/255.255.0.0
route = 185.15.0.0/255.255.0.0
route = 198.35.0.0/255.255.0.0
route = 198.73.0.0/255.255.0.0
route = 208.80.0.0/255.255.0.0
# instagram
route = 54.0.0.0/255.0.0.0
route = 52.0.0.0/255.0.0.0
route = 72.246.0.0/255.255.0.0
route = 23.32.0.0/255.255.0.0
route = 125.56.0.0/255.255.0.0
#1024
route = 162.159.246.97/255.255.255.255
#Linn Radio
route = 89.16.0.0/255.255.0.0
#Quaro
route = 192.33.31.60/255.255.255.255
route = 103.243.12.60/255.255.255.255
#www.flinto.com
route = 103.245.0.0/255.255.0.0
#TELEGRAM
route = 91.108.0.0/255.255.0.0
route = 149.154.0.0/255.255.0.0
#vfsglobal.com
route = 210.210.0.0/255.255.0.0
|
不过我没有全写,只写了部分进去——我主要是刷推~
好了,就到这里吧!
参考文章: