在 CentOS 6.7 上配置 Cisco AnyConnect VPN

1081人阅读 评论(0) 收藏 举报
分类:

目录(?)[+]

在配置的时候参考了很多网友的文章,只是发现编译的时候都会有各种问题(可能是系统环境和时间原因?),所以还是另开一篇记录下吧。

为什么选择 Cisco AnyConnect VPN ?

它是 iOS 端目前最好的 xx 解决方案:

  • 激活后全局有效
  • 自动重连,即使锁屏后重开也不会掉线
  • 可导入路由配置

开始动手吧~

首先安装所有依赖包:

安装 Nettle:

安装 unbound:

安装后执行程序将会出现动态库文件找不到的问题:unbound-anchor: error while loading shared libraries: libunbound.so.2: cannot open shared object file: No such file or directory
这是因为系统默认没有找/usr/local/lib目录下的库文件,为了一劳永逸,我们把将路径加入到配置文件中:

[python]view plain copy

  1. echo ‘/usr/local/lib’ > /etc/ld.so.conf.d/local-libraries.conf && ldconfig

生成配置文件:

[python]view plain copy

  1. unbound-anchor -a “/etc/unbound/root.key”

安装 gnutls:

这时会遇到Libnettle 2.7 was not found.错误,其实还是路径问题,pkg-config寻找包的依赖关系时没有找到对应的.pc文件,告诉它地址就好了:

[python]view plain copy

  1. export PKG_CONFIG_PATH=/usr/local/lib64/pkgconfig/

安装 LibNL:

如果nettle和gnutls安装在/usr/local目录,需要运行以下命令设置系统变量,再运行./configure。同时要把这些命令加进系统启动里。

[python]view plain copy

  1. export LD_LIBRARY_PATH=/usr/local/lib/:/usr/local/lib64/ NETTLE_CFLAGS=“-I/usr/local/include/” NETTLE_LIBS=“-L/usr/local/lib64/ -lnettle” HOGWEED_CFLAGS=“-I/usr/local/include” HOGWEED_LIBS=“-L/usr/local/lib64/ -lhogweed”

[python]view plain copy

  1. export LD_LIBRARY_PATH=/usr/local/lib/:/usr/local/lib64/ LIBGNUTLS_CFLAGS=“-I/usr/local/include/” LIBGNUTLS_LIBS=“-L/usr/local/lib/ -lgnutls” LIBNL3_CFLAGS=“-I/usr/local/include” LIBNL3_LIBS=“-L/usr/local/lib/ -lnl-3 -lnl-route-3”

终于该主角上场了,安装 Ocserv:

报错执行:

[python]view plain copy

  1. <pre name=“code” class=“python”>yum install autoconf automake gcc libtasn1-devel zlib zlib-devel trousers trousers-devel gmp-devel gmp xz texinfo libnl-devel libnl tcp_wrappers-libs tcp_wrappers-devel tcp_wrappers dbus dbus-devel ncurses-devel pam-devel readline-devel bison bison-devel flex gcc automake autoconf wget

64位系统可能出现下面错误

执行

即可

配置OCserv

Note: 官方的man手册里写的非常清楚 man ocserv

我们希望做到的,是无需用户名与密码的客户端证书验证登陆。但在此之前,让我们先测通更简单的密码登录模式。首先让我们把CA证书与服务器证书生成好,具体步骤官方文档也有——

[python]view plain copy

  1. mkdir -p /etc/ocserv/certificates
  2. cd /etc/ocserv/certificates

CA模板,创建ca.tmpl,按需填写,这里的cn和organization可以随便填。

CA密钥

[python]view plain copy

  1. certtool –generate-privkey –outfile ca-key.pem

错误:

1. certtool:error while loading shared libraries: libgnutls.so.28: cannot open shared object file: No such file or directory

ln -s /usr/local/lib/libgnutls.so.28 /usr/lib64/

2. certtool: error while loading shared libraries: libnettle.so.4: cannot open shared object file: No such file or directory:

ln -s /usr/local/lib64/libnettle.so.4 /usr/lib64/

3. certtool: error while loading shared libraries: libhogweed.so.2: cannot open shared object file: No such file or directory:

ln -s /usr/local/lib64/libhogweed.so.2 /usr/lib64/

CA证书

[python]view plain copy

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

同理,我们用CA签名,生成服务器证书。先创建server.tmpl模板。这里的cn项必须对应你最终提供服务的hostname或IP,否则AnyConnect客户端将无法正确导入证书。

Server密钥

[python]view plain copy

  1. certtool –generate-privkey –outfile server-key.pem

Server证书

[python]view plain copy

  1. 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-cert.pem 放到/etc/ssl/certs,私钥server-key.pem 放到/etc/ssl/private

[python]view plain copy

  1. mkdir /etc/ssl/private

[python]view plain copy

  1. cp ca-cert.pem /etc/ssl/certs
  2. cp ca-key.pem /etc/ssl/private
  3. cp server-cert.pem /etc/ssl/certs
  4. cp server-key.pem /etc/ssl/private

[python]view plain copy

  1. </pre><p></p><pre style=“font-family:Menlo,Monaco,Consolas,’Lucida Console’,’Courier New’,monospace; font-size:0.92857em; white-space:pre-wrap; padding:0px; border:1px solid rgb(204,204,204); overflow:auto; max-height:400px; color:rgb(68,68,68); background:rgb(243,243,240)”><span style=“font-family:’Droid Serif’,Georgia,’Times New Roman’,STHeiti,serif; font-size:14px; line-height:16.8px; background-color:rgb(255,255,255)”>剩下的就是OCServ配置文件了。同样的,参考官方文档是最佳选项,但为了方便起见,这是你需要注意的一些设置。回到ocserv-0.8.1的文件夹下,将配置文件复制到OCserv默认读取的位置。</span>

[python]view plain copy

  1. cd /usr/local/src/ocserv-0.8.1
  2. mkdir /etc/ocserv
  3. cp doc/sample.config /etc/ocserv/ocserv.conf
  4. cp doc/sample.passwd /etc/ocserv/ocpasswd

确保以下配置正确

[python]view plain copy

  1. # 登陆方式,目前先用密码登录
  2. auth = “plain[/etc/ocserv/ocpasswd]”
  3. max-clients = 10
  4. #限制同一客户端的并行登陆数量
  5. max-same-clients = 10
  6. # 服务监听的IP(服务器IP,可不设置)
  7. #listen-host = 1.2.3.4
  8. # 服务监听的TCP/UDP端口
  9. tcp-port = 9200
  10. udp-port = 9201
  11. # 自动优化VPN的网络性能
  12. try-mtu-discovery = true
  13. # 确保服务器正确读取用户证书(后面会用到用户证书)
  14. #cert-user-oid = 2.5.4.3
  15. # 服务器证书与密钥
  16. server-cert = /etc/ssl/certs/server-cert.pem
  17. server-key = /etc/ssl/private/server-key.pem
  18. # 客户端连上vpn后使用的dns
  19. dns = 8.8.8.8
  20. dns = 8.8.4.4
  21. # 注释掉所有的route,让服务器成为gateway
  22. #route = 192.168.1.0/255.255.255.0
  23. # 启用cisco客户端兼容性支持
  24. cisco-client-compat = true
  25. # 开着这个会报错:error: ‘isolate-workers’ is set to true, but not compiled with seccomp or Linux namespaces support
  26. # 好像是内核不支持,反正自己看着办
  27. #isolate-workers = false
  28. device = vpns
  29. session-control = true
  30. keepalive = 32400
  31. dpd = 90
  32. auth-timeout = 40
  33. cookie-timeout = 300
  34. deny-roaming = false
  35. rekey-time = 172800
  36. rekey-method = ssl
  37. use-utmp = true
  38. use-occtl = true
  39. pid-file = /var/run/ocserv.pid
  40. socket-file = /var/run/ocserv-socket
  41. run-as-user = nobody
  42. run-as-group = nobody
  43. predictable-ips = true
  44. ipv4-network = 192.168.10.0
  45. ipv4-netmask = 255.255.255.0
  46. ping-leases = false

创建一个登陆用的用户名与密码。

[python]view plain copy

  1. ocpasswd -c /etc/ocserv/ocpasswd username

