From be60f3e617407bb89b5692d3e679da65ce995d0c Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Wed, 2 Apr 2025 15:19:12 +0800 Subject: [PATCH 1/5] feat(script): add vpn-overlay config --- config/sites.yaml | 61 +++++++++ vpn-overlay/README.md | 158 ++++++++++++++++++++++++ vpn-overlay/config/sites.yaml | 0 vpn-overlay/gretap/setup_hub_gretap.sh | 12 ++ vpn-overlay/gretap/setup_site_gretap.sh | 21 ++++ vpn-overlay/templates/generate_all.sh | 0 vpn-overlay/topology/l2_topology.mmd | 19 +++ vpn-overlay/topology/l2_topology.vsdx | 0 vpn-overlay/vxlan/setup_hub_vxlan.sh | 28 +++++ vpn-overlay/wireguard/hub1_wg0.conf | 19 +++ vpn-overlay/wireguard/site_a_wg0.conf | 10 ++ vpn-overlay/xray/GRPC-XTLS-client.json | 15 +++ vpn-overlay/xray/TCP-XTLS-client.json | 15 +++ 13 files changed, 358 insertions(+) create mode 100644 config/sites.yaml create mode 100644 vpn-overlay/README.md create mode 100644 vpn-overlay/config/sites.yaml create mode 100644 vpn-overlay/gretap/setup_hub_gretap.sh create mode 100644 vpn-overlay/gretap/setup_site_gretap.sh create mode 100644 vpn-overlay/templates/generate_all.sh create mode 100644 vpn-overlay/topology/l2_topology.mmd create mode 100644 vpn-overlay/topology/l2_topology.vsdx create mode 100644 vpn-overlay/vxlan/setup_hub_vxlan.sh create mode 100644 vpn-overlay/wireguard/hub1_wg0.conf create mode 100644 vpn-overlay/wireguard/site_a_wg0.conf create mode 100644 vpn-overlay/xray/GRPC-XTLS-client.json create mode 100644 vpn-overlay/xray/TCP-XTLS-client.json diff --git a/config/sites.yaml b/config/sites.yaml new file mode 100644 index 00000000..89d96e65 --- /dev/null +++ b/config/sites.yaml @@ -0,0 +1,61 @@ +# 基础网络参数 +wg_network: 10.100.0.0/24 +bridge_network: 172.16.0.0/16 +vxlan_id: 100 +hub_port: 51820 + +# 全局功能开关 +features: + enable_gretap: true # 是否开启 gretap 桥接(站点接入 Hub) + enable_vxlan_between_hubs: true # 是否开启 Hub 之间的 VXLAN Mesh + enable_vless: true # 是否通过 VLESS 中转 WG 流量 + enable_multi_hub: true # 是否支持多 Hub 架构(false 则为单 Hub star 架构) + only_wireguard: false # 若为 true,仅使用 WireGuard 点对点,忽略 gretap/vxlan + +# WireGuard Hub 节点配置 +hubs: + - name: hub1 + wg_ip: 10.100.0.1 + br_ip: 172.16.0.1 + public_ip: hub1.example.com + + - name: hub2 + wg_ip: 10.100.1.1 + br_ip: 172.16.1.1 + public_ip: hub2.example.com + +# 各个站点定义 +sites: + - name: site_a + wg_ip: 10.100.0.2 + br_ip: 172.16.0.2 + hub: hub1 + public_ip: a.example.com + vless: + enabled: true + endpoint: vless-a.example.com + uuid: "11111111-1111-1111-1111-111111111111" + transport: ws + tls: true + path: /wg + + - name: site_b + wg_ip: 10.100.0.3 + br_ip: 172.16.0.3 + hub: hub1 + public_ip: b.example.com + vless: + enabled: false # 此节点不通过 VLESS,直接访问 Hub + + - name: site_c + wg_ip: 10.100.1.2 + br_ip: 172.16.1.2 + hub: hub2 + public_ip: c.example.com + vless: + enabled: true + endpoint: vless-c.example.com + uuid: "33333333-3333-3333-3333-333333333333" + transport: ws + tls: true + path: /xray diff --git a/vpn-overlay/README.md b/vpn-overlay/README.md new file mode 100644 index 00000000..ab928ec0 --- /dev/null +++ b/vpn-overlay/README.md @@ -0,0 +1,158 @@ +# VPN Overlay 文档 + +本项目通过 **WireGuard + VLESS + gretap/VXLAN** 构建跨云、跨平台的大二层互联网络,兼顾穿透、防火墙规避、性能与扩展性。 + +--- + +## 一、组网概述:核心协议与封装层级 + +### 1. WireGuard (WG) +- 类型:L3 VPN(UDP 点对点随身障碍线) +- 用途:形成低负载加密通道 + +### 2. VLESS + XTLS +- 类型:TLS/gRPC 路由封装协议 +- 用途:作为 WireGuard 流量的带容中转 + +### 3. gretap over WireGuard +- 类型:L2 over L3 over UDP +- 用途:支持二层网络,包括 ARP/广播/DHCP + +### 4. VXLAN over WireGuard +- 类型:L2 over UDP +- 用途:适合多 Hub 分区组网和广播 + +--- + +## 二、性能、效率、成本、场景对比 + +| 对比项 | gretap over WG | VXLAN over WG | +|--------|----------------|----------------| +| 封装协议 | GRE (L2 over IP) | VXLAN (L2 over UDP) | +| 架构 | 点对点 | 多点(支持组播) | +| 广播能力 | 完整 L2 广播 | 支持 VXLAN 组播 | +| WG 使用 | gretap 用于 local/remote | VXLAN dev 发包 | +| 多 Hub 扩展 | 差 | 强(VXLAN ID + 组播) | +| 效率 | 高(原生内核支持) | 略低(UDP 重封) | +| 云平台兼容 | 需隔缘 GRE | 要求放行 UDP 4789 | +| MTU | 推荐 1400-1420 | 同上 | +| 平台 | Linux only | 支持 K8s/OpenStack/Linux | + +--- + +## 三、示意结构 + +### 基本层级 + +``` +[站点主机] + └─ gretap + └─ br0 + └─ wg0 → XTLS/VLESS 客户端 + → 网络 + → VLESS 服务端 + → WireGuard Hub +``` + +### Overlay 网络 + +``` +WG Layer3 网段: 10.100.0.0/24 +SiteA.wg0: 10.100.0.2 → WG-Hub: 10.100.0.1 → SiteB.wg0: 10.100.0.3 + +L2 Bridge br0: 172.16.0.0/16 +SiteA.br0: 172.16.1.1 +SiteB.br0: 172.16.2.1 +``` + +### 混合组网 (VXLAN + gretap) + +``` +WG-Hub-1 === VXLAN === WG-Hub-2 + | | + Site A Site B +``` + +--- + +## 四、配置开关说明 & 自动化逻辑 + +| 开关 | 默认 | 说明 | +|------|------|------| +| enable_gretap | true | 启用站点到 Hub 的 gretap 连接 | +| enable_vxlan_between_hubs | true | 启用 Hub 间 VXLAN 桥接 | +| enable_vless | true | 站点通过 VLESS 转发 WG 流量 | +| enable_multi_hub | true | 启用多 Hub 组网 | +| only_wireguard | false | 禁用 gretap/VXLAN,仅使用 WG | + +**自动化逻辑** +- 如果 vless.enabled: true → 生成 `xray-client.json` + 修改 wg0 endpoint +- gretap 启用 → 生成 br0 框架 +- vxlan 启用 → 生成 vxlan100 和 bridge fdb mapping +- only_wireguard = true → 不生成 gretap/VXLAN 结构 + +--- + +## 五、VXLAN 多 Hub 实现 (bridge fdb broadcast) + +```bash +ip link add vxlan100 type vxlan id 100 dev wg0 dstport 4789 group 239.1.1.100 ttl 10 + +bridge fdb add 00:00:00:00:00:00 dev vxlan100 dst 10.100.1.1 +bridge fdb add 00:00:00:00:00:00 dev vxlan100 dst 10.100.2.1 +``` + +--- + +## 六、组网演进实践 + +| 阶段 | 架构 | 开关 | 场景 | +|------|--------|----------------|------| +| 1. P2P | 单点对 | only_wireguard: true | WG 连接测试 | +| 2. Site2Site | 多站 | enable_gretap: true | L2 互联 | +| 3. Net2Net | 多 LAN 桥接 | enable_gretap + br0 | 应用组织 | +| 4. Single Hub | 中心 Hub | enable_multi_hub: true | 合约管理 | +| 5. Double Hub | 双中心 | enable_vxlan_between_hubs: true | 多地区融合 | +| 6. Multi Hub | 多中心 | 全部开 | 大型实施 | + +### Step-by-Step + +#### 第一步: P2P 模型 +- 启用 WG 通信 +- 配置 /etc/wireguard/wg0.conf + +#### 第二步: 二站 L2 通 +- 启用 gretap +- 框架 br0 + 连接 gretap0 + +#### 第三步: Net2Net +- 多个 LAN 通过 br0 带入 gretap 框架 + +#### 第四步: Signal Hub +- 各站点 gretap 连接 Hub +- 如有需要同时启用 VLESS + +#### 第五步: Double Hub +- Hub 间通过 VXLAN 结合 WG 融合 +- 用 bridge fdb 构建组播 VXLAN + +#### 第六步: Multi Hub 应用 +- 每个 Hub 都搭建 vxlan100 和 br0 +- 站点自选最近 Hub +- 支持任意云平台 + +--- + +## 七、扩展建议 + +| 类型 | 内容 | +|------|------| +| 自动部署 | generate_all.sh 一键生成配置 | +| YAML 配置 | 集中 config/sites.yaml | +| 多平台 | 根据 uname 选择 GRE/VXLAN | +| 灾处备份 | 多 Hub 配置切换 | +| 状态监控 | Prometheus 搭配 WG Exporter | + +--- + +> 本项目支持定制化配置,合适各类场景,有关 YAML 配置、服务启动脚本、应用调试相关内容,请连续跟踪项目文档和 config 文件夹。 diff --git a/vpn-overlay/config/sites.yaml b/vpn-overlay/config/sites.yaml new file mode 100644 index 00000000..e69de29b diff --git a/vpn-overlay/gretap/setup_hub_gretap.sh b/vpn-overlay/gretap/setup_hub_gretap.sh new file mode 100644 index 00000000..f6990ac4 --- /dev/null +++ b/vpn-overlay/gretap/setup_hub_gretap.sh @@ -0,0 +1,12 @@ +# 添加 br0 和多个 gretap 接口(每个分支一个) +ip link add gretap_a type gretap local 10.100.0.1 remote 10.100.0.2 +ip link add gretap_b type gretap local 10.100.0.1 remote 10.100.0.3 +ip link add gretap_c type gretap local 10.100.0.1 remote 10.100.0.4 + +ip link add br0 type bridge +brctl addif br0 gretap_a +brctl addif br0 gretap_b +brctl addif br0 gretap_c +ip addr add 172.16.0.1/16 dev br0 +ip link set br0 up + diff --git a/vpn-overlay/gretap/setup_site_gretap.sh b/vpn-overlay/gretap/setup_site_gretap.sh new file mode 100644 index 00000000..50e61cf4 --- /dev/null +++ b/vpn-overlay/gretap/setup_site_gretap.sh @@ -0,0 +1,21 @@ + +#!/bin/bash + +# 启动 WireGuard +wg-quick up wg0 + +# gretap to Site A +ip link add gretap_a type gretap local 10.100.0.1 remote 10.100.0.2 +ip link set gretap_a up + +# gretap to Site B +ip link add gretap_b type gretap local 10.100.0.1 remote 10.100.0.3 +ip link set gretap_b up + +# 创建桥接 +ip link add br0 type bridge +ip link set gretap_a master br0 +ip link set gretap_b master br0 +ip addr add 172.16.0.1/16 dev br0 +ip link set br0 up + diff --git a/vpn-overlay/templates/generate_all.sh b/vpn-overlay/templates/generate_all.sh new file mode 100644 index 00000000..e69de29b diff --git a/vpn-overlay/topology/l2_topology.mmd b/vpn-overlay/topology/l2_topology.mmd new file mode 100644 index 00000000..3b7a5ef3 --- /dev/null +++ b/vpn-overlay/topology/l2_topology.mmd @@ -0,0 +1,19 @@ + + +graph TD + subgraph Hub1 + H1[Hub1] + A[Site A] + B[Site B] + H1 --> A + H1 --> B + end + + subgraph Hub2 + H2[Hub2] + C[Site C] + H2 --> C + end + + H1 <--> H2 + diff --git a/vpn-overlay/topology/l2_topology.vsdx b/vpn-overlay/topology/l2_topology.vsdx new file mode 100644 index 00000000..e69de29b diff --git a/vpn-overlay/vxlan/setup_hub_vxlan.sh b/vpn-overlay/vxlan/setup_hub_vxlan.sh new file mode 100644 index 00000000..78937cd8 --- /dev/null +++ b/vpn-overlay/vxlan/setup_hub_vxlan.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +VXLAN_ID=100 +VXLAN_DEV=vxlan100 +WG_DEV=wg0 +BRIDGE=br0 + +# 本地 WG IP +LOCAL_IP=10.100.0.1 + +# 远端 Hub WG IPs(去掉本地) +PEERS=( + 10.100.1.1 + 10.100.2.1 +) + +# 创建 VXLAN +ip link add $VXLAN_DEV type vxlan id $VXLAN_ID dev $WG_DEV dstport 4789 local $LOCAL_IP +ip link set $VXLAN_DEV up + +# 添加静态 FDB 映射 +for PEER_IP in "${PEERS[@]}"; do + bridge fdb add 00:00:00:00:00:00 dev $VXLAN_DEV dst $PEER_IP +done + +# 添加进 br0 +brctl addif $BRIDGE $VXLAN_DEV + diff --git a/vpn-overlay/wireguard/hub1_wg0.conf b/vpn-overlay/wireguard/hub1_wg0.conf new file mode 100644 index 00000000..1bbc8bb7 --- /dev/null +++ b/vpn-overlay/wireguard/hub1_wg0.conf @@ -0,0 +1,19 @@ +# wg0.conf +[Interface] +PrivateKey = +Address = 10.100.0.1/24 +ListenPort = 51820 + +# Site A +[Peer] +PublicKey = +AllowedIPs = 10.100.0.2/32 + +# Site B +[Peer] +PublicKey = +AllowedIPs = 10.100.0.3/32 + +# Site C +... + diff --git a/vpn-overlay/wireguard/site_a_wg0.conf b/vpn-overlay/wireguard/site_a_wg0.conf new file mode 100644 index 00000000..815f7969 --- /dev/null +++ b/vpn-overlay/wireguard/site_a_wg0.conf @@ -0,0 +1,10 @@ +# wg0.conf +[Interface] +PrivateKey = +Address = 10.100.0.2/24 + +[Peer] +PublicKey = +AllowedIPs = 10.100.0.1/32 +Endpoint = :51820 +PersistentKeepalive = 25 diff --git a/vpn-overlay/xray/GRPC-XTLS-client.json b/vpn-overlay/xray/GRPC-XTLS-client.json new file mode 100644 index 00000000..3fdd5b83 --- /dev/null +++ b/vpn-overlay/xray/GRPC-XTLS-client.json @@ -0,0 +1,15 @@ +"inbounds": [{ + "port": 443, + "protocol": "vless", + "settings": { + "clients": [...], + "decryption": "none" + }, + "streamSettings": { + "network": "grpc", + "grpcSettings": { + "serviceName": "vpn" + }, + "security": "xtls" + } +}] diff --git a/vpn-overlay/xray/TCP-XTLS-client.json b/vpn-overlay/xray/TCP-XTLS-client.json new file mode 100644 index 00000000..c474fab0 --- /dev/null +++ b/vpn-overlay/xray/TCP-XTLS-client.json @@ -0,0 +1,15 @@ +"inbounds": [{ + "port": 443, + "protocol": "vless", + "settings": { + "clients": [...], + "decryption": "none" + }, + "streamSettings": { + "network": "tcp", + "security": "xtls", + "xtlsSettings": { + "alpn": ["h2", "http/1.1"] + } + } +}] From 23cf4c120184028522904ef078f01f70ce0af0b4 Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Wed, 2 Apr 2025 21:43:04 +0800 Subject: [PATCH 2/5] update vpn-overlay/README.md --- vpn-overlay/README.md | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/vpn-overlay/README.md b/vpn-overlay/README.md index ab928ec0..e159dde1 100644 --- a/vpn-overlay/README.md +++ b/vpn-overlay/README.md @@ -43,16 +43,15 @@ ## 三、示意结构 ### 基本层级 - ``` [站点主机] - └─ gretap - └─ br0 - └─ wg0 → XTLS/VLESS 客户端 - → 网络 - → VLESS 服务端 - → WireGuard Hub -``` + └─ vxlan100 (L2 Overlay over UDP) + └─ br0 (虚拟大局域网) + └─ wg0 (VPN加密接口) + └─ VLESS 客户端 (XTLS/TCP/GRPC) + └─ GFW + └─ VLESS 服务端 (公网) + └─ WireGuard Hub ### Overlay 网络 From 3263f3772423ec24a5744ddd6fc6215e405f0367 Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Thu, 3 Apr 2025 21:16:43 +0800 Subject: [PATCH 3/5] add vpn-overlay/vxlan/setup_sit_vxlan.sh --- vpn-overlay/vxlan/setup_sit_vxlan.sh | 57 ++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 vpn-overlay/vxlan/setup_sit_vxlan.sh diff --git a/vpn-overlay/vxlan/setup_sit_vxlan.sh b/vpn-overlay/vxlan/setup_sit_vxlan.sh new file mode 100644 index 00000000..cd921896 --- /dev/null +++ b/vpn-overlay/vxlan/setup_sit_vxlan.sh @@ -0,0 +1,57 @@ +#!/bin/bash +# 自动构建 eth + vxlan + br 接口的 overlay 网络,兼容公有云,替代 gretap 实现 L2 over L3 +# 用法: +# ./setup_overlay_vxlan.sh [vxlan_id] + +set -e + +LOCAL_IP="$1" +REMOTE_IP="$2" +BRIDGE_IP="$3" +ETH_IFACE="$4" +VNI="${5:-100}" # VXLAN ID,默认 100 + +if [ -z "$LOCAL_IP" ] || [ -z "$REMOTE_IP" ] || [ -z "$BRIDGE_IP" ] || [ -z "$ETH_IFACE" ]; then + echo "Usage: $0 [vxlan_id]" + exit 1 +fi + +VXLAN_IF="vxlan${VNI}" +BR_IF="br0" + +echo "🧠 接口名称:$VXLAN_IF(VXLAN ID = $VNI)" + +# 清理旧 vxlan 和 br0 +for iface in "$VXLAN_IF" "$BR_IF"; do + if ip link show "$iface" &>/dev/null; then + echo "🧹 清理旧接口 $iface..." + ip link set "$iface" down || true + ip addr flush dev "$iface" || true + ip link del "$iface" || true + sleep 1 + fi +done + +echo "[1] 创建 VXLAN 接口:$VXLAN_IF" +ip link add "$VXLAN_IF" type vxlan id "$VNI" dev "$ETH_IFACE" dstport 4789 local "$LOCAL_IP" remote "$REMOTE_IP" +ip link set "$VXLAN_IF" up + +echo "[2] 创建桥接设备 $BR_IF 并加入 $VXLAN_IF + $ETH_IFACE" +ip link add "$BR_IF" type bridge +ip link set "$VXLAN_IF" master "$BR_IF" +ip link set "$ETH_IFACE" master "$BR_IF" + +echo "[3] 配置 $BR_IF 地址为 $BRIDGE_IP" +ip addr add "$BRIDGE_IP" dev "$BR_IF" +ip link set "$BR_IF" up + +echo "[4] 启用 IP 转发(可选,仅透传场景需要)" +sysctl -w net.ipv4.ip_forward=1 + +echo "[5] 设置 SNAT(如需让 Overlay 网络流量出网)" +iptables -t nat -C POSTROUTING -s 172.16.0.0/16 -o "$ETH_IFACE" -j MASQUERADE 2>/dev/null || \ +iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o "$ETH_IFACE" -j MASQUERADE + +echo "✅ Overlay 网络已完成:" +echo " - vxlan: $VXLAN_IF" +echo " - bridge: $BR_IF with IP $BRIDGE_IP" From dbcb47cc07163b027ccf8aae26b629fb09736c30 Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Thu, 3 Apr 2025 21:33:42 +0800 Subject: [PATCH 4/5] git commit -m "feat(vxlan): implement safe vxlan + bridge overlay without eth0 bridging" --- vpn-overlay/vxlan/setup_sit_vxlan.sh | 58 ++++++++++++++++------------ 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/vpn-overlay/vxlan/setup_sit_vxlan.sh b/vpn-overlay/vxlan/setup_sit_vxlan.sh index cd921896..245cef70 100644 --- a/vpn-overlay/vxlan/setup_sit_vxlan.sh +++ b/vpn-overlay/vxlan/setup_sit_vxlan.sh @@ -1,57 +1,65 @@ #!/bin/bash -# 自动构建 eth + vxlan + br 接口的 overlay 网络,兼容公有云,替代 gretap 实现 L2 over L3 +# 安全版 VXLAN Overlay 脚本:保留 eth0 做管理面,仅桥接 vxlan0 + vethX # 用法: -# ./setup_overlay_vxlan.sh [vxlan_id] +# ./setup_overlay_safe.sh set -e LOCAL_IP="$1" REMOTE_IP="$2" BRIDGE_IP="$3" -ETH_IFACE="$4" -VNI="${5:-100}" # VXLAN ID,默认 100 +VNI="${4:-100}" # VXLAN ID,默认 100 -if [ -z "$LOCAL_IP" ] || [ -z "$REMOTE_IP" ] || [ -z "$BRIDGE_IP" ] || [ -z "$ETH_IFACE" ]; then - echo "Usage: $0 [vxlan_id]" +if [ -z "$LOCAL_IP" ] || [ -z "$REMOTE_IP" ] || [ -z "$BRIDGE_IP" ]; then + echo "Usage: $0 [vxlan_id]" exit 1 fi VXLAN_IF="vxlan${VNI}" BR_IF="br0" +VETH_A="veth_overlay" +VETH_B="veth_peer" -echo "🧠 接口名称:$VXLAN_IF(VXLAN ID = $VNI)" +echo "🧠 安全模式:仅桥接 $VXLAN_IF 和 $VETH_B,不动 eth0" -# 清理旧 vxlan 和 br0 -for iface in "$VXLAN_IF" "$BR_IF"; do +# 清理旧接口 +for iface in "$VXLAN_IF" "$BR_IF" "$VETH_A" "$VETH_B"; do if ip link show "$iface" &>/dev/null; then - echo "🧹 清理旧接口 $iface..." + echo "🧹 删除旧接口 $iface..." ip link set "$iface" down || true - ip addr flush dev "$iface" || true ip link del "$iface" || true - sleep 1 fi done +# 创建 VXLAN 接口 echo "[1] 创建 VXLAN 接口:$VXLAN_IF" -ip link add "$VXLAN_IF" type vxlan id "$VNI" dev "$ETH_IFACE" dstport 4789 local "$LOCAL_IP" remote "$REMOTE_IP" +ip link add "$VXLAN_IF" type vxlan id "$VNI" dstport 4789 local "$LOCAL_IP" remote "$REMOTE_IP" ip link set "$VXLAN_IF" up -echo "[2] 创建桥接设备 $BR_IF 并加入 $VXLAN_IF + $ETH_IFACE" +# 创建 veth pair 模拟数据交换接口 +echo "[2] 创建 veth pair:$VETH_A <-> $VETH_B" +ip link add "$VETH_A" type veth peer name "$VETH_B" +ip link set "$VETH_A" up +ip link set "$VETH_B" up + +# 创建桥接 br0 +echo "[3] 创建 br0 桥接设备" ip link add "$BR_IF" type bridge ip link set "$VXLAN_IF" master "$BR_IF" -ip link set "$ETH_IFACE" master "$BR_IF" - -echo "[3] 配置 $BR_IF 地址为 $BRIDGE_IP" -ip addr add "$BRIDGE_IP" dev "$BR_IF" +ip link set "$VETH_B" master "$BR_IF" ip link set "$BR_IF" up -echo "[4] 启用 IP 转发(可选,仅透传场景需要)" +# 分配 BRIDGE IP +echo "[4] 配置 br0 地址:$BRIDGE_IP" +ip addr add "$BRIDGE_IP" dev "$BR_IF" + +# 可选 SNAT 出口(若该主机需要 NAT 功能) +echo "[5] 启用 IP 转发 + SNAT(可选)" sysctl -w net.ipv4.ip_forward=1 +iptables -t nat -C POSTROUTING -s 10.255.0.0/16 -o eth0 -j MASQUERADE 2>/dev/null || \ +iptables -t nat -A POSTROUTING -s 10.255.0.0/16 -o eth0 -j MASQUERADE -echo "[5] 设置 SNAT(如需让 Overlay 网络流量出网)" -iptables -t nat -C POSTROUTING -s 172.16.0.0/16 -o "$ETH_IFACE" -j MASQUERADE 2>/dev/null || \ -iptables -t nat -A POSTROUTING -s 172.16.0.0/16 -o "$ETH_IFACE" -j MASQUERADE - -echo "✅ Overlay 网络已完成:" +echo "✅ 安全 Overlay 构建完成:" echo " - vxlan: $VXLAN_IF" -echo " - bridge: $BR_IF with IP $BRIDGE_IP" +echo " - bridge: $BR_IF (IP: $BRIDGE_IP)" +echo " - 管理面未修改 eth0,可正常连通" From ff5741f8df9f2d414fcd745d2e2885b836a05115 Mon Sep 17 00:00:00 2001 From: Haitao Pan Date: Sat, 5 Apr 2025 11:46:19 +0800 Subject: [PATCH 5/5] feat(vxlan): enhance setup_sit_vxlan.sh, add overlay_diag.sh and README - Changed parameter order: [cidr_suffix] [vxlan_id] - Automatically apply CIDR suffix (/16 by default) - Auto-trigger ARP learning with ping from veth - Fixed SNAT to use dynamic interface instead of hardcoded eth0 - Added overlay_diag.sh to verify interface, FDB, VXLAN traffic and NAT status - Added README.md with usage instructions and examples --- vpn-overlay/vxlan/README.md | 50 ++++++++++++++++++ vpn-overlay/vxlan/overlay_diag.sh | 78 ++++++++++++++++++++++++++++ vpn-overlay/vxlan/setup_sit_vxlan.sh | 55 ++++++++++++-------- 3 files changed, 162 insertions(+), 21 deletions(-) create mode 100644 vpn-overlay/vxlan/README.md create mode 100644 vpn-overlay/vxlan/overlay_diag.sh diff --git a/vpn-overlay/vxlan/README.md b/vpn-overlay/vxlan/README.md new file mode 100644 index 00000000..3a47fc32 --- /dev/null +++ b/vpn-overlay/vxlan/README.md @@ -0,0 +1,50 @@ +# VXLAN Overlay 工具集 + +本目录包含构建与诊断二层 VXLAN Overlay 网络的实用脚本,适用于云主机场景(如 AWS EC2),支持安全模式(保留 eth0 仅用于管理面)。 + +--- + +## 🛠️ 脚本列表 + +| 脚本名称 | 说明 | +|----------|------| +| `setup_sit_vxlan.sh` | 安全模式部署 VXLAN Overlay 网络,仅桥接 `vxlan + veth` | +| `overlay_diag.sh` | 自动诊断 VXLAN 接口、桥接状态、FDB 转发表、Overlay 连通性 | + +--- + +## 🚀 使用方法 + +### 1️⃣ 初始化 Overlay 网络 + +- dev_interface:出口物理网卡(如 ens5) +- local_ip:本机内网 IP(VXLAN 使用) +- remote_ip:对端节点的内网 IP +- br0_ip:本地 Overlay 地址(如 10.255.0.2) +- cidr_suffix(可选):默认为 16(设置为 /16 子网) +- vxlan_id(可选):默认 100 + +示例: bash setup_sit_vxlan.sh ens5 54.65.102.93 18.179.15.13 10.255.0.2 16 100 + +### 2️⃣ 诊断 Overlay 网络连通性 + +示例: + +bash overlay_diag.sh +bash overlay_diag.sh 10.255.0.2 10.255.0.3 + +诊断内容: + +- 接口是否存在、是否为 UP 状态; +- br0 IP 是否为非 /32 掩码; +- bridge fdb 是否学习到对端 MAC; +- ping 测试 Overlay 层连通性; +- NAT(MASQUERADE)规则是否存在; +- VXLAN 报文抓包命令提示(UDP port 4789)。 + +### 📦 典型应用场景 + +- 构建多节点跨主机的 L2 Overlay 隧道; +- 支持 VXLAN over 公网 IP,内部互通 10.255.0.0/16; +- 云主机或虚拟机跨可用区桥接; +- 上层可用于 gretap、bridge、L2 BGP、广播集群等。 diff --git a/vpn-overlay/vxlan/overlay_diag.sh b/vpn-overlay/vxlan/overlay_diag.sh new file mode 100644 index 00000000..bcda3ab2 --- /dev/null +++ b/vpn-overlay/vxlan/overlay_diag.sh @@ -0,0 +1,78 @@ +#!/bin/bash +# overlay_diag.sh - VXLAN Overlay 自动诊断工具(Pro 版) + +set -e + +if [ $# -ne 2 ]; then + echo "用法: $0 " + exit 1 +fi + +LOCAL_IP="$1" +REMOTE_IP="$2" +BR_IF="br0" +VETH_A="veth_overlay" +VETH_B="veth_peer" +VXLAN_IF=$(ip -o link show | grep -o 'vxlan[0-9]\+' | head -n 1) +VXLAN_ID=$(echo "$VXLAN_IF" | grep -o '[0-9]\+') + +echo "============================" +echo "🔍 VXLAN Overlay 网络诊断工具" +echo "============================" +echo "📍 本地 Overlay IP: $LOCAL_IP" +echo "📍 对端 Overlay IP: $REMOTE_IP" +echo "📦 VXLAN 接口: $VXLAN_IF" +echo "🆔 VXLAN ID: $VXLAN_ID" +echo "" + +# 接口存在性检测 +for iface in "$VXLAN_IF" "$VETH_A" "$VETH_B" "$BR_IF"; do + if ip link show "$iface" &>/dev/null; then + echo "✅ 接口 $iface 存在" + else + echo "❌ 接口 $iface 不存在" + fi +done +echo "" + +# 接口 UP 状态 +for iface in "$VXLAN_IF" "$VETH_A" "$VETH_B" "$BR_IF"; do + state=$(cat /sys/class/net/$iface/operstate 2>/dev/null || echo "unknown") + echo "📶 接口 $iface 状态: $state" +done +echo "" + +# br0 IP 信息 +br0_ip=$(ip -4 addr show "$BR_IF" | grep -oP 'inet \K[\d.]+/\d+') +if [[ "$br0_ip" == */32 ]]; then + echo "⚠️ br0 IP 为 /32:$br0_ip → 建议设置为 /16 或其他实际子网" +else + echo "✅ br0 IP 设置为:$br0_ip" +fi +echo "" + +# FDB 表 +echo "📡 FDB 转发表 (bridge fdb show dev $VXLAN_IF):" +bridge fdb show dev "$VXLAN_IF" +echo "" + +# ping 连通性测试 +echo "🔁 ping 对端 Overlay IP: $REMOTE_IP(从 $VETH_A 发起)" +ping -c 3 -I "$VETH_A" "$REMOTE_IP" || echo "⚠️ ping 失败,可能未打通 VXLAN 或对端未启动" +echo "" + +# iptables SNAT 检查 +echo "🧱 iptables NAT 规则检查(是否有 MASQUERADE):" +iptables -t nat -S POSTROUTING | grep MASQUERADE || echo "⚠️ 没有检测到 MASQUERADE 规则" +echo "" + +# 抓包提示 +echo "🔬 VXLAN 报文检测提示(需 root 权限):" +echo "👉 可运行以下命令查看 VXLAN 报文是否流动:" +echo " sudo tcpdump -ni $VXLAN_IF udp port 4789" +echo " sudo tcpdump -ni $VETH_B" +echo " sudo tcpdump -ni $BR_IF" +echo "" + +echo "📌 若 ping 不通但 FDB 存在,可能为对端未配置、未学习或防火墙阻断。" +echo "✅ 诊断完成!" diff --git a/vpn-overlay/vxlan/setup_sit_vxlan.sh b/vpn-overlay/vxlan/setup_sit_vxlan.sh index 245cef70..acc99c47 100644 --- a/vpn-overlay/vxlan/setup_sit_vxlan.sh +++ b/vpn-overlay/vxlan/setup_sit_vxlan.sh @@ -1,17 +1,17 @@ #!/bin/bash -# 安全版 VXLAN Overlay 脚本:保留 eth0 做管理面,仅桥接 vxlan0 + vethX -# 用法: -# ./setup_overlay_safe.sh +# 安全版 VXLAN Overlay 脚本(参数顺序改为 dev_if + ip 信息) set -e -LOCAL_IP="$1" -REMOTE_IP="$2" -BRIDGE_IP="$3" -VNI="${4:-100}" # VXLAN ID,默认 100 +DEV_IF="$1" +LOCAL_IP="$2" +REMOTE_IP="$3" +BRIDGE_IP="$4" +CIDR_SUFFIX="${5:-16}" +VNI="${6:-100}" -if [ -z "$LOCAL_IP" ] || [ -z "$REMOTE_IP" ] || [ -z "$BRIDGE_IP" ]; then - echo "Usage: $0 [vxlan_id]" +if [ -z "$DEV_IF" ] || [ -z "$LOCAL_IP" ] || [ -z "$REMOTE_IP" ] || [ -z "$BRIDGE_IP" ]; then + echo "Usage: $0 [cidr_suffix] [vxlan_id]" exit 1 fi @@ -19,8 +19,10 @@ VXLAN_IF="vxlan${VNI}" BR_IF="br0" VETH_A="veth_overlay" VETH_B="veth_peer" +BRIDGE_CIDR="${BRIDGE_IP}/${CIDR_SUFFIX}" +SUBNET="$(echo "$BRIDGE_IP" | cut -d. -f1-2).0.0/${CIDR_SUFFIX}" -echo "🧠 安全模式:仅桥接 $VXLAN_IF 和 $VETH_B,不动 eth0" +echo "🧠 安全模式:仅桥接 $VXLAN_IF 和 $VETH_B,不动 $DEV_IF" # 清理旧接口 for iface in "$VXLAN_IF" "$BR_IF" "$VETH_A" "$VETH_B"; do @@ -33,10 +35,10 @@ done # 创建 VXLAN 接口 echo "[1] 创建 VXLAN 接口:$VXLAN_IF" -ip link add "$VXLAN_IF" type vxlan id "$VNI" dstport 4789 local "$LOCAL_IP" remote "$REMOTE_IP" +ip link add "$VXLAN_IF" type vxlan id "$VNI" dstport 4789 local "$LOCAL_IP" remote "$REMOTE_IP" dev "$DEV_IF" ip link set "$VXLAN_IF" up -# 创建 veth pair 模拟数据交换接口 +# 创建 veth pair echo "[2] 创建 veth pair:$VETH_A <-> $VETH_B" ip link add "$VETH_A" type veth peer name "$VETH_B" ip link set "$VETH_A" up @@ -49,17 +51,28 @@ ip link set "$VXLAN_IF" master "$BR_IF" ip link set "$VETH_B" master "$BR_IF" ip link set "$BR_IF" up -# 分配 BRIDGE IP -echo "[4] 配置 br0 地址:$BRIDGE_IP" -ip addr add "$BRIDGE_IP" dev "$BR_IF" +# 配置 IP 和子网掩码 +echo "[4] 配置 br0 地址:$BRIDGE_CIDR" +ip addr add "$BRIDGE_CIDR" dev "$BR_IF" -# 可选 SNAT 出口(若该主机需要 NAT 功能) -echo "[5] 启用 IP 转发 + SNAT(可选)" +# 启用 SNAT +echo "[5] 启用 IP 转发 + SNAT(出口:$DEV_IF,子网:$SUBNET)" sysctl -w net.ipv4.ip_forward=1 -iptables -t nat -C POSTROUTING -s 10.255.0.0/16 -o eth0 -j MASQUERADE 2>/dev/null || \ -iptables -t nat -A POSTROUTING -s 10.255.0.0/16 -o eth0 -j MASQUERADE +iptables -t nat -C POSTROUTING -s "$SUBNET" -o "$DEV_IF" -j MASQUERADE 2>/dev/null || \ +iptables -t nat -A POSTROUTING -s "$SUBNET" -o "$DEV_IF" -j MASQUERADE + +# 自动触发 ARP 学习 +REMOTE_LAST_OCTET="$(echo "$REMOTE_IP" | awk -F. '{print $4}')" +if [[ "$REMOTE_LAST_OCTET" -eq 2 ]]; then + REMOTE_BR_IP="10.255.0.3" +else + REMOTE_BR_IP="10.255.0.2" +fi + +echo "[6] 触发 ARP 学习 ping:$REMOTE_BR_IP ← from $VETH_A" +ping -c 1 -I "$VETH_A" "$REMOTE_BR_IP" || true echo "✅ 安全 Overlay 构建完成:" echo " - vxlan: $VXLAN_IF" -echo " - bridge: $BR_IF (IP: $BRIDGE_IP)" -echo " - 管理面未修改 eth0,可正常连通" +echo " - bridge: $BR_IF (IP: $BRIDGE_CIDR)" +echo " - SNAT 子网:$SUBNET → $DEV_IF"