连接我的 LAN 和 WAN(非 AP)接口的网络桥接的最佳方式是什么?

连接我的 LAN 和 WAN(非 AP)接口的网络桥接的最佳方式是什么?

我有此配置,将我的 LAN 和 WAN(非 AP)网络接口放在同一个网桥上,但我想知道是否有更好的方法?有人以更好的方式做到这一点吗?谢谢。

我仅在 Ubuntu 22.10 上Network Manager禁用和systemd-networkd启用了此功能进行测试。我这样做了这一部分:

sudo systemctl disable --now NetworkManager-dispatcher.service NetworkManager-wait-online.service NetworkManager.service
sudo systemctl enable --now systemd-networkd.service

安装一些软件包,您肯定需要iw它们bridge-utilsebtables它们是可选的,但对于故障排除等很有帮助。

sudo apt install bridge-utils ebtables iw

在下面的 netplan yaml 文件中:

  • 将 eth0 替换为您的 LAN 网络接口的名称。
  • 将 wlan0 替换为您的 LAN 网络接口的名称。有关网络接口名称,请参阅运行以下命令的输出:ip aip l

创造:/etc/netplan/02-bridge.yaml

内容:

network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
  wifis:
    wlan0:
      dhcp4: no
      access-points:
        "<your SSID>":
          password: "<your password>"
  bridges:
    br0:
      dhcp4: yes
      interfaces:
        - eth0
        - wlan0

将 systemd-networkd.service 单元文件复制到管理员可以覆盖单元文件的目录。编辑 /lib/systemd/system 下的单元文件并不安全,因为软件包更新可能会覆盖您的修改。这是设计使然。

sudo cp /lib/systemd/system/systemd-networkd.service /etc/systemd/system/systemd-networkd.service

然后编辑/etc/systemd/system/systemd-networkd.serviceExecStartPre在现有的上方添加一个ExecStart

$ diff -u /lib/systemd/system/systemd-networkd.service /etc/systemd/system/systemd-networkd.service
--- /lib/systemd/system/systemd-networkd.service    2022-09-20 11:19:06.000000000 -0400
+++ /etc/systemd/system/systemd-networkd.service    2022-10-09 20:48:35.657885031 -0400
@@ -23,6 +23,7 @@
 BusName=org.freedesktop.network1
 CapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE CAP_NET_BROADCAST CAP_NET_RAW
 DeviceAllow=char-* rw
+ExecStartPre=-/sbin/iw dev wlan0 set 4addr on
 ExecStart=!!/lib/systemd/systemd-networkd
 ExecReload=networkctl reload
 LockPersonality=yes

我这样做是因为iw ... 4addr在将 wlan0 接口添加到 br0 网桥之前必须执行打开 WDS 模式的操作,否则您会得到:

Oct 09 14:14:34 wookums systemd-networkd[2006]: wlan0: Failed to set master interface: Device does not allow enslaving to a bridge. Operation not supported

一旦启用 WDS(“4addr”)模式,该错误就不会再发生。

我尝试使用networkd-dispatcher它来设置 WDS(“4addr”)模式,但是在尝试将 wlan0 放入 br0 桥接后它启动了systemd-networkd,并且由于 WDS 尚未启用而失败。

systemd-networkd.service因为一行代码没有及时运行,所以在出现问题之前必须把它塞进去,这看起来真的很恶心。

除了使用 systemd 单元文件插入而不是将整个 systemd-networkd.service 复制到 /etc/systemd/system 中这一明显改进之外,还有什么更好的方法吗?

更新:

  • wpa_supplicant 使用 DHCP 连接到 AP;AP 是 DHCP 服务器,而 wlan0 是客户端。但是,wlan0 的 IP 地址(通过 DHCP 获取)似乎不可见,因为网桥从属设备没有分配 IP 地址,只有网桥本身有 IP 地址。br0 和 wlan0 接口不会有相同的 IP 地址;wlan0 接口将不可用,尽管brctl showip a等看起来正常。

感谢 KES

答案1

Linux 提供了多种配置网络接口的方法。每种方法都有自己的优点和缺点。每种方法都针对一组用例,当应用于其创建者未曾考虑的用例时,往往会变得难以处理。

旧的 sys5init up/down 脚本是最灵活的解决方案,因为您可以将所需的内容写入脚本中。但是,它们容易出错,而且对于非专家来说很复杂,因此不再受欢迎。另一方面,NetworkManager 试图自动化一切,以便用户不必考虑它,因此对于那些确切知道他们想要哪些设置的人来说,很难真正获得它们。Netplan 处于中间位置,可以轻松适应相当广泛的设置,但有些场景像您这样(在无线接口上设置 RDS/4 地址模式),它不在其能力范围内,所以您必须求助于脚本。

话虽如此,但创建自定义脚本还有另一种选择systemd-networkd.service。即按照以下说明创建 udev 规则https://superuser.com/questions/1601099/how-to-automatically-enable-wifi-4addr-wds-mode-before-connecting-to-specific在 SuperUser 上。那里提到的限制(不再能够连接到非 RDS WLAN)可能不会对您造成影响。

关于 DHCP 的说明:

桥接是一种第 2 层机制。两个桥接网络(LAN 和 WLAN)成为单个广播域,因此单个 DHCP 服务器将覆盖它们。您应该禁用 AP 中的 DHCP 服务器,因为一旦桥接启动,LAN DHCP 服务器也将向 WLAN 提供 IP 地址。

出于同样的原因,桥接器的成员接口不能也不需要单独的第 3 层配置(例如 IP 地址)。只有整个桥接器才具有第 3 层配置。您可以启用成员接口eth0,并仅通过第 2 层wlan0连接wlan0到 AP wpa_supplicant,而无需分配 IP 地址,只需借助dhcp*: nonetplan 配置中的行即可。然后将它们连接到桥接器。只有在完成此操作后,您才可以通过桥接器接口运行 DHCP,从服务于您的组合 LAN/WLAN 网络段的(一个)DHCP 服务器获取一个 IP 地址。

(理论上,您可以在桥接器中仅使用一个接口运行 DHCP,然后另一个接口在加入时共享获取的 IP 地址,但我建议不要这样做。)

相关内容