linux整理

linux: ipsec服务器搭建

2017-07-17  本文已影响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服务状态

上一篇下一篇

猜你喜欢

热点阅读