做个笔记,Debian上面装ocserv(AnyConnect服务器端)

比情人节一个人过更杯具的就是一大早起床然后收到一封邮件,RIJX说不好意思我们要跑路了,请尽快申请退款和备份你的资料。。。太坑爹了吧。。。我去哪里找那么便宜的还提供2个ip的VPS啊。。。看了看手头还有100刀DigitalOcean给的券,勉为其难用一下吧。。。然后发现上海电信连DO的网络真是各种酸爽,新加坡节点ping值平均350ms丢包率58%。。。三藩和纽约的节点更加无语。。。于是只好上LEB看了一眼,买了个5刀一年的达拉斯的白菜。。。8G硬盘+128M内存+128M swap+250G流量。。。好吧反正就是用作VPN,应该够了。。。

考虑到自己之前各种摸索也没有记录啥东西,索性整理一下,万一以后被封掉什么的。。。省得再到处找。。。

系统:Debian x86

上来先搞libgnutls28-dev:

echo "deb http://ftp.debian.org/debian wheezy-backports main contrib non-free" >> /etc/apt/sources.list
apt-get update && apt-get dist-upgrade -y && apt-get autoremove -y
apt-get -t wheezy-backports install libgnutls28-dev -y

安装各种依赖。。。

apt-get install libgmp3-dev m4 gcc pkg-config make gnutls-bin build-essential libwrap0-dev libpam0g-dev libdbus-1-dev libreadline-dev libnl-route-3-dev libprotobuf-c0-dev libpcl1-dev libopts25-dev autogen libseccomp-dev liblz4-dev git build-essential -y

关于freeradius,有了freeradius之后增减用户很方便,而且也可以统计流量,但缺点在于freeradius不支持一个用户对应多个组,而我是打算在连接的时候选择全局还是区分流量的,如下图:

所以freeradius的部分就掠过吧,有兴趣的网上教程一搜一大把,照做就行了。至于LZ4,目前只有openconnect客户端支持,AnyConnect还是LZS压缩,所以作为懒人我也跳过吧。。。

为了避免出现烦人的不受信任服务器的提醒,强烈建议搞一个SSL的证书,startssl有免费的,教程也是一搜一大把,略过不表。假设现在从startssl那里搞来的证书是cert.crt,私钥是cert.key。首先新建一个文件夹:

mkdir /etc/ocserv

然后把cert.crt和cert.key上传到那个文件夹中去。然后生成证书链。话说之前没搞证书链,AnyConnect一直提示不受信任的服务器,但是用FF打开却显示证书正确。。。一直到看了文末的那篇文章才知道问题的根源。。。

cd /etc/ocserv
wget http://cert.startssl.com/certs/ca.pem
wget http://cert.startssl.com/certs/sub.class1.server.ca.pem
cat cert.crt > server-cert.pem
cat sub.class1.server.ca.pem >> /etc/ocserv/server-cert.pem
cat ca.pem >> /etc/ocserv/server-cert.pem

所以再接下来就是安装ocserv了,目前最新版是0.9.0.1,采用下载源码然后编译的方式,我偏好把源码放在/usr/src/下面。

cd /usr/src
wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.9.0.1.tar.xz
tar xf ocserv-0.9.0.1.tar.xz
rm ocserv-0.9.0.1.tar.xz
cd ocserv-0.9.0
./configure --prefix=/usr --sysconfdir=/etc --enable-linux-namespaces

看一眼,有没有啥出错的提示,一般来说,应该没有。。。然后再看看有啥想要的功能显示了no。。。

make && make install
cp doc/sample.config /etc/ocserv/ocserv.conf
cd /etc/ocserv
vim ocserv.conf

然后就修改配置文件吧,一行行来。。。

第37行,auth = "plain[./sample.passwd]”,修改为auth = “plain[/etc/ocserv/ocpasswd]"

第44行,isolate-workers = true,改为false

第104行,try-mtu-discovery = false,改成true

第116和117行,按照实际证书位置修改,如果是按照我的操作的话就改成这样:

server-cert = /etc/ocserv/server-cert.pem
server-key = /etc/ocserv/cert.key

第162行,#compression = true,去掉开始的#

第168行,#no-compress-limit = 256,同样是去掉#

第205行,cookie-timeout = 300,鉴于肾机关屏断VPN解锁重连的特性,建议这里设置大一点,省得每次都要手动重连。如果2小时话,就写7200

第268行,run-as-group = daemon改为run-as-group = nogroup

第275行,#net-priority = 3,删掉#,然后把优先级提高,我自己设置了5

