背景
OpenConnect VPN Server(ocserv) 是一个 SSL VPN 服务器,使用 Cisco AnyConnect 的协议。
协议简述
Cisco AnyConnect 的协议是基于 HTTPS 和 DTLS 的,服务器需要监听一个 TCP 端口和一个 UDP 端口。TCP 端口用于传输握手、控制信息,并作为备用数据通道,由 TLS 保护;UDP 端口是数据通道,由 DTLS 保护。客户端的身份认证可以使用用户名/口令或者数字证书。下面简要描述使用用户名/口令认证时的握手过程。
在客户端,用户需要指定 VPN 服务的 URL. 客户端会与 URL 指定的主机/端口建立 TLS 连接,然后 HTTP GET 指定的 URL. 服务器会返回一个 XML, 要求认证。我们可以通过浏览器直接打开这个 URL 来查看这个 XML. 下面是 ocserv 返回的 XML.
这时客户端会提示输入用户名,然后这个用户名会按照 form 元素中的描述,被 POST 到 /auth. 接下来服务器会用类似的方式要求口令。在验证通过后,客户端会发出 HTTP CONNECT 请求,服务器回应 200 CONNECTED, 并在 header 中给出分配的 IP, DNS, route, MTU 等参数和数据通道的 UDP 端口号,以及用于保护数据通道的 DTLS session ID, cipher suite.
接下来再通过 session resumption 建立起受保护的 DTLS 通道,用于传输 VPN 数据。
安装
下载源代码
安装编译依赖
编译安装
配置
在源码包中有例子 doc/sample.config, 可以在这个文件的基础上修改。
在这个文件中,关键的参数有:
-
auth
认证方法,可取值 “certificate”, “pam” 或者 “plain[ocpasswd文件路径]”. 在这里我们使用 “plain[/etc/ocserv/ocpasswd]”.
-
use-seccomp
布尔值 (true or false), 是否使用 seccomp 隔离 worker 进程。
-
max-clients 和 max-same-clients
限制连接数
-
dpd
心跳包间隔
-
server-cert 和 server-key
服务器证书和证书私钥的路径。
生成私钥和自签名证书:
-
ipv4-network 和 ipv4-netmask
指定分配给客户端的地址池范围。
-
dns
推送给客户端的 DNS 服务器,可以选择 Google Public DNS 或者 OpenDNS.
-
route
推送给客户端的路由信息。如果要作为默认路由,不指定即可。
接下来就要建立 ocpasswd 文件了。
输入口令,建立用户。然后就可以用 ocserv -f -c /etc/ocserv/config 来运行了。不过,就算用 -f 指定了前台运行,好像错误信息也只会发送到 syslog.
如果一切正常,就可以把 ocserv 指定成自动启动了。不过 ocserv 没有提供 initscript, 我就自己用 sketelon 改了一个,放在了 Gist.
把这个文件放置到 /etc/init.d/, 然后使用 update-rc.d 创建符号链接。
防火墙设置
我使用防火墙规则如下,就不具体说了,细说就够另写一篇了。
Posted Tuesday 12 August 2014 Share
- You might also like: