写在最前面

netfilter 中的nat分为SNAT 和 DNAT,其中DNAT 可以重写包的目标IP地址,目标地址可以是一个范围,DNAT会为每一个流随机分配一个地址,但同一个流总是使用同一个地址,因此,我们可以用这个target做某种类型的负载均衡。

什么是netfilter/ iptables

  • netfilter 负责在需要的时候动态加载其他内核模块,如ip_conntrack、nf_conntrack、NAT subsystem等
  • iptables是用户空间的一个程序,通过netlink和内核的netfilter框架打交道,负责往钩子上配置回调函数


在数据的发送过程中,从上至下依次是“加头”的过程,每到达一层数据就被会加上该层的头部;与此同时,接受数据方就是个“剥头”的过程,从网卡收上包来之后,在往协议栈的上层传递过程中依次剥去每层的头部,最终到达用户那儿的就是裸数据了


栈模式底层机制如上图:

  • 对于收到的每个数据包,都从“A”点进来,经过路由判决,如果是发送给本机的就经过“B”点,然后往协议栈的上层继续传递;否则,如果该数据包的目的地是不本机,那么就经过“C”点,然后顺着“E”点将该包转发出去。
  • 对于发送的每个数据包,首先也有一个路由判决,以确定该包是从哪个接口出去,然后经过“D”点,最后也是顺着“E”点将该包发送出去。

协议栈那五个关键点A,B,C,D和E就是我们Netfilter大展拳脚的地方了。

Netfilter是Linux 2.4.x引入的一个子系统,它作为一个通用的、抽象的框架,提供一整套的hook函数的管理机制,使得诸如数据包过滤、网络地址转换(NAT)和基于协议类型的连接跟踪成为了可能。Netfilter在内核中位置如上图,这幅图,很直观的反应了用户空间的iptables和内核空间的基于Netfilter的ip_tables模块之间的关系和其通讯方式,以及Netfilter在这其中所扮演的角色。 netfilter指内核中的netfilter框架,iptables指用户空间的规则配置工具


在内核协议栈中,有5个跟netfilter有关的钩子,数据包经过每个钩子时,都会检查上面是否注册有函数,如果有的话,就会调用相应的函数处理该数据包。netfilter所有的钩子都在内核协议栈的IP层

netfilter 钩子、表、链、规则

钩子

  • NF_IP_PRE_ROUTING: 接收的数据包刚进来,还没有经过路由选择,即还不知道数据包是要发给本机还是其它机器。
  • NF_IP_LOCAL_IN: 已经经过路由选择,并且该数据包的目的IP是本机,进入本地数据包处理流程。
  • NF_IP_FORWARD: 已经经过路由选择,但该数据包的目的IP不是本机,而是其它机器,进入forward流程。
  • NF_IP_LOCAL_OUT: 本地程序要发出去的数据包刚到IP层,还没进行路由选择。
  • NF_IP_POST_ROUTING: 本地程序发出去的数据包,或者转发(forward)的数据包已经经过了路由选择,即将交由下层发送出去。

功能与表

netfilter分为Filter、NAT、Mangle和RAW四个功能,由这四个功能也派生出了四张表,其主要功能如下:

  • Filter:其主要功能是进行数据包过滤
  • NAT(Network Address Translation):IP地址转换,主要解决上网问题,可修改原ip、源端口、目标ip、目标端口
  • Mangle:拆解报文,做出修改,封装报文。其主要功能是修改防火墙封包
  • RAW:关闭nat表上启用的连接追踪机制;是nat功能的一种补充;要想完成nat功能需要启动连接追踪功能才能进行做nat地址转换,而如果关闭了nat追踪机制的话,接下来可能在有些地方就会产生一些问题,所以raw功能用的并不是特别的多

表优先级: raw > mangle > nat > filter

iptables里面有5个内置的chains,分别对应5个钩子:

  • PREROUTING: 数据包经过NF_IP_PRE_ROUTING时会触发该chain上的rule.
  • INPUT: 数据包经过NF_IP_LOCAL_IN时会触发该chain上的rule.
  • FORWARD: 数据包经过NF_IP_FORWARD时会触发该chain上的rule.
  • OUTPUT: 数据包经过NF_IP_LOCAL_OUT时会触发该chain上的rule.
  • POSTROUTING: 数据包经过NF_IP_POST_ROUTING时会触发该chain上的rule.

