有必要说说这个StrongSwan在Fedora & FreeBSD上面怎么搞起来

@vrqq  August 1, 2016
难在配置文件,网上参照了很多版本才解决,要知道其原理。
在升级strongswan之后 按官方文档推荐将配置文件迁移至swanctl 更新在文末

热点问题

Q: 为何我的水果手机跑着这么稳定的iOS系统还会无故掉线,据网上人们统计是8分钟左右。
A:参考了一个网上的帖子,改加密方式即可

原来的:ike = aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024!
改为:ike = aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048!

Q: Windows为何连不上?
A: 强壮大鹅官网 解释了这个问题,因windows不支持modp2048,可能需要迁就一下,建议升级至swanctl后再为windows连接单独写一条配置,和"ios需要mod2048"分开
https://docs.strongswan.org/docs/5.9/interop/windowsClients.html

Q: 为何strongswan前台可以运行,连接正常,使用service strongswan start就不能运行了呢。。
A: 参考后文Part3 SELinux问题

Q: linux和Unix配置一样吗?官方说推荐换到swanctl样例有没有?
A: 原理和Strongswan配置一样,根据不同发行版修改防火墙即可
FreeBSD防火墙配置举例见此: https://blog.vrqq.org/archives/847/

Part0 系统信息

Server端:用的系统自带源直接dnf install strongswan
redhat-release: Fedora release 24 (Twenty Four)
strongswan version:
Linux strongSwan U5.4.0/K4.5.5-300.fc24.x86_64
Institute for Internet Technologies and Applications
University of Applied Sciences Rapperswil, Switzerland
See 'strongswan --copyright' for copyright information.
手机端:
ios8 ios9 均有测试
现在的环境是 iphone5 ios 9.3.3(13G34)
电脑端:
白苹果 Mac OS X EI Caption Version 10.11.6

Part1 原理

先说证书,我们至少需要两个证书:一是CA证书(ca.cert就是那些收费的例如VeriSign啊),二是加密连接时候用的证书(server.cert)。
CA证书当然用一个自己生成的啦。。。
证书的关系可以网上查查,整个加密流程和https有点相像,首先客户端和服务器均持有CA证书ca.cert。
然后连接过程:

  • 就是用户端持有可信任的ca证书(当然是公钥啦),并且添加到System中让系统Trust一下。
  • 客户端发起ikeV2连接以后服务器传来server.cert,客户端用ca来验证服务器发来的server.cert公钥,如果验证结果是合理又合法的,那么我们认为这个server可信。
  • 于此同时,客户端提交自己的用户名&密码给服务器。
  • 验证结束,我猜交换数据使用server.cert加密,服务器拿到密文使用server.key(私钥)解密。但是事实上不是这样的,因为vpn运行过程中还有rekey过程会不断更换加密key。。。

Part2 配置文件

更新:letsEncrypt生成ikeV2证书方法,巨简单无比!(本地没有跑httpd的,可以把--manual换成--standalone,自动启一个httpd)
原来的有个错误 /etc/letsencrypt/live/vpn.test.com/ 文件夹下面全是link快捷方式!!
需要去/etc/letsencrypt/archive/vpn.test.com复制

#!/bin/sh
certbot certonly --manual -d vpn.test.com
cd /etc/letsencrypt/archive/vpn.test.com
cp fullchain.pem /etc/strongswan/ipsec.d/certs/
chcon -u system_u /etc/strongswan/ipsec.d/certs/fullchain.pem
cp privkey.pem /etc/strongswan/ipsec.d/private/
chcon -u system_u /etc/strongswan/ipsec.d/private/privkey.pem
cp chain.pem /etc/strongswan/ipsec.d/cacerts/
chcon -u system_u /etc/strongswan/ipsec.d/cacerts/chain.pem

更新:可以使用letsEncrypt生成,避免电脑端还要装证书。。https://wuruxu.blogspot.com/2016/12/letsencrypt-strongswan-ikev2-vpn.html

先看生成证书命令:样例域名vpn.test.com,样例服务器ip 1.2.3.4

生成Root CA证书,用来签名所有
strongswan pki --gen --outform pem > ca.pem
strongswan pki --self --in ca.pem --dn "C=CN, O=Sample Organization, CN=Sample CA" --ca --lifetime 3650 --outform pem >ca.cert.pem

生成Server端证书,连接时候发给客户端,客户端使用CA解开server.cert.pem,使用它加密连接
strongswan pki --gen --outform pem > server.pem
strongswan pki --pub --in server.pem | strongswan pki --issue --lifetime 600 --cacert ca.cert.pem \
--cakey ca.pem --dn "C=CN, O=Sample, CN=vpn.test.com" \
--san="1.2.3.4" --san="vpn.test.com" --flag serverAuth --flag ikeIntermediate \
--outform pem > server.cert.pem

再看ipsec.conf:

config setup
    uniqueids=never

conn %default
    keyexchange=ike
    left=%any
    leftsubnet=0.0.0.0/0
    right=%any

