某人一直叫嚣IOS没法很好的使用影梭,于是准备替其上Ocserv,尽量简化设置 使用plain认证
手里可用的一个系统用的Gentoo Base System release 2.2,ocserv比较新,所以源里都没有,只能自己编译安装,这货同时依赖最新版本的gnutls,截止到今天,里面的gnutls版本才2.12.23-r6 太老了,而最新的OCS 0.81需要gnutls >= 3.1.10,咱们需要进行手动编译。如果升级到unstable的gnutls,会替换一大堆系统组件到unstable版本(包括glibc,我可不敢承受这个代价)。后续源里面对东西升级以后都跟上的话 问题就不大了 直接源里面就能装
安装并且编译依赖
我的情况是,这个系统里面,除了gnutls,其他依赖都齐全,gnutls依赖nettle 2.7,好在源里面nettle的版本不太老 emerge安装之
1 |
emerge nettle |
自己编译也不是很麻烦,主要就是要注意编译的时候要安装好相关gmp的开发包 启用hogweed支持
然后我们开始编译最gnutls
下载最新版本的gnutls源代码
1 |
wget ftp://ftp.gnutls.org/gcrypt/gnutls/v3.3/gnutls-3.3.6.tar.xz |
解包 进入目录 比如我保存到 /usr/src/ocserv-0.8.1
1 2 3 4 5 |
./configure --enable-shared make -j2 make install |
回到ocs的目录 告诉pkg-config到哪里去找.pc文件
LIBGNUTLS_LIBS="-L/usr/local/lib -lgnutls" LIBGNUTLS_CFLAGS=-I/usr/local/include ./configure
1 2 3 |
PKG_CONFIG_PATH=/usr/src/ocserv-0.8.1/gnutls-3.3.6/lib/ ./configure make -j 2 make install |
由此编译安装完成
生成证书的方法网上一大堆 官方文档也有很多 这里就不复制粘贴了 这里给大家一个参考链接,记得改下证书里面的名称 别都一样的 闹笑话了。
现在假设我现在在我自己新建的/data/ihipop/ocs目录下 证书也都在这个目录下
配置部分 拷贝源代码目录里面的示例文件到ocs目录
1 2 |
cp /usr/src/ocserv-0.8.1/doc/sample.config ./ocserv.conf vim ./ocserv.conf |
主要修改如下几项
auth = "plain[./sample.passwd]" 我们默认使用plain模式,PAM和证书认证各位有兴趣的可以自己去检索 sample.password就是密码文件
#同一个用户最多同时登陆数
max-same-clients = 2#整个系统最大用户数
max-clients = 16#DPD配置:配置Dead Peer检测频率
dpd = 90 #默认#mobile-dpd是配置给移动设备用的 只要发送了X-AnyConnect-Identifier-DeviceType这个头里面说了了移动设备 ocs就会发送这个dpd 关于DPD的问题 下文会详述
mobile-dpd = 1800 #默认注释#服务器证书路径
server-cert = ./server-cert.pem
server-key = ./server-key.pem#配置运行用户组 咱们可不能让其用root运行
run-as-user = nobody
run-as-group = daemon# 设置VPN的设备名称 后面做策略的时候可能用到
device = ocs_vpn#私有IP段配置
ipv4-network = 10.99.99.1
ipv4-netmask = 255.255.255.0#DNS配置
dns = 8.8.8.8#推送的路由配置
#route = 192.168.1.0/255.255.255.0
#route = 192.168.5.0/255.255.255.0
#注意 这里推送路由条数限制据说只有64条 而且不能指定是走还是不走路由 这点没有openVPN灵活我这里全部把它注释了 走全局了
#如果要推全局路由 我建议使用如下两条记录 原因看文末
route = 0.0.0.0/128.0.0.0
route = 128.0.0.0/128.0.0.0
iptables和系统ip包转发的配置这里不多说了 和正常VPN的配置没有太大的区别 配置的时候如果有forward规则就把『ocs_vpn+』全部放过就好了
我贴一下我的几个iptables规则
1 2 3 4 5 6 |
iptables -A FORWARD -o ocs_vpn+ -j ACCEPT iptables -A FORWARD -i ocs_vpn+ -j ACCEPT iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -j MASQUERADE #假设你的OCS跑在443端口 我们开放TCP和UDP是443 其他情况请自己修改 iptables -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT iptables -A INPUT -p udp -m udp --dport 443 -j ACCEPT |
有趣的是配置过程中发现这货原生支持IPv6 后面有空来研究下
启动和调试:
进入刚才的目录(我都是用的相对路径)
1 |
ocserv -c ocserv.conf -f -d 1 |
其中 -f 表示程序在前台运行 保证你能看到调试信息 -d后面的数字表示调试级别 数字越大 信息越详细。
设置开机启动也一切从简 我就直接放到gentto的local服务下进行管理了,直接创建/etc/local.d/ocsserv.start 然后写入如下内容然后赋予可执行权限即可
1 |
/usr/bin/screen -S ihipop.ocs.anyconnect -dm bash -c "cd /data/ihipop/ocs/ && ocserv -c ocserv.conf -f -d 1" |
debian用户直接写到rc.local里面即可 无需多虑
设置plain认证的密码:
自带一个ocpasswd工具 使用起来和apache的htpasswd没啥差别
1 |
ocpasswd -c sample.passwd username |
sample.passwd 是配置文件里面定义的plain认证文件地址 根据自己的情况修改 这工具同样也能修改密码和删除用户,具体看帮助,不在本文讨论范畴
问题集锦:
- DPD导致的断线问题
刚才提到ocs有两个dpd选项 分别对应非移动设备和移动设备 官方文档里面推荐把移动设备的dpd设置的高一些,比如1800秒 免得经常唤醒设备导致巨耗电 ,但是现实总是没有那么美好,移动设备的网络特性就决定了网络会经常变化 很容易就断线了而设备还不知道 导致显示VPN连接着 但是没法上网 过一会才反映过来超时自己断线 所以这个值需要大家自己斟酌设置,产生类似:ocserv:could not determine the owner of received UDP packet的提示。有人说是ICS的BUG。不过我用了几次没遇到。 - 端口修改
其实ocserv支持端口修改 但是但是,cisco anyconnect工作需要2个端口 其中TCP 443用于控制 而 UDP 443用户传输数据 这是默认的端口 可以修改 但是在客户端上 你只需要指定好tcp的443端口就行,udp的端口客户端会去问服务器端的。
修改服务器端口只需要更改服务器配置文件的tcp-port 和 udp-port选项即可 客户端使用 IP:tcp-port的形式链接即可,安卓版本测试通过。 - 客户端下载
官方下载页面在此 http://software.cisco.com/download/type.html?mdfid=283000185&catid=null 下载需要注册 这里提供国内网盘下载链接 http://pan.baidu.com/s/1bnu6jFL - 使用TCP模式(TLS)而不是UDP模式(DTLS)传输数据
默认控制协议使用TCP端口而UDP端口用来传输数据 但是国内有些运营商或者企业内网对UDP协议有深度限制 可能达不到最大流速或者效果不好,那么可以关闭UDP模式转为TCP模式 变成纯TLS VPN 方法很简单,服务端配置文件里面的udp-port选项注释即可 - 默认路由问题
官方文档上说 如果你需要走全局路由 就注释掉所有路由推送,但是经过我测试,这个至少在使用AnyConnect的时候是有问题的(OpenConnect没有测试) anyconnect 3.0收到这样推送会删掉所有的局域网路由和广播路由(而且你还添加不上,一添加就会被删掉),而且会导致你打不开VPN服务器(,其他网站不受影响),PING VPN服务器和局域i网 甚至是自己的IP,机器内虚拟机的IP 都是 "General Failure" 一般故障 改成推送 0.0.0.0/128.0.0.0 和 128.0.0.0/128.0.0.0 就好了。
这两个路由的意思如下:0.0.0.0/128.0.0.0 = 0.0.0.0/1 = 0.0.0.0 TO 127.255.255.255
128.0.0.0/128.0.0.0 = 128.0.0.0/1 = 128.0.0.0 TO 255.255.255.255
正好覆盖了所有的IPV4地址 而且OpenVPN也是这么做的:)真是聪明的家伙们啊。
代码高亮是用的什么插件
学习了,刚好在鼓捣这个