第290行,predictable-ips = true,设为false

第305行,dns = 192.168.1.2改为8.8.8.8

第345,346行,route = **************,都在最前面加上#,注释掉

第354行,#select-group = group1,改为select-group = global

第355行,#select-group = group2[My special group],改为select-group = routed

第379行,#config-per-group = /etc/ocserv/config-per-group/,去掉一开始的#

第384行,#default-group-config = /etc/ocserv/defaults/group.conf,去掉一开始的#

第414行,#cisco-client-compat = true,去掉一开始的#

保存退出。

然后建立分组的配置文件:

mkdir defaults
vim defaults/group.conf

写入一下内容:

route = 0.0.0.0/128.0.0.0
route = 128.0.0.0/128.0.0.0

然后,新建推送的路由表:

mkdir config-per-group
cd config-per-group
wget https://github.com/rankjie/anyconnect-gfw-list/raw/master/gfwiplist.txt -O routed
cd ..

接下来是新建用户了。我们将会定义2个组,一个组是global,所有流量都经过服务器转发,而另一个组叫routed,只有部分流量通过服务器转发,可以保证国内网站的速度,节约VPN的流量。假设用户名是user。注意不同用户组用英文逗号隔开。

ocpasswd -g global,routed -c /etc/ocserv/ocpasswd user

输入2遍密码。以后新增用户也这么进行即可。

搞一个自动脚本,并设置开机自动启动:

wget https://gist.github.com/kevinzhow/9661623/raw/9d2c80e7a86eed514165bf7c9fce777bfe775f37/ocserv -O /etc/init.d/ocserv
chmod 755 /etc/init.d/ocserv
update-rc.d ocserv defaults

打开端口转发:

sed -i 's/#net\.ipv4\.ip_forward=1/net.ipv4.ip_forward=1/' /etc/sysctl.conf
sysctl -p

设置iptables。linode的这篇文章的确不错,可以按照他的设置,但是记得要把-A FORWARD -j DROP这一行删掉,以及在最后的COMMIT之前加下面一句:

-A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
-A INPUT -p udp --dport 443 -j ACCEPT

然后在COMMIT之后再加下面这一段:

*nat
-A POSTROUTING -j MASQUERADE
COMMIT

接下来,就可以运行一下,看看是不是正常,可以debug了。。。

ocserv -c /etc/ocserv/ocserv.conf -f -d 1

如无意外,大功告成~

参考的文章:

http://aenes.com/post/716.html

http://www.infradead.org/ocserv/manual.html

http://imkevin.me/post/80157872840/anyconnect-iphone

  • sammy

    部署成功!

    楼主!爱你!

  • sammy

    啥时候有空更新下自建证书的部署方式,好不好?

  • dreamsafari

    自建证书的方式网上到处都有,参考链接里面也是的,因为作为强迫症患者的我实在是不喜欢弹出来的不受信任证书的提示,所以。。。
     

  • Eric

    不知道自己证书是否能像你这样选择用户组的?win系统不能手动选证书真不好弄。

    • dreamsafari

      我没试过,其实我不太喜欢搞证书,太麻烦。。。之前尝试过radius的,但是radius不支持一个用户多个组,残念。。。

  • asasu

    谢谢分享这么好的文章。
    关于多个用户组 多个路由表 的global 和 routed 的设置不太明白,是需要多个配置文件吗。
    请问,如何实现不同组别里下达不同的路由啊?

    • dreamsafari

      不同的组对应不同的配置文件,只需要把需要下发的路由写进不同组的配置文件就好了

  • 鸟哥

    ocserv如何配置监听多个IP?

    ocserv.conf里面有这样一条:
    # Use listen-host to limit to specific IPs or to the IPs of a provided
    # hostname.
    listen-host = [IP|hostname]
    那么我应该怎么配置才能让它监听多个IP呢?比如a.a.a.a 和b.b.b.b ?

    • 我现在手上没有多IP的VPS可以试了。。。写两行listen-host =试试看呢?

      • 鸟哥

        我试了一下好像不行,好像只读取了第一行的IP

        • 那么写成a.b.c.d/24这样呢?

          • 鸟哥

            我手上的两个IP不是同一段的……

            • 那。。。监听所有端口,然后用iptables限制某个ip不让连接?

            • 鸟哥

              这好麻烦……要不还是算了……

            • 鸟哥

              官方文档里面也不说……让人怎么用……

    • Kouga(SR+)艾利欧型

      写两个配置文件,启动两个进程……完毕喵……

      • 鸟哥

        这……倒确实是个办法……