IPv4+IPv6 通信

 


方案一:BGP + IPIP(veth 双栈)三台裸机互通

1️⃣ 网络规划

三台机器 IP/双栈 veth 分配示例:

节点eth0 IPv4eth0 IPv6veth IPv4veth IPv6IPIP IPv4 隧道地址IPIP IPv6 隧道地址
A 192.168.10.1/24 2001:db8:10::1/64 10.10.1.1/24 fd10:1::1/64 172.20.1.1/30,172.20.1.5/30 fd20:1::1/126,fd20:1::5/126
B 192.168.10.2/24 2001:db8:10::2/64 10.10.2.1/24 fd10:2::1/64 172.20.1.2/30,172.20.1.9/30 fd20:1::2/126,fd20:1::6/126
C 192.168.10.3/24 2001:db8:10::3/64 10.10.3.1/24 fd10:3::1/64 172.20.1.6/30,172.20.1.10/30 fd20:1::5/126,fd20:1::6/126
  • 每台机器的 veth 用于承载内部双栈流量

  • IPIP 隧道点对点封装 IPv4/IPv6


2️⃣ 内核配置(每台机器执行)

# IPv4/IPv6 转发
sysctl -w net.ipv4.ip_forward=1
sysctl -w net.ipv6.conf.all.forwarding=1

# 加载隧道模块
modprobe ipip        # IPv4 IPIP
modprobe ip6_tunnel  # IPv6 IPIP

3️⃣ veth + IPIP 配置(每台节点独立)

A 节点

# 创建 veth 双栈接口
ip link add vethA type veth peer name vethA-br
ip link set vethA up
ip link set vethA-br up
ip addr add 10.10.1.1/24 dev vethA
ip addr add fd10:1::1/64 dev vethA

# IPv4 IPIP 隧道到 B
ip tunnel add ipip4toB mode ipip remote 192.168.10.2 local 192.168.10.1 ttl 255
ip link set ipip4toB up
ip addr add 172.20.1.1/30 dev ipip4toB

# IPv4 IPIP 隧道到 C
ip tunnel add ipip4toC mode ipip remote 192.168.10.3 local 192.168.10.1 ttl 255
ip link set ipip4toC up
ip addr add 172.20.1.5/30 dev ipip4toC

# IPv6 IPIP 隧道到 B
ip -6 tunnel add ipip6toB mode ip6ip6 remote 2001:db8:10::2 local 2001:db8:10::1
ip link set ipip6toB up
ip addr add fd20:1::1/126 dev ipip6toB

# IPv6 IPIP 隧道到 C
ip -6 tunnel add ipip6toC mode ip6ip6 remote 2001:db8:10::3 local 2001:db8:10::1
ip link set ipip6toC up
ip addr add fd20:1::5/126 dev ipip6toC

B 节点

# veth 双栈接口
ip link add vethB type veth peer name vethB-br
ip link set vethB up
ip link set vethB-br up
ip addr add 10.10.2.1/24 dev vethB
ip addr add fd10:2::1/64 dev vethB

# IPv4 IPIP 隧道到 A
ip tunnel add ipip4toA mode ipip remote 192.168.10.1 local 192.168.10.2 ttl 255
ip link set ipip4toA up
ip addr add 172.20.1.2/30 dev ipip4toA

# IPv4 IPIP 隧道到 C
ip tunnel add ipip4toC mode ipip remote 192.168.10.3 local 192.168.10.2 ttl 255
ip link set ipip4toC up
ip addr add 172.20.1.9/30 dev ipip4toC

# IPv6 IPIP 隧道
ip -6 tunnel add ipip6toA mode ip6ip6 remote 2001:db8:10::1 local 2001:db8:10::2
ip link set ipip6toA up
ip addr add fd20:1::2/126 dev ipip6toA

ip -6 tunnel add ipip6toC mode ip6ip6 remote 2001:db8:10::3 local 2001:db8:10::2
ip link set ipip6toC up
ip addr add fd20:1::6/126 dev ipip6toC

C 节点

# veth 双栈接口
ip link add vethC type veth peer name vethC-br
ip link set vethC up
ip link set vethC-br up
ip addr add 10.10.3.1/24 dev vethC
ip addr add fd10:3::1/64 dev vethC

# IPv4 IPIP 隧道到 A
ip tunnel add ipip4toA mode ipip remote 192.168.10.1 local 192.168.10.3 ttl 255
ip link set ipip4toA up
ip addr add 172.20.1.6/30 dev ipip4toA

