ネットワーク・ツー・ネットワーク接続や、ポイント・ツー・ポイント接続で Linux の IPsec を使用して VPN を構成する

この記事では、VPN を設計する場合の原則、VPN を導入するための基本事項、IPsec プロトコルの概念について詳細に説明し、また IPsec の機能の概要、IPsec の実装に必要なメカニズムについて説明します。この記事は世界の developerWorks 読者に提供するための記事として、developerWorks ロシアに投稿された記事から特別に選ばれて翻訳されたものです。

Aleksandr Derevyanko, Engineer IT department, Consultant

Aleksandr Derevyanko は 1990年から IT 分野で働いています。彼は「カテゴリー 1」の技術者から IT 部門長まで幅広い地位を経験しています。現在はロシア連邦クラスノダール地方 (Krasnodar Territory) の地方政府技術サポート部門でシニア・エキスパート・コンサルタントとして働いています。



2012年 6月 14日

はじめに

世界の多くの組織では、個々のオフィス同士を接続するために、利用可能なあらゆる物理接続手段を使用していますが、選択肢となり得るのは専用デジタル回線と VPN (Virtual Private Networks) です。VPN を使用すれば、これと等価なものを物理的に用意するよりもはるかに安価で済みます。VPN による方法は、概ね専用線による方法と同じですが、VPN は複数の LAN を結合して 1 つの LAN にすることができ、トラフィックを暗号化することで送信データを秘匿することができます。VPN 技術に暗号化を使用する場合、一般にはオープン・スタンダードが使用されます。そのためにはトラフィックを IP 上で送信し、トランスポート・レベルではデータグラムを使用します。

技術的な観点で見ると、VPN の実装にはソフトウェアとハードウェアの両方が使用されます。Linux の場合、IPsec (Internet Protocol security) セキュリティー・プロトコルの標準実装を使用した FreeS/Wan 技術がよく使用されています。これらのソリューションは、ソフトウェアとハードウェアの両方を使用して実装され、VPN 接続の両端に置かれるルーターのように動作します。クライアントがパケットを送信すると、この専用ルーターにパケットが送信され、ルーターはそのパケットに認証ヘッダー (AH) を追加します。このデータが暗号化され、復号およびデータの処理を行うための命令が追加されると、そのパケットは受信側の専用ルーターに送信されます。受信側のルーターはそのパケットを受信すると、復号してヘッダーを破棄し、元のパケットを対象のユーザーに送信します。

ネットワーク間で暗号化を使用する場合、LAN のホストは復号済みのパケットを受信し、通常の方法でパケットの処理を開始します。これはつまり、ネットワーク間で暗号化を使用する場合、暗号化と復号のプロセス全体がネットワークのエンド・ホストからは見えなくなる、ということです。

VPN では、認証と暗号化がいくつかのレベルで導入されるため、1 つのイントラネットの中に複数のリモート・ノードを組み合わせられるほどのセキュリティーと実効性を備えています。

VPN 標準の一般的な実装である IPsec には、さまざまな企業顧客が支店やリモート・ユーザーをネットワークに接続する上での要件を満たすだけの信頼性があります。


IPsec の概要

IPsec はインターネット上のノード間やネットワーク間をセキュアに接続するために一般的に使用されています。IPsec は (1 台のコンピューターが別の 1 台のコンピューターと接続されている) ノード・ツー・ノードの構成でも、(1 つの LAN/WAN が別の 1 つの LAN/WAN と接続されている) ネットワーク・ツー・ネットワークの構成でも動作します。IPsec は、互いに接続されるシステム間またはネットワーク間のセキュリティー・パラメーターの相互認証と比較を行うために IETF (Internet Engineering Task Force) が作成した、IKE (Internet Key Exchange) プロトコルを使用して実装されています。

IPsec の接続プロセスは 2 つの論理フェーズに分けられます。第 1 のフェーズでは、IPsec ノードがリモート・ノードまたはリモート・ネットワークとの接続を確立します。リモート・ノードまたはリモート・ネットワークは接続を要求するノードのクレデンシャルを検証し、接続に使用する認証方法について接続の両端で合意します。通常、IPsec ノードの認証には事前共有鍵を使用するアルゴリズムが使用されます。IPsec 接続に事前共有鍵を使用する場合、両端のノードが同じ鍵を使用する必要があります。このフェーズが完了すると、接続確立の第 2 フェーズに進むことができます。

ノード間に IPsec 接続を確立するための第 2 フェーズは SA (Security Association) を使用して実行されます。このフェーズで関係する構成データには、暗号化の方法、セッションの秘密鍵の交換方法、そして SA データベースにインポートされる、その他いくつかのパラメーターなどがあります。またこのフェーズでは、WAN に分散されているノード間やネットワーク間の IPsec 接続も扱います。

ここで、CentOS Linux ディストリビューションの例をベースに、IPsec の実装について考えてみましょう。ネットワーク上のすべてのマシン (ノード・ツー・ノード構成の場合) またはルーター (ネットワーク・ツー・ネットワーク構成の場合) を IPsec 対応にするためには、その IPsec 構成を扱うための関連パケットを用意する必要があります。これらのパケットには、IPsec 接続を確立するための基本的なライブラリー、デーモン、構成ファイルなどが含まれている必要があります。例えば CentOS Linux の場合、Linux カーネルと IPsec 実装との間で信頼鍵 (PF_KEY) を管理するためのインターフェースが含まれている /lib/libipsec.so ライブラリーが必要です。他にも以下のものが挙げられます。

  • /sbin/setkey はカーネル内での鍵管理と IPsec のセキュリティー属性を提供します。このプログラムは鍵を管理する racoon デーモンによってコンパイルされます。setkey についての詳細は man ページの setkey(8) を参照してください (「参考文献」を参照)。
  • /sbin/racoon は IKE 鍵を管理するデーモンであり、IPsec を実行するコンピューター間の鍵交換と SA を管理します。このデーモンのセットアップは /etc/racoon/racoon.conf ファイルを編集してから行うことができます。racoon についての詳細は man ページの racoon(8) を参照してください (「参考文献」を参照)。
  • /etc/racoon/racoon.conf は構成ファイルであり、認証方法や暗号化アルゴリズムなど、IPsec 接続のさまざまなパラメーターをこのファイルで設定します。このファイルについての詳細も、man ページの racoon.conf(5) に記述されているコマンドの最後を見ると理解できるはずです (「参考文献」を参照)。

ノード・ツー・ノード構成の IPsec を構築する

IPsec を使用すると、ノード・ツー・ノード接続で 1 台のワークステーションを別の 1 台のワークステーションに接続することができます。この種の接続では、両方のノードが接続されているネットワークを使用してセキュア・トンネルを作成することができます。これらのノードが IPsec 接続を確立する上で必要なのは、インターネットまたは常時動作している別のネットワークへの永続的な接続のみです。

ノード・ツー・ノード接続を作成するためには以下のデータが必要です。

  • 両ノードの IP アドレス
  • IPsec 接続を他の機器や接続と区別するための一意の名前 (例えば、ipsec0)
  • 暗号鍵: 永続的な場合と racoon を使用して自動作成される場合があります
  • 認証のための事前共有鍵: 接続の確立、接続セッション中の暗号鍵の交換に使用されます

では、2 つのホストが互いに接続を確立するシナリオを見てみましょう。2 つのホストは共有鍵 my_keyracoon デーモンを使用して自動的に認証鍵を作成、交換することで、接続を確立します。この接続の名前を ipsec0 とします。

ワークステーションは、リスト 1ifcfg ファイルを使用して相手のワークステーションと IPsec でノード・ツー・ノード接続を確立します。リスト 1/etc/sysconfig/network-scripts/ifcfg-ipsec0 ファイルのフォーマットを示します。

リスト 1. ifcfg-ipsec0 のフォーマット
DST=X.X.X.X’
TYPE=IPSEC
ONBOOT=yes
IKE_METHOD=PSK

第 1 のコンピューターでは、文字列 X.X.X.X を第 2 のコンピューターの IP アドレスで置き換える必要があり、第 2 のコンピューターでは、文字列 X.X.X.X を第 1 のコンピューターの IP アドレスで置き換える必要があります。この接続は起動時に確立され (ONBOOT=yes)、事前共有鍵による認証を使用します (IKE_METHOD=PSK)。

共有鍵を含むリスト 2 のファイル (/etc/sysconfig/network-scripts/keys-ipsec0) は、両方のコンピューターが相互に認証するために必要です。このファイルの内容 (IKE_PSK=my_key) は両方のコンピューターで同じでなければならず、このファイルの内容にアクセスできるのは root ユーザーのみでなければなりません。

以下のコマンドを実行して keys-ipsec0 ファイルへのアクセスを制限します。

リスト 2. 共有鍵を含むファイル
 chmod 600 /etc/sysconfig/network-scripts/keys-ipsec0.

任意の時点で認証鍵を変更するためには、両方のコンピューターで keys-ipsec0 ファイルを編集する必要があります。接続を確立するためには両方の鍵が同じでなければなりません。

リスト 3 を見ながら、リモート・ノードとの接続の第 1 フェーズに対する構成プロセスを検証しましょう。このファイルは X.X.X.X.conf と呼ばれます (X.X.X.X はリモート IPsec ルーターの IP アドレスで置き換えられます)。このファイルは IPsec トンネルを有効にする際に自動的に生成され、手作業での編集は行われないことを忘れないでください。

リスト 3. X.X.X.X.conf ファイルのフォーマット
;
remote X.X.X.X
{
        exchange_mode aggressive, main;
        my_identifier address;
        proposal {
                encryption_algorithm 3des;
                hash_algorithm sha1;
                authentication_method pre_shared_key;
                dh_group 2 ;
        }
}
  • この構成ファイルの remote X.X.X.X コマンドは、このコマンドの後にある文字列が、アドレス X.X.X.X に割り当てられるリモート・ノードにのみ適用されることを示します。
  • CentOS Linux でのデフォルトの IPsec 構成で exchange_mode aggressive を指定すると、複数のノードとの異なる IPsec 接続を許可する認証方法が使用されるようになります。
  • my_identifier address はノードの認証に使用する識別方法を定義しており、CentOS Linux では IP アドレスでノードを特定します。
  • encryption_algorithm 3des は認証に使用する暗号化アルゴリズムを定義します。デフォルトの暗号化アルゴリズムは 3DES (Triple Data Encryption Standard) です。
  • hash_algorithm sha1 は接続の第 1 フェーズに使用するハッシュ計算アルゴリズムを示しています。
  • authentication_method pre_shared_key はノードの同期に使用する認証方法を定義します。
  • dh_group 2 は動的に生成されるセッション鍵を選択するための Diffie-Hellman グループの数を示しています。デフォルトで 1024 ビット・グループが使用されます。

/etc/racoon/racoon.conf も、すべての IPsec ノードで同じでなければなりません。これは演算子 include "/etc/racoon/X.X.X.X.conf" とは別です (X.X.X.X. はそれぞれ異なる IP アドレスです)。この演算とファイルは共に、IPsec トンネルが有効になると生成されます。IPsec 接続が確立された時に生成される典型的な racoon.confリスト 4 に示します。

リスト 4. racoon.conf ファイルのフォーマット
# Racoon IKE daemon configuration file.

# See 'man racoon.conf' for a description of the format and entries.

path include "/etc/racoon";
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";

