路由表中有两个相同的静态IP在networking上

我们需要一种在目标设备和networking之间插入设备的方式,理想情况下无需更改任何IP地址。

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

----------- ------------- | xxx5 | ----- | xxx10 | ----------- ------------- 

我们试图做的是插入一个带有两个networking接口的设备,而我们想要做的是安排这些IP,这样每一方都认为它正在与原始设备通话。 我们将负责将数据从一个接口移动到另一个接口。

 ----------- -------------------------------- ------------ | xxx5 | --- | eth0 xxx10 xxx5 eth1 |--- | xxx10 | ----------- -------------------------------- ------------ 

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

中间的框正在运行Linux。

您可以使用可在第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/

如果你只想进行数据包检测,比如IDS ,你可以使用例如snort 。 参见: http : //sublimerobots.com/2016/02/snort-ips-inline-mode-on-ubuntu/

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

这当然取决于你为什么需要在这个框之间。

目前还不清楚为什么你要把这些具体的地址给你的中间框。 如果您只需要将数据包传递到另一端,则不需要这样做,您可以使用桥接(或可选的proxy-arp)。

一个有效的用例,如果您希望将来自任一端的stream量定向到在中间框中本地运行的应用程序 ,可选地在另一端生成新的应用程序请求,在整个networking堆栈中上下移动(例如, userland HTTP代理)。 如果这是你想要的,继续阅读。

你不能像这样configuration中间的盒子,因为中间的盒子不能区分一方的本地接口和另一方的远程接口。

我尝试设置它的方式,将首先为中间框select两个新地址,将一侧分割成单独的子网。 例如xxx6/30 (即从中间的框中xxx6/30 .4和.7作为networking地址,并且允许远程侧的.5)以及xxx11作为另一侧。

接下来,通过将以下内容添加到您的接口启动脚本中,启用两个相关接口的代理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 xxx5 -d xxx10 -j DNAT --to-destination xxx6 iptables -t nat -A POSTROUTING -o eth0 -d xxx5 -s xxx6 -j SNAT --to-source xxx10 iptables -t nat -A PREROUTING -i eth1 -s xxx10 -d xxx5 -j DNAT --to-destination xxx11 iptables -t nat -A POSTROUTING -o eth1 -d xxx10 -s xxx11 -j SNAT --to-source xxx5 

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

  • 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请求
  • proxy-arp在eth1上启动,因为xxx5在eth0上可路由
  • 回复到中间框,eth1中的DNAT规则踢入,将目的地改写为xxx11
  • 本地应用程序处理响应,原始进程发出从xxx6到xxx5的响应
  • 针对eth0的SNAT规则将源地址更改为xxx10
  • 最终答复发给xxx5