每个表里面都可以包含多个chains,但并不是每个表都能包含所有的chains。

每个表包含的链如下:

filter表: INPUT, FORWARD, OUTPUT
nat表: PREROUTING(DNAT 目标地址转换)、【INPUT】、OUTPUT(SNAT 源地址转换)、POSTROUTING( SNAT 源地址转换 )
mangle表: PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
raw表: PREROUTING、OUTPUT

规则

rule存放在特定表的特定chain上,每条rule包含下面两部分信息

  • Matching: 如何匹配一个数据包,匹配条件很多,比如协议类型、源/目的IP、源/目的端口、in/out接口、包头里面的数据以及连接状态等
  • Targets:动作

    DROP:直接将数据包丢弃,不再进行后续的处理
    RETURN: 跳出当前chain,该chain里后续的rule不再执行
    QUEUE: 将数据包放入用户空间的队列,供用户空间的程序处理
    ACCEPT: 同意数据包通过,继续执行后续的rule
    跳转到其它用户自定义的chain继续执行

规则匹配原则:First Match原则—优先执行

  1. 同类规则(访问统一应用),匹配范围小的放上面
  2. 不同类规则(访问不同应用),匹配到报文频率较大的放上面
  3. 将那些可由一条规则描述的多个规则合并为一个
  4. 设置默认策略

    白名单:默认为拒绝,只允许我们指定的访问;
    黑名单:默认为允许,只拒绝那些我们明确指定的访问;
    这两种名单中,白名单相对要安全的多,所以建议使用白名单

iptables 命令

命令格式:iptables [-t table] SUBCOMMAND chain [matches…] [target]

表管理

-t table: raw mangle nat filter(默认为filter)

链管理

参数 样例 说明
-N , –new-chain iptables -t filter -N mychain 新增一条自定义链
-X, –delete-chain iptables -t filter -X mychain 删除自定义链,保证链中规则为空才能删除
-P, –policy iptables -t filter -P INPUT DROP 设置链默认策略,常用的策略有: ACCEPT、 DROP、REJECT
-E, –rename-chain iptables -t filter -E mychain mchain 重命名自定义链
-L, –list iptables -t nat -L 列出nat表上所有的规则
-n iptables -t nat -L -n
-S iptables -t nat -S 打印链规则,打印的是规则的命令行参数

规则管理

参数 样例 说明
-A, –append iptables -t filter -A INPUT … 在所选择的链末添加规则。当源地址或目的地址是以名字而 不是ip地址的形式出现时,若这些名字可以被解析为多个地址,则这条规则会和所有可用的地址结合
-D, –delete iptables -t filter -D INPUT –dport 80 -j DROP 或者 iptables -D INPUT 1 从所选链中删除规则。有两种方法指定要删除的规则:一是 把规则完完整整地写出来,再就是指定规则在所选链中的序号(每条链的规则都各自从1被编号)
-R, –replace iptables -R INPUT 1 -s 192.168.0.1 -j DROP 在所选中的链里指定的行上(每条链的规则都各自从1被编 号)替换规则。它主要的用处是试验不同的规则。当源地址或目的地址是以名字而不是ip地址的形式出现 时,若这些名字可以被解析为多个地址,则这条command会失败
-I, –insert iptables -t filter -I INPUT 1 –dport 80 -j ACCEPT 根据给出的规则序号向所选链中插入规则。如果序号为1, 规则会被插入链的头部,其实默认序号就是1
-F, –flush iptables -t filter -F INPUT 清空所选的链。如果没有指定链,则清空指定表中的所有链。如果什么都没有指定,就清空默认表所有的链。当然,也可以一条一条地删,但用这个command会快些
-Z, –zero iptables -Z INPUT 把指定链(如未指定,则认为是所有链)的所有计数器归零

查看

参数 样例 说明
-L , –list iptables -t filter -L INPUT 显示所选链的所有规则。如果没有指定链,则显示指定表中 的所有链。如果什么都没有指定,就显示默认表所有的链。精确输出受其它参数影响,如-n和-v等参数
-n iptables -nL 以端口和ip显示
-v iptables -nvL 显示详细信息,可使用-vv,-vvv查看更详细的信息
-x iptables -nxL 显示计数器的精确值而非单位换算后的结果
–line-numbers iptables –line-numbers 显示所有规则的编号

匹配条件

