前段时间的appleID被盗事件闹的沸沸扬扬,我果断回到狱中升级了9.0.这下好了,Shadowsocks不能用了。这一点来讲我还是挺羡慕Android手机的……使用 Surge 让 iOS 走 Shadowsocks实现科学上网。
总之,我们还是来在iOS的VPN上下下功夫吧。如今的VPN已经被认证的差不多了,因为它们虽然加密安全,但禁不住特征检测——好吧,毕竟说这东西就不是为了隐匿而生的。目前倒是我思科大爹还有个anyconnect在活着,不是它多么坚挺,而是用的企业太多,没法禁,而且,它还有断线自动连接,自动国内外按需分流等诸多的好处——最大一点:不需要越狱。
注意:
我使用的是Digital Ocean的VPS,Ubuntu 15.04 ,整个的配置步骤是我一边配一边记录的,是完全可行的,但由于系统环境复杂,每个人都不尽相同,所以你具体操作的时候可能仍旧需要灵活运用!
0、关于PAC的问题
我们经常说,Cisco 的 AnyConnect 是无法使用PAC的,因为它的机制不同,不是代理而是 VPN,所以本文使用的方法是从服务器直接下发一些路由条目——由于客户端限制,我们总是不能下发完整的路由表(只有200来条),这一点始终是广大 AnyConnect 的一块心病。总之,其实还有另外的一个办法,对于那些需要全局vpn但又想区分网络的企业,Cisco 还是有对应办法的。
那就是让服务器走代理。?
这就需求你有一台中国的vps来作为前置,并且这台vps使用比如 Shadowsocks 等工具连到你的国外 vps 上,然后再在中国 vps 上搭建ocserv,然后给它配置pac文件,这样ocserv就会根据你的代理策略来实现路由。总之,如果你想尝试这个方法,请直接跳转页面底部的 [参考文章] 小节,“移步 Anyconnect VPN使用PAC来智能分流” 这篇文章进行参考。
1、配置环境
这一步参考我之前写的一篇文章——如果你的vps是全新的,否则跳过吧~
2、架设OpenConnectServer
2.1下载源码
从这里查看ocserv的最新版本号,你不需要点到FTP里看,只要安装格式替换链接路径就行了。比如现在最新的版本是0.10.8,那么你就把地址写成这样: ftp://ftp.infradead.org/pub/ocserv/ocserv-0.10.8.tar.xz ,好,我们现在来下载源码:
1 2 |
wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.10.8.tar.xz tar xvf ocserv-0.10.8.tar.xz |
2.2 安装依赖
下载解压好了代码,就需要安装一些依赖了,些是需要的,有些则是可选的,这里我们尽可能的安装所有依赖,万一将来用得着呢!毕竟也就十来兆的大小。
1 2 3 4 |
sudo apt-get install build-essential pkg-config libgnutls28-dev libreadline-dev libseccomp-dev libwrap0-dev libnl-nf-3-dev liblz4-dev cd ocserv-0.10.8 ./configure |
如果没有什么问题,那就可以安装了,比如我这里的结果是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
ummary of build options: version: 0.10.8 Host type: x86_64-unknown-linux-gnu Install prefix: /usr/local Compiler: gcc CFlags: -g -O2 -Wall 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: no readline: yes libnl3: yes glibc (sha2crypt): yes local talloc: yes local protobuf-c: yes local PCL library: yes local libopts: yes local http-parser: yes |
2.3 编译安装
使用make命令来编译和安装:
1 2 3 |
make sudo make install |
3、配置OpenConnectServer
3.1准备证书
安装证书工具 apt-get install gnutls-bin
1 2 3 4 5 |
cd ~ mkdir certificates cd certificates |
在此目录下创建一个名为 ca.tmpl 的CA证书模板,写入如下语句:
1 2 3 4 5 6 7 8 |
cn = "Logcg.com" organization = "logcg.com" serial = 1 expiration_days = 3650 ca signing_key cert_signing_key crl_signing_key |
使用 certtool --generate-privkey --outfile ca-key.pem 生成CA密钥;
使用 certtool --generate-self-signed --load-privkey ca-key.pem --template ca.tmpl --outfile ca-cert.pem 生成CA证书;
然后我们生成服务器证书,这里注意cn项必须对应你服务器的域名或IP,模板名称是 server.tmpl ,内容如下:
1 2 3 4 5 6 |
cn = "Your hostname or IP" organization = "logcg.com" expiration_days = 3650 signing_key encryption_key tls_www_server |
使用 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 生成server证书;
把证书移动到合适的地方:
1 2 3 |
cp ca-cert.pem /etc/ssl/private/my-ca-cert.pem cp server-cert.pem /etc/ssl/private/my-server-cert.pem cp server-key.pem /etc/ssl/private/my-server-key.pem |
3.2 准备配置文件
我们把配置文件放到ocserv默认读取的位置:
1 2 3 |
mkdir /etc/ocserv cd ~/ocserv-0.10.8 cp doc/sample.config /etc/ocserv/ocserv.conf |
配置文件可以参考官方手册来写,不过这里我们重点要确保以下条目正确:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# 登陆方式,目前先用密码登录 auth = "plain[/etc/ocserv/ocpasswd]" # 允许同时连接的客户端数量 max-clients = 4 # 限制同一客户端的并行登陆数量 max-same-clients = 2 # 服务监听的IP(服务器IP,可不设置) listen-host = 1.2.3.4 # 服务监听的TCP/UDP端口(选择你喜欢的数字) tcp-port = 9000 udp-port = 9001 # 自动优化VPN的网络性能 try-mtu-discovery = true # 确保服务器正确读取用户证书(后面会用到用户证书) cert-user-oid = 2.5.4.3 # 服务器证书与密钥 server-cert = /etc/ssl/private/my-server-cert.pem server-key = /etc/ssl/private/my-server-key.pem # 客户端连上vpn后使用的dns dns = 8.8.8.8 dns = 8.8.4.4 # 注释掉所有的route,让服务器成为gateway #route = 192.168.1.0/255.255.255.0 # 启用cisco客户端兼容性支持 cisco-client-compat = true |
3.3 测试服务器
现在,我们就可以来测试一下服务器了,使用命令来创建一个测试账号:
1 2 3 |
root@iZ289z55gmrZ:~/ocserv-0.10.8# ocpasswd -c /etc/ocserv/ocpasswd test Enter password: Re-enter password: |
如果你使用的也是Ubuntu系统,那你可以按照我写的这篇文章来开启NAT转发;
使用 iptables -t nat -L 来验证转发是否开启成功:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
root@iZ289z55gmrZ:~# iptables -L -t nat Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination MASQUERADE all -- 192.168.1.0/24 anywhere |
这时,我们就可以使用 ocserv -f -d 1 命令来启动下服务啦!
打开你手机上的Cisco Anyconnect新建一个VPN,添加服务器IP就是你的vps的 IP:端口
好了,如果你看到如下信息,那服务器应该已经能够正常运行了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
root@iZ289z55gmrZ:~# ocserv -f -d 1 Parsing plain auth method subconfig using legacy format Setting 'plain' as primary authentication method listening (TCP) on 0.0.0.0:110... listening (UDP) on 0.0.0.0:9000... ocserv[16104]: main: initialized ocserv 0.10.8 ocserv[16105]: sec-mod: reading supplemental config from files ocserv[16105]: sec-mod: sec-mod initialized (socket: /var/run/ocserv-socket.16104) ocserv[16109]: GnuTLS error (at worker-vpn.c:468): A TLS fatal alert has been received.: Unknown certificate ocserv[16104]: main: 60.0.14.48:9890 user disconnected ocserv[16105]: sec-mod: using 'plain' authentication to authenticate user (session: FXS0l) ocserv[16104]: main: 60.0.14.48:36627 user disconnected ocserv[16105]: sec-mod: initiating session for user 'test' (session: FXS0l) ocserv[16104]: main[test]: 60.0.14.48:9663 new user session ocserv[16104]: main[test]: 60.0.14.48:9663 user logged in ocserv[16104]: main: 60.0.14.48:46429 user disconnected ocserv[16104]: main[test]: 60.0.14.48:9663 user disconnected ocserv[16105]: sec-mod: temporarily closing session for test (session: FXS0l) ocserv[16105]: sec-mod: initiating session for user 'test' (session: FXS0l)ocserv[16104]: main[test]: 60.0.14.48:38135 new user session ocserv[16104]: main[test]: 60.0.14.48:38135 user logged in |
3.4 优化OpenConnectServer
好了,既然服务器已经可以跑起来,那么我们就可以优化它了,首先,来写个启动脚本——毕竟,不能每次都用调试模式启动不是吗?
如果你和我一样使用的是 Ubuntu 15.04 而不是旧版,那么你需要参考这篇文章来找回一下upstart才能使用下边的脚本。
1 2 3 4 5 |
cd /etc/init.d ln -s /lib/init/upstart-job ocserv cd /etc/init vi ocserv.conf |
在配置文件中写入如下脚本:
1 2 3 4 5 6 7 8 9 10 11 12 |
#!upstart description "OpenConnect Server" start on runlevel [2345] stop on runlevel [06] respawn respawn limit 20 5 script exec start-stop-daemon --start --pidfile /var/run/ocserv.pid --exec /usr/local/sbin/ocserv -- -f >> /dev/null 2>&1 end script |
这样,我们就可以使用 service ocserv start 和 service ocserv stop来控制服务了。
3.5 创建客户端证书,省的老输入密码
1 2 |
cd ~/certificates/ vi user.tmpl |
写入如下内容:
1 2 3 4 5 |
cn = "some random name" unit = "some random unit" expiration_days = 365 signing_key tls_www_client |
1 2 3 4 5 6 7 |
//User密钥 certtool --generate-privkey --outfile user-key.pem //User证书 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 |
将证书和密钥转为PKCS12的格式,好导入Anyconnect:
1 |
certtool --to-p12 --load-privkey user-key.pem --pkcs-cipher 3des-pkcs12 --load-certificate user-cert.pem --outfile user.p12 --outder |
期间会要求你输入证书名字和密码。
然后你需要把这个证书放到一个可以被直接访问的地方,然后通过URL将user.p12文件导入AnyConnect,具体位置在诊断标签页的证书栏目下,导入成功之后,将对应的VPN设置的高级设置部分的证书栏目,改为导入的这张证书。
现在,为了让服务器能够认得这张证书,我们再来修改一下配置:
1 2 3 4 5 6 7 8 9 10 |
vi /etc/ocserv/ocserv.conf # 改为证书登陆,注释掉原来的登陆模式 auth = "certificate" # 证书认证不支持这个选项,注释掉这行 #listen-clear-file = /var/run/ocserv-conn.socket # 启用证书验证 ca-cert = /etc/ssl/private/my-ca-cert.pem |
这样,我们使用 service ocserv start 来启动它即可!
4、智能分流
好了,一般来讲,如果你的是一个稳定且速度不慢的国外vps,那你现在就可以开始享受生活了!不过,我们的任务还没用结束,手动切换总不能说的上是智能,我们使用现成的。
https://github.com/don-johnny/anyconnect-routes/blob/master/routes
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 |
# Dropbox route = 108.160.0.0/255.255.0.0 route = 199.47.0.0/255.255.0.0 route = 205.189.0.0/255.255.0.0 # 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 route = 69.63.0.0/255.255.0.0 route = 69.171.0.0/255.255.0.0 route = 74.119.0.0/255.255.0.0 route = 173.252.0.0/255.255.0.0 route = 199.201.0.0/255.255.0.0 route = 204.15.0.0/255.255.0.0 route = 1.9.0.0/255.255.0.0 # Github route = 192.30.0.0/255.255.0.0 route = 23.235.0.0/255.255.0.0 route = 199.27.0.0/255.255.0.0 route = 104.156.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 route = 23.236.0.0/255.255.0.0 route = 23.251.0.0/255.255.0.0 route = 64.9.0.0/255.255.0.0 route = 64.233.0.0/255.255.0.0 route = 66.102.0.0/255.255.0.0 route = 66.249.0.0/255.255.0.0 route = 70.32.0.0/255.255.0.0 route = 72.14.0.0/255.255.0.0 route = 74.125.0.0/255.255.0.0 route = 104.132.0.0/255.252.0.0 route = 104.154.0.0/255.254.0.0 route = 104.196.0.0/255.252.0.0 route = 107.167.0.0/255.255.0.0 route = 107.178.0.0/255.255.0.0 route = 108.59.0.0/255.255.0.0 route = 108.170.0.0/255.255.0.0 route = 108.177.0.0/255.255.0.0 route = 130.211.0.0/255.255.0.0 route = 142.250.0.0/255.254.0.0 route = 146.148.0.0/255.255.0.0 route = 162.216.0.0/255.255.0.0 route = 162.222.0.0/255.255.0.0 route = 172.217.0.0/255.255.0.0 route = 172.253.0.0/255.255.0.0 route = 173.194.0.0/255.255.0.0 route = 173.255.0.0/255.255.0.0 route = 192.158.0.0/255.255.0.0 route = 192.178.0.0/255.254.0.0 route = 199.192.0.0/255.255.0.0 route = 199.223.0.0/255.255.0.0 route = 207.223.0.0/255.255.0.0 route = 209.85.0.0/255.255.0.0 route = 216.58.0.0/255.255.0.0 route = 216.239.0.0/255.255.0.0 #google ext 2015-08-27 route = 111.168.0.0/255.255.0.0 # Twitter route = 8.25.0.0/255.255.0.0 route = 192.133.0.0/255.255.0.0 route = 199.16.0.0/255.255.0.0 route = 192.229.0.0/255.255.0.0 route = 104.244.0.0/255.255.0.0 route = 199.59.0.0/255.255.0.0 route = 199.96.0.0/255.255.0.0 # Wikimedia route = 91.198.0.0/255.255.0.0 route = 185.15.0.0/255.255.0.0 route = 198.35.0.0/255.255.0.0 route = 198.73.0.0/255.255.0.0 route = 208.80.0.0/255.255.0.0 # instagram route = 54.0.0.0/255.0.0.0 route = 52.0.0.0/255.0.0.0 route = 72.246.0.0/255.255.0.0 route = 23.32.0.0/255.255.0.0 route = 125.56.0.0/255.255.0.0 #1024 route = 162.159.246.97/255.255.255.255 #Linn Radio route = 89.16.0.0/255.255.0.0 #Quaro route = 192.33.31.60/255.255.255.255 route = 103.243.12.60/255.255.255.255 #www.flinto.com route = 103.245.0.0/255.255.0.0 #TELEGRAM route = 91.108.0.0/255.255.0.0 route = 149.154.0.0/255.255.0.0 #vfsglobal.com route = 210.210.0.0/255.255.0.0 |
不过我没有全写,只写了部分进去——我主要是刷推~
好了,就到这里吧!
参考文章:
折腾笔记:架设OpenConnect Server给iPhone提供更顺畅的网络生活
本文由 落格博客 原创撰写:落格博客 » 使用ocserv搭建 Cisco Anyconnect 服务器
转载请保留出处和原文链接:https://www.logcg.com/archives/1343.html
ocserv -f -d 1启动服务能正常使用。service ocserv start 运行后,输入ip连接服务器,点击继续后,就提示无法连接服务器。什么原因?
ping 服务器能通吗?
curl 一下试试?通常来说,gfw 会在你连接的第一时间阻断并拉黑,尝试换个随机端口,并用国外服务器跑客户端连一下确认到底是gfw还是服务没有配对。
另外,确保你端口可访问,比如服务器的防火墙,还有如果你用的云服务的话,通常平台自身还有个默认防火墙,可能只开了22端口,也要开一下。
ocserv -f -d 1跟service ocserv start启动区别是什么?
ocserv -f -d 1启动,手机Cisco Anyconnect能账号密码登录,能访问谷歌等外网。就表示防火墙端口什么的都没问题吧。
切换到service ocserv start启动,连接服务器,点击继续后,就提示无法连接服务器。
不清楚,具体得看脚本代码,可能 service 的脚本少了什么必要的防火墙配置吧。
您好,想请教一下。
参考您的文章搭建好了服务之后,AnyConnect可以连接,但是连接之后并不能访问google.
我尝试了
telnet ip port 和nc命令测试了TCP和UDP
iptables -t nat -L 结果也和您的一致
net.ipv4.ip_forward=1没有注释
您能给个思路吗,谢谢
首先看看你服务器机房在哪,我们假如它在美西,那先试试比如访问我的博客能不能通,这样我们可以确定你是不是被dns污染了,dns污染是双向的,不光面向国内,也面向国外的。
然后是确保在服务器上curl 一下 google,确定服务器本身是通的
你telnet了 ip 是通的,说明本地访问服务器没问题,那我猜测很有可能是DNS解析的问题(尤其是仅Google这一类被墙的网站打不开的话,从这方面下手试试
另外现在wireguard这类工具可能要比anyconnect好很多,毕竟后者现在应该已经能被gfw识别并屏蔽了………………
我的这个服务器,一直部署的IPSec使用,服务器本身是没有问题的。
但是IPSec对windows支持很差,需要修改注册表、DNS和组策略等等问题,前些日子了解到了ocserv就想尝试一下。
哪知道又冒出来个wireguard,还是眼界窄,头一回听说这玩意
根据我当年部署这东西的经验,gfw是见一个封一个,可能之前你服务器正常,但他扫到这个,就开始干扰了。这也是我很快就放弃它的原因,它只是加密,不混淆,一般很难活的长久。
wireguard是比较新的产物,它代码量小但性能高,是用UDP发包,但在一些运营商中可能会对UDP进行限制,效果不一定是最佳的,但肯定比 AnyConnect 要好使的。
哪个您好,请问有centos 的安装方法么?
你好,我想知道,anyconnect能否设置全局路由,老是得更新有点麻烦
默认就是全局路由
博主求指教 最后make的时候出错了 回去翻了下 问题应该是出在这里 这几个库我都是有的 要如何把他们添加到编译路径去? 谢谢
local talloc: no
local protobuf-c: no
local PCL library: no
local libopts: no
local http-parser: no
使用 apt-get 来安装这些库即可。
麻烦了 自己搞定了 之前的库全是根据网上的中文教程东拼西凑的….orz
去看了下官方的readme总算搞定了
https://tyr.gift/anyconnect-pac.html
anyconnect也可以使用pac来进行自动代理,而不用选择路由表
我勒个去!竟然是真的!————好吧是我疏忽啦,竟然真的没有自己去探索一番~我这就更新一下文章。
https://github.com/CNMan/ocserv-cn-no-route
这个no-route效果比你现在的更好
多谢解答!
还有一个问题 正在开启NAT转发 https://www.logcg.com/archives/993.html
添加转发条目和开启端口转发项下的内容能照搬吗?如果需要修改我不知到填什么,不懂。。。
烦请解答,谢谢!
呃,理论上按照你的端口照搬是可以的——至少在我的vps上就是这样的命令。如果不行,你再想办法吧~
R0uter:
你好!
本人比较外行,请教一件事,我也是使用的Digital Ocean的VPS,Ubuntu 15.04 ,月费5美金那款,之前按照http://www.chedanji.com/ubuntu-shadowsocks/ 这篇帖子部署了Shadowsocks , 安卓手机和PC 都能翻了,现在准备按照你的这篇大作搭建Cisco Anyconnect 服务器,我可以直接操作吗?和以前的Shadowsocks会冲突吗?
期盼回复,谢谢!
不用担心,随便配,我的vps现在两个都跑着没有任何问题!唯一需要注意的地方在于:避免端口冲突。只要注意这一点就ok了。不过,ac在我这速度不咋地,我已经准备卸载啦。推荐最新的surge!