# IPv4 IPIP 隧道到 B
ip tunnel add ipip4toB mode ipip remote 192.168.10.2 local 192.168.10.3 ttl 255
ip link set ipip4toB up
ip addr add 172.20.1.10/30 dev ipip4toB

# IPv6 IPIP 隧道
ip -6 tunnel add ipip6toA mode ip6ip6 remote 2001:db8:10::1 local 2001:db8:10::3
ip link set ipip6toA up
ip addr add fd20:1::5/126 dev ipip6toA

ip -6 tunnel add ipip6toB mode ip6ip6 remote 2001:db8:10::2 local 2001:db8:10::3
ip link set ipip6toB up
ip addr add fd20:1::6/126 dev ipip6toB

4️⃣ BIRD 配置(每台机器完整文件)

A 节点 /etc/bird/bird.conf

router id 192.168.10.1;

protocol device { }

protocol kernel {
    persist; scan time 20;
    export all;
}

protocol direct {
    interface "*";
}

# IPv4 BGP 邻居
protocol bgp BGPtoB {
    local 192.168.10.1 as 65001;
    neighbor 192.168.10.2 as 65002;
    import all;
    export all;
}
protocol bgp BGPtoC {
    local 192.168.10.1 as 65001;
    neighbor 192.168.10.3 as 65003;
    import all;
    export all;
}

# IPv6 BGP 邻居
protocol bgp BGP6toB {
    local 2001:db8:10::1 as 65001;
    neighbor 2001:db8:10::2 as 65002;
    import all;
    export all;
}
protocol bgp BGP6toC {
    local 2001:db8:10::1 as 65001;
    neighbor 2001:db8:10::3 as 65003;
    import all;
    export all;
}

B 节点 /etc/bird/bird.conf

router id 192.168.10.2;

protocol device { }
protocol kernel { persist; scan time 20; export all; }
protocol direct { interface "*"; }

protocol bgp BGPtoA {
    local 192.168.10.2 as 65002;
    neighbor 192.168.10.1 as 65001;
    import all; export all;
}
protocol bgp BGPtoC {
    local 192.168.10.2 as 65002;
    neighbor 192.168.10.3 as 65003;
    import all; export all;
}

protocol bgp BGP6toA {
    local 2001:db8:10::2 as 65002;
    neighbor 2001:db8:10::1 as 65001;
    import all; export all;
}
protocol bgp BGP6toC {
    local 2001:db8:10::2 as 65002;
    neighbor 2001:db8:10::3 as 65003;
    import all; export all;
}

C 节点 /etc/bird/bird.conf

router id 192.168.10.3;

protocol device { }
protocol kernel { persist; scan time 20; export all; }
protocol direct { interface "*"; }

protocol bgp BGPtoA {
    local 192.168.10.3 as 65003;
    neighbor 192.168.10.1 as 65001;
    import all; export all;
}
protocol bgp BGPtoB {
    local 192.168.10.3 as 65003;
    neighbor 192.168.10.2 as 65002;
    import all; export all;
}

protocol bgp BGP6toA {
    local 2001:db8:10::3 as 65003;
    neighbor 2001:db8:10::1 as 65001;
    import all; export all;
}
protocol bgp BGP6toB {
    local 2001:db8:10::3 as 65003;
    neighbor 2001:db8:10::2 as 65002;
    import all; export all;
}

5️⃣ 启动与验证

# 启动 BIRD
systemctl restart bird
systemctl restart bird6

# 查看 BGP 邻居状态
birdc show protocols
birdc6 show protocols

# 测试 IPIP 隧道互通
ping 172.20.1.2   # A -> B IPv4
ping 172.20.1.10  # A -> C IPv4
ping6 fd20:1::2   # A -> B IPv6
ping6 fd20:1::6   # A -> C IPv6

# 测试 veth 双栈通信
ping 10.10.2.1    # A -> B IPv4 veth
ping6 fd10:2::1   # A -> B IPv6 veth

6️⃣ 网络流量封装流程(文本示意)

IPv4 数据流:
vethA ---> IPIP_tunnel (172.20.1.x) ---> eth0 ---> 目的节点 veth

IPv6 数据流:
vethA ---> IPIP6_tunnel (fd20:1::x) ---> eth0 ---> 目的节点 veth

说明:
- 内核负责 IPIP 封装/解封
- BIRD 负责路由传播,保证双栈互通
- veth 双栈接口承载节点内部通信

7️⃣ 常见坑/注意事项

  1. IPv6 IPIP 模块ip6_tunnel,内核需支持

  2. 隧道地址唯一:/30 和 /126 不能冲突

  3. 防火墙:协议号 4(IPv4 IPIP)和 41(IPv6)需放行

  4. BIRD 配置:IPv4/IPv6 邻居必须分别声明,否则双栈无法互通

  5. TTL:建议隧道 TTL=255,防止被 NAT 丢包


方案二:BGP +VXLAN + veth + Bridge (IPv4/IPv6 双栈)三台裸机互通

1. 网络配置(内核 + VXLAN + veth + Bridge)

A 节点配置

# 开启 IPv4/IPv6 转发
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

# 创建 veth 对(vethA <-> vethA-br)
sudo ip link add vethA type veth peer name vethA-br
sudo ip link set vethA up
sudo ip link set vethA-br up

# 配置 veth IPv4/IPv6
sudo ip addr add 10.10.1.1/24 dev vethA
sudo ip -6 addr add fd10:1::1/64 dev vethA

# 创建 bridge 并加入 veth peer
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set vethA-br master br0

# 创建 VXLAN 接口(vni=100)
sudo ip link add vxlan100 type vxlan id 100 dev eth0 \
  local 192.168.10.1 remote 192.168.10.2 dstport 4789
sudo ip link set vxlan100 up
sudo ip addr add 10.20.1.1/24 dev vxlan100
sudo ip -6 addr add fd20:1::1/64 dev vxlan100

# 将 VXLAN 接口加入 bridge
sudo ip link set vxlan100 master br0

# 验证接口
ip addr show
bridge link

B 节点配置

sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

sudo ip link add vethB type veth peer name vethB-br
sudo ip link set vethB up
sudo ip link set vethB-br up
sudo ip addr add 10.10.2.1/24 dev vethB
sudo ip -6 addr add fd10:2::1/64 dev vethB

sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set vethB-br master br0

sudo ip link add vxlan100 type vxlan id 100 dev eth0 \
  local 192.168.10.2 remote 192.168.10.1 dstport 4789
sudo ip link set vxlan100 up
sudo ip addr add 10.20.1.2/24 dev vxlan100
sudo ip -6 addr add fd20:1::2/64 dev vxlan100
sudo ip link set vxlan100 master br0

ip addr show
bridge link

C 节点配置

sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

sudo ip link add vethC type veth peer name vethC-br
sudo ip link set vethC up
sudo ip link set vethC-br up
sudo ip addr add 10.10.3.1/24 dev vethC
sudo ip -6 addr add fd10:3::1/64 dev vethC

sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set vethC-br master br0

sudo ip link add vxlan100 type vxlan id 100 dev eth0 \
  local 192.168.10.3 remote 192.168.10.1 dstport 4789
sudo ip link set vxlan100 up
sudo ip addr add 10.20.1.3/24 dev vxlan100
sudo ip -6 addr add fd20:1::3/64 dev vxlan100
sudo ip link set vxlan100 master br0

ip addr show
bridge link

2. BIRD 配置(IPv4/IPv6 BGP)

A 节点 /etc/bird/bird.conf

router id 192.168.10.1;

protocol kernel {
  persist;
  scan time 20;
  import all;
  export all;
}

protocol device {
  scan time 10;
}

protocol direct {
  interface "*";
}

protocol bgp B_B {
  local as 65001;
  neighbor 192.168.10.2 as 65002;
  import all;
  export all;
}

protocol bgp B_C {
  local as 65001;
  neighbor 192.168.10.3 as 65003;
  import all;
  export all;
}

# IPv6 BGP
router id 2001:db8:10::1;

protocol bgp6 B_B_v6 {
  local as 65001;
  neighbor 2001:db8:10::2 as 65002;
  import all;
  export all;
}

protocol bgp6 B_C_v6 {
  local as 65001;
  neighbor 2001:db8:10::3 as 65003;
  import all;
  export all;
}

B 节点 /etc/bird/bird.conf

router id 192.168.10.2;

protocol kernel { persist; scan time 20; import all; export all; }
protocol device { scan time 10; }
protocol direct { interface "*"; }

protocol bgp A_B { local as 65002; neighbor 192.168.10.1 as 65001; import all; export all; }
protocol bgp B_C { local as 65002; neighbor 192.168.10.3 as 65003; import all; export all; }

router id 2001:db8:10::2;

protocol bgp6 A_B_v6 { local as 65002; neighbor 2001:db8:10::1 as 65001; import all; export all; }
protocol bgp6 B_C_v6 { local as 65002; neighbor 2001:db8:10::3 as 65003; import all; export all; }

C 节点 /etc/bird/bird.conf

router id 192.168.10.3;

protocol kernel { persist; scan time 20; import all; export all; }
protocol device { scan time 10; }
protocol direct { interface "*"; }

protocol bgp A_C { local as 65003; neighbor 192.168.10.1 as 65001; import all; export all; }
protocol bgp B_C { local as 65003; neighbor 192.168.10.2 as 65002; import all; export all; }

router id 2001:db8:10::3;

protocol bgp6 A_C_v6 { local as 65003; neighbor 2001:db8:10::1 as 65001; import all; export all; }
protocol bgp6 B_C_v6 { local as 65003; neighbor 2001:db8:10::2 as 65002; import all; export all; }

3. IPv4/IPv6 数据包流向图(TXT)

          +---------+         VXLAN/Bridge         +---------+
          |   A     |----------------------------->|   B     |
          |vethA(10.10.1.1)|                    |vethB(10.10.2.1)|
          |vxlan100(10.20.1.1)|                 |vxlan100(10.20.1.2)|
          +---------+                              +---------+
               \                                      /
                \                                    /
                 \                                  /
                  \                                /
                   \                              /
                   VXLAN/Bridge                    VXLAN/Bridge
                    +---------+                   +---------+
                    |   C     |-----------------> |   B     |
                    |vethC(10.10.3.1)|           |vethB(10.10.2.1)|
                    |vxlan100(10.20.1.3)|        |vxlan100(10.20.1.2)|
                    +---------+                   +---------+

# IPv6 类似,10.10.x.x -> fd10:x::x, 10.20.x.x -> fd20:x::x
  • veth 层:节点本地 IPv4/IPv6,二层点对点通信

  • VXLAN 层:物理接口封装,跨主机二层扩展

  • Bridge 层:VXLAN + veth peer 二层交换,广播/ARP/FDB

  • BGP 控制平面:通过 BIRD 宣告 VXLAN/Bridge 网络路由


4. 启动与验证

# 启动 BIRD
sudo systemctl restart bird
sudo systemctl restart bird6

# 查看 BGP 会话状态
birdc show protocols
birdc6 show protocols

# 验证 VXLAN 层
ping 10.20.1.2
ping6 fd20:1::2

# 验证 veth 层
ping 10.10.2.1
ping6 fd10:2::1

# 查看 bridge FDB
bridge fdb show

5. 注意事项

  1. VXLAN 的 local/remote IPv4 必须是真实物理接口 IPv4 地址。

  2. bridge 要先创建,再把 VXLAN 接口加入,否则不生效。

  3. IPv6 forwarding 必须开启,否则 IPv6 VXLAN/Bridge 不通。

  4. BIRD peer AS 和 neighbor IP 必须匹配,IPv4/IPv6 分开配置。

  5. ip link set vxlan100 master br0 会把 VXLAN 封装到二层,veth+bridge 做二层扩展。

  6. 验证时可用 bridge fdb show 检查 VXLAN MAC 学习情况。

  7. 三台机器都需要执行各自对应配置。


明白,我整理一个完整方案三文档,涵盖:

  • 内核配置

  • veth + VXLAN + bridge 配置(IPv4/IPv6 双栈)

  • 三台裸机详细 IP 配置

  • 静态路由

  • 验证方法

  • 常见坑/注意事项

  • 最后附 ASCII 流程图展示数据流向

下面是完整文档:


方案三:VXLAN + 静态路由(IPv4/IPv6 双栈)三台裸机互通

1. 网络设计

  • 每台节点有独立 veth 本地网段

    • A: 10.10.1.0/24, fd10:1::/64

    • B: 10.10.2.0/24, fd10:2::/64

    • C: 10.10.3.0/24, fd10:3::/64

  • VXLAN 二层网络(10.20.1.0/24, fd20:1::/64)实现三节点互通

  • 数据包流向:

    • IPv4/IPv6 本地 veth <-> bridge <-> VXLAN <-> 对端 VXLAN

  • 静态路由指向 VXLAN 对端


2. 内核配置(每台节点执行)

# 开启 IPv4/IPv6 转发
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

# 确保 bridge vxlan 支持多播
sudo sysctl -w net.ipv6.conf.all.accept_ra=2
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=1

3. 节点详细配置

A 节点

# veth 本地
sudo ip link add vethA type veth peer name vethA-br
sudo ip link set vethA up
sudo ip link set vethA-br up
sudo ip addr add 10.10.1.1/24 dev vethA
sudo ip -6 addr add fd10:1::1/64 dev vethA

# bridge
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set vethA-br master br0

# VXLAN
sudo ip link add vxlan100 type vxlan id 100 dev eth0 \
    local 192.168.10.1 dstport 4789
sudo ip link set vxlan100 up
sudo ip addr add 10.20.1.1/24 dev vxlan100
sudo ip -6 addr add fd20:1::1/64 dev vxlan100
sudo ip link set vxlan100 master br0

# 静态路由
sudo ip route add 10.20.1.2/32 dev vxlan100
sudo ip route add 10.20.1.3/32 dev vxlan100
sudo ip -6 route add fd20:1::2/128 dev vxlan100
sudo ip -6 route add fd20:1::3/128 dev vxlan100

B 节点

# veth 本地
sudo ip link add vethB type veth peer name vethB-br
sudo ip link set vethB up
sudo ip link set vethB-br up
sudo ip addr add 10.10.2.1/24 dev vethB
sudo ip -6 addr add fd10:2::1/64 dev vethB

# bridge
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set vethB-br master br0

# VXLAN
sudo ip link add vxlan100 type vxlan id 100 dev eth0 \
    local 192.168.10.2 dstport 4789
sudo ip link set vxlan100 up
sudo ip addr add 10.20.1.2/24 dev vxlan100
sudo ip -6 addr add fd20:1::2/64 dev vxlan100
sudo ip link set vxlan100 master br0

# 静态路由
sudo ip route add 10.20.1.1/32 dev vxlan100
sudo ip route add 10.20.1.3/32 dev vxlan100
sudo ip -6 route add fd20:1::1/128 dev vxlan100
sudo ip -6 route add fd20:1::3/128 dev vxlan100

C 节点

# veth 本地
sudo ip link add vethC type veth peer name vethC-br
sudo ip link set vethC up
sudo ip link set vethC-br up
sudo ip addr add 10.10.3.1/24 dev vethC
sudo ip -6 addr add fd10:3::1/64 dev vethC

# bridge
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set vethC-br master br0

# VXLAN
sudo ip link add vxlan100 type vxlan id 100 dev eth0 \
    local 192.168.10.3 dstport 4789
sudo ip link set vxlan100 up
sudo ip addr add 10.20.1.3/24 dev vxlan100
sudo ip -6 addr add fd20:1::3/64 dev vxlan100
sudo ip link set vxlan100 master br0

# 静态路由
sudo ip route add 10.20.1.1/32 dev vxlan100
sudo ip route add 10.20.1.2/32 dev vxlan100
sudo ip -6 route add fd20:1::1/128 dev vxlan100
sudo ip -6 route add fd20:1::2/128 dev vxlan100

4. 验证方法

# ping VXLAN IPv4/IPv6
ping 10.20.1.2
ping 10.20.1.3
ping6 fd20:1::2
ping6 fd20:1::3

# 查看路由表
ip route
ip -6 route

# 查看 bridge FDB
bridge fdb show

# tcpdump 验证 VXLAN 封装
sudo tcpdump -i eth0 udp port 4789

5. 常见坑/注意事项

项目说明
IPv6 转发 必须 sysctl net.ipv6.conf.all.forwarding=1
VXLAN dstport 默认 4789,三台节点必须一致
Bridge FDB VXLAN 封装二层流量,需要 bridge fdb show 确认 MAC 学习
静态路由 新增节点需手动添加 VXLAN 对端路由
多播/ARP VXLAN 默认单播模式,IPv6 需保证 RA 被接受
veth peer vethA <-> vethA-br, vethB <-> vethB-br, 必须 bridge master
数据包验证 tcpdump 可捕获 IPv4/IPv6 VXLAN 封装,确认入站/出站

6. 网络流量 ASCII 图

         IPv4/IPv6 双栈
        +----------------+
        |      A         |
        | 10.10.1.1/24   |
        | fd10:1::1/64   |
        +----+----+------+
             |vethA
             v
           +----+
           |br0 |
           +----+
             |
           vxlan100
             |
    +--------+--------+
    |                 |
+---v---+         +---v---+
|   B   |         |   C   |
|10.10.2.1/24    10.10.3.1/24
|fd10:2::1/64    fd10:3::1/64
+-------+        +-------+

数据流向说明

  1. A -> B: A.vethA -> br0 -> vxlan100 -> eth0 -> B.vxlan100 -> br0 -> B.vethB

  2. A -> C: 同上,dst VXLAN IP 为 C

  3. IPv4/IPv6 双栈均通过 vxlan 封装二层通信,桥接本地 veth

  4. 返回流量: 对端 vxlan 接口解封装 -> bridge -> 本地 veth


