如何强制数据包通过仅知道目标 MAC 的特定物理接口?

如何强制数据包通过仅知道目标 MAC 的特定物理接口?

我正在创建一个 L3 交换机,通过将其中一些数据包重定向到本地应用程序来修改数据包。我的目标是将它们进一步发送到与以前相同的 MAC。

简短的“为什么”:零配置设备,可连接到任何以太网、便携式、进行代理。

交换机被组织为 eth0 和 eth1 之间的以太网桥 (br-lan)。默认情况下,假定 br-lan 客户端的网关位于 eth0。

问题:假设数据包来自 eth1,前往 eth0,并被重定向到本地应用程序。该应用程序输出后,原始数据包的目标 IP 已更改。 L3 尝试将数据包路由到新的目的地,但它没有任何默认网关(而且它不应该,因为它是交换机!)。假设我知道默认网关的 MAC 地址,如何强制数据包通过 eth0 发送到特定的 MAC 地址?

从技术上讲,我并不想在网络方面做任何“非法”的事情。我想将数据包从 eth0 中踢出,而我“丢失”的只是目标 MAC,但我可以从原始数据包中检索它。我确信目标 IP 不是本地的,因此无论如何都会使用它的 MAC 地址将其发送到默认网关。所以这是一个执行的问题。

我试图通过执行以下操作来修改bridge -t NAT OUTPUT处的目标MAC:

ebtables -t nat -A 输出 -p ipv4 --ip-proto tcp --ip-src 192.168.1.251 -j dnat --to-dst 04:61:e7:d2:e2:09

但这没有帮助。 (假设 04:61:e7:d2:e2:09 是默认网关 MAC,192.168.1.251 是客户端之一,只是为了测试这一理论)

实际实现是在 OpenWRT 上进行的,因此可用的软件包可能会受到限制。

我是如何遇到这个问题的:

有关本地应用程序的更多信息:这里是 ss-redir,绑定到 0.0.0.0:port =>https://github.com/shadowsocks/shadowsocks-libev

向[设备]添加了用例:

预期:我们有 3 个 PC 客户端连接到常规交换机。携带[设备]并将其连接到常规交换机并将PC客户端重新连接到[设备]后,PC客户端无需配置设备即可获得[结果]。

[结果]:

1)从“外部”(除我们的 3 个网络节点和其他所有节点之外的其他网络节点)看来,每个用户都应该保留他的 IP/MAC 对,这样管理员会很高兴。 DHCP 在办公室中是静态配置的,因此 IP/MAC 对可能不会更改,但管理员可以更改其中任何一项。并且设备应该处理任何更改,而无需手动重新配置。网络中不应出现新的 IP/MAC(未经管理员注册)。

2) 从“外部”来看,每个 PC 客户端都应该可以访问网络中的所有协议,无论它们是什么(RDP、用于命名解析的 NetBIOS、文件共享或本地管理员决定执行的任何操作)。

3)他们应该一如既往地通过默认网关访问互联网,除了通过 SS 为特定目标 ipset 代理 tcp(始终通过相同的网关)

假设这些用例要求设备从一开始就没有现有网络的任何 IP/MAC 知识(因为办公室用户不会自己配置任何内容),我正在尝试制作像交换机一样工作的“代理桥” ,拦截数据包并在本地应用程序重定向后将其发送到 eth0(WAN)。问题是重定向后的数据包需要按其方式发送。我正在研究使用 MAC-snat/dnat 的“动态自动重新配置想法”,但遇到了这样的问题:即使我可以在 ebtables 中指定默认网关 MAC-addr,数据包在本地生成后也不会转到 eth0作为目的地。

答案1

让我猜测一些“原始任务X”。这些可能与您最初的任务 X 不匹配,但它们可能会让您了解需要什么类型的信息。

1) 该设备是一个普通的现成家用路由器,在 外部交换机后面有四个 LAN 端口eth0,在 处有一个 WAN 端口eth1。 WAN 端口连接到您的本地网络网关。所有应使用透明代理的主机都连接到 LAN 端口,可能还带有附加交换机。没有其他主机或连接到 LAN 端口。另一个袜子端点位于 WAN 侧。

在这种情况下,请忘记级别 2,使用iptables中描述的规则man ss-雷迪尔,只适应于NAT上eth0。路由将把代理的 SOCKS 请求发送出去eth1。 NAT 将负责将任何答案发送回eth0, 到具有正确 IP 的设备。 ARP 将确保使用该 IP 的 MAC。

2) 上述的变体:连接到 LAN 端口的某些主机应该使用代理,有些则不应该。在这种情况下,仔细看看硬件,它可能有一个可以配置的交换芯片sw-conf。重新配置它,使两个 LAN 端口连接到eth0,另外两个连接到eth2。然后按照上面的方法进行。根据需要将主机连接到正确的 LAN 端口。

3) 该设备在更复杂的网络配置中用作简单的网桥,其中另一个 SOCKS 端点与应使用代理的主机位于同一内部 LAN 网段。在这种情况下,我需要网络的描述。

等等,页。

编辑

如果我正确地阅读了您的用例,您的主要问题是您必须将 WAN 端口(eth0)桥接到 LAN 端口(eth1),因为 DHCP 服务器位于 WAN 端口后面,并且它应该管理 IP 的静态分配正确通过 DHCP。

在这种情况下,我会将桥配置为“布劳特”:一切都被桥接,除了到达 LAN (eth1) 的数据包应该被代理(TCP 和在所需的目标 IP 范围内)。这些数据包br-lan将从网桥的内部端口发出。在那里,第 3 层处理可以如上所述处理它们。特别是,连接跟踪器可以通过 IP 和端口跟踪它们,并且可以将应答从袜子代理发送回正确的设备。

无需MAC NAT,无需与L5配合的基于MAC的连接跟踪等。

我本来想用一些网络命名空间来尝试一下,这样我就可以给出整个配方,但不幸的是我今天或接下来的几天没有时间这样做。

答案2

我找到了肮脏的解决方案。

如果我们忘记 X 上下文并深入研究 Y 问题,那么我们会发现以下内容。

这个想法是,在将数据包重定向到本地应用程序之前,我可以记录它然后解析。数据包从 eth1 到 eth0 到达默认网关的过程如下所示:

(CLIENT1_SRC_IP、CLIENT1_SRC_MAC、DEST_IP_ADDR_TO_PROXY、DF_GW_MAC)

但通过本地应用程序后,它陷入这种状态:

((!)CLIENT1_SRC_IP、(!)CLIENT1_SRC_MAC、SS_SERVER) 和 DF_GW_MAC 即将进行 ARP 解析(并且失败,因为没有 SS_SERVER 邻居以及默认网关本身,因此数据包无处可去)。

所以我决定利用 SS_SERVER 是一个 const IP 地址这一事实。可以解析日志中的 DF_GW_MAC,然后用于为 SS_SERVER IP 添加静态 arp 路由。

OpenWRT 用户的一些细节:

要使 ip neigh 正常工作:

opkg更新

opkg 安装 ip-full

进而:

ip neigh add 123.123.123.123 dev eth0 lladdr 11:22:33:44:55:66

ip 路由添加默认 dev eth0

那么Y问题到这里就解决了。 X 没有完全解决,因为上面我指定的(!)它不是真的,因为本地应用程序使用接口 IP 为您做了 MASQUARADE,所以您必须将其 SNAT 回原始源 IP,这也是脏的。我目前没有看到任何其他选择。

相关内容