参数 样例 说明
[!] -s, –source address[/mask] iptables -A INPUT -s 192.168.1.1 匹配IP原地址: 1、单个ip地址 2、网段地址 3、取反地址,在地址前面加“!”号 4、缺省是任意地址
[!] -d, –destination address[/mask] iptables -A INPUT -d 192.168.1.1 匹配IP目标地址,与原地址一样
[!] -i, –in-interface name iptables -A INPUT -i eth0 限制报文流入接口,只能用于PREROUTING,INPUT及FORWARD
[!] -o, –out-interface name iptables -A INPUT -o eth0 限制报文流出的接口,只能用于OUTPUT,FORWARD及POSTROUTING

扩展匹配条件

隐式扩展 tcp : 隐含 -m tcp
参数 样例 说明
[!] –source-port, –sport port[:port] iptables -A INPUT -p tcp –sport 22 -j ACCEPT 基于TCP包的源端口来匹配包,端口的指定形式如下:1、不指定此项,则暗示所有端口。2、使用的端口名字必须是在/etc/service中定义的端口 3、可以使用连续的端口,如:–sport 22:25,表示从22号端口到25号端口 4、–sport :80 表示0到80 5、–sport 22: 表示22到65535
[!] –destination-port, –dport port[:port] iptables -D INPUT –dport 80 -j ACCEPT 匹配报文中的tcp首部的目标端口;可以是端口范围,使用方式与–sport大同小异
[!] –tcp-flags mask comp iptables -A INPUT –tcp-flags syn,fin,ack,rstsyn 检查报文中mask指明的tcp标志位,而要这些标志位comp中必须为1, 例子中表示tcp三次握手中的第一次回话,用于控制tcp连接
[!] –syn iptables -A INPUT –syn –syn相当于“–tcp-flags syn,fin,ack,rst syn”;tcp三次握手的第一次
隐式扩展 icmp : 隐含 -m icmp
参数 样例 说明
[!] –icmp-type iptables -A INPUT -p icmp –icmp-type 8 icmp-type常用类型 0:icmp response 8:icmp request
显示扩展
参数 样例 说明
multiport iptables -I INPUT 1 -s 0/0 -d 172.18.100.6 -p tcp -m multiport –dports 22,80 -j ACCEPT 多端口匹配,以离散方式定义多端口匹配,最多可以指定15个端口 [!] –source-ports, –sports port[,port | port:port] [!] –destination-ports , –dports port[,port|,port:port] [!] –ports port[,port | ,port:port]
iprange iptables -A INPUT -p tcp –dport 22 -m iprange –src-range 172.18.4.5-172.18.4.20 -j ACCEPT 指明一段连续的ip地址范围做为源地址或目标地址匹配 [!] –src-range from[-to] 源地址范围 [!] –dst-range from[-to] 目标地址范围
string iptables -I OUTPUT -s 172.18.100.6 -d 0/0 -p tcp –sport 80 -m string –algo bm –string “old” -j REJECT 对报文中的应用层数据做字符串匹配检测 –algo {bm|kmp} 算法 [!] –string pattern 给定要检查的字符串模式 [!] –hex-string pattern 给定要检查的字符串模式 16进制编码
time iptables -R INPUT 4 -d 172.18.100.6 -p tcp –dport 23 -m iprange –src-range 172.18.100.1-172.18.100.100 -m time –timestart 09:00:00 –timestop 16:00:00 –weekdays 1,2,3,4,5 -j ACCEPT 根据收到报文的时间/日期与指定的时间/日期范围进行匹配 –datestart 开始日期 –datestop 结束日期 –timestart 开始时间 –timestop 结束时间 [!] –monthdays day[,day] 匹配一个月中的哪些天 [!]–weekdays day[,day] 匹配一周中的哪些天
connlimit iptables -A INPUT -s 0/0 -d 172.18.100.6 -p tcp –dport 23 -m connlimit –connlimit-upto 2 -j ACCEPT 根据每客户端主机做并发连接数限制,即每客户端最多可同时发起的连接数量. –connlimit-upto n:连接数量小于等于n则匹配; –connlimit-above n:连接数量大于n则匹配
limit iptables -R INPUT 3 -d 172.18.100.6 -p icmp –icmp-type 8 -m limit –limit 20/minute –limit-burst 3 -j ACCEPT 基于令牌桶算法对报文的速率做匹配, –limit rate[/second|/minute|/hour|/day]: 最大平均匹配速率 –limit-burst number: match峰值,指单位时间内最多可以匹配几个包 限制特定包瞬间传入的峰值,一次同时涌入的包是否超过此值,如果超过就丢弃
state [!] –state state iptables -A INPUT -m state –state RELATED,ESTABLISHED 指定要匹配包的的状态,当前有4种状态可用:INVALID,ESTABLISHED,NEW和RELATED。 INVALID意味着这个包没有已知的流或连接与之关 联,也可能是它包含的数据或包头有问题。ESTABLISHED意思是包是完全有效的,而 且属于一个已建立的连接,这个连接的两端都已经有数据发送。NEW表示包将要或已 经开始建立一个新的连接,或者是这个包和一个还没有在两端都有数据发送的连接有关。RELATED说明包正在建立一个新的连接,这个连接是和一个已建立的连接相关的。比 如,FTP data transfer,ICMP error 和一个TCP或UDP连接相关。注意NEW状态并不在试图建立新连接的TCP包里寻找SYN标 记,因此它不应该不加修改地用在只有一个防火墙或在不同的防火墙之间没有启用负载平衡的地方
mac iptables -A INPUT -m mac –mac-source aa:bb:cc:dd:ee:ff -j DROP 根据mac地址过滤 , –mac-source 后面接请求方的mac地址
statistic iptables -A PREROUTING -t nat -d 172.17.64.8 -m statistic –mode nth –every 2 –packet 0 -j DNAT –to-destination xx.89.191.141 某些统计条件匹配数据包, –mode mode : 设置匹配规则的匹配模式,支持的模式是随机的,第n个。–probability p : 将数据包的概率从0设置为1,以便随机匹配。 它只适用于随机模式。–every n : 每n个数据包匹配一个数据包。 它只适用于第n个模式(另请参阅–packet选项)。–packet p : 设置第n个模式的初始计数器值(0 <= p <= n-1,默认为0)
addrtype

