前段時間的appleID被盜事件鬧的沸沸揚揚,我果斷回到獄中升級了9.0.這下好了,Shadowsocks不能用了。這一點來講我還是挺羨慕Android手機的......使用 Surge 讓 iOS 走 Shadowsocks實現科學上網。
總之,我們還是來在iOS的VPN上下下功夫吧。如今的VPN已經被認證的差不多了,因為它們雖然加密安全,但禁不住特徵檢測——好吧,畢竟說這東西就不是為了隱匿而生的。目前倒是我思科大爹還有個anyconnect在活著,不是它多麼堅挺,而是用的企業太多,沒法禁,而且,它還有斷線自動連接,自動國內外按需分流等諸多的好處——最大一點:不需要越獄。
注意:
我使用的是數字海洋的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準備證書
安裝證書工具 易於-得到 安裝 GNUTLS-箱子
1 2 3 4 5 |
cd ~ mkdir certificates cd certificates |
在此目錄下創建一個名為 如.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 --生成-的privKey --OUTFILE 如-鍵.ESTAB 生成CA密鑰;
使用 certtool --生成-自-簽 --加載-的privKey 如-鍵.ESTAB --模板 如.TMPL --OUTFILE 如-證書.ESTAB 生成CA證書;
然後我們生成服務器證書,這裡註意cn項必須對應你服務器的域名或IP,模板名稱是 服務器.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 --生成-的privKey --OUTFILE 服務器-鍵.ESTAB 生成密鑰;
使用 certtool --生成-證書 --加載-的privKey 服務器-鍵.ESTAB --加載-如-證書 如-證書.ESTAB --加載-如-的privKey 如-鍵.ESTAB --模板 服務器.TMPL --OUTFILE 服務器-證書.ESTAB 生成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的 -ŧ NAT -大號 來驗證轉發是否開啟成功:
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 -ð 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 |
這樣,我們就可以使用 服務 ocserv 開始 和 服務 ocserv 停止來控制服務了。
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 |
這樣,我們使用 服務 ocserv 開始 來啟動它即可!
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的時候出錯了 回去翻了下 問題應該是出在這裡 這幾個庫我都是有的 要如何把他們添加到編譯路徑去?謝謝
當地talloc: 沒有
當地的protobuf-C: 沒有
當地PCL庫: 沒有
當地libopts: 沒有
本地HTTP分析器: 沒有
使用 apt-get 來安裝這些庫即可。
麻煩了 自己搞定了 之前的庫全是根據網上的中文教程東拼西湊的….大麥
去看了下官方的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!