这是我想要做的:
我有一堆系统,其中一些可能有相同的公共 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 已禁用
- 传入数据包至 IP 8.8.8.8 tcp 目标端口 100
- 传入数据包至 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(我认为)。