sainfo anonymous
{
	pfs_group 2;
	lifetime time 1 hour ;
	encryption_algorithm 3des, blowfish 448, rijndael ;
	authentication_algorithm hmac_sha1, hmac_md5 ;
	compression_algorithm deflate ;
}
include "/etc/racoon/X.X.X.X.conf"

この記事では構成ファイルのすべてのパラメーターについては説明しませんので、適切なマニュアルを参照してください。

接続を確立するためには、コンピューターを再起動するか、あるいは各ノードで root として /sbin/ifup ipsec0 コマンドを実行します。

tcpdump ユーティリティーを起動して IPsec 接続を確認します。その際、パケットには AH データと ESP データが含まれている必要があります。ESP は暗号化が機能していることを意味します。リスト 5 は tcpdump の一例です。

リスト 5. tcpdump の例
17:13:20.617872 pinky.example.com > ijin.example.com: \
AH(spi=0x0aaa749f,seq=0x335): ESP(spi=0x0ec0441e,seq=0x335) (DF)

ネットワーク・ツー・ネットワーク構成の IPsec を構築する

IPsec を使用すると、インターネットワークを構成することによってネットワーク全体を他のネットワーク・セグメントに接続することができます。そのためには各ネットワークに IPsec ルーターをインストールする必要があります。そうすることで、1 つのネットワークのノードから送信されたトラフィックが透過的に処理され、他のネットワークのノードに到達します。セキュアなトンネルによってネットワーク同士を認証して結合することができる IPsec ルーターは、これらのネットワーク内で動作して、インターネットやその他のネットワークをトラフィックが通過できるようにする必要があります。送信中のパケットをインターセプトする場合、検索手法を使用して、それらのパケットを保護するコードを解読する必要があります。しかしこのプロセスは非常に時間がかかる上に、解読を終えてもそのパケットの内容が望んでいたものとは関係ない可能性すらあります。

インターネットワーク接続を確立するためには以下の情報が必要です。

  • 専用 IPsec ルーターのパブリック IP アドレス
  • ネットワーク・ノードのトラフィックをインターネットにルーティングするゲートウェイのインターフェースの IP アドレス
  • IPsec 接続の一意の名前 (ipsec0 など)
  • racoon を使用して作成された暗号鍵
  • 認証のための事前共有鍵

ここでは、my_net1.com というネットワークと my_net2.com というネットワークの間の IPsec トンネルの例について説明します。第 1 のネットワークのアドレスは 192.168.1.0/24 であり、第 2 のネットワークのアドレスは 192.168.2.0/24 です。第 1 のネットワークのゲートウェイの IP アドレスは 192.168.1.254 であり、第 2 のネットワークのゲートウェイの IP アドレスは 192.168.2.254 です。ルーターはゲートウェイとは別に実装されており、2 つのネットワーク・インターフェースを使用します。eth0 にはインターネット専用の静的なパブリック IP アドレスがあり、eth1 は LAN のパケットを受信して処理します。

このネットワーク間の IPsec 接続では事前共有鍵 r3dh4tl1nux を使用します。第 1 のネットワークで IPsec インターネットワーク接続のために作成された ifcfg ファイルの内容をリスト 6 に示します。この例では接続の一意の名前が ipsec1 です。リスト 6 は /etc/sysconfig/network-scripts/ifcfg-ipsec1 の例です。

リスト 6. ifcfg-ipsec1 の例
TYPE=IPSEC
ONBOOT=yes
IKE_METHOD=PSK
SRCGW=192.168.1.254
DSTGW=192.168.2.254
SRCNET=192.168.1.0/24
DSTNET=192.168.2.0/24
DST=X.X.X.X

この接続は起動時に確立され (ONBOOT=yes)、事前共有鍵による認証を使用します (IKE_METHOD=PSK)。

事前共有鍵を含むファイルの内容をリスト 7 に示します (このファイルは /etc/sysconfig/network-scripts/keys-ipsecX という名前のファイルであり、第 1 のネットワークでは「X」が「0」に、第 2 のネットワークでは「1」に置き換わります)。

