在VPS上配置Cisco AnyConnect VPN服务

什么是Cisco Anyconnect?

  Cisco Anyconnect是思科公司提供的企业集SSL VPN服务解决方案,被思科公司的企业用户广泛使用。其背后的开源技术是OpenConnect,简单来说就是平时使用 UDP 的 DTLS 协议进行加密,掉线时自动使用 TCP 的 TLS 协议进行备份恢复,因此相对其它 VPN
(L2TP/PPTP等) 比较稳定;相比于思科早前推出(在iOS内置)的IPSec VPN, AnyConnect在用户认证管理和安全协议等方面更加强大,当然对于思科公司意味着更多revenue,貌似成为近年来思科强推产品;并且,AnyConnect对于长latency网络更加容忍度更高。综合以上几点,可以发现Anyconnect服务特别适合天朝的网络现状:不容易被误杀,对于大部分位于美国的廉价VPS比较友好。AnyConnect在各种平台都有客户端,MAC, Win, Android, iOS, Linux, 应有尽有。

什么是ocserv?

  早前只有思科设备支持AnyConnect,后来有人开发了CopenConnect VPN Server (ocserv),其基于OpenConnect SSL VPN协议,现行版本兼容思科AnyConnect。ocserv支持客户端下发路由表(好像是200条),用以实现国内国外按需分配路由,就是所谓的智能服务。ocserv支持各种通行的Linux/Unix版本。

在Ubuntu 14.04 LTS中部署ocserv

  本人在DO中使用的是Ubuntu 14.04 LTS,而在BW用的是Centos6.5,在2个系统中都顺利部署成功,这里用Ubuntu为例。

1. 安装依赖项目 (使用root用户)

1
apt-get install build-essential libgnutls28-dev libpam0g-dev libwrap0-dev libreadline-dev libnl-nf-3-dev libseccomp-dev pkg-config[/code]

2. 下载最新的ocserv程序源码
当前最新版本是0.9.1,后续或有不同

1
2
3
4
cd /usr/src
wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.9.1.tar.xz
tar xvf ocserv-0.9.1.tar.xz
cd ocserv-0.9.1[/code]

3. 编译和安装ocserv

1
2
./configure --enable-local-libopts --enable-libopts-install
make && make install[/code]

4. ocserv的配置
详细内容请参考官方文档。我们需要创建一些证书,先建立放置证书的directory

1
2
3
cd /usr/src/ocserv-0.9.2
mkdir certificates
cd certificates[/code]

4.1 建立CA模板和CA证书

建立CA模板并存储,我用的是nano,当然也可以使用vi

1
nano ca.tmpl[/code]

CA模板的格式是:

cn = “任意填写”
organization = “任意填写”
serial = 1
expiration_days = 365
ca
signing_key
cert_signing_key
crl_signing_key

生成CA密钥和CA证书

1
2
certtool --generate-privkey --outfile ca-key.pem
certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem

4.2 建立服务器模板和证书

建立服务器模板并存储

1
nano server.tmpl

服务器模板的格式是如下,这里的cn必须如实填写,而organization填写自己钟意的名称,

cn = “服务器hostname或者IP地址”
organization = “任意填写”
serial = 2
expiration_days = 3650
signing_key
encryption_key
tls_www_server

生成服务器密钥和证书

1
2
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

4.3 创建用户证书

先建立用户模板

1
nano user.tmpl[/code]

客户端模板的格式是

cn = “任意填写”
unit = “任意填写”
expiration_days = 365
signing_key
tls_www_client

生成用户密码和证书

1
2
certtool --generate-privkey --outfile user-key.pem
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

然后用openssl将生成的用户证书转成客户端能直接使用的p12格式

1
openssl pkcs12 -export -inkey user-key.pem -in user-cert.pem -certfile ca-cert.pem -out user.p12

转换时会要求设置密码,这样用户倒入证书时也需要输入对应的密码;也可以不设。

4.4 安装证书

吧证书导入正确的文件夹

