linux中CTC关于route wan 端口绑定的实现
来源:互联网 发布:淘宝话费充值怎么退款 编辑:程序博客网 时间:2024/06/06 03:44
需求描述:
2个routed wan,都需要支持NAT功能。
wan0,ip 192.168.40.2,mask 255.255.255.0,gateway 192.168.40.1,设置为default gateway。
wan1,ip 10.2.0.2,mask 255.255.255.0,gateway 10.2.0.1,设置为源地址策略路由,bind port lan2,lan3
LAN侧,br0,ip 192.168.30.1, mask 255.255.255.0,配置dhcp server。
lan0,lan1,lan2,lan3分别对应4个uni口,绑定在br0的桥中。
在kernel中选择编译xt_CONNMARK, xt_MARK, xt_mark, xt_connmark
在系统初始化时加入这4个module和iptable_mangle module。
在ether driver中加入操作,lan口收包,会写skb->mark = 0x1000+ifindex;
Ip rule add fwmark 0x1002talbe 17 pref 17
Ip rule add fwmark 0x1003talbe 17 pref 17
Ip route add via192.168.40.23 dev wan0 table 17
Nat表:
-A POSTROUTING –o wan0 –jMASQUERADE
-A POSTROUTING –o ppp1 –jMASQUERADE
Mangle表:
原理:根据lan来源的skb->mark,跟conntrack也标记上相应的mark,这样从wan侧的reply报文找到对应的conntrack,就根据conntrack的mark改写报文的mark,这样可以找到对应的下行路由
已经带有mark的报文不做修改,直接pass
-A PREROUTING -m mark--mark 0x1000 -j ACCEPT
-A PREROUTING -m mark--mark 0x1001 -j ACCEPT
-A PREROUTING -m mark--mark 0x1002 -j ACCEPT
-A PREROUTING -m mark--mark 0x1003 -j ACCEPT
不带mark的报文根据conntrack restore mark
-A PREROUTING -j CONNMARK--restore-mark
根据skb mark标记conntrack mark
-A POSTROUTING -jCONNMARK --save-mark
Filter表
Lan port 3.4来的报文通过wan0出去,直接ACCEPT,而不能forward到其他wan
-A FORWARD –m mark –mark0x1002 –i br0 –o wan0 –j ACCEPT
-A FORWARD –m mark –mark0x1003 –i br0 –o wan0 –j ACCEPT
-A FORWARD –m mark –mark0x1002 –i br0 –o !br0 –j DROP
-A FORWARD –m mark –mark0x1003 –i br0 –o !br0 –j DROP
按道理,做了如下操作,other route的nat应该通了,结果下行总是出问题。
在kernel加debug才找出了真正原因:reply报文在经过nf_nat_in以后,修改了dst ip为lan侧pc ip,需要找路由,结果却找不到路由。。
找不到路由,就需要重新加路由,在经过fib lookup之后,需要检测in dev,却总是不匹配,实际的in dev是wan0,期望的in dev却是ppp1(因为ppp1是默认路由,所以期望设备一般都是ppp1);
在查了很多资料后,修改了/proc/sys/net/ipv4/conf/wan0/src_valid_mark = 1之后,终于根据mark找到了正确的期望 in dev 为wan0,这样就能加路由了;
新的问题又出现了,这个下行报文没有发送到lan,结果却被wan0 发送出去了,而这个报文的dst 地址却是lan pc地址,太诡异了,怀疑是路由问题;
在iproute中加入了一条路由,顺利解决问题:
Ip rule add to192.168.30.0/24 table 1 pref 1
Ip route add via192.168.30.1 via br0 table1
原理就是在mark之前根据dst ip找到对应路由。
- linux中CTC关于route wan 端口绑定的实现
- linux route的底层实现
- 关于Linux路由表的route命令
- 关于Linux路由表的route命令
- linux中绑定80端口失败
- 关于重复绑定TCP端口的疑惑?
- Tensorflow中使用 LSTM + CTC 的例子
- 关于WAN
- 在Caffe中使用Baidu warpctc实现CTC Loss的计算
- linux下双WAN负载均衡实现
- linux route 实现
- linux route 实现
- 关于linux独立主机的多域名文件夹绑定实现
- Linux中Route命令
- linux中动态链接延迟绑定的实现
- Linux的route命令
- Linux的route命令
- 随笔-关于在Route中设置二级域名转换的问题
- aop异常
- 多线程技术
- servlet采用单实例多线程模式开发的 (转)
- 哈 sql server的sa密码忘记了 终于可以登录啦
- C#操作EXCEL类
- linux中CTC关于route wan 端口绑定的实现
- 二级级联菜单
- EMC收购Document Sciences 扩展企业内容
- 使用tcpdump更加精确的抓包
- 一个很有深度的C++内存问题---GDB调试(一)
- busybox登陆后没要求输入密码的解决办法
- oracle: ocp题解与实验(12 & 13/205)
- Ext OOP基础
- BMP文件格式