iptables命令
iptables包分析
①查看iptables来源于哪个rpm包
[root@centos8-8 ~]# rpm -qf `which iptables`
iptables-1.8.2-9.el8.x86_64
②iptables包提供的工具:
[root@centos8-8 ~]# rpm -ql iptables
/usr/sbin/iptables
/usr/sbin/iptables-restore 还原定义的防火墙规则的
/usr/sbin/iptables-save 保存已定义好的防火墙规则
③提供的功能模块:
[root@centos8-8 ~]# rpm -ql iptables | grep .so
/usr/lib64/xtables/libxt_string.so
/usr/lib64/xtables/libxt_udp.so
/usr/lib64/xtables/libxt_time.so
......
==>iptables的模块,扩展了iptables的功能。
④查看iptables命令的帮助获取:
centos6上:直接man [8] iptables即可 既有iptables的基本功能也有iptables配合模块的功能使用
[root@centos6-16 ~]#man iptables
centos7/8上: man iptables只有iptables的基本功能用法
[root@centos7-17 ~]# man iptables
模块的帮助:
[root@centos7-17 ~]# man iptables-extensions
iptables命令定义策略
-
iptables命令定义规则图示:
-
规则格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
1.table
- -t table:
- raw, mangle, nat, [filter]默认
2.SUBCOMMAND(子命令)
- ㈠、链管理:
- -N:new, 自定义一条新的规则链
- -X:delete,删除自定义的空的规则链
- -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃 - -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
与自定义链相关的选项:
-N:
-E:
-X:
自定义链的使用
①定义自定义链:
~]#iptables -t filter -N web
②添加自定义链的规则
.....
③自定义链的使用
自定义链需要与默认的内置链(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING)关联才能使用
==> 自定义链相当于编程中函数。
删除自定义链的步骤:
①删自定义链的关联
②清空自定义链的规则
③删除自定义空链
- ㈡、查看:
- -L:list, 列出指定鏈上的所有规则,本选项须置后
- -n:numberic,以数字格式显示地址和端口号
- -v:verbose,详细信息
- -vv 更详细
- -x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
- –line-numbers:显示规则的序号
查看的常用组合:
①-vnL
②-vvnxL --line-numbers
③-S selected,以iptables-save命令格式显示链上规则
~]# iptables -vnL
~]# iptables -vnL --line-numbers
~]# iptables -S
==>同一个表的同一链中:
规则生效是按照num(序号),一旦前面的序号满足匹配条件,就执行相应的处理动作。
- ㈢、规则管理:
- -A:append,追加
- -I:insert, 插入,要指明插入至的规则编号,默认为第一条
- -D:delete,删除
(1) 指明规则序号
(2) 指明规则本身 - -R:replace,替换指定链上的指定规则编号
- -F:flush,清空指定的规则链
- -Z:zero,置零
iptables的每条规则都有两个计数器
● (1) 匹配到的报文的个数
● (2) 匹配到的所有报文的大小之和
3、chain(链):PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
- 说明:此处实验iptables设置防火墙规则均在centos7 192.168.38.17上设置
NAT ip:192.168.38.17
桥接 ip:172.18.2.2
iptables的简单使用示例
iptables命令示例:
[root@centos7-17 ~]# iptables -t filter -A INPUT -s 192.168.38.8 -j DROP
上述iptables规则详解:
-t filter:filter表:用于过滤
-A INPUT:INPUT链 ==>表示数据报文目标是本机,无论本机有几个ip,反正数据报文的dest是本机
-s IP: 指数据报文的源地址
-j DROP:表示明确拒绝访问
-j, --jump target 跳到target
==>说明:此处虽并未指明目标地址,但是规则加在的INPUT链上,指明目标地址是本机
==>INPUT链表明:只要数据报文是目标本机(目前实验192.168.38.17)的ip,均受到INPUT链'关卡'控制
==>实际上当前实验的centos7主机上还有一个桥接网卡的ip:172.18.2.2
==>综上:iptables -t filter -A INPUT -s 192.168.38.8 -j DROP这条规则定义了本机将拒绝192.168.38.8主机的访问。
==>但是没有标明192.168.38.8以怎样的方式发送数据报文至我本机,但是本机的均拒绝接收192.168.38.8的数据报文。
==>iptables此时的过滤的条件是ip地址,并不会在乎是什么样的数据报文。
主机收到数据报文的默认策略===>ACCEPT:
[root@centos7-17 ~]# iptables -t filter -vnL
Chain INPUT (policy ACCEPT 440 packets, 40374 bytes)
==>默认策略:ACCEPT
修改默认策略:-P选项
[root@centos8-8 ~]# iptables -P INPUT DROP
[root@centos8-8 ~]# iptables -t filter -vnL --line-number
Chain INPUT (policy DROP 0 packets, 0 bytes)
3 0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
但是一般不会修改默认的规则,如果清空策略,导致远程连接也失败,比较麻烦。
一般定义白名单策略时,在最后添加一个拒绝所有,而不会修改默认策略。
示例一:丢弃192.168.38.8的一切数据报文
[root@centos7-17 ~]# iptables -t filter -A INPUT -s 192.168.38.8 -j DROP
查看添加的规则:--line-number选项在规则有重叠时,或需要定义多个规则查询时附加此选项。
[root@centos7-17 ~]# iptables -vnL --line-number 查看添加的规则
Chain INPUT (policy ACCEPT 56 packets, 4145 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DROP all -- * * 192.168.38.8 0.0.0.0/0
iptables规则的匹配原则:
同一个表中同一链中,以num为次序,规则一旦满足就不继续往下匹配。
由于iptables的规则匹配原则:
==>定义规则的先后顺序:
1、同类规则(访问同一应用),匹配范围小的放在前面,用于特殊处理。
2、不同类的规则(访问不同应用),匹配范围大的放在前面。
3、应该将那些可由一条规则能够描述的多个规则合并为一条。
4、不相干的规则,访问频率高的往前放。
示例二:DROP和REJECT的区别
DROP:丢弃,通信对方不知道。
[root@centos7-17 ~]# iptables -t filter -A INPUT -s 192.168.38.8 -j DROP
使用192.168.38.8 ping 192.168.38.17
[root@centos8-8 ~]# ping 192.168.38.17
PING 192.168.38.17 (192.168.38.17) 56(84) bytes of data.
....
在192.168.38.17主机上抓取数据包:
[root@centos7-17 ~]# tcpdump -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
19:24:33.145437 IP 192.168.38.8 > 192.168.38.17: ICMP echo request, id 7071, seq 319, length 64
19:24:34.169550 IP 192.168.38.8 > 192.168.38.17: ICMP echo request, id 7071, seq 320, length 64
==>只看见从192.168.38.8主机过来的数据报文,但是由于规则匹配,从192.168.38.8来的数据报文全部DROP(丢弃),而192.168.38.8主机并不知道。
REJECT:
192.168.38.17 添加的iptables规则:
[root@centos7-17 ~]# iptables -F
[root@centos7-17 ~]# iptables -t filter -F INPUT 清空一个表的一条链上的所有规则写法
[root@centos7-17 ~]# iptables -t filter -A INPUT -s 192.168.38.8 -j REJECT
[root@centos7-17 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 14 packets, 924 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 192.168.38.8 0.0.0.0/0 reject-with
192.168.38.8 ping 192.168.38.17主机
[root@centos8-8 ~]# ping 192.168.38.17
PING 192.168.38.17 (192.168.38.17) 56(84) bytes of data.
From 192.168.38.17 icmp_seq=1 Destination Port Unreachable
From 192.168.38.17 icmp_seq=2 Destination Port Unreachable
192.168.38.17的响应:
[root@centos7-17 ~]# tcpdump -nn icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 262144 bytes
19:27:47.888309 IP 192.168.38.8 > 192.168.38.17: ICMP echo request, id 7095, seq 8, length 64
19:27:47.888353 IP 192.168.38.17 > 192.168.38.8: ICMP 192.168.38.17 protocol 1 port 27832 unreachable, length 92
==>192.168.38.17 响应192.168.38.8 本主机的端口和对应的协议均不可访问
示例三:拒绝192.168.38.0/24这个网段访问
[root@centos7-17 ~]# iptables -t filter -A INPUT -s 192.168.38.1 -j ACCEPT
[root@centos7-17 ~]# iptables -t filter -A INPUT -s 192.168.38.0/24 -j DROP
[root@centos7-17 ~]#
[root@centos7-17 ~]# iptables -vnL --line-number
Chain INPUT (policy ACCEPT 6 packets, 914 bytes)
num pkts bytes target prot opt in out source destination
1 117 8476 ACCEPT all -- * * 192.168.38.1 0.0.0.0/0
2 0 0 DROP all -- * * 192.168.38.0/24 0.0.0.0/0
==>由于我的实验是基于VMware 软件,因此必须先保证我的192.168.38.1(windows主机ip)可以访问,否则xshell 连接即将端开。
- 注:生成环境工作时配置防火墙规则时一定不要将自己的远程连接都给拒绝
- 可采取的措施:在配置策略时,策略比较复杂,可能导致将自己的远程连接给拒绝,把开始的策略做一个备份,然后定义一个计划任务,5min/10min自动还原开始的备份策略。
示例四:删除iptables中的规则
-F 清空规则
清空一个表的一条链上的所有规则写法
[root@centos7-17 ~]# iptables -t filter -F INPUT
-D 删除某条规则
(1) 指明规则序号
(2) 指明规则本身
[root@centos7-17 ~]# iptables -t filter -D INPUT 2
==>删除序号为2的规则时,后续规则的序号将往上调。
示例五:-I:插入规则
[root@centos7-17 ~]# iptables -vnL --line-number
Chain INPUT (policy ACCEPT 47 packets, 6881 bytes)
num pkts bytes target prot opt in out source destination
1 675 49971 ACCEPT all -- * * 192.168.38.1 0.0.0.0/0
2 0 0 DROP all -- * * 192.168.38.0/24 0.0.0.0/0
[root@centos7-17 ~]# iptables -t filter -I INPUT 2 -s 192.168.38.7 -j ACCEPT
示例六: -R:修改规则
[root@centos7-17 ~]# iptables -vnL --line-number
Chain INPUT (policy ACCEPT 47 packets, 6881 bytes)
num pkts bytes target prot opt in out source destination
1 675 49971 ACCEPT all -- * * 192.168.38.1 0.0.0.0/0
2 0 0 DROP all -- * * 192.168.38.17 0.0.0.0/0
3 0 0 DROP all -- * * 192.168.38.0/24 0.0.0.0/0
[root@centos7-17 ~]# iptables -t filter -R INPUT 2 -s 192.168.38.7 -j ACCEPT
iptables的基本匹配条件
4.匹配条件
-
匹配条件
基本:通用的,PARAMETERS
扩展:需加载模块,MATCH EXTENTIONS -
(一)基本匹配条件:无需加载模块,由iptables/netfilter自行提供
-
[!] -s, --source address[/mask][,…]:源IP地址或范围
-
[!] -d, --destination address[/mask][,…]:目标IP地址或范围
-
[!] -p, --protocol protocol:指定协议,可使用数字如0(all)
protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or “all”
参看:/etc/protocols -
[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
-
[!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
-
iptables命令的基本语法示例如下:
示例一:默认策略是ACCEPT,一般不改默认策略
但是要使用白名单策略可采取的措施:
[root@centos7-17 ~]# iptables -t filter -A INPUT -j REJECT
到达本机的数据报文,默认全部拒绝。然后采取白名单策略。
[root@centos7-17 ~]# iptables -vnL --line-number
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 1606 119K ACCEPT all -- * * 192.168.38.1 0.0.0.0/0
2 49 4956 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
此时:
[root@centos7-17 ~]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
ping 127.0.0.1 也ping不通的127.0.0.11
[root@centos7-17 ~]# ping 192.168.38.17
PING 192.168.38.17 (192.168.38.17) 56(84) bytes of data.
自己ping 自己的ip也ping 不通
ping 127.0.0.1也有走路由表,然后发到INPUT链上,默认策略是拒绝。
==>这样的策略不合理,自己将自己的数据报文都拒收了。
[root@centos7-17 ~]# iptables -t filter -I INPUT 2 -i lo -j ACCEPT
==>插入这样一条策略:只要是回环网卡进来的数据报文,默认接收。、
[root@centos7-17 ~]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.028 ms
[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链。
- [!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
示例二:
[!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
使用-o作为过滤条件时,filter表上设置相应链时:
在POSTROUTING是控制了所有从本机流出的报文,响应报文,转发报文等等。如果POSTROUTING拒绝所有,那么本机与其他主机的通信也将失败。
在OUTPUT上设置的是从本机发出的响应报文(用户空间程序发出的响应报文)在INOUT'关卡'的处理情况。
因此流出的控制,如果拒绝所有,再对特定的主机进行开放,但是防火墙一般是防止外面的数据报文进入本机,一般不会限制本机的数据报文流出。
- (二)扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效
- 查看帮助 man iptables-extensions
(1)隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
tcp协议的扩展选项
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口范围
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为范围
[!] --tcp-flags mask comp
mask 需检查的标志位列表,用,分隔
例如 SYN,ACK,FIN,RST
comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔
iptables的扩展匹配条件
(一)隐式扩展:
- (1)隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块。
比如:tcp、udp、icmp协议名和模块名同名,因此可以直接使用-p指明对应的协议即可。
- tcp协议的扩展选项
-
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口范围
==注:==此处的port必须是连续端口。 -
[!] --destination-port,–dport port[:port]:匹配报文目标端口,可为范围
-
[!] --tcp-flags mask comp
mask 需检查的标志位列表,用,分隔
例如 SYN,ACK,FIN,RST
comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔
–tcp-flags SYN,ACK,FIN,RST SYN 表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
–tcp-flags SYN,ACK,FIN,RST SYN,ACK
–tcp-flags ALL ALL
–tcp_flags ALL NONE -
[!] --syn:用于匹配第一次握手相当于:–tcp-flags SYN,ACK,FIN,RST SYN
-
注:[!]表示可以取反,但是一般不建议使用[!]
-
示例一:隐式扩展 ☞ tcp协议
协议+端口号就能确定是什么服务,比如:tcp 80 httpd服务。
对httpd允许192.168.38.17访问:
[root@centos8-8 ~]# iptables -t filter -I INPUT -s 192.168.38.17 -p tcp --dport 80 -j ACCEPT
[root@centos8-8 ~]# iptables -t filter -vnL --line-number
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 6 396 ACCEPT tcp -- * * 192.168.38.17 0.0.0.0/0 tcp dpt:80
2 1186 79574 ACCEPT all -- * * 192.168.38.1 0.0.0.0/0
3 65 7388 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
[root@centos8-8 ~]# iptables -t filter -I INPUT -s 192.168.38.17 -p tcp --dport 80 -j ACCEPT
==> -t filter:filter表中添加策略
-A INOUT:filter表INPUT链添加策略,其中INPUT表名访问的是本机
-s ip: 指明源地址
-p protocol:隐式扩展,指明协议
--dport port:指明端口号
-j action: 指明处理动作
tcp协议相关的的隐式扩展
--tcp-flags SYN,ACK,FIN,RST SYN 表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
--tcp-flags SYN,ACK,FIN,RST SYN,ACK
--tcp-flags ALL ALL 故障数据包
--tcp_flags ALL NONE 故障数据包
[!] --syn:用于匹配第一次握手相当于:--tcp-flags SYN,ACK,FIN,RST SYN
可以直接将tcp三次握手的第一次握手就是直接进行拒绝。
同时允许ip为192.168.38.17主机访问本的21-23端口:(连续多端口)
[root@centos8-8 ~]# iptables -t filter -I INPUT 2 -s 192.168.38.17 -p tcp --dport 21:23 -j ACCEPT
[root@centos8-8 ~]# iptables -t filter -vnL --line-number
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 3257 237K ACCEPT all -- * * 192.168.38.1 0.0.0.0/0
2 36 4481 ACCEPT tcp -- * * 192.168.38.17 0.0.0.0/0 tcp dpts:21:23
3 10 840 ACCEPT icmp -- * * 192.168.38.17 0.0.0.0/0 icmptype 0 code 0
4 179 20704 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
但是--dport后面的多端口只能是连续端口,不练连续的端口开放,应该使用multiport模块。比如:Samba服务
- ICMP
- [!] --icmp-type {type[/code]|typename}
- type/code ICMP协议用来区别是请求报文,还是响应报文
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
- type/code ICMP协议用来区别是请求报文,还是响应报文
示例二:实现禁ping,但是本机能ping其他主机
ping分析:
ping对方主机是: ping请求报文从本机OUTPUT出去 响应报文INPUT进入本机
对方主机ping本机: ping的请求报文从INPUT进来 本机响应报文从OUTPUT出去
==> 单从数据报文的方向时无法限制的,但是ICMP的数据报文格式中的type类型
8:请求报文
0:响应报文
[root@centos8-8 ~]# iptables -t filter -I INPUT 2 -p icmp --icmp-type 0/0 -s 192.168.38.17 -j ACCEPT
[root@centos8-8 ~]# iptables -t filter -vnL --line-number
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 1713 118K ACCEPT all -- * * 192.168.38.1 0.0.0.0/0
2 2 168 ACCEPT icmp -- * * 192.168.38.17 0.0.0.0/0 icmptype 0 code 0
3 93 10098 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
-
udp
- [!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
- [!] --destination-port,–dport port[:port]:匹配报文的目标端口或端口范围
(二)显式扩展
-
显式扩展:必须显式地指明使用的扩展模块进行的扩展
-
multiport扩展、iprange扩展、mac扩展、string扩展、time扩展、connlimit扩展、limit扩展、state扩展
-
①multiport扩展
以离散方式定义多端口匹配,最多指定15个端口- [!] --source-ports,–sports port[,port|,port:port]…指定多个源端口
- [!] --destination-ports,–dports port[,port|,port:port]…指定多个目标端口
- [!] --ports port[,port|,port:port]…多个源或目标端口
示例一:multiport扩展模块:以离散的方式定义多端口
让ip为192.168.38.17的主机可以访问本机的Samba服务:
==>Samba服务的监听端口:
smb服务的监听端口:TCP的445和139
nmb服务的监听端口:UDP的137和138
[root@centos8-8 ~]# iptables -t filter -I INPUT -s 192.168.38.17 -p tcp -m multiport --dports 139,445 -j ACCEPT
[root@centos8-8 ~]# iptables -t filter -vnL --line-number
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 ACCEPT tcp -- * * 192.168.38.17 0.0.0.0/0 multiport dports 139,445
2 4478 323K ACCEPT all -- * * 192.168.38.1 0.0.0.0/0
3 240 26505 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
- ②iprange扩展
- 指明连续的(但一般不是整个网络)ip地址范围
- [!] --src-range from[-to] 源IP地址范围
- [!] --dst-range from[-to] 目标IP地址范围
示例:
~]# iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --srcrange 172.16.1.5-172.16.1.10 -j DROP
- ③mac扩展
- 指明源MAC地址
适用于:PREROUTING, FORWARD,INPUT chains - [!] --mac-source XX:XX:XX:XX:XX:XX
- 指明源MAC地址
示例:
~]# iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT
- ④string扩展
- 对报文中的应用层数据做字符串模式匹配检测
–algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris - –from offset 开始偏移
- –to offset 结束偏移
- [!] --string pattern 要检测的字符串模式
- [!] --hex-string pattern要检测字符串模式,16进制格式
- 对报文中的应用层数据做字符串模式匹配检测
示例:
~]# iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string - -algo bm --string "google" -j REJECT
- ⑤time扩展
- 根据将报文到达的时间与指定的时间范围进行匹配
- –datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
- –datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
- –timestart hh:mm[:ss] 时间
- –timestop hh:mm[:ss]
- [!] --monthdays day[,day…] 每个月的几号
- [!] --weekdays day[,day…] 星期几,1 – 7 分别表示星期一到星期日
- –kerneltz:内核时区,不建议使用,CentOS7系统默认为UTC
- 注意: centos6 不支持kerneltz ,–localtz指定本地时区(默认)
示例:
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time - -timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
- ⑥connlimit扩展
- 根据每客户端IP做并发连接数数量匹配
- 可防止Dos(Denial of Service,拒绝服务)攻击
- –connlimit-upto #:连接的数量小于等于#时匹配
- –connlimit-above #:连接的数量大于#时匹配
- 通常分别与默认的拒绝或允许策略配合使用
示例:
~]# iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
- ⑦limit扩展
- 基于收发报文的速率做匹配
- 令牌桶过滤器
- –limit #[/second|/minute|/hour|/day]
- –limit-burst number
示例:
~]# iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
- ⑧state扩展
根据”连接追踪机制“去检查连接的状态,较耗资源-
conntrack机制:追踪本机上的请求和响应之间的关系
-
状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪注:只要是新建连接均为NEW,此处的连接状态与TCP的连接状态无关
-
示例:
# iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
# iptables -A OUTPUT -s 172.16.1.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
- 已经追踪到的并记录下来的连接信息库:/proc/net/nf_conntrack
- 调整连接追踪功能所能够容纳的最大连接数量:/proc/sys/net/nf_conntrack_max
- 不同的协议的连接追踪时长/proc/sys/net/netfilter/
- 注意:CentOS7 需要加载模块: modprobe nf_conntrack_ipv4
- iptables的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max,各种状态的超时链接会从表中删除;当模板满载时,后续连接可能会超时
解决方法两个:
●(1) 加大nf_conntrack_max值
●(2) 降低 nf_conntrack timeout时间
- ⑨开放被动模式的ftp服务
(1) 装载ftp连接追踪的专用模块:
跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config 配置文件
IPTABLES_MODULES=“nf_conntrack_ftp"
modproble nf_conntrack_ftp
(2) 放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED
# iptables –I INPUT -d LocalIP -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
# iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT
(3) 放行响应报文:
# iptables -I OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables命令的处理动作
-
-j targetname [per-target-options]
- 简单:ACCEPT,DROP
- 扩展:REJECT:–reject-with:icmp-port-unreachable默认
● RETURN:返回调用链
● REDIRECT:端口重定向
● LOG:记录日志,dmesg
● MARK:做防火墙标记
● DNAT:目标地址转换
● SNAT:源地址转换
● MASQUERADE:地址伪装
● …
● 自定义链:
-
Target:
- ACCEPT, DROP, REJECT, RETURN
- LOG, SNAT, DNAT, REDIRECT, MASQUERADE,…
- LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前并将日志记录在/var/log/messages系统日志中
● --log-level level 级别: debug,info,notice, warning, error, crit, alert,emerg
● --log-prefix prefix 日志前缀,用于区别不同的日志,最多29个字符
示例:
# iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections: "