最新消息:

安装配置OpenConnect VPN server AnyConnect (ocserv)

VPN 林夕 121256浏览

bandwagonhost VPS debian7.0 安装配置OpenConnect VPN server AnyConnect ( ocserv )

查看linux版本:

1) 登录到服务器执行 lsb_release -a ,即可列出所有版本信息,

Distributor ID: Debian
Description:    Debian GNU/Linux 7.3 (wheezy)
Release:        7.3
Codename:       wheezy

更新系统后显示

Distributor ID: Debian
Description:    Debian GNU/Linux 7.6 (wheezy)
Release:        7.6
Codename:       wheezy

这次我准备用bandwagonhost.com的年付9.99美元的VPS来安装ocserv。

第一部分,注册bandwagonhost并设置好SSH登录。

512M内存 / 5G SSD硬盘/ G口 500G流量 / 年付9.99美元,我是使用tennfy.com置顶链接来注册的,因为我第一次是从他这里看到这个VPS的介绍,使用他的邀请链接,算是对他的一种支持吧。点击邀请链接进去后,Billing Cycle(付款方式)选择为$9.99 USD Annually(年付9.99美元),Configurable Options>>Location(机房位置选择),有两个选择:
US East Coast – Florida (USFL_2)美国东海岸 – 佛罗里达州(USFL_2)
US West Coast – Arizona (USAZ_2)美国西海岸 – 亚利桑那(USAZ_2)
大家都知道,美国西海岸的服务器对国内是最快的,因此我们选择US West Coast – Arizona (USAZ_2),
点击Checkout结账,进入注册界面,设置好注册信息,这个网站使用paypal来付款。
新手建议到tennfy.com看教程。
在下面的叙述中我把bandwagonhost称作搬瓦工,在搬瓦工首页点击VPS Hosting,点击Services–My Services选项卡,点击kiwiVM control panel,进入后台管理界面,首先在Main Controls 找到 Actions:,并点击stop,然后点击 Install new OS,重装系统,这里以debian-7.0-x86为例,选中,点击reload,开始重装,很快就会重装好。并会把ssh端口号和root密码显示出来,找到IP地址,root密码及ssh端口,使用Putty远程(SSH)管理Linux VPS,我们现在是使用root帐号及密码来ssh登录,现在我想改成使用密钥方式来ssh登录,并把密码登录方式禁用。

1、在Linux远程服务器生成密钥:

登录远程Linux VPS/服务器,执行:

root@vpser:~# ssh-keygen -t rsa //先运行这个命令
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):                   //直接回车
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):                                    //输入密钥密码
Enter same passphrase again:                                                                 //重复密钥密码
Your identification has been saved in /root/.ssh/id_rsa.         //提示公钥和私钥已经存放在/root/.ssh/目录下
Your public key has been saved in /root/.ssh/id_rsa.pub.
The key fingerprint is:
15:23:a1:41:90:10:05:29:4c:d6:c0:11:61:13:23:dd root@vpser.net
The key's randomart image is:
+--[ RSA 2048]----+
|=&@Bo+o o.o      |
|=o=.E  o . o     |
| .    .   .      |
|         .       |
|        S        |
|                 |
|                 |
|                 |
|                 |
+-----------------+
root@vpser:~#

2、把id_rsa.pub改名并修改权限。

mv /root/.ssh/id_rsa.pub /root/.ssh/authorized_keys
chmod 600 /root/.ssh/authorized_keys

3、使用winscp以root帐号密码的方式登录vps

把/root/.ssh/id_rsa文件下载到本地并删除服务器上的id_rsa文件,
修改/etc/ssh/sshd_config 文件,将RSAAuthentication 和 PubkeyAuthentication 后面的值都改成yes ,
将PasswordAuthentication yes 修改成 PasswordAuthentication no,并把PasswordAuthentication no前面的注释符#去掉,保存。

4、重启sshd服务

Debian/Ubuntu执行/etc/init.d/ssh restart ;CentOS执行:/etc/init.d/sshd restart。

5、搬瓦工的root密码太简单了,我现在修改root密码

passwd root
输入两遍密码,然后提示密码修改成功。

6、使用putty登录

