情况:
网络 A<-> 服务器<-> 客户端主机
我想允许客户端主机通过网桥访问网络 A,从而允许两个主机通过一个以太网连接访问网络 A。
这些都是物理设备,我使用的是 Linux/Ubuntu 机器。
所以我创建了一座桥,ntlbridge0
并将服务器上的两个以太网设备连接到它eth0
(连接到网络 A)和eth1
(连接到客户端)。
服务器和客户端都通过 DHCP 获取其 IP 地址。(由路由器通过 Mac 地址分配)
我应该如何设置此连接以便客户端可以从网络获取 DHCP 租约?
当客户端尝试连接时,它还没有 IP 地址,所以我不确定如何制定防火墙规则来允许来自的流量,eth1
而eth0
无需为 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,就几乎不可能知道发生了什么以及问题可能出在哪里。