跳转到内容
搜索文档

strongSwan

最后更新 查看 MarkdownAgent 设置

本教程向您介绍如何将 strongSwan 与 Cloudflare WAN(前称 Magic WAN)结合使用。您将学习如何配置 strongSwan、配置 IPsec 隧道以及创建策略路由 (PBR)。

1. 配置健康检查

为 Cloudflare WAN 配置双向健康检查目标。在本教程中,使用 172.64.240.252 作为目标 IP 地址,并将 type 设置为 request。

这可以通过 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. 创建一个虚拟隧道接口 (VTI),并将 IP 配置为 Cloudflare 健康检查的目标 (172.64.240.252),以路由 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. 添加策略路由

创建策略路由 (PBR) 以通过 IPsec 隧道重定向回程流量。如果不进行配置,针对 Cloudflare 发送的健康探测的 ICMP 答复将通过互联网返回,而不是通过相同的 IPsec 隧道。

本教程使用 iproute2 将 IP 数据包从 172.64.240.252 路由到隧道接口。

  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 连接执行 stoprestart 和显示 status
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. 检查连接状态

使用 tcpdump 调查源自 Cloudflare 的健康检查状态。

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,您可以检查解密后的数据包

这篇文档对您有帮助吗?