美文网首页linux整理
linux: ipsec服务器搭建

linux: ipsec服务器搭建

作者: 随风化作雨 | 来源:发表于2017-07-17 18:35 被阅读573次

    http://bbs.pceva.com.cn/thread-130112-1-1.html
    先看看常用VPN协议有哪些?

    参考:维基百科 - 虚拟专用网

    常用的虚拟专用网协议有:

    L2F
    L2TP
    PPTP
    IPsec (如Cisco IPSec VPN)
    SSL VPN
    AnyConnect(Cisco SSL VPN)
    OpenVPN
    SoftEther

    各协议的优缺点就不说了,有兴趣可以自己去查,这里我只关注IPsec。
    基于IPsec的VPN通道其实包含以下两个部分:

    IKE协议(互联网密钥交换协议): 两个系统端使用IKE协议来互相验证,并协商建立IPsec通道所需的特定加密参数和两端特定的网段。
    IPsec协议(IP安全协议):使用特定加密参数对特定数据进行加密传输,通常由操作系统内核实现,目前基本上所有主流操作系统都支持IPsec协议。

    用白话说就是,IKE负责连接双方的身份验证,双方协商得出的密码和使用的加密算法都告知给操作系统,操作系统对两边网段之间的流量数据进行加密传输。

    既然数据加密传输的活都给操作系统来干了,操作系统我们也没什么好选的,能选的就只有实现IKE协议的软件了。

    IKE的版本发展:
    1988年11月,互联网工程任务组在一系列的RFC文件中,定义了这个协议,其中包括了 RFC 2407,RFC 2408 以及 RFC 2409。
    2005年以后,IKE版本升级到了IKEv2版本,RFC文件有所更新,其中包括 RFC 4306, RFC 4718,RFC 5996 以及 RFC 7296。

    IKEv2的主要改进:

    更精简的RFC标准化文档
    对移动设备更好的支持
    全面支持NAT穿越和SCTP协议
    简化的信息交换机制
    增强的可靠性和状态管理
    更好的防范DoS攻击机制

    参考 - 维基百科 - IKEv2的实现

    如下为当前可用的IKEv2开源实现:

    OpenIKEv2,
    strongSwan,
    Openswan,
    IKEv2,
    Racoon and Racoon2 from the KAME project,
    iked from the OpenBSD project.,
    Libreswan,
    Rockhopper VPN Software

    名单的有些软件已经很久不更新了。

    而稍微留心一下这个名单,会发现有个字眼很显眼,很明显就是天鹅swan家族:strongSwan, Openswan, Libreswan。

    它们其实有一个共同的鼻祖:FreeS/WAN开源项目.

    安装strongSwan的运行依赖环境

    yum -y install gpm-devel pam-devel openssl-devel make gcc
    

    下载源程序编译安装

    为使用最新版本,还是得自己下载源码编译安装,我测试时的版本是5.3.5。

    1.下载源代码压缩包

    cd /root
    wget http://download.strongswan.org/strongswan.tar.gz
    

    2.解压

    tar zxvf strongswan.tar.gz
    

    3.编译安装
    程序安装路径:/usr
    strongSwan配置文件路径:/etc/strongswan

    cd strongswan-5.3.5
    ./configure --prefix=/usr --sysconfdir=/etc/strongswan --enable-eap-identity --enable-eap-md5 \
                    --enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap \
                    --enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap \
                    --enable-xauth-pam --enable-dhcp --enable-openssl --enable-addrblock \
                    --enable-unity --enable-certexpire --enable-radattr --enable-tools \
                    --enable-openssl --disable-gmp
    make
    make install
    

    配置私钥和证书

    1.生成CA私钥,并使用此私钥自签名生成CA证书

    cd /etc/strongswan
    ipsec pki --gen --outform pem > ca.pem
    ipsec pki --self --in ca.pem --dn "C=CN, O=VPN, CN=strongSwan CA" --ca --lifetime 3652 \
                   --outform pem > ca.cert.pem
    

    这里C表示国家名,O表示组织名,CN为通用名。默认证书有效期为3年,这里配置3652天,即10年。

    2.生成服务器私钥,然后从私钥中导出公钥,用CA证书签发服务器证书
    ipsec pki命令可用来生成RSA密钥对,包含了私钥和公钥,公钥是在网络上传输的,而私钥是藏好用来和接收到的公钥配对的(因此私钥里也有整个公钥,用来配对)

    ipsec pki --gen --outform pem > server.pem
    ipsec pki --pub --in server.pem | ipsec pki --issue --lifetime 3652 --cacert ca.cert.pem \
                   --cakey ca.pem --dn "C=CN, O=VPN, CN=119.81.236.70" --san="119.81.236.70" \
                   --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
    

    a. iOS 客户端要求 CN 也就是通用名必须是你的服务器的 URL 或 IP 地址。
    b. 除了上述要求,Windows 7 还要求必须显式说明这个服务器证书的用途(用于与服务器进行认证)--flag serverAuth。
    c. 非 iOS 的 Mac OS X 要求了“IP 安全网络密钥互换居间(IP Security IKE Intermediate)”这种增强型密钥用法(EKU)--flag ikdeIntermediate。
    d. Android 和 iOS 都要求服务器别名(serverAltName)就是服务器的 URL 或 IP 地址,--san。

    所以这里C、O的值要跟第1步的一致,CN值及--san值是服务器公网地址或url,另外这里可以设置多个--san值。否则会出现错误 13801:IKE身份验证凭证不可接受.

    3.生成客户端私钥,然后从私钥中导出公钥,用CA证书签发客户端证书

    ipsec pki --gen --outform pem > client.pem
    ipsec pki --pub --in client.pem | ipsec pki --issue --lifetime 3652 --cacert ca.cert.pem \
                   --cakey ca.pem --dn "C=CN, O=VPN, CN=strongSwan Client" --outform pem > client.cert.pem
    

    这里C、O的值要跟第1步的一致

    4.生成 pkcs12 证书,用来导入手机或电脑

    openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "strongSwan Client" \
                             -certfile ca.cert.pem -caname "strongSwan CA" -out client.cert.p12
    Export Password: pceva.com
    

    生成时需设置密码,例如:pceva.com,请记住这个密码,在客户端导入此证书时需输入该密码。

    安装证书

    把刚才生成的私钥和证书文件复制到目录/etc/strongswan/ipsec.d/下的指定目录下即可。

    cp -r ca.cert.pem /etc/strongswan/ipsec.d/cacerts/
    cp -r server.cert.pem /etc/strongswan/ipsec.d/certs/
    cp -r server.pem /etc/strongswan/ipsec.d/private/
    cp -r client.cert.pem /etc/strongswan/ipsec.d/certs/
    cp -r client.pem /etc/strongswan/ipsec.d/private/
    

    cacerts/目录下放置CA证书
    certs/目录下放置服务器和客户端证书
    private/目录下放置服务器和客户端私钥

    配置strongSwan

    strongSwan包含3个配置文件,在目录/etc/strongswan/下。
    strongswan.conf strongSwan各组件的通用配置
    ipsec.conf IPsec相关的配置,定义IKE版本、验证方式、加密方式、连接属性等等
    ipsec.secrets 定义各类密钥,例如:私钥、预共享密钥、用户账户和密码

    vi /etc/strongswan/strongswan.conf

        # strongswan.conf - strongSwan configuration file
        #
        # Refer to the strongswan.conf(5) manpage for details
        #
        # Configuration changes should be made in the included files
    
        charon {
                load_modular = yes
                duplicheck.enable = no                          #冗余检查关闭,以允许同时连接多个设备
                compress = yes                                  #传输启用压缩
                plugins {
                        include strongswan.d/charon/*.conf
                }
                dns1 = 8.8.8.8                                  #给远程端指定DNS服务器
                dns2 = 8.8.4.4
                nbns1 = 8.8.8.8                                 #指定Windows的WINS服务器
                nbns2 = 8.8.4.4
    
                filelog {                                       #配置strongSwan日志级别和路径
                        /var/log/strongswan.log {
                           time_format = %b %e %T
                           default = 2
                           append = no
                           flush_line = yes
                        }
                }
        }
    
        include strongswan.d/*.conf
    

    vi /etc/strongswan/ipsec.conf

        # ipsec.conf - strongSwan IPsec configuration file
    
        config setup
                  uniqueids=never               #关闭ID唯一性,即允许多个客户端使用同一个证书,多设备同时在线
    
        conn %default                           #默认配置项,其他conn配置项都会调用此默认项
            left=%any                           #left表示local,即本地端(服务器端)IP地址;%any是魔数字,表示任意地址
            leftsubnet=0.0.0.0/0                #本地端网络,0.0.0.0/0为通配,表示所有IP网段
            right=%any                          #right表示remote,即远程端(客户端)IP地址可为任意地址
            rightsourceip=10.10.10.0/24         #分配给远程端的虚拟IP地址段,尽量避免使用常用私网地址段以免冲突
            dpdaction=clear                     #dpd表示Dead Peer Detection,对端失效检测,clear表示对端失效时关闭连接
    
        conn IKEv1-CERT-XAUTH                   #供老版本IOS使用。IKEv1,使用证书和XAUTH验证
            keyexchange=ikev1                   #密钥交换使用IKEv1
            fragmentation=yes                   #允许分片
            leftauth=pubkey                     #本地端使用公钥验证
            leftcert=server.cert.pem            #指定本地端证书
            rightauth=pubkey                    #远程端使用公钥验证
            rightauth2=xauth                    #远程端使用用户账号验证
            rightcert=client.cert.pem           #指定远程端证书
            auto=add                            #auto定义strongSwan服务启动时该连接的行为,add是添加连接类型但不启动
    
        conn IKEv1-PSK-XAUTH                    #供IOS, Android使用。IKEv1,使用预共享密钥和XAUTH验证
            keyexchange=ikev1                   #密钥交换使用IKEv1
            leftauth=psk                        #本地端使用预共享密钥验证
            rightauth=psk                       #远程端使用预共享密钥验证
            rightauth2=xauth                    #远程端使用用户账号验证
            auto=add                            #strongSwan启动时添加连接类型但不启动
    
        conn IKEv2-CERT                         #供Windows 7+, Linux使用。IKEv2,使用证书验证
            keyexchange=ikev2                   #密钥交换使用IKEv2
            leftauth=pubkey                     #本地端使用公钥验证
            leftcert=server.cert.pem            #指定本地端证书
            rightauth=pubkey                    #远程端使用公钥验证
            rightcert=client.cert.pem           #指定远程端证书
            auto=add                            #strongSwan启动时添加连接类型但不启动
    
        conn IKEv2-EAP                          #供Windows 7+, IOS9+使用。IKEv2,EAP验证
            keyexchange=ikev2                   #密钥交换使用IKEv2
            ike=aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024!                #第一阶段加密方式
            esp=aes256-sha256,3des-sha1,aes256-sha1!                                           #ESP的顺序与IKE一致
            rekey=no                            #本地端对Windows远程端发出rekey请求会断开连接,所以需配置为no
            leftauth=pubkey                     #本地端使用公钥验证
            leftcert=server.cert.pem            #指定本地端证书
            leftsendcert=always                 #本地端总是发送证书
            leftid=119.81.236.70                #本地端标识,使用本地端公网IP地址作为标识,和生成服务器证书时的--san参数对应
            rightauth=eap-mschapv2              #远程端使用eap-mschapv2验证
            rightsendcert=never                 #不要求远程端发送证书
            eap_identity=%any                   #指定EAP验证身份,任意账户
            fragmentation=yes                   #允许分片
            auto=add                            #strongSwan启动时添加连接类型但不启动
    

    密码文件ipsec.secrets文件默认不存在,需要自己生成。
    vi /etc/strongswan/ipsec.secrets

        : RSA server.pem                        #指定服务器的RSA私钥文件
        : PSK "hello2016.pceva.com"             #配置预共享密钥为:hello2016.pceva.com
        stone : XAUTH "PCeva2016"               #配置XAUTH验证的用户名stone和密码PCeva2016,可配置多个用户账户
        stone : EAP "PCeva2016"                 #配置EAP验证的用户名stone和密码PCeva2016,可配置多个用户账户
    

    更改密码文件读写权限,仅限root可读写

    chmod 600 ipsec.secrets
    

    CentOS配置转发

        sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
        sysctl -p
    

    CentOS配置iptables防火墙,允许UDP500,UDP4500,并配置转发和NAT规则

    vi /etc/sysconfig/iptables

        # Generated by iptables-save v1.4.7 on Thu Mar 31 17:56:08 2016
        *filter
        :INPUT DROP [0:0]
        :FORWARD DROP [0:0]
        :OUTPUT ACCEPT [17175:5181315]
        -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
        -A INPUT -p icmp -j ACCEPT
        -A INPUT -i lo -j ACCEPT
        -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
        -A INPUT -i eth1 -p udp -m udp --dport 500 -j ACCEPT
        -A INPUT -i eth1 -p udp -m udp --dport 4500 -j ACCEPT
        -A INPUT -j REJECT --reject-with icmp-host-prohibited
        -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
        -A FORWARD -s 10.10.10.0/24 -j ACCEPT
        -A FORWARD -j REJECT --reject-with icmp-host-prohibited
        COMMIT
        # Completed on Thu Mar 31 17:56:08 2016
        # Generated by iptables-save v1.4.7 on Thu Mar 31 17:56:08 2016
        *nat
        :PREROUTING ACCEPT [69:5938]
        :POSTROUTING ACCEPT [13:839]
        :OUTPUT ACCEPT [13:839]
        -A POSTROUTING -s 10.10.10.0/24 -o eth1 -j MASQUERADE
        COMMIT
        # Completed on Thu Mar 31 17:56:08 2016
    

    配置完成后,重启iptables服务,使新规则生效。

    service iptables restart
    

    配置init.d服务启动脚本(源码编译安装不带此脚本)

    vi /etc/init.d/strongswan

        #!/bin/sh
        #
        # strongswan   An implementation of key management system for IPsec
        #
        # chkconfig:   - 48 52
        # description: Starts or stops the Strongswan daemon.
    
        ### BEGIN INIT INFO
        # Provides: ipsec
        # Required-Start: $network $remote_fs $syslog $named
        # Required-Stop: $syslog $remote_fs
        # Default-Start:
        # Default-Stop: 0 1 6
        # Short-Description: Start Strongswan daemons at boot time
        ### END INIT INFO
    
        # Source function library.
        . /etc/rc.d/init.d/functions
    
        exec="/usr/sbin/ipsec"
        prog="strongswan"
        status_prog="starter"
        config="/etc/strongswan/strongswan.conf"
    
        lockfile=/var/lock/subsys/$prog
    
        start() {
            [ -x $exec ] || exit 5
            [ -f $config ] || exit 6
            echo -n $"Starting $prog: "
            daemon $exec start
            retval=$?
            echo
            [ $retval -eq 0 ] && touch $lockfile
            return $retval
        }
    
        stop() {
            echo -n $"Stopping $prog: "
            $exec stop
            retval=$?
            echo
            [ $retval -eq 0 ] && rm -f $lockfile
            return $retval
        }
    
        restart() {
            stop
            start
        }
    
        reload() {
            restart
        }
    
        force_reload() {
            restart
        }
    
        _status() {
            # run checks to determine if the service is running or use generic status
            status $status_prog
        }
    
        _status_q() {
            _status >/dev/null 2>&1
        }
    
    
        case "$1" in
            start)
                _status_q && exit 0
                $1
                ;;
            stop)
                _status_q || exit 0
                $1
                ;;
            restart)
                $1
                ;;
            reload)
                _status_q || exit 7
                $1
                ;;
            force-reload)
                force_reload
                ;;
            status)
                _status
                ;;
            condrestart|try-restart)
                _status_q || exit 0
                restart
                ;;
            *)
                echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
                exit 2
        esac
        exit $?
    

    配置开机时strongswan服务自启动

        cd /etc/init.d
        chmod +x strongswan
        chkconfig --add strongswan
        chkconfig strongswan on
    

    启动strongswan服务

    service strongswan start       #或者  ipsec start
    

    查看strongswan服务状态

    相关文章

      网友评论

        本文标题:linux: ipsec服务器搭建

        本文链接:https://www.haomeiwen.com/subject/mrkqkxtx.html