该脚本仅在debian 7+上进行过测试,使用密码方式登录,思科anyconnect客户端可连可用。
AnyConnect是思科的安全远程接入解决方案,之前只有思科的设备才支持。
ocserv(OpenConnect server)是一个OpenConnect SSL 协议服务端,0.3.0版后兼容使用AnyConnect SSL 协议的终端。
官方主页:http://www.infradead.org/ocserv/
2015-01-27
更新:依然使用0.8.9版本进行编译安装,增加了一些自定义选项,但不支持证书登录。
由于各种依赖较新,debian 7以下不支持,debian 7 x32貌似也会出现依赖错误,强烈建议使用debian 7+ x64系统。openvz需要支持打开tun/tap服务。
安装步骤:
终端输入以下命令:
wget https://raw.githubusercontent.com/fanyueciyuan/eazy-for-ss/master/ocservauto/ocservauto.sh --no-check-certificate && bash ocservauto.sh
如果使用默认安装,只需要输入初始的用户名和密码,回车即可自动完成安装。(建议使用默认安装,即对于所显示的第一个问题,选择 n. )
Starting OpenConnect VPN Server Daemon: ...
[ok]
Your server domain is 你的VPS的IP:999
Your username is 你所设置的用户名
Your password is 你所设置的密码
You can use ' sudo ocpasswd -c /etc/ocserv/ocpasswd username ' to add users.
You can stop ocserv by ' /etc/init.d/ocserv stop '!
Boot from the start or not, use ' sudo insserv ocserv ' or ' sudo insserv -r ocserv '.
(在我的情形,系统里没有insserv命令,这无关紧要)
要新建用户, 输入以下命令:
sudo ocpasswd -c /etc/ocserv/ocpasswd username
这里的username是新建的用户名,建议自定义。接着输入两次同样的密码,完成新建用户。
使用步骤:
这里以安卓为例,由于是自签证书,需要关掉客户端设置中的“阻止不信任的服务器”。
服务器需要填写的是 自己服务器的地址加端口 例如9.9.9.9:999 必须要填写自己的端口!
附加说明:
所有配置文件统一放到了 /etc/ocserv/ 文件夹下,管理脚本为/etc/init.d/ocserv 。可自行修改配置,修改之后,可以使用本脚本重启服务。
/etc/init.d/ocserv restart
现在提供免费证书的商家也不少 例如 Startssl等。
证书申请参考Nginx证书申请,只需将对应的cer、key 文件重命名为server-cert.pem、server-key.pem,并放到/etc/ocserv/文件夹下面。想要证书方式登录,请先自行折腾……
BUG:在多于四重路由/NAT时,某些手机会发生这种情况:可以登录,但是时间一久必须重新登录,否则无法联网。
如果在此步骤遇挫:
root@VPS1:~/ocserv-0.8.9# ./configure
则
root@VPS1:~/ocserv-0.8.9# apt-get install libwrap0-dev libpam0g-dev libdbus-1-dev libreadline-dev libnl-route-3-dev libprotobuf-c0-dev libpcl1-dev libopts25-dev autogen libseccomp-dev -y
root@VPS1:~/ocserv-0.8.9# apt-get install libgmp-dev libgnutls28-dev -y
root@VPS1:~/ocserv-0.8.9# ./configure (这次就OK了)
我是在UBUNTU14.0.4 32位VPS上安装成功的。
from http://www.fanyueciyuan.info/fq/ocserv-debian.html,
http://archive.is/UGhFa (我对其网页拍了一个“快照”)
(ocserv一键安装脚本
wget git.io/p9r8 --no-check-certificate -O ocservauto.sh && bash ocservauto.sh
wget git.io/ocservauto -O- --no-check-certificate|bash -
sudo ocpasswd -c /etc/ocserv/ocpasswd 999
bash ocservauto.sh gc
bash ocservauto.sh rc
/etc/init.d/ocserv restart
第2个一键安装脚本 for debian 7。
sslVPNAuto script
wget
gcc
make
build-essential
, etc.--------------------------------
https://github.com/st286/ocserv-openconnect-anyconnect/ (可用)
--------------------------------
第6个一键安装脚本 for debian 10
https://github.com/lllvcs/ocserv (可用)
---------------------------------------------------------------------------
第1个一键安装脚本 for CentOS&RedHat 7
这是 ocserv 在 CentOS 7 和 RHEL 7 的一键安装脚本,使用 epel 的二进制源,可以在最小化安装环境的 CentOS 7 和 RHEL 7 下一键部署 ocserv。
支持自动判断 firewalld 和 iptables,安装前请确保其中之一在运行。
- 支持自动判断防火墙,请确保 Firewalld 或者 iptables 其中一个是 active 状态;
- 默认采用用户名密码验证;
- 默认配置文件在 /etc/ocserv/ 目录;
- 安装时会提示你输入端口、用户名、密码等信息,也可直接回车采用默认值,密码是随机生成的;
- 安装脚本会关闭 SELINUX;
- 自带路由表,只有路由表里的 IP 才会走 VPN,如果你有需要添加的路由表可自行添加,最多支持 200 条;
- 如果你有证书机构颁发的证书,可以把证书放到脚本的同目录下,确保文件名和脚本里的匹配,安装脚本会使用你的证书,客户端连接时不会提示证书错误。
https://github.com/travislee8964/Ocserv-install-script-for-CentOS-RHEL-7
https://github.com/codescope/ocserv ,for centos
---------------------------------------------------------------
使用 ocserv-docker 享受自由网络
起因和问题
在家的时候, 为了能够看到 twitter, youtube 等国外网站, 我会购买一个商业的 VPN 或者科学上网的服务来解决自己的问题, 虽然有一点点不适应我自己的所有需求, 但总该能解决我绝大部分问题. 在公司的时候, 为公司建立了通过 SSL 通道来进行科学上网, 业务部门都只需要网页加特定翻墙的问题也可以完美解决. 让我折腾出 ocserv-docker 的原因是因为:- 我不想又经历一次 “十八大” 让我原来的 hosts 方案失效后的无奈
- 给公司再提供一个备用的科学上网的方案
- 顺便将我现在手机端科学上网的体验更加流畅
- 能够让我自己与我老婆以及朋友等等各种各样的手持设备上能方便科学上网
- 能够让拥有自己服务器的我那些朋友们, 能极度方便搭建自己的科学上网
他带来的特点是
- ocserv 相对 OpenVPN 来说其拥有较强稳定, 不会轻易被封. 因为其使用 Cisco AnyConnect 的协议, 有很多大型商业公司用着.
- Android, iOS, Mac OS, Windows 都有 Cisco 所提供的 AnyConnect 的客户端, 天然全平台支持啊, 并且 iOS 无需越狱, Android 无需 Root.
- 完美的自动重链, 手机上开启后就可不管了
- 可服务器分发路由, 客户端啥都不用做就可选择性翻墙
- docker 给部署 ocserv 带来了 “Step1: 安装 docker; Step2: docker run; Step3: 客户端链接使用” 的极简单部署.
About ocserv-docker
寻找到 ocserv 这个项目其实挺偶然的, 最初是从 twitter 上看到 AnyConnect 这个词, 然后顺藤摸瓜到 ocserv 这个开源实现. 第一次部署一个 ocserv 给自己使用的时候那是相当的痛苦, 从下载源代码编译, 到生成自用的证书, 到生成账户密码, 到寻找如何自动重连, 一个一个的坑摆在面前. 当我把这些弄完之后, 发现整个安装步骤如果使用 docker 来组织一个 image 然后直接从 Docker Hub 上下载部署该是多么方便. 也正是因为那段时间刚刚将公司的抓取服务器上的项目全部从全脚本安装迁移为 docker + sshkit 管理, 对 docker 有了一点熟悉才决定这么干.因为 ocserv-docker 是使用 docker 进行部署的, 所以安装步骤就如 ocserv-docker 在 GitHub 中 README 所描述的那样, 保证联网 Copy-Paste 三行代码执行就完成了, 下面说对一些特殊点的设计的想法介绍一下.
证书, 密钥
第一次折腾 ocserv 所需要的证书, 密钥的时候感觉好麻烦, 好繁琐, 但是当你自己从源代码编译部署过 5/6 次后, 其实也就基本上理解了. 在 ocserv-docker 中, 为了让第一次使用他的人不用被这繁杂的东西所烦恼所以只留下一个入口, 那就是./certs/
中的两个 tmp 文件, 修改好你想要修改的基础信息(或者保持不变), 最终会使用这两个模板文件, 在 image 中的 /opt/certs
目录中存放生成好的 certs 文件, 一个 ca-key.pem
一个 server-key.pem
. 单独将 certs 文件放出来的原因是, 可以在运行 images 通过 volumn 重新挂载这个位置将自己的新的 certs 文件应用上去, 如果没有自己的 certs 文件, 那么就无需关心了.用户名, 密码
其实我也知道将密码存在代码中不好, 也可以将其优化成为每一次 build 都自动生成一个新密码, 或者完全将密码文件取消. 选择将初始化两个账户, 并且使用简单密码的原因在于两个:- 对新用户而言, 我不想他们在第一次使用 ocserv 的时候, 还要先去了解下
ocpasswd
命令怎么用, 先给他们一个默认账户密码可以直接使用为好. - 对于我自己的需求而言, 我会部署好多个, hk/jp/us/sg 都会有服务器, 我不想每个服务器都去设置一下用户密码.
ocpasswd
命令, 然后编辑一下 ./ocserv/ocpasswd
即可完成自己的定制.自动分发的路由
这一块是我现在的短板, 我是直接借用了 kevinzhow/route.sh, 因为自己还不知道如何去寻找这样的国外的顶级 IP, 所以我偷了点懒, 直接使用了他人弄好的, 只是会在自己的使用过程中碰到新的 IP 进行一点补充.因为 ocserv 对自动分发的路由数量有限制(具体数量忘了, 大概是 30~50 条之间), 所以想要完美的解决国内国外翻墙是比较困难的, 但囊括大多数的国外的子网掩码为 255.0.0.0 的 IP 应该还是可以解决很多问题的, 这也算这个方案的一点点缺陷, 好在这个影响现在对我不明显, 基本上没有~
PS
因为最近将自己的 Blog 从 octopress 更换为 Jekyll, 所以原本集成的 Disqus 插件没了, 需要花点时间处理一下. 在这之前, 有啥问题就直接 twitter: @wyatt_pan 吧请安装 Docker 1.0+ 并且操作系统所使用的 Linux Kernal 在 3.8+ 如果无法选择, 那么请使用 Ubuntu 14.04 LTS 的 OS.
FROM http://wppurking.github.io/2014/10/11/use-ocserv-docker-to-enjoy-freedom-internet.html
---------------------------------------------------
用于初始化ocserv的Dockfile文件(我按此文方法,翻墙成功)
用途
因为安装一个 Open Connect 的步骤实在太麻烦了, 特别对于新手, 所以特意参考了 jpetazzo 的 dockvpn 弄了一个 ocserv 的. 此项目的原因和一点点介绍可见 使用 ocserv-docker 享受自由网络有啥问题可以直接 @wyatt_pan
简单部署
在 安装好 Docker并且正常启动 Docker 后:cd ~
git clone https://github.com/wppurking/ocserv-docker
(将当前 repo 下载, 拥有可调整的 ocserv.conf 配置文件以及 ocpasswd 用户密码文件)- docker pull wppurking/ocserv
docker run -d --privileged -v ~/ocserv-docker/ocserv:/etc/ocserv -p 443:443/tcp wppurking/ocserv
( ocserv 的一些功能需要 Docker在 privileged权限下处理.)docker ps -aq | xargs docker logs
: 查看运行日志, 检查是否正常运行(可重复执行).
listening (TCP) on 0.0.0.0:443...
listening (TCP) on [::]:443...
listening (UDP) on 0.0.0.0:443...
listening (UDP) on [::]:443...
使用
- 初始化好的两个账户: wyatt:616 holly:525
- 如果主服务器上开启了 iptables, 一定要记得将 443 端口的 tcp 与 udp 都开放
- 已经做了其能够处理的下发路由数量 (ocserv.conf 中, 感谢: kevinzhow 的 route.sh 和 ip_cook.rb )
- 接下来 就是 AnyConnect 的客户端了. Win, Mac, Linux Link1 (Cisco 官方需要注册...), iOS, Android
- 因为我们自己生成的 CA 证书是没有权威组织认证的, 所以 AnyConnect 需要接受这些 "不信任的 VPN" :P
自定义证书, 密钥
因为是构建一个独立的 box 进行分发, 方便快速部署一个 ocserv, 所以将证书, 密钥, 用户都集成在里面了, 此刻方便使用. 如果对于有担心的, 可以docker run -t -i wppurking/ocserv bash
进入到 box 中使用 certtool
重新进行处理, 具体操作步骤参考 [原创]linode vps debian7.5安装配置ocserv(OpenConnect server)证书是在 Docker Build 的过程中自动生成的, 其生成的目的地为
/opt/certs
成功更换 certs 的例子用户名
为了使新手能够最快的使用上 AnyConnect (也方便我自己同一设备能方便的链接多个不同地域的 VPS) 我预先设置了两个初始化的账号密码, 但同时将用于提供账号密码的ocserv/ocpasswd
文件放在 Box 外面, 运行 Container 时使用 Volume 挂在进去, 这样方便熟悉 Docker 的用户能够方便的使用ocpasswd
命令修改或者重新生成自己的用户密码.提供一个非常简单的更换密码操作, 复制命令就好了(建立在按照上面的操作基础上哈):
新添加用户:
docker exec -ti ocserv-docker ocpasswd -c /etc/ocserv/ocpasswd your_username
Enter password:
Re-enter password:
这个的原理是借用 docker 运行中的 container , 在其里面运行 ocpasswd
改变 Volumn 进去的 ./ocserv/ocpasswd
文件内容, 所以当你运行完这行命令, 本机(非 container 中)的 ./ocserv/ocpasswd
的文件内容会真实发生变化。然后,
允许转发:
修改/etc/sysctl.conf,
net.ipv4.ip_forward=1
sysctl -p
iptables -t nat -A POSTROUTING -j MASQUERADE
运行iptables命令,开放tcp端口443:
iptables -I INPUT -p tcp -m tcp --dport 443 -j ACCEPT,意思是开放tcp端口443.
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
清理掉预设的两个用户名
直接打开./ocserv/ocpasswd
删掉 wyatt/holly 开头的两行就好了. 信息
- Box Size: 384.6 MB (拿空间换时间, 国外网络快)
- 基础 Box: ubuntu:latest (192.7 MB)
- 测试过的环境:
- [Linode 1G Ubuntu 14.04 LTS]
- [Vultr 768MB Ubuntu 14.04 LTS]
- [DigitalOcean 512MB Docker 1.2.0 on Ubuntu 14.04]
Refs
- ocserv 0.8.2 Manual
- [原创]linode vps debian7.5安装配置ocserv(OpenConnect server)
- Install Cisco AnyConnect Server on a Generic Linux Server
- AnyConnect 带来 iPhone 上的新生活
- Install Ocserv on CentOS 6.5
- Gnutls 3.1.23 on Ubuntu 14.04
问题
- 在某台 Linux Kernal 为
Linux xxxx 3.13.0-24-generic #46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux
的服务器上, 无论 Docker run 哪一个 Box 都无法正常运行. Docker 的问题我现在还无能无力啊... 错误信息 - 拥有官方的 libhttp-parser-dev 但仍然 local http-parser: no
- Radius, GSSAPI, LZ4 没有编译进去
Dep on
PAM auth backend: yes
Radius auth backend: no
GSSAPI auth backend: no
Anyconnect compat: yes
TCP wrappers: yes
systemd: no
(socket activation)
seccomp: yes
Compression: yes
LZ4 compression: no
readline: yes
libnl3: yes
glibc (sha2crypt): yes
local talloc: yes
local protobuf-c: yes
local PCL library: no
local libopts: no
local http-parser: no
FROM https://github.com/wppurking/ocserv-docker
-----------------------------------------------------------
ocserv
OpenConnect VPN server (ocserv) works best of all means. It is fast and stable.
To ease the server-side setup, I used https://github.com/wppurking/ocserv-docker on a vps box . By the time I was setting it up, there was some dependency errors, so I forked it into my own GitHub repo: https://github.com/shichao-an/ocserv-docker, fixed the errors, and built a Docker image: https://hub.docker.com/r/shichaoan/ocserv-docker/. I ran the following commands on an Ubuntu 14.04 system that uses UFW:
# Add UFW rules
sudo ufw allow 443/tcp
sudo ufw allow 443/udp
sudo service iptables-persistent save
sudo ufw reload
# Install Docker image
mkdir -p ~/ocserv-docker/ocserv
touch ~/ocserv-docker/ocserv/ocpasswd
wget https://raw.githubusercontent.com/shichao-an/ocserv-docker/master/ocserv/ocserv.conf -O ~/ocserv-docker/ocserv/ocserv.conf
sudo docker run --name ocserv -d --privileged -v ~/ocserv-docker/ocserv:/etc/ocserv -p 443:443/tcp shichaoan/ocserv-docker
# Add user and prompt for password
sudo docker exec -it ocserv ocpasswd shichao
# Debug
sudo docker logs ocserv
sudo docker exec -ti ocserv /bin/bash
Then, you can install Cisco AnyConnect clients on both your computer and mobile devices and try to connect your server.
-------------------------------------
通过 Docker 部署 OpenConnet服务器(我按此文方法,翻墙失败)
什么是 OpenConnect Server
OpenConnect server (ocserv) 是一个基于 SSL 的 VPN 服务器。它是基于 OpenConnect SSL VPN 协议实现的,同时(实验性质)兼容使用 Cisco AnyConnect SSL VPN 协议的客户端。
如何部署服务器
考虑到架设 OpenConnect Server 对于大多数用户来说比较困难,所以我制作了一个 Docker 镜像。以下所有教程都是基于该 Docker 镜像的。如果你不知道什么是 Docker,请先访问 Docker 的网站了解相关信息。如果你对镜像文件不放心,可以在以下地址找到该镜像的原始 Dockerfile 和相关信息:Docker Hub,GitHub
开始前的准备工作
- 知道并了解 Docker 的运行原理和机制
- 掌握基本的服务器架设能力,熟悉 Linux 命令,并且在服务器上成功部署了 Docker
- 如果你使用的是 VPS 的话,请联系 ISP 确认是否支持 TUN 设备
OpenConnect Server 的安装
一条如此简单的命令,就可以把 OpenConnect Server (ocserv) 安装到你的服务器了:1
| docker pull tommylau/ocserv
|
1
| docker run --name ocserv --privileged -p 443:443 -p 443:443/udp -d tommylau/ocserv
|
test
的用户。如果你只需要临时使用一下,不关心安全问题的话,那么看到这里就可以结束了。如果你需要更多的设置,请继续阅读。用户操作
所有的用户操作必须在实例运行的时候才可以进行。如果你的 Docker 实例名不是
ocserv
的话,请根据实际情况自行调整。添加用户
假如说,你想创建一个名为tommy
的用户,使用如下命令:1 2 3 | docker exec -ti ocserv ocpasswd -c /etc/ocserv/ocpasswd tommy Enter password: Re-enter password: |
删除用户
删除用户与添加用户类似,唯一的区别就是在用户名前面增加-d
参数.1
| docker exec -ti ocserv ocpasswd -c /etc/ocserv/ocpasswd -d test
|
NO_TEST_USER
,那么上述命令将帮你删除默认的 test
用户。修改密码
修改密码与添加用户的操作是完全一致的,请参考上面添加用户的章节。高级使用
这个部分会介绍一些高级的使用方法,包括通过环境变量的设置来配置不同的 CA 名称等。环境变量
对于tommylau/ocserv
这个 Docker 镜像来说,所有的环境变量都是可选的,也就意味着你拥有一个开箱即用的产品,而不用输入任何参数。当然,如果你是一个定制狂或者有强迫症,那么下面就是为你准备的。CA_CN
,这是用于生成 CA(Certificate Authority) 证书的名称 (common name)。CA_ORG
,这是用于生成 CA 证书的组织名称 (organization name)。CA_DAYS
,这是用于生成 CA 证书的有效期。SRV_CN
,这是用于生成服务器证书的名称 (common name)。SRV_ORG
,这是用于生成服务器证书的组织名称 (organization name)。SRV_DAYS
,这是用于生成服务器证书的有效期。NO_TEST_USER
,当这个变量设置为非空时,将不会创建 test
用户。你必须要手动添加你自己的用户,并设置密码。默认情况下,系统会自动创建用户名为 test
,密码也为 test
的用户。上述变量的默认值:
变量 | 默认值 |
---|---|
CA_CN | VPN CA |
CA_ORG | Big Corp |
CA_DAYS | 9999 |
SRV_CN | www.example.com |
SRV_ORG | My Company |
SRV_DAYS | 9999 |
一些运行范例
使用开箱即用的方式,用户名和密码均为test.
1
| docker run --name ocserv --privileged -p 443:443 -p 443:443/udp -d tommylau/ocserv
|
my.test.com
,组织为 My Test
,有效期为 365
天的实例.1
| docker run --name ocserv --privileged -p 443:443 -p 443:443/udp -e SRV_CN=my.test.com -e SRV_ORG="My Test" -e SRV_DAYS=365 -d tommylau/ocserv
|
My CA
,签发组织为 My Corp
,有效期为 3650
天的实例.1
| docker run --name ocserv --privileged -p 443:443 -p 443:443/udp -e CA_CN="My CA" -e CA_ORG="My Corp" -e CA_DAYS=3650 -d tommylau/ocserv
|
1
| docker run --name ocserv --privileged -p 443:443 -p 443:443/udp -e CA_CN="My CA" -e CA_ORG="My Corp" -e CA_DAYS=3650 -e SRV_CN=my.test.com -e SRV_ORG="My Test" -e SRV_DAYS=365 -d tommylau/ocserv
|
test
用户.1
| docker run --name ocserv --privileged -p 443:443 -p 443:443/udp -e CA_CN="My CA" -e CA_ORG="My Corp" -e CA_DAYS=3650 -e SRV_CN=my.test.com -e SRV_ORG="My Test" -e SRV_DAYS=365 -e NO_TEST_USER=1 -v /some/path/to/ocpasswd:/etc/ocserv/ocpasswd -d tommylau/ocserv
|
NO_TEST_USER=1
,ocpasswd 文件将不会被创建,进而导致到服务器启动后立即停止。你必须要像上面示例中那样,使用 Docker 的 -v
挂在参数,指定一个 ocpasswd 文件到 /etc/ocserv/ocpasswd
。from http://lhg.hk/2015/02/12/deploy-openconnect-server-with-docker/ ,
https://hub.docker.com/r/tommylau/ocserv/,
https://hub.docker.com/r/tommylau/ocserv/~/dockerfile/,(从这个页面可看出,他这个docker镜像是基于debian系统制作的。)
项目地址:https://github.com/TommyLau/docker-ocserv
---------------------------------------------
openconnect client for openwrt
这是一份关于如何在openwrt路由器上安装使用openconnect客户端的简单说明。
系统环境:openwrt barrier breaker 14.07
安装: opkg update
opkg install luci-proto-openconnect openconnect
配置:
在interface中建立一个新接口,可命名为openconnect,协议选择OpenConnect(CISCO AnyConnect)。
必要填写的项目是,服务器地址以及端口、服务器证书的SHA1hash、用户名、密码。
关于SHA1has获取
简单的方法是,可以在浏览器中打开服务器地址,例如https://www.baidu.com:443并点击绿色小锁(自签证书则是红色叉号),点击证书信息,里面有sha1码,去掉空格即可。
右侧防火墙也需要点选,wan选项。
填写完后,保存修改,就可以点击连接测试一下了。
附:OpenWrt是一个用于嵌入式设备、高扩展性的GNU/Linux发行版。殊于一般的,它是从零编写、功能齐全、便于修改的路由操作系统。实际上,也就是说openwrt是一款由linux内核驱动、纯净新颖的嵌入式系统。
--------------------------------
在debian7上,编译ocserv
AnyConnect 大概是 iOS 上最好用的VPN了,它可以做到不断线、按需自动连接。
好吧,其实还是会断线的,但是它会自动重连,所以你从3G切换到Wi-Fi、从飞行模式到正常状态,它都会很快重新连接上。
我自己体验下来感觉还是挺不错的,下面就大致讲一下怎么在 Debian 上最速搭建ocserv服务器。
STEP1. 安装依赖包
- 修改
/etc/apt/sources.list
,使用testing版本的包,使用testing的版本可以获得更新的软件版本,但是为了稳定,完成这一步以后记得改回原来的,例如wheezy
- 更新
sudo apt-get update
- 安装依赖包
sudo apt-get install build-essential pkg-config libgnutls28-dev -y
STEP2. 安装ocserv
- 下载ocserv & 解压(目前最新是 0.3.3 版本,查看全部可下载版本 戳这里 )
wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.3.3.tar.xz; tar xvf ocserv*
- 编译 & 安装(如果configure过程报错,那就看看提示是缺了什么,apt-get装上即可)
cd ocserv*; ./configure; make; make install
STEP3. 基本配置
- 根据 手册 配置配置文件,或者下载这份我的配置,里面包含了我配置的路由表 下载
- 如果你下载了我的配置文件,请记得修改auth、server-cert、server-key部分,server-cert和server-key可以去startssl申请免费的。
- 配置iptables
自动调整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 端口
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT; sudo iptables -I INPUT -p udp --dport 443 -j ACCEPT;
- 运行时可以先使用下面的命令让它运行在前台,测试配置是否正确。
ocserv -fd 1 -c {ocserv.conf}
- route部分的配置来自 此项目 (好吧,也是我弄的= =) route 只能最多 64 条,所以只能用 /8 这样的暴力路由,只求尽可能覆盖被墙的 IP 段
HINTS.
- 关于生成用户名密码
使用用户名密码验证的话,可以使用
ocpasswd
来生成用户名密码对,或者用openssl
生成加密后的密码123:openssl passwd -crypt 123
- 关于PC平台的客户端
手机和电脑都能用,Linux、OS X 可以用 openconnect 来连接。OS X 上就
brew install openconnect
即可,但是要先装 tun/tap ,或者直接用 cisco 官方的 client ,但是不一定能用,兼容性还是听有问题的,哦对,还有付费的 shimo 也可以。
- 关于证书认证
使用用户名密码认证的话是每次连接都需要手动输入密码的,这是个 feature... 想要免输入密码的话就要用证书认证,这就要求你自建 CA 证书来签发服务器证书和客户端证书了,详细步骤在手册中都写了,需要注意的点就是别忘了设置 revoke list,不然签发了证书就没办法取消了 lol
我是觉得自己做 CA 比较蛋疼,要是手机上没有导入这个 CA 就会被告知不可信任的 VPN,默认情况会无法连接,输个密码也不是多麻烦的事情,毕竟 AnyConnect 很少会需要手动连接,自动重连的时候是有 session 的,不用再输入密码。
相关:https://github.com/rankjie/anyconnect-gfw-list
---------
相关帖子:http://briteming.blogspot.jp/2015/02/centos-65ocservcisco-anyconnect.html
ocserv的一个问题
------------
OpenConnect VPN server的安装
我们可以安装OpenConnect服务器包:
sudo apt-get install ocserv
我们通过编辑OpenConnect服务器的配置文件来配置它:
sudo vi /etc/ocserv/ocserv.conf
我们要做的第一件事就是注释掉可插拔的身份验证模块(PAM)。 通过在行的开头插入一个井号来做到这一点。 我们只需将密码放在一个文件中即可进行身份验证。 您指定为:
#auth = "pam[gid-min=1000]"
auth = "plain[/etc/ocserv/ocpasswd]"
接下来我们要改变的是服务器证书和密钥的位置。 我们从Let’s Encrypt获得了我们的证书,所以我们必须给出Let’s Encrypt的证书和密钥的位置:server-cert = /etc/letsencrypt/live/gateway.example.com/fullchain.pem
server-key = /etc/letsencrypt/live/gateway.example.com/privkey.pem
当然,请记住,在上面将gateway.example.com更改为您自己的服务器名称。 /etc/letsencrypt/live/中的文件实际上是指向最新证书和密钥的符号链接。 因此,在续订证书时,您无需更改这些行。 他们总是会指向最新的证书和密钥。
我们必须做出一些改变。 我们必须将try-mtu-discovery从false更改为true :
try-mtu-discovery = true
然后是我们希望它使用的IP地址池。 您记得,我们在此示例中使用的是10.11.0.0/24 。
ipv4-network = 10.11.0.0
您可以使用该范围,只要它是免费的,但您可能想要选择另一个。 如果这样做,请相应地调整防火墙的NAT规则。
这就是OpenConnect将向客户发出的IP地址范围。
我们将使用OpenDNS服务器,因此删除默认值并将其更改为:
dns = 208.67.222.222
dns = 208.67.220.220
我们不需要任何特殊路由,因此通过在行的开头放置一个哈希符号来注释掉它们:
#route = 10.10.10.0/255.255.255.0
#route = 192.168.0.0/255.255.0.0
#no-route = 192.168.5.0/255.255.255.0
这就是配置完成的变化。
按Esc退出插入模式,然后键入:wq将文件写入磁盘并退出编辑器。
我们将为客户端使用用户名和密码验证。 您可以使用ocserv附带的实用程序生成那些名为ocpasswd的实用程序:
sudo ocpasswd -c /etc/ocserv/ocpasswd derek
选择密码并重新输入。
我们需要做的下一件事是允许Linux内核转发。 我们通过编辑系统控制配置来做到这一点:
sudo vi /etc/sysctl.conf
取消注释下面显示的行,以便它允许在Linux内核中转发数据包:
net.ipv4.ip_forward=1
将其写入磁盘,然后退出编辑器。
通过执行以下操作,立即使其处于活动状态,而不是在下次重新启动
sudo sysctl -p
就是这样。 这就是服务器完成的所有配置。 所以现在我们就这样设定:
sudo systemctl stop ocserv.socket
sudo systemctl start ocserv.socket
这就是OpenConnect VPN server的安装。
---------
安装 ocserv & 准备系统
网上许多方法都是通过手动编译源代码包的方式安装,然而现在至少对于 Debian 系的系统来说已经有了编译好的软件包了,详情见 Distribution Status,对于 Debian 系服务器来说(比如本例的 Ubuntu)直接一条指令即可(非常感谢维护这个包的:Aron Xu,Liang Guo 和 Mike Miller):
$ sudo apt install ocserv -y
之后我们需要打开系统的转发功能,在 /etc/sysctl.conf
中加入如下行:
net.ipv4.ip_forward=1
$ sysctl -p
打开 NAT 功能:
-----------------------------------------------------------------------------------------
使用Linux系统下的OpenConnect SSL VPN客户端连接到VPN Server
本文将介绍OpenConnect SSL VPN客户端的安装和使用并且连接到VPN Server,连接Cisco的AnyConnect SSL VPN和Juniper Pulse Connect Secure。OpenConnect是最初创建的SSL VPN客户端,用于支持Cisco的AnyConnect SSL VPN,然后它已被移植到支持Juniper SSL VPN,现在称为Pulse Connect Secure。
在Linux上安装OpenConnect SSL客户端
现在让我们看一下在Linux发行版上安装OpenConnect SSL Client的不同方法:
1、在Arch Linux上安装OpenConnect SSL客户端
对于Arch Linux用户及其派生发行版,你可以从官方Pacman存储库安装openconnect:
sudo pacman -S openconnect
使用yaourt也可以这样做:
syaourt -S openconnect
2、在Debian/Ubuntu上安装OpenConnect SSL客户端
对于Debian及其衍生产品,请使用apt包管理器安装openconnect包:
sudo apt-get install openconnect
3、在CentOS/RHEL上安装OpenConnect SSL客户端
对于CentOS和RHEL,可以从epel存储库获得openconnect包,添加存储库,然后安装openconnect包:
sudo yum install epel-release
sudo yum install openconnect
4、在Fedora上安装OpenConnect SSL客户端
对于Fedora,该工具也可以从epel获得,只是包管理器的名称发生了变化:
sudo dns install openconnect
5、在macOS上安装OpenConnect SSL客户端
对于macOS用户,请使用brew安装openconnect包
$ brew install openconnect
使用Openconnect连接到SSL VPN服务器(手动)
在操作系统上成功安装openconnect软件包后,你应该已准备好连接到SSL VPN服务器,即Cisco的AnyConnect SSL VPN和Juniper Pulse Connect Secure。
简单连接遵循以下syntax:
$ sudo openconnect -u user --passwd-on-stdin vpnserver
系统将提示你输入密码,请参阅以下示例:
$ sudo openconnect 192.168.1.1
POST https://192.168.1.1/
Connected to 192.168.1.1:443
SSL negotiation with 192.168.1.1
Enter 'yes' to accept, 'no' to abort; anything else to view: yes
Connected to HTTPS on 192.168.1.1
Got HTTP response: HTTP/1.0 302 Object Moved
GET https://192.168.1.1/
Connected to 192.168.1.1:443
SSL negotiation with 192.168.1.1
Server certificate verify failed: signer not found
Connected to HTTPS on 192.168.1.1
Got HTTP response: HTTP/1.0 302 Object Moved
GET https://192.168.1.1/+webvpn+/index.html
SSL negotiation with 192.168.1.1
Connected to HTTPS on 192.168.1.1
Please enter your username and password.
GROUP: [ANYCONNECT_PROFILE]
Please enter your username and password.
Username:jmutai
Password:
POST https://192.168.1.1/+webvpn+/index.html
Got CONNECT response: HTTP/1.1 200 OK
CSTP connected. DPD 30, Keepalive 20
Connected as 192.168.4.2, using SSL
Established DTLS connection (using GnuTLS). Ciphersuite (DTLS0.9)-(DHE-RSA-4294967237)-(AES-256-CBC)-(SHA1).
使用Bash脚本使用Openconnect连接到SSL VPN服务器
我写了一个bash脚本来简化连接,以方便连接到Cisco Autoconnect SSL VPN服务器,根据你的shell将它放到~/.zshrc或~/.bashrc中:
myvpn () {
local vpn_server="vpnserver"
local vpn_username="user"
local vpn_password="password"
# try connect
while true; do
retry_time=$(($(date +%s) + 30))
sudo openconnect \
-u $vpn_username $vpn_server --non-inter --passwd-on-stdin <<< "$vpn_password"
current_time=`date +%s`
if [ $current_time -lt retry_time ]; then
sleep $(( $retry_time - $current_time ))
fi
done
}
提供正确的变量并保存文件,现在,每次要连接到VPN时,请按名称调用该函数:
$ myvpn
Juniper Pulse客户端
要连接到Pulse Connect Secure服务器,你需要知道其证书的SHA-1:
# openconnect --servercert=sha1:<HASH> \
--authgroup="single-Factor Pulse Clients" \
--protocol=nc <VPN_SERVER_ADDRESS>/dana-na/auth/url_6/welcome.cgi \
--pid-file="/var/run/work-vpn.pid" --user=<USERNAME>
结语
以上就是在Linux和macOS上安装和使用OpenConnect SSL客户端的内容,实现起来也非常的容易。
--------------------------------------------------------
Anyconnect VPN使用PAC来智能分流
简述
这篇文章会讨论使用AnyConnect VPN的智能分流方案,包括广为人知的路由表和更加合理和科学的PAC代理方案。本文承接上文的使用场景借助openwrt路由器实现移动网络下的智能翻墙,即移动网络下的智能分流方案,OpenConnect Server(ocserv)可以部署在openwrt路由器或者像我这样部署在路由器后面的cubieboard
上面,对于国外的ocserv
是无法直接使用这里的PAC代理方案的。
本文涉及的场景和前提
还是有不少人有疑问啊,这里声明一下。
本文使用场景为上篇 借助openwrt路由器实现移动网络下的智能翻墙 的后续。讨论的是非越狱的iOS在移动网络下的翻墙方案,当然也排除使用surge的情况。
该场景假设你已经在国外部署好shadowsocks服务端或者各种VPN服务端,并且通过家里的路由器或者服务器作为国内节点部署http/socks5代理+翻墙客户端(shadowsocks client或者各种VPN client),该国内节点为移动网络下的移动设备提供翻墙方案,实现方案是通过VPN技术让iOS设备连接国内节点,并通过PAC代理来分流,实现的效果是: 需要翻墙的网站通过国内节点的shadowsocks tunnel或者VPN去访问,不需要翻墙的网站通过国内节点访问。
这样的实现方案主要是由于以下前提或者约束:
- 未越狱iOS在移动网络下(非Wi-Fi环境)
- 无法安装shadowsocks
- surge 99$肉痛
- 最简单易实施的方案是VPN
- 如何在VPN下取得较好的分流体验
- 这正是本文讨论的
具体请参见前文 借助openwrt路由器实现移动网络下的智能翻墙。
为什么要使用Anyconnect VPN
Anyconnect VPN是cisco公司推出的企业级VPN解决方案,和我们熟知的众多VPN技术相比,特点在于其稳定,因为AnyConnect的VPN协议默认使用UDP DTLS作为数据传输,但如果有什么网络问题导致UDP传输出现问题,它会利用最初建立的TCP TLS通道作为备份通道,降低VPN断开的概率。之前用过pptp,l2tp,ikev2等VPN,现在则想折腾一下Anyconnect VPN。
本文不涉及具体的部署和配置,部署请参见折腾笔记:架设OpenConnect Server给iPhone提供更顺畅的网络生活。
还在用路由表分流?来用PAC吧!
当我浏览了不少网上的Anyconnect VPN搭建方案时,发现所有的作者都提到了AnyConnect VPN支持向客户端推送路由表的特性,故所有的分流方案也都是采用了这样的方法,经常可以在配置文件中看到这样的配置:
1
2
3
4
5
6
7
8
9
10
11
12
13
# Facebook
route = 58.26.0.0/255.255.0.0
route = 210.149.0.0/255.255.0.0
route = 31.13.0.0/255.255.0.0
route = 66.220.0.0/255.255.0.0
# Google
route = 8.6.0.0/255.255.0.0
route = 8.8.0.0/255.255.0.0
route = 8.15.0.0/255.255.0.0
route = 8.34.0.0/255.255.0.0
route = 8.35.0.0/255.255.0.0
...
甚至还有这样的项目ocserv-cn-no-route
不说Anyconnect VPN客户端对路由表大小有限制,要改源码编译且最大也只有两百多条这个固有的缺点,但是路由表不精确、覆盖面太小这都是我所不能忍受的。难道cisco推出的Anyconnect都不能支持proxy吗?难道不能用PAC来分流吗?
答案无疑是否定的。在cisco的官网上我们可以看到:
Proxy Auto-Configuration File Generation for Clientless Support
Some versions of the ASA require AnyConnect configuration to support clientless portal access through a proxy server after establishing an AnyConnect session. AnyConnect uses a proxy auto-configuration (PAC) file to modify the client-side proxy settings to let this occur. AnyConnect generates this file only if the ASA does not specify private-side proxy settings.
所以Anyconnect不仅支持proxy,还直接支持proxy auto-configuration
,也就是我们的PAC
。既然Anyconnect VPN支持,那么接下来作为开源Anyconnect VPN的实现,就要看OpenConnect Server(ocserv)支不支持了。答案是,ocserv没有让我们失望。
配置
这个配置是如此简单。我们只需要打开ocserv的配置文件,添加一条:
1
proxy-url = http://tyr.gift/anyconnect.pac
上述配置的含义是:客户端默认还是会把所有的流量推给服务器,Anyconnect VPN 服务器使用pac文件中指定的规则进行代理。实现的场景是:iPhone将所有流量就近路由到家里的openwrt上,openwrt根据pac规则选择本地连接还是远程代理。所以PAC的规则是服务器端的行为。目前该方案已废弃,原因是大家在iOS上可以使用Shadowrocket获得更好的体验。
甚至,我们可以使用关键字%{U}
和%{G}
来为不同的用户名和组名定义不同的PAC文件,只需要这样:
1
proxy-url = http://tyr.gift/%{U}/anyconnect.pac
或者
1
proxy-url = http://tyr.gift/%{G}/anyconnect.pac
只需要将链接中的pac换成你自己的pac文件一切就大功告成了,就是这么简单!关于如何制作PAC文件和搭建http/socks代理,请参考我之前的文章关于PAC自动代理和ios翻墙。
其它一些注意事项
在cubieboard上编译ocserv
在cubieboard上面编译ocserv的时候要注意configure的时候需要configure --disable-seccomp
,否则会出现:
1
Error: worker-privs.c:41:46: error: ‘__NR_time’ undeclared (first use in this function)
同样,在ocserv的配置文件中,我们需要isolate-workers = false
。
iptables
我们可以通过修改ocserv.conf
1
2
ipv4-network = 192.168.10.0
ipv4-netmask = 255.255.255.0
来配置VPN所使用的网段。iptables 这样配置:
1
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
使用可信的SSL服务器证书
一般我们都是通过自建的CA证书来签发自己的服务器端证书,这会导致该服务器会被客户端认为是不可信的
,需要我们关闭阻止不信任的服务器
这个选项,或者手动导入服务器证书。
但如果我们已经拥有了自己的可信的SSL证书,则可以直接在ocserv.conf
中用我们的服务器证书和私钥,就可以让客户端信任Anyconnect VPN服务器。
这是因为,客户端通过系统自带的证书链去验证服务器,服务器通过CA证书去验证客户端。CA证书和客户端证书还是通过certool或者openssl工具去产生。
推荐Let’s Encrypt这个项目来签发SSL证书,通过命令行简单而且免费。本站SSL证书已经更换为Let’s Encrypt
签发的证书。
按需连接
cisco的AnyConnect Secure Mobility Client支持按需连接
。
在客户端的VPN配置中,只要我们打开了按需连接这个功能,并且添加一部分域名,那么当客户端访问这部分域名时,iOS会自动打开Anyconnect VPN,而不需要手动去打开VPN,对于临时的网络访问比如去搜索Google的时候还是挺方便的。
不过由于这里底层实现需要等待系统dns解析这部分域名超时之后,iOS才会去开启Anyconnect VPN,所以使用下来存在3-5s的等待时间。
FROM http://web.archive.org/web/20170520150637/https://tyr.gift/anyconnect-pac.html
--------
在 Ubuntu 服务器上搭建 OpenConnect vpn小记
AnyConnect 的好处是基于 HTTPS,证书可以申请 StartSSL 的,而且配置也不很复杂。另外配置文件里发现了很多专门为商业化/企业服务定制的选项,例如最大同时在线客户端数量,同账户最大在线设备数量等等。
OpenConnect 是 AnyConnect 的开源实现。目前 0.8.0 版本需要 GnuTLS 3.1 以上版本,所以我们就直接在 Ubuntu 14.04 中搭建。另外 就算是基于 HTTPS,这货也是要用 TUN 设备的,所以 OpenVZ 用户们请注意。
准备
命令
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 libgnutls28-dev libseccomp-dev libhttp-parser-dev
安装
下载源码
wget -c ftp://ftp.infradead.org/pub/ocserv/ocserv-0.8.0.tar.xz
tar xvf ocserv-0.8.0.tar.xz
cd ocserv-0.8.0
编译安装
./configure --prefix=/opt/ocserv
make
make install
mkdir /opt/ocserv/etc/
cp doc/sample.config /opt/ocserv/etc/config
配置
这里只记录需要修改的重点配置,其他配置请参照样例配置文件的注释按需修改。
文件 /opt/ocserv/etc/config
auth = "plain[/opt/ocserv/etc/passwd]"
max-clients = 128
max-same-clients = 4
server-cert = /etc/letsencrypt/live/urdomain.com/fullchain.pem
server-key = /etc/letsencrypt/live/urdomain.com/privkey.pem
mobile-idle-timeout = 2400
ipv4-network = 192.168.1.0
ipv4-netmask = 255.255.255.0
dns = 8.8.8.8
route = 192.168.1.0/255.255.255.0
route-add-cmd = "ip route add 192.168.1.0 dev tun0"
route-del-cmd = "ip route delete 192.168.1.0 dev tun0"
创建用户,命令
ocserv ocpasswd -c ocserv passwd username
按提示输入两次密码。
iptables 规则
iptables -t nat -A POSTROUTING -j SNAT --to-source <server ip> -o <nic>
记得把 <server ip>
和 <nic>
改为服务器公网 IP 和对应网卡的名称。
折腾完毕,AnyConnect 客户端可以成功使用了。
------------------------------OpenWrt打OpenConnect SSL VPN做到host to site 也可以進階翻牆
OpenWrt打OpenConnect SSL VPN做到host to site 也可以進階翻牆,此外因為OpenConnect SSL VPN都是靠CPU下去運算,所以CPU的效能會影響到performance,這部份我們就不測試效能數據
架構如下:
有台PC裝了OpenConnect Client撥打OpenConnect SSL VPN到OpenWrt Router,並存取NAS
OpenWrt的設定:
OpenWrt要先做opkg update
opkg install luci-app-ocserv
opkg install luci-app-ddns
打開Server、使用單純的帳號密碼、用4443 port
讓Cisco的AnyConnect Client也可以連,這樣就更多種client可以用
這時後我們要定義VPN的IP,我們不要讓它和OpenWrt OpenConnect Server的LAN(192.168.1.1/24)同樣的IP,所以我們定義成192.168.100.1/255.255.255.0,所以我們在routing table的需要加入1921.168.1.0/255.255.255.0來告訴client要怎麼走。
如果你要route所有的traffic到Openwrt再翻牆出去,請在routing table加入0.0.0.0/0.0.0.0
我們輸入帳號密碼都是test(密碼記得要複雜點,被破解就GG了)此外防火牆也需要設定,要開啟WAN 4443 port
防火牆也要設定讓192.168.100.0/24 VPN的用戶可以存取LANiptables -t nat -I POSTROUTING -s 192.168.100.0/24 -j MASQUERADEiptables -I FORWARD -i vpns+ -s 192.168.100.0/24 -j ACCEPT
iptables -I INPUT -i vpns+ -s 192.168.100.0/24 -j ACCEPT
Windows OpenConnect Client安裝,https://github.com/openconnect/openconnect-gui/releases,請自行下載
新增profile
輸入對應server gateway ip與port資訊,要走https開頭的,然侯輸入username,VPN protocol要選Cisco AnyConnect那個
撥號
選Accurate information
輸入你的username test的密碼
這時候就可已打通了,也可以ping到NAS(192.168.1.135),在VPN info那邊有加密的資訊和你拿到192.168.100.X/24的IP
from https://ethernet-diy.blogspot.com/2020/03/openwrtopenconnect-ssl-vpnhost-to-lan.html