做个笔记,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