动作

  1. ACCEPT 放行
    这个target没有任何选项和参数,使用也很简单,指定-j ACCEPT即可。一旦包 满足了指定的匹配条件,就会被ACCEPT,并且不会再去匹配当前链中的其他规则或同一个表内的其他规则, 但它还要通过其他表中的链,而且在那儿可能会被DROP也说不准

  2. DROP target 丢弃
    如果包符合条件,这个target就会把它丢掉,也就是说包的生命到此结束,不会再向前走一 步,效果就是包被阻塞了。在某些情况下,这个target会引起意外的结果,因为它不会向发送者返回任何信 息,也不会向路由器返回信息,这就可能会使连接的另一方的sockets因苦等回音而亡:) 解决这个问题的较 好的办法是使用REJECT target,(译者注:因为它在丢弃包的同时还会向发送者返 回一个错误信息,这样另一方就能正常结束),尤其是在阻止端口扫描工具获得更多的信息时,可以隐蔽被 过滤掉的端口等等(译者注:因为扫描工具扫描一个端口时,如果没有返回信息,一般会认为端口未打开或 被防火墙等设备过滤掉了)。还要注意如果包在子链中被DROP了,那么它在主链里也不会再继续前进,不管 是在当前的表还是在其他表里。总之,包死翘翘了

  3. DNAT target
    iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 –dport 80 -j DNAT –to-destination 192.168.1.1-192.168.1.10
    目标地址转换,例子表示,所有发往地址15.45.23.67的包都转发到一段LAN使用的私有地址中,即192.168.1.1到 192.168.1.10

    iptables -t nat -A PREROUTING -d 172.18.4.71 -p tcp –dport 80 -j DNAT –to-destination 10.0.0.10:8080

    修改IP报文中的目标IP地址
    让本地网络中服务器使用统一的地址向外提供服务(发布服务),但隐藏了自己的真实地址;
    请求:由外网主机发起,修改其目标地址,由管理员定义;
    响应:修改源地址,但由nat自动根据会话表中的追踪机制实现对应修改;

  4. RETURN
    如果当前CHIAN是别的CHAIN调用的子CHIAN,那么返回到调用点下一条规则处开始执行,如果当前CHIAN不是子CHAIN,那么就以默认策略执行.

    1. 从一个CHAIN里可以jump到另一个CHAIN, jump到的那个CHAIN是子CHAIN.
    2. 从子CHAIN return后,回到触发jump的那条规则,从那条规则的下一条继续匹配.
    3. 如果return不是在子CHAIN里,而是在main CHAIN,那么就以默认规则进行.
  5. LOG target : 只是记录封包信息,不会对包进行处理,这个封包会继续匹配INPUT链中其他规则
    iptables -I FORWARD 2 -s 10.0.1.0/24 -p tcp -m multiport –dports 80,21,22,23 -m state –state NEW -j LOG –log-prefix “(new connctions)”
    记录日志,可以通过状态机制记录,默认记录在:/var/log/message

    –log-level level
    emerg, alert, crit, error, warning, notice, info or debug
    –log-prefix prefix

  6. REDIRECT target
    iptables -t nat -A PREROUTING -d 172.18.100.67 -p tcp –dport 80 -j REDIRECT –to-ports 8080
    端口重定向,将客户端访问的端口重定向至其他端口,可以有效隐藏真实端口

  1. SNAT taget
    iptables -t nat -A POSTROUTING -j SNAT –to-source 172.18.4.1

    修改IP报文中的源IP地址;
    让本地网络中的主机可使用统一地址与外部主机通信,从而实现地址伪装;
    请求:由内网主机发起,修改源IP,如果修改则由管理员定义;
    响应:修改目标IP,由nat自动根据会话表中追踪机制实现相应修改;

  2. MASQUERADE target
    iptables -t nat -A POSTROUTING -j MASQUERADE
    可以自动探测外网IP地址,用于在公网地址不固定的场景,例如:ppoe拨号

  3. MARK
    防火墙标记

