我们需要一种方法在目标设备和网络之间插入设备,最好不需要更改任何 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