跳至主要内容

OCSERV 0.8.5 使用

*注1:本文不包含ocserv的编译、安装,请自行研习
*注2:本文将包含ocserv的证书认证配置,不包含pam (radius)认证
*注3:本文将包含win,mac 端的使用,移动端相对简单,不做介绍

ocserv是OpenConnect SERVer的缩写,基本上就是cisco anyyconnect的开源兼容服务器软件,好处就是这个软件使用的是SSL VPN方式,通常会用DTLS这一层,支持服务器端推送32条路由,实现国内国外按需区分路由;同时各种客户端会长连接方式,一直后台待命,省时省电。我就不废话了。

我的配置是采用了全证书的方式进行,因此不需要用户名密码,如果您要对客户端进行限制,计时方面可以采用证书有效时间;流量限制方面可以使用iptables针对IP进行限制;同时在线人数上如果是多台服务器的话,相互间无法限制(cookie/session分布于不同服务器),如果仅一台服务器话就可以在配置文件搞定。我的完全配置如下,如果你要复制配置文件可以到这里

#第一行用以指定认证方式,我是证书
auth = "certificate"

#Added @05-10-2014
#加入这个后就可以使用occtl了
#occtl reload && occtl stop now
use-occtl = true
occtl-socket-file = /var/run/occtl.socket


# seccomp default : true
#关闭这个可以提高性能,牺牲一丁点安全,更可以避免无法启动的情况(遇到过的都知道那痛苦)
use-seccomp = false

#
listen-host = 0.0.0.0


#最大客户端数量,根据你的服务器IP地址分配多少以及性能设置,自用的话不必很大
max-clients = 36


#这个看英文就知道意思了,你可以加以限制
max-same-clients = 4
tcp-port = 443
udp-port = 443
keepalive = 32400
dpd = 60
mobile-dpd = 1800
#故意为空
mobile-idle-timeout =
deny-roaming = false

#这个MTU选项一定要打开
try-mtu-discovery = true
server-cert = server-cert.pem
server-key = server-key.pem
ca-cert = ca-cert.pem
tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT"
auth-timeout = 40
rekey-time = 172800
rekey-method = ssl
use-utmp = true
pid-file = /var/run/ocserv.pid
socket-file = /var/run/ocserv-socket


#下面这个profile是预置用户文件,可以实现按需或者多个VPN网址自动陈列配置
user-profile = /usr/local/etc/ocserv/profile.xml
run-as-user = nobody
run-as-group = nogroup


#这个优先级,我设定为5,一共是0-6优先级,可以在网络传输时优先传递,也支持TOS方式的16进制
net-priority = 5
cgroup = "cpuset,cpu:test"


#设备名称,你可以自己写一个名字
device = CiscoSSL


#这个是关于无用IP地址如何回收的
predictable-ips = true
default-domain = 你的默认域名(与你的证书里的一定要一样,否则奇葩bug)
ipv4-network = 192.168.100.1
ipv4-netmask = 255.255.255.0
dns = 208.67.222.222
ping-leases = false
cisco-client-compat = true


#这下面是以route = 开头的自定义路由,以实现路由自动区分我省掉了,同样可以在github上下载我慢慢调整好的路由。
https://gist.github.com/bao3/bc717ec2294257209c30



在启动ocserv之前,我们需要有自己的证书以及发给客户的证书,这将包括根证书系列、服务器证书系列、客户证书系列,既然已经安装了ocserv那就一定安装了gnutls的certtool则生成证书就可以用我的模板来进行:

https://gist.github.com/bao3/e43f960395d0737664bc


请看清以上链接中的4个文件,一个是ca.tmpl模板,用以生成根证书;一个是server.tmpl用以生成服务器证书;另一个是client.tmpl用以生成客户端证书的模板;最重要的是 cert-client.sh,这是一个脚本,以后你的朋友如果跟你要VPN服务器用,你就可以直接 ./cert-client.sh friend,这样就全自动生成你朋友的一个单独证书,并且打包成 *.p12格式,并且会等待让你输入证书的密码,这个密码是必须的,否则在iOS上是无法导入的,切记。



请分别下载以上4个文件,并将其中的@abc.org改成你自己的网址,然后就可以自行签发了:

首先生成CA根证书:
certtool --generate-privkey --outfile ca-key.pem 
certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem 
接着生成服务器证书:

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
接下来是给客户签发证书,前面的脚本就有作用了,以后你会经常使用这个脚本,极其简单:
./cert-client.sh 你想要指定的文件名称
然后你输入一个密码后,就会生成三个文件 *-key.pem, *-cert.pem, *.cert.p12,大多数平台都只需要最后一个文件 ,同样在其他地方导入这个文件时,也需要输入密码(你在生成时输入的那个)。



证书我默认是10年的有效期,基本上如果我能力足够的话我会一直持续提供服务,你自己可以定义一个短的,至于要取消一个证书,就需要用到 revoke,这个你参考一下就可以了:

$ cat << _EOF_ >crl.tmpl crl_next_update = 9999 crl_number = 1 _EOF_ $ cat user-cert.pem >>revoked.pem $ certtool --generate-crl --load-ca-privkey ca-key.pem --load-ca-certificate ca.pem --load-certificate revoked.pem --template crl.tmpl --outfile crl.pem


接下来就是如何在客户端使用了,本来这东西要使用是非常简单地,可是麻烦是在于客户端思科是不开放的!不过好心的我还是会放出下载的,例如:

mac os x http://ftp.rrzn.uni-hannover.de/pub/local/anyconnect/anyconnect-macosx-i386-3.1.05182-k9.dmg

windows https://ftp.rush.edu/users/vpn-client/anyconnect-win-3.1.05182-pre-deploy-k9.msi

Linux可以使用openconnect。

win下证书导入
如果是win8,直接以管理员身份打开 *.cert.p12,导入;如果导入后发现不能用,那就跟win7一样来操作

1 打开 mmc,然后按ctrl+M 出现功能单元选择,找到证书,然后点添加,就会看到下图




然后在windows上就可以直接连接了。没啥特别的。

mac osx 有点特别:






评论

  1. 你好,你的文章对我帮助很大,顺利设置了证书认证方式的vpn拨号。只是在撤销证书时出了问题,按照文档中的revoke命令,成功生成crl.pem,但是客户端还是可以通过已经撤销的证书拨通vpn。有什么建议可以撤销已经发布的证书吗? 谢谢!

    回复删除
    回复
    1. 抱歉,回复不及时。 证书撤消,需要你用cat 的方式加到 revok的那个列表,里面有要撤消的证书的话,就是成功了。

      删除
  2. 我有两个问题想请教一下。我设置了证书认证后,想对每个用户做流量统计。我设置了connect-script 和 disconnect-script ,根据注释的提示,我把相关的变量都打了出来,但是在 REASON, USERNAME, GROUPNAME, HOSTNAME, DEVICE, IP_REAL, IP_LOCAL, IP_REMOTE 中,USERNAME, GROUPNAME, HOSTNAME 都是空,这样的话我就无法获知是哪个用户连接到了服务器了,不知道该如何解决?

    另外,disconnect-script 从未被执行,是 BUG 吗?

    回复删除
  3. 想请教一下 关于os x的连接
    本人使用lionde搭建ocserv 0.9.0 证书认证登录
    在win7下毫无鸭梨 os x下怎么设置都不认证书
    能麻烦博主仔细讲讲吗?

    回复删除
    回复
    1. 这我确实帮不了你,我在两台mac上都没有问题。

      删除
    2. 我也是,android和windows都正常。MAC上死活不认证书,不知层主找到解决方法没有?
      ocserv[9001]: worker: tlslib.c:378: no certificate was found
      ocserv[9001]: worker: *.*.*.* no certificate provided for authentication

      删除

发表评论

读过之后是不是文思泉涌了?快快让大家拜读一下你的高见吧~~~

此博客中的热门博文

使用StrongSwan搭建 IKEv1 IKEv2 VPN服务器

