
strongswan v6.1.0
strongSwan - IPsecベースのVPN
strongSwan 設定
概要
strongSwan は、オープンソースの IPsec ベースの VPN ソリューションです。
このドキュメントは、モダンな vici Versatile IKE Configuration Interface を使用する strongSwan swanctl コマンドの簡単な紹介です。レガシーな stroke 設定インターフェースを使用する非推奨の ipsec コマンドについては こちら で説明しています。より詳細な情報については、man ページ、新しい ドキュメントサイト、およびレガシーな wiki を参照してください。
クイックスタート
ユーザー、ホスト、ゲートウェイ用の証明書は、架空の strongSwan CA によって発行されます。この例のシナリオでは、ピアを認証できるように、CA 証明書 strongswanCert.pem がすべての VPN エンドポイントに存在している必要があります。特定の VPN アプリケーションでは、サードパーティの CA の証明書を使用するか、strongSwan pki ツールを使用して必要な秘密鍵と証明書を自分で生成することができます。この pki ツールの使用方法については、後述のセクションのいずれかで説明します。
サイト間接続のケース
このシナリオでは、2 つのセキュリティゲートウェイ moon と sun が、2 つのゲートウェイ間に設定された VPN トンネルを介して、2 つのサブネット moon-net と sun-net を相互に接続します。
10.1.0.0/16 -- | 192.168.0.1 | === | 192.168.0.2 | -- 10.2.0.0/16
moon-net moon sun sun-net
ゲートウェイ moon の設定:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/moonCert.pem
/etc/swanctl/private/moonKey.pem
/etc/swanctl/swanctl.conf:
connections {
net-net {
remote_addrs = 192.168.0.2
local {
auth = pubkey
certs = moonCert.pem
}
remote {
auth = pubkey
id = "C=CH, O=strongSwan, CN=sun.strongswan.org"
}
children {
net-net {
local_ts = 10.1.0.0/16
remote_ts = 10.2.0.0/16
start_action = trap
}
}
}
}
ゲートウェイ sun の設定:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/sunCert.pem
/etc/swanctl/private/sunKey.pem
/etc/swanctl/swanctl.conf:
connections {
net-net {
remote_addrs = 192.168.0.1
local {
auth = pubkey
certs = sunCert.pem
}
remote {
auth = pubkey
id = "C=CH, O=strongSwan, CN=moon.strongswan.org"
}
children {
net-net {
local_ts = 10.2.0.0/16
remote_ts = 10.1.0.0/16
start_action = trap
}
}
}
}
このシナリオで使用されるローカルおよびリモートの ID は、エンドエンティティ証明書に含まれる subjectDistinguishedNames です。証明書と秘密鍵は、次のコマンドで charon デーモンに読み込まれます
swanctl --load-creds
一方、
swanctl --load-conns
は、swanctl.conf で定義された接続を読み込みます。start_action = trap を設定すると、トンネルを通過しようとする最初の平文ペイロード IP パケットによって IPsec 接続が自動的にセットアップされます。
ホスト間接続のケース
これは、背後にサブネットを持たない 2 つの単一ホスト間のセットアップです。ホスト間接続には IPsec トランスポートモードで十分ですが、ここではデフォルトの IPsec トンネルモードを使用します。
| 192.168.0.1 | === | 192.168.0.2 |
moon sun
ホスト moon の設定:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/moonCert.pem
/etc/swanctl/private/moonKey.pem
/etc/swanctl/swanctl.conf:
connections {
host-host {
remote_addrs = 192.168.0.2
local {
auth=pubkey
certs = moonCert.pem
}
remote {
auth = pubkey
id = "C=CH, O=strongSwan, CN=sun.strongswan.org"
}
children {
net-net {
start_action = trap
}
}
}
}
ホスト sun の設定:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/sunCert.pem
/etc/swanctl/private/sunKey.pem
/etc/swanctl/swanctl.conf:
connections {
host-host {
remote_addrs = 192.168.0.1
local {
auth = pubkey
certs = sunCert.pem
}
remote {
auth = pubkey
id = "C=CH, O=strongSwan, CN=moon.strongswan.org"
}
children {
host-host {
start_action = trap
}
}
}
}
ロードウォリアーのケース
これは、strongSwan ゲートウェイが、通常は動的 IP アドレスを持つ任意の数のリモート VPN クライアントにサービスを提供する、非常に一般的なケースです。
10.1.0.0/16 -- | 192.168.0.1 | === | x.x.x.x |
moon-net moon carol
ゲートウェイ moon の設定:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/moonCert.pem
/etc/swanctl/private/moonKey.pem
/etc/swanctl/swanctl.conf:
connections {
rw {
local {
auth = pubkey
certs = moonCert.pem
id = moon.strongswan.org
}
remote {
auth = pubkey
}
children {
net-net {
local_ts = 10.1.0.0/16
}
}
}
}
ロードウォリアー carol の設定:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/carolCert.pem
/etc/swanctl/private/carolKey.pem
/etc/swanctl/swanctl.conf:
connections {
home {
remote_addrs = moon.strongswan.org
local {
auth = pubkey
certs = carolCert.pem
id = [email protected]
}
remote {
auth = pubkey
id = moon.strongswan.org
}
children {
home {
local_ts = 10.1.0.0/16
start_action = start
}
}
}
}
remote_addrs にはホスト名 moon.strongswan.org が選択されており、実行時に DNS によって対応する IP 宛先アドレスに解決されます。このシナリオでは、ロードウォリアー carol の ID はメールアドレス [email protected] であり、ロードウォリアー証明書 carolCert.pem に subjectAlternativeName として含まれている必要があります。
仮想 IP を使用したロードウォリアーのケース
ロードウォリアーは通常、現在接続している ISP によって割り当てられた動的 IP アドレスを持っています。moon-net からリモートアクセスクライアント carol へのルーティングを簡素化するには、ロードウォリアーが事前定義されたプールから選択された内部 IP アドレスを持っていることが望ましいです。
10.1.0.0/16 -- | 192.168.0.1 | === | x.x.x.x | -- 10.3.0.1
moon-net moon carol virtual IP
この例では、仮想 IP アドレスはアドレスプール 10.3.0.0/16 から選択されます。これは、次のセクションを追加することで設定できます
pools {
rw_pool {
addrs = 10.3.0.0/16
}
}
このセクションをゲートウェイの swanctl.conf に追加すると、そこから次のコマンドで charon デーモンに読み込まれます
swanctl --load-pools
このプールから IP アドレスを要求するために、ロードウォリアーは IKEv1 モードコンフィグまたは IKEv2 設定ペイロードを使用できます。両方の設定は同じで、次のようになります
vips = 0.0.0.0
ゲートウェイ moon の設定:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/moonCert.pem
/etc/swanctl/private/moonKey.pem
/etc/swanctl/swanctl.conf:
connections {
rw {
pools = rw_pool
local {
auth = pubkey
certs = moonCert.pem
id = moon.strongswan.org
}
remote {
auth = pubkey
}
children {
net-net {
local_ts = 10.1.0.0/16
}
}
}
}
pools {
rw_pool {
addrs = 10.30.0.0/16
}
}
ロードウォリアー carol の設定:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/carolCert.pem
/etc/swanctl/private/carolKey.pem
/etc/swanctl/swanctl.conf:
connections {
home {
remote_addrs = moon.strongswan.org
vips = 0.0.0.0
local {
auth = pubkey
certs = carolCert.pem
id = [email protected]
}
remote {
auth = pubkey
id = moon.strongswan.org
}
children {
home {
local_ts = 10.1.0.0/16
start_action = start
}
}
}
}
EAP 認証を使用したロードウォリアーのケース
これは、strongSwan ゲートウェイが、例えば EAP-MD5 や EAP-MSCHAPv2 などのパスワードベースの*拡張認証プロトコル (Extended Authentication Protocol)*を介して自身を認証する任意の数のリモート VPN クライアントにサービスを提供する、非常に一般的なケースです。
10.1.0.0/16 -- | 192.168.0.1 | === | x.x.x.x |
moon-net moon carol
ゲートウェイ moon の設定:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/moonCert.pem
/etc/swanctl/private/moonKey.pem
/etc/swanctl/swanctl.conf:
connections {
rw {
local {
auth = pubkey
certs = moonCert.pem
id = moon.strongswan.org
}
remote {
auth = eap-md5
}
children {
net-net {
local_ts = 10.1.0.0/16
}
}
send_certreq = no
}
}
swanctl.conf ファイルには、すべてのクライアント資格情報を定義する secrets セクションも含まれています
secrets {
eap-carol {
id = [email protected]
secret = Ar3etTnp
}
eap-dave {
id = [email protected]
secret = W7R0g3do
}
}
ロードウォリアー carol の設定:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/swanctl.conf:
connections {
home {
remote_addrs = moon.strongswan.org
local {
auth = eap
id = [email protected]
}
remote {
auth = pubkey
id = moon.strongswan.org
}
children {
home {
local_ts = 10.1.0.0/16
start_action = start
}
}
}
}
secrets {
eap-carol {
id = [email protected]
secret = Ar3etTnp
}
}
EAP ID を使用したロードウォリアーのケース
多くの場合、クライアントの EAP ID は、外部の IKEv2 ID とは異なる EAP を介して交換されます。この例では、IKEv2 ID はデフォルトでクライアントの IPv4 アドレスになります。
10.1.0.0/16 -- | 192.168.0.1 | === | x.x.x.x |
moon-net moon carol
ゲートウェイ moon の設定:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/x509/moonCert.pem
/etc/swanctl/private/moonKey.pem
/etc/swanctl/swanctl.conf:
connections {
rw {
local {
auth = pubkey
certs = moonCert.pem
id = moon.strongswan.org
}
remote {
auth = eap-md5
eap_id = %any
}
children {
net-net {
local_ts = 10.1.0.0/16
}
}
send_certreq = no
}
}
secrets {
eap-carol {
id = carol
secret = Ar3etTnp
}
eap-dave {
id = dave
secret = W7R0g3do
}
}
ロードウォリアー carol の設定:
/etc/swanctl/x509ca/strongswanCert.pem
/etc/swanctl/swanctl.conf:
connections {
home {
remote_addrs = moon.strongswan.org
local {
auth = eap
eap_id = carol
}
remote {
auth = pubkey
id = moon.strongswan.org
}
children {
home {
local_ts = 10.1.0.0/16
start_action = start
}
}
}
}
secrets {
eap-carol {
id = carol
secret = Ar3etTnp
}
}
証明書と CRL の生成
このセクションは、strongSwan pki ツールの使用方法に関する本格的なチュートリアルではありません。ここでは、strongSwan で使用する独自の証明書と CRL を生成する場合に関連するいくつかのポイントのみをリストアップしています。
CA 証明書の生成
pki コマンド
pki --gen --type ed25519 --outform pem > strongswanKey.pem
は、暗号強度 128 ビットの楕円エドワーズ曲線 (Edwards-Curve) 鍵を生成します。対応する公開鍵は、有効期間 10 年 (3652 日) の自己署名 CA 証明書にパックされます
pki --self --ca --lifetime 3652 --in strongswanKey.pem \
--dn "C=CH, O=strongSwan, CN=strongSwan Root CA" \
--outform pem > strongswanCert.pem
これは次のコマンドで一覧表示できます
pki --print --in strongswanCert.pem
subject: "C=CH, O=strongSwan, CN=strongSwan Root CA"
issuer: "C=CH, O=strongSwan, CN=strongSwan Root CA"
validity: not before May 18 08:32:06 2017, ok
not after May 18 08:32:06 2027, ok (expires in 3651 days)
serial: 57:e0:6b:3a:9a:eb:c6:e0
flags: CA CRLSign self-signed
subjkeyId: 2b:95:14:5b:c3:22:87:de:d1:42:91:88:63:b3:d5:c1:92:7a:0f:5d
pubkey: ED25519 256 bits
keyid: a7:e1:6a:3f:e7:6f:08:9d:89:ec:23:92:a9:a1:14:3c:78:a8:7a:f7
subjkey: 2b:95:14:5b:c3:22:87:de:d1:42:91:88:63:b3:d5:c1:92:7a:0f:5d
CA の秘密鍵と X.509 証明書をバイナリ DER 形式にしたい場合は、--outform pem オプションを省略するだけです。ディレクトリ /etc/swanctl/x509ca には、必要なすべての CA 証明書がバイナリ DER または Base64 PEM 形式で含まれています。ファイルの拡張子に関係なく、正しい形式は strongSwan によって自動的に判別されます。
ホストまたはユーザーのエンドエンティティ証明書の生成
ここでも、次のコマンドを使用します
pki --gen --type ed25519 --outform pem > moonKey.pem
このコマンドにより、ホスト moon 用の Ed25519 秘密鍵が生成されます。あるいは、次のように入力することもできます
pki --gen --type rsa --size 3072 > moonKey.der
このコマンドで従来の 3072 ビット RSA 鍵を生成し、バイナリ DER 形式で保存します。別の方法として、最近の Intel プラットフォームすべてで利用可能な TPM 2.0 Trusted Platform Module を仮想スマートカードとして使用して、RSA または ECDSA 秘密鍵を安全に保存することもできます。詳細については、TPM 2.0 HOWTO を参照してください。
次のステップでは、コマンド
pki --req --type priv --in moonKey.pem \
--dn "C=CH, O=strongswan, CN=moon.strongswan.org" \
--san moon.strongswan.org --outform pem > moonReq.pem
は、CA によって署名される必要がある PKCS#10 証明書要求を作成します。--san パラメータを[複数回]使用することで、任意の数の subjectAlternativeNames を要求に追加できます。これらは次の形式になります
--san sun.strongswan.org # fully qualified host name
--san [email protected] # RFC822 user email address
--san 192.168.0.1 # IPv4 address
--san fec0::1 # IPv6 address
証明書要求に基づいて、CA は次のコマンドで署名付きエンドエンティティ証明書を発行します
pki --issue --cacert strongswanCert.pem --cakey strongswanKey.pem \
--type pkcs10 --in moonReq.pem --serial 01 --lifetime 1826 \
--outform pem > moonCert.pem
16 進数の引数を指定した --serial パラメータを省略すると、ランダムなシリアル番号が生成されます。一部のサードパーティ VPN クライアントでは、VPN ゲートウェイ証明書に TLS Server Authentication 拡張キー使用法 (EKU) フラグが含まれている必要があります。このフラグは次のオプションで含めることができます
--flag serverAuth
後述のセクションで説明する動的 CRL 取得機能を使用する場合は、--crl パラメータを使用して 1 つまたは複数の crlDistributionPoints をエンドエンティティ証明書に含めることができます
--crl http://crl.strongswan.org/strongswan.crl
--crl "ldap://ldap.strongswan.org/cn=strongSwan Root CA, o=strongSwan,c=CH?certificateRevocationList"
発行されたホスト証明書は次のコマンドで一覧表示できます
pki --print --in moonCert.pem
subject: "C=CH, O=strongSwan, CN=moon.strongswan.org"
issuer: "C=CH, O=strongSwan, CN=strongSwan Root CA"
validity: not before May 19 10:28:19 2017, ok
not after May 19 10:28:19 2022, ok (expires in 1825 days)
serial: 01
altNames: moon.strongswan.org
flags: serverAuth
CRL URIs: http://crl.strongswan.org/strongswan.crl
authkeyId: 2b:95:14:5b:c3:22:87:de:d1:42:91:88:63:b3:d5:c1:92:7a:0f:5d
subjkeyId: 60:9d:de:30:a6:ca:b9:8e:87:bb:33:23:61:19:18:b8:c4:7e:23:8f
pubkey: ED25519 256 bits
keyid: 39:1b:b3:c2:34:72:1a:01:08:40:ce:97:75:b8:be:ce:24:30:26:29
subjkey: 60:9d:de:30:a6:ca:b9:8e:87:bb:33:23:61:19:18:b8:c4:7e:23:8f
通常、Windows、OSX、Android、または iOS ベースの VPN クライアントには、秘密鍵、ホストまたはユーザー証明書、および CA 証明書が必要です。この情報を読み込む最も便利な方法は、すべてを PKCS#12 コンテナに入れることです:
openssl pkcs12 -export -inkey carolKey.pem \
-in carolCert.pem -name "carol" \
-certfile strongswanCert.pem -caname "strongSwan Root CA" \
-out carolCert.p12
strongSwan pki ツールは現在 PKCS#12 コンテナを作成できないため、openssl を使用する必要があります。
CRL の生成
CA によって署名された空の CRL は、次のコマンドで生成できます
pki --signcrl --cacert strongswanCert.pem --cakey strongswanKey.pem \
--lifetime 30 > strongswan.crl
--lifetime オプションを省略すると、デフォルト値の 15 日が使用されます。CRL は、HTTP または LDAP サーバーにアップロードするか、バイナリ DER または Base64 PEM 形式で /etc/swanctl/x509crl ディレクトリに配置することができ、そこから次のコマンドで charon デーモンに読み込まれます
swanctl --load-creds### 証明書の失効 ###
特定のエンドエンティティ証明書を失効させるには、次のコマンドを使用します。
pki --signcrl --cacert strongswanCert.pem --cakey strongswanKey.pem \
--lifetime 30 --lastcrl strongswan.crl \
--reason key-compromise --cert moonCert.pem > new.crl
証明書ファイル(この例では moonCert.pem)の代わりに、失効させる証明書のシリアル番号を --serial パラメータで指定することもできます。pki --signcrl --help コマンドには、指定可能なすべての失効理由が記載されていますが、--reason パラメータは省略することもできます。新しい CRL ファイルの内容は、次のコマンドで一覧表示できます。
pki --print --type crl --in new.crl
issuer: "C=CH, O=strongSwan, CN=strongSwan Root CA"
update: this on May 19 11:13:01 2017, ok
next on Jun 18 11:13:01 2017, ok (expires in 29 days)
serial: 02
authKeyId: 2b:95:14:5b:c3:22:87:de:d1:42:91:88:63:b3:d5:c1:92:7a:0f:5d
1 revoked certificate:
01: May 19 11:13:01 2017, key compromise
CRL のローカルキャッシュ
strongswan.conf のオプション
charon {
cache_crls = yes
}
は、HTTP または LDAP サーバーから動的に取得した CRL のローカルキャッシュを有効にします。キャッシュされたコピーは、発行者の subjectKeyIdentifier と接尾辞 .crl から構成される一意のファイル名を使用して、/etc/swanctl/x509crl に保存されます。
キャッシュされたコピーがあれば、起動直後から CRL を利用できます。ローカルコピーが古くなった場合は、次の IKEv2 認証中に、定義された CRL 配布ポイントのいずれかから更新された CRL が自動的に取得されます。