利用iptables 防止DOS攻击
iptables -A INPUT -p tcp –dport 80 -m limit –limit 25/m –limit-burst 100 -j ACCEPT

例子

  1. 限速 【需要重新实验】

    iptables -A INPUT -i lo -p icmp -m limit –limit 10/s –limit-burst 5 -j ACCEPT
    iptables -A INPUT -i lo -p icmp -j REJECT

  2. 限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机

    周一不允许访问
    iptables -A INPUT -p tcp –dport 80 -m time ! –weekdays Mon -j ACCEPT
    iptables -A OUTPUT -p tcp –dport 80 -m state –state ESTABLISHED -j ACCEPT
    新请求的速率不能超过100个每秒
    iptables -A INPUT -p tcp –dport 80 -m limit –limit 100/s -j ACCEPT
    web服务器包含了admin字符串的页面不允许访问
    iptables -A INPUT -p tcp –dport 80 -m string –algo kmp –string “admin” -j REJECT
    web服务器仅允许响应报文离开本机
    iptables -A OUTPUT -p tcp –sport 80 -m state –state ESTABLISHED -j ACCEPT

  3. 在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.18.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;

    iptables -A INPUT -p tcp –dport 21 -s 172.18.0.0/16 -m time ! –weekday 6,7 -m time –timestart 8:30 –timestop 18:00 -m connlimit –connlimt-upto 5 -j ACCEPT

  4. 开放本机的ssh服务给172.18.x.1-172.18.x.100中的主机,x为你的学号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;

    iptables -A INPUT -p tcp –dport 22 -m iprange –src-range 172.18.1.1-172.18.1.100 -m limit –limit 2/m -j ACCEPT
    iptables -A OUTPUT -p tcp –sport 22 -m iprange –dst-range 172.18.1.1-172.18.1.100 -m state –state ESTABLISHED -j ACCEPT

  5. 拒绝TCP标志位全部为1及全部为0的报文访问本机;

    iptables -A INPUT -p tcp –tcp-flags ALL ALL -j DROP

  6. 允许本机ping别的主机;但不开放别的主机ping本机;

    iptables -A INPUT -p icmp –icmp-type echo-request -j REJECT
    iptables -A INPUT -p icmp –icmp-type echo-reply -j ACCEPT
    iptables -A INPUT -p icmp –icmp-type destination-Unreachable -j ACCEPT
    或者 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

  7. 修改所有内网主机访问互联网时都是用外网接口IP,两种方式

    iptables -t nat -A POSTROUTING -j SNAT –to-source 12.12.12.12
    iptables -t nat -A POSTROUTING -j MASQUERADE

  8. 修改所有访问外网地址端口为80的都修改为内网提供web服务的8080端口,新请求建立的速率一分钟不得超过5个,访问字符串不可以包含’sex’并记录日志,且开头为 “weblog”

    iptables -t nat -A PREROUTING -p tcp –dport 80 -j DNAT –to-destination 192.168.0.2:8080
    iptables -t filter -A FORWARD -p tcp -d 192.168.0.2 –dport 8080 -m state –state NEW -m limit –limit 5/m -m string –algo kmp ! –string “sex” -j LOG –log-prefix “weblog”

