最新消息:

[原创]linode vps debian7.5安装配置ocserv(OpenConnect server)

VPN 林夕 91604浏览

参考了以下资料

Debian下安装配置Ocserv搭建Cisco Anyconnect的开源服务端 post:2014年05月28日
http://aenes.com/post/716.html
上面这篇文章作者说了,参考了下面两篇文章
http://ttz.im/blog/2014/02/1131
ocserv: 兼容Cisco Anyconnect的开源服务端 by 杂物仓库 Mk.II post:2014年2月16日

http://imkevin.me/post/80157872840/anyconnect-iphone AnyConnect
带来 iPhone 上的新生活 by Kevin Blog post:2014年3月20日

另外,我后来还看到这篇文章
https://x.hou.im/2014/04/17/anyconnectda-jian-jiao-cheng/
AnyConnect ( ocserv ) 搭建教程 post:2014年4月17日

v2ex上也有人在讨论,http://www.v2ex.com/t/107696
还有http://www.v2ex.com/t/120985 Kevin Blog的那篇文章就是在这里找到的。

缘起

最初想要搞一个VPN,但不知道现在哪一种VPN方式好,谷歌“不受干扰的VPN”,找到四种翻墙方式 by Felix Yan felixonmars post:2014年6月15日。 从这篇文章第一次知道了Ocserv,他说的四种翻墙方式,shadowsocks我已经搞定了,从shadowsocks这种方式,我觉得他说的话应该是可信的。

然后从谷歌找到ocserv: 兼容Cisco Anyconnect的开源服务端 by 杂物仓库 Mk.II post:2014年2月16日Debian下安装配置Ocserv搭建Cisco Anyconnect的开源服务端 post:2014年05月28日。第二篇文章更详细一点。后来在折腾过程中,又找到AnyConnect 带来 iPhone 上的新生活 by Kevin Blog post:2014年3月20日,我就是参考这三篇文章把ocserv折腾好的。后来又发现AnyConnect ( ocserv ) 搭建教程 post:2014年4月17日。目前来说,中文资料里讲ocserv的就这四篇文章了。感谢这些作者的分享,给出了真实有效的配置实例,让我很容易的就搞好了ocserv,上次我搞StrongSwan,折腾两天最后无功,因为教程太老,与现在的版本相差太大,新手伤不起啊!

教程开始

ocserv使用GnuTLS作为SSL的library,所以编译时需要对应的dev包。Debian stable里面带的版本太老(2.12.20),而ocserv需要的包版本在2.15以上,所以需要从backports安装:

追加软件源

echo "deb http://ftp.debian.org/debian wheezy-backports main contrib non-free" >> 

/etc/apt/sources.list

更新源:

apt-get update

顺便更新一下linux系统:

apt-get upgrade --show-upgraded

开始安装依赖包

apt-get -t wheezy-backports install libgnutls28-dev

安装后的状态显示:
Setting up libnettle4:amd64 (2.7.1-1~bpo70+1) …
Setting up libhogweed2:amd64 (2.7.1-1~bpo70+1) …
Setting up libp11-kit0:amd64 (0.20.2-1~bpo70+1) …
Setting up libtasn1-6:amd64 (3.6-1~bpo70+1) …
Setting up libgnutls-deb0-28:amd64 (3.2.15-2~bpo70+1) …
Setting up libgnutls-xssl0:amd64 (3.2.15-2~bpo70+1) …
Setting up libgnutlsxx28:amd64 (3.2.15-2~bpo70+1) …
Setting up nettle-dev (2.7.1-1~bpo70+1) …
Setting up libtasn1-6-dev (3.6-1~bpo70+1) …
Setting up libp11-kit-dev (0.20.2-1~bpo70+1) …
Setting up libgnutls28-dev:amd64 (3.2.15-2~bpo70+1) …

再安装别的依赖包

此处据http://aenes.com/post/716.html

apt-get install libgmp3-dev m4 gcc pkg-config make gnutls-bin -y

此处据http://imkevin.me/post/80157872840/anyconnect-iphone

apt-get install build-essential libwrap0-dev libpam0g-dev libdbus-1-dev \
libreadline-dev libnl-route-3-dev libprotobuf-c0-dev libpcl1-dev\
 libopts25-dev autogen libgnutls28  libseccomp-dev

安装后的状态显示:

Setting up libgnutls28:amd64 (3.2.15-1~bpo70+1) ...
Setting up libdbus-1-3:amd64 (1.6.8-1+deb7u3) 

...
Setting up libltdl7:amd64 (2.4.2-1.1) ...
Setting up libnl-3-200:amd64 (3.2.7-4) ...
Setting up libnl-route-3-200:amd64 (3.2.7-4) ...
Setting up 

libseccomp2:amd64 (2.1.1-1~bpo70+1) ...
Setting up libsystemd-login0:amd64 (44-11+deb7u4) ...
Setting up guile-1.8-libs (1.8.8+1-8) ...
Setting up libopts25-dev 

