翻墙入口,Telegram上最大的免费科学上网解决方案提供者,
致力于维护互联网世界普世自由价值、建立翻墙行业新秩序。

使用Ocserv 手动搭建 Cisco AnyConnect VPN服务端

本文最后更新于 2018年9月20日 20:04 可能会因为没有更新而失效。如已失效或需要修正,请留言!

很早就有人想要我写这个 Cisco AnyConnect VPN 服务端的搭建教程了,不过我一直嫌麻烦没写,这段时间没什么东西写,那么就写个看看吧。

Cisco AnyConnect VPN客户端教程:Cisco AnyConnect VPN Windows/Android 平台客户端使用教程

一键安装脚本:『原创』Ocserv 搭建 Cisco AnyConnect VPN服务端 一键脚本

介绍一下

首先介绍一下Ocserv也就是OpenConnect,即Cisco AnyConnect的兼容服务端。

众所周知,Cisco在网络设备领域处于霸主地位,其开发的AnyConnect作为一种VPN协议,不是想封就能封的。封锁AnyConnect将对大量跨国公司的子公司与母公司的通讯造成灾难性后果。因此,虽然AnyConnect的握手特征很明显,但是依然可以正常使用。

而AnyConnect作为Cisco专有技术,其服务端只能运行在Cisco设备上,即如果没有购买Cisco相关设备,将无法使用AnyConnect服务端。而OpenConnect的出现解决了这一个问题,OpenConnect是一个开源项目,其目标是在相对廉价的linux设备上运行与AnyConnect协议兼容的服务端,以此来使用该协议而不需要购买Cisco专有设备。

AnyConnect目前支持 Windows 7+ / Android / IOS / Mac ,其他设备没有客户端所以无法使用,例如 XP系统。

教程说明

本教程仅在 Debian 7 中测试,理论上 Debian 8 与 Ubuntu 步骤一样。

我也是刚刚了解这个VPN,AnyConnect的优势就是相比其他的VPN协议(OpenVPN、PPTP、L2TP、IKEv2等),AnyConnect并不会被墙封,当然也不代表完全没有干扰,所以如果只是玩游戏的话,用其他的VPN协议容易被墙干掉,这时候就可以使用AnyConnect,如果只是看网页看视频,那还是建议使用ShadowsocksR。

AnyConnect的配置参数很多,大部分我都不明白什么意思,教程里的示例配置文件只是在默认的配置文件中简单改了改,大家可以自己了解后去修改。

本教程仅写出了通过用户名和密码的方式来登陆链接AnyConnect VPN,通过自签SSL证书用于客户端与服务端直接的SSL安全加密。

注意:如果服务器同时安装了 锐速(ServerSpeed/LotServer),那么可能会导致 AnyConnect 连接上后无网络或者速度异常(慢),这时候请关闭锐速,BBR加速无影响

安装步骤

检查PPP/TUN环境

首先要检查VPS的TUN是否开启(OpenVZ虚拟化的服务器很可能默认关闭)。

cat /dev/net/tun # 返回的必须是: cat: /dev/net/tun: File descriptor in bad state 

如果返回内容不是指定的结果,请与VPS提供商联系开启TUN权限(一般控制面板有开关)。

安装依赖

首先为了确保依赖安装正常、完整,我们需要更换系统 软件包源为最新的稳定源 jessie (本步骤必做,否则很容易出错)。

默认下面的代码是 美国的镜像源,可以更换下面代码 us.sources.list 中的 us ,具体可以看这里

rm -rf /etc/apt/sources.list && wget -N --no-check-certificate -O "/etc/apt/sources.list" "https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/sources/us.sources.list" 

然后我们更新软件包列表,并开始安装依赖:

apt-get install pkg-config build-essential libgnutls28-dev libwrap0-dev liblz4-dev libseccomp-dev libreadline-dev libnl-nf-3-dev libev-dev gnutls-bin -y 

注意:这个更换 镜像源的步骤,Debian 8、Debian 9 不需要执行,可以直接跳过,Debian 7 必须执行!

编译安装