错误: -bash: ocpasswd: command not found



再运行:

修改系统配置,允许转发

这样OCserv就基本配置好了。但如果你和我一样强化过服务器安全,还得为服务器上开些端口才行。
修改 iptables 规则 :

[python]view plain copy

  1. iptables -I INPUT -i eth0 -p tcp –dport 9200 -j ACCEPT && iptables -I OUTPUT -o eth0 -p tcp –sport 9200 -j ACCEPT && iptables -I INPUT -i eth0 -p udp –dport 9201 -j ACCEPT && iptables -I OUTPUT -o eth0 -p udp –sport 9201 -j ACCEPT

[python]view plain copy

  1. service iptables save

最后运行服务
/usr/sbin/ocserv -c /etc/ocserv/ocserv.conf

测试OCserv

在服务器端启动OpenConnect Server。

如果服务没错误退出,是时候来测测客户端了。假设你使用iOS,下载Cisco AnyConnect。

在Connections下加入新的VPN配置,在服务器地址栏目上填入对应的IP/Hostname和TCP端口

然后到设置标签页下暂时禁用“阻止不信任的服务器”选项。首次连接,AnyConnect会提示你这是不信任证书,如果你之前的服务器证书模板的cn没写错的话,你可以接受并导入该证书(可在诊断标签页的证书菜单里的服务器证书列表看到)。以后即便启用“阻止不信任的服务器”选项,也不会报错了(和SSH首次登陆类似)。

确定VPN连接正常并可以科学上网后,我们可以接着提高网络生活质量。
自动化OCserv

假如现有的配置有哪里让人不大满意,大概是这两点

  • OCserv的服务最好会自动跑,进程挂了也自动恢复。
  • AnyConnect每次都要输入密码很麻烦,最好用客户端证书验证。

证书登录 免去每次输密码

为AnyConnect建个客户端证书

和服务器端证书的步骤基本相同。回到之前的certificates文件夹。

创建user.tmpl

User密钥

User证书

然后要将证书和密钥转为PKCS12的格式。按说certtool也能做到,但不知为何,当前的AnyConnect iOS版并不接受certtool生成的p12文件,于是我们只能用openssl替代——

然后我们要通过URL将user.p12文件导入AnyConnect,具体位置在诊断标签页的证书栏目下。如果你的服务器已经有Nginx/Apache服务,只要传到一个可以访问的URL路径下即可。如果没有,请参照Nginx官网或Linode的Nginx入门教程。

导入成功之后,将对应的VPN设置的高级设置部分的证书栏目,改为导入的这张证书。

最后我们要调整下OCserv的配置——

vim /etc/ocserv/ocserv.conf

修改以下内容

重启OCserv服务,确认VPN无需密码就可以正常登陆。

具体设置参照: https://www.stunnel.info/%E5%9C%A8centos-6-5%E4%B8%8A%E9%85%8D%E7%BD%AEcisco-anyconnect-vpn/

https://luoqkk.com/linode-vps-debian-installation-and-configuration-ocserv-openconnect-server.html

 

安装ocserv和anyconnect

先分享下最近买的9.99美元一年的VPS 还是比较划算

如果你有需要也可以点击购买
好我们继续

VPS最主要的当然是要能提供特别的功能了 中国人都懂的
Shadowsocks(简称ss) 这些都很好安装,但是IOS没有越狱使用起来有些问题,vpn和openvpn干扰都比较严重,所以现在在IOS是使用anyconnect实现FQ功能。 下面是找到比较完整的一个文章,写的很棒。

环境准备

CentOS

**Ubuntu **

Note:在Ubuntu 14.04或更早版本上,libgnutls-dev的版本还是2.x,需要用libgnutls28-dev获取3.x的GnuTLS才能支持OCserv

安装Nettle

安装GnuTLS

64位系统安装可能出现下面错误

这是64位系统路径的问题,执行下面export后再重新上面的编译命令即可 参考

安装LibNL

编译OCserv

到官方站点找最新的OpenConnect Server版本。

64位系统可能出现下面错误

执行

即可

配置OCserv

Note: 官方的man手册里写的非常清楚 man ocserv

