iptables详解(4):iptables匹配条件总结之一

基本匹配条件

-s  匹配条件 源地址

①  一次性指定多个ip源地址,用“逗号”隔开,多个特定ip地址

iptables -t filter -I INPUT -s 192.168.23.242,192.168.23.47 -j DROP

   

 

②  指定特定网段

 iptables -I INPUT -s 192.168.23.0/24 -J DROP

  

 

③  匹配取反条件

iptables -t filter -A INPUT ! -s 192.168.23.246 -j ACCEPT

意思为不是23.246的包就可以接受 但是没有指明23.246的包如何处理

所以23.246的包应该是没有匹配规则之后就会执行默认的规则也就是accpet规则所以取反规则相当于无效。

 

-d 匹配条件目标地址

我们可以用如下规则去查看我们当前机器的地址总共有多少

ifconfig | awk '/inet addr/{print $1,$2}'

比如当前机器有多个网络出口,当前我只对某个接口进行接口的生效作用,当我个更换机器的的网络出口的时

该网络协议包还是可以正常运作,以路由器为例

当前路由器有蜂窝LTE出口ip、wlan出口ip、wan口出口ip、lan口出口ip等等

 


①指定不接收某个指定 ip 地址,指定不接收wan口请求相关的ping包等

 

 

iptables -I INPUT -s 192.168.23.46 -d 192.168.23.44 -j DROP

则当前规则生效

②一次性指定多个ip地址和-s一样

 

-p 协议类型

①只想拒绝 tcp请求  

 iptables -t filter -I INPUT -s 192.168.23.246 -d 192.168.23.44 -p tcp -j DROP  

当前ping还是可以ping通 但是ssh失败了失去响应 说明当前的防火墙规则生效

 

 

在centos6中,-p支持的协议类型有

tcp、udp、udplite、icmp、esp、ah、sctp

centos7中除了上面的协议外 还支持 icmpv6、mh

当不适用-p则默表示所有类型的协议都会被匹配到,与使用-p all的效果相同

 

-i  网卡接口

-i 用于匹配报文流入的网卡, 从网卡出去的报文是不会用到-i选项的

 

 

 

 -i  一般用于PREROUTING、INPUT链、FORWARD链

当主机有多块网卡时,可以使用-o选项,匹配报文将由哪块网卡流出,-o和-i是相对的,-i用于匹配报文从哪个网卡流入。-o 匹配从哪个网卡流出

-o  一般只能是POSTROUTING链、OUTPUT链、 FORWARD链

 

扩展匹配条件

--dport(--sport)源端口目的端口

基本匹配条件如源地址、目的地址可以直接用 然而扩展匹配条件的使用 需要依赖相应的扩展模块。

 如果在-p中已经指定协议,则默认使用协议中写的模块名。

 如果没有必须要指定对应的模块 -m +模块名 这样才能正常使用 --dport功能

 --dport(--sport)

① 在使用--dport之前一定要先定义好是在哪个模块协议上进行使用的

否则会无法正常使用 --sport  

iptables -I INPUT -p tcp -s 192.168.23.246 --sport 22 -j DROP

 

 

 

② 拒绝多个端口的访问 可以在-m 后面加上multiport加上多个端口

iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT

 

 

 

③ 用 :的方式来决定当前的端口是从哪个端口到哪个端口

iptables -A INPUT -p tcp -m multiport --dports 22,80,22:443 -j ACCEPT

  

--src-range (--dst-range)

指定一段连续的ip地址范围

iptables -I INPUT -m iprange --src-range 192.168.23.240-192.168.23.246 -j DROP

 

--string

--alogo指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项

--string指定需要匹配的字符串

报文中包含字符XXX,我们就丢弃当前的报文

 iptables -I INPUT -m string --algo bm --string "百度一下" -j REJECT

-m string表示使用string模块--algo bm表示用bm算法去匹配指定的字符串,--string " "要匹配的内容

