You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Ubuntu 22.04下基于WireGuard+VXLAN实现固定IP遗留设备跨网广播通信的配置咨询

Ubuntu 22.04下基于WireGuard+VXLAN实现固定IP遗留设备跨网广播通信的配置咨询

嘿,你这个思路其实是对的——用WireGuard打通跨公网的三层隧道,再叠加VXLAN来透传二层广播流量,完美适配遗留设备必须固定IP且依赖广播的需求!不过看你的Netplan配置,确实有几个关键细节没处理好,我帮你捋清楚并修正:

核心问题梳理

  1. VXLAN与网桥的绑定逻辑错误
    你当前的配置里重复给VXLAN指定了link: enp4s0link: br0,正确的做法应该是把VXLAN接口作为成员加入网桥,让网桥同时包含本地遗留设备的物理网卡(enp4s0)和跨网的VXLAN隧道接口,这样二层流量才能在本地设备和远端设备之间转发。

  2. VXLAN地址配置冗余且冲突
    你给VXLAN0配置了和网桥br0相同的192.168.0.x网段地址,这会导致同一主机上的二层接口IP冲突。实际上VXLAN作为网桥的成员接口,不需要单独配置该网段地址,只需要透传二层帧即可,地址配置只需要在网桥上做。

  3. WireGuard路由与VXLAN绑定对象错误

    • 两台主机的网桥br0里都添加了默认路由via:10.0.0.x,这会把所有流量(包括上网流量)都往WireGuard隧道发,而你本来是想让enp1s0走互联网的,这个默认路由必须删掉。
    • VXLAN应该绑定在WireGuard接口(wg0)上,而不是物理网卡或网桥,这样VXLAN的流量才能通过WireGuard隧道跨网传输。
  4. VXLAN的local/remote参数配置错误
    第一台主机的VXLAN local参数填了10.0.0.2(对方的WireGuard IP),这明显搞错了——local应该填自己的WireGuard内网IP,remote填对方的WireGuard内网IP。

修正后的Netplan配置示例

第一台主机(对应遗留设备192.168.0.1)

network:
  version: 2
  renderer: networkd
  ethernets:
    enp1s0:
      dhcp4: true  # 互联网接口,自动获取IP
    enp4s0: {}     # 连接本地遗留设备的网卡,不单独配IP
  bridges:
    br0:
      interfaces:
        - enp4s0   # 本地遗留设备网卡加入网桥
        - vxlan0   # VXLAN隧道接口加入网桥
      addresses: [192.168.0.1/24]  # 网桥配置遗留网段IP
      parameters:
        stp: false
        forward-delay: 0
  tunnels:
    wg0:
      mode: wireguard
      port: 51820
      addresses: [10.0.0.1/24]  # WireGuard内网IP
      peers:
        - public-key: "your_peer_public_key_here"
          allowed-ips: [10.0.0.0/24, 192.168.0.0/24]  # 允许WireGuard网段和遗留网段的流量
          endpoint: "[hostname]:51820"  # 替换成对方的公网主机名/IP
          persistent-keepalive: 25  # 防止NAT超时,保持隧道连通
    vxlan0:
      mode: vxlan
      id: 100  # 两端VXLAN ID必须一致
      local: 10.0.0.1  # 自己的WireGuard内网IP
      remote: 10.0.0.2  # 对方的WireGuard内网IP
      port: 4789
      link: wg0  # VXLAN绑定到WireGuard接口

第二台主机(对应遗留设备192.168.0.5)

network:
  version: 2
  renderer: networkd
  ethernets:
    enp1s0:
      dhcp4: true
    enp4s0: {}
  bridges:
    br0:
      interfaces:
        - enp4s0
        - vxlan0
      addresses: [192.168.0.5/24]
      parameters:
        stp: false
        forward-delay: 0
  tunnels:
    wg0:
      mode: wireguard
      port: 51820
      addresses: [10.0.0.2/24]
      peers:
        - public-key: "your_peer_public_key_here"
          allowed-ips: [10.0.0.0/24, 192.168.0.0/24]
          endpoint: "[hostname]:51820"  # 替换成对方的公网主机名/IP
          persistent-keepalive: 25
    vxlan0:
      mode: vxlan
      id: 100
      local: 10.0.0.2  # 自己的WireGuard内网IP
      remote: 10.0.0.1  # 对方的WireGuard内网IP
      port: 4789
      link: wg0

额外必做配置

  1. 开启IP转发
    执行以下命令临时开启,然后写入配置文件永久生效:

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

    编辑/etc/sysctl.conf,确保以下两行没有被注释:

    net.ipv4.ip_forward=1
    net.ipv6.conf.all.forwarding=1
    
  2. 调整防火墙规则
    允许WireGuard和VXLAN的UDP流量通过,并开启转发:

    sudo ufw allow 51820/udp
    sudo ufw allow 4789/udp
    

    编辑/etc/ufw/sysctl.conf,开启IP转发,然后重启ufw:

    sudo systemctl restart ufw
    
  3. 应用配置并测试
    修改完Netplan后,执行以下命令应用配置:

    sudo netplan generate
    sudo netplan apply
    

    可以用tcpdump在br0接口抓包,验证遗留设备的广播包是否能通过VXLAN/WireGuard传到对方主机:

    sudo tcpdump -i br0 broadcast
    

备注:内容来源于stack exchange,提问作者cadre

火山引擎 最新活动