• 互联网密钥交换协议IKE(Internet Key Exchange)http://www.strongswan.org/docs/readme4.htm#section_4

IKE的三大组成协议:SKEME、Oakley、ISAKMP

  • IKE与ISAKMP

ISAKMP是IKE的核心协议。很多网络技术人员常常会认为IKE和ISAMKP是相同的概念。

  • IKE的两个阶段

第一阶段(Phase 1)分别可以使用6个包交换的主模式(Main Mode)或者3个包交换的主动模式(Aggressive Mode)来完成,产生IKE SA,第二阶段(Phase 2)使用3个包交换的快速模式(Quick Mode)来完成。通过预共享密钥认证的远程访问VPN,则第一阶段为主模式(Main Mode)。通过证书认证的远程访问VPN,则第一阶段为主动模式(Aggressive Mode)。

  • IKE SA是双向的,IPSec SA是单向的。

******以上IKE为IKEv1。******

  • 目的设备决定了SPI值。
  • IKEv1(RFC2409)与IKEv2(RFC4306)的区别

IKEv2取消了模式的概念。IKEv2相对于IKEv1在报文的数量和内容上都发生了变化。

所有的IKE交互是由成对的报文(请求和应答)组成的。每一对称为“交换”(exchange)。前面几个建立IKE SA的报文,我们称其为IKE_SA_INIT exchange和IKE_AUTH exchange,随后的是CREATE_CHILD_SA exchange和INFORMATIONAL exchange(RFC4306,Page3)。IKEv2的消息交换有三种类型:Initial Exchange,CREATE_CHILD_SA Exchange,INFORMATIONAL Exchange。在IKEv2中IKE SA仍然被称为IKE SA,而IPSec SA则被称为CHILD SA。

IKE交互总是始于IKE_SA_INIT和IKE_AUTH()。

关于IPSec具体细节了解,请参考《Cisco IPSec VPN实战指南》第三章(ISBN:9787115270030)、RFC2401、RFC2402、RFC2403、RFC2404、RFC2405、RFC2406、RFC2407、RFC2408、RFC2409、RFC2410、RFC2411、RFC2412(以上RFC部分已经过时)以及更新的RFC文档(RFC4306等)。《Cisco IPSec VPN实战指南》第三章对IKEv1的介绍比较全面。《IKEv2协议在Linux环境下的实现》(论文作者:刘骥宇)对IKEv2的介绍比较全面。


IPSec抓包,工具WireShark。

  • 配置:

Ubuntu1(虚拟机)——Ubuntu12.04LTS(32位)——IP192.168.31.128

Ubuntu2(虚拟机)——Ubuntu12.04LTS(32位)——IP192.168.31.129

通过apt-get install strongswan进行软件安装

ipsec version查询strongswan软件版本:Linux storngSwan U4.5.2/K3.2.0-24-generic-pae

对Ubuntu1进行配置:

配置/etc/ipsec.secrets

# This file holds shared secrets or RSA private keys for inter-Pluto
# authentication.  See ipsec_pluto(8) manpage, and HTML documentation.# RSA private key for this host, authenticating it to any other host
# which knows the public part.  Suitable public keys, for ipsec.conf, DNS,
# or configuration of other implementations, can be extracted conveniently
# with "ipsec showhostkey".# this file is managed with debconf and will contain the automatically created private key
include /var/lib/strongswan/ipsec.secrets.inc
192.168.31.128 : PSK "chu"

配置/etc/ipsec.conf

# ipsec.conf - strongSwan IPsec configuration file# basic configurationconfig setup# plutodebug=all# crlcheckinterval=600# strictcrlpolicy=yes# cachecrls=yes# nat_traversal=yesplutodebug=allcharondebug="ike 4"charonstart=yesplutostart=yes# Add connections here.# Sample VPN connections#conn sample-self-signed
#      left=%defaultroute
#      leftsubnet=10.1.0.0/16
#      leftcert=selfCert.der
#      leftsendcert=never
#      right=192.168.0.2
#      rightsubnet=10.2.0.0/16
#      rightcert=peerCert.der
#      auto=start#conn sample-with-ca-cert
#      left=%defaultroute
#      leftsubnet=10.1.0.0/16
#      leftcert=myCert.pem
#      right=192.168.0.2
#      rightsubnet=10.2.0.0/16
#      rightid="C=CH, O=Linux strongSwan CN=peer name"
#      keyexchange=ikev2
#      auto=start
conn host-to-hostleft=192.168.31.129right=192.168.31.128type=transportauthby=secretauto=startinclude /var/lib/strongswan/ipsec.conf.inc