--algo:用于指定匹配算法 可选的算法有bm和kmp 此选项为必选项  

 

 

 

time 

表示报文到达的时间在指定的时间范围内 则符合匹配条件

比如在指定的时间内规定不能看网页,如家中的熊孩子周六日的早上9:00到下午6:00不能浏览网页

--timestart 指定时间范围的开始时间,不可取反

--timestop 指定时间范围的结束时间,不可取反

--weekdays 指定星期几 可取反

--monthdays 指定几号,可取反

--datestart 用于指定日期范围的开始日期 不可取反

--datestop 用于指定日期范围的结束时间 不可取反

 

iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time ! --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT

 

限制从2019.12.15-2019.12.16都不能上网

 

 

 

connlimit模块

主要用来限制连接服务器的数量

常用的扩展匹配条件如下

--connlimit-above 单独使用此选项时,表示限制每个ip的链接数量

--connlimit-mask 选项不可单独使用,配合--connlimit-above选项,配合此选项针对某类ip段内的一定数量的ip进行连接数量限制

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT

限制链接数量上限,如每个ip地址最多只能占用2个ssh链接远程到server端,我们可以用如下的限制

 

 

 

可以发现第三个连接就不能正常连接进来了

 

 

 mask为掩码的意思 24转换成十进制表示的是255.255.255.0一个最多只能包含254个ip的C类网址中,

同时最多只能有2个ssh客户端连接到当前服务器...如果子网掩码是27  表示为这个网段中最多只能有30个ip

 

 

limit模块

主要用来调整网络流量和速率限制

--limit-burst 类比令牌桶算法 此选项用于指定令牌桶中令牌的最大数量

--limit 类比令牌桶算法 此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有second minute hour day

iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
iptables -t filter -A INPUT -p icmp -j REJECT

令牌桶算法是网络流量整形(Traffic Shaping)和速率限制(Rate Limiting)中最常使用的一种算法。典型情况下,令牌桶算法用来控制发送到网络上的数据的数目,并允许突发数据的发送。

大小固定的令牌桶可自行以恒定的速率源源不断地产生令牌。如果令牌不被消耗,或者被消耗的速度小于产生的速度,令牌就会不断地增多,直到把桶填满。后面再产生的令牌就会从桶中溢出。最后桶中可以保存的最大令牌数永远不会超过桶的大小。

如果令牌桶中存在令牌则允许发送流量,如果令牌桶中不存在令牌,则不允许发送流量

令牌桶算法 假如用户配置的平均发送速率为r,每个1/r 秒 一个令牌被加入捅中

假设桶最多可以存b个令牌 如果令牌桶满 则令牌会被丢弃

当一个n个字节(一个字节需要一个令牌才能发送数据)的数据包到达 就从令牌桶中拿出那个令牌 将数据包发送到网络

如果令牌桶中少于 n个令牌,那么数据包在流量限制之外,

对于在流量限制之外的数据包的处理方式有以下几种

 

1 被丢弃    2排列在队列中当令牌桶积累足够多令牌再传输    3 单个数据包拿单个令牌继续发送需要做特殊标记 网络过载时就会把这些特殊标记包丢弃

--limit用于指定多长时间生成一个新令牌的b limit-burst指的是木桶中最多存放几个令牌

如上例中表示令牌桶最多存放3个令牌 每分钟生成10个令牌(6s 生成一个令牌)

 

对报文到达速率进行限制 想要限制单位时间内流入的包的数量 就用limit模块(单位时间可以是 分钟 小时 天)

比如限制本机最多每6s放行一个ping包 

 

--tcp-flags

tcp头中的标志位 结构表如下

 

 

 

 

 

 第一条命令为第一次握手的报文 第二条命令为第二次握手的报文

iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECT
iptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECT
iptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECT

  

posted @ 2019-12-12 19:59  陈晓猛  阅读(4580)  评论(0编辑  收藏  举报