基于MAC地址的路由

基于MAC地址的路由

这是我想要做的:

我有一堆系统,其中一些可能有相同的公共 IP,我禁用了 ARP。这些系统和互联网之间有一个防火墙(IP 层或桥接防火墙)。根据传入到这些公共 IP 的 IP 数据包的目标端口,我想设置目标以太网地址。例如

系统 A 的 IP 为 8.8.8.8,mac de:ad:be:ef:de:ad,arp 已禁用 系统 B 的 IP 为 8.8.8.8,mac 1f:1f:1f:1f:1f:1f,arp 已禁用

防火墙的 IP 为 8.8.8.1,该接口上的 arp 已禁用

  1. 传入数据包至 IP 8.8.8.8 tcp 目标端口 100
  2. 传入数据包至 IP 8.8.8.8 tcp 目标端口 101

防火墙将目标 mac 设置为 1.) -> de:ad:be:ef:de:ad 防火墙将目标 mac 设置为 2.) -> 1f:1f:1f:1f:1f:1f

第二种情况:

系统 A 和系统 B 建立传出 TCP 连接,防火墙将传入 IP 数据包(响应数据包)的目标 mac 与发送方 mac 地址进行匹配。

使用 linux 和 iptables 可以实现这个吗?

编辑:我读到 ebtables 可能以一种黑客的方式“工作”以实现此目的,但我不确定......

答案1

您尝试执行的操作称为端口转发,通常通过 NAT 完成。(公共 IP 上的传入流量将根据其到达的端口转发到不同的私有 IP。)

通过 MAC 地址执行此操作似乎有点不必要。

答案2

为什么要这么复杂?安装一个代理或负载均衡器(如 haproxy),然后在第 3 层执行所有操作。

答案3

对您来说,一种可能有效的方法是使用 iptables 中的第 n 个模块。我还没有测试过,但理论上您应该能够做到这一点。

例如:

将对端口 100 的请求进行负载平衡到 2 台内部服务器。

iptables -A PREROUTING -i eth0 -p tcp --dport 100 -m state --state NEW -m nth --counter 0 --every 2 --packet 0 -j DNAT --to-destination 192.168.1.1:100

iptables -A PREROUTING -i eth0 -p tcp --dport 100 -m state --state NEW -m nth --counter 0 --every 2 --packet 1 -j DNAT --to-destination 192.168.1.2:100

顺便说一句,如果您愿意,防火墙仍然可以有 8.8.8.1 地址,也可以有 8.8.8.8。您可以编写 NAT 规则,以便来自防火墙的服务器的流量将使用 8.8.8.8 作为其来源。防火墙后面的任何其他流量都可以使用 8.8.8.1 作为来源。

类似下面的方法可能会有效。

iptables -t nat -A POSTROUTING -s 192.168.1.0/30 -o eth0 -j SNAT --to-source 8.8.8.8

仅允许 192.168.1.0 - 192.168.1.3 之间的 IP。即您的服务器

对于网络的其余部分

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 8.8.8.1

是的,我知道,30 范围在 24 范围内。iptables 将命中第一条规则并 NAT 到 8.8.8.8(我认为)。

相关内容