网络上有两个相同静态 IP 的路由表

网络上有两个相同静态 IP 的路由表

我们需要一种方法在目标设备和网络之间插入设备,最好不需要更改任何 IP 地址。

目前的情况是(请原谅 ASCII 艺术)

-----------       -------------
| x.x.x.5 | ----- | x.x.x.10  |
-----------       -------------

我们试图插入一个具有两个网络接口的设备,我们希望安排 IP,以便每一端都认为它正在与原始设备通信。我们将负责将数据从一个接口移动到另一个接口。

-----------     --------------------------------    ------------
| x.x.x.5 | --- | eth0 x.x.x.10   x.x.x.5 eth1 |--- | x.x.x.10 |
-----------     --------------------------------    ------------

有没有办法设置路由表,使得来自 eth0 的 xxx10 请求从 eth1 发出,而通过 eth1 到达的 xxx5 请求从 eth0 发出?

中间的盒子运行的是Linux。

答案1

您可以使用可以在第 2 层工作的 VPN(如 OpenVPN 以太网桥接)来实现此目的。请参阅https://openvpn.net/index.php/open-source/documentation/miscellaneous/76-ethernet-bridging.html

另一种方法是使用 MPLS 隧道。请参阅:http://blog.ine.com/2010/08/26/mpls-tunnels-explained/

如果你只想要数据包检查,比如入侵检测系统,例如,你可以使用呼噜。 看:http://sublimerobots.com/2016/02/snort-ips-inline-mode-on-ubuntu/

答案2

也许您可以使用 bridge-utils 配置网桥。这样您甚至不需要在中间框上配置那些 IP 地址。

这当然取决于为什么需要在中间放置这个盒子。

答案3

不清楚你为什么要将这些特定地址提供给中间盒子。如果你只需要将数据包传递到另一端,则不需要这样做,你可以使用桥接(或可选的代理 arp)。

如果您希望从任一端引导流量,则有一个有效的用例到中间盒子本地运行的应用程序,可选择在另一端生成新的应用程序请求,遍历整个网络堆栈(例如,用户空间 HTTP 代理)。如果这是您想要的,请继续阅读。

您不能按原样配置中间盒,因为中间盒将无法区分一侧的本地接口和另一侧的远程接口。

我尝试设置的方法是,首先为中间的盒子选择两个新地址,将一侧分成一个单独的子网。例如x.x.x.6/30(从中间的盒子阻止 .4 和 .7 作为网络地址,并允许 .5 作为远程端)和x.x.x.11另一侧。

接下来,通过在接口启动脚本中添加以下内容,为两个相关接口启用代理 ARP:

 echo 1 >/proc/sys/net/ipv4/conf/eth0/proxy_arp

对于 eth0,以及

 echo 1 >/proc/sys/net/ipv4/conf/eth0/proxy_arp

对于 eth1。如果盒子上没有其他接口,您也可以使用all而不是接口名称。这将导致您的中间盒子现在将使用自己的 MAC 地址来响应针对另一侧已知可路由地址的 arp 请求。

接下来,使用以下四个 NAT 规则使该框不可见:

iptables -t nat -A PREROUTING -i eth0 -s x.x.x.5 -d x.x.x.10 -j DNAT --to-destination x.x.x.6
iptables -t nat -A POSTROUTING -o eth0 -d x.x.x.5 -s x.x.x.6 -j SNAT --to-source x.x.x.10
iptables -t nat -A PREROUTING -i eth1 -s x.x.x.10 -d x.x.x.5 -j DNAT --to-destination x.x.x.11
iptables -t nat -A POSTROUTING -o eth1 -d x.x.x.10 -s x.x.x.11 -j SNAT --to-source x.x.x.5

这样,你就可以在内部使用不同的地址来识别中间盒的接口,但它们不会出现在外部。该过程将如下所示:

  • xxx5 向 xxx10 发出直接 ARP 请求。此请求到达 eth0 上的中间盒。
  • 中间的盒子注意到 xxx10 在 eth1 上可路由,因此用自己的 MAC 地址应答
  • 发往 xxx10 的 IP 数据包被传送到 eth0 上的中间盒
  • PREROUTING eth0 中的 DNAT 规则启动并将目标重写为 xxx6
  • 本地应用程序处理对 xxx6 的请求,向 xxx10 发出单独请求,该请求被路由到 eth1
  • POSTROUTING eth1 中的 SNAT 规则启动,将源地址更改为 xxx5
  • xxx10 看到来自 xxx5 的中间框请求。
  • xxx10 想要回复,为 xxx5 发出 ARP 请求
  • 由于 xxx5 在 eth0 上可路由,因此代理 arp 在 eth1 上启动
  • 回复到达中间的盒子,eth1 中的 DNAT 规则开始生效,将目的地重写为 xxx11
  • 本地应用处理响应,原进程发出xxx6到xxx5的响应
  • eth0 的 SNAT 规则生效,将源地址更改为 xxx10
  • 最终回复已发给 xxx5

相关内容