配置/etc/strongswan.conf

# strongswan.conf - strongSwan configuration filecharon {# number of worker threads in charonthreads = 16# send strongswan vendor ID?# send_vendor_id = yesplugins {sql {# loglevel to log into sql databaseloglevel = -1# URI to the database# database = sqlite:///path/to/file.db# database = mysql://user:password@localhost/database
        }}filelog {/var/log/strongswan.log {time_format = %b %e %Tappend = nodefault = 4flush_line = yes}}# ...
}pluto {}libstrongswan {#  set to no, the DH exponent size is optimized#  dh_exponent_ansi_x9_42 = no
}

类似的,对Ubuntu2进行配置。

启动WireShark,进行捕包。通过ipsec restart,ipsec up host-to-host重启软件。之后可以在两台虚拟机之间进行交互,同时查看报文。

  • 符号:
Notation    PayloadAUTH      AuthenticationCERT      CertificateCERTREQ   Certificate RequestCP        ConfigurationD         DeleteE         EncryptedEAP       Extensible AuthenticationHDR       IKE HeaderIDi       Identification - InitiatorIDr       Identification - ResponderKE        Key ExchangeNi, Nr    NonceN         NotifySA        Security AssociationTSi       Traffic Selector - InitiatorTSr       Traffic Selector - ResponderV         Vendor ID

  • 报文介绍(RFC4306):

IKE首部(IKE header):

                     1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                       IKE_SA Initiator's SPI                  !!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                       IKE_SA Responder's SPI                  !!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!  Next Payload ! MjVer ! MnVer ! Exchange Type !     Flags     !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                          Message ID                           !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                            Length                             !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

通用载荷首部(Generic Payload Header):

每个IKE载荷都以一个通用载荷首部开始。

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

******RFC4306和《IKEv2协议在Linux环境下的实现》(论文作者:刘骥宇)对报文的介绍很全面。下面只做简单介绍。******

Security Association Payload:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                          <Proposals>                          ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Proposal Substructure

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! 0 (last) or 2 !   RESERVED    !         Proposal Length       !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Proposal #    !  Protocol ID  !    SPI Size   !# of Transforms!+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+~                        SPI (variable)                         ~+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                        <Transforms>                           ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Transform Substructure

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! 0 (last) or 3 !   RESERVED    !        Transform Length       !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!Transform Type !   RESERVED    !          Transform ID         !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                      Transform Attributes                     ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Transform Attributes

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!A!       Attribute Type        !    AF=0  Attribute Length     !!F!                             !    AF=1  Attribute Value      !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                   AF=0  Attribute Value                       !!                   AF=1  Not Transmitted                       !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Key Exchange Payload:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!          DH Group #           !           RESERVED            !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                       Key Exchange Data                       ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Identification Payloads:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!   ID Type     !                 RESERVED                      |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                   Identification Data                         ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Certificate Payload:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Cert Encoding !                                               !+-+-+-+-+-+-+-+-+                                               !~                       Certificate Data                        ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Certificate Request Payload:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Cert Encoding !                                               !+-+-+-+-+-+-+-+-+                                               !~                    Certification Authority                    ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Authentication Payload:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Auth Method   !                RESERVED                       !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                      Authentication Data                      ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Nonce Payload:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                            Nonce Data                         ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Notify Payload:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!  Protocol ID  !   SPI Size    !      Notify Message Type      !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                Security Parameter Index (SPI)                 ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                       Notification Data                       ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Delete Payload:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Protocol ID   !   SPI Size    !           # of SPIs           !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~               Security Parameter Index(es) (SPI)              ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Vendor ID Payload:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                        Vendor ID (VID)                        ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Traffic Selector Payload:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Number of TSs !                 RESERVED                      !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                       <Traffic Selectors>                     ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Traffic Selector:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!   TS Type     !IP Protocol ID*|       Selector Length         |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|           Start Port*         |           End Port*           |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                         Starting Address*                     ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                         Ending Address*                       ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Encrypted Payload:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                     Initialization Vector                     !!         (length is block size for encryption algorithm)       !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+~                    Encrypted IKE Payloads                     ~+               +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!               !             Padding (0-255 octets)            !+-+-+-+-+-+-+-+-+                               +-+-+-+-+-+-+-+-+!                                               !  Pad Length   !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+~                    Integrity Checksum Data                    ~+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Cofiguration Payload:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C! RESERVED    !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!   CFG Type    !                    RESERVED                   !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                   Configuration Attributes                    ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Configuration Attributes:

                           1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!R|         Attribute Type      !            Length             |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+|                                                               |~                             Value                             ~|                                                               |+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Extensible Authentication Protocol (EAP) Payload:

                            1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+! Next Payload  !C!  RESERVED   !         Payload Length        !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!                                                               !~                       EAP Message                             ~!                                                               !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+Figure :  EAP Payload Format1                   2                   30 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!     Code      ! Identifier    !           Length              !+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+!     Type      ! Type_Data...+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-Figure :  EAP Message Format

  • 过程分析、密钥推导及示例 :