(1:5.12-0.1) ...
Setting up autogen (1:5.12-0.1) ...
Setting up dbus (1.6.8-1+deb7u3) ...
[ ok ] Starting system message bus: dbus.
Setting up libdbus-1-dev (1.6.8-

1+deb7u3) ...
Setting up libnl-3-dev (3.2.7-4) ...
Setting up libnl-route-3-dev (3.2.7-4) ...
Setting up libpcl1 (1.6-1) ...
Setting up libpcl1-dev (1.6-1) 

...
Setting up libprotobuf-c0 (0.14-1+b1) ...
Setting up libprotobuf-c0-dev (0.14-1+b1) ...
Setting up libtinfo-dev:amd64 (5.9-10) ...
Setting up libreadline6-

dev:amd64 (6.2+dfsg-0.1) ...
Setting up libreadline-dev:amd64 (6.2+dfsg-0.1) ...
Setting up libseccomp-dev:amd64 (2.1.1-1~bpo70+1) ...
Setting up libwrap0-dev:amd64 

(7.6.q-24) ...

下载安装Ocserv,目前最新版为0.8.1

cd /usr/src
/usr/src# wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.8.1.tar.xz
/usr/src# tar Jxvf ocserv-0.8.1.tar.xz
/usr/src# cd ocserv-0.8.1
/usr/src/ocserv-0.8.1# ./configure --prefix=/usr --sysconfdir=/etc && make && make install

生成CA证书

certtool --generate-privkey --outfile ca-key.pem
cat <<_EOF_> ca.tmpl
cn = "luoqkk vpn"
organization = "luoqkk"
serial = 1
expiration_days = 9999
ca
signing_key
cert_signing_key
crl_signing_key
_EOF_
certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem

生成本地服务器证书

certtool --generate-privkey --outfile server-key.pem
cat <<_EOF_> server.tmpl
cn = "luoqkk vpn"
organization = "luoqkk"
serial = 2
expiration_days = 9999
signing_key
encryption_key
tls_www_server
_EOF_
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

如果是在root#提示符下操作的,生成的文件在/root文件夹下,生成之后把服务器证书server-cert.pem 放到/etc/ssl/certs,私钥server-key.pem 放到/etc/ssl/private。

cp ca-cert.pem /etc/ssl/certs
cp ca-key.pem /etc/ssl/private
cp server-cert.pem /etc/ssl/certs
cp server-key.pem /etc/ssl/private

这些文件应该是这样的

/etc/ssl/certs/server-cert.pem
/etc/ssl/private/server-key.pem
/etc/ssl/certs/ca-cert.pem

接下来是配置文件,建立/etc/ocserv并把doc/sample.config拷到该文件夹下,改名为ocserv.conf:

mkdir /etc/ocserv && cp /usr/src/ocserv-0.8.1/doc/sample.config /etc/ocserv/ && mv /etc/ocserv/sample.config /etc/ocserv/ocserv.conf

创建用户

ocpasswd -c /etc/ocserv/ocpasswd username

#username为你要添加的用户名
也可以写成下面这样的,前一个ocpasswd是生成密码的工具,后一个ocpasswd是生成的密码文件。

/usr/bin/ocpasswd -c /etc/ocserv/ocpasswd username

然后会要求你设置密码,密码最好是字母加数字。

修改系统配置,允许转发

vim /etc/sysctl.conf
#修改这行
net.ipv4.ip_forward = 1
#保存退出
sysctl -p

其它的各种配置文件,最上面的链接中写得很详细了,而且为了防止链接打不开,我还保存到我的博客中了,到那几篇文章中去复制粘贴吧,我不想再复制了。

重要说明

请使用anyconnect-win-3.0.11042-pre-deploy-k9.iso安装客户端,下载地址:http://frodo.sca.com/downloads/,大家可以跟思科官网的MD5值对比一下,我检查过了,跟官网的MD5值是一样的。

如果你用最新版的3.1.05170,会有下面的提示,不能连接到服务器,新版不支持自签名的证书。
the service provider in your current location is restricting access to the internet. you need to log on with the service provider before you can establish a vpn session. you cantry this by visiting any website with your browser.
================

下面是我的胡言乱语,是我折腾过程中的零碎启示,大家不用看,会看晕头的

================
修改密码后,不能连接,提示:
anyconnect was not able to establish a connection to the specified secure gateway. please try connecting again.
AnyConnect无法建立到指定的安全网关的连接。请尝试重新连接。
这是由于密码中包含特殊字符,改用字母加数字的密码后OK。
还是不行,有上面那个提示,那个提示过后还有一个提示:
an unknown termination error has occurred in the client service.
发生在客户端服务的未知终止错误。
卸载客户端软件,重新安装后OK。
用客户端连接,客户端提示如下,并建议:use a browser to gain access
the service provider in your current location is restricting access to the internet. you need to log on with the service provider before you can establish a vpn session. you can

