Linux で IPsec のリモートアクセス VPN

LinuxIPsec のリモートアクセス VPN する方法を調べたが、思いのほか情報が少ないので調べた内容をまとめ。

リモートアクセス VPNIPsec で行う場合、Tunnel Mode の Aggressive Mode で XAUTH と mode-cfg を組み合わせて利用する。(今回は L2TP は考慮していない)

Open Source の IPsec 実装の利用を前提に、前述の構成に関する情報を調べていくと、いくつか落とし穴があり、動作する構成が意外に少ないので整理しておくことにする。

参照している情報が「今でも通用する」のか注意

インターネット上の LinuxIPsec に関する記述は比較的古いものが多いので「今でも通用するのか」確認が必要

2003/04/22
The FreeS/WAN team is proud to announce the arrival of 2.06, the project's final release of its freely redistributable IPsec for Linux.

Aggressive Mode を実装しているか注意

XAUTH を実装しているかどうか注意

              /* Plain Xauth, Not implemented */
      #define OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I   65001
      • ipsec-tools-0.6.6/src/racoon/ipsec_doi.c: switch_authmethod()
              /* Those are not implemented */
              case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
                      authmethod = OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I;
                      break;
      • ipsec-tools-0.6.6/src/racoon/isakmp_xauth.c: xauth_check()
              /* The following are not yet implemented */
              case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I:
              /* Plain Xauth */
      #define OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I   65001
      • ipsec-tools-0.7/src/racoon/ipsec_doi.c: switch_authmethod()
              case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
                      authmethod = OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_I;
                      break;
      • ipsec-tools-0.7/src/racoon/isakmp_xauth.c: xauth_check()
      int
      xauth_check(iph1)
              struct ph1handle *iph1;
      {
              struct xauth_state *xst = &iph1->mode_cfg->xauth;

              /*
               * Only the server side (edge device) really check for Xauth
               * status. It does it if the chose authmethod is using Xauth.
               * On the client side (roadwarrior), we don't check anything.
               */
              switch (AUTHMETHOD(iph1)) {
              case OAKLEY_ATTR_AUTH_METHOD_HYBRID_RSA_R:
              case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSASIG_R:
              case OAKLEY_ATTR_AUTH_METHOD_XAUTH_PSKEY_R:
              /* The following are not yet implemented */
              case OAKLEY_ATTR_AUTH_METHOD_HYBRID_DSS_R:
              case OAKLEY_ATTR_AUTH_METHOD_XAUTH_DSSSIG_R:
              case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAENC_R:
              case OAKLEY_ATTR_AUTH_METHOD_XAUTH_RSAREV_R:
                      if ((iph1->mode_cfg->flags & ISAKMP_CFG_VENDORID_XAUTH) == 0) {
                              plog(LLV_ERROR, LOCATION, NULL,
                                  "Hybrid auth negotiated but peer did not "
                                  "announced as Xauth capable\n");
                              return -1;
                      }

                      if (xst->status != XAUTHST_OK) {
                              plog(LLV_ERROR, LOCATION, NULL,
                                  "Hybrid auth negotiated but peer did not "
                                  "succeed Xauth exchange\n");
                              return -1;
                      }

                      return 0;
                      break;
              default:
                      return 0;
                      break;
              }

              return 0;
      }

The starter code was ported to FreeSWAN 2.05, but the work was not
completed. This code depends upon changes to pluto, which are have not
been done in Openswan.

This needs to be tested, and have scripts for the regression testing
system written.

2004-11-30 ken
* Added support for xauth, aggr mode, mode config and dpd parameters

mode-cfg の Request/Reply と Set/Acknowledge の両方に対応しているかどうか注意

「mode-cfg に対応している」という記述がどこかにあっても、必ずしも全ての処理が実装されているわけではないので、異なる実装の相互接続には特に注意が必要

ISAKMP Configuration Method(mode-cfg)について

* draft-dukes-ike-mode-cfg-02.txt に定義されている attribute について、
o Request/Reply 型の通知方法は使用しません。attribute を通知する場合は、必ず
ISAKMP-CFG-SET メッセージに格納し、Set/Acknowledge 型の通知方法を用いて通知します。
o IPv4 アドレスを IPsec クライアントに通知するために、以下の attribute を使用します。
+ INTERNAL_IP4_ADDRESS(1)
+ INTERNAL_IP4_NETMASK(2)
o IPv6 アドレスを IPsec クライアントに通知するために、以下の attribute を使用します。
+ INTERNAL_IP6_ADDRESS(8)
+ INTERNAL_IP6_NETMASK(9)
o DNS サーバアドレスを IPsec クライアントに通知するために、以下の attribute を使用し
ます。
+ INTERNAL_IP4_DNS(3)
+ INTERNAL_IP6_DNS(10)
o WINS サーバアドレスを IPsec クライアントに通知するために、以下の attribute を使用
します。
+ INTERNAL_IP4_NBNS(4)
+ INTERNAL_IP6_NBNS(11)
o これら以外の attribute は使用しません。
また、自身が IKE の始動側の場合、受けとった ISAKMP-CFG-SET メッセージにこれらの
attribute

(OpenSWAN の場合) KLIPS で利用するのか NETKEY なのか注意

詳しくは書かないが、特にルーティングの設定が異なってしまう

まとめ

それでは、どういう組み合わせなら安定して動作するのかというと、まだまだ調査中なので随時まとめていくつもりです。

詳しい方がいたら教えてください。