1、linux防火墙的基本认识
1.1 Netfilter
Linux防火墙是由Netfilter组件提供的,Netfilter工作在内核空间,集成在linux内核中
Netfilter 是Linux 2.4.x之后新一代的Linux防火墙机制,是linux内核的一个子系统。Netfilter采用模块化设计,具有良好的可扩充性,提供扩展各种网络服务的结构化底层框架。Netfilter与IP协议栈是无缝契合,并允许对数据报进行过滤、地址转换、处理等操作
1.2 防火墙工具介绍
1.2.1 iptables
由软件包iptables提供的命令行工具,工作在用户空间,用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
[root@centos7 ~]# iptables --version
iptables v1.4.21
1.2.2 firewalld 更简单
从CentOS 7 版开始引入了新的前端管理工具
- 软件包:
firewalld
firewalld-config
- 管理工具:
firewall-cmd 命令行工具
firewall-config 图形工作
1.2.3 nftables
此软件是CentOS 8 新特性,Nftables最初在法国巴黎的 Netfilter Workshop 2008上发表,然后由长期的
netfilter核心团队成员和项目负责人Patrick McHardy于2009年3月发布。它在2013年末合并到Linux内
核中,自2014年以来已在内核3.13中可用。
它重用了netfilter框架的许多部分,例如连接跟踪和NAT功能。它还保留了命名法和基本iptables设计的
几个部分,例如表,链和规则。就像iptables一样,表充当链的容器,并且链包含单独的规则,这些规
则可以执行操作,例如丢弃数据包,移至下一个规则或跳至新链。
从用户的角度来看,nftables添加了一个名为nft的新工具,该工具替代了iptables,arptables和
ebtables中的所有其他工具。从体系结构的角度来看,它还替换了内核中处理数据包过滤规则集运行时
评估的那些部分。
1.3 netfiter 中五个勾子函数和报文流向
1.3.1 四表五链
Netfilter在内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则。
由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上提示:从 Linux kernel 4.2 版以后,Netfilter 在prerouting 前加了一个 ingress 勾子函数。可以使用这个新的入口挂钩来过滤来自第2层的流量,这个新挂钩比预路由要早,基本上是 tc 命令(流量控制工具)的替代品。
- 表的作用: 规定了如何处理数据包
raw: 是否跟踪数据流量
mangle: 是否标记数据流量
nat: 地址转换 pre post
filter: 过滤数据流量 决定了数据是否通过 input output forward
- 链的作用: 什么时候器作用
input 链: 处理需要进入本机的流
output链: 处理从本机出来的流量
forward链: 处理需要被本机转发的流量
prerouting链:处理在路由判断前的数据,在不明确是给本机的数据还是转发给别的机器的数据前就进行处理
postrouting链:处理在路由判断后的数据包, 明确是给自己还是 给别人的数据 后进行处理
1.3.2 三种报文流向
流入本机:PREROUTING --> INPUT–>用户空间进程(访问我的服务)
流出本机:用户空间进程 -->OUTPUT–> POSTROUTING(穿过我)
转发:PREROUTING --> FORWARD --> POSTROUTING(分摊流量)
链chain:
内置链:每个内置链对应于一个钩子函数
自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有Hook钩子调
用自定义链时,才生效。
INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
五个表table:filter、nat、mangle、raw、security
filter:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表
nat:network address translation 地址转换规则表
mangle:修改数据标记位规则表
raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
security -->raw-->mangle-->nat-->filter
2、firewalld服务
2.1 命令行配置
2.1.1 基础命令
firewall-cmd
firewall-cmd [OPTIONS…]
firewall-cmd [OPTIONS...]
firewall-cmd
#基础命令
--permanent
#设置永久生效
--add-port=端口号/协议(tcp/udp)
设置端口号和协议
--reload
#重新加载防火墙设置
--remove
#移除规则
--get-zones 列出所有可用区域
--get-default-zone 查询默认区域
--set-default-zone=<ZONE> 设置默认区域
--get-active-zones 列出当前正使用的区域
--add-source=<CIDR>[--zone=<ZONE>] 添加源地址的流量到指定区域,如果无--zone= 选项,使用默认区域
--remove-source=<CIDR> [--zone=<ZONE>] 从指定区域删除源地址的流量,如无--zone= 选项,使用默认区域
--add-interface=<INTERFACE>[--zone=<ZONE>] 添加来自于指定接口的流量到特定区域,如果无--zone= 选项,使用默认区域
--change-interface=<INTERFACE>[--zone=<ZONE>] 改变指定接口至新的区域,如果无--zone=选项,使用默认区域
--add-service=<SERVICE> [--zone=<ZONE>] 允许服务的流量通过,如果无--zone= 选项,使用默认区域
--add-port=<PORT/PROTOCOL>[--zone=<ZONE>] 允许指定端口和协议的流量,如果无--zone= 选项,使用默认区域
--remove-service=<SERVICE> [--zone=<ZONE>] 从区域中删除指定服务,禁止该服务流量,如果无--zone= 选项,使用默认区域
--remove-port=<PORT/PROTOCOL>[--zone=<ZONE>] 从区域中删除指定端口和协议,禁止该端口的流量,如果无--zone= 选项,使用默认区域
--reload 删除当前运行时配置,应用加载永久配置
--list-services 查看开放的服务
--list-ports 查看开放的端口
--list-all [--zone=<ZONE>] 列出指定区域的所有配置信息,包括接口,源地址,端口,服务等,如果无--zone= 选项,使用默认区域
2.1.2 查看现有的firewall设置
[root@localhost ~]#systemctl start firewalld
#开启
[root@localhost ~]#systemctl stop firewalld.service
#关闭
[root@localhost ~]#systemctl status firewalld
#查看状态
查看所有的区域
[root@localhost ~]#firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
................................................................
查看个别的区域
[root@localhost ~]#firewall-cmd --list-all --zones=区域名字
[root@localhost ~]#firewall-cmd --list-all --zone=public
#查看public 区域
2.1.3 设置查看默认区
[root@localhost ~]#firewall-cmd --zone=
#查看区域
block dmz drop external home internal public trusted work
[root@localhost ~]#firewall-cmd --get-default-zone
#查看默认区域
[root@localhost ~]#firewall-cmd --set-default-zone
block dmz drop external home internal public trusted work
[root@localhost ~]#firewall-cmd --set-default-zone
block dmz drop external home internal public trusted work
[root@localhost ~]#firewall-cmd --set-default-zone home
success
[root@localhost ~]#firewall-cmd --get-default-zone
home
2.1.4 添加源地址(网段)及端口及服务
[root@localhost ~]#firewall-cmd --permanent --add-port=80/tcp
#添加80端口
[root@localhost ~]#firewall-cmd --permanent --remove-port=80/tcp
#移除80端口
[root@localhost ~]#firewall-cmd --permanent --add-port=80/tcp --zone=home
#可以指定区域
success
[root@localhost ~]#firewall-cmd --add-service=http
#允许http服务
[root@localhost ~]#firewall-cmd --permanent --add-icmp-block=echo-request
#禁止ping
success
[root@localhost ~]#firewall-cmd --reload
success
[root@localhost ~]#firewall-cmd --permanent --add-source=192.168.100.0/24
# 基础命令 永久生效 添加 源 网段 子网掩码
[root@localhost ~]#firewall-cmd --reload
success
[root@localhost ~]#firewall-cmd --list-all
#查看生效策略
小实验
尝试打开 httpd服务
####删除source
[root@localhost ~]#firewall-cmd --zone=home --remove-source=192.168.91.0/24 --remove-source=192.168.50.0/24 --remove-source=192.168.100.0/24 --permanent
3、iptables
3.1 iptables组成概述
Linux 的防火墙体系主要工作在网络层,针对 TCP/IP 数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。Linux 系统的防火墙体系基于内核编码实现, 具有非常稳定的性能和高效率,也因此获得广泛的应用。
netfilter/iptables:IP 信息包过滤系统,它实际上由两个组件 netfilter 和 iptables组成。
主要工作在网络层,针对IP数据包,体现在对包内的IP地址、端口等信息的处理。
-netfilter/iptables关系:
netfilter:
属于“内核态”又称内核空间(kernel space)的防火墙功能体系。linux 好多东西都是内核态 用户态,那我们运维人员关注的是用户态, 内核我们关注不是很多,内核基本是我们开发人员关心的事情是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables :
属于“用户态”(User Space, 又称为用户空间)的防火墙管理体系。是一种用来管理Linux防火墙的命令程序,它使插入、修改和删除数据包过滤表中的规则变得容易,通常位于/sbin/iptables目录下。
netfilter/iptables后期简称为iptables。iptables是基于内核的防火墙,其中内置了raw、mangle、 nat和filter四个规则表。表中所有规则配置后,立即生效,不需要重启服务。
iptables由五个表table和五个链chain以及一些规则组成
五个表table:filter、nat、mangle、raw、security
- filter:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表 放行 拒绝
- nat:network address translation 地址转换规则表
- mangle:修改数据标记位规则表
- raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
- security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现 (了解)
优先级由高到低的顺序为:
security -->raw-->mangle-->nat-->filter
总结
- 规则表的作用:容纳各种规则链; 表的划分依据:防火墙规则的作用相似
- 规则链的作用:容纳各种防火墙规则;规则的作用:对数据包进行过滤或处理 ;链的分类依据:处理数据包的不同时机
- 总结:表里有链,链里有规则
raw:主要用来决定是否对数据包进行状态跟踪 包含两个规则链,OUTPUT、PREROUTING
mangle : 修改数据包内容,用来做流量整形的,给数据包设置标记。包含五个规则链,INPUT、 OUTPUT、 FORWARD、 PREROUTING、 POSTROUTING
nat:负责网络地址转换,用来修改数据包中的源、目标IP地址或端口。包含三个规则链,OUTPUT、PREROUTING、POSTROUTING。
filter:负责过滤数据包,确定是否放行该数据包(过滤)。包含三个链,即PREROUTING、POSTROUTING、OUTPUT
注:在iptables 的四个规则表中,mangle 表 和raw表的应用相对较少
-
INPUT: 处理入站数据包,匹配目标IP为本机的数据包。
-
OUTPUT: 处理出站数据包,一般不在此链上做配置。
-
FORWARD: 处理转发数据包,匹配流经本机的数据包。
-
PREROUTING链: 在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上。
-
POSTROUTING链: 在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网。
3.2 iptables基本语法
CentOS7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables。
前期准备工作
systemctl stop firewalld.service
systemctl disable --now firewalld.service
##开机不自启 并且立即关闭
systemctl enable --now firewalld.service
##开机自启 并且 立即开启
yum -y install iptables iptables-services
systemctl start iptables.service
systemctl enable iptables.service
3.2.1 配置方式
iptables防火墙的配置方法:
1、使用iptables命令行。
2、使用system-config-firewall centso7不能使用 centos 6可以使用
基本语法:表中有链,链中有规则
示例:
语法总结:
表中有链 链中有规则
iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]
iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
其中,表名、链名用来指定 iptables 命令所操作的表和链,未指定表名时将默认使用 filter 表;
管理选项:表示iptables规则的操作方式,如插入、增加、删除、查看等;
匹配条件:用来指定要处理的数据包的特征,不符合指定条件的数据包将不会处理;
控制类型指的是数据包的处理方式,如允许、拒绝、丢弃等。
####注意事项#######
不指定表名时,默认指filter表
不指定链名时,默认指表内的所有链
除非设置链的默认策略,否则必须指定匹配条件
选项、链名、控制类型使用大写字母,其余均为小写
- target
数据包的常见控制类型
对于防火墙,数据包的控制类型非常关键,直接关系到数据包的放行、封堵及做相应的日志记录等。在 iptables 防火墙体系中,最常用的几种控制类型如下
- ACCEPT:允许数据包通过。
- DROP:直接丢弃数据包,不给出任何回 应信息。
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息。
- LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则。
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "sshnewlink: " 生成日志文件
tail -f /var/log/messages
Aug 15 10:01:20 localhost kernel: ftp new link: IN=ens33 OUT= MAC=00:0c:29:fe:e5:bf:00:0c:29:2a:d6:05:08:00 SRC=192.168.91.101 DST=192.168.91.100
- SNAT:修改数据包的源地址。
- DNAT:修改数据包的目的地址。
- MASQUERADE:伪装成一个非固定公网IP地址。
- 添加、查看、删除规则等基本操作
管理选项 | 用法示例 |
---|---|
-A | 在指定链末尾追加一条 iptables -A INPUT (操作) |
-I | 在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT 编号 |
-P | 指定默认规则 iptables -P OUTPUT ACCEPT (操作) |
-D | 删除 iptables -t nat -D INPUT 2 (操作) |
-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 -t filter -Z INPUT |
-E | 修改自定义链的名称 |
-S | 看链的所有规则或者某个链的规则/某个具体规则后面跟编号 |
3.2.2 iptables 规则管理
追加新规则
[root@localhost ~]#iptables -t filter -A INPUT -s 192.168.91.101 -j DROP
#会再规则的末尾加入此条设置
指定位置插入规则
[root@localhost ~]#iptables -I INPUT 2 -s 192.168.91.101 -j DROP
#在第二条前插入, 此条设置会成为第二条
[root@localhost ~]#iptables -I INPUT -s 192.168.91.101 -j DROP
#如果没有指定编号会成为第一条
删除规则
注意:
1.若规则列表中有多条相同的规则时,按内容匹配只删除的序号最小的一条
2.按号码匹配删除时,确保规则号码小于等于已有规则数,否则报错
3.按内容匹配删数时,确保规则存在,否则报错
[root@localhost ~]#iptables -D INPUT 2
#按规则序号删除 删除第二条规则
[root@localhost ~]#iptables -D INPUT -s 192.168.91.101 -j REJECT
#按内容删除
[root@localhost ~]#iptables -t 表名 -F
#清空所有规则 如果不指名 表名 代表清空filter表
修改替换规则
iptables -t 表名 -R 链名 编号 规则
[root@localhost ~]#iptables -t filter -R INPUT 1 -s 192.168.91.0/24 -j ACCEPT
#修改编号1的规则
修改默认规则
iptables 的各条链中,默认策略是规则匹配的最后一个环节——当找不到任何一条能够匹配数据包的规则时,则执行默认策略。默认策略的控制类型为 ACCEPT(允许)、DROP(丢弃)两种 , 不支持REJECT
需要注意的是,当使用管理选项“-F”清空链时,默认策略不受影响。因此若要修改默认 策略,必须通过管理选项“-P”重新进行设置。另外,默认策略并不参与链内规则的顺序编排, 因此在其他规则之前或之后设置并无区别。
[root@localhost ~]#iptables -P INPUT DROP
#把INPUT链的默认规则改成 拒绝
[root@localhost ~]# iptables -t filter -P FORWARD DROP
[root@localhost ~]# iptables -P OUTPUT ACCEPT
3.2.3 查看规则表
[root@localhost ~]#iptables -vnL
#显示filter表中所有规则 v 详细信息 n 是数字形式显示
[root@localhost ~]#iptables -vnL --line-numbers
#显示规则编号
3.2.4 通用规则 基本匹配条件 不用指明模块
基本匹配条件:无需加载模块,由iptables/netfilter自行提供
[!] -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
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围
[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链
[!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
协议匹配: -p协议名
地址匹配: -s 源地址、-d目的地址
#可以是IP、网段、域名、空(任何地址)
接口匹配: -i入站网卡、-o出站网卡
-o
-d
iptables -A FORWARD ! -p icmp -j ACCEPT
iptables -A INPUT -p icmp -s 192.168.91.101 -j REJECT
iptables -A INPUT -s 192.168.91.101 -j DROP
iptables -I INPUT -i ens33 -s 192.168.91.0/24 -j DROP
iptables -I INPUT -p icmp -j DROP
iptables -A FORWARD ! -p icmp -j ACCEPT //感叹号”!”表示取反
实例:只让特定的机器不可以ping通我
[root@localhost ~]#iptables -I INPUT 2 -s 192.168.91.101 -p icmp -j REJECT
#注意其他规则, 只有 ping 被禁止 其他协议是的 如 ssh http等
实例:设置默认策略
[root@localhost network-scripts]#iptables -P INPUT DROP
[root@localhost ~]#iptables -I INPUT 2 -i lo -j ACCEPT
#添加网卡 经过回环网卡的流量都可以通过 回环 自己
[root@localhost network-scripts]#iptables -t filter -A INPUT ! -p icmp -j ACCEPT
#除了icmp都可以
[root@localhost ~]#iptables -F
#又会连不上
[root@localhost ~]#iptables -P INPUT REJECT
[root@localhost ~]#iptables -A INPUT -s 192.168.91.1 -j ACCEPT
[root@localhost ~]#iptables -A INPUT -i lo -j ACCEPT
# -i 指定网卡 lo 回环网卡
[root@localhost ~]#iptables -A INPUT -j REJECT
#最后一条加入拒绝,形成白名单
3.2.5 扩展模块的使用
隐式扩展
iptables 在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不需要手动加载扩展模块
tcp协议的扩展选项
#注意: --sport和--dport 必须配合-p <协议类型>使用
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口连续范围
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为连续范围
[!] --tcp-flags mask comp
mask 需检查的标志位列表,用,分隔 , 例如 SYN,ACK,FIN,RST
comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔tcp协议的扩展选项
--sport 1000 匹配源端口是1000的数据包
--sport 1000:3000 匹配源端口是1000-3000的数据包
--sport :3000 匹配源端口是3000及以下的数据包
--sport 1000: 匹配源端口是1000及以上的数据包
实例:控制 101 服务器访问服务端的 tcp 的80 和22 端口
[root@localhost ~]#iptables -I INPUT 3 -m tcp -p tcp --dport 80 -s 192.168.91.101 -j REJECT
[root@localhost ~]#iptables -I INPUT 3 -p tcp --dport 22 -s 192.168.91.101 -j REJECT
实例:
[root@localhost ~]#iptables -A INPUT -p tcp -m tcp --sport 10000:30000 -j REJECT
#10000到30000 全部被拒
-p icmp
TCP标记匹配: --tcp-flags TCP标记:SYN,RST,ACK,SYN
[root@localhost ~]#iptables -I INPUT -i ens33 -p tcp --tcp-flags FIN,RST,ACK SYN -j ACCEPT
#丢弃SYN请求包,放行其他包
#不用
iptables -I INPUT -i ens33 -p tcp ! --syn -j REJECT
icmp扩展
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
类型匹配: --icmp-type ICMP类型
#可以是字符串、数字代码
"Echo- Request" (代码为8)表示请求
"Echo- Reply" (代码为0)表示回复
"Dest ination-Unreachable" (代码为3)表示目标不可达
关于其它可用的ICMP协议类型,可以执行“iptables -p icmp -h”命令,查看帮助信息
例子:
[root@localhost ~]#iptables -A INPUT -p icmp --icmp-type 8 -j DROP
#禁止其它主机ping本机
例子2:100 可以ping 通 101 101 ping不通100
[root@localhost ~]#iptables -A INPUT -p icmp --icmp-type 0 -j DROP
#允许本机ping其它主机 iptables -A INPUT -p icmp -j DROP
[root@localhost ~]#iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
#当本机ping不通其它主机时提示目标不可达
#此时其它主机需要配置关于icmp协议的控制类型为REJECT
[root@localhost ~]#iptables -A INPUT -p icmp -j REJECT
[root@localhost ~]#iptables -A INPUT -s 192.168.91.101 -p icmp --icmp-type 8 -j REJECT
显示扩展模块
显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块
格式
[-m matchname [per-match-options]]
multiport扩展 混合端口
以离散方式定义多端口匹配,最多指定15个端口
[!] --source-ports,--sports port[,port|,port:port]...
#指定多个源端口 逗号隔开
[!] --destination-ports,--dports port[,port|,port:port]...
# 指定多个目标端口 逗号隔开
[!] --ports port[,port|,port:port]...
#多个源或目标端
例子:
[root@localhost ~]#iptables -t filter -A INPUT -s 192.168.91.101 -p tcp --dport 22,80 -j REJECT
#不支持离散的端口号
iptables v1.4.21: invalid port/service `22,80' specified
Try `iptables -h' or 'iptables --help' for more information.
[root@localhost ~]#iptables -A INPUT -s 192.168.91.101 -p tcp -m multiport --dports 22,80,3306 -j REJECT
#阻止 ip地址来自192.168.91.101 访问当前机器 的tcp 80 8080端口
iprange扩展
指明连续的(但一般不是整个网络)ip地址范围
[!] --src-range from[-to] 源IP地址范围
[!] --dst-range from[-to] 目标IP地址范围
例子:
[root@localhost ~]#iptables -A INPUT -m iprange --src-range 192.168.91.101-192.168.91.103 -j REJECT
# 指定 源地址为192.168.91.101-192.168.91.103 3个地址无法访问 当前主机
mac地址
mac 模块可以指明源MAC地址,,适用于:PREROUTING, FORWARD,INPUT chains
-m mac [!] --mac-source XX:XX:XX:XX:XX:XX 源
man iptables-extensions 查看帮助
例子:
[root@zabbix-server ~]#ip a
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether ### 00:0c:29:2a:d6:05 ####
inet 192.168.91.101/24 brd 192.168.91.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::ce63:27de:ef4d:4f66/64 scope link
valid_lft forever preferred_lft forever
[root@localhost ~]#iptables -A INPUT -m mac --mac-source 00:0c:29:2a:d6:05 -j REJECT
string字符串
对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp} 字符串匹配检测算法
bm:Boyer-Moore 算法
kmp:Knuth-Pratt-Morris 算法
--from offset 开始查询的地方
--to offset 结束查询的地方
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式,16进制格式
mac + ip + 协议端口号 = 62 真 google
connlimit扩展
根据每个 客户端IP做并发连接数数量匹配
可防止Dos(Denial of Service,拒绝服务)攻击
--connlimit-upto N #连接的数量小于等于N时匹配
--connlimit-above N #连接的数量大于N时匹配
例子:
模拟攻击
[root@localhost3 ~]# gcc flood_connect.c -o flood
#编译安装 黑客文件
[root@localhost3 ~]# ./flood 192.168.91.100
#运行黑客脚本
[root@localhost 7-1]#ss
[root@localhost1 ~]#iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT
limit限制流量
--limit-burst number #前多少个包不限制
--limit #[/second|/minute|/hour|/day]
例子:
[root@localhost ~]#iptables -I INPUT -p icmp --icmp-type 8 -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
#icmp 包 前5个不限制 一分钟 允许 通过10个包
[root@localhost ~]#iptables -A INPUT -p icmp -j REJECT
state
状态类型
- NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
- ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
- RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
- INVALID:无效的连接,如flag标记不正确
- UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪
例子:老用户可以继续访问,拒绝新用户
--state state
ipatables -A INPUT -m state --state NEW -j REJECT
ipatables -A INPUT -m state --state ESTABLISHED -j ACCEPT
新用户不可以访问 旧用户可以访问
3.3 保存规则
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限
持久保存规则
centos 7 8
iptables-save > /PATH/TO/SOME_RULES_FILE
centos6
#将规则覆盖保存至/etc/sysconfig/iptables文件中
service iptables save
加载规则
CentOS 7,8 重新载入预存规则文件中规则:
iptables-restore < /PATH/FROM/SOME_RULES_FILE
iptables-restore选项
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交
centos6
#会自动从/etc/sysconfig/iptables 重新载入规则
service iptables restart
开机重载规则
用脚本保存各个iptables命令;让此脚本开机后自动运行
.bashrc
/etc/proflie
iptables-save > /opt/iptables
vim ~/.basrc
iptables-restore < /opt/iptables
全局生效
在/etc/rc.d/rc.local文件添加
[root@localhost ~]#vim /etc/rc.d/rc.local
#行末添加
iptables-restore < /opt/iptables
[root@localhost ~]#chmod +x /etc/rc.d/rc.local
[root@localhost ~]#/etc/rc.d/rc.local
3.4 自定义链补充
-N:new, 自定义一条新的规则链
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
-X:delete,删除自定义的空的规则链
例子: 新建 自定义链 -N
[root@localhost ~]#iptables -N web
[root@localhost ~]#iptables -vnL
Chain INPUT (policy ACCEPT 6 packets, 428 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 4 packets, 464 bytes)
pkts bytes target prot opt in out source destination
# Chain web (0 references)
# pkts bytes target prot opt in out source destination
例子:改名 -E
[root@localhost ~]#iptables -E web WEB
[root@localhost ~]#iptables -vnL
Chain INPUT (policy ACCEPT 22 packets, 1452 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 12 packets, 1184 bytes)
pkts bytes target prot opt in out source destination
Chain WEB (0 references)
pkts bytes target prot opt in out source destination
例子: 给自定义链 添加规则
[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 -N DB
[root@localhost ~]#iptables -A DB -p tcp -m multiport --dport 3306,6379 -j ACCEPT
例子: 使用自定义链
[root@localhost ~]#iptables -A INPUT -s 192.168.91.101 -j WEB
[root@localhost ~]#iptables -A INPUT -s 192.168.91.102 -j DB
[root@localhost ~]#iptables -vnL
Chain INPUT (policy ACCEPT 25 packets, 1676 bytes)
pkts bytes target prot opt in out source destination
0 0 WEB all -- * * 192.168.91.101 0.0.0.0/0
例子: 删除自定义链
[root@localhost ~]#iptables -F INPUT
[root@localhost ~]#iptables -F WEB 删除
[root@localhost ~]#iptables -X WEB 清空自定义链的规则
[root@localhost ~]#iptables -X WEB
[root@localhost ~]#iptables -X DB
4、NAT(网络地址转换技术)
具体操作见博客:
https://blog.csdn.net/qq_69831828/article/details/147544726