利用linux的策略路由做双出口负载均衡

dlijun 2016-05-13 11:21:48
参照http://blog.chinaunix.net/uid-13423994-id-3212414.html作了基于连接的网络负载平衡策略,利用ubuntu 14.04 pc机搭建了如下测试环境:

即PC插入无线网卡当wifi热点用,另有两个网络出口,作如下路由策略设置:

sudo iptables -t mangle -A PREROUTING -s 10.42.0.0/24 -m conntrack --ctstate NEW -m statistic --mode nth --every 2 --packet 1 -j CONNMARK --set-mark 1
sudo iptables -t mangle -A PREROUTING -s 10.42.0.0/24 -m conntrack --ctstate NEW -m statistic --mode nth --every 2 --packet 0 -j CONNMARK --set-mark 2
sudo iptables -t mangle -A PREROUTING -m connmark --mark 1 -j MARK --set-mark 1
sudo iptables -t mangle -A PREROUTING -m connmark --mark 2 -j MARK --set-mark 2

sudo iptables -t nat -A POSTROUTING -s 10.42.0.0/24 -o eth1 -j MASQUERADE
sudo iptables -t nat -A POSTROUTING -s 10.42.0.0/24 -o eth2 -j MASQUERADE

sudo ip route add default via 192.168.4.254 table 10
sudo ip route add 10.42.0.0/24 dev wlan0 table 10

sudo ip route add default via 10.231.59.252 table 20
sudo ip route add 10.42.0.0/24 dev wlan0 table 20

sudo ip rule add pref 10 fwmark 1 table 10
sudo ip rule add pref 11 fwmark 2 table 20

系统默认的table main表如下,
default via 192.168.4.254 dev eth1 proto static
10.42.0.0/24 dev wlan0 proto kernel scope link src 10.42.0.1 metric 9
10.231.0.0/16 dev eth2 proto kernel scope link src 10.231.58.252 metric 1
192.168.4.0/24 dev eth1 proto kernel scope link src 192.168.4.14 metric 1

假设移动设备M通过wifi连接到wlan上,分配的IP地址为 10.42.0.83,此时的问题是table main中设置的默认网关是哪个网关,则那条网路是通的,另一个网关对就的网络. 例如默认网关为eth1, 用tcmdump抓eth2上的数据包,是有数据出去(源地址已经过NAT转变为10.231.58.252),网络server主机也有数据返回,但因为网关的原因不能正常返回给设备M,导致TCP的三次握手不能成功,以至于数据不断重发。

参照网上的一些资料,再加上如下策略,并去掉table main的路由,则网络异常,都不通。
sudo ip route add default via 192.168.4.254 dev eth1 table 11
sudo ip route add 10.42.0.0/24 dev wlan0 proto kernel scope link src 10.42.0.1 table 11
sudo ip route add 192.168.4.0/24 dev eth1 proto kernel scope link src 192.168.4.14 table 11

sudo ip route add default via 10.231.59.252 dev eth2 table 21
sudo ip route add 10.42.0.0/24 dev wlan0 proto kernel scope link src 10.42.0.1 table 21
sudo ip route add 10.231.0.0/16 dev eth2 proto kernel scope link src 10.231.58.252 table 21

sudo ip rule add pref 12 from 192.168.4.14 table 11
sudo ip rule add pref 13 from 10.231.58.252 table 21

求大神指导,谢谢!
...全文
602 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
dlijun 2016-05-17
  • 打赏
  • 举报
回复
今天自己在网上搜到相应资料,是rp_filter机制的问题,关掉该机制即可。 解决方法: 系统配置文件 1. /etc/sysctl.conf 把 net.ipv4.conf.all.rp_filter和net.ipv4.conf.default.rp_filter设为0即可 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.all.rp_filter = 0 系统启动后,会自动加载这个配置文件,内核会使用这个变量 2. 命令行 显示一个内核变量 sysctl net.ipv4.conf.all.rp_filter 设置一个内核变量 sysctl -w net.ipv4.conf.all.rp_filter=0 设置完后,会更新内核(实时的内存)中的变量的值,但不会修改sysctl.conf的值 3. 使用/proc文件系统 查看 cat /proc/sys/net/ipv4/conf/all/rp_filter 设置 echo "0">/proc/sys/net/ipv4/conf/all/rp_filter 参考资料:http://www.xuebuyuan.com/1494639.html

19,612

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