一个关于LinuxBridge配置的吐嘈


话说有些事情十分适合在放假前的一天折腾一天,但绝对不适合在你准备去吃饭前多看一眼...我上周就碰到了这么一件揪心的事,最终以低血糖收场,十分狼狈地四处觅食,却觅到了一包超级辣的鸡爪,吃完后感觉症状加重了,于是向邻座的同事乞讨了巧克力糖,唉...这一切起源于我在准备吃午饭前一头扎进了一个技术问题,本以为能靠配置搞定,最终却还是不得不以修改The Fxxxing code告终!事情起源于公司的一个禁令:禁止上外网!
1.如果看直播之类的,可以躲在厕所里蹲着看,没人知道你在看什么,代价就是3G流量和麻醉状态的腿和脚;
以上3点中,第1点基本不可能了,因为自公司搬家以后,厕所就一点信号都没有了,别说上网,万一没带纸都是很麻烦的事,第二点大家都会做,也确实这么做了,结果公司禁令的最大效果就是各种打印,各种签字,各种跑,但是技术人员不满足于这种非技术的解决方式,于是一定要尝试一下第3种方式。
1.把家里小设备的物理网卡eth0和simpletun启动的虚拟网卡tap0用brctl命令做成一个网桥,然后让这个网桥接管原来eth0上的IP地址,
以上第2个问题很好解决,难的是第1个。要知道,对家里小设备的操作是远程SSH上去的,数据包通过家里路由器的公网IP连接,之后被路由器DNAT到小设备的eth0的IP地址,这就意味着在网桥设置期间,必须保证这个IP地址的连通性,但是目前的Linux Bridge机制是不能支持的。
1.网桥起来的那一刻;
有一点是毋庸置疑的,那就是只要你把eth0加入到网桥,如果eth0收到数据包,内核会认为该数据包是网桥接收的而不再是eth0接收的,包括ARP Reply在内,于是系统的arp表中本来拥有的路由器的arp项:
192.168.1.1 00:11:22:33:44:55 eth0
192.168.1.1 00:11:22:33:44:55 br0 或者 192.168.1.1 (incomplete) br0(如果br0还没有up的情况下)
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.新增网桥
值得一提的是上面第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(此处不说了,感兴趣的自行修改)...
ebtables -t broute -A BROUTING -j DROP
ebtables -t broute -A BROUTING -i br0 -state --dev-state up -j DROP

相关内容

    暂无相关文章