Netfilter: 利用iptables进行负载均衡
Posted CQ小子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Netfilter: 利用iptables进行负载均衡相关的知识,希望对你有一定的参考价值。
目的
1. 实现多个网络接口同时运作,完成多连接的真正并发,多个连接正在的同时访问网络
2. 实现负载均衡,有效扩展带宽增加吞吐量
场景
1. 路由器有2个接口连接2个网络,可以制定相关的策略,将网络流量均分到2个网络中,可以均分,也可以不均分...
2. 手机上有个新潮的功能Download booster(三星),WIFI和4G网络可以同时打开,下载大型文件的时候,可以加速下载,不过这个很烧流量的,闲时流量还可以考虑.. 如下图
应用技术
1. 策略路由:这里主要是通过数据包的MARK值来进行路由选择
2. iptables相关的rule:这里主要是利用iptables的规则,给相关的连接打mark,并将连接的标记保存到对应的每一个数据包中。
思路
假设目前主机有两个interface eth0和eth1,在下载或者上网的过程中,我要每个链接都按照一定的比率被标记成两种mark,比如说一半的概率被标记成5,一半的概率被标记成6,在策略路由选择的时候,标记5的去寻找eth0对应的路由表,然后标记6的数据包去寻找eth1的路由表。这样在上网或者下载过程中,对应连接的数据包,就被分配到不同的网络接口中去了。
实现
1. 解决策略路由的问题 , 使用iproute2进行配置路由,操作如下:
生成2个路由表,eth0,eth1,并增加对应的默认路由
ip route add table eth1 default via 10.1.1.1 dev eth0
ip route add table eth1 default via 10.2.2.2 dev eth1
生成路由选择的策略,MARK为5 去查找table eth0, MARK为6去查找table eth1
ip rule add fwmark 0x5 table eth0
ip rule add fwmark 0x6 table eth1
2.解决给连接打MARK的问题,使用iptables的相关模块:
首先给对链接进行均分,这个比率也可以修改...
iptables -t mangle -A OUTPUT -m state --state NEW -j ETH1
iptables -t mangle -A OUTPUT -m state --state NEW -m statisti --mode random --probability 0.5 -j ETH2
方法二,也可以利用NTH模块公平分发数据包
iptables -t mangle -A OUTPUT -m state --state NEW -m statistic --mode nth --every 2 --packet 0 -j ETH0
iptables -t mangle -A OUTPUT -m state --state NEW -m statistic --mode nth --every 2 --packet 1 -j ETH1
这里NEW状态,一般是指一个链接的第一个包,对于TCP来讲基本就是SYN包,UDP的话,相同端口的第一个封包为NEW状态
其次是要对链接进行打MARK,要在ETH0/ETH1这两个chain中实现
ETH0标记 5到链接
iptables -t mangle -N ETH0
iptables -t mangle -A ETH0 -j MARK --set-mark 5 //标记数据包
iptables -t mangle -A ETH0 -j CONNMARK --save-mark //把数据包的MARK设置到整个连接
ETH1标记6到链接
iptables -t mangle -N ETH1
iptables -t mangle -A ETH1 -j MARK --set-mark 6 //标记数据包
iptables -t mangle -A ETH1 -j CONNMARK --save-mark //把数据包的MARK设置到整个连接
最后要给每一个数据包进行标记
iptables -t mangle -A OUTPUT -m state --state ESTABLISHED,RELATED -j CONNMARK --restore-mark
这样基本就实现了负载分流功能,让两个网卡同时存在,不过这个只是简单的使用命令进行配置,如果写code的话,可能要借助一些三方的工具比如iptables,iproute2来做这些事情。
以上是关于Netfilter: 利用iptables进行负载均衡的主要内容,如果未能解决你的问题,请参考以下文章