从头开始编写以太网桥

时间:2018-01-01 01:24:22

标签: python c sockets network-programming raw-ethernet

问题:

如何在代码中创建双线程桥(不使用ocaml或某种类似的网络方法,但编写代码),使用从ETH1获取以太网帧并将其放在ETH2上,而另一个从ETH2获取它们并将它们放在ETH1上,使得两个进程不会连续读取彼此的以太网帧?

详细说明:

我正在尝试创建一个设备来保护系统之间的连接(对于我们无法更新的很多遗留系统),为了做到这一点,我们需要将此设备放在传统的以太网端口上系统与另一个面向网络的以太网端口。基本上是一个中间人的硬件。

我可以使用标准以太网桥和一些花哨的IPTables前后路由规则来完成我所需要的几乎所有工作,但我想尝试实现一些执行此操作的代码。我已经在C和Python中尝试过这个,我最终创建了一个无限循环的以太网帧。例如在C中,我可以打开一个套接字到ETH1以便以混杂模式读取:

brctl addbr br0

然后我打开一个套接字到ETH2进行写入,我可以在它们之间有程序逻辑。只要两个线程(C中的pthread,Python中的线程,线程)不同时运行,ETH1-> ETH2就像ETH2-> ETH1一样工作。如果它们是,那么这个过程就像一座桥梁,所有的地狱都会失败。

ETH1-> ETH2线程从ETH1读取以太网帧并将它们写入ETH2。当ETH2-> ETH1线程从ETH2以太网套接字读取时,它读取另一个线程写入的帧,并开始无限循环。

Python版看起来很相似,但我尝试过使用pcapy和dpkt,但都不行。我遇到了似乎遇到类似问题的Scapy bridge question,但那里的答案似乎并没有解释为什么会发生这种情况或者真的如何修复它,以及Bogdan Paun很好的代码,但如果有人想学习,那么就如何解决这个问题。

0 个答案:

没有答案