CentOS 7 上搭建 Cisco AnyConnect VPN

http://blog.csdn.net/y87329396/article/details/48264731

CentOS 7 上搭建 Cisco AnyConnect VPN

4257人阅读 评论(1) 收藏 举报
分类:

因为最近的干扰力度变大,考虑到 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 = 的字段即可