Ubuntu 22.04下基于WireGuard+VXLAN实现固定IP遗留设备跨网广播通信的配置咨询
嘿,你这个思路其实是对的——用WireGuard打通跨公网的三层隧道,再叠加VXLAN来透传二层广播流量,完美适配遗留设备必须固定IP且依赖广播的需求!不过看你的Netplan配置,确实有几个关键细节没处理好,我帮你捋清楚并修正:
核心问题梳理
VXLAN与网桥的绑定逻辑错误
你当前的配置里重复给VXLAN指定了link: enp4s0和link: br0,正确的做法应该是把VXLAN接口作为成员加入网桥,让网桥同时包含本地遗留设备的物理网卡(enp4s0)和跨网的VXLAN隧道接口,这样二层流量才能在本地设备和远端设备之间转发。VXLAN地址配置冗余且冲突
你给VXLAN0配置了和网桥br0相同的192.168.0.x网段地址,这会导致同一主机上的二层接口IP冲突。实际上VXLAN作为网桥的成员接口,不需要单独配置该网段地址,只需要透传二层帧即可,地址配置只需要在网桥上做。WireGuard路由与VXLAN绑定对象错误
- 两台主机的网桥br0里都添加了默认路由
via:10.0.0.x,这会把所有流量(包括上网流量)都往WireGuard隧道发,而你本来是想让enp1s0走互联网的,这个默认路由必须删掉。 - VXLAN应该绑定在WireGuard接口(wg0)上,而不是物理网卡或网桥,这样VXLAN的流量才能通过WireGuard隧道跨网传输。
- 两台主机的网桥br0里都添加了默认路由
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
额外必做配置
开启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调整防火墙规则
允许WireGuard和VXLAN的UDP流量通过,并开启转发:sudo ufw allow 51820/udp sudo ufw allow 4789/udp编辑
/etc/ufw/sysctl.conf,开启IP转发,然后重启ufw:sudo systemctl restart ufw应用配置并测试
修改完Netplan后,执行以下命令应用配置:sudo netplan generate sudo netplan apply可以用
tcpdump在br0接口抓包,验证遗留设备的广播包是否能通过VXLAN/WireGuard传到对方主机:sudo tcpdump -i br0 broadcast
备注:内容来源于stack exchange,提问作者cadre




