目录
一、防火墙基本认识
1. 安全技术
① 入侵检测系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报警和事后监督为主,提供有针对性的指导措施和安全决策依据,类 似于监控系统一般采用旁路部署(默默的看着你)方式。
② 入侵防御系统(Intrusion Prevention System):以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以 阻断,主动而有效的保护网络的安全,一般采用在线部署方式(必经之路)。
③ 防火墙( FireWall ):隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默 认情况下关闭所有的通过型访问,只开放允许访问的策略,会将希望外网访问的主机放在DMZ (demilitarized zone)网络中。
④ 防水墙(Waterwall):与防火墙相对,是一种防止内部信息泄漏的安全产品。 网络、外设接口、存储介质和打印机构成信息泄漏的全部途径。防水墙针对这四种泄密途径,在事前、事 中、事后进行全面防护。其与防病毒产品、外部安全产品一起构成完整的网络安全体系。
2. 防火墙分类
按保护范围划分:
- 主机防火墙:服务范围为当前一台主机
- 网络防火墙:服务范围为防火墙一侧的局域网
按实现方式划分:
- 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,如:华为, 山石hillstone,天融信,启明星辰,绿盟,深信服, PaloAlto , fortinet, Cisco, Checkpoint, NetScreen(Juniper2004年40亿美元收购)等
- 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件,Windows 防火墙 ISA --> Forefront
按网络协议划分:
- 网络层防火墙:OSI模型下四层,又称为包过滤防火墙
- 应用层防火墙/代理服务器:proxy 代理网关,OSI模型七层
3. 防火墙工具介绍
① iptables:iptables是Linux中最常用的防火墙工具之一。它基于内核的Netfilter框架,可以配置规则集来过滤、转发和修改网络数据包。iptables提供了广泛的功能和灵活性,可以根据源IP地址、目标IP地址、端口号等多个参数进行过滤。
② firewalld:firewalld是Red Hat系列Linux发行版中默认的防火墙管理工具。它使用了D-Bus接口和动态防火墙规则,支持更高级的网络配置。firewalld通过定义“区域”和“服务”来管理网络连接,并且可以实时更新规则而无需重启防火墙。
③ nftables:nftables是Netfilter框架的下一代替代品。它提供了更简洁和高效的语法,支持类似于iptables的过滤、NAT和连接跟踪功能。nftables的目标是取代iptables,并提供更好的性能和可扩展性。
二、iptables
1. 概述
属于“用户态”(User Space, 又称为用户空间)的防火墙管理体系。是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables目录下。 netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙,其中内置了raw、mangle、 nat和filter四个规则表。表中所有规则配置后,立即生效,不需要重启服务。
2. 五表五链
iptables由五个表table和五个链chain以及一些规则组成。表中有链,链中有规则。iptables使用表来组织规则,链是规则的容器,用于按顺序处理数据包。
五个表table:filter、nat、mangle、raw、security(用的较少)
- raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度(跟踪数据包)
- mangle:修改数据标记位规则表(标记数据包)
- nat:network address translation 地址转换,公网和私网的地址转换
- filter:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表(允许、拒绝)
- security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现 (了解)
优先级由高到低的顺序为:security -->raw-->mangle-->nat-->filter
五个链chain:input、output、forward、postrouting、prerouting
- input: 处理入站数据
- output:处理出站数据
- forward:转发数据
- prerouting:处理路由选择前数据
- postrouting:处理路由选择后数据
内核中数据包的传输过程:
① 当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去
② 如果数据包是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后, 任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出
三种报文流向:
- 流入本机:PREROUTING --> INPUT-->用户空间进程
- 流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
- 转发:PREROUTING --> FORWARD --> POSTROUTING
3. 语法
3.1 基本语法
iptables [-t 表名] -管理选项 [链表] [通用规则匹配] [-j 控制类型]
#不指定默认filter表
3.2 语法总结
4. 管理选项
在使用iptables进行防火墙管理时,可以使用各种选项来配置规则、查看规则、添加/删除规则以及保存/加载规则等。以下是一些常用的iptables防火墙管理选项的介绍:
管理选项 | 用法示例 |
---|---|
-A | 在指定链末尾追加一条 iptables -A INPUT (操作) |
-I | 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT (操作) |
-P | 指定默认规则 iptables -P OUTPUT ACCEPT (操作) |
-D | 删除 iptables -t nat -D INPUT 2 (操作) |
-p | 服务名称 icmp tcp |
-R | 修改、替换某一条规则 iptables -t nat -R INPUT (操作) |
-L | 查看 iptables -t nat -L (查看) |
-n | 所有字段以数字形式显示(比如任意ip地址是0.0.0.0而不是anywhere,比如显示协议端口号而不是服务名) iptables -L -n,iptables -nL,iptables -vnL (查看) |
-v | 查看时显示更详细信息,常跟-L一起使用 (查看) |
--line-number | 规则带编号 iptables -t nat -L -n --line-number /iptables -t nat -L --line-number |
-F | 清除链中所有规则 iptables -F (操作) |
-N | 新加自定义链 |
-X | 清空自定义链的规则,不影响其他链 iptables -X |
-Z | 清空链的计数器(匹配到的数据包的大小和总和)iptables -Z |
-S | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
5. 通用匹配
直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件。
- 协议匹配: -p协议名
- 地址匹配: -s 源地址、-d目的地址。可以是IP、网段、域名、空(任何地址)
- 接口匹配: -i入站网卡、-o出站网卡
iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD ! -p icmp -j ACCEPT #感叹号”!”表示取反
6. 控制类型
对于防火墙,数据包的控制类型非常关键,直接关系到数据包的放行、封堵及做相应的日志记录等。在 iptables 防火墙体系中,最常用的几种控制类型如下:
- - ACCEPT:允许数据包通过
- - DROP:直接丢弃数据包,不给出任何回 应信息
- - REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息
- - LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则
- - SNAT:修改数据包的源地址
- - DNAT:修改数据包的目的地址
- - MASQUERADE:伪装成一个非固定公网IP地址
7. iptables应用
iptables是Linux中最常用的防火墙工具之一,它基于内核的Netfilter框架。iptables可以通过配置规则集来过滤、转发和修改网络数据包,从而保护计算机系统免受网络攻击。
7.1 新增防火墙规则
添加新的防火墙规则时,使用管理选项“-A”、“-I”,前者用来追加规则,后者用来插入规则。注意:-A代表最底部插入,-I默认首行插入,-I 数字代表插入第数字条。
示例:
[root@localhost ~]# systemctl stop firewalld.service
#需要关闭firewalld.service防火墙服务
[root@localhost ~]# iptables -t filter -A INPUT -p icmp -j DROP
#建立iptables防火墙规则:指定filter规则表,添加INPUT链规则,规定icmp协议控制拒绝;即拒绝来自任意主机的icmp包,禁止ping本机,这里省略了-s 源地址,也就是所有。
[root@localhost ~]# iptables -A INPUT -s 192.168.190.101 -p tcp --dport 22 -j ACCEPT
#允许来自192.168.192.168主机访问本机的22端口,这里省略了-t filter,不指定认filter表。
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 19 packets, 1156 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 192.168.190.101 0.0.0.0/0 tcp dpt:22
[root@localhost ~]# iptables -I INPUT 2 -s 192.168.190.101 -j ACCEPT
#在链表第条二插入规则
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 8 packets, 488 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.190.101 0.0.0.0/0
0 0 ACCEPT tcp -- * * 192.168.190.101 0.0.0.0/0 tcp dpt:22
7.2 查看规则表
查看已有的防火墙规则时,使用管理选项“-L”,结合“--line-numbers”选项还可显示各条规则在链内的顺序号。一般格式如下:
iptables [-t表名] -v -n -L [链名] [-- line-numbers]
- -v:详细信息
- -n:规则
- -L: 规则列表
注意:L必须写在最后
示例:
[root@localhost ~]# iptables -vnL #查看全部规则
Chain INPUT (policy ACCEPT 367 packets, 27100 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT tcp -- * * 192.168.190.100 0.0.0.0/0 tcp dpt:22
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 247 packets, 25974 bytes)
pkts bytes target prot opt in out source destination
[root@localhost ~]# iptables -t filter -vnL INPUT 2 #指定查看filter表INPUT链第二条规则
0 0 ACCEPT tcp -- * * 192.168.190.100 0.0.0.0/0 tcp dpt:22
[root@localhost ~]# iptables -vnL --line-numbers
#查看filter表INPUT链规则编号
Chain INPUT (policy ACCEPT 38 packets, 2220 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0
2 0 0 ACCEPT tcp -- * * 192.168.190.100 0.0.0.0/0
7.3 黑白名单
在iptables防火墙中,可以使用黑名单和白名单来控制网络流量的访问权限。黑名单和白名单是两种不同的策略,用于指定哪些IP地址或IP地址段被允许或禁止通过防火墙。
① 黑名单:默认全部允许通过,添加谁才不允许谁通过。
② 白名单:默认全部不允许通过,添加谁允许谁通过。
如何制作白名单提高安全性且不影响使用iptables -F命令?
[root@localhost ~]# iptables -A INPUT -s 192.168.190.1 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -j DROP
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
29 1716 ACCEPT all -- * * 192.168.190.1 0.0.0.0/0
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 13 packets, 1000 bytes)
pkts bytes target prot opt in out source destination
#在最后加入一条拒绝所有入站数据的规则
注意:需要在拒绝所有入站数据规则前加上自己想要访问地址的规则。最后一条规则在这里可以实现既是白名单也是黑名单。
7.4 替换、删除、清空规则
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 10 packets, 612 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 192.168.190.101 0.0.0.0/0
0 0 DROP all -- * * 192.168.190.102 0.0.0.0/0
0 0 ACCEPT all -- * * 192.168.190.102 0.0.0.0/0
[root@localhost ~]# iptables -R INPUT 3 -s 192.168.190.102 -j DROP
#修改、替换某一条规则需要在链后指定序号
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 8 packets, 488 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 192.168.190.101 0.0.0.0/0
0 0 DROP all -- * * 192.168.190.102 0.0.0.0/0
0 0 DROP all -- * * 192.168.190.102 0.0.0.0/0
[root@localhost ~]# iptables -D INPUT -s 192.168.190.102 -j DROP
#按内容删除,若遇到内容相同的规则,默认删除序号最小的那条
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 8 packets, 488 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 192.168.190.101 0.0.0.0/0
0 0 DROP all -- * * 192.168.190.102 0.0.0.0/0
[root@localhost ~]# iptables -D INPUT 2
#按编号删除
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 10 packets, 612 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- * * 192.168.190.101 0.0.0.0/0
[root@localhost ~]# iptables -F
#清空filter规则
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 6 packets, 364 bytes)
pkts bytes target prot opt in out source destination
清空指定链或表中的所有防火墙规则,使用管理选项“-F”。例如,若要清空 filter 表 INPUT:iptables -F INPUT即可。
注意:
- 若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条
- 按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错
- 按内容匹配删数时,确保规则存在,否则报错
7.5 设置默认策略
iptables 的各条链中,默认策略是规则匹配的最后一个环节——当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种。
[root@localhost ~]# iptables -P INPUT DROP
#默认清除所有规则,输入后没显示无法远程连接,因为INPUT链只剩下DROP,默认拒绝所有
[root@localhost ~]# iptables -A INPUT -s 192.168.190.1 -p tcp -j ACCEPT
#添加远程访问规则
[root@localhost ~]# iptables -vnL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
50 5302 ACCEPT tcp -- * * 192.168.190.1 0.0.0.0/0
设置回环网卡允许访问规则:可以连通本机所有网卡
[root@localhost ~]# iptables -A INPUT -s 192.168.190.1 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -s 192.168.190.0/24 -j REJECT
[root@localhost ~]# iptables -A INPUT -s 172.19.8.0/24 -j REJECT
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
249 18736 ACCEPT all -- * * 192.168.190.1 0.0.0.0/0
0 0 REJECT all -- * * 192.168.190.0/24 0.0.0.0/0 reject-with icmp-port-unreachable
0 0 REJECT all -- * * 172.19.8.0/24 0.0.0.0/0 reject-with icmp-port-unreachable
测试连通性,无法ping通:
[root@localhost ~]# ping 192.168.190.100
PING 192.168.190.100 (192.168.190.100) 56(84) bytes of data.
[root@localhost ~]# ping 172.19.8.211
PING 172.19.8.211 (172.19.8.211) 56(84) bytes of data.
添加允许流量进入本机回环网卡,并测试连通性:
[root@localhost ~]# iptables -I INPUT 2 -i lo -j ACCEPT
[root@localhost ~]# ping 192.168.190.100
PING 192.168.190.100 (192.168.190.100) 56(84) bytes of data.
64 bytes from 192.168.190.100: icmp_seq=1 ttl=64 time=0.035 ms
[root@localhost ~]# ping 172.19.8.211
PING 172.19.8.211 (172.19.8.211) 56(84) bytes of data.
64 bytes from 172.19.8.211: icmp_seq=1 ttl=64 time=0.038 ms
8. 自定义链
自定义链是iptables中的一种功能,它允许用户创建自己的链来组织和管理规则。自定义链可以帮助简化规则集,使其更易于管理。通过将相关规则放入一个自定义链中,可以提高可读性并降低错误发生的可能性。此外,自定义链还可以在多个规则之间共享相同的操作,从而减少冗余。
8.1 创建自定义链
格式:
iptables -N CUSTOM_CHAIN_NAME
示例:
[root@localhost ~]# iptables -N web
[root@localhost ~]# iptables -vnL
Chain web (0 references)
pkts bytes target prot opt in out source destination
8.2 改名
[root@localhost ~]# iptables -E web WEB
[root@localhost ~]# iptables -vnL
Chain WEB (0 references)
pkts bytes target prot opt in out source destination
8.3 自定义链添加规则
[root@localhost ~]# iptables -A WEB -p tcp -m multiport --dport 80,443 -j ACCEPT
[root@localhost ~]# iptables -A WEB -p tcp --dport 8080 -j ACCEPT
[root@localhost ~]# iptables -vnL
Chain WEB (0 references)
pkts bytes target prot opt in out source destination
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
8.4 使用自定义链
[root@localhost ~]# iptables -A INPUT -s 192.168.190.101 -j WEB
[root@localhost ~]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 WEB all -- * * 192.168.190.101 0.0.0.0/0
8.5 删除自定义链
[root@localhost ~]# iptables -X WEB
9. 隐含扩展模块
iptables防火墙中的隐含扩展是指一些特殊的扩展模块,它们不需要显式加载,而是隐含在iptables中。这些隐含扩展包括一些常见的功能,如状态跟踪(state tracking)、网络地址转换(Network Address Translation,NAT)和数据包过滤等。
iptables 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块。要求以特定的协议匹配作为前提,包括端口、TCP标记、ICMP类型等条件。 端口匹配: --sport 源端口、--dport 目的端口,可以是个别端口、端口范围。
9.1 TCP模块
TCP模块允许iptables根据TCP连接的状态进行过滤和处理。
端口号:
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围
--sport 指明源端口,使用格式: --sport 端口或 端口1:端口2(端口1到端口2的连续端口范围指定)。
[root@localhost ~]#iptables -A INPUT -p tcp --sport 10000:30000 -j REJECT
#端口10000到30000全部拒绝
--dport 指明目的端口,使用格式: --dport 端口或 端口1:端口2(端口1到端口2的连续端口范围指定)。
[root@localhost ~]# iptables -A INPUT -p -s 192.168.190.0/24 --dport 80 -j ACCEPT
#允许192.168.91段访问80端口
示例:拒绝目标端口为80的tcp协议流量
192.168.19.100:
[root@localhost ~]# iptables -t filter -A INPUT -m tcp -p tcp --dport 80 -j REJECT
#拒绝所有目标端口为80的TCP协议数据包的输入流量,并且该规则适用于filter表。协议名和模块名重复,这里- m模块可以省略。
192.168.190.101:
[root@localhost ~]# curl 192.168.190.100:80
curl: (7) Failed connect to 192.168.190.100:80; 拒绝连接
[root@localhost ~]# ssh root@192.168.190.100
The authenticity of host '192.168.190.100 (192.168.190.100)' can't be established.
ECDSA key fingerprint is SHA256:6+8qeJTs9OwWCvFNtomXsQvrfb+no8F3moR0oliq7QU.
ECDSA key fingerprint is MD5:3b:d2:42:d9:c3:03:ba:ac:18:2c:e0:03:a3:c7:bd:ba.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.190.100' (ECDSA) to the list of known hosts.
root@192.168.190.100's password:
Last login: Sat Feb 3 22:51:26 2024 from 192.168.190.100
示例:拒绝ip192.168.190.101目标端口为20到80的tcp协议流量
192.168.190.100:
[root@localhost ~]# iptables -A INPUT -p tcp --dport 22:80 -s 192.168.190.101 -j REJECT
##拒绝192.168.190.101目标端口为20到80的TCP协议数据包的输入流量
192.168.190.101:
[root@localhost ~]# curl 192.168.190.100:80
curl: (7) Failed connect to 192.168.190.100:80; 拒绝连接
[root@localhost ~]# ssh root@192.168.190.100
ssh: connect to host 192.168.190.100 port 22: Connection refused
#ssh协议用的是22端口,这里拒绝了22-80所有的端口
注意:--sport和--dport 必须配合-p <协议类型>使用
握手连接:
[!] --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 FIN,RST SYN,ACK
#第二次握手
--tcp-flags ALL ALL //6给位置全为1(不可能)
--tcp_flags ALL NONE //6给位置全为0(不可能)
#错误包,代表流量有问题
--syn:用于匹配第一次握手,相当于:--tcp-flags SYN,ACK,FIN,RST SYN
示例:拒绝第一次握手,即无法建立tcp连接
192.168.190.100:
[root@localhost ~]# iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST SYN -s 192.168.190.101 -j REJECT
#拒绝三次握手第一次握手,即拒绝所有tcp协议的连接
192.168.190.101:
[root@localhost ~]# curl 192.168.190.100:80
curl: (7) Failed connect to 192.168.190.100:80; 拒绝连接
[root@localhost ~]# ssh root@192.168.190.100
ssh: connect to host 192.168.190.100 port 22: Connection refused
9.2 ICMP模块
ICMP模块允许iptables根据ICMP协议的类型和代码进行过滤和处理。
类型匹配:--icmp-type ICMP类型
可以是字符串、数字代码
"Echo- Request" (代码为8)表示请求
"Echo- Reply" (代码为0)表示回复
"Dest ination-Unreachable" (代码为3)表示目标不可达
关于其它可用的ICMP协议类型,可以执行“iptables -p icmp -h”命令,查看帮助信息
示例:192.168.190.100可以单向ping通192.168.190.101
思路:100ping101,100发送8包,101发送0包;反之,101发送8包,100发送0包。这里只需要禁止来自101的8包即可达到目标。
192.168.190.100:
[root@localhost ~]# iptables -A INPUT -s 192.168.190.101 -p icmp --icmp-type 8 -j REJECT
#拒绝源地址192.168.190.100的icmp协议类型为8的包
[root@localhost ~]# ping 192.168.190.101
PING 192.168.190.101 (192.168.190.101) 56(84) bytes of data.
64 bytes from 192.168.190.101: icmp_seq=1 ttl=64 time=0.727 ms
64 bytes from 192.168.190.101: icmp_seq=2 ttl=64 time=1.35 ms
64 bytes from 192.168.190.101: icmp_seq=3 ttl=64 time=1.05 ms
192.168.190.101:
[root@localhost ~]# ping 192.168.190.100
PING 192.168.190.100 (192.168.190.100) 56(84) bytes of data.
From 192.168.190.100 icmp_seq=1 Destination Port Unreachable
From 192.168.190.100 icmp_seq=2 Destination Port Unreachable
From 192.168.190.100 icmp_seq=3 Destination Port Unreachable
当然也可以禁止100OUTPUT0包实现目标:
191.168.190.100:
[root@localhost ~]# iptables -A OUTPUT -d 192.168.190.101 -p icmp --icmp-type 0 -j REJECT
#禁止给目标地址发送icmp协议类型为0的包
[root@localhost ~]# ping 192.168.190.101
PING 192.168.190.101 (192.168.190.101) 56(84) bytes of data.
64 bytes from 192.168.190.101: icmp_seq=1 ttl=64 time=0.861 ms
64 bytes from 192.168.190.101: icmp_seq=2 ttl=64 time=1.99 ms
192.168.190.101:
[root@localhost ~]# ping 192.168.190.100
PING 192.168.190.100 (192.168.190.100) 56(84) bytes of data.
10. 显示扩展模块
显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块。
10.1 multiport扩展(混合端口)
以离散方式定义多端口匹配,最多指定15个端口。
选项:
[!] --source-ports,--sports port[,port|,port:port]...
#指定多个源端口 逗号隔开
[!] --destination-ports,--dports port[,port|,port:port]...
# 指定多个目标端口 逗号隔开
[!] --ports port[,port|,port:port]...
#多个源或目标端
示例:使用混合模块控制多个端口
192.168.190.100:
[root@localhost ~]# iptables -A INPUT -s 192.168.190.101 -p tcp -m multiport --dport 22,80 -j REJECT
#拒绝来自源地址为192.168.190.101tcp协议(multiport混合模块)目的端口为22和80的流量
192.168.190.101:
[root@localhost ~]# ssh root@192.168.190.100
ssh: connect to host 192.168.190.100 port 22: Connection refused
[root@localhost ~]# curl 192.168.190.100:80
curl: (7) Failed connect to 192.168.190.100:80; 拒绝连接
10.2 iprange扩展
指明连续的(但一般不是整个网络)ip地址范围。
[!] --src-range from[-to] 源IP地址范围
[!] --dst-range from[-to] 目标IP地址范围
示例:拒绝来自192.168.190.101-103所有的流量
192.168.190.100:
[root@localhost ~]# iptables -A INPUT -m iprange --src-range 192.168.190.101-192.168.190.103 -j REJECT
192.168.190.101:
[root@localhost ~]# ping 192.168.190.100
PING 192.168.190.100 (192.168.190.100) 56(84) bytes of data.
From 192.168.190.100 icmp_seq=1 Destination Port Unreachable
From 192.168.190.100 icmp_seq=2 Destination Port Unreachable
192.168.190.102:
[root@localhost ~]# ping 192.168.190.100
PING 192.168.190.100 (192.168.190.100) 56(84) bytes of data.
From 192.168.190.100 icmp_seq=1 Destination Port Unreachable
10.3 mac地址
mac模块可以指明源MAC地址进行控制。
-m mac --mac-source XX:XX:XX:XX:XX:XX 源
示例:根据192.168.190.101mac地址控制流量
192.168.190.100:
[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:62:c7:6d -j REJECT
#拒绝mac地址为00:0c:29:62:c7:6d的所有流量
192.168.190.101:
[root@localhost ~]# ping 192.168.190.100
PING 192.168.190.100 (192.168.190.100) 56(84) bytes of data.
From 192.168.190.100 icmp_seq=1 Destination Port Unreachable
From 192.168.190.100 icmp_seq=2 Destination Port Unreachable
[root@localhost ~]# curl 192.168.190.100:80
curl: (7) Failed connect to 192.168.190.100:80; 拒绝连接
[root@localhost ~]# ssh root@192.168.190.100
ssh: connect to host 192.168.190.100 port 22: Connection refused
10.4 string 字符串
对报文中的应用层数据做字符串模式匹配检测。
选项:
--algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore 算法
kmp:Knuth-Pratt-Morris 算法--from offset 开始查询的地方
--to offset 结束查询的地方
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式,16进制格式mac + ip + 协议/端口号 = 62 真
示例:
192.168.190.100:
[root@localhost html]# echo "www.baidu.com" > /var/www/html/baidu.html
[root@localhost html]# echo "www.bilibili.com" > /var/www/html/bilibili.html
192.168.190.101:
[root@localhost ~]# curl 192.168.190.100/baidu.html
www.baidu.com
[root@localhost ~]# curl 192.168.190.100/bilibili.html
www.bilibili.com
192.168.190.100:
[root@localhost html]# iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62 --string "bilibili" -j REJECT
#http协议即tcp协议,源端口为80,使用字符模块,利用bm算法从第62个字节开始检查字符串为bilibili
#注意请求的包不带字符,回复的包带字符所以要output
192.168.190.101:
[root@localhost ~]# curl 192.168.190.100/baidu.html
www.baidu.com
[root@localhost ~]# curl 192.168.190.100/bilibili.html
^C
10.5 time模块
iptables防火墙中的time模块允许您根据当前时间来匹配数据包。这个模块通常用于实现基于时间的访问控制,比如只允许在特定时间段内访问某些服务或资源。注意:这里时间需要使用格林威治时间,date -u可以查看。
选项:
--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:内核时区(当地时间),不建议使用,CentOS 7版本以上系统默认为 UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
192.168.190.100:
[root@localhost ~]# date -u
2024年 02月 04日 星期日 06:21:31 UTC
[root@localhost ~]# iptables -A INPUT -p tcp -s 192.168.190.101 --dport 22 -m time --timestart 06:00 --timestop 18:00 --weekdays 6,7 -j REJECT
#拒绝源地址192.168.190.101在周末6点到18点访问tcp协议22端口
192.1168.190.101:
[root@localhost ~]# ssh root@192.168.190.100
ssh: connect to host 192.168.190.100 port 22: Connection refused
10.6 connlimit扩展
iptables防火墙中的connlimit扩展模块允许您限制连接数,以防止某个服务被过多的连接请求所淹没。这个扩展模块通常用于防止DDoS(分布式拒绝服务)攻击或其他类型的连接泛滥。
选项:
--connlimit-upto N #连接的数量小于等于N时匹配
--connlimit-above N #连接的数量大于N时匹配
示例:限制tcp协议80端口最大连接数
192.168.190.100:
[root@localhost ~]# systemctl start httpd
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
#针对TCP协议的目标端口80,使用connlimit扩展模块限制并发连接数不超过2个,并且对超过限制的连接进行拒绝处理。
192.168.190.101:
[root@localhost opt]# gcc flood_connect.c -o flood
#编译安装黑客文件
[root@localhost opt]# ./flood 192.168.190.100
#运行黑客脚本
192.168.190.100:
[root@localhost ~]# ss -natp | grep 80
LISTEN 0 128 :::80 :::* users:(("httpd",pid=1877,fd=4),("httpd",pid=1876,fd=4),("httpd",pid=1875,fd=4),("httpd",pid=1874,fd=4),("httpd",pid=1873,fd=4),("httpd",pid=1871,fd=4))
SYN-RECV 0 0 0:0:200:::80 ::eb47:ba37:ec47:ba37:34884
SYN-RECV 0 0 400::100:0:80 ::80:0:d80:0:34882
192.168.190.101:
[root@localhost opt]# ./flood 192.168.190.100
Starting flood connect attack on 192.168.190.100 port 80
^CAborted (made 2 successful connects)
#只有两个成功
10.7 limit模块(限制流量)
iptables防火墙的 limit 模块用于限制特定类型的数据包的数量。它可以用于防止DDoS攻击或限制特定类型的流量。
选项:
--limit rate: 指定限制的速率,例如,--limit 10/minute表示每分钟允许的数据包数量为10个
--limit-burst number: 指定允许的突发连接数,例如,--limit-burst 5表示允许5个数据包的突发连接
--limit-mode mode: 指定限制模式,可选的模式有upstream、downstream和srcip. 默认为srcip,表示限制来自单个源IP地址的数据包数量
--limit-upto bytes: 用于限制数据包的大小,超出这个大小的数据包将被丢弃
示例:限制允许通过包,拒绝私有,规则组合
192.168.190.100:
[root@localhost ~]# iptables -A INPUT -s 192.168.190.101 -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
#限制系统接收到的ping请求的数量,每分钟不超过10个,允许出现最多5个突发连接。超出这个限制的ping请求将被丢弃。
[root@localhost ~]# iptables -A INPUT -p icmp -j REJECT
#拒绝所有
192.168.190.101长ping101:
小结:
这两条iptables规则的组合将实现对ICMP (Internet Control Message Protocol) 数据包的限制和拒绝处理。这种组合使用的目的是限制某种类型的ICMP数据包的流量,避免可能的滥用或拒绝服务攻击,并对超过限制的数据包进行拒绝。同时,通过限制和拒绝结合的方式,可以灵活地处理不同情况下的ICMP数据包。
10.8 state模块
state模块是iptables防火墙中的一个重要模块,它用于根据连接的状态进行过滤和处理规则。它根据数据包的状态(如新建、已建立、相关、无效)来确定是否接受、拒绝或进一步处理数据包。
格式:
-m state --state <state1,state2,...>
在上面的格式中,<state1,state2,...> 是一个逗号分隔的连接状态列表,用于指定要匹配的连接状态。
实现功能老用户可以访问,新用户不可以访问
iptables -AINPUT -m state --state ESTABLISHED -j ACCEPT #已在ping的可以继续ping,停了也不可以通了,xshell也不可以再连
iptables -AINPUT -m state --state NEW -j REJET #新用户拒绝
状态类型:
- NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
- ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
- RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
- INVALID:无效的连接,如flag标记不正确
- UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
常用选项介绍:
--state:指定要匹配的连接状态列表,如--state NEW,ESTABLISHED
--ctstate:与--state选项类似,用于指定要匹配的连接状态列表。与--state选项不同的是,--ctstate选项允许更精确的匹配,特别在使用连接跟踪模块来管理连接状态时非常有用。例如,--ctstate NEW,ESTABLISHED表示仅匹配连接跟踪状态为新建或已建立的数据包
--state INVALID:匹配无效的数据包,这些数据包不符合协议规范或防火墙状态跟踪出错
--state NEW:匹配新建的连接请求数据包
--state ESTABLISHED:匹配已建立的连接,属于已通过的数据包
--state RELATED:匹配与已建立的连接相关的数据包。例如,FTP的数据传输就属于相关的数据包
示例:
192.168.190.100:
[root@localhost ~]# iptables -A INPUT -p icmp -s 192.168.190.101 -m state --state NEW -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp -m state --state NEW -j DROP
#允许来自IP地址为192.168.1.100的源IP的TCP连接请求通过,同时拒绝其他任何新建连接的TCP数据包。
192.168.190.101:
[root@localhost ~]# ping 192.168.190.100
PING 192.168.190.100 (192.168.190.100) 56(84) bytes of data.
64 bytes from 192.168.190.100: icmp_seq=1 ttl=64 time=0.710 ms
64 bytes from 192.168.190.100: icmp_seq=2 ttl=64 time=1.36 ms
192.168.190.102:
[root@localhost ~]# ping 192.168.190.100
PING 192.168.190.100 (192.168.190.100) 56(84) bytes of data.
^C
--- 192.168.190.100 ping statistics ---
5 packets transmitted, 0 received, 100% packet loss, time 4001ms