方案四:HostGW 模式(IPv4/IPv6 双栈)三台裸机互通

1. 网络设计

  • 每台节点都有一个 veth 本地网段

    • IPv4 Pod 网段:10.10.x.0/24

    • IPv6 Pod 网段:fd10:x::/64

  • HostGW 模式:通过节点主机路由直接互通,不依赖 BGP。

  • 数据面:veth + bridge + 内核静态路由。

  • 每台节点负责把本地 Pod 网段通过 veth + bridge 与其他节点互通。

示意拓扑

三台裸机:A、B、C
eth0 IPv4/IPv6 网段:
A: 192.168.10.1 / 2402:d040:9:57::1
B: 192.168.10.2 / 2402:d040:9:57::2
C: 192.168.10.3 / 2402:d040:9:57::3

veth Pod 网段:
A: vethA 10.10.1.1/24 fd10:1::1/64
B: vethB 10.10.2.1/24 fd10:2::1/64
C: vethC 10.10.3.1/24 fd10:3::1/64

2. 内核配置

每台节点执行:

# 开启 IPv4/IPv6 转发
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

3. 节点 veth + bridge 配置

A 节点

# 创建 veth 对
sudo ip link add vethA type veth peer name vethA-br
sudo ip addr add 10.10.1.1/24 dev vethA
sudo ip -6 addr add fd10:1::1/64 dev vethA
sudo ip link set vethA up
sudo ip link set vethA-br up

# 创建 bridge
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set vethA-br master br0

B 节点

sudo ip link add vethB type veth peer name vethB-br
sudo ip addr add 10.10.2.1/24 dev vethB
sudo ip -6 addr add fd10:2::1/64 dev vethB
sudo ip link set vethB up
sudo ip link set vethB-br up

sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set vethB-br master br0

C 节点

sudo ip link add vethC type veth peer name vethC-br
sudo ip addr add 10.10.3.1/24 dev vethC
sudo ip -6 addr add fd10:3::1/64 dev vethC
sudo ip link set vethC up
sudo ip link set vethC-br up

sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set vethC-br master br0

4. 节点静态 HostGW 路由配置

A 节点

# IPv4
sudo ip route add 10.10.2.0/24 via 192.168.10.2 dev eth0
sudo ip route add 10.10.3.0/24 via 192.168.10.3 dev eth0

# IPv6
sudo ip -6 route add fd10:2::/64 via 2402:d040:9:57::2 dev eth0
sudo ip -6 route add fd10:3::/64 via 2402:d040:9:57::3 dev eth0

B 节点

sudo ip route add 10.10.1.0/24 via 192.168.10.1 dev eth0
sudo ip route add 10.10.3.0/24 via 192.168.10.3 dev eth0

sudo ip -6 route add fd10:1::/64 via 2402:d040:9:57::1 dev eth0
sudo ip -6 route add fd10:3::/64 via 2402:d040:9:57::3 dev eth0

C 节点

sudo ip route add 10.10.1.0/24 via 192.168.10.1 dev eth0
sudo ip route add 10.10.2.0/24 via 192.168.10.2 dev eth0

sudo ip -6 route add fd10:1::/64 via 2402:d040:9:57::1 dev eth0
sudo ip -6 route add fd10:2::/64 via 2402:d040:9:57::2 dev eth0

5. 启动顺序

  1. 开启内核转发

  2. 创建 veth 对

  3. 配置 IP/IPv6 地址

  4. 创建 bridge 并将 veth-br 加入

  5. 配置静态 HostGW 路由

每台机器按此顺序执行,完成后三台节点互通。


6. 验证方法

# IPv4 ping
ping 10.10.2.1
ping 10.10.3.1

# IPv6 ping
ping6 fd10:2::1
ping6 fd10:3::1

# 查看路由表
ip route
ip -6 route

# 查看接口
ip link show
bridge link

7. 数据包流向 ASCII 图

       +------------------------+
       |          A             |
       | eth0 192.168.10.1      |
       | vethA 10.10.1.1        |
       | fd10:1::1              |
       +-----------+------------+
                   |
                   |  IPv4/IPv6 HostGW
                   |
           +-------+-------+
           |   192.168.10.0/24   |
           |   2402:d040:9:57::/64|
           +-------+-------+
                   |
       +-----------+------------+
       |            |           |
       |            |           |
+------+-----+  +---+------+  +---+------+
|    B       |  |    C     |  |         |
|eth0 192.168.10.2 | 192.168.10.3 ...   |
|vethB 10.10.2.1   | vethC 10.10.3.1    |
|fd10:2::1         | fd10:3::1          |
+------------------+--------------------+

# 流量说明:
# A -> B: 10.10.2.0/24 via 192.168.10.2, fd10:2::/64 via 2402:d040:9:57::2
# A -> C: 10.10.3.0/24 via 192.168.10.3, fd10:3::/64 via 2402:d040:9:57::3
# 同理 B <-> C
# 所有 Pod 流量走 veth -> bridge -> HostGW -> 远端节点 eth0

8. 特点与注意事项

特性HostGW 模式
控制平面 无 BGP
配置复杂度
扩展性 中等,节点增加需更新静态路由
IPv4/IPv6 支持 双栈全支持
VXLAN 可选,用 veth+bridge代替
适合场景 小规模集群,避免 BGP/隧道

注意事项:

  1. 所有节点必须开启 IPv4/IPv6 转发。

  2. 静态路由增加新节点需更新所有节点配置。

  3. veth 对名和 bridge 名可以按需调整,但必须对应。

  4. 流量直接走内核路由,不依赖控制平面。

  5. 可结合 VXLAN 或其他 overlay 做二层隔离,但 HostGW 本身无需 BGP。


方案五:BGP + VXLAN + 静态路由(IPv4/IPv6 双栈)三台裸机互通

1. 网络设计

  • 每台节点有独立 veth 本地网段

    • A: 10.10.1.0/24, fd10:1::/64

    • B: 10.10.2.0/24, fd10:2::/64

    • C: 10.10.3.0/24, fd10:3::/64

  • VXLAN 二层网络(10.20.1.0/24, fd20:1::/64)实现三节点互通

  • BGP 用于 VXLAN 网段路由通告

  • 数据包流向:

    • IPv4/IPv6 本地 veth <-> bridge <-> VXLAN <-> 对端 VXLAN

  • 静态路由用于 VXLAN 封装下一跳

  • BIRD 负责动态通告 VXLAN 子网到其它节点


2. 内核配置(每台节点执行)

# 开启 IPv4/IPv6 转发
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

# 确保 bridge vxlan 支持多播
sudo sysctl -w net.ipv6.conf.all.accept_ra=2
sudo sysctl -w net.bridge.bridge-nf-call-iptables=1
sudo sysctl -w net.bridge.bridge-nf-call-ip6tables=1

3. VXLAN + veth + bridge 配置(每台节点执行)

A 节点

# veth 本地
sudo ip link add vethA type veth peer name vethA-br
sudo ip link set vethA up
sudo ip link set vethA-br up
sudo ip addr add 10.10.1.1/24 dev vethA
sudo ip -6 addr add fd10:1::1/64 dev vethA

# bridge
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set vethA-br master br0

# VXLAN
sudo ip link add vxlan100 type vxlan id 100 dev eth0 \
    local 192.168.10.1 dstport 4789
sudo ip link set vxlan100 up
sudo ip addr add 10.20.1.1/24 dev vxlan100
sudo ip -6 addr add fd20:1::1/64 dev vxlan100
sudo ip link set vxlan100 master br0

# 静态路由 (VXLAN 封装下一跳)
sudo ip route add 192.168.10.2/32 dev eth0
sudo ip route add 192.168.10.3/32 dev eth0
sudo ip -6 route add <B IPv6>/128 dev eth0
sudo ip -6 route add <C IPv6>/128 dev eth0

B 节点

# veth 本地
sudo ip link add vethB type veth peer name vethB-br
sudo ip link set vethB up
sudo ip link set vethB-br up
sudo ip addr add 10.10.2.1/24 dev vethB
sudo ip -6 addr add fd10:2::1/64 dev vethB

# bridge
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set vethB-br master br0

# VXLAN
sudo ip link add vxlan100 type vxlan id 100 dev eth0 \
    local 192.168.10.2 dstport 4789
sudo ip link set vxlan100 up
sudo ip addr add 10.20.1.2/24 dev vxlan100
sudo ip -6 addr add fd20:1::2/64 dev vxlan100
sudo ip link set vxlan100 master br0

# 静态路由
sudo ip route add 192.168.10.1/32 dev eth0
sudo ip route add 192.168.10.3/32 dev eth0
sudo ip -6 route add <A IPv6>/128 dev eth0
sudo ip -6 route add <C IPv6>/128 dev eth0

C 节点

# veth 本地
sudo ip link add vethC type veth peer name vethC-br
sudo ip link set vethC up
sudo ip link set vethC-br up
sudo ip addr add 10.10.3.1/24 dev vethC
sudo ip -6 addr add fd10:3::1/64 dev vethC

