顯示具有 vpn 標籤的文章。 顯示所有文章
顯示具有 vpn 標籤的文章。 顯示所有文章

2010年12月27日 星期一

xauth client dpd can not work!

在ipsec tunnel建立後,「雙方」都同意DPD,那兩邊都會送R_U_HERE並等待R_U_HERE_ACK來「確認」
對方是否存在,當在XAUTH時,有個bug:(只有xauthserver會送R_U_HERE),這樣的結果會變成:
只有xauthserver會detect xclient是否存在,但xclient不會知道xserver出問題…
openswan-2.6.24:dpd.c,timer.c,state.c,ikev1.c
APIs: 
event_schedule(enum event_type type, time_t tm, struct state *st):註冊事件
dpd_event(struct state *st): 在event_schedule()的EVENT_DPD timer timeout時的callback

有關DPD的event有兩個EVENT_DPD和EVENT_DPD_TIMEOUT

stf_status dpd_init(struct state *st):在ipsec tunnel建立且DPD enabled時會inital DPD
  的計時器:在isakmp的sa建立及quick_mode(quick_inI2(),quick_inR1_outI2_cryptotail())建立時都會call一次。
dpd_outI(): 送出R_U_THERE,然後記錄DPD delay和DPD timeout時間

重要structs:
struct connection:一個tunnel profile object,記錄該參數,eg:name, policy, ike,ipsec life time etc...有關dpd的部分如下
  • time_t          dpd_delay;              /* time between checks */ 
  • time_t          dpd_timeout;            /* time after which we are dead */
  • enum dpd_action dpd_action;             /* what to do when we die */ 
struct state: state object,記錄sa的內容,狀態,及tunnel的一些細節(如雙方cookie: st_icookie,st_rcookie; nonce,,xauth的username,password;雙向spi,enc的list…)每個stat object會有一個connection object,有關dpd的部分如下:
  •     time_t              st_last_dpd;            /* Time of last DPD transmit */
  •     u_int32_t           st_dpd_seqno;           /* Next R_U_THERE to send */
  •     u_int32_t           st_dpd_expectseqno;     /* Next R_U_THERE_ACK to receive */
  •     u_int32_t           st_dpd_peerseqno;       /* global variables */
  •     struct event       *st_dpd_event;          /* backpointer for DPD events */
    所有state objs會放在一個global variables : statetable
    state.c:
    #define STATE_TABLE_SIZE 32

    static struct state *statetable[STATE_TABLE_SIZE];
struct qke_continuation:在quick mode時會由isakmp的st duplicates quick mode用的st
ikev1_continuations.h
struct qke_continuation {
    struct pluto_crypto_req_cont qke_pcrc;
    struct state                *st;            /* need to use abstract # */
    struct state                *isakmp_sa;     /* used in initiator */
    so_serial_t                  replacing;
    struct msg_digest           *md;            /* used in responder */
};



ikev1_quick.c
stf_status
quick_outI1(int whack_sock
            , struct state *isakmp_sa
            , struct connection *c
            , lset_t policy
            , unsigned long try
            , so_serial_t replacing)
{
    struct state *st = duplicate_state(isakmp_sa);
    struct qke_continuation *qke = alloc_thing(struct qke_continuation
                                               , "quick_outI1 KE");
    st->st_connection = c;
....
    qke->st = st;
    qke->isakmp_sa = isakmp_sa;
...



DPD working flow:
dpd_init(struct state *st)
   \===> find_state_ikev1()
   \===>event_schedule(EVENT_DPD, st->st_connection->dpd_delay, st);

dpd_event(struct state *st): 收到EVENT_DPD後開始check:
    如果是phase1,call p1_dpd_outI1() 如果是在phase2 call p2_dpd_outI1(), 但兩者最後都會call dpd_outI()
 
我的bug是在第一次dpd_init() 註冊後dpd_event()被呼叫時l p2_dpd_outI1()find_phase1_state(p2st->st_connection, ISAKMP_SA_ESTABLISHED_STATES);找不到…
../../include/pluto_constants.h
#define ISAKMP_SA_ESTABLISHED_STATES  (LELEM(STATE_MAIN_R3) | \
                                       LELEM(STATE_MAIN_I4) | \
                                       LELEM(STATE_AGGR_I2) | \
                                       LELEM(STATE_AGGR_R2))

state.c
struct state *
find_phase1_state(const struct connection *c, lset_t ok_states)
{
    struct state
        *st,
        *best = NULL;
    int i;

    for (i = 0; i < STATE_TABLE_SIZE; i++) {
        for (st = statetable[i]; st != NULL; st = st->st_hashchain_next) {
            if (LHAS(ok_states, st->st_state)   <<============### 這一段會fail…why!
                && c->host_pair == st->st_connection->host_pair
                && same_peer_ids(c, st->st_connection, NULL)
                && (best == NULL
                    || best->st_serialno < st->st_serialno))
                {
                    best = st;
                }
        }
    }

    return best;
}


include/constants.h:
typedef unsigned long long lset_t;
#define LEMPTY 0ULL
#define LELEM(opt) (1ULL << (opt))
#define LRANGE(lwb, upb) LRANGES(LELEM(lwb), LELEM(upb))
#define LRANGES(first, last) (last - first + last)
#define LHAS(set, elem)  ((LELEM(elem) & (set)) != LEMPTY)


#define ISAKMP_SA_ESTABLISHED_STATES  (LELEM(STATE_MAIN_R3) | \
                                       LELEM(STATE_MAIN_I4) | \
                                       LELEM(STATE_AGGR_I2) | \
                                       LELEM(STATE_AGGR_R2))

enum state_kind {
    STATE_UNDEFINED=0,  /* 0 -- most likely accident */

    /*  Opportunism states: see "Opportunistic Encryption" 2.2 */

    OPPO_ACQUIRE,       /* got an ACQUIRE message for this pair */
    OPPO_GW_DISCOVERED, /* got TXT specifying gateway */

    /* IKE states */

    STATE_MAIN_R0,
    STATE_MAIN_I1,
    STATE_MAIN_R1,
    STATE_MAIN_I2,
    STATE_MAIN_R2,
    STATE_MAIN_I3,
    STATE_MAIN_R3,
    STATE_MAIN_I4,

    STATE_AGGR_R0,
    STATE_AGGR_I1,
    STATE_AGGR_R1,
    STATE_AGGR_I2,
    STATE_AGGR_R2,

    STATE_QUICK_R0,
    STATE_QUICK_I1,
    STATE_QUICK_R1,
    STATE_QUICK_I2,
    STATE_QUICK_R2,

    STATE_INFO,
    STATE_INFO_PROTECTED,


    STATE_XAUTH_R0,    /* server state has sent request, awaiting reply */
    STATE_XAUTH_R1,    /* server state has sent success/fail, awaiting reply */
    STATE_MODE_CFG_R0,           /* these states are used on the responder */
    STATE_MODE_CFG_R1,
    STATE_MODE_CFG_R2,

    STATE_MODE_CFG_I1,           /* this is used on the initiator */

