基于OpenConnect 构建的SSL VPN解决方案 2017/11/10

本文转载于灵跃云 :原文链接

1.写在前面

VPN(Virtual Private Network),虚拟专用网络,是一种通过公用网络安全地对企业内部专用网络进行远程访问的连接方式,可有效保障通信的机密性。如,出差办公人员可通过VPN通道安全地访问公司内部OA系统。发展至今的VPN同时融合了访问控制、路由选择、传输管理等多种功能,在全球的信息安全体系及各行业的信息系统中已发挥着重要作用。

        常见的VPN主要有:
        ● PPTP VPN
        ● L2TP VPN
        ● IPSec VPN
        ● SSL VPN

2.部署方案

        在构建VPN方案时,需要考虑服务端、客户端、传输通道三个部分。本次分别选择如下组件进行构建:
        ● VPN服务器:ocserv(OpenConnect VPN Server),一款开源的VPN服务端软件,可以提供端到端的安全连接服务,可以在思科设备以及众多的Linux发行版进行安装和部署;
        ● VPN客户端:AnyConnect,由思科推出的VPN客户端,目前已有支持Windows、Android、iOS、OS X、Ubuntu、WebOS等操作系统的版本;
        ● 传输协议:SSL。

        本次部署场景及达到的效果如图所示。

        本次部署测试中相关环境配置如下表所示。

        其中,
        (1)用户userA在利用VPN客户端连接VPN服务器之后,可访问公司内部打印服务器192.168.11.3,且带宽被限速为2MB;
        (2)用户userB在利用VPN客户端连接VPN服务器之后,可访问公司内部文件服务器192.168.10.3,无带宽限制。
        注:在下述部署中,涉及在服务器CentOS 7.3操作系统环境上的所有操作,均以root身份登录并执行。

2.1 服务端部署

        (一)安装依赖包
        # yum -y install wget gcc nettle* gnutls *readline* libev* autogen protobuf*
        (二)安装ocserv软件
        创建文件存储目录/home/centos,并下载ocserv源码包:
        # cd /home
        #mkdir centos && cd centos/
        下载软件源码包:
        # wget ftp://ftp.infradead.org/pub/ocserv/ocserv-0.11.7.tar.xz
        解压源码包:
        # xz -d ocserv-0.11.7.tar.xz
        # tar -xvf ocserv-0.11.7.tar
        进入到解压后的ocserv-0.11.7文件夹中,执行编译安装:
        # cd ocserv-0.11.7 && ./configure --prefix=/usr/local/ocserv && make && make install

        (三)配置ocserv
        (1)创建目录,用于存储后续生成的证书
        # mkdir -p /usr/local/ocserv/etc/certificates

        (2)复制源码目录ocserv-0.11.7里面的sample.config, sample.passwd文件到/usr/local/ocserv/etc/目录
        # cd /usr/local/ocserv/etc && cp /home/centos/ocserv-0.11.7/doc/sample.passwd ./
        # cd /usr/local/ocserv/etc && cp /home/centos/ocserv-0.11.7/doc/sample.config ./

        之后,通过tree命令可查看/usr/local/ocserv目录结构最终应当为:
        .
        ├── bin
        │   ├── occtl
        │   ├── ocpasswd
        │   └── ocserv-fw
        ├── etc
        │   ├── certificates
        │   │   ├── ca-cert.pem
        │   │   ├── ca-key.pem
        │   │   ├── ca.tmpl
        │   │   ├── server-cert.pem
        │   │   ├── server-key.pem
        │   │   └── server.tmpl
        │   ├── sample.config
        │   └── sample.passwd
        ├── sbin
        │   └── ocserv
        └── share
            └── man
                └── man8
                    ├── occtl.8
                    ├── ocpasswd.8
                    └── ocserv.8

        7 directories, 15 files

        (3)配置证书
        由于采用SSL协议作为传输实现,因此还需要在VPN服务端进一步配置证书。证书可通过自签名或者购买的方式获取。当前已有众多的证书服务商提供了免费的DEV证书可供申请使用。如需要自签名证书,请参考https://devcenter.heroku.com/articles/ssl-certificate-self。
        本次通过下面的脚本create_cert.sh来创建自签名证书,create_cert.sh脚本的具体内容如下:
        #!/bin/sh

        # create self-signed server certificate:
        read -p "Enter your domain [www.example.com]: " DOMAIN
        echo "Create server key..."
        openssl genrsa -des3 -out $DOMAIN.key 1024
        echo "Create server certificate signing request..."
        SUBJECT="/C=US/ST=Mars/L=LA/O=iTranswarp/OU=iTranswarp/CN=$DOMAIN"
        openssl req -new -subj $SUBJECT -key $DOMAIN.key -out $DOMAIN.csr
        echo "Remove password..."
        mv $DOMAIN.key $DOMAIN.origin.key
        openssl rsa -in $DOMAIN.origin.key -out $DOMAIN.key
        echo "Sign SSL certificate..."
        openssl x509 -req -sha256 -days 3650 -in $DOMAIN.csr -signkey $DOMAIN.key -out $DOMAIN.crt

        假设VPN服务端域名为www.example.com,运行create_cert.sh脚本生成服务端的自签名证书和key。
        # sh create_cert.sh
        根据提示填入相应的信息:
        Enter your domain [www.example.com]: www.example.com     //红色为手动输入的VPN服务器的域名,此处仅为示例,请按照实际的VPN服务器域名填写
        Create server key...
        Generating RSA private key, 1024 bit long modulus
        ..................++++++
        ...................++++++
        e is 65537 (0x10001)
        Enter pass phrase for www.example.com.key:     //请输入密码
        Verifying - Enter pass phrase for www.example.com.key:     //请输入密码
        Create server certificate signing request...
        Enter pass phrase for www.example.com.key:     //请输入密码
        Remove password...
        Enter pass phrase for www.example.com.origin.key:     //请输入密码
        writing RSA key
        Sign SSL certificate...
        Signature ok
        subject=/C=CN/ST=SC/L=CD/O=Longyuan/OU=Longyuan/CN=www.example.com
        Getting Private key

        如上,首先输入VPN服务端的域名,例如:www.example.com,在实际部署中请按照实际的VPN域名填写。之后,设置和确认解析密码,四个待输入的密码请保持一致。
        create_cert.sh脚本执行完成后,将在当前目录生成如下4个文件:
        www.example.com.crt
        www.example.com.csr
        www.example.com.key
        www.example.com.origin.key

        其中,文件名为www.example.com.crt和www.example.com.key的文件,即VPN服务端需要的证书和key,将上述两个文件拷贝到usr/local/ocserv/etc/certificates/目录下:
        # cp -r www.example.com.crt www.example.com.key /usr/local/ocserv/etc/certificates/

        (4)配置ocserv
        在ocserv的配置文件/usr/local/ocserv/etc/sample.config中,参考下述的配置进行相应参数的修改,相关配置项如下:
        auth = "plain[passwd=./sample.passwd]""# 认证方式及密钥路径
        tcp-port = 443  # 监听端口
        udp-port = 443
        run-as-user = root # 启动用户
        run-as-group = root
        socket-file = /var/run/ocserv-socket
        server-cert = /usr/local/ocserv/etc/certificates/www.example.com.crt     # 证书,来源于第(3)步生成的自签名证书
        server-key = /usr/local/ocserv/etc/certificates/www.example.com.key   #证书的key,来源于第(3)步生成的自签名证书的key
        isolate-workers = false
        max-clients = 16  # 最大连接数
        max-same-clients = 2 # 相同用户最大连接设备
        keepalive = 32400
        dpd = 90
        mobile-dpd = 1800
        switch-to-tcp-timeout = 25
        try-mtu-discovery = false
        cert-user-oid = 0.9.2342.19200300.100.1.1
        tls-priorities = "NORMAL:%SERVER_PRECEDENCE:%COMPAT:-VERS-SSL3.0"
        auth-timeout = 240
        min-reauth-time = 300
        max-ban-score = 50
        ban-reset-time = 300
        cookie-timeout = 300
        deny-roaming = false
        rekey-time = 172800
        rekey-method = ssl
        use-occtl = true  # 是否可以使用occtl进行管理
        pid-file = /var/run/ocserv.pid
        device = vpns  # 建立隧道的设备名
        predictable-ips = true
        ipv4-network = 172.16.16.0  # 隧道设备的IP段
        ipv4-netmask = 255.255.255.0
        ping-leases = false
        route = 192.168.10.0/255.255.255.0  # 全局路由,需要路由的IP或者IP段
        # no-route = 192.168.0.0/255.255.0.0
        cisco-client-compat = true
        dtls-legacy = true

        (5)启动ocserv服务
        # /usr/local/ocserv/sbin/ocserv -f -c /usr/local/ocserv/etc/sample.config -d 1
        建议使用supervisor进行启动。关于supervisor的安装和配置,请参考http://supervisord.org/installing.html

        (6)配置Linux路由功能
        增加地址伪装:
        # iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
        # iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE
        开启Linux路由转发:
        有两种方式,一种是永久打开路由转发,另一种是在Linux本次运行过程中打开路由转发功能,重启后此功能将无效。配置方式分别如下:
        永久添加:# echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf
        临时添加:# echo 1 > /proc/sys/net/ipv4/ip_forward

        (7)创建用户账户userA、userB
        # /usr/local/ocserv/bin/ocpasswd -c /usr/local/ocserv/etc/sample.passwd userA
        将提示输入userA的密码

        # /usr/local/ocserv/bin/ocpasswd -c /usr/local/ocserv/etc/sample.passwd userB
        将提示输入userB的密码

        至此,服务端的配置已完成。此处userA、userB的账号和密码即为后续用户使用AnyConnect登录时使用的账户。

