我正在尝试构建一个仿真平台,用于在单个真实主机内使用 ns-3 和 tap 接口来模拟 LTE 连接。我发现这非常复杂。我希望能够使用特定的 IoT 应用层协议创建客户端和服务器,并使用为它们创建的通用库(例如用于 AMQP 的 RabbitMQ Java 客户端),并且我希望它能够像我使用真实网络一样工作连接它们。
我遇到的一个问题是通过仿真在客户端和服务器程序之间路由流量,而不是直接相互路由。我的第一个想法是通过将客户端和服务器程序放入单独的 Docker 容器中来隔离它们,这些容器连接到单独的 docker 桥接网络,但在尝试此操作后,我很难让流量通过正确的分接接口进行路由。
我已将相应的 Tap 接口奴役到相应 docker 容器的网桥,但我无法让事情按照我想要的方式工作。我希望客户端docker容器使用其相应的tap接口作为所有流量(或至少是针对服务器的流量)的网关,但容器知道的唯一接口或IP地址是它所连接的docker桥接网络到,而不是连接到该网桥的分接接口,因此我无法使用该route
命令设置网关。不过,我可以 ping 通同一个 Tap 接口,无论它是否连接到网桥。起初,我还可以从容器 ping Internet 主机,但我设法在iptables
.
我的第二个希望是将分接接口设置为桥内所有流量的网关,这些流量发送到未连接到它的接口或主机,但我不知道该怎么做。
我应该如何进行才能实现我所追求的隔离?
编辑: 这是我想到的拓扑:
+------------------------------------------------------------------+
| Linux Host |
| +---------------------+ +---------------------+ |
| | Isolated network 1 | | Isolated network 2 | |
| | +--------+ | | +--------+ | |
| | | Client | | | | Server | | |
| | | | | | | | | |
| | +--------+ | | +--------+ | |
| | ^ | | ^ | |
| | | | | | | |
| | +---ˇ------+ | | +------ˇ---+ | |
| | | Bridge 1 | | | | Bridge 2 | | |
| | +----------+ | | +----------+ | |
| | ^ | | ^ | |
| +-----|---------------+ +---------------|-----+ |
| | | |
| +--ˇ----+ +----ˇ--+ |
| +--| Tap 1 |------------------------------------| Tap 2 |--+ |
| | +-------+ NS-3 Emulated LTE Network +-------+ | |
| | | |
| +----------------------------------------------------------+ |
| |
+------------------------------------------------------------------+