Linux:将两个以太网连接桥接在一起,以允许第二个主机接入第一个网络

Linux:将两个以太网连接桥接在一起,以允许第二个主机接入第一个网络

情况:

网络 A<-> 服务器<-> 客户端主机

我想允许客户端主机通过网桥访问网络 A,从而允许两个主机通过一个以太网连接访问网络 A。

这些都是物理设备,我使用的是 Linux/Ubuntu 机器。

所以我创建了一座桥,ntlbridge0并将服务器上的两个以太网设备连接到它eth0(连接到网络 A)和eth1(连接到客户端)。

服务器和客户端都通过 DHCP 获取其 IP 地址。(由路由器通过 Mac 地址分配)

我应该如何设置此连接以便客户端可以从网络获取 DHCP 租约?

当客户端尝试连接时,它还没有 IP 地址,所以我不确定如何制定防火墙规则来允许来自的流量,eth1eth0无需为 ufw/iptables 提供要伪装或转发的 IP 地址。

理想情况下,我希望服务器和客户端都在同一级别对网络 A 可见。(每个都应该有自己的 IP,因此网络管理员的“共享 Internet”将不起作用。)并且客户端的 MAC 地址应该对网络可见(以便它从路由器获取正确的 IP。

我之前曾让它工作过(现在我不确定),但现在即使我禁用防火墙并重新创建连接后,它仍然无法工作。

更多细节:

  • 使用网络管理器管理上述所有设备
  • 出于安全考虑,两台主机上都应启用 UFW
  • 我在服务器和客户端之间使用了跳线(这还有关系吗?)
  • 所有服务器连接均运行良好,并且客户端在未通过服务器桥接时也能正确连接。

在服务器上:

路线
内核 IP 路由表
目标网关 Genmask 标志 指标参考使用 Iface
默认 192.168.10.1 0.0.0.0 UG 426 0 0 ntlbridge0
192.168.10.0 * 255.255.255.0 U 425 0 0 ntlbridge0
192.168.10.0 * 255.255.255.0 U 426 0 0 ntlbridge0

nmcli 开发状态
设备类型状态连接
ntlbridge0 桥接桥接ntl
enp1s0f0 以太网连接 ntlbridge0 从属 enp1s0f0
enp1s0f1 以太网连接 ntlbridge0 从属 enp1s0f1

要求提供更多信息:

ip 链接显示
1:lo:mtu 65536 qdisc 无队列状态未知模式默认组默认 qlen 1
    链路/环回 00:00:00:00:00:00 brd 00:00:00:00:00:00
2:enp1s0f0:mtu 1500 qdisc mq master ntlbridge0 状态 UP 模式 DEFAULT 组默认 qlen 1000
    链接/以太 d0:27:xx:xx:xx:40 brd ff:ff:ff:ff:ff:ff
3:enp1s0f1:mtu 1500 qdisc mq master ntlbridge0 状态 UP 模式 DEFAULT 组默认 qlen 1000
    链接/以太 d0:27:xx:xx:xx:41 brd ff:ff:ff:ff:ff:ff
9:ntlbridge0:mtu 1500 qdisc 无队列状态 UP 模式 DEFAULT 组默认 qlen 1000
    链接/以太 d0:27:xx:xx:xx:40 brd ff:ff:ff:ff:ff:ff

ip 地址显示
1:lo:mtu 65536 qdisc 无队列状态未知组默认 qlen 1
    链路/环回 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 范围主机 lo
       valid_lft 永远 preferred_lft 永远
    inet6 ::1/128 范围主机
       valid_lft 永远 preferred_lft 永远
2:enp1s0f0:mtu 1500 qdisc mq master ntlbridge0 状态 UP 组默认 qlen 1000
    链接/以太 d0:27:xx:xx:xx:40 brd ff:ff:ff:ff:ff:ff
3:enp1s0f1:mtu 1500 qdisc mq master ntlbridge0 状态 UP 组默认 qlen 1000
    链接/以太 d0:27:xx:xx:xx:41 brd ff:ff:ff:ff:ff:ff
9:ntlbridge0:mtu 1500 qdisc 无队列状态 UP 组默认 qlen 1000
    链接/以太 d0:27:xx:xx:xx:40 brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.67/24 brd 192.168.10.255 范围全局动态 ntlbridge0
       valid_lft 50187秒 preferred_lft 50187秒
    inet6 2601:844:4000:xxx:xxx:xxxx:xxxx:ac61/64 范围全局 noprefixroute 动态
       valid_lft 2367 秒 preferred_lft 2367 秒
    inet6 fe80::1e94:xxxx:xxxx:77ba/64 范围链接
       valid_lft 永远 preferred_lft 永远

ip 路由显示
默认通过 192.168.10.1 dev ntlbridge0 proto static metric 425
172.17.0.0/16 dev docker0 proto 内核范围链接 src 172.17.0.1 linkdown
192.168.10.0/24 dev ntlbridge0 proto 内核范围链接 src 192.168.10.67 度量 425
192.168.10.0/24 dev ntlbridge0 proto 内核范围链接 src 192.168.10.67 度量 426
192.168.122.0/24 dev virbr0 proto 内核范围链接 src 192.168.122.1 linkdown

brctl 显示
桥名称 桥 ID STP 启用接口
docker0 8000.0242910e3b7a 没有      
ntlbridge0 8000.d027xxxxxx40 是 enp1s0f0
                                enp1s0f1

答案1

那么,现代内核中的桥接有一件有趣的事情……你告诉内核通过 iptables 发送通过网桥的数据包​​,并且它们的处理方式与在第 3 层转发的数据包完全相同。您很少真正需要这样做,但某些发行版或内核版本或某些东西默认启用该功能(可能是为了安全,如果令人沮丧,这是可以理解的)。

检查 sysctls 的值/proc/sys/net/bridge/bridge-nf-call-*;如果其中任何一个为1,则相应的过滤系统正在用于匹配数据包(iptables对于 IPv4 数据包,ip6tables对于 IPv6 数据包)。将它们设置为0以关闭该功能,您可能会看到令人欣喜的改进。

您的问题中确实没有足够的信息来确定到底发生了什么,但是bridge-nf-call-*当桥接出现问题时,我首先会查看 sysctl。

除此之外,如果没有对所有涉及的接口进行 pcap,就几乎不可能知道发生了什么以及问题可能出在哪里。

相关内容