IKE_SA_INIT:

Initiator                          Responder
-----------                        -----------
HDR, SAi1, KEi, Ni   --><--    HDR, SAr1, KEr, Nr, [CERTREQ]

IKE_AUTH:

Initiator                          Responder
-----------                        -----------
HDR, SK {IDi, [CERT,] [CERTREQ,] [IDr,]AUTH, SAi2, TSi, TSr}     --><--    HDR, SK {IDr, [CERT,] AUTH,SAr2, TSi, TSr}

CREATE_CHILD_SA:

Initiator                                 Responder
-----------                               -----------
HDR, SK {[N], SA, Ni, [KEi],[TSi, TSr]}             --><--    HDR, SK {SA, Nr, [KEr],[TSi, TSr]}

Extensible Authentication Protocol Methods

       Initiator                          Responder-----------                        -----------HDR, SAi1, KEi, Ni         --><--    HDR, SAr1, KEr, Nr, [CERTREQ]HDR, SK {IDi, [CERTREQ,] [IDr,]SAi2, TSi, TSr}   --><--    HDR, SK {IDr, [CERT,] AUTH,EAP }HDR, SK {EAP}              --><--    HDR, SK {EAP (success)}HDR, SK {AUTH}             --><--    HDR, SK {AUTH, SAr2, TSi, TSr }

动画(动画摘自一个日本网站,注意:动画中出现的CHILD_SA是第二个CHILD_SA):

查看日志文件(/var/log/strongswan.log):

