iptables 匹配规则
1. 源地址匹配:
a. ip地址匹配
iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROP
用“,”分隔多个源地址,地址与“,”之间不能有空格
b. 网段匹配
iptables -t filter -I INPUT -s 192.168.1.0/24 -j DROP
c. 反向匹配
iptables -t filter -I INPUT ! -s 192.168.1.10 -j ACCEPT
当源地址不是192.168.1.10时ACCEPT,注意!当源地址是192.168.1.10时,此规则匹配不上,不会因为此规则而拒绝!
2. 目的地址匹配:
参数 -d ,使用方法与源地址匹配一致
3. 协议匹配:
参数 -p :protocol
iptables -t filter -A INPUT -p tcp -j ACCEPT
-p支持的协议有:tcp, udp, udplite, icmp, icmpv6, ah, sctp等
其中ping属于icmp协议,ssh属于tcp协议
4. 网卡匹配
iptables -t filter -I INPUT -i eth0 -j ACCEPT
参数 -i, -o, 其中-i表示入网卡,-o表示出网卡。-i参数可用于prerouting,forward,input。3个链。-o参数可用于forward,output,postrouting。3个链。也可用使用“!”表示反向匹配
5. 扩展匹配
端口匹配:
上述4种匹配规则都属于基本匹配,端口匹配属于扩展匹配,需要导入扩展模块并且需要指定匹配协议
例: iptables -t filter -I INPUT -p tcp -m tcp --dport 22 -j ACCEPT
其中 -p 指定协议,-m 指定扩展模块,--dport/--sport 指定目的端口/源端口(注意双中横线),-m可缺省,默认使用与-p相同的模块
其他用法:
反向匹配: ! --dport 22 目的端口不等于22
区间匹配: --dport 22:25 目的端口在[22,25]之间
--dport 22: 目的端口在[22:65535]之间
--dport :80 目的端口在[0:80]之间
离散端口匹配: iptables -t filter -I INPUT -p tcp -m multiport --dport 1,2,3,4
连续ip匹配:
例: iptables -t filter -I INPUT -m iprange --src-range 1.1.1.1-1.1.1.4 -j DROP
也可以使用!来取反,如:iptables -t filter -I INPUT -m iprange ! --src-range 1.1.1.1-1.1.1.4 -j DROP
报文内容匹配:
其中: --algo 指定匹配算法。包括bm与kmp。
--string 需要匹配的字符串
时间段匹配:
例: iptables -t filter -I INPUT -m time --timestart 09:00:00 --timestop 19:00:00 -p tcp --dport 80 -j ACCEPT含义:在09到19点时间内,拒绝所有从80端口进入的tcp请求
time 模块参数
--timestart 起始时间
--timeend 结束时间
--weekdays 星期n,可选值有1到7,也有Mon,Tue,Wed,Thu,Fri,Sat,Sun。可以使用!取反
--monthdays 一个月的第几天。可以使用!取反
--datestart 一个月的起始天数
--dateend 一个月的结束天数
例: iptables -t filter -I INPUT -m time ! --weekdays 6,7 ! --monthdays 22.23 --timestart 09:00:00 --timestop 19:00:00 --datestart 2018-10-10 --datestop 2018-12-12 -p tcp --dport 80 -j ACCEPT
含义:当(今天不是星期6或星期7)且(今天不本月的22或23好)且(当前时间在09到19点之间)且(今天的日志在2018-10-10到2018-12-12号之间)且(是TCP协议)且(目标端口是80)则接受请求
连接数匹配:
--connlimit-above 连接数超过n时
--connlimit-upto 等价于 !--connlimit-above 当连接数未达到之低昂连接数时
报文速率限制:
但是当每分钟数量超过10个时,没有相应逻辑,当想要完成超过10请求每分钟则拒绝请求的逻辑需要配合一条拒绝逻辑使用。如:
参数:
--limit-brust 表示“令牌桶”算法中令牌的数量,默认为5
--limit 结合令牌桶算法,可以理解为生成令牌的速率。白话可粗略理解为放过包的速率
可选速率限制参数:
/second,/minute,/hour,/day表示n个请求每秒/分/小时/天
其中:令牌桶逻辑为:每建立一个请求需要消耗一个令牌,请求释放时销毁令牌。当没有可用令牌时,请求被拒绝。在默认5令牌的情况下,10/minute 不是每6秒接受一个请求,而是每6秒生成一个令牌到令牌桶。只要桶中有令牌请求就可以通过。limit-brust表示令牌桶中的令牌最大值
icmp协议限制:
例:iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECT
含义:不接受ping请求,但是可以执行ping操作
--icmp-type表示 icmp请求类型,8/0分别表示type/code。细节见下图(来自朱双印先生的博客http://www.zsythink.net/archives/1588)
请求state限制:
如果我们的机器不希望被别人主动连接,只希望接接受别人对我们的请求做出的相应,可这样做
iptables -t filter -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
表示接受ESTABLISHED和RELATED的请求,当然想要达到不响应别人的请求,需要在此之后加一条拒绝所有请求