一.介绍
防火墙工具iptables--由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
三种报文流向
流入本机:PREROUTING --> INPUT-->用户空间进程
流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
转发: PREROUTING --> FORWARD --> POSTROUTING
iptable 五表table:filter、nat、mangle、raw、security
五链prerouting总入口,input流入本机,output流出本机,forward转发,postrouting总出口
filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表
功能:过滤,允许或拒绝流量
有三个链:INPUT链,FORWARD链,OUTPUT链
nat表:network address translation 地址转换规则表
mangle:修改数据标记位规则表
raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
优先级由高到低的顺序为:security -->raw-->mangle-->nat-->filter
二.实践
1.环境准备
#firewalld 和iptables 有冲突需要先关闭一方
#CentOS 7,8 :
systemctl disable --now firewalld.service
#或者
systemctl stop firewalld.service
systemctl disable firewalld. service
#CentOS 6 : 此处停用iptables 指的是不用系统默认规则。
service iptables stop
chkconfig iptables off
2. 增加
2.1 基本用法
-t nat #指定表raw, mangle, nat, [filter]默认
-A INPUT #参数为链,表示追加到INPUT表,大小写敏感。
-I INPUT #参数为链 默认插入第一条,可以指明插入的规则编号,如:-I INPUT 2 表示插入第二条
-s 10.0.0.100 #参数为IP 源地址
-d #参数为IP,目标地址
-j REJECT #参数为动作,DROP丢弃 ,REJECT拒绝,ACCEPT 接受
-p icmp #指定协议,可使用数字如0(all) tcp|udp|icmp|icmpv6|udplite|esp|ah|sctp|mh or“all“
-i 网卡名 #报文流入的接口;只应用于INPUT、FORWARD、PREROUTING链
-o 网卡名 #报文流出的接口;只应用于FORWARD、OUTPUT、POSTROUTING链
#例:1 给 -t filter表的 -A INPUT链追加 -s 10.0.0.100访问就 -j DROP 的规则
iptables -A INPUT -s 10.0.0.100 -j DROP #追加
#例:2 给 -t filter表的 -I I NPUT链插入第3行 -s 10.0.0.100访问就 -j ACCEPT 的规则
iptables -I INPUT 3 -s 10.0.0.100 -j ACCEPT
#例:3 不让10.0.0.150 ping通,禁止icmp协议通过
iptables -A INPUT -s 10.0.0.150 -p icmp -j REJECT
#例:4 从lo网卡进来的允许
iptables -A INPUT -i lo -j ACCEPT
2.2 扩展用法
-m 模块名 #指定模块名
#multiport 扩展模块,可以把不连续的端口写在一条规则里
#iprange 扩展模块,指明连续的(但一般不是整个网络)ip地址范围
#mac 扩展模块,mac 模块可以指明源MAC地址
#string 扩展模块, 对报文中的应用层数据做字符串模式匹配检测
#time 扩展模块,指定时间允许或拒绝 ,注意:CentOS 8 此模块有问题,CentOS 7 系统默认为 UTC
#connlimit 扩展模块,根据每客户端IP做并发连接数数量匹配,可防止Dos(Denial of Service,拒绝服务)攻击
#limit 扩展模块,限流,基于收发报文的速率做匹配,令牌桶过滤器
重点模块 #state 扩展模块,可以根据”连接追踪机制“去检查连接的状态
#状态类型:前三个
# NEW:新发起的请求;不管用什么协议,第一次链接都是NEW
# ESTABLISHED:NEW状态之后
# RELATED:新发起的但与已有连接相关联的连接
tcp icmp #不用指定模块名
#例:1 ~~~~filter表INPUT链 10.0.0.100 -p tcp --dport 80 指定不能访问tcp 80端口
iptables -A INPUT -s 10.0.0.100 -p tcp --dport 80 -j DEJECT
#例:2 ~~~~第一次握手将被拒绝,可实现新用户不让连,老用户继续可以连接直到退出。
iptables -A INPUT -p tcp --syn -j DEJECT
#例:3 ~~~~实现我可以ping通10.0.0.100,10.0.0.100不能ping通我,-p icmp --icmp-type 8(8请求报文,0应答报文) -j REJECT
iptables -A INPUT -s 10.0.0.100 -p icmp --icmp-type 8 -j REJECT
-m multiport #把多个连续或者非连续的端口号写在一行规则里,连续(21:25)不连续逗号隔开(80,443),也可以同时指定(21:25,80,443)
#例:拒绝10.0.0.100 访问本机的tcp 80,443端口 用multiport模块写在一行规则里
iptables -A INPUT -s 10.0.0.100 -p tcp -m multiport --dports 80,443 -j REJECT
#例:修改-R INPUT -s 10.0.0.100 所在行规则,-p tcp -m multiport --dports 21:25,80,443改为范围端口和指定端口
iptables -R INPUT -s 10.0.0.100 -p tcp -m multiport --dports 21:25,80,443 -j REJECT
-m iprange #指明连续的(但一般不是整个网络)ip地址范围
iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP
-m string #对报文中的应用层数据做字符串模式匹配检测
#例:1 从本机往出发,过tcp 80端口 从62个字节开始检查报文 有"google" 就拒绝
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "google" -j REJECT
-m time #指定时间允许或拒绝 ,时间为UTC时间,可以用date -u 查看。注意:CentOS 8 此模块有问题 ,CentOS 7和ubuntu 系统默认为 UTC
iptables -A INPUT -m time --timestart 14:30 --timestop 18:30 -j REJECT
-m connlimit #控制连接数,可防止Dos(Denial of Service,拒绝服务)攻击
iptables -A INPUT -m connlimit --connlimit-above 2 -j REJECT
-m limit #限流,基于收发报文的速率做匹配,令牌桶过滤器
#例:ping我,前五个包不限制,从第五个包开始每分钟只允许通过10个包,并且不满足规则全部拒绝
iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 10 -j ACCEPT
iptables -A INPUT -p icmp -j REJECT
-m state #重点模块-NEW新连接--ESTABLISHED后续链接--------------------------
#例:1 新用户不让连,老用户可以连
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state NEW -j REJECT
#面试经常问:
cat /proc/net/nf_conntrack #连接记录
cat /proc/sys/net/netfilter/nf_conntrack_max #调整连接追踪功能可以容纳的最大连接数量
#连接数调为1 ,现在有第二条连接,就会报下面这种错
[root@centos8 ~]#echo 1 > /proc/sys/net/netfilter/nf_conntrack_max
[root@centos8 ~]#tail /var/log/messages
Jul 9 21:06:32 centos8 kernel: nf_conntrack: nf_conntrack: table full, dropping packet
3. 查看
iptables -nvL --line-numbers #查看表详细信息和显示编号 ,默认filter表
4. 删除
-D INPUT 2 #删除 (1) 指明规则序号 (2) 指明规则本身
-F INPUT #清空指定的规则链,不写参数表示全删
#例:删除filter表INPUT链 第2行的规则
iptables -D INPUT 2
5. 修改
-R INPUT 2 #替换指定链上的指定规则编号
#例:修改filter表INPUT链第3行规则 为 -j REJECT
iptables -R INPUT 3 -s 10.0.0.100 -j REJECT
注意:
1.给链添加的规则按从上到下的顺序执行匹配,也就是编号1为最高级别。
规则优化最佳实践
-
1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高
2. 谨慎放行入站的新请求
3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝
4. 同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理
5. 不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更高
6. 应该将那些可由一条规则能够描述的多个规则合并为一条
7. 设置默认策略,建议白名单(只放行特定连接)如:把拒绝所有的规则放到所有规则最后面。