1
2
3
sudo cp ca-cert.pem /etc/ssl/certs/my-ca-cert.pem
sudo cp server-cert.pem /etc/ssl/certs/my-server-cert.pem
sudo cp server-key.pem /etc/ssl/private/my-server-key.pem

将生成的user.p12证书通过ulr或者邮件形式分发给用户就可以了。

4.5 ocserv的配置文件

下载的ocserv程序源码里面有配置文件的密码,我们拷贝过来编辑。

1
2
3
4
cd /usr/src/ocserv-0.9.2
mkdir /etc/ocserv
cp doc/sample.config /etc/ocserv/ocserv.conf
nano /etc/ocserv/ocserv.conf

在网上各种搜索参考之后,链接是我的配置,供参考采用
比较重要的有

#ocserv支持各种登入方式,我使用的是证书,后续会提到如何使用用户/密码登入
auth = “certificate”
#auth = “plain[./sample.passwd]”
#auth = “plain[/etc/ocserv/ocpasswd]”
#auth = “pam”
#证书地址要填写正确
server-cert = /etc/ssl/certs/my-server-cert.pem
server-key = /etc/ssl/private/my-server-key.pem
ca-cert = /etc/ssl/certs/my-ca-cert.pem
#最大客户端数量和单个用户连接数量,按自己需求
max-clients = 36
max-same-clients = 6
# MTU discovery 这个要打开
try-mtu-discovery = true
deny-roaming = false
# 服务监听的TCP/UDP端口
tcp-port = 9000
udp-port = 9001
#VPN下发虚拟网卡地址,建议不要用本地无线路由器常用192.168地址
ipv4-network = 10.168.1.0
ipv4-netmask = 255.255.255.0
#使用google DNS
dns = 8.8.8.8
dns = 8.8.4.4
# 那一大段路由是 添加的自动翻墙路由表,也可以参考这个路由表
#route = 192.168.1.0/255.255.255.0
#route = 192.168.5.0/255.255.255.0
#route = fef4:db8:1000:1001::/64
#启用cisco客户端兼容性支持
cisco-client-compat = true

4.6 修改firewall的配置

之前我按照Linode的VPS安全设置做过通过iptables做过firewall的配置,现在需要针对ocserv做一些必要的修改。

1
nano /etc/iptables.firewall.rules

打开ocserv使用的端口和隔离客户端

1
2
3
4
5
6
7
8
9
10
11
\#Allow OCserv TCP/UDP
-A INPUT -p tcp -m state --state NEW --dport 9000 -j ACCEPT
-A INPUT -p udp -m state --state NEW --dport 9001 -j ACCEPT
\#allow traffic from vpn clients
-A FORWARD -s 10.168.1.0/24 -j ACCEPT
\#block communication between VPN clients
-A FORWARD -s 10.168.1.0/24 -d 10.168.1.0/24 -j DROP
\#start NAT
*nat
-A POSTROUTING -j MASQUERADE
COMMIT

完成编辑之后倒入配置并检查配置是否正确

1
2
iptables-restore < /etc/iptables.firewall.rules
iptables -L

我们还需要打开IPv4的流量转发。

1
nano /etc/sysctl.conf

启用这一项并刷新配置

net.ipv4.ip_forward=1

1
sysctl -p /etc/sysctl.conf

5. 测试ocserv
至此ocserv的安装配置已经完成,在服务器启动ocserv服务

1
ocserv -f -d 1

6. 自动化ocserv服务
为ocserv写一个简单的启动脚本

1
2
3
4
cd /etc/init.d
ln -s /lib/init/upstart-job ocserv
cd /etc/init
nano ocserv.conf

放入以下内容

#!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

这样就可以用以下方式启动/暂停服务

1
2
]sudo service ocserv start
sudo service ocserv stop

也可以在/var/log/syslog中查看VPN连接状态。

1
tail -f /var/log/syslog[/code]

*关于iOS和Android客户端使用Cisco AnyConnect, 请参考Cisco AnyConnect 让iOS设备(iPadiPhone)科学上网.

注:本文作为初学者的学习笔记参考了网上各位高人的文章123等,不一一列举,感谢!

Thank you.
@gangxiao

评论