struct sk_buff *br_handle_frame(struct net_bridge_port *p, struct sk_buff *skb)
{
const unsigned char *dest = eth_hdr(skb)->h_dest;
int (*rhook)(struct sk_buff *skb);
////////加入以下代码
int flags = p->br->dev->flags;
if (!(flags & IFF_UP)) {
return skb;
}
////////
.....
}
然后加载修改后的模块后执行以下序列:1.新增网桥
brctl addbr br0
2.关闭STP(可选)
brctl stp br0 off
3.设置一个掩码稍长的IP,暂时设置为down状态
ifconfig br0 192.168.1.100/25 down
4.加入eth0到br0
brctl addif br0 eth0
5.开启br0
ifconfig br0 up
6.清除eth0的IP
ifconfig eth0 0.0.0.0
值得一提的是上面第3个步骤,Linux中如果不同语义的相同路由是添加到一个list的尾部的,因此如果两块网卡配置相同的IP地址,则谁先up谁的链路路由在前面优先被匹配,设置掩码稍长的IP地址是为了让br0的网段比eth0的网段更加精确,但要注意,默认网关一定不能被25位掩码和br0的IP劈开到不同的网段,比如默认网关是192.168.1.128后面的地址就不能,因为它已经和192.168.1.100不在一个网段了,如果实在想使用稍长掩码的IP地址,你就要增加一个force onlink的路由。其实可以用metric来做到上面的说的而不用稍长掩码的IP地址,也可以修改Linux内核的路由部分,将fn_hash_insert中的某处list_add_tail改为list_add_head(此处不说了,感兴趣的自行修改)...
事情就这样解决了,但是却无法落实!什么叫落实呢?就是说形成一个通用的方案,我想如果我把修改后的bridge机制提交给kernel maillist,肯定会有很多人骂的,更有可能的是根本没人搭理我...从代码风格上,这种硬编码方式不可取,从实际效果来看,你不能保证使用bridge的人一定就同意你的逻辑,因此做成可选的选项就比较好,怎么个可选法呢?模块参数当然是其一,但是还有更好的方法。
行文至此,有一个疑问,为何不用ebtables的broute表呢?比如你设置一条:
ebtables -t broute -A BROUTING -j DROP
这条命令的效果和上面修改代码的效果一样,可是问题又来了,当你执行brctl addif br0 eth0的时候,就会断网,因为此时你需要删掉那个规则,然而已经没有机会删除了,因为你再也连不上去了。实际上,这也是单一触发的问题,每次操作仅仅触发一个动作,和上面讨论的问题实质是一样的。之所以在本文快要结束的时候引入一个新的问题,是为了展示一个更好的方案。我们来看看上面的ebtable命令缺了什么,缺乏的正是一个match,即对br0状态的判断,它才会一股脑地将全部的数据都DROP到上层,如果它成为以下这样子的话:
ebtables -t broute -A BROUTING -i br0 -state --dev-state up -j DROP
那岂不就完美了,丝毫不用改现有的Linux Bridge逻辑,需要做的仅仅是增加一个ebtables的match模块,这种模块化的东西本来就是让扩展的,至于怎么扩展,就看ebtables有没有iptables灵活了,好像是没有,因此我也就在此作罢了。
这明显不是什么吐嘈,纯粹是自己比较无聊而写的一篇技术指南。随便吧!让人吐嘈的不是这篇文章所表达的内容,而是我对信息记录的极大不满,因此,真正的吐嘈这才真正开始。
我越发觉得使用智能手机是多么危险的一件事,昨晚被老婆查手机,查完后怒了,不是针对老婆,而是针对没天理的APP,我曾经去过哪里,在那个地方待了多长时间,通过坑爹的iPhone隐私都可以查到,通过另一个APP,就可以查到曾经所有的通话记录,短信,都上过哪些网站,而最令人气愤的是,你删除的东西可能不是真的被删除,依然留在机器的某个角落,比如/var/cache/...我说一个具体的困境吧,如果你用iPhone下载了新浪微博,用一个帐号登录了,然后退出,这个账号就永远存在于你的手机了,下次,你只要输入账号的第一位,就会自动补全,好吧,你找不到任何地方可以删除这个登录信息,那么怎么办?直接将程序删除,然后重新下载,这下清静了,不能自动补全了,看似清除了登录信息,好吧,是的,真的清除了,这个时候不要登录,等待,等待,然后突然收到一条那个登录过账号的特别关注好友的一条新微博,天啊,我还没登录呐,怎么就知道那条微博要推给我啊...以上是一个真实的事实,我故意这么测试过。
微信也有问题,我把一个不宜公开的***拉到了朋友圈黑名单,然后再把他删除,可是他的更新我还是可以看到。诸如此类的还有很多,感兴趣的自己去玩吧。别跟我说技术不成熟导致的问题,在我看来技术永远都不可能成熟!技术至上的观点多么天真,对于只懂技术或者对生活中的其它事情不关心不理解的人,一不小心就被他人引入一个万劫不复的深渊,深不知深究此事是多么的无聊,其实很简单,你自己做一个坏东西让别人折腾去呗,都别人玩儿又不犯法。你要知道,所有的好点子都不是技术人员搞出来的,都TMD是小丑引申的。留声机刚发明的初衷并不是记录音乐,甚至觉得记录音乐是亵渎了这个该死却又伟大的发明,可是事实呢?
当你走在街上,大量的摄像头指着你,就像有狙击手在暗处瞄准你却不开枪给你带来的感觉一样,因为一旦他开枪,一瞬间你就不会有任何感觉了。在货梯旁边的楼道吸烟的时候,可能保安正盯着你看你在通过手机看什么内容,如果你看的是禁网,他们也会受惠。银行的流水帐单会告诉别人你在什么时间什么地点在哪家店消费了多少钱,如果你狡辩说你在穆斯林商场的经纬度地点买了一斤猪肉,那你肯定在说谎,因为你根本不知道注册的信息有哪些;门户网站,iPhone,公司的NAS,它们都会记录你的信息,你也不知道这些信息最终会被如何处理,最简单的办法就是TMD少进行信息交流,虽然我不会上公司不让上的网站,但我也同时拒绝了使用google查阅正规的技术内容,我拒绝使用互联网,仅此而已,虽然我不会去东莞,也不会跟陌生女人通话,但我还是删除了所有的通信录和APP,我拒绝使用智能手机,仅此而已。
闭上眼睛,在厕所撒尿和在人民广场马路中心撒尿,对于没有心智的人而言是一样,可是处在时刻被监控状态的网民,实质上和闭上眼睛在广场中心撒尿没有什么两样。对于少数技术人员而言,总是可以在撒尿的时候罩上一块简单的屏障,甚至直接睁着眼撒尿即可,同时还向四周竖起了中指,但对于大多数技术人员而言,为了撒尿,却只知道自己憋着尿盖一座厕所,如果你想如厕,旁边商场里就有啊。无知导致滞后...