linux – 3.6后内核中的多路径路由

前端之家收集整理的这篇文章主要介绍了linux – 3.6后内核中的多路径路由前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
大家都知道,在3.6 Linux内核系列中已经删除了ipv4路由缓存,这对多路径路由有严重影响. IPv4路由代码(与IPv6不同)以循环方式选择下一跳,因此从给定源IP到给定目标IP的数据包并不总是通过相同的下一跳.在3.6之前,路由缓存正在纠正这种情况,因为下一跳一旦被选中,就会停留在缓存中,并且来自同一源到同一目的地的所有其他数据包都会经过下一跳.现在为每个数据包重新选择下一跳,这会导致奇怪的事情:在路由表中有2个等价的默认路由,每个路由指向一个互联网提供商,我甚至无法建立TCP连接,因为初始SYN和最终ACK通过不同的路由,并且由于每条路径上的NAT,它们作为来自不同源的数据包到达目的地.

有没有相对简单的方法来恢复多路径路由的正常行为,以便每个流而不是每个数据包选择下一跳?有没有补丁可以使IPv4下一跳选择基于散列,就像是IPv6一样?或者你们如何处理它?

解决方法

“相对容易”是一个困难的术语,但你可能会

>为每个链接设置路由表 – 每个链接一个表,使用一个默认网关
>使用netfilter在单个流的所有数据包上标记相同的标记
>使用ip规则表根据标记通过不同的路由表路由数据包
>使用多次下箍加权路由来平衡网关/链路上的第一个会话数据包.

在这个主题上有一个discussion at the netfilter mailing list我偷了这些列表:

1.路由规则(RPDB和FIB)

ip route add default via <gw_1> lable link1
ip route add <net_gw1> dev <dev_gw1> table link1
ip route add default via <gw_2> table link2
ip route add <net_gw2> dev <dev_gw2> table link2

/sbin/ip route add default  proto static scope global table lb \
 nexthop  via <gw_1> weight 1 \
 nexthop  via <gw_2> weight 1

ip rule add prio 10 table main
ip rule add prio 20 from <net_gw1> table link1
ip rule add prio 21 from <net_gw2> table link2
ip rule add prio 50 fwmark 0x301 table link1
ip rule add prio 51 fwmark 0x302 table link2
ip rule add prio 100 table lb

ip route del default

2.防火墙规则(使用ipset强制“流”LB模式)

ipset create lb_link1 hash:ip,port,ip timeout 1200
ipset create lb_link2 hash:ip,ip timeout 1200

# Set firewall marks and ipset hash
iptables -t mangle -N SETMARK
iptables -t mangle -A SETMARK -o <if_gw1> -j MARK --set-mark 0x301
iptables -t mangle -A SETMARK -m mark --mark 0x301 -m set !
--match-set lb_link1 src,dstport,dst -j SET \
          --add-set lb_link1 src,dst
iptables -t mangle -A SETMARK -o <if_gw2> -j MARK --set-mark 0x302
iptables -t mangle -A SETMARK -m mark --mark 0x302 -m set !
--match-set lb_link2 src,dst -j SET \
          --add-set lb_link2 src,dst

# Reload marks by ipset hash
iptables -t mangle -N GETMARK
iptables -t mangle -A GETMARK -m mark --mark 0x0 -m set --match-set
lb_link1 src,dst -j MARK --set-mark 0x301
iptables -t mangle -A GETMARK -m mark --mark 0x0 -m set --match-set
lb_link2 src,dst -j MARK --set-mark 0x302

# Defining and save firewall marks
iptables -t mangle -N CNTRACK
iptables -t mangle -A CNTRACK -o <if_gw1> -m mark --mark 0x0 -j SETMARK
iptables -t mangle -A CNTRACK -o <if_gw2> -m mark --mark 0x0 -j SETMARK
iptables -t mangle -A CNTRACK -m mark ! --mark 0x0 -j CONNMARK --save-mark
iptables -t mangle -A POSTROUTING -j CNTRACK

# Reload all firewall marks
# Use OUTPUT chain for local access (Squid proxy,for example)
iptables -t mangle -A OUTPUT -m mark --mark 0x0 -j CONNMARK --restore-mark
iptables -t mangle -A OUTPUT -m mark --mark 0x0 -j GETMARK
iptables -t mangle -A PREROUTING -m mark --mark 0x0 -j CONNMARK --restore-mark
iptables -t mangle -A PREROUTING -m mark --mark 0x0 -j GETMARK

您可能需要按照netfilter邮件列表讨论了解上述的一些变体.

猜你在找的Linux相关文章