2.2 客户端部署

        依据userA、userB使用的操作系统环境,访问https://www.ed.ac.uk/information-services/computing/desktop-personal/vpn/vpn-cisco-client,下载适用于对应操作系统的VPN客户端软件即可。

2.3 智能路由与限速

        通过下述配置,使得userA将走专门的路由,而userB会走全局路由;且userA的上传、下载带宽将被限速为2M。
        (1)为userA新建配置文件
        # vi /usr/local/ocserv/etc/config-per-user/userA
        在上述文件添加下述信息:
        route = 192.168.11.0/24 #局部路由,userA需要路由的IP或者IP段
        rx-data-per-sec = 2000000 #实现接收限速配置
        tx-data-per-sec = 2000000  #实现发送限速配置
        (2)修改ocserv的配置文件sample.conf
        # vi /usr/local/ocserv/etc/sample.conf
        在sample.conf配置文件中添加以下配置:
        config-per-user = /usr/local/ocserv/etc/config-per-user/
        (3)重启服务端
        # pkill ocserv  && sleep 2 && /usr/local/ocserv/sbin/ocserv -f -c /usr/local/ocserv/etc/sample.config -d 1

3.连接测试

        在userA、userB客户端打开AnyConnect软件,输入域名(注:请填写实际配置的VPN服务器的域名,且该域名userA、userB可正常访问。若测试环境中userA eth0、userB eth0、 VPN服务器 eth0位于同一子网内,则可通过在userA、userB系统对应的hosts文件中添加如“IP_VPN地址 www.example.com”信息,即可实现基于域名的访问。)之后,点击Connect即可连接VPN服务器,如下图所示。  

     之后,点击connect按钮,将弹出如图所示的用户登录窗口、密码输入窗口,分别输入在第(2.1)节中创建的用户名、密码即可。

       

4.写在最后

        至此,基于OpenConnect 构建的SSL VPN解决方案构建完成,并具有智能路由和带宽限速功能。在实际的应用场景中,还可进一步结合FreeIPA来实现企业级的统一用户身份认证与授权管理,关于ocserv与FreeIPA的结合应用将在后续更新。
时间: 2024-08-29 10:12:05

基于OpenConnect 构建的SSL VPN解决方案 2017/11/10的相关文章

芝麻软件早报2017.11.10

2017年11月10日  星期五 [国内资讯]1.搜狗IPO最终定价13美元 本次融资最高达5.85亿美元2.微信最新数据:日登录用户超9亿 日发送消息380亿次3.绝地求生开发商蓝洞警告盗版吃鸡手游,将对侵权手游维权4.上海发布互联网租赁自行车发展指导意见:不发展共享电动车5.中美两天签经贸大单2535亿美元  刷新了世界经贸合作史上新纪6.知乎离职员工用官方微博投诉直接领导,知乎回应:被盗号7.赵薇夫妇遭证监会市场禁入,涉嫌以空壳公司收购上市公司8.今日头条上架汽车资讯App懂车帝,接入单独

2017.11.10 重读C++ Primer

第二章   变量和变量类型 1. C++ 算数类型 bool                     布尔 最小尺寸未定义 char                     字符 8位 wchar_t               宽字符 16位 char16_t             Unicode 字符 16位 char32_t             Unicode 字符  32位 short                   短整型  16位 int                  