然后我们新建一个文件夹,并下载和编译安装 ocserv,此处用的 ocserv 可能不是最新的,最新的请看:ocserv

mkdir ocserv && cd ocserv wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.11.8.tar.xz tar -xJf ocserv-0.11.8.tar.xz && cd ocserv-0.11.8 ./configure 

./configure 命令执行后,过一会就会出现如下信息,正常情况下应该跟我的差不多。

# === 服务器输出示例 === # configure:  Summary of build options: version: 0.11.8 Host type: x86_64-unknown-linux-gnu Install prefix: /usr/local Compiler: gcc CFlags: -g -O2 -Wall -Wno-strict-aliasing CWrap testing: no CWrap PAM testing: no  PAM auth backend: no Radius auth backend: no GSSAPI auth backend: no Anyconnect compat: yes TCP wrappers: yes systemd: no (socket activation) seccomp: yes Compression: yes LZ4 compression: yes readline: yes libnl3: yes liboath: no libgeoip: no glibc (sha2crypt): yes local talloc: yes local protobuf-c: yes local PCL library: yes local libopts: yes local http-parser: yes # === 服务器输出示例 === # 

然后我们继续安装:

make make install # 安装后的文件可以不删除,卸载的时候还需要用到。

最后我们新建一个配置文件的文件夹:

mkdir /etc/ocserv wget -N --no-check-certificate -P "/etc/ocserv" https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/ocserv.conf 

上面下载的是我根据 ocserv 默认配置文件稍微改了改以适应教程的配置文件。

如果你想要自己改配置文件可以去看源码默认自带的配置文件: ocserv-0.11.8/doc/sample.config

配置参数解释

因为这些参数很多我也不明白,所以只挑我清楚的解释一下,有错误欢迎指出或补充。

auth = "plain[passwd=/etc/ocserv/ocpasswd]" # 这个是登陆方式,plain[passwd=/etc/ocserv/ocpasswd] 代表使用密码登陆并且从 /etc/ocserv/ocpasswd 文件中读取用户名和密码   # listen-host = [IP|HOSTNAME] # 这个代表监听的IP或主机名,注释掉即可。  tcp-port = 443 udp-port = 443 # 这个代表 TCP和UDP监听的端口 默认443,如果端口被干扰或被占用,可以更换其他端口,端口号可分开  server-cert = /etc/ocserv/ssl/server-cert.pem server-key = /etc/ocserv/ssl/server-key.pem ca-cert = /etc/ocserv/ssl/ca-cert.pem # 服务器证书和CA证书的位置  banner = "Welcome fanqiangdang.com" # 欢迎文本,链接上VPN后,客户端会提示这个消息。  max-clients = 16 # 整个VPN最大链接客户端数量,默认为 0 无限。 max-same-clients = 2 # 同账号链接VPN最大客户端数量,默认为 0 无限。  rekey-method = ssl # 加密方式 SSL  pid-file = /var/run/ocserv.pid # PID(记录进程PID)文件位置  device = vpns # 设备名(随意)  ipv4-network = 192.168.1.0 ipv4-netmask = 255.255.255.0  #ipv4-network = 192.168.1.0/24 #ipv6-network = fda9:4efe:7e3b:03ea::/48  #tunnel-all-dns = true # 是否接管DNS解析请求到VPN服务器,true代表客户端的DNS请求全部由服务器处理。 # 考虑到一些情况下DNS请求全部由海外服务器解析的话,会出现很多问题,所以默认注释,需要的请删除 # 号。 dns = 8.8.8.8 dns = 8.8.4.4 # 服务端的DNS  # route = x.x.x.x # no-route = x.x.x.x # 路由表相关的,用来分流国内外流量。 # 本教程提供的配置文件中已经默认配置好了国内外分流路由表(国内不走VPN)。  # 使ocserv兼容AnyConnect cisco-client-compat = true 

添加 VPN用户

假设你要添加的账号用户名为 doubi ,那么命令如下:

ocpasswd -c /etc/ocserv/ocpasswd doubi 

输入后,服务器会提示你输入两次密码(不会显示,盲输),如下:

# === 服务器输出示例 === # [email protected]:~/ocserv/ocserv-0.11.8# ocpasswd -c /etc/ocserv/ocpasswd doubi Enter password: Re-enter password: # === 服务器输出示例 === # 

删除 VPN用户

注意:删除/锁定/解锁 VPN用户都没有任何提示!
ocpasswd -c /etc/ocserv/ocpasswd -d doubi 

锁定 VPN用户

ocpasswd -c /etc/ocserv/ocpasswd -l doubi 

解锁 VPN用户

ocpasswd -c /etc/ocserv/ocpasswd -u doubi 

自签SSL证书

首先在当前目录新建一个文件夹(要养成不把文件乱扔的习惯)。

mkdir ssl && cd ssl 

生成 CA证书

然后用下面的命令代码(8行一起复制一起粘贴一起执行),其中的两个 doubi 可以随意改为其他内容,不影响。

echo -e 'cn = "doubi" organization = "doubi" serial = 1 expiration_days = 365 ca signing_key cert_signing_key crl_signing_key' > ca.tmpl 

然后我们生成证书和密匙:

certtool --generate-privkey --outfile ca-key.pem certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem

生成 服务器证书

继续用下面的命令代码(6行一起复制一起粘贴一起执行),其中的 1.1.1.1 请改为你的服务器IP,而 doubi 可以随意改为其他内容,不影响。

echo -e 'cn = "1.1.1.1" organization = "doubi" expiration_days = 365 signing_key encryption_key tls_www_server' > server.tmpl

然后我们生成证书和密匙:

certtool --generate-privkey --outfile server-key.pem 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

最后我们在ocserv的目录中新建一个ssl文件夹用于存放证书。

mkdir /etc/ocserv/ssl

把刚才生成的证书和密匙都移过去:

mv ca-cert.pem /etc/ocserv/ssl/ca-cert.pem mv ca-key.pem /etc/ocserv/ssl/ca-key.pem mv server-cert.pem /etc/ocserv/ssl/server-cert.pem mv server-key.pem /etc/ocserv/ssl/server-key.pem

现在刚才在当前文件夹新建的 ssl 文件夹就没用了,你可以删除它: cd .. && rm -rf ssl/

安装服务

下载我写好的服务脚本并赋予执行权限:

wget -N --no-check-certificate -O "/etc/init.d/ocserv" https://raw.githubusercontent.com/ToyoDAdoubiBackup/doubi/master/other/ocserv_debian chmod +x /etc/init.d/ocserv

设置开机启动(可选)

update-rc.d -f ocserv defaults

防火墙配置

首先我们打开 防火墙的NAT:

我们需要先查看我们的主网卡是什么:

ifconfig 

输出结果可能如下,那么我们的主网卡默认是 eth0 ,如果你是 OpenVZ,那么主网卡默认是 venet0

如果是 Debian9 系统,则默认网卡名为 ens3,CentOS Ubuntu 最新版本的系统可能为 enpXsX(X代表数字或字母)

# === 服务器输出示例 === # [email protected]:~# ifconfig eth0      Link encap:Ethernet  HWaddr xx:xx:00:00:a8:a0             inet addr:xxx.xxx.xxx.xxx  Bcast:xxx.xxx.225.255  Mask:255.255.255.0           inet6 addr: xxx::xxx:ff:fe00:xxx/64 Scope:Link           ......  lo        Link encap:Local Loopback             inet addr:127.0.0.1  Mask:255.0.0.0           inet6 addr: ::1/128 Scope:Host           ...... # === 服务器输出示例 === # 
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 如果是 OpenVZ就执行下面这个: iptables -t nat -A POSTROUTING -o venet0 -j MASQUERADE 

然后我们需要打开 ipv4防火墙转发:

echo -e "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p 

最后,我们就需要开放防火墙端口了,教程中示例文件的默认TCP/UDP端口都是 443,如果你改了 那么改为其他端口即可。