补充

SYN Flood syn洪水: SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,常用假冒的IP或IP号段发来海量的请求连接的第一个握手包(SYN包),被攻击服务器回应第二个握手包(SYN+ACK包),因为对方是假冒IP,对方永远收不到包且不会回应第三个握手包。导致被攻击服务器保持大量SYN_RECV状态的“半连接”,并且会重试默认5次回应第二个握手包,塞满TCP等待连接队列,资源耗尽(CPU满负荷或内存不足),让正常的业务请求连接不进来。

如何判断是否遭受SYN攻击

netstat -n -p -t 显示所有tcp的连接 如果源ip地址是随机的,并且存在大量的半连接状态

如何防止

修改系统参数

net.ipv4.tcp_synack_retries 表示回应第二个握手包(SYN+ACK包)给客户端IP后,如果收不到第三次握手包(ACK包)后,进行重试的次数, 默认为5,可以改成更小的值,阿里云设置的是2

[root@iz2zecj7a5r32f2axsctb9z log]# sysctl -a | grep tcp_synack_retries
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_max_syn_backlog 表示等待连接的队列长度,可以修改成比较大的值,阿里云设置的是1024
[root@iz2zecj7a5r32f2axsctb9z log]# sysctl -a | grep tcp_max_syn_backlog
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_syncookies 接收SYN不分配资源,只是计算一个cookie值,之后接收到ACK后验证是否有效的, 阿里云默认为1
[root@iz2zecj7a5r32f2axsctb9z log]# sysctl -a | grep tcp_syncookie
net.ipv4.tcp_syncookies = 1

sysctl -w 写入参数
sysctl -p 配置生效

iptables 限制SYN并发数

iptables -A INPUT -p tcp –syn -m limit –limit 1/s -j ACCEPT 限制次数
iptables -A INPUT -p tcp –tcp-flags ALL NONE -j DROP 丢弃NULL数据包

iptables 实现负载均衡

  • 实现随机端口转发

    iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-ports 8001-8002

  • 实现方式: 随机、轮询

  1. 随机

    iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 –dport 27017 -m statistic –mode random –probability 0.33 -j DNAT –to-destination 10.0.0.2:1234
    iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 –dport 27017 -m statistic –mode random –probability 0.5 -j DNAT –to-destination 10.0.0.3:1234
    iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 –dport 27017 -j DNAT –to-destination 10.0.0.4:1234

    rules说明:
    第一条规则中,指定–probability 0.33 ,则说明该规则有33%的概率会命中,
    第二条规则也有33%的概率命中,因为规则中指定 –probability 0.5。 则命中的概率为:50% * (1 - 33%)=0.33
    第三条规则中,没有指定 –probability 参数,因此意味着当匹配走到第三条规则时,则一定命中,此时走到第三条规则的概率为:1 - 0.33 -0.33 ≈ 0.33。
    由上可见,三条规则命中的几率一样的。此外,如果我们想修改三条规则的命中率,可以通过 –probability 参数调整。
    假设有n个server,则可以设定n条rule将流量均分到n个server上,其中 –probability 参数的值可通过以下公式计算得到:
    p=1/(n−i+1)

    其中 i 代表规则的序号(第一条规则的序号为1)
    n 代表规则/server的总数
    p 代表第 i 条规则中 –probability 的参数值

  2. 轮询

    iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 –dport 27017 -m statistic –mode nth –every 3 –packet 0 -j DNAT –to-destination 10.0.0.2:1234
    iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 –dport 27017 -m statistic –mode nth –every 2 –packet 0 -j DNAT –to-destination 10.0.0.3:1234
    iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 –dport 27017 -j DNAT –to-destination 10.0.0.4:1234

    轮询算法中有两个参数:
    n: 指每 n 个包
    p:指第 p 个包
    在规则中 n 和 p 代表着: 从第 p 个包开始,每 n 个包执行该规则。

文档更新时间: 2021-01-22 05:12   作者:周国强