try this by visiting any website with your browser.
AnyConnect客户端设置中一定要不选中 “Block connections to untrusted servers”,请重启电脑,或重新安装。(http://www.iqlinkus.net/download.action)

重启后再登录,提示:could not connect to server. please verify internet connectivity and server address
Starting OpenConnect VPN Server Daemon: You cannot mix multiple username/password authentication methods
原来是/etc/ocserv/ocserv.conf文件中下面这一行没注释掉。
auth = “plain[/etc/ocserv/ocpasswd]”

然后就可以连接上了,但是不能上网,路由错误,和这个图一模一样:ftp://myvpn.chinacloudapp.cn/a.jpg
route details secured routes(ipv4) 0.0.0.0/0

cp /usr/src/ocserv-0.8.1/doc/profile.xml /etc/ocserv/
chmod 755 /etc/init.d/ocserv
update-rc.d ocserv defaults
/etc/init.d/ocserv restart

提示:-bash: /etc/init.d/ocserv: /bin/sh^M: bad interpreter: No such file or directory
这是不同系统编码格式引起的:在windows系统中编辑的.sh文件可能有不可见字符,所以在Linux系统下执行会报以上异常信息。 (http://mushme.iteye.com/blog/1486978)

添加nat表(http://blog.51yip.com/linux/1404.html)

iptables -t nat -A POSTROUTING -s 10.10.0.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -j MASQUERADE

将源地址是 10.10.0.0/24 的数据包进行地址伪装

http://blog.51yip.com/linux/1404.html

iptables -F    //清空所有规则
iptables -L -n --line-number//--line-number可以显示规则序号,在删除的时候比较方便
iptables -A FORWARD -s 192.168.20.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.20.0/24 -o eth0 -j MASQUERADE
iptables -A INPUT -i lo -j ACCEPT

添加iptables规则, 允许来自于lo接口的数据包(http://zhidao.baidu.com/link?url=jRCdvFLUmPdkT0OvV1aflKXFGjrGSBIzz7mh2rQtVOqiW0mXKjqxR3yOggMB9qmMNQ38mFJOYFJaWFhcPTbES_)

iptables -A OUTPUT -o lo -j ACCEPT

添加iptables规则, 允许向lo接口发送数据包

查看filter表

iptables -L -n --line-number |grep 21 //--line-number可以显示规则序号,在删除的时候比较方便

查看nat表

iptables -t nat -vnL POSTROUTING --line-number

最后在iptables中打开tcp和udp的443端口即可。ocserv使用tcp的443端口认证,udp用于传输数据。

VPN连接后默认网关通信异常
VPN连接后默认网关通讯异常
路由跟踪-Tracert命令详解
怀疑是没有制作客户端证书,参考官网:http://www.infradead.org/ocserv/manual.html

$ certtool --generate-privkey --outfile user-key.pem
$ cat <<_EOF_>user.tmpl
cn = "user"
unit = "admins"
serial = 1824
expiration_days = 9999
signing_key
tls_www_client
_EOF_
certtool --generate-certificate --load-privkey user-key.pem --load-ca-certificate ca-cert.pem --load-ca-privkey ca-key.pem --template user.tmpl --outfile user-cert.pem

生成可在windows中可导入的p12格式的证书

openssl pkcs12 -export -inkey user-key.pem -in user-cert.pem -name "ocservclient" \
-certfile ca-cert.pem -caname "ocserv CA" -out client.cert.p12

会提示设置证书密码,也可以不设置直接回车即可。

you may need to use a browser to gain access.客户端建议:web authentication required

配置iptables(https://x.hou.im/2014/04/17/anyconnectda-jian-jiao-cheng/)
自动调整MTU

sudo iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

开启 NAT (记得把 eth0 改成自己的网卡名,openvz 的基本是 venet0 )

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

开启 IPv4 的转发

sudo sysctl -w net.ipv4.ip_forward=1

打开 443 端口

iptables -I INPUT -p tcp --dport 443 -j ACCEPT
iptables -I INPUT -p udp --dport 443 -j ACCEPT

现在我们可以开启服务器试试了

sudo ocserv -c /etc/ocserv/ocserv.conf -f -d 1
listening (TCP) on 0.0.0.0:443...
bind() failed: Address already in use
listening (TCP) on [::]:443...
bind() failed: Address already in use
Could not listen to any TCP ports

我们终端输入命令显示443端口被被那个程序占用(http://blog.chinaunix.net/uid-26804016-id-3413836.html)

#netstat -lnp|grep 443

显示是ocserv,测试是正常的,

转载请注明:一秒钟的梦 » [原创]linode vps debian7.5安装配置ocserv(OpenConnect server)