認証鍵はいつでも変更することができます。認証鍵を変更するためには IPsec ルーターで keys-ipsecX ファイルを編集する必要があります。鍵は同じでなければなりません。/etc/racoon/racoon.conf の例をリスト 7 に示します。

リスト 7. racoon.conf ファイルの例
# Racoon IKE daemon configuration file.
# See 'man racoon.conf' for a description of the format and entries.

path include "/etc/racoon";
path pre_shared_key "/etc/racoon/psk.txt";
path certificate "/etc/racoon/certs";

sainfo anonymous
{
	pfs_group 2;
	lifetime time 1 hour ;
	encryption_algorithm 3des, blowfish 448, rijndael ;
	authentication_algorithm hmac_sha1, hmac_md5 ;
	compression_algorithm deflate ;
}
include "/etc/racoon/X.X.X.X.conf"

リスト 8 はリモート・ネットワークと接続する場合の具体的な構成例を示しています。このファイルの名前は X.X.X.X.conf です (X.X.X.X はリモートの IPsec ルーターの IP アドレスです)。

リスト 8. X.X.X.X.conf ファイルの例
;
remote X.X.X.X
{
        exchange_mode aggressive, main;
        my_identifier address;
        proposal {
                encryption_algorithm 3des;
                hash_algorithm sha1;
                authentication_method pre_shared_key;
                dh_group 2 ;
        }
}

IPsec 接続を開始する前に、/etc/sysctl.conf ファイルを編集して net.ipv4.ip_forward を 1 に設定し、カーネルで IP ルーティングを有効にします。

この変更が確実に実装されるようにするには、sysctl -p /etc/sysctl.conf コマンドを実行します。

接続を確立するためには、ルーターを再起動するか、あるいはルーターで root として /sbin/ifup ipsec0 コマンドを実行します。

IPsec 接続が確立されると、ルーターは ifup コマンドによって有効化される初期化シナリオを自動的に生成します

/sbin/ip route list コマンドを実行し、ネットワーク・ルーターの一覧を確認します。

tcpdump ユーティリティーを実行して IPsec 接続を確認します (例えば tcpdump -n -i eth0 host my_net1.com などを実行します)。

パケットには AH データと ESP データが含まれている必要があります。この場合には ESP があることで、暗号化が動作していることがわかります。確立された接続で交換される暗号化パケットを確認した結果をリスト 9 に示します。

リスト 9. 暗号化を使用したパケットの例
12:24:26.155529 my_net2.com > my_net1.com: AH(spi=0x021c9834,seq=0x358): \
my_net2.com > my_net1.com: ESP(spi=0x00c887ad,seq=0x358) (DF) \
(ipip-proto-4)

まとめ

この記事では、VPN を設計する場合の原則、VPN を導入するための基本事項、IPsec プロトコルの概念について詳細に説明し、また IPsec の機能の概要、IPsec の実装に必要なメカニズムについて説明しました。

また、IPsec プロトコルを使用して保護された接続を設計するための方法について検証しました。これらの実装について、ノード・ツー・ノード、ネットワーク・ツー・ネットワークという 2 つの接続方式と関連付けながら、実際の例を含めて詳細に説明しました。

参考文献

学ぶために

製品や技術を入手するために

  • CentOS Linux について、このディストリビューションのホームページで学んでください。
  • 皆さんの目的に最適な方法で IBM 製品を評価してください: 製品の試用版をダウンロードする方法、オンラインで製品を試す方法、クラウド環境で製品を使う方法、あるいは SOA Sandbox で数時間を費やし、サービス指向アーキテクチャーの効率的な実装方法を学ぶ方法などがあります。

議論するために

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Linux, Open source
ArticleID=820369
ArticleTitle=ネットワーク・ツー・ネットワーク接続や、ポイント・ツー・ポイント接続で Linux の IPsec を使用して VPN を構成する
publish-date=06142012