我希望设置一个模拟器,使其模拟的以太网接口像连接到我的 LAN 的真实以太网接口一样工作。在此示例中,我将使用地址 192.168.120.6 作为运行模拟器的 Linux 主机,并使用 192.168.120.19 作为模拟器。 (出于好奇,模拟器将是 Hercules,带有在第 2 层模式下运行的 QETH 适配器,因此它将使用 TAP 接口。)我希望来自真实线路的任何数据包都发送到模拟器,以及模拟器发送的任何数据包去电线。我还希望能够从运行模拟器的主机连接到模拟器。
这看起来像是 TAP 设备和网桥的工作。因此,我创建了一个持久的 TAP 接口tunctl
并告诉模拟器使用它。然后我用 建立了一个桥,用和brctl addbr br0
向其中添加了 TAP 设备和以太网设备,生活应该很好,对吧?brctl addif br0 tap0
brctl addif br0 enp4s0
只有一个问题:当我执行此操作时brctl addif br0 enp4s0
,我的路由表被搞砸了,我无法再在真实线路上进行通信。真实接口和网桥上都有默认路由和到网关的路由,现在内核无法决定将帧发送到 LAN 的何处。
我不是在这里寻找路由。我想要一个第 2 层桥接器,并且模拟计算机可以像真实计算机一样执行自己的 ARPing。内核的路由表甚至不应该参与其中。我哪里错了?
编辑:主机是运行 Pop!_OS 20.10(Ubuntu 衍生版本)的 System76 Oryx Pro。最终,我还想在运行以前称为 Raspbian 的系统的 Raspberry Pi 上执行此操作。我使用这些系统上的默认网络配置包,但如果需要使其工作,我愿意安装其他包 - 但我宁愿使用现有的东西。
编辑2按照要求:
(2061) jmaynard@wakko:/etc$ systemctl status systemd-networkd
● systemd-networkd.service - Network Service
Loaded: loaded (/lib/systemd/system/systemd-networkd.service; disabled; ve>
Active: inactive (dead)
TriggeredBy: ● systemd-networkd.socket
Docs: man:systemd-networkd.service(8)
(2062) jmaynard@wakko:/etc$ systemctl status NetworkManager
● NetworkManager.service - Network Manager
Loaded: loaded (/lib/systemd/system/NetworkManager.service; enabled; vendo>
Active: active (running) since Thu 2021-02-04 15:02:50 CST; 1h 14min ago
Docs: man:NetworkManager(8)
Main PID: 889 (NetworkManager)
Tasks: 3 (limit: 38216)
Memory: 15.7M
CGroup: /system.slice/NetworkManager.service
└─889 /usr/sbin/NetworkManager --no-daemon
Feb 04 15:02:54 wakko NetworkManager[889]: <info> [1612472574.8311] dhcp6 (enp>
Feb 04 15:02:54 wakko NetworkManager[889]: <warn> [1612472574.8312] device (en>
Feb 04 15:03:02 wakko NetworkManager[889]: <info> [1612472582.6467] agent-mana>
Feb 04 15:03:34 wakko NetworkManager[889]: <info> [1612472614.5986] policy: se>
Feb 04 15:03:47 wakko NetworkManager[889]: <info> [1612472627.4148] policy: se>
Feb 04 15:13:53 wakko NetworkManager[889]: <info> [1612473233.0786] policy: se>
Feb 04 15:15:20 wakko NetworkManager[889]: <info> [1612473320.4621] policy: se>
Feb 04 15:16:02 wakko NetworkManager[889]: <info> [1612473362.0738] policy: se>
Feb 04 15:54:40 wakko NetworkManager[889]: <info> [1612475680.1599] agent-mana>
Feb 04 16:11:37 wakko NetworkManager[889]: <info> [1612476697.9046] policy: se>
(2063) jmaynard@wakko:/etc$ nmcli
enp4s0: connected to Wired connection 1
"Realtek RTL8111/8168/8411"
ethernet (r8169), 80:FA:5B:66:A7:72, hw, mtu 1500
ip4 default, ip6 default
inet4 192.168.120.6/24
inet4 192.168.120.132/24
route4 192.168.120.0/24
route4 0.0.0.0/0
inet6 2001:48f8:7032:13a:7c00:8452:ce3f:9534/64
inet6 2001:48f8:7032:13a:9a29:6d38:c636:307/64
inet6 2001:48f8:7032:13a:ad68:dad3:227a:b804/64
inet6 2001:48f8:7032:13a:3adb:958b:61fb:82db/64
inet6 fe80::ea05:da80:dfa4:2978/64
route6 2001:48f8:7032:13a::/64
route6 ::/0
route6 2001:48f8:7032:13a::/64
route6 fe80::/64
route6 fe80::/64
route6 ::/0
route6 ff00::/8
wlp3s0: unavailable
"Intel 8265 / 8275"
wifi (iwlwifi), 74:70:FD:F2:0C:B0, sw disabled, hw, mtu 1500
lo: unmanaged
"lo"
loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536
DNS configuration:
servers: 192.168.120.1
interface: enp4s0
servers: 2001:48f8:7032:13a:21b:78ff:fec3:851e
domains: conmicro.com
interface: enp4s0
Use "nmcli device show" to get complete information about known devices and
"nmcli connection show" to get an overview on active connection profiles.
Consult nmcli(1) and nmcli-examples(7) manual pages for complete usage details.
(2064) jmaynard@wakko:/etc$
我不知道为什么会有那个额外的IP地址enp4s0
。dhcpcd
尽管我已经为该接口关闭了 DHCP,但我还是觉得有必要尝试获取它的地址。到目前为止,它抵制了所有摆脱它的尝试。
答案1
首先,决定使用什么网络管理器非常重要。例如,在 Debian 上,您可以使用 systemd-networkd、networking 和 NetworkManager。这些工具通常并不相互排斥,但在使用不同工具操作多个接口时,您必须小心并指定哪个工具管理某些接口。
NetworkManager 附带命令行工具 nmcli 和 nmtui。后一种使您能够在用户友好的环境中设置界面。
我不确定 Hercules 是如何工作的,但你可以尝试设置macvtap,以便虚拟化环境能够访问物理适配器。这种方法不会在主机和赫拉克勒斯之间提供联系。为此,您可以创建一个隔离的本地网络,在其中插入主机和 Hercules。
您可以在以下位置找到有关 macvatap 的更多信息红帽网站。
如果您分享更多详细信息,例如您正在运行的系统或您使用的网络工具,我们也许能够提供更详细的指南。
编辑:由于我们获得了新的信息——系统是Pop! -- 看来你可以使用 systemd-networkd 配置来实现网络设置文件。这个想法似乎是正确的。我看到的唯一问题是,您在使用部署了 systemd-networkd 的系统时,从网络中选择了 brctl 等工具。您当然可以使用这两个网络系统,但如果不适当注意,您可能会遇到配置冲突。
编辑2:brctl 是称为网络的“旧网络系统”的一部分。基本上,有几个网络工具包可让您在 Linux 中设置网络。我已经提到过网络、NetworkManager 和 systemd-networkd。除非您确定知道如何组合它们,否则请尝试将所有设置保留在一种类型的网络工具中。
我应该写“你的系统使用什么样的网络工具”;很明显你使用了brctl...