iac_modules/vpn-overlay/vxlan/setup_sit_vxlan.sh
Haitao Pan ff5741f8df feat(vxlan): enhance setup_sit_vxlan.sh, add overlay_diag.sh and README
- Changed parameter order: <dev_if> <local_ip> <remote_ip> <br0_ip> [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
2025-04-05 11:46:19 +08:00

79 lines
2.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/bin/bash
# 安全版 VXLAN Overlay 脚本(参数顺序改为 dev_if + ip 信息)
set -e
DEV_IF="$1"
LOCAL_IP="$2"
REMOTE_IP="$3"
BRIDGE_IP="$4"
CIDR_SUFFIX="${5:-16}"
VNI="${6:-100}"
if [ -z "$DEV_IF" ] || [ -z "$LOCAL_IP" ] || [ -z "$REMOTE_IP" ] || [ -z "$BRIDGE_IP" ]; then
echo "Usage: $0 <dev_interface> <local_ip> <remote_ip> <br0_ip> [cidr_suffix] [vxlan_id]"
exit 1
fi
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,不动 $DEV_IF"
# 清理旧接口
for iface in "$VXLAN_IF" "$BR_IF" "$VETH_A" "$VETH_B"; do
if ip link show "$iface" &>/dev/null; then
echo "🧹 删除旧接口 $iface..."
ip link set "$iface" down || true
ip link del "$iface" || true
fi
done
# 创建 VXLAN 接口
echo "[1] 创建 VXLAN 接口:$VXLAN_IF"
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
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 "$VETH_B" master "$BR_IF"
ip link set "$BR_IF" up
# 配置 IP 和子网掩码
echo "[4] 配置 br0 地址:$BRIDGE_CIDR"
ip addr add "$BRIDGE_CIDR" dev "$BR_IF"
# 启用 SNAT
echo "[5] 启用 IP 转发 + SNAT出口$DEV_IF,子网:$SUBNET"
sysctl -w net.ipv4.ip_forward=1
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_CIDR)"
echo " - SNAT 子网:$SUBNET$DEV_IF"