#2016-01-04 决定将本文作废,因我要另再写新版本的配置。这篇作于 2013年,而strongswan已经更新很多版本。 #本文需要有独立的VPS,如果你需要一台速度快,每月30元的左右的VPS,可以使用我的邀请注册 http://www.vultr.com/?ref=6813064 并且在注册时使用 SSDVPS 可以送 $20(或者 $10 不等)。一定要选日本线路,这个到国内延迟约40ms ~ 100ms ,一般是 80ms 左右,非常快非常稳定,一个月32元,可以和几个人合租了。 #LOG:2014-04-30 对ipsec.conf进行修改,增加了android手机的兼容,现在可以支持完整支持android 自带的VPN设置啦~~~~ #LOG:2013-0609 对ipsec.conf进行修改,加入清楚DPD代码,防止IP 地址池不正确占用 #LOG: 2013-0519 删除ipsec.conf 中多余的conn iOS一节,这本是我一年前调试用的,时间不起作用; 删除了 %default中的 rightsubnet ,如果不删除,在定义了多段IP路由的情况下会导致账号无法上网(只有一段IP没这个bug),感谢  JackWindows  ‏ @ JackWindows #LOG 2013-05-12 修正bug,原配置文件会导致一个ID不可以同时多次登陆。得蒙  @ KhaosT   指点,对  strongswan.conf 加入duplicheck.enable = no ,对 ipsec.conf 加如 uniqueids=never #完成度100% 在我们生活的周围,通常要用到很多种VPN: PPTP, L2TP/IPSec, Cisco IPSec, IKEv2, 这些不同类型的VPN覆盖了目前我们常见的所有手机或者电脑平台,比如 iOS, Blackberry OS, BB10, Android, WebOS, Windows XP, Windows Vista/7/8, Unix/Unix-like。 (*如果你正在找blackberry 翻墙方法、ios ipsec vpn、windows IKEv2 VPN、Blackberry BB10 / Z10 VPN、android VPN,建

简易 APN Proxy (APN代理)的搭建

2012年2月1日 ,新增加了一种方案,请看 《 搭建增强型代理服务器(APN Proxy) 》 2012-01-03 更新 3proxy 及 监控进程脚本,分别见 B 3) 和 曾经在twitter被封锁的时候,我在长城宽带干过一件事,那就是将twitter的请求和通讯使用SSH,让全网用户可以无阻访问,不过也因此付出了代价,略不去说了。 后来得厨神 @paveo 的创意,何不将其用在手机等移动设备上?厨神的APN现在已经很成熟并在免费有限量专供中。我今天这里写得,是如何搭建自己的APN Proxy(APN 代理),但在阅读下面内容之前,需要一个刚性要求:一台在国内的Unix-Like的主机(可以是Linux/FreeBSD/Mac Osx Server/Solaris等等)并且是公网IP地址以及在国外的VPS主机(Unix类)。这个要求可以看出成本比较高,所以我看到淘宝上已经有人开始出售APN代理了,这个可以理解。 第一部分 原理 原理图1 如上图所示,我们要实现的功能原理是,将上网请求先发送到“国内VPS”,再由“国内VPS”通过SSH隧道转送到国外,最终实现无阻上网。点击查看大图可以看出,主要配置是在“国内VPS”上,包括配置SSH -D、Squid、Privoxy或者Polipo(socks代理程序你可以选自己喜欢的)。 第二 配置 1 国外VPS 国外VPS上,你需要有一个SSH帐户,并且请注意,使用密钥方式登录你的SSH而非密码,之所以如此,是为了下一步建立长久的SSH以及断线自动重连做准备,这个很重要。关于“SSH 免密码 密钥 登录”请使用google看一下。 这里有一个小插曲,部分centos 上如果默认的话,SSH帐户会报错,大约 是adminitstatly close之类,这有可能是 openfile数目问题,可以轻松解决。我非Linux爱好者,所以是临时google,并没有记录下来,你只要记得如果遇到同样问题,5分钟之内就可以google解决。 2 国内VPS 这一节将会是我们的主战场,基本上,我将会按下面的逻辑图来进行配置,这其中会涉及很多文件的配置,需要你注意哦,最后部分我会提供部分配置文档下载,由于我使用的是FreeBSD,因此会有少量差