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找到对应路由。


原创粉丝点击