一台linux,两张网卡,怎样使其成为一台交换机

这问题 @胡子说的可能不太对。所谓交换机还是应该指一个二层设备,是不应该涉及二层以上的任何操作的。而iptables是基于IP的,而且MASQUERADE甚至会更改IP头,这让pc_switch不但肯定是三层设备,而且连一般意义的路由设备都不算了=_=所以我决定指出这一点。这其实是一个不那么简单的问题。所以我不能给出一个完整的答案。(简言之就是我也没实现过)不考虑重新写内核的话,应该会涉及到的工具有brctlebtables等等具体可以看一下下边这篇文章。我就不献丑了。Kernel Korner - Linux as an Ethernet Bridgehttp://www.linuxjournal.com/article/8172此外,如果要是把pc_switch做一个路由的话可能会简单得多,需要把两台PC的网关设置成pc_switch的地址,然后用iptables的相关规则来限制两台host之间的通信。这时pc_switch表现的更像一个firewall。P.S.题主只有两个网口,还要限制两台host的互相通信,那这个交换机的意义何在……
■网友
假设那个网卡分别是eth0和eth1ifconfig eth0 downifconfig eth1 downbrctl addbr br0brctl addif br0 eth0brctl addif br0 eth1这样两个网口之间就是互通了,pc_switch本身要想也加入的这个网络的话,ifconfig br0 xxx up即可。如果要做二层的过滤,就需要ebtables了
■网友
谢邀!
刚看到问题都2年以前了,不过我看几篇回答不算完整,就也发表下我的观点。
首先要说,楼主的“想过滤pc1和pc2之间发送的数据包”的目的,与其“交换机”的初步方案之间有错位的。不过,幸亏 linux 下正好有 ebtables 这种奇特的特殊解决方案,应该能符合楼主的目的与初步方案。
“过滤pc1和pc2之间发送的数据包”,那就应该是部分过滤,则此目的跟通常说的“交换机”的工作层次不对应,对应的应是更高层的“互联网防火墙”,通常实现“ip过滤”、“传输层过滤”或者“会话层特征内容过滤”等功能,我想楼主的过滤方式多半属于“传输层过滤”吧。
但是linux下的ebtables就有这么特殊,它是一种以太网桥上的,依附于链路层的过滤器。我只见过 ebtables 的介绍,从没用过,因为从未在我的家里、工作里,遇到过这个需求(这些用链路层连接的主机,它们之间的需求只有快速交换,没有过滤)。
ebtables 的主页 Linux Ethernet bridge firewalling 里介绍的用途是:
“The ebtables program is a filtering tool for a Linux-based bridging firewall. It enables transparent filtering of network traffic passing through a Linux bridge. The filtering possibilities are limited to link layer filtering and some basic filtering on higher network layers. Advanced logging, MAC DNAT/SNAT and brouter facilities are also included. ”
简单翻译下,就是运行于 Linux 的链路层内核旁边的过滤器,以及MAC地址伪装器,同时,也可以提供简单的网络层之上的过滤器功能。在 http://ebtables.netfilter.org/misc/ebtables-man.html manpage里,看到 ebtables 有 --ip-sport/--ip-dport, --ip6-sport/--ip6-dport 的选项 --\u0026gt; 对应楼主需求
【一台linux,两张网卡,怎样使其成为一台交换机】 最后有必要细讲一下对“交换机”的个人体会。在我们通信人的眼里,“交换”指“边收边发”;而早期的“路由”都是“收完再转”,虽然 IP 发达之后这两个概念逐渐交融,但是 IP 领域的“交换机”概念,其核心功能仍然是“快速转发”,过滤的目的则都放在“路由层之上”的设备里实现。对应的,可以显著预测的是,Linux-based 的 ebtables, 如果我没猜错的话,其效率必然远低于常规方案,它和“边收边发”的网络工作方式是隔开的:ebtables 在 OS 内核里,而“边收边发”应该在网络设备的传送控制部分完成,普通网卡没有这种能力,有的话也不会提供到OS。


推荐阅读