我们需要一种在目标设备和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
这样,你可以在内部使用不同的地址来识别你的中间盒子的接口,但是它们不会出现在外面。 该过程将如下所示: