防火墙简介
报文流向,
流入本机:PREROUTING --> INPUT–>用户空间进程
流出本机:用户空间进程 -->OUTPUT–> POSTROUTING
穿过:PREROUTING --> FORWARD --> POSTROUTING
1 防火墙分类
按保护范围划分:
- 主机防火墙:服务范围为当前一台主机
- 网络防火墙:服务范围为防火墙一侧的局域网
按实现方式划分:
- 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现
- 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件
按网络协议划分:
- 网络层防火墙:OSI模型下四层,又称为包过滤防火墙
- 应用层防火墙/代理服务器:代理网关,OSI模型七层
1.1 五个链
INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
1.2 五个表table
filter、nat、mangle、raw、security
- filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表
- nat表:network address translation 地址转换规则表
- mangle:修改数据标记位规则表
- raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
- security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
iptables有五表五链
2 iptables
用户空间的工具
查找表里有哪些链
iptables -t nat -vnl
#查看当前规则
iptables -vnL #v是细节,n是数字化,L是列出,注意n得在L前面
iptables -vnL --line-numbers #显示行号
iptables -t filter
-t #指定表
-I #插入,调整排序问题,可在链后面指定第几行
-D #删除,在链后面指定删除第几行
-m #指定模块名,相关协议用法可用-p代替 tcp、udp、icmp协议
-R #替换
-N #自定义链,模块化使用
-E #改链的名字
-S #显示定义过的规则具体命令,相当于history
-j #可以调用自定义链
-F #全局清除,也可指定链
-X #删除自定义链,得先把调用关系删除和清空链规则
-s #源地址
-d #目标地址
-P #更改链的默认规则,不建议
范例:filter表中的INPUT规则
iptables -t filter -A INPUT -s 192.168.0.1 -j DROP
-t filter #指定使用filter表,也可不写,默认使用该表
-A #追加规则
INPUT #链
-s 192.168.0.1 #源地址来的请求,-s指定源地址,也可写成网段,留意别把自己也给拒绝了
-j #跳转
DROP #动作,删除或抛弃
#拒绝来自192网络的访问
2.1 基本匹配条件
[!] -s, --source address[/mask][,...]:源IP地址或者不连续的IP地址
[!] -d, --destination address[/mask][,...]:目标IP地址或者不连续的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链
相关环境
#需关闭firewalld服务
#Centos 7,8:
systemctl stop firewalld.service #不使用原有的规则
systemctl disable firewalld. service
#或者
systemctl disable --now firewalld. service
#Centos6:
service iptables stop
chkconfig iptables off
抓包检查
tcpdump -i eth0 -nn icmp #-nn指定协议
2.2 动作
DROP #删除或抛弃,无回应
REJECT #拒绝,有回应
ACCERT #允许
RETURN #提前结束,在此结束
3 扩展匹配条件
3.1 tcp协议的扩展选项
[!] --source-port, --sport port[:port]:匹配源端口
[!] --destination-port,--dport port[:port]:匹配目标端口
[!] --tcp-flags mask comp
mask 需检查的标志位列表,用,分隔 , 例如 SYN,ACK,FIN,RST
comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔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 #全是1
--tcp_flags ALL NONE #全是0
[!] --syn:用于匹配第一次握手, 相当于:--tcp-flags SYN,ACK,FIN,RST SYN
#范例
iptables -I INPUT 5 -p tcp --dport 443 -j ACCERT
3.2 udp 协议的扩展选项
[!] --source-port, --sport port[:port]:源端口
[!] --destination-port,--dport port[:port]:目标端口
3.3 icmp 协议的扩展选项
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答 #回来的包
8/0 echo-request icmp请求 #发出的包
#我可以ping通,别人ping不了
iptables -I INPUT 4 -p icmp --icmp-type 0 -j ACCEPT
4 iptables模块相关
4.1 multiport
#将多个端口合并写成一个条件
[!] --source-ports,--sports port[,port|,port:port]... #源端口
[!] --destination-ports,--dports port[,port|,port:port]... #目标端口
#端口号用,隔开
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
4.2 iprange
#指定ip地址范围,哪里到哪里
[!] --src-range from[-to] 指定源IP地址范围
[!] --dst-range from[-to] 指定目标IP地址范围
#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
4.3 mac
#无需指定目标mac地址,直接指定源mac地址即可
[!] --mac-source XX:XX:XX:XX:XX:XX
iptables -A INPUT -m mac --mac-source 00:0c:29:d5:92:c9 -j ACCEPT
centos7改mac地址可直接改网卡配置文件,MACADDR=xxx,改完让文件生效即可
4.4 string
对字符串进行监测
--algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
--from offset 开始偏移 报文头前62个字符为固定,可直接跳过
--to offset 结束偏移
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式,16进制格式
#注意报文经过流程,因此添加在OUTPUT链中,指定tcp80端口
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "google" -j REJECT
4.5 time
定义时间用
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] #开始日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]] #结束日期
--timestart hh:mm[:ss] #开始时间9:00
--timestop hh:mm[:ss] #结束时间18:00
[!] --monthdays day[,day...] #每个月的几号
[!] --weekdays day[,day...] #星期几,1,2,3,4,5,6,7 分别表示星期一到星期日,用,隔开
--kerneltz:#内核时区(当地时间),不建议使用,CentOS7系统默认为 UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
#centos8/rocky8用不了
4.6 connlimit
限制每个客户端并发连接访问数量
--connlimit-upto N #连接的数量小于等于N时
--connlimit-above N #连接的数量大于N时
iptables -A INPUT -m connlimit --connlimit-above 10 -j REJECT
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
4.7 limit
限流,令牌制,
--limit-burst number #前多少个包不限制
--limit #[/second|/minute|/hour|/day]
#一分钟只通过十个包其他拒绝,前五个不限制,后面开始限流
iptables -A INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT -j REJECT
4.8 state
连接状态
- NEW:新发出请求;第一次发出的请求
- ESTABLISHED:再次连接时记录于内存中的连接信息
- RELATED:新发起的但有其他相关联的连接,一个带动一个,如:ftp协议中的数据连接与命令连接之间的关系
- INVALID:无效的连接,比如六个标记位都为0
- UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
记录路径在cat /proc/net/nf_conntrack下
当出现 nf_conntrack:nf_conntrack:table full, dropping packet 时,可更改
#调整连接追踪功能所能够容纳的最大连接数量,可改
[root@centos8 ~]#cat /proc/sys/net/netfilter/nf_conntrack_max
66624
[root@centos8 ~]#cat /proc/sys/net/nf_conntrack_max
66624
#加大访问表数量,内核参数
vim /etc/sysctl.conf
net.nf_conntrack_max=888888
#更改相关时间,不怎么建议
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n
单方向访问
iptables -A INPUT -s 10.0.0.7 -m state --state NEW -j REJECT #能出能回
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT #已有的能连
4.9 target
动作
LOG #不拒绝也不允许,而是记录在日志里,路径在 /var/log/messages 下
--log-level level 级别: debug,info,notice, warning, error, crit, alert,emerg
--log-prefix prefix #日志标识,用于区别不同的日志,最多29个字符
iptables -I INPUT -s 10.0.0.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections: "
5 规则优化
安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高
谨慎放行入站的新请求
有特殊目的限制访问功能,要在放行规则之前加以拒绝
同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理
不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更高
-s 10.0.0.0/24 -p tcp --dport 3306 -j REJECT -s 172.16.0.1 -p tcp --dport 80 -j REJECT
应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率
设置默认策略,建议白名单(只放行特定连接)
- iptables -P,不建议,容易出现“自杀现象”
- 规则的最后定义规则做为默认策略,推荐使用,放在最后一条
相关模块帮助
man iptables-extensions
5.1 永久保存及开机自启iptables
#1
iptables -A INPUT -j DROP #首先写好所需规则
iptables-save > /etc/sysconfig/iptables #存入文件
vim /etc/rc.local #ubuntu默认没有该文件,直接创建添加即可,记得加首行#!/bin/bash、加权限
iptables-restore < /etc/sysconfig/iptables #还原文件中定义的规则
chmod +x /etc/rc.d/rc.local #添加执行权限
#2
#centos/rocky中也可用
yum -y install iptables-services
iptables -A INPUT -j DROP
/usr/libexec/iptables/iptables.init save #两种保存方法均可用
iptables-save > /etc/sysconfig/iptables #也可直接更改该文件
systemctl enable iptables.service #设置开机自启