    STATE_XAUTH_I0,              /* client state is awaiting request */
    STATE_XAUTH_I1,              /* client state is awaiting result code */

先將find_phase1_state()加上一些messages
    for (i = 0; i < STATE_TABLE_SIZE; i++) {
        loglog(RC_LOG_SERIOUS, "%s:%d,i: %d\n", __FUNCTION__, __LINE__, i);
        for (st = statetable[i]; st != NULL; st = st->st_hashchain_next) {
            loglog(RC_LOG_SERIOUS, "%s:%d,a [%llX:%llX]LHAS: %s, host_pair: %s, "
                        "same_peer_ids: %s\n",
                        __FUNCTION__, __LINE__,
                        (unsigned long long)ok_states,
                        (unsigned long long)st->st_state,
                    LHAS(ok_states, st->st_state)?"Ture":"Fail",
                    c->host_pair == st->st_connection->host_pair?"Ture":"Fail",
                    same_peer_ids(c, st->st_connection, NULL)?"True":"Fail");
......
在正常沒有XAUTH時
以下 [C600:A」的0xc600就是「 ISAKMP_SA_ESTABLISHED_STATES」而0xA(10)就是C600h的bit 10. 所以為true,也就是state落在STATE_MAIN_I4。

"conn_xauthclient" #4: find_phase1_state:1195,a [C600:13]LHAS: Fail, host_pair: Ture, same_peer_ids: True
"conn_xauthclient" #4: find_phase1_state:1195,a [C600:A]LHAS: Ture, host_pair: Ture, same_peer_ids: True

然而:xauth client會是其它的value:1E.
"conn_xauthclient" #2: find_phase1_state:1195,a [C600:13]LHAS: Fail, host_pair: Ture, same_peer_ids: True
"conn_xauthclient" #2: find_phase1_state:1195,a [C600:1E]LHAS: Fail, host_pair: Ture, same_peer_ids: True


修改此macro後…似乎就可了,testing中…, 另一個小發現是:如果對方在時間內有先送R_U_THERE,該週期就不再送R_U_THERE了
#define ISAKMP_SA_ESTABLISHED_STATES  (LELEM(STATE_MAIN_R3) | \
                                       LELEM(STATE_MAIN_I4) | \
                                       LELEM(STATE_AGGR_I2) | \
                                       LELEM(STATE_AGGR_R2) | \
                                       LELEM(STATE_XAUTH_I1))
===================================================

RFC3706

1. Introduction

These schemes tend to be unidirectional (a HELLO only)
   or bidirectional (a HELLO/ACK pair).  For the purpose of this
   document, the term "heartbeat" will refer to a unidirectional message
   to prove liveliness.  Likewise, the term "keepalive" will refer to a
   bidirectional message.

Keepalives vs. Heartbeats

A send HELLO to B, B send ACK to A.
It is conceivable in such a scheme that peer B would
   never be interested in peer A's liveliness
(A在意B, 但B不care A, also bidirection)

Heartbeats:

只送HELLO來證明自已存在
unidirection
適用在大量的remote users or大量sessions.


set --debug-dpd to pluto for debug
------------------------------------------------

這是用pre_share key client的情況由initiator發R_U_THERE

"conn_conn_ipsec" #1: Main mode peer ID is ID_IPV4_ADDR: '172.21.46.139'
"conn_conn_ipsec" #1: transition from state STATE_MAIN_I3 to state STATE_MAIN_I4
"conn_conn_ipsec" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_PRESHARE                                             D_KEY cipher=oakley_3des_cbc_192 prf=oakley_md5 group=modp1024}
"conn_conn_ipsec" #1: Dead Peer Detection (RFC 3706): enabled
| state: 1 requesting event none to be deleted by /home/samba/ubicom-distro/uCli                                             nux/openswan-2.6.24rc4/programs/pluto/dpd.c:159
| unpending state #1
| processing connection conn_conn_ipsec
"conn_conn_ipsec" #2: initiating Quick Mode PSK+ENCRYPT+TUNNEL+PFS {using isakmp                                             #1 msgid:5e3a8c6c proposal=3DES(3)_192-MD5(1)_128, AES(12)_128-MD5(1)_128, AES(1                                             2)_128-MD5(1)_128, AES(12)_192-MD5(1)_128 pfsgroup=OAKLEY_GROUP_MODP1024}
| processing connection conn_conn_ipsec
| removing pending policy for "none" {0x429728a4}
| processing connection conn_conn_ipsec
| processing connection conn_conn_ipsec
"conn_conn_ipsec" #2: Dead Peer Detection (RFC 3706): enabled
| state: 2 requesting event none to be deleted by /home/samba/ubicom-distro/uCli                                             nux/openswan-2.6.24rc4/programs/pluto/dpd.c:159
| state: 1 requesting event EVENT_DPD to be deleted by /home/samba/ubicom-distro                                             /uClinux/openswan-2.6.24rc4/programs/pluto/dpd.c:171
"conn_conn_ipsec" #2: transition from state STATE_QUICK_I1 to state STATE_QUICK_                                             I2
"conn_conn_ipsec" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode                                              {ESP=>0x2df79419 <0x56c3adf7 xfrm=3DES_0-HMAC_MD5 NATOA=none NATD=none DPD=enab                                             led}

     #####事實上,responder和initiator都會送R_U_THERE...#######

/ # | processing connection conn_IPSec
| received R_U_THERE seq:2568 time:1291695452 (state=#1 name="conn_IPSec")
| processing connection conn_IPSec
| processing dpd for state #3 ("conn_IPSec")
| not yet time for dpd event: 1291695452 < 1291695482

/ #
/ # | processing connection conn_IPSec
| processing dpd for state #3 ("conn_IPSec")
| scheduling timeout to 120
| state: 1 requesting event none to be deleted by /home/samba/ubicom-distro/uClinux/openswan-2.6.24rc4/programs/pluto/dpd.c:192
| sending R_U_THERE 29742 to 192.168.3.100:500 (state #1)
| processing connection conn_IPSec
| received R_U_THERE seq:2569 time:1291695482 (state=#1 name="conn_IPSec")
| state: 1 requesting event EVENT_DPD_TIMEOUT to be deleted by /home/samba/ubicom-distro/uClinux/openswan-2.6.24rc4/programs/pluto/dpd.c:437
| processing connection conn_IPSec
| R_U_THERE_ACK, seqno received: 29742 expected: 29742 (state=#1)dpd_inR()


-----------------------------------------------------------------------------------



 # | processing connection conn_IPSec
| received R_U_THERE seq:2589 time:1291696322 (state=#1 name="conn_IPSec")
| processing connection conn_IPSec
| processing dpd for state #3 ("conn_IPSec")
| not yet time for dpd event: 1291696322 < 1291696352


/ # | processing connection conn_IPSec
| processing dpd for state #3 ("conn_IPSec")
| scheduling timeout to 120
| state: 1 requesting event none to be deleted by /home/samba/ubicom-distro/uClinux/openswan-2.6.24rc4/programs/pluto/dpd.c:192
| sending R_U_THERE 29764 to 192.168.3.100:500 (state #1)
| processing connection conn_IPSec
| R_U_THERE_ACK, seqno received: 29764 expected: 29764 (state=#1)
| state: 1 requesting event EVENT_DPD_TIMEOUT to be deleted by /home/samba/ubicom-distro/uClinux/openswan-2.6.24rc4/programs/pluto/dpd.c:514





---------------------------------------------------
---------------------------------------------------
但xauth的方向是相反的,xauthserver送R_U_THERE, xauthclient回R_U_THERE_ACK


"conn_conn_ipsec" #1: Dead Peer Detection (RFC 3706): enabled
| state: 1 requesting event none to be deleted by /home/samba/ubicom-distro/uClinux/openswan-2.6.24rc4/programs/pluto/dpd.c:159
| processing connection conn_conn_ipsec
"conn_conn_ipsec" #1: =========xclient_account(conn_conn_ipsec)
"conn_conn_ipsec" #1: GET DB:[peter,1234 ] FORM [conn_conn_ipsec]
"conn_conn_ipsec" #1: user:peter, pass:1234
"conn_conn_ipsec" #1: XAUTH: Answering XAUTH challenge with user='peter'
"conn_conn_ipsec" #1: transition from state STATE_XAUTH_I0 to state STATE_XAUTH_I1
"conn_conn_ipsec" #1: STATE_XAUTH_I1: XAUTH client - awaiting CFG_set
"conn_conn_ipsec" #1: Dead Peer Detection (RFC 3706): enabled
| processing connection conn_conn_ipsec
"conn_conn_ipsec" #1: XAUTH: Successfully Authenticated
"conn_conn_ipsec" #1: transition from state STATE_XAUTH_I0 to state STATE_XAUTH_I1
"conn_conn_ipsec" #1: STATE_XAUTH_I1: XAUTH client - awaiting CFG_set
"conn_conn_ipsec" #1: Dead Peer Detection (RFC 3706): enabled
| unpending state #1
| processing connection conn_conn_ipsec
"conn_conn_ipsec" #2: initiating Quick Mode PSK+ENCRYPT+TUNNEL+PFS {using isakmp#1 msgid:9227c94a proposal=3DES(3)_192-MD5(1)_128, AES(12)_128-MD5(1)_128, AES(12)_128-MD5(1)_128, AES(12)_192-MD5(1)_128 pfsgroup=OAKLEY_GROUP_MODP1024}
| processing connection conn_conn_ipsec
| removing pending policy for "none" {0x4105d324}
| processing connection conn_conn_ipsec
| processing connection conn_conn_ipsec

/ # "conn_conn_ipsec" #2: Dead Peer Detection (RFC 3706): enabled
| state: 2 requesting event none to be deleted by /home/samba/ubicom-distro/uClinux/openswan-2.6.24rc4/programs/pluto/dpd.c:159
| state: 1 requesting event EVENT_DPD to be deleted by /home/samba/ubicom-distro/uClinux/openswan-2.6.24rc4/programs/pluto/dpd.c:171
"conn_conn_ipsec" #2: transition from state STATE_QUICK_I1 to state STATE_QUICK_I2
"conn_conn_ipsec" #2: STATE_QUICK_I2: sent QI2, IPsec SA established tunnel mode {ESP=>0xe7bb4694 <0xc780201b xfrm=3DES_0-HMAC_MD5 NATOA=none NATD=none DPD=enabled}

/ #
/ # | processing connection conn_conn_ipsec
| received R_U_THERE seq:16359 time:1292989489 (state=#1 name="conn_conn_ipsec")
| processing connection conn_conn_ipsec
"conn_conn_ipsec" #2: DPD Error: could not find newest phase 1 state

trace一下「find_phase1_state」
struct state *
find_phase1_state(const struct connection *c, lset_t ok_states)

"conn_conn_ipsec" #2: find_phase1_state:1193,i: 13
"conn_conn_ipsec" #2: find_phase1_state:1195, LHAS: Fail, host_pair: Ture, same_peer_ids: True
"conn_conn_ipsec" #2: find_phase1_state:1195, LHAS: Fail, host_pair: Ture, same_peer_ids: True
"conn_conn_ipsec" #2: find_phase1_state:1193,i: 14

struct state *
find_phase1_state(const struct connection *c, lset_t ok_states)
{
    struct state
        *st,
        *best = NULL;
    int i;

    loglog(RC_LOG_SERIOUS, "%s:%d, STATE_TABLE_SIZE=:%d\n",
                 __FUNCTION__, __LINE__, STATE_TABLE_SIZE);

    for (i = 0; i < STATE_TABLE_SIZE; i++) {
        loglog(RC_LOG_SERIOUS, "%s:%d,i: %d\n", __FUNCTION__, __LINE__, i);
        for (st = statetable[i]; st != NULL; st = st->st_hashchain_next) {
            loglog(RC_LOG_SERIOUS, "%s:%d, [%X:%X]LHAS: %s, host_pair: %s, same_peer_ids: %s\n", __FUNCTION__, __LINE__,
                        ok_states, st->st_state,
                    LHAS(ok_states, st->st_state)?"Ture":"Fail",
                    c->host_pair == st->st_connection->host_pair?"Ture":"Fail",
                    same_peer_ids(c, st->st_connection, NULL)?"True":"Fail");

            if (LHAS(ok_states, st->st_state)
                && c->host_pair == st->st_connection->host_pair
                && same_peer_ids(c, st->st_connection, NULL)
                && (best == NULL
                    || best->st_serialno < st->st_serialno))
                {
                    loglog(RC_LOG_SERIOUS, "%s:%d\n", __FUNCTION__, __LINE__);
                    best = st;
                }
        }
    }

    return best;
}



-------------------------------------
"conn_conn_ipsec" #2: find_phase1_state:1195, [C600:1341485BC0]LHAS: Ture, host_pair: True, same_peer_ids: \001\003d\343\220
"conn_conn_ipsec" #2: find_phase1_state:1195, [C600:1E41485BC0]LHAS: Ture, host_pair: True, same_peer_ids: \001\003d\343\220

2010年9月13日 星期一

iproute2 xfrm state command

這是我用來手動新增(test) ipsec的方法,當然還要配合policy
ip xfrm state add \
   src 172.21.46.133 dst 172.21.33.235 \
   proto esp spi 0xc1764476 mode tunnel \
   auth md5 0xbde367f6722286d104212c864d3041ff \
   enc blowfish \
 0xb860a53627435c27c5862ebf7e2e2de15e2fd2786db612eff0ce4b181a9373c34dd1b6ca17b1ffb2d118a575b9f8a9aa865783500b2cd38a

ip xfrm stat delete src 172.21.46.133 dst 172.21.33.235 proto esp spi 0xc1764476

 也可以用sha1加aes
ip xfrm state add src 172.21.46.131 dst 172.21.33.235  proto esp spi 0x4db377c8 reqid 16385 mode tunnel  auth sha1 0xe0a21cb441a0790188f8d5a7573608ae1e75af07 enc aes 0x86e4685642435deb2b53bee6c23723974d0207a4abed037c5028a310ef355a6e

ip xfrm state delete src 172.21.46.131 dst 172.21.33.235  proto esp spi 0x4db377c8
twofish
ip xfrm state add src 172.21.46.131 dst 172.21.33.235  proto esp spi 0x4db377c8 reqid 16385 mode tunnel  auth sha1 0xe0a21cb441a0790188f8d5a7573608ae1e75af07 enc twofish 0x86e4685642435deb2b53bee6c23723974d0207a4abed037c5028a310ef355a6e

ip xfrm state delete src 172.21.46.131 dst 172.21.33.235  proto esp spi 0x4db377c8
IPSec manual mode by iproute2
ip xfrm st add src 172.21.46.131 dst 172.21.33.235 proto esp spi 0x12345678 mode tunnel auth md5 0xbde367f6722286d104212c864d3041ff  enc aes 0xf82bbcccc0e01308e9a8edba1f2c058be3af44bfde5c26657d4a6609ca488ac2

----------------------------------------------------------------------------------------------

其它可以參考的url
http://lwn.net/Articles/375829/
http://osdir.com/ml/linux.kernel.cryptoapi/2008-04/msg00017.html

[lho@svdclab161 sec]$ cat ip-start-transport-ccm
#!/bin/sh

NODE=$1

echo "Starting IPSec transport mode using CCM..."

./ip xfrm policy flush
./ip xfrm state flush
#
# SA
./ip xfrm state add src 10.66.21.164 dst 10.66.21.166 proto esp spi
0x201 mode transport aead "rfc4309(ccm(aes))"
0x0102037aeaca3f87d060a12f4a4487d5a5c335 96
./ip xfrm state add src 10.66.21.166 dst 10.66.21.164 proto esp spi
0x301 mode transport aead "rfc4309(ccm(aes))"
0x010203f6ddb555acfd9d77b03ea3843f265325 96
#
# Policy
if [ "${NODE}" = "A" ]; then
./ip xfrm policy add dir out src 10.66.21.164 dst 10.66.21.166
tmpl proto esp mode transport
./ip xfrm policy add dir in src 10.66.21.166 dst 10.66.21.164
tmpl proto esp mode transport
fi
if [ "${NODE}" = "B" ]; then
./ip xfrm policy add dir in src 10.66.21.164 dst 10.66.21.166
tmpl proto esp mode transport
./ip xfrm policy add dir out src 10.66.21.166 dst 10.66.21.164
tmpl proto esp mode transport
fi

[lho@svdclab161 sec]$ cat ip-start-transport-gcm
#!/bin/sh

NODE=$1

echo "Starting IPSec transport mode using GCM..."

./ip xfrm policy flush
./ip xfrm state flush
#
# SA
./ip xfrm state add src 10.66.21.164 dst 10.66.21.166 proto esp spi
0x201 mode transport aead "rfc4106(gcm(aes))"
0x010203047aeaca3f87d060a12f4a4487d5a5c335 96
./ip xfrm state add src 10.66.21.166 dst 10.66.21.164 proto esp spi
0x301 mode transport aead "rfc4106(gcm(aes))"
0x01020304f6ddb555acfd9d77b03ea3843f265325 96
#
# Policy
if [ "${NODE}" = "A" ]; then
./ip xfrm policy add dir out src 10.66.21.164 dst 10.66.21.166
tmpl proto esp mode transport
./ip xfrm policy add dir in src 10.66.21.166 dst 10.66.21.164
tmpl proto esp mode transport
fi
if [ "${NODE}" = "B" ]; then
./ip xfrm policy add dir in src 10.66.21.164 dst 10.66.21.166
tmpl proto esp mode transport
./ip xfrm policy add dir out src 10.66.21.166 dst 10.66.21.164
tmpl proto esp mode transport
fi

2010年9月3日 星期五

PF_KEYv2 to cipher support internal(二)

這次,我從一個crypto_null.ko的crypto module開始
如同其名,這是一個不做任何事情的cihper
Kernel version 2.6.10

crypto/crypto_null.c
145 static int __init crypto_null_mod_init(void)
146 {
147         int ret = 0;
148
149         ret = crypto_register_alg(&cipher_null);
150         if (ret < 0)
151                 goto out;
152
153         ret = crypto_register_alg(&skcipher_null);
154         if (ret < 0)
155                 goto out_unregister_cipher;
156
157         ret = crypto_register_alg(&digest_null);
158         if (ret < 0)
159                 goto out_unregister_skcipher;
160
161         ret = crypto_register_alg(&compress_null);
162         if (ret < 0)
163                 goto out_unregister_digest
crypto_register_alg will add struct list_head crypto_register_alg.
107 static struct crypto_alg cipher_null = {
108         .cra_name               =       "cipher_null",
109         .cra_flags              =       CRYPTO_ALG_TYPE_CIPHER,
110         .cra_blocksize          =       NULL_BLOCK_SIZE,
111         .cra_ctxsize            =       0,
112         .cra_module             =       THIS_MODULE,
113         .cra_list               =       LIST_HEAD_INIT(cipher_null.cra_list),
114         .cra_u                  =       { .cipher = {
115         .cia_min_keysize        =       NULL_KEY_SIZE,
116         .cia_max_keysize        =       NULL_KEY_SIZE,
117         .cia_setkey             =       null_setkey,
118         .cia_encrypt            =       null_crypt,
119         .cia_decrypt            =       null_crypt } }
120 };
Both of cia_encrypt,cia_decrypt do nothing just call null_crypt

55 static void null_crypt(struct crypto_tfm *tfm, u8 *dst, const u8 *src)
 56 {
 57         memcpy(dst, src, NULL_BLOCK_SIZE);
 58 }
But in blockcipher is different
122 static struct crypto_alg skcipher_null = {
123         .cra_name               =       "ecb(cipher_null)",
124         .cra_driver_name        =       "ecb-cipher_null",
125         .cra_priority           =       100,
126         .cra_flags              =       CRYPTO_ALG_TYPE_BLKCIPHER,
127         .cra_blocksize          =       NULL_BLOCK_SIZE,
128         .cra_type               =       &crypto_blkcipher_type,
129         .cra_ctxsize            =       0,
130         .cra_module             =       THIS_MODULE,
131         .cra_list               =       LIST_HEAD_INIT(skcipher_null.cra_list),
132         .cra_u                  =       { .blkcipher = {
133         .min_keysize            =       NULL_KEY_SIZE,
134         .max_keysize            =       NULL_KEY_SIZE,
135         .ivsize                 =       NULL_IV_SIZE,
136         .setkey                 =       null_setkey,
137         .encrypt                =       skcipher_null_crypt,
138         .decrypt                =       skcipher_null_crypt } }
139 };

Blockcipher encrypt/decrypt有些不同其中,
(1).  首先inital一個struct blkcipher_walk 
        來記錄src 和dststruct scatterlist (一般這是和platform的dma有關)
            參考: http://lwn.net/Articles/263343/
                      http://lwn.net/Articles/256368/
(2). blkcipher_walk_virt用來

 60 static int skcipher_null_crypt(struct blkcipher_desc *desc,
 61                                struct scatterlist *dst,
 62                                struct scatterlist *src, unsigned int nbytes)
 63 {
 64         struct blkcipher_walk walk;
 65         int err;
 66
 67         blkcipher_walk_init(&walk, dst, src, nbytes);
 68         err = blkcipher_walk_virt(desc, &walk);
 69
 70         while (walk.nbytes) {
 71                 if (walk.src.virt.addr != walk.dst.virt.addr)
 72                         memcpy(walk.dst.virt.addr, walk.src.virt.addr,
 73                                walk.nbytes);
 74                 err = blkcipher_walk_done(desc, &walk, 0);
 75         }
 76
 77         return err;
 78 }
 79


blkcipher_walk describes the relationship of  physical / virtual address whare raw date stored in.
include/crypto/algapi.h
 65 struct scatter_walk {
 66         struct scatterlist *sg;
 67         unsigned int offset;
 68 };
The struct scatterlist is platform depend.
eg: arch/mips/include/asm/scatterlist.h
struct scatterlist {
#ifdef CONFIG_DEBUG_SG
        unsigned long   sg_magic;
#endif
        unsigned long   page_link;
        unsigned int    offset;
        dma_addr_t      dma_address;
        unsigned int    length;
};
 70 struct blkcipher_walk {
 71         union {
 72                 struct {
 73                         struct page *page;
 74                         unsigned long offset;
 75                 } phys;
 76
 77                 struct {
 78                         u8 *page;
 79                         u8 *addr;
 80                 } virt;
 81         } src, dst;
 82
 83         struct scatter_walk in;
 84         unsigned int nbytes;
 85
 86         struct scatter_walk out;
 87         unsigned int total;
 88
 89         void *page;
 90         u8 *buffer;
 91         u8 *iv;
 92
 93         int flags;
 94         unsigned int blocksize;
 95 };

再舉個(VIA PadLock hardware crypto engine)例子
drivers/crypto/padlock-aes.c
255 static int ecb_aes_encrypt(struct blkcipher_desc *desc,
256                            struct scatterlist *dst, struct scatterlist *src,
257                            unsigned int nbytes)
258 {
259         struct aes_ctx *ctx = blk_aes_ctx(desc->tfm);
260         struct blkcipher_walk walk;
261         int err;
262         int ts_state;
263
264         padlock_reset_key();
265
266         blkcipher_walk_init(&walk, dst, src, nbytes);
267         err = blkcipher_walk_virt(desc, &walk);
268
269         ts_state = irq_ts_save();
270         while ((nbytes = walk.nbytes)) {
271                 padlock_xcrypt_ecb(walk.src.virt.addr, walk.dst.virt.addr,
272                                    ctx->E, &ctx->cword.encrypt,
273                                    nbytes / AES_BLOCK_SIZE);
274                 nbytes &= AES_BLOCK_SIZE - 1;
275                 err = blkcipher_walk_done(desc, &walk, nbytes);
276         }
277         irq_ts_restore(ts_state);
278
279         return err;
280 }

再來看一下cipher_alg這個structure, 其中rca_u會根據不同的cipher:(eg: crypto/hash/digest)
在register時inital相對應的methods

linux/crypto.h
 322 struct crypto_alg {
 323         struct list_head cra_list;
 324         struct list_head cra_users;
 325
 326         u32 cra_flags;
 327         unsigned int cra_blocksize;
 328         unsigned int cra_ctxsize;
 329         unsigned int cra_alignmask;
 330
 331         int cra_priority;
 332         atomic_t cra_refcnt;
 333
 334         char cra_name[CRYPTO_MAX_ALG_NAME];
 335         char cra_driver_name[CRYPTO_MAX_ALG_NAME];
 336
 337         const struct crypto_type *cra_type;
 338
 339         union {
 340                 struct ablkcipher_alg ablkcipher;
 341                 struct aead_alg aead;
 342                 struct blkcipher_alg blkcipher;
 343                 struct cipher_alg cipher;
 344                 struct digest_alg digest;
 345                 struct hash_alg hash;
 346                 struct ahash_alg ahash;
 347                 struct compress_alg compress;
 348                 struct rng_alg rng;
 349         } cra_u;
 350
 351         int (*cra_init)(struct crypto_tfm *tfm);
 352         void (*cra_exit)(struct crypto_tfm *tfm);
 353         void (*cra_destroy)(struct crypto_alg *alg);
 354
 355         struct module *cra_module;
 356 };

2010年8月23日 星期一

PF_KEYv2 to cipher support internal

最近有個project因為kernel的cipher沒辦法support,所以要trace一下openswan和kernel modeules之前的operations

Frist one, I need to understand openswan how to communicate with kernel SA:
So I found it is through PF_KEYv2 socket family to interface key engine, see RFC2367

Then I found a open source sample from svn repository:
    http://xbq-code-repository.googlecode.com/svn/trunk/unpcode
This is come from sample code that famous "UNIX netorking programming" v1, 3rd.

The only thing you need to modify is the header file path is from net/pfkeyv2.h to linux/pfkeyv2.h
I only compile lib and libfree subdirecotry within unpcodoe.

You can use the 「register」program to get cipher support list from kernel throught PF_KEYv2 protocol.

/tmp/rootfs # ./register -t esp
Sending register message:
SADB Message Register, errno 0, satype IPsec ESP, seq 0, pid 17534

Reply returned:
SADB Message Register, errno 0, satype IPsec ESP, seq 0, pid 17534
 Supported authentication algorithms:
  Null ivlen 0 bits 0-0
  HMAC-MD5 ivlen 0 bits 128-128
  HMAC-SHA-1 ivlen 0 bits 160-160
 Supported encryption algorithms:
  Null ivlen 0 bits 0-0
  DES-CBC ivlen 8 bits 64-64
  3DES-CBC ivlen 8 bits 192-192
  [Unknown encryption algorithm 12] ivlen 8 bits 128-256
------------------------------------------------------------------------------------------

Now, I still can not get blowfish, twofish, etc.. cipher support from PF_KEYv2, even I get list form /proc/crypto

/tmp/rootfs # cat /proc/crypto |grep driver
driver       : authenc(hmac(sha1-ubicom32),cbc-aes-ubicom32)
....
driver       : michael_mic-generic
driver       : ecb(arc4-generic)
driver       : krng
driver       : seed-generic
driver       : arc4-generic
driver       : cast6-generic
driver       : cast5-generic
driver       : tnepres-generic
driver       : serpent-generic
driver       : twofish-generic
driver       : blowfish-generic
driver       : sha1-generic
...
So the next step is to get understand  the kernel layers of crypto, xfrm and af_keyv2.

net/key/af_key.c: An implamentation of AF_KEYv2
The AF_KEYv2 type 'REGISTER' will call

     static int pfkey_register(struct sock *sk, struct sk_buff *skb, struct sadb_msg *hdr, void **ext_hdrs)

then it call

     static struct sk_buff *compose_sadb_supported(struct sadb_msg *orig,
                                              gfp_t allocation)

Of course, the main task of  compose_sadb_supported is to compose auth and crypto supported list into skb.


The important subfounctions called by compose_sadb_supported are
  1. xfrm_count_auth_supported: to get the number of auth algs supported
  2. xfrm_count_enc_supported: to get the number of crypto algs supported
  3. if auth present, for each  xfrm_aalg_get_byidx
  4. if crypto present, for each  xfrm_ealg_get_byidx
another interesting functions is "void xfrm_probe_algs(void)"
It probes/init internal static lists of xfrm layer :aalg_list, ealg_list, calg_list,
by  crypto_has_hash(), crypto_has_blkcipher(), crypto_has_comp().
and the crypto_has_xxx() defined on include/linux/crypto.h eg:
static inline int crypto_has_blkcipher(const char *alg_name, u32 type, u32 mask)
{
        type &= ~CRYPTO_ALG_TYPE_MASK;
        type |= CRYPTO_ALG_TYPE_BLKCIPHER;
        mask |= CRYPTO_ALG_TYPE_MASK;

        return crypto_has_alg(alg_name, type, mask);
}
crypto_has_blkcipher() inital cipher mask for block cipher then look for by crypto API. Now let us trace them
crypto/api.c,
int crypto_has_alg(const char *name, u32 type, u32 mask)
{
        int ret = 0;
        struct crypto_alg *alg = crypto_alg_mod_lookup(name, type, mask);

        if (!IS_ERR(alg)) {
                crypto_mod_put(alg);
                ret = 1;
        }

        return ret;
}
struct crypto_alg *crypto_alg_mod_lookup(const char *name, u32 type, u32 mask)
{
        struct crypto_alg *alg;
        struct crypto_alg *larval;
        int ok;

        if (!(mask & CRYPTO_ALG_TESTED)) {
                type |= CRYPTO_ALG_TESTED;
                mask |= CRYPTO_ALG_TESTED;
        }

        larval = crypto_larval_lookup(name, type, mask);
        if (IS_ERR(larval) || !crypto_is_larval(larval))
                return larval;

        ok = crypto_probing_notify(CRYPTO_MSG_ALG_REQUEST, larval);

        if (ok == NOTIFY_STOP)
                alg = crypto_larval_wait(larval);
        else {
                crypto_mod_put(larval);
                alg = ERR_PTR(-ENOENT);
        }
        crypto_larval_kill(larval);
        return alg;
}
struct crypto_alg *crypto_larval_lookup(const char *name, u32 type, u32 mask)
{
        struct crypto_alg *alg;

        if (!name)
                return ERR_PTR(-ENOENT);

        mask &= ~(CRYPTO_ALG_LARVAL | CRYPTO_ALG_DEAD);
        type &= mask;

        alg = try_then_request_module(crypto_alg_lookup(name, type, mask),
                                      name);
        if (alg)
                return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg;

        return crypto_larval_add(name, type, mask);
}

int crypto_probing_notify(unsigned long val, void *v)
{
        int ok;

        ok = blocking_notifier_call_chain(&crypto_chain, val, v);
        if (ok == NOTIFY_DONE) {
                request_module("cryptomgr");
                ok = blocking_notifier_call_chain(&crypto_chain, val, v);
        }

        return ok;
}
crypto/internal.h
static inline int crypto_is_larval(struct crypto_alg *alg)
{
        return alg->cra_flags & CRYPTO_ALG_LARVAL;
}
    net/xfrm/xfrm_algo.c
    int xfrm_count_enc_supported(void)
    {
            int i, n;

            for (i = 0, n = 0; i < ealg_entries(); i++)
                    if (ealg_list[i].available)
                            n++;
            return n;
    }

    struct xfrm_algo_desc *xfrm_ealg_get_byidx(unsigned int idx)
    {
            if (idx >= ealg_entries())
                    return NULL;

            return &ealg_list[idx];
    }
    EXPORT_SYMBOL_GPL(xfrm_ealg_get_byidx);

    The static struct xfrm_algo_desc ealg_list and aalg_list are static array to
    describe algs of auth,crypto, compress, eg:
    net/xfrm/xfrm_algo.c
    static struct xfrm_algo_desc ealg_list[] = {
    {
            .name = "ecb(cipher_null)",
            .compat = "cipher_null",

            .uinfo = {
                    .encr = {
                            .blockbits = 8,
                            .defkeybits = 0,
                    }
            },

            .desc = {
                    .sadb_alg_id =  SADB_EALG_NULL,
                    .sadb_alg_ivlen = 0,
                    .sadb_alg_minbits = 0,
                    .sadb_alg_maxbits = 0
            }
    },
    {
            .name = "cbc(des)",
            .compat = "des",

            .uinfo = {
                    .encr = {
                            .blockbits = 64,
                            .defkeybits = 64,
                    }
            },

            .desc = {
                    .sadb_alg_id = SADB_EALG_DESCBC,
                    .sadb_alg_ivlen = 8,
                    .sadb_alg_minbits = 64,
                    .sadb_alg_maxbits = 64
            }
    },
    {
            .name = "cbc(des3_ede)",
            .compat = "des3_ede", .....
    ...

    --------------------------------------------------------------------------------

    For now, I change trace toward  from AF_KEYv2 to crpyto layer.
    For example, in NULL cipher common support
    crypto/crypto_null.c
    crypto_register_alg(&cipher_null)  called in module initial. 
    crypto/algapi.c:
    __crypto_register_alg was called finially, it will add to list by below if anything ok.
       o Check cipher is registered before for anything.
       o alloc "struct crypto_larval *larval"  by crypto_larval_alloc
       o Call  crypto_mod_get to requset module if need, and add a referance count,
          then retuen to larval->adult.
            larval->adult = crypto_mod_get(alg);
       o  Now anything is ready, add to list chain.

            list_add(&alg->cra_list, &crypto_alg_list);
            list_add(&larval->alg.cra_list, &crypto_alg_list);

    crpyto/api.c

    LIST_HEAD(crypto_alg_list);
    EXPORT_SYMBOL_GPL(crypto_alg_list);
    DECLARE_RWSEM(crypto_alg_sem);
    EXPORT_SYMBOL_GPL(crypto_alg_sem);

    BLOCKING_NOTIFIER_HEAD(crypto_chain);
    EXPORT_SYMBOL_GPL(crypto_chain);
    static inline struct crypto_alg *crypto_alg_get(struct crypto_alg *alg)
    {
            atomic_inc(&alg->cra_refcnt);
            return alg;
    }
    struct crypto_alg *crypto_mod_get(struct crypto_alg *alg)
    {
            return try_module_get(alg->cra_module) ? crypto_alg_get(alg) : NULL;
    }

    crpyto/internal.h

    struct crypto_larval {
            struct crypto_alg alg;
            struct crypto_alg *adult;
            struct completion completion;
            u32 mask;
    };
    It is interest to know about
    __crypto_register_alg
     待續

    2010年4月8日 星期四

    LAB L2TPD + IPSec in NONE-MMU

    l2tpd: rp-l2tpd
    ipsec: openswan patched.


    ------------------------------------------
    config:

    peter@team-server:ppp$ cat l2tpd.conf

    # comment

    # Global section (by default, we start in global mode)
    global

    # Load handlers
    load-handler "sync-pppd.so"
    load-handler "cmd.so"

    # Bind address
    listen-port 1701

    # Configure the sync-pppd handler.  You MUST have a "section sync-pppd" line
    # even if you don't set any options.
    section sync-pppd
    pppd-path /sbin/pppd
    lns-pppd-opts "require-pap 10.0.0.1:10.0.0.2 lcp-echo-interval 30 lcp-echo-failure 6"
    lac-pppd-opts "user exampe name example noipdefault ipcp-accept-local ipcp-accept-remote lcp-echo-interval 30 lcp-echo-failure 6"

    # Peer section
    section peer
    peer 172.21.33.92 #-----(1)
    #secret s3cr3t ---------(2)
    port 1701
    hide-avps no
    section cmd


    ------------------------
    (1). please modify remote client IP correctly.
    (2). if uncomment it, an error message show as: stop_conntrol on L2TP tunnel phase.?
    lns-handler sync-pppd  0.002 51449/0: Peer host name is 'test-55e98b2637'
       0.003 l2tp_peer_find(172.21.33.92) examining peer 172.21.33.92/32
       0.004 l2tp_peer_find(172.21.33.92) found 172.21.33.92/32
       0.005 auth_gen_response(secret=s3cr3t) -> a49eacc864ed2f63d48973e8571f56d7

    ######################################


    #cat options
    #noipdefault
    #defaultroute
    #passive
    debug
    refuse-eap
    lcp-echo-interval 30
    lcp-echo-failure 4


    require-pap
    maxfail 3
    #user "sw2_vpn_user" #---(1)
    mtu  1400
    mru  1400
    auth  #noauth #--(2)
    noaccomp
    nopcomp
    noccp
    -am


    ------------------------
    (1). if uncomment options "user". it will shown blow message!



    Mar 18 19:56:43 DIR865 user.notice The remote system is required to authenticate itself
    Mar 18 19:56:43 DIR865 daemon.err pppd[2848]: The remote system is required to authenticate itself
    Mar 18 19:56:43 DIR865 user.notice pppd
    Mar 18 19:56:43 DIR865 user.notice :
    Mar 18 19:56:43 DIR865 user.notice but I couldn't find any suitable secret (password) for it to use to do so.
    Mar 18 19:56:43 DIR865 daemon.err pppd[2848]: but I couldn't find any suitable secret (password) for it to use to do so.

    (2). noauth is used to "said: I am server. and did need not PAP nor CHAP authentication, so you guy are allowed just get  by IPCP.










    2010年3月30日 星期二

    l2tpd over IPSec NAT-D in Win7

    L2TP over IPSec + NAT-D 在win7上似乎有問題
    除了要注意,在quick mode的QI1中esp是用null encryption algo外,還有protocol 1701/17
    1701是指L2TP 的port,17是指udp protocol.
    先在xp client在nat下連openswan看來是ok的…如下


    ipsec.conf如下

    conn conn_pptp_ipsec
            auto=add
            type=transport
            left=172.21.33.8
            right=%any
            leftnexthop=172.21.32.254
            ike="3des-md5-modp1024,3des-md5-modp1024,3des-md5-modp1024,3des-md5-modp
            pfs=no
            esp="null-md5,null-sha1,3des-md5,3des-md5"
            authby=secret
            leftprotoport=17/1701
            rightprotoport=17/0




    # cat /etc/ppp/l2tpd.conf
    [global]

    [lns default]
    ip range = 192.168.0.230-192.168.0.240
    local ip = 192.168.0.220
    refuse chap = yes
    require pap = yes
    require authentication = yes
    name = pptp_ipsec
    ppp debug = yes
    pppoptfile = /tmp/ppp/options.l2tpd
    length bit = yes


    # cat /etc/ppp/options.l2tpd
    refuse-chap
    refuse-mschap
    refuse-mschap-v2
    require-pap
    ipparam l2tpd
    novj
    nobsdcomp
    novjccomp
    nologfd
    idle 1800
    mtu 1410
    mru 1410
    debug
    dump
    lock
    proxyarp
    ms-dns 172.21.1.1
    ms-dns 172.21.1.2



    openswan NAT-D in XP client (L2TP over IPSec) OK.
    =~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2010.03.30 18:29:23 =~=~=~=~=~=~=~=~=~=~=~=
    killall syslogd
    killall: syslogd: no process killed
    # pluto[12392]: |
    pluto[12392]: | *received 312 bytes from 172.21.33.79:500 on eth0
    pluto[12392]: | **parse ISAKMP Message:
    pluto[12392]: |    initiator cookie:
    pluto[12392]: |   92 f2 33 30  40 d3 8d 3a
    pluto[12392]: |    responder cookie:
    pluto[12392]: |   00 00 00 00  00 00 00 00
    pluto[12392]: |    next payload type: ISAKMP_NEXT_SA
    pluto[12392]: |    ISAKMP version: ISAKMP Version 1.0
    pluto[12392]: |    exchange type: ISAKMP_XCHG_IDPROT
    pluto[12392]: |    flags: none
    pluto[12392]: |    message ID:  00 00 00 00
    pluto[12392]: |    length: 312
    pluto[12392]: | The xchg type is ISAKMP_XCHG_IDPROT (2)
    pluto[12392]: | ***parse ISAKMP Security Association Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_VID
    pluto[12392]: |    length: 200
    pluto[12392]: |    DOI: ISAKMP_DOI_IPSEC
    pluto[12392]: | ***parse ISAKMP Vendor ID Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_VID
    pluto[12392]: |    length: 24
    pluto[12392]: | ***parse ISAKMP Vendor ID Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_VID
    pluto[12392]: |    length: 20
    pluto[12392]: | ***parse ISAKMP Vendor ID Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_VID
    pluto[12392]: |    length: 20
    pluto[12392]: | ***parse ISAKMP Vendor ID Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[12392]: |    length: 20
    pluto[12392]: packet from 172.21.33.79:500: ignoring Vendor ID payload [MS NT5 ISAKMPOAKLEY 00000004]
    pluto[12392]: | VID:  1e 2b 51 69  05 99 1c 7d  7c 96 fc bf  b5 87 e4 61
    pluto[12392]: |   00 00 00 04
    pluto[12392]: packet from 172.21.33.79:500: ignoring Vendor ID payload [FRAGMENTATION]
    pluto[12392]: | VID:  40 48 b7 d5  6e bc e8 85  25 e7 de 7f  00 d6 c2 d3
    pluto[12392]: packet from 172.21.33.79:500: received Vendor ID payload [draft-ietf-ipsec-nat-t-ike-02_n]
    pluto[12392]: | VID:  90 cb 80 91  3e bb 69 6e  08 63 81 b5  ec 42 7b 1f
    pluto[12392]: packet from 172.21.33.79:500: ignoring Vendor ID payload [26244d38eddb61b3172a36e3d0cfb819]
    pluto[12392]: | VID:  26 24 4d 38  ed db 61 b3  17 2a 36 e3  d0 cf b8 19
    pluto[12392]: | ****parse IPsec DOI SIT:
    pluto[12392]: |    IPsec DOI SIT: SIT_IDENTITY_ONLY
    pluto[12392]: | ****parse ISAKMP Proposal Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[12392]: |    length: 188
    pluto[12392]: |    proposal number: 1
    pluto[12392]: |    protocol ID: PROTO_ISAKMP
    pluto[12392]: |    SPI size: 0
    pluto[12392]: |    number of transforms: 5
    pluto[12392]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[12392]: |    next payload type: ISAKMP_NEXT_T
    pluto[12392]: |    length: 36
    pluto[12392]: |    transform number: 1
    pluto[12392]: |    transform ID: KEY_IKE
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[12392]: |    length/value: 5
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[12392]: |    length/value: 2
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[12392]: |    length/value: 14
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_AUTHENTICATION_METHOD
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_LIFE_TYPE
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_LIFE_DURATION (variable length)
    pluto[12392]: |    length/value: 4
    pluto[12392]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[12392]: |    next payload type: ISAKMP_NEXT_T
    pluto[12392]: |    length: 36
    pluto[12392]: |    transform number: 2
    pluto[12392]: |    transform ID: KEY_IKE
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[12392]: |    length/value: 5
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[12392]: |    length/value: 2
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[12392]: |    length/value: 2
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_AUTHENTICATION_METHOD
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_LIFE_TYPE
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_LIFE_DURATION (variable length)
    pluto[12392]: |    length/value: 4
    pluto[12392]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[12392]: |    next payload type: ISAKMP_NEXT_T
    pluto[12392]: |    length: 36
    pluto[12392]: |    transform number: 3
    pluto[12392]: |    transform ID: KEY_IKE
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[12392]: |    length/value: 5
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[12392]: |    length/value: 2
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_AUTHENTICATION_METHOD
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_LIFE_TYPE
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_LIFE_DURATION (variable length)
    pluto[12392]: |    length/value: 4
    pluto[12392]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[12392]: |    next payload type: ISAKMP_NEXT_T
    pluto[12392]: |    length: 36
    pluto[12392]: |    transform number: 4
    pluto[12392]: |    transform ID: KEY_IKE
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[12392]: |    length/value: 2
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_AUTHENTICATION_METHOD
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_LIFE_TYPE
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_LIFE_DURATION (variable length)
    pluto[12392]: |    length/value: 4
    pluto[12392]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[12392]: |    length: 36
    pluto[12392]: |    transform number: 5
    pluto[12392]: |    transform ID: KEY_IKE
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_AUTHENTICATION_METHOD
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_LIFE_TYPE
    pluto[12392]: |    length/value: 1
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_LIFE_DURATION (variable length)
    pluto[12392]: |    length/value: 4
    pluto[12392]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: responding to Main Mode from unknown peer 172.21.33.79
    pluto[12392]: | ****parse IPsec DOI SIT:
    pluto[12392]: |    IPsec DOI SIT: SIT_IDENTITY_ONLY
    pluto[12392]: | ****parse ISAKMP Proposal Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[12392]: |    length: 188
    pluto[12392]: |    proposal number: 1
    pluto[12392]: |    protocol ID: PROTO_ISAKMP
    pluto[12392]: |    SPI size: 0
    pluto[12392]: |    number of transforms: 5
    pluto[12392]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[12392]: |    next payload type: ISAKMP_NEXT_T
    pluto[12392]: |    length: 36
    pluto[12392]: |    transform number: 1
    pluto[12392]: |    transform ID: KEY_IKE
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[12392]: |    length/value: 5
    pluto[12392]: |    [5 is OAKLEY_3DES_CBC]
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[12392]: |    length/value: 2
    pluto[12392]: |    [2 is OAKLEY_SHA]
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[12392]: |    length/value: 14
    pluto[12392]: |    [14 is OAKLEY_GROUP_MODP2048]
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_AUTHENTICATION_METHOD
    pluto[12392]: |    length/value: 1
    pluto[12392]: |    [1 is OAKLEY_PRESHARED_KEY]
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_LIFE_TYPE
    pluto[12392]: |    length/value: 1
    pluto[12392]: |    [1 is OAKLEY_LIFE_SECONDS]
    pluto[12392]: | ******parse ISAKMP Oakley attribute:
    pluto[12392]: |    af+type: OAKLEY_LIFE_DURATION (variable length)
    pluto[12392]: |    length/value: 4
    pluto[12392]: |    long duration: 28800
    pluto[12392]: | Oakley Transform 1 accepted
    pluto[12392]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: transition from state (null) to state STATE_MAIN_R1
    pluto[12392]: |
    pluto[12392]: | *received 360 bytes from 172.21.33.79:500 on eth0
    pluto[12392]: | **parse ISAKMP Message:
    pluto[12392]: |    initiator cookie:
    pluto[12392]: |   92 f2 33 30  40 d3 8d 3a
    pluto[12392]: |    responder cookie:
    pluto[12392]: |   b7 30 09 f8  0e 4a 6e c6
    pluto[12392]: |    next payload type: ISAKMP_NEXT_KE
    pluto[12392]: |    ISAKMP version: ISAKMP Version 1.0
    pluto[12392]: |    exchange type: ISAKMP_XCHG_IDPROT
    pluto[12392]: |    flags: none
    pluto[12392]: |    message ID:  00 00 00 00
    pluto[12392]: |    length: 360
    pluto[12392]: | The xchg type is ISAKMP_XCHG_IDPROT (2)
    pluto[12392]: | ***parse ISAKMP Key Exchange Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NONCE
    pluto[12392]: |    length: 260
    pluto[12392]: | ***parse ISAKMP Nonce Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NAT-D
    pluto[12392]: |    length: 24
    pluto[12392]: | ***parse ISAKMP NAT-D Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NAT-D
    pluto[12392]: |    length: 24
    pluto[12392]: | ***parse ISAKMP NAT-D Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[12392]: |    length: 24
    pluto[12392]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: NAT-Traversal: Result using draft-ietf-ipsec-nat-t-ike-02/03: peer is NATed
    pluto[12392]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: transition from state STATE_MAIN_R1 to state STATE_MAIN_R2
    pluto[12392]: |
    pluto[12392]: | *received 76 bytes from 172.21.33.79:4500 on eth0
    pluto[12392]: | **parse ISAKMP Message:
    pluto[12392]: |    initiator cookie:
    pluto[12392]: |   92 f2 33 30  40 d3 8d 3a
    pluto[12392]: |    responder cookie:
    pluto[12392]: |   b7 30 09 f8  0e 4a 6e c6
    pluto[12392]: |    next payload type: ISAKMP_NEXT_ID
    pluto[12392]: |    ISAKMP version: ISAKMP Version 1.0
    pluto[12392]: |    exchange type: ISAKMP_XCHG_IDPROT
    pluto[12392]: |    flags: ISAKMP_FLAG_ENCRYPTION
    pluto[12392]: |    message ID:  00 00 00 00
    pluto[12392]: |    length: 76
    pluto[12392]: | The xchg type is ISAKMP_XCHG_IDPROT (2)
    pluto[12392]: | ***parse ISAKMP Identification Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_HASH
    pluto[12392]: |    length: 23
    pluto[12392]: |    ID type: ID_FQDN
    pluto[12392]: |    DOI specific A: 0
    pluto[12392]: |    DOI specific B: 0
    pluto[12392]: | ***parse ISAKMP Hash Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[12392]: |    length: 24
    pluto[12392]: | removing 1 bytes of padding
    pluto[12392]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: Main mode peer ID is ID_FQDN: '@test-55e98b2637'
    pluto[12392]: "conn_pptp_ipsec"[2] 172.21.33.79 #1: deleting connection "conn_pptp_ipsec" instance with peer 172.21.33.79
    pluto[12392]: "conn_pptp_ipsec"[2] 172.21.33.79 #1: transition from state STATE_MAIN_R2 to state STATE_MAIN_R3
    pluto[12392]: | NAT-T: new mapping 172.21.33.79:500/4500)
    pluto[12392]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: sent MR3, ISAKMP SA established
    pluto[12392]: |
    pluto[12392]: | *received 228 bytes from 172.21.33.79:4500 on eth0
    pluto[12392]: | **parse ISAKMP Message:
    pluto[12392]: |    initiator cookie:
    pluto[12392]: |   92 f2 33 30  40 d3 8d 3a
    pluto[12392]: |    responder cookie:
    pluto[12392]: |   b7 30 09 f8  0e 4a 6e c6
    pluto[12392]: |    next payload type: ISAKMP_NEXT_HASH
    pluto[12392]: |    ISAKMP version: ISAKMP Version 1.0
    pluto[12392]: |    exchange type: ISAKMP_XCHG_QUICK
    pluto[12392]: |    flags: ISAKMP_FLAG_ENCRYPTION
    pluto[12392]: |    message ID:  9d 06 2e 20
    pluto[12392]: |    length: 228
    pluto[12392]: | The xchg type is ISAKMP_XCHG_QUICK (32)
    pluto[12392]: | ***parse ISAKMP Hash Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_SA
    pluto[12392]: |    length: 24
    pluto[12392]: | ***parse ISAKMP Security Association Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NONCE
    pluto[12392]: |    length: 104
    pluto[12392]: |    DOI: ISAKMP_DOI_IPSEC
    pluto[12392]: | ***parse ISAKMP Nonce Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_ID
    pluto[12392]: |    length: 24
    pluto[12392]: | ***parse ISAKMP Identification Payload (IPsec DOI):
    pluto[12392]: |    next payload type: ISAKMP_NEXT_ID
    pluto[12392]: |    length: 23
    pluto[12392]: |    ID type: ID_FQDN
    pluto[12392]: |    Protocol ID: 17
    pluto[12392]: |    port: 1701
    pluto[12392]: | ***parse ISAKMP Identification Payload (IPsec DOI):
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NAT-OA
    pluto[12392]: |    length: 12
    pluto[12392]: |    ID type: ID_IPV4_ADDR
    pluto[12392]: |    Protocol ID: 17
    pluto[12392]: |    port: 1701
    pluto[12392]: | ***parse ISAKMP NAT-OA Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[12392]: |    length: 12
    pluto[12392]: |    ID type: ID_IPV4_ADDR
    pluto[12392]: | removing 1 bytes of padding
    pluto[12392]: | our client is 172.21.33.8/32
    pluto[12392]: | our client protocol/port is 17/1701
    pluto[12392]: | NAT-OA:  00 00 00 0c  01 00 00 00  c0 a8 0a 64
    pluto[12392]: | ****parse IPsec DOI SIT:
    pluto[12392]: |    IPsec DOI SIT: SIT_IDENTITY_ONLY
    pluto[12392]: | ****parse ISAKMP Proposal Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[12392]: |    length: 92
    pluto[12392]: |    proposal number: 1
    pluto[12392]: |    protocol ID: PROTO_IPSEC_ESP
    pluto[12392]: |    SPI size: 4
    pluto[12392]: |    number of transforms: 2
    pluto[12392]: | parsing 4 raw bytes of ISAKMP Proposal Payload into SPI
    pluto[12392]: | SPI  ca 19 61 99
    pluto[12392]: | *****parse ISAKMP Transform Payload (ESP):
    pluto[12392]: |    next payload type: ISAKMP_NEXT_T
    pluto[12392]: |    length: 40
    pluto[12392]: |    transform number: 1
    pluto[12392]: |    transform ID: ESP_NULL
    pluto[12392]: | ******parse ISAKMP IPsec DOI attribute:
    pluto[12392]: |    af+type: SA_LIFE_TYPE
    pluto[12392]: |    length/value: 1
    pluto[12392]: |    [1 is SA_LIFE_TYPE_SECONDS]
    pluto[12392]: | ******parse ISAKMP IPsec DOI attribute:
    pluto[12392]: |    af+type: SA_LIFE_DURATION (variable length)
    pluto[12392]: |    length/value: 4
    pluto[12392]: |    long duration: 3600
    pluto[12392]: | ******parse ISAKMP IPsec DOI attribute:
    pluto[12392]: |    af+type: SA_LIFE_TYPE
    pluto[12392]: |    length/value: 2
    pluto[12392]: |    [2 is SA_LIFE_TYPE_KBYTES]
    pluto[12392]: | ******parse ISAKMP IPsec DOI attribute:
    pluto[12392]: |    af+type: SA_LIFE_DURATION (variable length)
    pluto[12392]: |    length/value: 4
    pluto[12392]: |    long duration: 250000
    pluto[12392]: | ******parse ISAKMP IPsec DOI attribute:
    pluto[12392]: |    af+type: ENCAPSULATION_MODE
    pluto[12392]: |    length/value: 61444
    pluto[12392]: |    [61444 is ENCAPSULATION_MODE_UDP_TRANSPORT]
    pluto[12392]: | ******parse ISAKMP IPsec DOI attribute:
    pluto[12392]: |    af+type: AUTH_ALGORITHM
    pluto[12392]: |    length/value: 2
    pluto[12392]: |    [2 is AUTH_ALGORITHM_HMAC_SHA1]
    pluto[12392]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #2: You should NOT use insecure ESP algorithms [ESP_NULL (0)]!
    pluto[12392]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #2: responding to Quick Mode
    pluto[12392]: | compute_proto_keymat:needed_len (after ESP enc)=0
    pluto[12392]: | kernel_alg_esp_auth_keylen(auth=2, sadb_aalg=3): a_keylen=20
    pluto[12392]: | compute_proto_keymat:needed_len (after ESP auth)=20
    pluto[12392]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #2: transition from state (null) to state STATE_QUICK_R1
    pluto[12392]: |
    pluto[12392]: | *received 52 bytes from 172.21.33.79:4500 on eth0
    pluto[12392]: | **parse ISAKMP Message:
    pluto[12392]: |    initiator cookie:
    pluto[12392]: |   92 f2 33 30  40 d3 8d 3a
    pluto[12392]: |    responder cookie:
    pluto[12392]: |   b7 30 09 f8  0e 4a 6e c6
    pluto[12392]: |    next payload type: ISAKMP_NEXT_HASH
    pluto[12392]: |    ISAKMP version: ISAKMP Version 1.0
    pluto[12392]: |    exchange type: ISAKMP_XCHG_QUICK
    pluto[12392]: |    flags: ISAKMP_FLAG_ENCRYPTION
    pluto[12392]: |    message ID:  9d 06 2e 20
    pluto[12392]: |    length: 52
    pluto[12392]: | The xchg type is ISAKMP_XCHG_QUICK (32)
    pluto[12392]: | ***parse ISAKMP Hash Payload:
    pluto[12392]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[12392]: |    length: 24
    pluto[12392]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #2: transition from state STATE_QUICK_R1 to state STATE_QUICK_R2
    pluto[12392]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #2: IPsec SA established

    #
    #

    接下來我將client改成WIN7

    =~=~=~=~=~=~=~=~=~=~=~= PuTTY log 2010.03.30 18:42:39 =~=~=~=~=~=~=~=~=~=~=~=
    pluto[13156]: |
    pluto[13156]: | *received 384 bytes from 172.21.33.79:500 on eth0
    pluto[13156]: | **parse ISAKMP Message:
    pluto[13156]: |    initiator cookie:
    pluto[13156]: |   c1 b5 e9 73  75 61 93 46
    pluto[13156]: |    responder cookie:
    pluto[13156]: |   00 00 00 00  00 00 00 00
    pluto[13156]: |    next payload type: ISAKMP_NEXT_SA
    pluto[13156]: |    ISAKMP version: ISAKMP Version 1.0
    pluto[13156]: |    exchange type: ISAKMP_XCHG_IDPROT
    pluto[13156]: |    flags: none
    pluto[13156]: |    message ID:  00 00 00 00
    pluto[13156]: |    length: 384
    pluto[13156]: | The xchg type is ISAKMP_XCHG_IDPROT (2)
    pluto[13156]: | ***parse ISAKMP Security Association Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_VID
    pluto[13156]: |    length: 212
    pluto[13156]: |    DOI: ISAKMP_DOI_IPSEC
    pluto[13156]: | ***parse ISAKMP Vendor ID Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_VID
    pluto[13156]: |    length: 24
    pluto[13156]: | ***parse ISAKMP Vendor ID Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_VID
    pluto[13156]: |    length: 20
    pluto[13156]: | ***parse ISAKMP Vendor ID Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_VID
    pluto[13156]: |    length: 20
    pluto[13156]: | ***parse ISAKMP Vendor ID Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_VID
    pluto[13156]: |    length: 20
    pluto[13156]: | ***parse ISAKMP Vendor ID Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_VID
    pluto[13156]: |    length: 20
    pluto[13156]: | ***parse ISAKMP Vendor ID Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_VID
    pluto[13156]: |    length: 20
    pluto[13156]: | ***parse ISAKMP Vendor ID Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[13156]: |    length: 20
    pluto[13156]: packet from 172.21.33.79:500: ignoring Vendor ID payload [MS NT5 ISAKMPOAKLEY 00000008]
    pluto[13156]: | VID:  1e 2b 51 69  05 99 1c 7d  7c 96 fc bf  b5 87 e4 61
    pluto[13156]: |   00 00 00 08
    pluto[13156]: packet from 172.21.33.79:500: received Vendor ID payload [RFC 3947]
    pluto[13156]: | VID:  4a 13 1c 81  07 03 58 45  5c 57 28 f2  0e 95 45 2f
    pluto[13156]: packet from 172.21.33.79:500: ignoring Vendor ID payload [draft-ietf-ipsec-nat-t-ike-02_n]
    pluto[13156]: | VID:  90 cb 80 91  3e bb 69 6e  08 63 81 b5  ec 42 7b 1f
    pluto[13156]: packet from 172.21.33.79:500: ignoring Vendor ID payload [FRAGMENTATION]
    pluto[13156]: | VID:  40 48 b7 d5  6e bc e8 85  25 e7 de 7f  00 d6 c2 d3
    pluto[13156]: packet from 172.21.33.79:500: ignoring Vendor ID payload [fb1de3cdf341b7ea16b7e5be0855f120]
    pluto[13156]: | VID:  fb 1d e3 cd  f3 41 b7 ea  16 b7 e5 be  08 55 f1 20
    pluto[13156]: packet from 172.21.33.79:500: ignoring Vendor ID payload [26244d38eddb61b3172a36e3d0cfb819]
    pluto[13156]: | VID:  26 24 4d 38  ed db 61 b3  17 2a 36 e3  d0 cf b8 19
    pluto[13156]: packet from 172.21.33.79:500: ignoring Vendor ID payload [e3a5966a76379fe707228231e5ce8652]
    pluto[13156]: | VID:  e3 a5 96 6a  76 37 9f e7  07 22 82 31  e5 ce 86 52
    pluto[13156]: | ****parse IPsec DOI SIT:
    pluto[13156]: |    IPsec DOI SIT: SIT_IDENTITY_ONLY
    pluto[13156]: | ****parse ISAKMP Proposal Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[13156]: |    length: 200
    pluto[13156]: |    proposal number: 1
    pluto[13156]: |    protocol ID: PROTO_ISAKMP
    pluto[13156]: |    SPI size: 0
    pluto[13156]: |    number of transforms: 5
    pluto[13156]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[13156]: |    next payload type: ISAKMP_NEXT_T
    pluto[13156]: |    length: 40
    pluto[13156]: |    transform number: 1
    pluto[13156]: |    transform ID: KEY_IKE
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[13156]: |    length/value: 7
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_KEY_LENGTH
    pluto[13156]: |    length/value: 256
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[13156]: |    length/value: 2
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[13156]: |    length/value: 20
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_AUTHENTICATION_METHOD
    pluto[13156]: |    length/value: 1
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_LIFE_TYPE
    pluto[13156]: |    length/value: 1
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_LIFE_DURATION (variable length)
    pluto[13156]: |    length/value: 4
    pluto[13156]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[13156]: |    next payload type: ISAKMP_NEXT_T
    pluto[13156]: |    length: 40
    pluto[13156]: |    transform number: 2
    pluto[13156]: |    transform ID: KEY_IKE
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[13156]: |    length/value: 7
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_KEY_LENGTH
    pluto[13156]: |    length/value: 128
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[13156]: |    length/value: 2
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[13156]: |    length/value: 19
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_AUTHENTICATION_METHOD
    pluto[13156]: |    length/value: 1
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_LIFE_TYPE
    pluto[13156]: |    length/value: 1
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_LIFE_DURATION (variable length)
    pluto[13156]: |    length/value: 4
    pluto[13156]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[13156]: |    next payload type: ISAKMP_NEXT_T
    pluto[13156]: |    length: 40
    pluto[13156]: |    transform number: 3
    pluto[13156]: |    transform ID: KEY_IKE
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[13156]: |    length/value: 7
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_KEY_LENGTH
    pluto[13156]: |    length/value: 256
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[13156]: |    length/value: 2
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[13156]: |    length/value: 14
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_AUTHENTICATION_METHOD
    pluto[13156]: |    length/value: 1
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_LIFE_TYPE
    pluto[13156]: |    length/value: 1
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_LIFE_DURATION (variable length)
    pluto[13156]: |    length/value: 4
    pluto[13156]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[13156]: |    next payload type: ISAKMP_NEXT_T
    pluto[13156]: |    length: 36
    pluto[13156]: |    transform number: 4
    pluto[13156]: |    transform ID: KEY_IKE
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[13156]: |    length/value: 5
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[13156]: |    length/value: 2
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[13156]: |    length/value: 14
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_AUTHENTICATION_METHOD
    pluto[13156]: |    length/value: 1
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_LIFE_TYPE
    pluto[13156]: |    length/value: 1
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_LIFE_DURATION (variable length)
    pluto[13156]: |    length/value: 4
    pluto[13156]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[13156]: |    length: 36
    pluto[13156]: |    transform number: 5
    pluto[13156]: |    transform ID: KEY_IKE
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[13156]: |    length/value: 5
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[13156]: |    length/value: 2
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[13156]: |    length/value: 2
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_AUTHENTICATION_METHOD
    pluto[13156]: |    length/value: 1
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_LIFE_TYPE
    pluto[13156]: |    length/value: 1
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_LIFE_DURATION (variable length)
    pluto[13156]: |    length/value: 4
    pluto[13156]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: responding to Main Mode from unknown peer 172.21.33.79
    pluto[13156]: | ****parse IPsec DOI SIT:
    pluto[13156]: |    IPsec DOI SIT: SIT_IDENTITY_ONLY
    pluto[13156]: | ****parse ISAKMP Proposal Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[13156]: |    length: 200
    pluto[13156]: |    proposal number: 1
    pluto[13156]: |    protocol ID: PROTO_ISAKMP
    pluto[13156]: |    SPI size: 0
    pluto[13156]: |    number of transforms: 5
    pluto[13156]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[13156]: |    next payload type: ISAKMP_NEXT_T
    pluto[13156]: |    length: 40
    pluto[13156]: |    transform number: 1
    pluto[13156]: |    transform ID: KEY_IKE
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[13156]: |    length/value: 7
    pluto[13156]: |    [7 is OAKLEY_AES_CBC]
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_KEY_LENGTH
    pluto[13156]: |    length/value: 256
    pluto[13156]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: enckey:256
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[13156]: |    length/value: 2
    pluto[13156]: |    [2 is OAKLEY_SHA]
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[13156]: |    length/value: 20
    pluto[13156]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: only OAKLEY_GROUP_MODP768,1024,1536,2048,3072,4096,6144,8192 supported.  Attribute OAKLEY_GROUP_DESCRIPTION
    pluto[13156]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[13156]: |    next payload type: ISAKMP_NEXT_T
    pluto[13156]: |    length: 40
    pluto[13156]: |    transform number: 2
    pluto[13156]: |    transform ID: KEY_IKE
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[13156]: |    length/value: 7
    pluto[13156]: |    [7 is OAKLEY_AES_CBC]
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_KEY_LENGTH
    pluto[13156]: |    length/value: 128
    pluto[13156]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: enckey:128
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[13156]: |    length/value: 2
    pluto[13156]: |    [2 is OAKLEY_SHA]
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[13156]: |    length/value: 19
    pluto[13156]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: only OAKLEY_GROUP_MODP768,1024,1536,2048,3072,4096,6144,8192 supported.  Attribute OAKLEY_GROUP_DESCRIPTION
    pluto[13156]: | *****parse ISAKMP Transform Payload (ISAKMP):
    pluto[13156]: |    next payload type: ISAKMP_NEXT_T
    pluto[13156]: |    length: 40
    pluto[13156]: |    transform number: 3
    pluto[13156]: |    transform ID: KEY_IKE
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_ENCRYPTION_ALGORITHM
    pluto[13156]: |    length/value: 7
    pluto[13156]: |    [7 is OAKLEY_AES_CBC]
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_KEY_LENGTH
    pluto[13156]: |    length/value: 256
    pluto[13156]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: enckey:256
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_HASH_ALGORITHM
    pluto[13156]: |    length/value: 2
    pluto[13156]: |    [2 is OAKLEY_SHA]
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_GROUP_DESCRIPTION
    pluto[13156]: |    length/value: 14
    pluto[13156]: |    [14 is OAKLEY_GROUP_MODP2048]
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_AUTHENTICATION_METHOD
    pluto[13156]: |    length/value: 1
    pluto[13156]: |    [1 is OAKLEY_PRESHARED_KEY]
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_LIFE_TYPE
    pluto[13156]: |    length/value: 1
    pluto[13156]: |    [1 is OAKLEY_LIFE_SECONDS]
    pluto[13156]: | ******parse ISAKMP Oakley attribute:
    pluto[13156]: |    af+type: OAKLEY_LIFE_DURATION (variable length)
    pluto[13156]: |    length/value: 4
    pluto[13156]: |    long duration: 28800
    pluto[13156]: | Oakley Transform 3 accepted
    pluto[13156]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: transition from state (null) to state STATE_MAIN_R1
    pluto[13156]: |
    pluto[13156]: | *received 388 bytes from 172.21.33.79:500 on eth0
    pluto[13156]: | **parse ISAKMP Message:
    pluto[13156]: |    initiator cookie:
    pluto[13156]: |   c1 b5 e9 73  75 61 93 46
    pluto[13156]: |    responder cookie:
    pluto[13156]: |   f4 91 b1 f7  4b b0 5c 11
    pluto[13156]: |    next payload type: ISAKMP_NEXT_KE
    pluto[13156]: |    ISAKMP version: ISAKMP Version 1.0
    pluto[13156]: |    exchange type: ISAKMP_XCHG_IDPROT
    pluto[13156]: |    flags: none
    pluto[13156]: |    message ID:  00 00 00 00
    pluto[13156]: |    length: 388
    pluto[13156]: | The xchg type is ISAKMP_XCHG_IDPROT (2)
    pluto[13156]: | ***parse ISAKMP Key Exchange Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NONCE
    pluto[13156]: |    length: 260
    pluto[13156]: | ***parse ISAKMP Nonce Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NAT-D
    pluto[13156]: |    length: 52
    pluto[13156]: | ***parse ISAKMP NAT-D Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NAT-D
    pluto[13156]: |    length: 24
    pluto[13156]: | ***parse ISAKMP NAT-D Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[13156]: |    length: 24
    pluto[13156]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: NAT-Traversal: Result using RFC 3947: peer is NATed
    pluto[13156]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: transition from state STATE_MAIN_R1 to state STATE_MAIN_R2
    pluto[13156]: |
    pluto[13156]: | *received 76 bytes from 172.21.33.79:4500 on eth0
    pluto[13156]: | **parse ISAKMP Message:
    pluto[13156]: |    initiator cookie:
    pluto[13156]: |   c1 b5 e9 73  75 61 93 46
    pluto[13156]: |    responder cookie:
    pluto[13156]: |   f4 91 b1 f7  4b b0 5c 11
    pluto[13156]: |    next payload type: ISAKMP_NEXT_ID
    pluto[13156]: |    ISAKMP version: ISAKMP Version 1.0
    pluto[13156]: |    exchange type: ISAKMP_XCHG_IDPROT
    pluto[13156]: |    flags: ISAKMP_FLAG_ENCRYPTION
    pluto[13156]: |    message ID:  00 00 00 00
    pluto[13156]: |    length: 76
    pluto[13156]: | The xchg type is ISAKMP_XCHG_IDPROT (2)
    pluto[13156]: | ***parse ISAKMP Identification Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_HASH
    pluto[13156]: |    length: 12
    pluto[13156]: |    ID type: ID_IPV4_ADDR
    pluto[13156]: |    DOI specific A: 0
    pluto[13156]: |    DOI specific B: 0
    pluto[13156]: | ***parse ISAKMP Hash Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[13156]: |    length: 24
    pluto[13156]: | removing 12 bytes of padding
    pluto[13156]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: Main mode peer ID is ID_IPV4_ADDR: '192.168.10.100'
    pluto[13156]: "conn_pptp_ipsec"[2] 172.21.33.79 #1: deleting connection "conn_pptp_ipsec" instance with peer 172.21.33.79
    pluto[13156]: "conn_pptp_ipsec"[2] 172.21.33.79 #1: transition from state STATE_MAIN_R2 to state STATE_MAIN_R3
    pluto[13156]: | NAT-T: new mapping 172.21.33.79:500/4500)
    pluto[13156]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: sent MR3, ISAKMP SA established
    pluto[13156]: |
    pluto[13156]: | *received 220 bytes from 172.21.33.79:4500 on eth0
    pluto[13156]: | **parse ISAKMP Message:
    pluto[13156]: |    initiator cookie:
    pluto[13156]: |   c1 b5 e9 73  75 61 93 46
    pluto[13156]: |    responder cookie:
    pluto[13156]: |   f4 91 b1 f7  4b b0 5c 11
    pluto[13156]: |    next payload type: ISAKMP_NEXT_HASH
    pluto[13156]: |    ISAKMP version: ISAKMP Version 1.0
    pluto[13156]: |    exchange type: ISAKMP_XCHG_QUICK
    pluto[13156]: |    flags: ISAKMP_FLAG_ENCRYPTION
    pluto[13156]: |    message ID:  00 00 00 01
    pluto[13156]: |    length: 220
    pluto[13156]: | The xchg type is ISAKMP_XCHG_QUICK (32)
    pluto[13156]: | ***parse ISAKMP Hash Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_SA
    pluto[13156]: |    length: 24
    pluto[13156]: | ***parse ISAKMP Security Association Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NONCE
    pluto[13156]: |    length: 64
    pluto[13156]: |    DOI: ISAKMP_DOI_IPSEC
    pluto[13156]: | ***parse ISAKMP Nonce Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_ID
    pluto[13156]: |    length: 52
    pluto[13156]: | ***parse ISAKMP Identification Payload (IPsec DOI):
    pluto[13156]: |    next payload type: ISAKMP_NEXT_ID
    pluto[13156]: |    length: 12
    pluto[13156]: |    ID type: ID_IPV4_ADDR
    pluto[13156]: |    Protocol ID: 17
    pluto[13156]: |    port: 1701
    pluto[13156]: | ***parse ISAKMP Identification Payload (IPsec DOI):
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NAT-OA
    pluto[13156]: |    length: 12
    pluto[13156]: |    ID type: ID_IPV4_ADDR
    pluto[13156]: |    Protocol ID: 17
    pluto[13156]: |    port: 1701
    pluto[13156]: | ***parse ISAKMP NAT-OA Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NAT-OA
    pluto[13156]: |    length: 12
    pluto[13156]: |    ID type: ID_IPV4_ADDR
    pluto[13156]: | ***parse ISAKMP NAT-OA Payload:
    pluto[13156]: |    next payload type: ISAKMP_NEXT_NONE
    pluto[13156]: |    length: 12
    pluto[13156]: |    ID type: ID_IPV4_ADDR
    pluto[13156]: | removing 4 bytes of padding
    pluto[13156]: | peer client is 192.168.10.100/32
    pluto[13156]: | peer client protocol/port is 17/1701
    pluto[13156]: | our client is 172.21.33.8/32
    pluto[13156]: | our client protocol/port is 17/1701
    pluto[13156]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: cannot respond to IPsec SA request because no connection is known for 172.21.33.8:4500:17/1701...172.21.33.79:4500[192.168.10.100]:17/1701===192.168.10.100/32
    pluto[13156]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: sending encrypted notification INVALID_ID_INFORMATION to 172.21.33.79:4500
    pluto[13156]: |
    pluto[13156]: | *received 220 bytes from 172.21.33.79:4500 on eth0
    pluto[13156]: | **parse ISAKMP Message:
    pluto[13156]: |    initiator cookie:
    pluto[13156]: |   c1 b5 e9 73  75 61 93 46
    pluto[13156]: |    responder cookie:
    pluto[13156]: |   f4 91 b1 f7  4b b0 5c 11
    pluto[13156]: |    next payload type: ISAKMP_NEXT_HASH
    pluto[13156]: |    ISAKMP version: ISAKMP Version 1.0
    pluto[13156]: |    exchange type: ISAKMP_XCHG_QUICK
    pluto[13156]: |    flags: ISAKMP_FLAG_ENCRYPTION
    pluto[13156]: |    message ID:  00 00 00 01
    pluto[13156]: |    length: 220
    pluto[13156]: | The xchg type is ISAKMP_XCHG_QUICK (32)
    pluto[13156]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: Quick Mode I1 message is unacceptable because it uses a previously used Message ID 0x01000000 (perhaps this is a duplicated packet)
    pluto[13156]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: sending encrypted notification INVALID_MESSAGE_ID to 172.21.33.79:4500


    trace code到了這裡 ipsec_doi.c

    quick_inI1_outR1(struct msg_digest *md) ---> 
         quick_inI1_outR1_tail --->
              find_client_connection

    static stf_status
    quick_inI1_outR1_tail(struct msg_digest *md
    , struct p2id *my, struct p2id *his
    , unsigned int new_iv_len
    , const u_char new_iv[MAX_DIGEST_LEN])
    {
        struct state *const p1st = md->st;
        struct connection *c = p1st->st_connection;
        struct payload_digest *const id_pd = md->chain[ISAKMP_NEXT_ID];
        ip_subnet *our_net = &my->net
            , *his_net = &his->net;

        u_char      /* set by START_HASH_PAYLOAD: */
            *r_hashval,     /* where in reply to jam hash value */
            *r_hash_start;  /* from where to start hashing */

        /* Now that we have identities of client subnets, we must look for
         * a suitable connection (our current one only matches for hosts).
         */
        {
            struct connection *p = find_client_connection(c
                , our_net, his_net, my->proto, my->port, his->proto, his->port);

            if (p == NULL) //win 7 會等於null,xp不會…



    看來是在這裡有問題: connections.c

    struct connection *
    find_client_connection(struct connection *c
    , const ip_subnet *our_net, const ip_subnet *peer_net
    , const u_int8_t our_protocol, const u_int16_t our_port
    , const u_int8_t peer_protocol, const u_int16_t peer_port)
    {
    ....


            if (samesubnet(&c->this.client, our_net)
            && samesubnet(&c->that.client, peer_net) //win7會fail
            && (c->this.protocol == our_protocol)
            && (!c->this.port || (c->this.port == our_port))
            && (c->that.protocol == peer_protocol)
        && (!c->that.port || (c->that.port == peer_port)))
            {
                passert(oriented(*c));
                if (routed(c->routing))
                    return c;

                unrouted = c;//在nat-d下xp會找到connection,xp的QI1的id是fqdn,win7是ipv4…所以找不到connection
            }

            /* exact match? */
            d = fc_try(FALSE, c, c->host_pair, NULL, our_net, peer_net
                , our_protocol, our_port, peer_protocol, peer_port);

    -----------------------------
    再試一下xp和win7的nat-d

    // WIN7 NAT-D
    pluto[8303]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: enckey:256
    pluto[8303]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: transition from state (null) to state STATE_MAIN_R1
    pluto[8303]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: NAT-Traversal: Result using RFC 3947: peer is NATed
    pluto[8303]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: transition from state STATE_MAIN_R1 to state STATE_MAIN_R2
    pluto[8303]: "conn_pptp_ipsec"[1] 172.21.33.79 #1: Main mode peer ID is ID_IPV4_ADDR: '192.168.10.100'
    pluto[8303]: "conn_pptp_ipsec"[2] 172.21.33.79 #1: deleting connection "conn_pptp_ipsec" instance with peer 172.21.33.79
    pluto[8303]: "conn_pptp_ipsec"[2] 172.21.33.79 #1: transition from state STATE_MAIN_R2 to state STATE_MAIN_R3
    pluto[8303]: | NAT-T: new mapping 172.21.33.79:500/4500)
    pluto[8303]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: sent MR3, ISAKMP SA established
    pluto[8303]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: find_client_connection:2431\012
    pluto[8303]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: that client:172.21.33.79/32\012
    pluto[8303]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: peer net:192.168.10.100/32\012
    pluto[8303]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: find_client_connection,2447\012
    pluto[8303]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: find_client_connection:2481: d:unroute\012
    pluto[8303]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: find_client_connection:2485\012
    pluto[8303]: "conn_pptp_ipsec"[2] 172.21.33.79:4500 #1: find_client_connection:2517: d:unroute\012

    //XP NAT-D
    pluto[8303]: "conn_pptp_ipsec"[3] 172.21.33.79 #2: NAT-Traversal: Result using draft-ietf-ipsec-nat-t-ike-02/03: peer is NATed
    pluto[8303]: "conn_pptp_ipsec"[3] 172.21.33.79 #2: transition from state STATE_MAIN_R1 to state STATE_MAIN_R2
    pluto[8303]: "conn_pptp_ipsec"[3] 172.21.33.79 #2: Main mode peer ID is ID_FQDN: '@cameo-80e9e70cd'
    pluto[8303]: "conn_pptp_ipsec"[4] 172.21.33.79 #2: deleting connection "conn_pptp_ipsec" instance with peer 172.21.33.79
    pluto[8303]: "conn_pptp_ipsec"[4] 172.21.33.79 #2: transition from state STATE_MAIN_R2 to state STATE_MAIN_R3
    pluto[8303]: | NAT-T: new mapping 172.21.33.79:500/4500)
    pluto[8303]: "conn_pptp_ipsec"[4] 172.21.33.79:4500 #2: sent MR3, ISAKMP SA established
    pluto[8303]: "conn_pptp_ipsec"[4] 172.21.33.79:4500 #2: find_client_connection:2431\012
    pluto[8303]: "conn_pptp_ipsec"[4] 172.21.33.79:4500 #2: that client:172.21.33.79/32\012
    pluto[8303]: "conn_pptp_ipsec"[4] 172.21.33.79:4500 #2: peer net:172.21.33.79/32\012


    看來真的是xp和win7的id_doi的問題…但還不能下定論…
    而以下的文章應該和我猜的沒錯…
    重點是說…vista基於nat-d 的security考量,而沒有辦法和openswan的nat-d連線

    http://www.jacco2.dds.nl/networking/vista-openswan.html



    7.1.1 Issue with Windows Vista and server-side NAT
    Windows Vista has the same issue as Windows XP with ServicePack 2. This issue was discovered by George Ou.  Vista does not support establishing IPsec connections to servers behind NAT. Apparently Microsoft considers this a security risk because of an (uncommon) scenario which is described here. Microsoft even says that a VPN server behind NAT is "not recommended" (see also KB Q885348), although the NAT-T RFC describes it as a normal setup that should be supported. The problem occurs with both Windows Server 2003 and Openswan, so it is an issue in Vista, not Openswan.


    7.1.2 PSK and NAT-T in Vista
    In most (production) cases you will want to use certificate authentication instead of a Preshared Key (PSK). Certificates provide better security and work better when NAT is involved. However, in some cases you may be forced to use a PSK.
    Windows Vista is very similar to the L2TP/IPsec client included with Windows XP/2003, but there is an additional requirement when a PSK is used and NAT is involved. You have to add this line to your L2TP-PSK section:
      rightsubnet=vhost:%no,%priv
    Windows XP/2003 support PSKs and NAT-T but they are based on draft-02 of the NAT-T standard ("draft-ietf-ipsec-nat-t-ike-02"). Vista also supports this draft-02 but when connecting to recent versions of Openswan it prefers RFC 3947 over draft-02. Apparently these implementations use different identifiers when NAT is involved: when a Windows XP/2003 client connects, Openswan reports the following:
      Main mode peer ID is ID_FQDN: '@blabla.example.com' 
    But when a Vista client connects (or probably any other RFC 3947 compliant client), the following is reported:
      Main mode peer ID is ID_IPV4_ADDR: 'x.x.x.x'
    (Where x.x.x.x is the IP address that the client has on the NATed network).

    這是ms的說法…但我沒去看…呼~~~希望我不用fix這個bug
    http://technet.microsoft.com/zh-tw/library/bb878119(en-us).aspx#ECAA


    我再回頭看M1的vendor ID好像是真的沒錯…

    : packet from 172.21.33.79:500: ignoring Vendor ID payload [MS NT5 ISAKMPOAKLEY 00000004]
    : packet from 172.21.33.79:500: ignoring Vendor ID payload [FRAGMENTATION]
    : packet from 172.21.33.79:500: received Vendor ID payload [draft-ietf-ipsec-nat-t-ike-02_n]
    : packet from 172.21.33.79:500: ignoring Vendor ID payload [26244d38eddb61b3172a36e3d0cfb819]

    : packet from 172.21.33.79:500: ignoring Vendor ID payload [MS NT5 ISAKMPOAKLEY 00000008]
    : packet from 172.21.33.79:500: received Vendor ID payload [RFC 3947]
    : packet from 172.21.33.79:500: ignoring Vendor ID payload [draft-ietf-ipsec-nat-t-ike-02_n]
    : packet from 172.21.33.79:500: ignoring Vendor ID payload [FRAGMENTATION]
    : packet from 172.21.33.79:500: ignoring Vendor ID payload [fb1de3cdf341b7ea16b7e5be0855f120]
    : packet from 172.21.33.79:500: ignoring Vendor ID payload [26244d38eddb61b3172a36e3d0cfb819]
    : packet from 172.21.33.79:500: ignoring Vendor ID payload [e3a5966a76379fe707228231e5ce8652]