putty使用的私钥文件和Linux服务器或XShell的私钥格式不同,如果使用putty的话,需要将Linux主机上生成的id_rsa文件下载的本地。运行putty压缩包里面的puttygen.exe,选择Conversions->Import key选择私钥文件id_rsa,输入密钥文件的密码,会出现如下界面:

点击“Save Private Key”,将私钥保存为id_rsa.ppk

运行putty,在Host Name填写:root@主机名或ip



如果设置了密钥密码,出现:Passphrase for key “imported-openssh-key”时输入密钥密码。

如果设置没问题就会登录成功,出现用户提示符。

再提醒一下一定要保存好Putty私钥文件id_rsa.ppk或Linux服务器下载下来的id_rsa私钥文件。

第二部分,安装openconnect(ocserv)

追加软件源

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 libgmp3-dev m4 gcc pkg-config make gnutls-bin -y

再安装依赖包

apt-get -t wheezy-backports 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 libgnutls28-dev  libseccomp-dev

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

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

返回到root文件夹下

cd

生成ssl证书

请注意,搬瓦工生成的证书截止日期是2005年,不能用,试了两次,无果,最后,在linode的服务器上,用同样的方法,生成了正确的证书,日期是2041年,不知道为什么。在另一个电脑上,使用linode证书后无数据接收,我猜是证书的问题,换一种方法制作证书后,日期竟然是10000年,证书问题导致不能建立ssl连接。

生成CA证书

certtool --generate-privkey --outfile ca-key.pem
cat <<_EOF_> ca.tmpl
cn = "banwagon CA"
organization = "banwagon Corp"
serial = 1
expiration_days = 999
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 = "www.banwagon.com"
organization = "banwagon"
serial = 2
expiration_days = 999
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

生成客户端证书

certtool --generate-privkey --outfile user-key.pem
cat <<_EOF_>user.tmpl
cn = "banwagon"
unit = "admins"
serial = 1824
expiration_days = 999
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 "banwagonclient" \
-certfile ca-cert.pem -caname "banwagon CA" -out client.cert.p12

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

如果是在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/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

编辑配置文件

vim /etc/ocserv/ocserv.conf

修改如下

auth = "plain[/etc/ocserv/ocpasswd]"
#ocserv支持多种认证方式,这是自带的密码认证,使用ocpasswd创建密码文件
#ocserv还支持证书认证,可以通过Pluggable Authentication Modules (PAM)使用radius等认证方式

#同一个用户最多同时登陆数
max-same-clients = 10 

#证书路径
server-cert = /etc/ssl/certs/server-cert.pem
server-key = /etc/ssl/private/server-key.pem

#运行组
run-as-group = nogroup

#分配给VPN客户端的IP段
ipv4-network = 10.10.0.0

#DNS
dns = 8.8.8.8
dns = 8.8.4.4

#注释掉route的字段,这样表示所有流量都通过 VPN 发送
#route = 192.168.1.0/255.255.255.0
#route = 192.168.5.0/255.255.255.0

user-profile改为user-profile = /etc/ocserv/profile.xml
并且去掉cisco-client-compat = true的注释。

然后是/etc/ocserv/profile.xml:

cp /usr/src/ocserv-0.8.1/doc/profile.xml /etc/ocserv/

修改HostAddress为你的服务器IP地址。

创建用户

ocpasswd -c /etc/ocserv/ocpasswd username
#username为你要添加的用户名

修改系统配置,允许转发

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

修改 iptables 规则

你可以参考 Linode 的文章 来配置 iptables

iptables -A INPUT -d 127.0.0.0/8 -j REJECT
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -s 192.168.21.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.21.0/24 -o eth0 -j MASQUERADE //将源地址是 192.168.21.0/24 的数据包进行地址伪装
iptables -A INPUT -i lo -j ACCEPT //允许来自于lo接口的数据包
iptables -A OUTPUT -o lo -j ACCEPT //允许向lo接口发送数据包
iptables -I INPUT -p tcp --dport 443 -j ACCEPT //打开tcp和udp的443端口。ocserv使用tcp的443端口认证,udp用于传输数据。
iptables -I INPUT -p udp --dport 443 -j ACCEPT
iptables -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu //自动调整MTU
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