Dec 28 10:13:35 03[CFG] selected proposal: IKE:AES_CBC_128/HMAC_SHA1_96/PRF_HMAC_SHA1/MODP_2048
Dec 28 10:13:35 03[IKE] shared Diffie Hellman secret => 256 bytes @ 0xae6015e8
Dec 28 10:13:35 03[IKE]    0: C3 38 18 E2 B0 74 E0 A9 FF 4F 86 D8 97 C4 FB BF  .8...t...O......
Dec 28 10:13:35 03[IKE]   16: CC 85 DF 19 4F ED A1 A2 F6 9B 06 8A 8F 33 35 66  ....O........35f
Dec 28 10:13:35 03[IKE]   32: 7E A0 A0 5D A1 86 5A C3 60 52 E5 1D 00 69 70 42  ~..]..Z.`R...ipB
Dec 28 10:13:35 03[IKE]   48: 6A D8 08 85 9A 26 62 6A 52 7E 93 00 AE B7 A2 83  j....&bjR~......
Dec 28 10:13:35 03[IKE]   64: 44 03 F6 C4 12 DB 8D E3 5D C4 85 39 43 63 A1 F7  D.......]..9Cc..
Dec 28 10:13:35 03[IKE]   80: B6 8E 70 61 A1 3A D0 0B 9A BF EF B8 04 89 31 16  ..pa.:........1.
Dec 28 10:13:35 03[IKE]   96: C3 07 11 F2 AF BC 0D 6D AE 70 CB 61 E4 68 33 69  .......m.p.a.h3i
Dec 28 10:13:35 03[IKE]  112: AF A0 BC 0A A8 93 DC 42 C4 8C 91 47 6E 43 F9 3C  .......B...GnC.<
Dec 28 10:13:35 03[IKE]  128: 30 7D B6 EF AD F4 31 99 91 DA E8 8D 05 AD 3D 8A  0}....1.......=.
Dec 28 10:13:35 03[IKE]  144: 76 BE 60 1B EF D6 80 E2 29 13 30 48 35 16 88 F1  v.`.....).0H5...
Dec 28 10:13:35 03[IKE]  160: 6B 49 64 83 B5 FE 2F FA 9C 32 7A A4 75 0A 57 09  kId.../..2z.u.W.
Dec 28 10:13:35 03[IKE]  176: 0F C3 85 4C 9D 43 01 12 87 51 72 C4 34 CD 8B BB  ...L.C...Qr.4...
Dec 28 10:13:35 03[IKE]  192: 8F 0B 96 30 3E E4 82 4D 30 1E 48 4D AB 05 04 93  ...0>..M0.HM....
Dec 28 10:13:35 03[IKE]  208: 94 C3 51 8D 6C A2 AD DA 5A 6A 72 CD 5A 95 91 53  ..Q.l...Zjr.Z..S
Dec 28 10:13:35 03[IKE]  224: 0E 6B 88 1D 8A C1 56 64 5B 29 3B FD EB 8E 36 75  .k....Vd[);...6u
Dec 28 10:13:35 03[IKE]  240: F5 40 53 2E 12 4B B2 CF 96 77 DC 2E 74 8E AA 32  .@S..K...w..t..2
Dec 28 10:13:35 03[IKE] SKEYSEED => 20 bytes @ 0xae600d98
Dec 28 10:13:35 03[IKE]    0: 03 84 B5 63 28 BE D6 CB 88 6A 12 72 5F 80 C6 E0  ...c(....j.r_...
Dec 28 10:13:35 03[IKE]   16: 3C 8D 58 85                                      <.X.
Dec 28 10:13:35 03[IKE] Sk_d secret => 20 bytes @ 0xae600d98
Dec 28 10:13:35 03[IKE]    0: 94 C8 E5 18 41 36 E8 40 76 3F CF B0 06 C0 F5 13  ....A6.@v?......
Dec 28 10:13:35 03[IKE]   16: 1F D4 71 3E                                      ..q>
Dec 28 10:13:35 03[IKE] Sk_ai secret => 20 bytes @ 0xae601830
Dec 28 10:13:35 03[IKE]    0: 55 4E 5B 4C 04 4D D8 74 F3 46 F6 6A ED 64 A0 72  UN[L.M.t.F.j.d.r
Dec 28 10:13:35 03[IKE]   16: FD 1B 94 B1                                      ....
Dec 28 10:13:35 03[IKE] Sk_ar secret => 20 bytes @ 0xae601830
Dec 28 10:13:35 03[IKE]    0: 3B 9D 67 16 C4 7F F9 1C B9 48 B4 50 24 E6 DF D1  ;.g......H.P$...
Dec 28 10:13:35 03[IKE]   16: 23 A6 F7 65                                      #..e
Dec 28 10:13:35 03[IKE] Sk_ei secret => 16 bytes @ 0xae601830
Dec 28 10:13:35 03[IKE]    0: C3 19 5B 61 15 67 31 41 F9 FD 04 A5 E9 A9 2A 68  ..[a.g1A......*h
Dec 28 10:13:35 03[IKE] Sk_er secret => 16 bytes @ 0xae601830
Dec 28 10:13:35 03[IKE]    0: FF 8F D1 4A 24 75 A1 11 45 ED 54 A4 2D 82 A7 49  ...J$u..E.T.-..I
Dec 28 10:13:35 03[IKE] Sk_pi secret => 20 bytes @ 0xae601830
Dec 28 10:13:35 03[IKE]    0: 92 AF 3B 31 1D B3 13 19 09 6E A2 A6 9D 69 23 DC  ..;1.....n...i#.
Dec 28 10:13:35 03[IKE]   16: 55 65 73 B7                                      Ues.
Dec 28 10:13:35 03[IKE] Sk_pr secret => 20 bytes @ 0xae601898
Dec 28 10:13:35 03[IKE]    0: DF EA 0F 58 B3 1A F8 6D 50 23 33 22 88 0A 37 8C  ...X...mP#3"..7.
Dec 28 10:13:35 03[IKE]   16: 18 06 10 17                                      ....
Dec 28 10:13:35 03[IKE] natd_chunk => 22 bytes @ 0xae601848
Dec 28 10:13:35 03[IKE]    0: 98 BF 72 C6 0A 1F 1A CF 21 ED 97 EB 42 88 70 E6  ..r.....!...B.p.
Dec 28 10:13:35 03[IKE]   16: C0 A8 1F 80 01 F4                                ......

根据日志文件,对WireShark进行配置(Edit-->Preferences...-->Protocols-->ISAKMP)可以解密ISAKMP报文,其中Initiator's SPI为98BF72C60A1F1ACF,Responder's SPI为21ED97EB428870E6:

WireShark截图:

pfr参与IKE SA和CHILD SA所有密码学算法中密钥材料(Keying Material)的构造。本示例中prf为HMAC-SHA1。我们定义prf+ (K,S) = T1 | T2 | T3 | T4 | ...

where:
T1 = prf (K, S | 0x01)
T2 = prf (K, T1 | S | 0x02)
T3 = prf (K, T2 | S | 0x03)
T4 = prf (K, T3 | S | 0x04)

Initiator向Responder发送HDR,SAi1,KEi(3a:84:74:0d:71:c2:17:99:5b:65:fe:66:e8:62:8b:87:4b:86:64:06:b6:db:5e:ae:54:db:e1:d1:68:7f:ef:a3:72:58:a7:32:cb:e3:fa:d1:eb:a2:58:72:1c:81:39:2a:ba:3d:15:d3:57:85:6f:9e:bc:87:0d:de:75:85:9e:f2:89:19:5a:ea:a9:52:3a:ec:4b:a6:0e:f3:9e:8a:20:8a:5f:8c:38:11:54:e0:12:c9:97:be:f4:d5:99:86:7e:80:19:fb:5d:df:17:8e:cf:b6:54:20:e9:50:8b:54:35:31:37:ce:5b:17:bd:47:b7:d4:36:2e:2f:d9:e3:39:e1:23:cc:6e:67:06:90:32:f7:5d:7f:30:b1:89:36:92:49:f4:2b:28:1f:36:bb:4f:83:72:d0:75:0e:d4:0a:45:bb:c1:ca:94:a5:7b:32:25:b8:52:da:cf:78:0b:da:94:3a:3e:7f:9a:86:e8:9c:78:c0:87:c8:b1:e3:76:c9:ff:61:c1:92:e6:fe:0f:52:08:66:2b:20:5e:2d:7a:66:b0:3a:b1:a9:17:7f:e0:5a:c5:1b:1c:b6:39:90:4c:96:9b:4c:ae:fb:ac:93:81:ee:58:b1:92:40:27:1f:1b:59:05:5b:16:68:2a:e3:ce:73:c7:03:2b:6d:35:fa:df:87:e8:af:7b),Ni(53:c4:c8:1d:01:8d:31:3c:df:87:63:7c:91:87:08:ad:5f:f0:f4:c6:e9:40:f2:6d:1f:bd:a5:58:c9:ce:72:de)。

Responder向Initiator发送HDR,SAr1,KEr(ff:ed:23:62:50:d1:e9:97:04:93:5c:21:42:d0:c6:a5:e1:12:b2:55:f4:fd:20:76:e4:f7:bd:69:ed:e3:e9:ff:ac:9b:0e:f2:65:6f:d5:93:89:fa:aa:27:90:c4:19:2d:35:f1:3c:6c:0b:8f:60:47:cd:2a:ce:cc:9a:f5:da:2e:df:fe:e5:60:1c:18:d7:93:f8:e7:78:27:78:54:e2:79:e3:65:c3:10:de:60:8c:3f:11:2d:bb:f9:6c:b0:39:63:11:82:db:2c:5e:7e:d2:ad:6d:dd:ba:9e:d5:fb:5b:ac:91:7c:20:a9:64:0b:89:1f:fa:30:8d:99:15:4e:b6:c4:ad:66:25:a9:ef:b1:7a:0c:db:0f:97:88:5d:c5:4c:ca:54:0a:40:b2:22:6c:7a:ac:77:ff:de:8e:23:cc:8d:e7:29:40:39:ce:2d:80:0a:17:6d:f4:5d:57:df:35:f6:5d:da:3b:fc:c8:06:72:cc:36:d5:99:99:0d:70:df:eb:ca:03:6f:66:30:fb:50:31:da:b1:11:c2:41:e4:db:aa:c4:40:27:fc:b5:39:62:8e:65:7a:ae:3a:a4:aa:d3:06:8b:cf:37:41:6a:51:27:5d:71:9c:8e:30:98:15:e1:ac:ca:05:c4:46:86:57:5d:69:6b:6a:90:a5:b3:09:26:bc:e5),Nr(52:60:d6:73:63:b5:e4:a8:e9:c7:c9:34:d4:67:90:04:7a:06:84:e2:a9:fc:45:0f:06:b2:12:8d:d9:ea:7f:a7)。

双方协商产生一个密码套件。使用SKEYSEED = prf (Ni | Nr, g^ir)计算出SKEYSEED。SKEYSEED可以用来计算其他七个数据:使用SK_d为CHILD SA导出新密钥;使用SK_ai和SK_ar作为完整性校验的密钥,来认证随后交换中的信息;使用SK_ei和SK_er加解密随后交换中的信息;使用SK_pi和SK_pr产生Authentication Payload。

{SK_d | SK_ai | SK_ar | SK_ei | SK_er | SK_pi | SK_pr } = prf+ (SKEYSEED, Ni | Nr | SPIi | SPIr )。

Initiator向Responder发送HDR, SK {IDi, IDr, AUTH, SAi2, TSi, TSr}。Responder向Initiator发送HDR, SK {IDr, AUTH, SAr2, TSi, TSr}。Initiator使用SAi2协商第一个CHILD_SA,其中SAi2的SPI值为c5:f3:ab:a5,SAr2的SPI值为c9:90:88:01。

“ipsec up host-to-host”命令产生第二个CHILD_SA。Initiator向Responder发送HDR, SK {SA, Ni, TSi,TSr}。Responder向Initiator发送HDR, SK {SA, Nr, TSi, TSr}。其中Initiator向Responder发送SA的SPI值为c8:67:c3:57,Responder向Initiator发送SA的SPI值为cb:27:94:13。双方协商产生一个密码套件,使用ESP传输报文;对于密码套件中密码方案所需要的(多个)密钥,由KEYMAT = prf+(SK_d, Ni | Nr)生成KEYMAT,对KEYMAT按照密钥长度(不断)截取。如果采取完美向前保密(PFS,Perfect Forward Secrecy),则采用KEYMAT = prf+(SK_d, g^ir (new) | Ni | Nr ),其中g^ir (new)由CREATE_CHILD_SA交换中的信息生成。主机(192.168.31.128)ping主机(192.168.31.129)进行测试,有上图结果。

在日志文件(/var/log/strongswan.log)中,有如下记录:

Dec 28 10:13:50 14[CFG] selected proposal: ESP:AES_CBC_128/HMAC_SHA1_96/NO_EXT_SEQ
Dec 28 10:13:50 14[CFG] selecting traffic selectors for us:
Dec 28 10:13:50 14[CFG]  config: 192.168.31.128/32, received: 192.168.31.128/32 => match: 192.168.31.128/32
Dec 28 10:13:50 14[CFG] selecting traffic selectors for other:
Dec 28 10:13:50 14[CFG]  config: 192.168.31.129/32, received: 192.168.31.129/32 => match: 192.168.31.129/32
Dec 28 10:13:50 14[CHD] seed => 64 bytes @ 0xb0166fc0
Dec 28 10:13:50 14[CHD]    0: AE 79 87 64 2D CD E0 06 1C 92 D9 30 C3 F7 59 2B  .y.d-......0..Y+
Dec 28 10:13:50 14[CHD]   16: 97 CC EA 71 E2 10 A1 56 35 E4 41 F0 48 B6 38 2B  ...q...V5.A.H.8+
Dec 28 10:13:50 14[CHD]   32: 64 DB F6 D2 9F AA B2 80 E2 A7 27 4B 4D 67 F6 74  d.........'KMg.t
Dec 28 10:13:50 14[CHD]   48: EE 18 D9 8D 73 03 60 AC 07 30 D0 AA C0 5B CD 00  ....s.`..0...[..
Dec 28 10:13:50 14[CHD]   using AES_CBC for encryption
Dec 28 10:13:50 14[CHD]   using HMAC_SHA1_96 for integrity
Dec 28 10:13:50 14[CHD] encryption initiator key => 16 bytes @ 0xae804bb8
Dec 28 10:13:50 14[CHD]    0: FB CA 2A 70 F4 0E E4 9F 78 DF C3 A7 B5 26 02 DE  ..*p....x....&..
Dec 28 10:13:50 14[CHD] encryption responder key => 16 bytes @ 0xae804650
Dec 28 10:13:50 14[CHD]    0: 5E 05 04 5D D1 B4 B4 BC 7B 94 19 BB BF 2E FB 3B  ^..]....{......;
Dec 28 10:13:50 14[CHD] integrity initiator key => 20 bytes @ 0xae801178
Dec 28 10:13:50 14[CHD]    0: 9B C2 6E 54 C5 FC E3 CF 7F 75 84 EA 21 58 AC 85  ..nT.....u..!X..
Dec 28 10:13:50 14[CHD]   16: 50 5C 18 B4                                      P\..
Dec 28 10:13:50 14[CHD] integrity responder key => 20 bytes @ 0xae800628
Dec 28 10:13:50 14[CHD]    0: 0C 26 9F 57 83 47 46 BF 41 99 19 4D E2 A4 5F C7  .&.W.GF.A..M.._.
Dec 28 10:13:50 14[CHD]   16: 7B AE 85 F6                                      {...
Dec 28 10:13:50 14[CHD] adding inbound ESP SA(SA是有方向的)
Dec 28 10:13:50 14[CHD]   SPI 0xc867c357, src 192.168.31.129 dst 192.168.31.128
Dec 28 10:13:50 14[KNL] adding SAD entry with SPI c867c357 and reqid {2}
Dec 28 10:13:50 14[KNL]   using encryption algorithm AES_CBC with key size 128
Dec 28 10:13:50 14[KNL]   using integrity algorithm HMAC_SHA1_96 with key size 160

Dec 28 10:13:50 14[CHD] adding outbound ESP SA
Dec 28 10:13:50 14[CHD]   SPI 0xcb279413, src 192.168.31.128 dst 192.168.31.129
Dec 28 10:13:50 14[KNL] adding SAD entry with SPI cb279413 and reqid {2}
Dec 28 10:13:50 14[KNL]   using encryption algorithm AES_CBC with key size 128
Dec 28 10:13:50 14[KNL]   using integrity algorithm HMAC_SHA1_96 with key size 160

根据日志文件,对WireShark进行配置(Edit-->Preferences...-->Protocols-->ESP)可以解密ESP报文:

每个菜鸟都有鹰的梦想

STRONGSWAN源代码学习1_IPSEC学习相关推荐

  1. 【杂谈】如何在言有三本人的随时答疑下, 长期而系统地学习深度学习和计算机视觉,这是有三AI的完整计划...

    对深度学习从业者要说的话 深度学习的前身是神经网络,属于机器学习技术中的一种,诞生于半个多世纪以前,随着计算硬件水平的提升,工业大数据的积累以及相关理论的完善,如今得以在各行各业大展拳脚.从应用领域来 ...

  2. 【杂谈】2020年如何长期、系统,全面地学习深度学习和计算机视觉,这是有三AI的完整计划...

    对深度学习从业者要说的话 深度学习的前身是神经网络,属于机器学习技术中的一种,诞生于半个多世纪以前,随着计算硬件水平的提升,工业大数据的积累以及相关理论的完善,如今得以在各行各业大展拳脚.从应用领域来 ...

  3. 【深度学习】学习深度学习的最好方法

    学习深度学习的最好方法 亲自实现,从零开始编写能运行的程序,一遍看源代码一边思考.只有这样才能正确理解深度学习,才能对那些看起来很高级的技术有完整的理解. 不依赖第三方库,从最基础的开始实现起,对于理 ...

  4. 嵌入式Linux+Android学习路线图+学习进度

    嵌入式Linux+Android学习路线图 转载:http://www.100ask.net/a/howtostudy/ 重拾Linux驱动,就按照百问网的步骤一步一步做,看自己最后能坚持到哪一步!! ...

  5. 《故障诊断与python学习》学习资料记录

    学习资料记录,持续更新 包络谱是什么 包络谱程序例子 问题:Consider using the `--user` option or check the permissions. 问题:Check ...

  6. 深度学习 免费课程_深入学习深度学习,提供15项免费在线课程

    深度学习 免费课程 by David Venturi 大卫·文图里(David Venturi) 深入学习深度学习,提供15项免费在线课程 (Dive into Deep Learning with ...

  7. vs2010 学习Silverlight学习笔记(7):控件样式与模板

    概要: 终于知道Silverlight--App.xaml是干什么用的了,不仅可以用来封装样式(类似css),还可以制定控件模版...好强大的功能啊. 封装: 继续学习<一步一步学Silverl ...

  8. 与 Linux 一起学习:学习打字

    "与 Linux 一起学习"的所有文章: 与 Linux 一起学习:学习打字 与 Linux 一起学习:学习物理 与 Linux 一起学习:学习音乐 与 Linux 一起学习:学习 ...

  9. 还只看花书,西瓜书?一文告诉你如何正确学习深度学习,从理论到实战。

    如今春招已接近尾声,大家都知道今年就业形势整体不乐观,不仅应聘人数远远大于招聘岗位,而且面试难度加大,想拿到理想的offer更是难上加难! 这段时间,很多人都在自我充电,我也经常在后台给读者解答很多深 ...

最新文章

  1. 监控摄像头服务器维护要多久,监控摄像机如何维护 这几点要牢记
  2. Where we can find sharepoint user list
  3. 原创:E325: ATTENTION vim超完整超给力的问题与解决方法
  4. ITK:计算网格的平面参数化
  5. 排序算法-08基数排序(python实现)
  6. 台湾印象之五:宝岛万象
  7. api接口怎么对接_系统对接项目管理方面怎么做?从一次项目接口对接说起
  8. 用Node-Inspector调试NodeJs程序
  9. 使用商业模式的九大模块去分析京东的商业模式_【荐读】商业模式新生代
  10. 如何测试sql语句性能,提高执行效率
  11. 无人机图像深度学习的大豆害虫检测与分类
  12. iOS 容器 addChildViewController
  13. Android像素密度dpi/ppi计算公式,px、sp、dp互转工具类——概念解释
  14. 进入中国内地第31年的麦当劳 ,为什么还能不断吸引新消费人群?
  15. 中青年人脑白质的年龄效应和性别差异:DTI、NODDI 和 q 空间研究
  16. C语言编程实现书号查询功能,图书图书管理系统——查询模块的设计与实现(C语言).doc...
  17. 归并排序算法(C语言)
  18. 计算机如何调音乐模式,均衡器如何调,音乐更好听
  19. D3.js的v5版本入门教程(第六章)——做一个简单的图表
  20. 由一道考研基础题引发的关于对(函数导数符号在内外的区别)f‘(x)和[f(x)]‘的区别思考

热门文章

  1. 企业物联卡如何充值,几百张卡能同时充值吗?【物联卡中心】
  2. 以太坊网络区块浏览器blocksout技术简要分析
  3. 【A40i-Android7.1】---编译报错:drivers/soc/allwinner/pm/.pm_debug.o.cmd:457: *** missing separator. Stop
  4. NewtonsoftJson的使用整理
  5. 【Linux学习笔记】Linux下安装Libreoffice
  6. 【转】DICOM通讯(ACSE->DIMSE->Worklist)
  7. 领导给下属写周报,我看行
  8. direct wifi 投屏_direct wifi 投屏_告别Wifi直接投 AOC无线投屏显示器轻松用
  9. MTK4G安卓核心板_XY6739CW(MTK6739平台)详细参数性能
  10. 黑马程序员_考生成绩管理系统