部署ocserv VPN服务器
Cisco AnyConnect是非常流行的SSL VPN客户端,并且跨平台,常见于iOS,Android,BlackBerry平台。由于我同时使用Linux,Mac,iPhone,黑莓,所以为了方便使用,采用通用的OpenConnect VPN Server - ocserv(兼容Cisco AnyConnect的开源解决方案)来部署VPN Server。
源代码下载
从 ocserv gitlab软件库 下载最新源代码
git clone https://gitlab.com/ocserv/ocserv.git编译依赖
Debian和Fedora编译依赖软件库分别是 libgnutls28-dev 和 gnutls-devel ,此外,对应的一些可选功能依赖库如下
TCP wrappers: libwrap0-dev / tcp_wrappers-devel
PAM: libpam0g-dev / pam-devel
LZ4: liblz4-dev / lz4-devel
seccomp: libseccomp-dev / libseccomp-devel
occtl: libreadline-dev / readline-devel
libnl-route-3-dev / libnl3-devel
GSSAPI: libkrb5-dev / krb5-devel开发依赖库如下
libprotobuf-c0-dev / protobuf-c-devel
libtalloc-dev / libtalloc-devel
libhttp-parser-dev / http-parser-devel
libpcl1-dev / pcllib-devel
libopts25-dev / autogen-libopts-devel
autogen / autogen
protobuf-c-compiler/ protobuf-c
gperf / gperfDebian/Ubuntu按照以下命令准备依赖库安装 (参考 Setup OpenConnect VPN Server for Cisco AnyConnect on Ubuntu 14.04 x64)
上述依赖包安装缺少
lbopts25-dev,编译时候发现报错,所以补充安装了官方文档中说明的所有可选依赖开发库
编译 ocserv
如果是发行版本
如果是git版本
报错
尝试改成
报错改成
解决方法参考 OpenConnect on Ubuntu 并按照官方文档安装所有可选依赖开发库DTLS Dead Peer Detection detected dead peer!
然后重新编译就可以通过
安装
配置ocserv
首先需要创建自己的CA证书和服务器证书
创建CA模版文件 ca.tmpl ,这里cn请设置成自己组织的cn
生成CA密钥和CA证书
然后使用以下内容创建本地服务器证书模版文件(server.tmpl),注意cn字段,必须符合你服务器的DNS名字或者IP地址
然后创建服务器密钥和证书
复制密钥、证书和配置文件到ocserv配置目录
编辑 /etc/ocserv/config 配置文件,类似如下
no-route配置可能需要根据自己的局域网配置调整。此外,对于国内网段,设置no-route可以避免国内流量通过vpn降低访问效率。默认端口是
443,这里改成9000
另外,参考 安装配置AnyConnect服务端软件-ocserv做一些配置优化调整
创建用户登录帐号
激活NAT
激活IPv4 forwarding,编辑/etc/sysctl.conf
并使之生效
启动ocserv
注意:Cisco AnyConnect客户端配置要同时写上服务器IP地址和端口,类似
IP:PORT
Debug方法
-d参数设置debug级别,从0-999
路由设置
参考 Ocserv 在 Debian 下的安装与配置指南,在 /etc/ocserv/config 中添加配置
不过,参考 OpenConnect server(ocserv) 一键脚本 for deibian 7 ,如果使用 openconnect 客户端,则所有版本都不支持 no-route ,可能需要使用cisco anyconnect客户端支持。所有如果使用 openconnect ,还是在客户端自己用脚本添加路由。
上述配置中,我更改了 192.168.0.0 ,因为我配置的ocserv使用了 192.168.101.0/255.255.255.0 作为 tun 网段,而我的局域网使用的是 192.168.1.0/24
此外,添加了一个VPN服务器的IP地址
Cisco AnyConnect for BlackBerry 不支持 no-route 指令,如果服务器端配置了no-route,会导致无法通讯(显示主机无法解析或者网络未连接),所以最后还是全部删除了no-route配置。不过Cisco AnyConnect for iOS没有问题,但不确定no-route是否真正生效。 反正手机主要是用于访问twiter,较少内网访问,所以暂时没有问题。Linux客户端采用罗有添加脚本。
有些IP段可能不是中国的,例如发现 m.voachinese.com 使用的akamai的CDN地址是日本的
客户端添加路由脚本
默认的尚未连接VPN时候的路由表
连接VPN以后的路由表
参考上述ocserv服务器端设置 no-route ,在Linux主机上,采用脚本方式设置路由。思路是使用openconnect连接了VPN服务器之后,在本地终端执行脚本 vpn_route.sh start 设置路由(vpn_route.sh stop则去除路由)。注意,在 cn_route.cfg 中是需要路由的网段,类似格式如下
路由网段中去掉了
脚本 vpn_route.sh
DNSMASQ
我设置了VPN服务器上的dnsmasq,想vpn连接以后,通过查询dns来解决内网和外网的dns解析(一些内网ip解析通过dnsmasq添加),但是发现,始终不能正常访问dns。在vpn服务器上是可以解析的,但是远程不行。我使用nc检查,端口是打开的
但是查询超时
但是在服务器上直接查询却完全正常
开始我以为是vpn服务影响,所以特意关闭了VPN连接,并且从其他服务器上多次测试都没有成功。也验证了没有防火墙干扰。最后,偶然搜索到 dnsmasq: DNS request timed out for machines in local network ,原来必须显式地设置 listen-address 监听接口,DNSmasq才会对外部客户端请求响应,否则只有本机(估计DNSmasq代码中检查客户端IP来判断是否是本机IP进行过滤)才提供服务,虽然端口已经监听。
修改VPN服务器上 /etc/dnsmasq.conf 配置,添加
然后重启dnsmasq就可以正常解析。
为了安全起见,实际我是只监听tun接口提供服务,这样只有VPN客户端可以访问DNS。
参考
OpenConnect SERVER Setup Guide for Beginners - 在OpenWrt上部署OpenConnect服务
Last updated
Was this helpful?