Gentoo编译安装Ocserv上Cisco AnyConnect VPN

某人一直叫嚣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安装之

自己编译也不是很麻烦,主要就是要注意编译的时候要安装好相关gmp的开发包 启用hogweed支持

然后我们开始编译最gnutls

下载最新版本的gnutls源代码

解包 进入目录 比如我保存到 /usr/src/ocserv-0.8.1

回到ocs的目录 告诉pkg-config到哪里去找.pc文件

LIBGNUTLS_LIBS="-L/usr/local/lib -lgnutls" LIBGNUTLS_CFLAGS=-I/usr/local/include ./configure

由此编译安装完成

生成证书的方法网上一大堆 官方文档也有很多 这里就不复制粘贴了 这里给大家一个参考链接,记得改下证书里面的名称 别都一样的  闹笑话了。

现在假设我现在在我自己新建的/data/ihipop/ocs目录下 证书也都在这个目录下

配置部分 拷贝源代码目录里面的示例文件到ocs目录

主要修改如下几项

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规则

有趣的是配置过程中发现这货原生支持IPv6 后面有空来研究下

启动和调试:

进入刚才的目录(我都是用的相对路径)

其中 -f 表示程序在前台运行 保证你能看到调试信息 -d后面的数字表示调试级别 数字越大 信息越详细。

设置开机启动也一切从简 我就直接放到gentto的local服务下进行管理了,直接创建/etc/local.d/ocsserv.start 然后写入如下内容然后赋予可执行权限即可

debian用户直接写到rc.local里面即可 无需多虑

设置plain认证的密码:

自带一个ocpasswd工具 使用起来和apache的htpasswd没啥差别

sample.passwd 是配置文件里面定义的plain认证文件地址 根据自己的情况修改 这工具同样也能修改密码和删除用户,具体看帮助,不在本文讨论范畴

问题集锦:

  1.  DPD导致的断线问题
    刚才提到ocs有两个dpd选项 分别对应非移动设备和移动设备 官方文档里面推荐把移动设备的dpd设置的高一些,比如1800秒 免得经常唤醒设备导致巨耗电 ,但是现实总是没有那么美好,移动设备的网络特性就决定了网络会经常变化 很容易就断线了而设备还不知道 导致显示VPN连接着 但是没法上网 过一会才反映过来超时自己断线 所以这个值需要大家自己斟酌设置,产生类似:ocserv:could not determine the owner of received UDP packet的提示。有人说是ICS的BUG。不过我用了几次没遇到。
  2. 端口修改
    其实ocserv支持端口修改 但是但是,cisco anyconnect工作需要2个端口 其中TCP 443用于控制 而 UDP 443用户传输数据 这是默认的端口 可以修改 但是在客户端上  你只需要指定好tcp的443端口就行,udp的端口客户端会去问服务器端的。
    修改服务器端口只需要更改服务器配置文件的tcp-port 和 udp-port选项即可 客户端使用 IP:tcp-port的形式链接即可,安卓版本测试通过。
  3. 客户端下载
    官方下载页面在此 http://software.cisco.com/download/type.html?mdfid=283000185&catid=null 下载需要注册 这里提供国内网盘下载链接 http://pan.baidu.com/s/1bnu6jFL
  4. 使用TCP模式(TLS)而不是UDP模式(DTLS)传输数据
    默认控制协议使用TCP端口而UDP端口用来传输数据 但是国内有些运营商或者企业内网对UDP协议有深度限制 可能达不到最大流速或者效果不好,那么可以关闭UDP模式转为TCP模式 变成纯TLS VPN 方法很简单,服务端配置文件里面的udp-port选项注释即可
  5. 默认路由问题
    官方文档上说 如果你需要走全局路由 就注释掉所有路由推送,但是经过我测试,这个至少在使用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也是这么做的:)真是聪明的家伙们啊。

Author Info :
  • From:Gentoo编译安装Ocserv上Cisco AnyConnect VPN
  • URL:https://blog.ihipop.com/2014/07/4782.html
  • Please Reserve This Link,Thanks!
  • 《Gentoo编译安装Ocserv上Cisco AnyConnect VPN》上有2条评论

    发表回复

    您的电子邮箱地址不会被公开。 必填项已用 * 标注