网桥是一种安装在网络中,不需要任何后续配置的设备。网络交换器基本上就是一个多口网桥。也就是说网桥就是一个两口的交换器。而Linux能支持多个接口的网桥,成为一个真正的交换器。
网桥经常被用于改进那些">工作状态不佳但是又不能改造的网络。因为网桥是一个2层设备(IP下面的那一层),路由器和服务器意识不到它的存在。也就意味着你可以完全透明地阻挡或者修改数据包,甚至流量整形。
另一件好事是,假如一个网桥崩溃了,可以使用一个HUB甚至一根交叉线来代替它。
坏消息是,如果它没有在工程文档中明确备案,网桥就会导致混乱。它不会在traceroute中出现,但是却导致数据包从A点到B点过程中消失或者变样(“网上闹鬼!”)。你应该也想知道一个“不想改变任何事”的组织是否在做应该做的事情。
Linux 2.4/2.5网桥的文档在这个网页里.
1. 桥接与iptables的关系
截止到Linux 2.4.20,桥接和iptables在不借助其他条件的时候无法互相看到。如果你把数据包从eth0桥接到eth1,它不会通过iptables。这意味着你无法进行包过滤、NAT、mangle等等操作。从Linux 2.5.45开始,这个问题已被解决。
你也可能听说过另一个叫做“ebtables”计划,它可以实现MACNAT和“brouting”等等疯狂的功能。这确实令人振奋!
2. 桥接与流量整形
做个广告:没问题!
只是要明确哪块网卡在哪一边,否则你可能会在内部网卡上配置外网流量整形,那当然不能工作。必要的话使用嗅探器确认。
3. 用ARP代理实现伪网桥
如果你只是想实现一个伪网桥,请直接阅读“实现”一节,但是看看它是如何工作的不是坏事。
伪网桥的工作有些特别。缺省情况下,网桥不加改变地把数据帧从一个端口发送到另一个端口。它只是看看数据帧的硬件地址来决定这个帧应该送到哪里去。也就是说,只要数据帧有合适的硬件地址,你可以让Linux转发它并不认识的数据帧。
而伪网桥的工作有些区别,它看上去更像是一个隐形的路由器,而不是一个网桥。但类似于网桥的是,对网络的设计没有太大影响。
因为它不是一个网桥,就具有了一个优势:数据帧(包)会通过内核,所以你可以进行过滤、修改、重定向或者重路由。
一个真的网桥也可以实现上述技巧,但那需要特定的代码,象以太帧分流器或者上面提到的那个补丁。
伪网桥的另一个好处是它不会转发它不认识的数据包,这样可以防止一些cruft充斥网络,从而净化你的网络环境。如果你确实需要这些cruft(比如SAP包或者NETBEUI),就应该使用真网桥。