# bridge
sudo ip link add br0 type bridge
sudo ip link set br0 up
sudo ip link set vethC-br master br0

# VXLAN
sudo ip link add vxlan100 type vxlan id 100 dev eth0 \
    local 192.168.10.3 dstport 4789
sudo ip link set vxlan100 up
sudo ip addr add 10.20.1.3/24 dev vxlan100
sudo ip -6 addr add fd20:1::3/64 dev vxlan100
sudo ip link set vxlan100 master br0

# 静态路由
sudo ip route add 192.168.10.1/32 dev eth0
sudo ip route add 192.168.10.2/32 dev eth0
sudo ip -6 route add <A IPv6>/128 dev eth0
sudo ip -6 route add <B IPv6>/128 dev eth0

4. BIRD BGP 配置(每台节点执行)

A 节点 /etc/bird/bird.conf

router id 10.10.1.1;

protocol kernel {
  persist;
  scan time 20;
  import all;
  export all;
}

protocol device {
  scan time 10;
}

protocol bgp B {
  local 10.10.1.1;
  neighbor 10.10.2.1 as 65002;
  ipv4 {
    import all;
    export all;
  };
  ipv6 {
    import all;
    export all;
  };
}

protocol bgp C {
  local 10.10.1.1;
  neighbor 10.10.3.1 as 65003;
  ipv4 { import all; export all; };
  ipv6 { import all; export all; };
}

B 节点 /etc/bird/bird.conf

router id 10.10.2.1;

protocol kernel { persist; scan time 20; import all; export all; }
protocol device { scan time 10; }

protocol bgp A { local 10.10.2.1; neighbor 10.10.1.1 as 65001; ipv4 { import all; export all; }; ipv6 { import all; export all; }; }
protocol bgp C { local 10.10.2.1; neighbor 10.10.3.1 as 65003; ipv4 { import all; export all; }; ipv6 { import all; export all; }; }

C 节点 /etc/bird/bird.conf

router id 10.10.3.1;

protocol kernel { persist; scan time 20; import all; export all; }
protocol device { scan time 10; }

protocol bgp A { local 10.10.3.1; neighbor 10.10.1.1 as 65001; ipv4 { import all; export all; }; ipv6 { import all; export all; }; }
protocol bgp B { local 10.10.3.1; neighbor 10.10.2.1 as 65002; ipv4 { import all; export all; }; ipv6 { import all; export all; }; }

5. 验证方法

# ping VXLAN IPv4/IPv6
ping 10.20.1.2
ping 10.20.1.3
ping6 fd20:1::2
ping6 fd20:1::3

# 查看 BGP 状态
birdc show protocols
birdc show route

# 查看 VXLAN 封装
sudo tcpdump -i eth0 udp port 4789

6. 常见坑/注意事项

项目说明
IPv6 转发 必须 sysctl net.ipv6.conf.all.forwarding=1
VXLAN dstport 默认 4789,三台节点必须一致
bridge FDB VXLAN 封装二层流量,需要 bridge fdb show 确认 MAC 学习
静态路由 VXLAN 封装下一跳必须存在
BGP ASN 每台节点 ASN 不同,邻居 IP 必须能互通
RA/IPv6 VXLAN IPv6 RA 必须被接受
数据包验证 tcpdump 可捕获 IPv4/IPv6 VXLAN 封装,确认入站/出站

7. 网络流量 ASCII 图

          IPv4/IPv6 双栈
         +----------------+
         |      A         |
         | 10.10.1.1/24   |
         | fd10:1::1/64   |
         +----+----+------+
              |vethA
              v
            +----+
            |br0 |
            +----+
              |
            vxlan100
              |
     +--------+--------+
     |                 |
 +---v---+         +---v---+
 |   B   |         |   C   |
 |10.10.2.1/24    10.10.3.1/24
 |fd10:2::1/64    fd10:3::1/64
 +-------+        +-------+

数据流向说明

  1. A -> B/C: A.vethA -> br0 -> vxlan100 -> eth0 -> B/C.vxlan100 -> br0 -> B/C.veth

  2. IPv4/IPv6 双栈通过 VXLAN 封装二层通信,BGP 用于路由通告 VXLAN 子网

  3. 返回流量: 对端 vxlan 接口解封装 -> bridge -> 本地 veth


 

posted on 2025-09-03 15:09  吃草的青蛙  阅读(3)  评论(0)    收藏  举报

导航