-A INPUT -j DROP

COMMIT

在你的 /etc/rc.local 的exit 前面加上这句 来开启 NAT

iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

保存规则:

iptables-save >/etc/iptables-script

恢复规则:

iptables-restore </etc/iptables-script

配置启动文件

现在我们需要一个脚本来管理 Ocserv
Tony用skeleton改写了一个脚本,把这个脚本放到/etc/init.d/ocserv

chmod 755 /etc/init.d/ocserv
update-rc.d ocserv defaults

就可以开机启动了。

你也可以通过

/etc/init.d/ocserv stop
/etc/init.d/ocserv start
/etc/init.d/ocserv restart

这样子来管理。

#!/bin/sh
### BEGIN INIT INFO
# Provides:          ocserv
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
### END INIT INFO
# Copyright Rene Mayrhofer, Gibraltar, 1999
# This script is distibuted under the GPL

PATH=/bin:/usr/bin:/sbin:/usr/sbin
DAEMON=/usr/sbin/ocserv
PIDFILE=/var/run/ocserv.pid
DAEMON_ARGS="-c /etc/ocserv/ocserv.conf"

case "$1" in
start)
if [ ! -r $PIDFILE ]; then
echo -n "Starting OpenConnect VPN Server Daemon: "
start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON -- \
$DAEMON_ARGS > /dev/null
echo "ocserv."
else
echo -n "OpenConnect VPN Server is already running.\n\r"
exit 0
fi
;;
stop)
echo -n "Stopping OpenConnect VPN Server Daemon: "
start-stop-daemon --stop --quiet --pidfile $PIDFILE --exec $DAEMON
echo "ocserv."
rm -f $PIDFILE
;;
force-reload|restart)
echo "Restarting OpenConnect VPN Server: "
$0 stop
sleep 1
$0 start
;;
status)
if [ ! -r $PIDFILE ]; then
# no pid file, process doesn't seem to be running correctly
exit 3
fi
PID=`cat $PIDFILE | sed 's/ //g'`
EXE=/proc/$PID/exe
if [ -x "$EXE" ] &&
[ "`ls -l \"$EXE\" | cut -d'>' -f2,2 | cut -d' ' -f2,2`" = \
"$DAEMON" ]; then
# ok, process seems to be running
exit 0
elif [ -r $PIDFILE ]; then
# process not running, but pidfile exists
exit 1
else
# no lock file to check for, so simply return the stopped status
exit 3
fi
;;
*)
echo "Usage: /etc/init.d/ocserv {start|stop|restart|force-reload|status}"
exit 1
;;
esac

exit 0

Debug

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

第三部分,客户端使用

1、下载客户端

使用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.

2、导入客户端证书

Windows 7+
导入证书:

    开始菜单搜索“cmd”,打开后输入 mmc(Microsoft 管理控制台)。
    “文件”-“添加/删除管理单元”,添加“证书”单元
    证书单元的弹出窗口中一定要选“计算机账户”,之后选“本地计算机”,确定。
    在左边的“控制台根节点”下选择“证书”-“个人”,然后选右边的“更多操作”-“所有任务”-“导入”打开证书导入窗口。
    选择刚才生成的 client.cert.p12 文件。下一步输入私钥密码。下一步“证书存储”选“个人”。
    导入成功后,把导入的 CA 证书剪切到“受信任的根证书颁发机构”的证书文件夹里面。
    打开剩下的那个私人证书,看一下有没有显示“您有一个与该证书对应的私钥”,以及“证书路径”下面是不是显示“该证书没有问题”。
    然后关闭 mmc,提示“将控制台设置存入控制台1吗”,选“否”即可。

至此,证书导入完成。
注意 千万不要双击 .p12 证书导入!因为那样会导入到当前用户而不是本机计算机中。

GnuTLS error (at worker-vpn.c:732):其实就是证书有问题,重新制作证书吧,我重复做了不下五遍证书,以前在linode一样的方法一次成功,这个搬瓦工的vps硬是折腾了我好几次。

转载请注明:一秒钟的梦 » 安装配置OpenConnect VPN server AnyConnect (ocserv)