SSL VPN基于IOS路由器的配置

实验演示使用网络拓扑图如下. 图5.17 SSL VPN基于IOS路由器实验拓扑图 1.基本配置 ? 路由器R1的配置如下. R1(config)# int F0/0 R1(config-if)# no shut R1(config-if)# ip add 10.10.1.254 255.255.255.0 R1(config-if)# int S1/0 R1(config-if)# no shut R1(config-if)# ip add 200.1.1.1 255.255.255.252

SSL VPN 安全解决方案

随着VPN的不断普及,传统基于IPSEC的VPN在点接入端的环境下遇到越来越多的问题:1. 远端必须安装客户端软件,客户端和机器的操作系统紧密相关,在大型网络里面配置很困难.2. 客户端软件的配置方法复杂,使用麻烦,一般用户难以掌握,培训成本也很高.3. IPSEC对NAT和FIREWALL的穿透能力很弱,目前能穿透的NAT的IPSEC VPN都是对标准的IPSEC协议做了一定修改,使其安全性降低,兼容性更差.4. IPSEC VPN由于需要在网关和服务器端同时部署和维护,成本非常高.5. IP

干货分享:配置SSL VPN步骤

SSL VPN为一款安全远程接入VPN的解决方案.它在允许远程访问的同时,实现了如下所述的种种安全功能: 对用户身份进行认证: 根据管理员定义的安全策略和客户端的安全状况,对用户进行授权: 检测远端用户接入设备的安全状态: 保证远端用户同内部网络的通信安全: 实时监控远程接入的连接. 与此同时,考虑到SSL VPN作为一个网络安全设备在网络中部署的便利性,对各种不同的网络环境的适应性以及用户使用的安全便利性,建议SSL-VPN提供了双机备份.多ISP接入.客户端智能选路等网络适应能力.同时,为了

用网络访问控制来强化SSL VPN网络安全

很多公司已经改进了其IPsec VPN,有的甚至用基于SSL的远程访问解决方案替换掉了IPsec VPN.SSL VPN能够在任何未经管理的家用或公用电脑上使用,当要决定是否允许访问公司网络资源时,评价远程端点的安全性是至关重要的.我们将探讨用网络访问控制(NAC)功能来加强SSL VPN网络的安全性的原因和措施,并讨论其与NAC优先权的关系. 机会与风险 将浏览器用作客户端平台,SSL VPN使用户远程访问IT难以控制的设备成为可能,无论从家用PC还是商业伙伴的便携式电脑或者PDA设备都是如此

安全狗Poon:如何基于云端构建安全体系

日前,ArchSummit 2015 全球架构师峰会在深圳举行,知名互联网安全品牌安全狗作为本次大会的重要赞助方重装亮相本次大会并为大家带来题为"如何基于云端构建安全体系"的主题演讲. ArchSummit全球架构师峰会是InfoQ中国团队推出的面向高端技术管理者.架构师的技术大会,参会者中超过50%拥有8年以上的工作经验.本次与安全狗的合作,是其对云安全领域的目光聚焦,也是对当前企业安全需求的很好回应. 安全狗在本次峰会的演讲者是其首席安全架构师程Poon.Poon是一个长期从事WE

SSL VPN笔记

SSL Secure Sockets Layer安全套接层:是一种安全协议,基于TCP应用层提供安全连接,可以为http提供安全连接,为网络上的数据传输提供安全性保证 安全机制:1.数据传输的机密性:利用对称密钥算法对传输的数据进行加密2.身份验证机制:基于证书利用数字签名方式对服务器和客户端进行身份验证,客户端的身份验证是可选的3.消息完整性验证:消息传输过程中使用MAC算法来检验消息的完整性 注: 没有第三方解密密钥,无法将密文恢复为明文的,从而保证数据传输的机密性对称密钥算法和MAC算法要

基于kubernetes构建Docker集群管理详解-转

http://blog.liuts.com/post/247/ 一.前言        Kubernetes 是Google开源的容器集群管理系统,基于Docker构建一个容器的调度服务,提供资源调度.均衡容灾.服务注册.动态扩缩容等功能套件,目前最新版本为0.6.2.本文介绍如何基于Centos7.0构建Kubernetes平台,在正式介绍之前,大家有必要先理解Kubernetes几个核心概念及其承担的功能.以下为Kubernetes的架构设计图:1. Pods        在Kuberne