iptables -I INPUT -p tcp --dport 443 -j ACCEPT iptables -I INPUT -p udp --dport 443 -j ACCEPT # 如果你以后要删除规则,那么把 -I 改成 -D 即可。 iptables -D INPUT -p tcp --dport 443 -j ACCEPT iptables -D INPUT -p udp --dport 443 -j ACCEPT

配置防火墙开启启动读取规则

一般默认 iptbales 关机后并不会保存规则,这样开机后 防火墙规则也全都清空了,所以需要设置一下。

Debian/Ubuntu 系统:

iptables-save > /etc/iptables.up.rules echo -e '#!/bin/bash/n/sbin/iptables-restore < /etc/iptables.up.rules' > /etc/network/if-pre-up.d/iptables chmod +x /etc/network/if-pre-up.d/iptables 

以后需要保存防火墙规则只需要执行:

iptables-save > /etc/iptables.up.rules 

最后测试

最后我们需要运行下面这个命令来测试 ocserv 是否没有问题了。

ocserv -f -d 1 # 如果没有问题,那么我们就按 Ctrl + C 键退出。 

VPS输出 正常情况如下:

# === 服务器输出示例 === # [email protected]:~# ocserv -f -d 1 note: setting 'plain' as primary authentication method note: setting 'file' as supplemental config option listening (TCP) on 0.0.0.0:443... listening (TCP) on [::]:443... listening (UDP) on 0.0.0.0:443... listening (UDP) on [::]:443... ocserv[5394]: main: initialized ocserv 0.11.8 ocserv[5395]: sec-mod: reading supplemental config from files ocserv[5395]: sec-mod: sec-mod initialized (socket: /var/run/ocserv-socket.5394) # === 服务器输出示例 === # 

使用说明

/etc/init.d/ocserv start # 启动 ocserv  /etc/init.d/ocserv stop # 停止 ocserv  /etc/init.d/ocserv restart # 重启 ocserv  /etc/init.d/ocserv status # 查看 ocserv 运行状态  /etc/init.d/ocserv log # 查看 ocserv 运行日志 /etc/init.d/ocserv test # 测试 ocserv 配置文件是否正确 

配置文件:/etc/ocserv/ocserv.conf

卸载方法

假设你一开始源码编译安装的目录是:/root/ocserv/ocserv-0.11.8 ,那么这么做:

cd /root/ocserv/ocserv-0.11.8 # 进入源码编辑安装目录  make uninstall # 执行卸载命令  cd .. && cd .. rm -rf ocserv/ # 回到 /root 文件夹,删除 ocserv 源码自身  rm -rf /etc/ocserv/ # 删除配置文件目录

如果你还下载了系统服务脚本并设置开机启动了,那么需要:

rm -rf /etc/init.d/ocserv update-rc.d -f ocserv remove 

其他说明

注意:如果服务器同时安装了 锐速(ServerSpeed/LotServer),那么可能会导致 AnyConnect 连接上后无网络或者速度异常(慢),这时候请关闭锐速,BBR加速无影响

运行优化说明

建议在运行 ocserv前,执行一下这个命令,作用是提高系统的文件符同时打开数量,对于TCP连接过多的时候系统默认的 1024 就会成为速度瓶颈。

ulimit -n 51200 

这个命令只有临时有效,重启后失效,如果想要永久有效,请执行:

echo "* soft nofile 51200 * hard nofile 51200" >> /etc/security/limits.conf 

然后最后再执行一下 ulimit -n 51200 即可。

提示 wget: command not found 的错误

这是你的系统精简的太干净了,wget都没有安装,所以需要安装wget。

# CentOS系统: yum install -y wget  # Debian/Ubuntu系统: apt-get install -y wget 

参考资料:https://blog.uuz.moe/2016/04/02/cisco-anyconnect-deployment/
https://mark1998.com/anyconnect-on-debian-and-ubuntu/

阅后请多多推广本文: 使用Ocserv 手动搭建 Cisco AnyConnect VPN服务端
责任声明:本站一切资源仅用作交流学习,请勿用作商业或违法行为!如造成任何后果,本站概不负责!

赞(0)
未经允许不得转载:翻墙党 » 使用Ocserv 手动搭建 Cisco AnyConnect VPN服务端
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址