Linux 强制数据包传出(并避免本地/内核流量)

Linux 强制数据包传出(并避免本地/内核流量)

0 反对 收藏

我有一个 20 端口交换机,连接到一台 20 网卡 PC(一对一),我想给它加载流量。当然,为所有网卡配置不同的 IP 并启动我的客户端/服务器(Python3)脚本(或 iperf3)只会生成本地流量,除非我强制通过网卡将流量输出。

为了实现这一目标,我找到了(这里)两个主要的“技巧”:

a.)使用网络命名空间:

[+] 它将完全按照我的要求,将每个 NIC 隔离到一个盒子里(类似 VM/docker)。

[+] Python3 似乎支持 netns (Pyroute2)

[-] 不确定如何打开套接字到 netns/python 线程(10 个线程 x 2(客户端/服务器))

b.) 使用幽灵 IP(iptable:S/D-NAT + 前/后路由):

[+] 所有 NIC 都保留在根网络命名空间中(仍然可以通过 psutil 收集数据)并在全局级别进行配置

[+] Python TCP 线程脚本无需特定的库/netns 支持即可运行

[-] 如果需要重新配置我的设置(IP、VLAN……),则必须相应地调整 IPTable 脚本。

我想知道我是否忽略了这里的另一种可能性和/或是否对于a)我完全弄错了(因为我找不到一个在单个 Python 脚本中通过不同的网络打开套接字的体面示例......)

答案1

要真正加载交换机,请尝试多播!

使用socatdvblast以非常高的质量/带宽多播循环小视频可以形成非常好的流量生成器,并且多播流量将始终传出。

答案2

我不确定在网络命名空间中使用 Python 有什么问题 - 一旦您将接口移动到命名空间并在其中启动 Python 解释器,您就可以打开一个普通套接字。由于命名空间中只有一个 NIC,因此所有内容都会正确路由。

我不明白你的第二种方法,也不明白为什么你需要 NAT。

第三种方法是给每个 NIC 设置不同的 IP,将它们全部放在根命名空间中,并让应用程序绑定到特定套接字。这是普通套接字 API 的一部分;我必须查看 Python 如何支持它,但我确信它确实支持。或者,使用类似的东西socat来生成网络流量;它有绑定到接口/源地址的选项,您不需要编写特定的 Python 脚本。

编辑

啊,我可能已经找到症结所在了,以及为什么您认为您需要 NAT。

如果你不只是想“用流量加载交换机”,而是希望流量的目的地是同一个盒子作为源,那么您就遇到了问题:有各种安全措施可以防止此类路由循环和“回旋镖”数据包。请参阅这里了解详情。是的,可以使用 NAT 来解决这个问题,但还有更好的方法:使用命名空间真的很容易,只要将目的地放在其他地方(例如在命名空间中,或在连接到交换机的另一台机器上)就足够了。

相关内容