conn IKE-BASE
    leftca=ca.cert.pem
    leftcert=server.cert.pem
    rightsourceip=10.0.1.0/24

conn IKEv2-EAP
    also=IKE-BASE
    keyexchange=ikev2
    ike = aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024!
    esp = aes256-sha256,3des-sha1,aes256-sha1!
    rekey=no
    leftid=vultr.vrqq.org
    leftauth=pubkey
    leftsendcert=always
    right=%any
    rightfirewall=yes
    rightsourceip=10.0.1.0/24
    rightsendcert=never
    rightauth=eap-mschapv2
    eap_identity=%any
    dpdaction=clear
    fragmentation=yes
    auto=add

最后看strongswan.conf

#strongswan.conf-strongSwanconfigurationfile
#
#Refertothestrongswan.conf(5)manpagefordetails
#
#Configurationchangesshouldbemadeintheincludedfiles
charon{
    load_modular=yes
    duplicheck.enable=no
    compress=yes
    plugins {
        include strongswan.d/charon/*.conf
    }
    dns1=8.8.8.8
    dns2=8.8.4.4
    nbns1=8.8.8.8
    nbns2=8.8.4.4
}
include strongswan.d/*.conf

顺便看一下logger配置charon-logging.conf

charon {
    # Section to define file loggers, see LOGGER CONFIGURATION in
    # strongswan.conf(5).
    filelog {
        # <filename> is the full path to the log file.
        /var/log/strongswan-charon.log {
            # If this option is enabled log entries are appended to the existing file.
            append = no
            # Default loglevel.
            default = 2
            # Enabling this option disables block buffering and enables line buffering.
            flush_line = yes
            # Prefix each log entry with the connection name and a unique
            # numerical identifier for each IKE_SA.
            ike_name = yes
            # Prefix each log entry with a timestamp. The option accepts a
            # format string as passed to strftime(3).
            time_format = %b %e %T
        }
    }
    # Section to define syslog loggers, see LOGGER CONFIGURATION in strongswan.conf(5).
    syslog {
    }
}

Part3 防火墙或者iptables问题 && SELinux问题

这个首先,我们说SELinux是个好东西,我们不能关他!
然后我觉得firewall也挺好用的吧。。当然iptables也可以:

#Only ipsec转发规则
#参考http://www.ducea.com/2006/08/01/how-to-enable-ip-forwarding-in-linux/
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -o ens3 -j MASQUERADE


#firewalld配置 see also:
#https://raymii.org/s/tutorials/IPSEC_vpn_with_CentOS_7.html#Firewall_&_Packet_Routing
firewall-cmd --permanent --add-rich-rule='rule protocol value="esp" accept' # ESP (the encrypted data packets)
firewall-cmd --permanent --add-rich-rule='rule protocol value="ah" accept' # AH (authenticated headers)
firewall-cmd --permanent --add-port=500/udp #IKE  (security associations)
firewall-cmd --permanent --add-port=4500/udp # IKE NAT Traversal (IPsec between natted devices)
firewall-cmd --permanent --add-service="ipsec"
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
firewall-cmd --list-all

SELinux问题,参考这个链接给各种文件赋SELinux的属性即可
http://linuxmanpages.net/manpages/fedora21/man8/ipsec_selinux.8.html
版本有点老。。自行google。。
SELinux主要使用这么几个命令
查看权限ls -laZ 这个大Z就可以看selinux
给权限chcon -s啦-u啦-t啦什么的
一定记得上面改配置文件的话如果是新建的文件,一定一定要按照链接里的要求给上selinux权限,要不就会出现一个问题:strongswan前台运行可以连接,转为server运行就不行了。。

更新至swanctl

按官网说明,将配置迁至/usr/local/etc/swanctl/swanctl.conf,将证书迁至x509, x509ca, private三文件夹

connections {
    IKEV2_EAP {
        unique = never
        version = 2
        local_addrs  = %any
        remote_addrs = %any

        # leftca=chain.pem
        local {
            id    = vultr.vrqq.org
            auth  = pubkey
            certs = fullchain.pem
        }

        remote {
            eap_id = %any
            auth   = eap-mschapv2
        }

        children {
            mychild {
                local_ts = 0.0.0.0/0
                esp_proposals = aes256-sha256,3des-sha1,aes256-sha1
                dpd_action = clear
            }
        }

        #proposals = aes256-sha256-modp1024,3des-sha1-modp1024,aes256-sha1-modp1024
        proposals = aes256-sha256-modp2048,3des-sha1-modp2048,aes256-sha1-modp2048

        # rightfirewall=yes
        rekey_time    = 170m
        send_cert     = always
        send_certreq  = no
        fragmentation = yes
        pools = iospool

    }
}

pools {
    iospool {
        addrs = 10.0.1.0/24
        dns = 8.8.8.8,223.5.5.5
    }
}

secrets {
    ike-ikeuser1 {
        secret = YOUR_PSK
    }
    eap-eapuser1 {
        id = "username"
        secret = "password"
    }
}

添加新评论