Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

strongSwan

最終更新 Markdown で表示Agent セットアップ

このチュートリアルでは、strongSwan と Cloudflare WAN(旧 Magic WAN)を設定します。strongSwan の設定、IPsec トンネルの設定、Policy-Based Routing (PBR) の作成までを説明します。

1. ヘルスチェックを設定する

Cloudflare WAN 向けに、双方向ヘルスチェック のターゲットを設定します。このチュートリアルでは、ターゲット IP アドレスに 172.64.240.252、リクエストに type を使います。

これは API で設定できます。例:

curl --request PUT \
https://api.cloudflare.com/client/v4/accounts/{account_id}/magic/ipsec_tunnels/{tunnel_id} \
--header "X-Auth-Email: <EMAIL>" \
--header "X-Auth-Key: <API_KEY>" \
--header "Content-Type: application/json" \
--data '{
  "health_check": {
    "enabled": true,
    "target": "172.64.240.252",
    "type": "request",
    "rate": "mid"
  }
}'

2. strongSwan を設定する

  1. strongSwan をインストール します。例として、コンソールを開き、次を実行します。
sudo apt-get install strongswan -y
  1. /etc/strongswan.conf を開き、次の設定を追加します。
charon {
    load_modular = yes
    install_routes = no
    install_virtual_ip = no

    plugins {
        include strongswan.d/charon/*.conf
    }
}

include strongswan.d/*.conf

3. IPsec ファイルを設定する

  1. /etc/ipsec.conf を開き、次の設定を追加します。
# ipsec.conf - strongSwan IPsec configuration file
config setup
    charondebug="all"
    uniqueids = yes

conn %default
    ikelifetime=24h
    rekey=yes
    reauth=no
    keyexchange=ikev2
    authby=secret
    dpdaction=restart
    closeaction=restart

# Sample VPN connections
conn cloudflare-ipsec
    auto=start
    type=tunnel
    fragmentation=no
    leftauth=psk
    # Private IP of the VM
    left=%any
    # Tunnel ID from dashboard, in this example FQDN is used
    leftid=<YOUR_TUNNEL_ID>.<YOUR_ACCOUNT_ID>.ipsec.cloudflare.com
    leftsubnet=0.0.0.0/0
    # Cloudflare Anycast IP
    right=<YOUR_CLOUDFLARE_ANYCAST_IP>
    rightid=<YOUR_CLOUDFLARE_ANYCAST_IP>
    rightsubnet=0.0.0.0/0
    rightauth=psk
    ike=aes256-sha256-ecp384!
    esp=aes256-sha256-ecp384!
    replay_window=0
    mark_in=42
    mark_out=42
    leftupdown=/etc/strongswan.d/ipsec-vti.sh
  1. Cloudflare のヘルスチェックのターゲット(172.64.240.252)として設定した IP で仮想トンネルインターフェイス (VTI) を作成し、IPsec パケットをルーティングします。/etc/strongswan.d/ を開きます。

  2. ipsec-vti.sh というスクリプトを作成し、次を追加します。

#!/bin/bash

set -o nounset
set -o errexit

VTI_IF="vti0"

case "${PLUTO_VERB}" in
    up-client)
        ip tunnel add "${VTI_IF}" local "${PLUTO_ME}" remote "${PLUTO_PEER}" mode vti \
        key "${PLUTO_MARK_OUT%%/*}"
        ip link set "${VTI_IF}" up
        ip addr add 172.64.240.252/32 dev vti0
        sysctl -w "net.ipv4.conf.${VTI_IF}.disable_policy=1"
        sysctl -w "net.ipv4.conf.${VTI_IF}.rp_filter=0"
        sysctl -w "net.ipv4.conf.all.rp_filter=0"
        ip rule add from 172.64.240.252 lookup viatunicmp
        ip route add default dev vti0 table viatunicmp
        ;;
    down-client)
        ip tunnel del "${VTI_IF}"
        ip rule del from 172.64.240.252 lookup viatunicmp
        ip route del default dev vti0 table viatunicmp
        ;;
esac
echo "executed"

4. ポリシーベースルーティングを追加する

戻りトラフィックを IPsec トンネル経由で戻すために、Policy-Based Routing (PBR) を作成します。これがないと、Cloudflare が送ったヘルスプローブへの ICMP 応答が、同じ IPsec トンネルではなくインターネット経由で返されます。

このチュートリアルでは、iproute2 を使い、172.64.240.252 からの IP パケットをトンネルインターフェイスへルーティングします。

  1. /etc/iproute2/ を開きます。

  2. rt_tables ファイルを編集し、ルーティングテーブルの番号と名前を追加します。この例では、名前に viatunicmp、番号に 200 を使います。

#
# reserved values
#
255 local
254 main
253 default
0   unspec
200 viatunicmp
#
# local
#
#1  inr.ruhep
  1. ルーティングテーブルに一致するルールを追加します。このルールは、パケットの送信元アドレスが 172.64.240.252 のとき、ルーティングテーブル viatunicmp を使うよう指示します。
ip rule add from 172.64.240.252 lookup viatunicmp
  1. viatunicmp ルーティングテーブルにルートを追加します。これは、viatunicmp テーブル内のインターフェイス vti0 経由のデフォルトルートです。
ip route add default dev vti0 table viatunicmp
  1. IPsec を開始します。IPsec 接続の stoprestartstatus の表示もできます。
ipsec start
Security Associations (1 up, 0 connecting):
cloudflare-ipsec[1]: ESTABLISHED 96 minutes ago, <IPSEC_TUNNEL_IDENTIFIER>.ipsec.cloudflare.com]...162.159.67.88[162.159.67.88]
cloudflare-ipsec{4}:  INSTALLED, TUNNEL, reqid 1, ESP SPIs: c4e20a95_i c5373d00_o
cloudflare-ipsec{4}:   0.0.0.0/0 === 0.0.0.0/0

5. 接続状態を確認する

Cloudflare から送られるヘルスチェックの状態は、tcpdump で調べます。

sudo tcpdump -i <OUTGOING_INTERFACE> esp and host <TUNNEL_CLOUDFLARE_ENDPOINT_IP>

この例では、送信インターネットインターフェイス上で、Cloudflare のヘルスチェックプローブ(リクエストと応答の両方)からの IPsec 暗号化パケット (ESP) が、IPsec トンネルを通過していることが分かります。

tcpdump に、Cloudflare のヘルスプローブからの IPsec 暗号化パケットが表示されます

復号済みパケットを確認するには、vti0 で tcpdump を実行します。

sudo tcpdump -i vti0 host 172.64.240.252
vti0 で tcpdump を実行すると、復号済みパケットを確認できます

役に立ちましたか?