部署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-devgnutls-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              / gperf

Debian/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

路由设置

参考 Oc­serv 在 De­bian 下的安装与配置指南,在 /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。

参考

Last updated

Was this helpful?