我们希望做到的,是无需用户名与密码的客户端证书验证登陆。但在此之前,让我们先测通更简单的密码登录模式。首先让我们把CA证书与服务器证书生成好,具体步骤官方文档也有——

CA模板,创建ca.tmpl,按需填写,这里的cn和organization可以随便填。

同理,我们用CA签名,生成服务器证书。先创建server.tmpl模板。这里的cn项必须对应你最终提供服务的hostname或IP,否则AnyConnect客户端将无法正确导入证书。

Server密钥

Server证书

将CA,Server证书与密钥复制到以下文件夹

剩下的就是OCServ配置文件了。同样的,参考官方文档是最佳选项,但为了方便起见,这是你需要注意的一些设置。回到ocserv-0.9.0的文件夹下,将配置文件复制到OCserv默认读取的位置。

确保以下配置正确

创建一个登陆用的用户名与密码。

修改系统配置,允许转发

这样OCserv就基本配置好了。但如果你和我一样强化过服务器安全,还得为服务器上开些端口才行。
修改 iptables 规则 你可以参考 Linode 的文章 来配置 iptables

特别需要主意的是,一定不要存在这样的一句话 不然能连上也是哪里都不能访问……

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

测试OCserv

在服务器端启动OpenConnect Server。

如果服务没错误退出,是时候来测测客户端了。假设你使用iOS,下载Cisco AnyConnect。

在Connections下加入新的VPN配置,在服务器地址栏目上填入对应的IP/Hostname和TCP端口

然后到设置标签页下暂时禁用“阻止不信任的服务器”选项。首次连接,AnyConnect会提示你这是不信任证书,如果你之前的服务器证书模板的cn没写错的话,你可以接受并导入该证书(可在诊断标签页的证书菜单里的服务器证书列表看到)。以后即便启用“阻止不信任的服务器”选项,也不会报错了(和SSH首次登陆类似)。

确定VPN连接正常并可以科学上网后,我们可以接着提高网络生活质量。
自动化OCserv

假如现有的配置有哪里让人不大满意,大概是这两点

  • OCserv的服务最好会自动跑,进程挂了也自动恢复。
  • AnyConnect每次都要输入密码很麻烦,最好用客户端证书验证。

证书登录 免去每次输密码

为AnyConnect建个客户端证书

和服务器端证书的步骤基本相同。回到之前的certificates文件夹。

创建user.tmpl

User密钥

User证书

然后要将证书和密钥转为PKCS12的格式。按说certtool也能做到,但不知为何,当前的AnyConnect iOS版并不接受certtool生成的p12文件,于是我们只能用openssl替代——

然后我们要通过URL将user.p12文件导入AnyConnect,具体位置在诊断标签页的证书栏目下。如果你的服务器已经有Nginx/Apache服务,只要传到一个可以访问的URL路径下即可。如果没有,请参照Nginx官网或Linode的Nginx入门教程。

导入成功之后,将对应的VPN设置的高级设置部分的证书栏目,改为导入的这张证书。

最后我们要调整下OCserv的配置——

vim /etc/ocserv/ocserv.conf

修改以下内容

重启OCserv服务,确认VPN无需密码就可以正常登陆。

CentOS下安装使用start-stop-daemon

CentOS是没有start-stop-daemon的,因为start-stop-daemon在debian的dpkg包里。要安装的话,需要自己折腾。

相关命令如下:

wget http://developer.axis.com/download/distribution/apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz

tar zxf apps-sys-utils-start-stop-daemon-IR1_9_18-2.tar.gz

mv apps/sys-utils/start-stop-daemon-IR1_9_18-2/ ./

rm -rf apps

cd start-stop-daemon-IR1_9_18-2/

cc start-stop-daemon.c -o start-stop-daemon

cp start-stop-daemon /usr/local/bin/start-stop-daemon

至此安装完成.

一键安装脚本:  https://github.com/lunadream/ocserv-install/blob/master/ocserv-install-centos6.sh

ocserv-install-centos6.sh

 

Categories: 未分类

0 Comments

Leave a Reply

Avatar placeholder

Your email address will not be published. Required fields are marked *