iptables 防火墙
firewall:防火墙 - 放止其他人攻击你的服务器/限制连接 - 由内核(操作系统中最核心的软件)来实现。
iptables底层是使用内核中的netfilter实现的,iptables充当一个外部函数传参调用内部函数的功能。
引入概念 - 内核
# 查看内核版本
uname -r
# 示例
[root@sc ~]# uname -r
3.10.0-1160.el7.x86_64
内核的作用
- 对cpu进行调度管理
- 对内存进行管理
- 对进程进行管理
- 对文件系统进行管理/磁盘io
- 对网络和其他硬件进行管理(netfilter - 对网络进出的数据进行管理)
iptables
iptables是一个应用工具,给内核里的netfilter传递参数的工具
firewalld是在iptables的基础上进行了改良的传参工具,更加好用
分类
包过滤防火墙
工作原理:包过滤防火墙工作在网络层(OSI 模型的第三层),它根据数据包的源 IP 地址、目的 IP 地址、端口号、协议等信息来决定是否允许数据包通过。
可以查看IP包、段(端口号)
状态检测防火墙
工作原理:状态检测防火墙也工作在网络层,但它不仅检查数据包的头部信息,还会跟踪连接的状态。它会维护一个连接状态表,记录每个连接的源 IP、目的 IP、端口号、协议以及连接的当前状态等信息。
应用层防火墙
工作原理:应用层防火墙工作在应用层(OSI 模型的第七层),它针对特定的应用程序或服务进行过滤和控制。
可以看应用层的协议:http、ftp、qq等
另一种分类
-
软件防火墙 在机器上安装iptables等软件即可使用防火墙服务
-
硬件防火墙 单独的一台机器,放在网络的出口实现过滤的功能 路由器使用
WAF:Web应用防护系统(也成为:网站应用级入侵防御系统)。Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品
厂商:华为、华三、深信服、奇安信、启明星辰、天融信
规则链
规则的作用在于对数据包进行过滤和处理,根据处理时机的不同,各种规则被组织在不同的链中。
规则链是防火墙规则/策略的集合
默认的五个规则链
- INPUT:处理入站数据包
- OUTPUT:处理出站数据包
- FORWARD:处理转发数据包
- POSTROUTING链:在进行路由选择后处理数据包
- PREROUTING链:在进行路由选择前处理数据包
规则表
具有某一类相似用途的防火墙规则,按照不同处理时机分到不同的规则链以后,北归之到不同的表中。
规则表是规则链的集合
默认的四个规则表 - 优先级按顺序
- raw表:确定是否对该数据包进行状态跟踪
- mangle表:为数据包设置标记
- nat表:修改数据包中的源、目标IP地址或端口
- filter表:确定是否放行该数据包(过滤)
iptables的规则表、链结构
数据包过滤匹配流程
Linux命令查看四表五链
iptables -L -t table_name
# 可以查看表的所有链
# 示例
[root@sc ~]# iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
Linux命令
语法格式
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]
# 不指定表名时,默认表示filter表
# 不指定链名时,默认使用该表内所有链
# 除非设置规则链的缺省策略,否则需要指定匹配条件
基本参数
- A:添加一条防火墙规则,默认添加到—line(显示行)的最后一行
- I:插入一条防火墙规则,默认插入到第一条,可以指定插入地方
- L:列出指定表中的所有规则链或指定链中的规则。如果不指定链名,则列出所有链的规则。例如,
iptables -L
会列出filter
表中所有链的规则。 - F:清空指定链中的所有规则。如果不指定链名,则清空所有链的规则。例如,
iptables -F INPUT
会清空INPUT
链中的规则。 - D:删除表中的规则,后面接表以及表中策略的下标(第几条规则)
- P:设置指定链的默认策略。例如,
iptables -P INPUT DROP
将INPUT
链的默认策略设置为DROP
,即丢弃所有进入的数据包,除非有明确的规则允许它们通过。默认规则无法通过F删除。 - Z:将指定链的数据包计数器和字节计数器清零。可以用于统计一段时间内通过某条规则的数据包数量和字节数。
使用示例
iptables -t nat -A INPUT -p tcp -j ACCEPT
# -p 协议名 在nat表中添加一条指定INPUT链中允许tcp协议通过的策略
iptables -I INPUT -p udp -j ACCEPT
# 在默认表filter中插入一条指定INPUT链中允许udp协议通过的策略
iptables -I INPUT 2 -p udp -j ACCEPT
# 指定行数插入
iptables -P INPUT DROP
# 指定INPUT 表中默认规则为DROP(丢弃) 即如果到来的数据不满足INPUT表中的策略,就会执行默认操作
iptables -L INPUT --line -n
# 查看规则,并按行数显示,并按数字显示(否则为域名)
条件匹配
-
p:指定协议,如
tcp
、udp
、icmp
等。例如,p tcp
表示只匹配 TCP 协议的数据包。特殊指定
iptables -A FORWARD -p tcp --dport 22 -j ACCEPT iptables -A OUTPUT -p tcp --sport 20:80 -j ACCEPT iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK -j REJECT iptables -A INPUT -i eth0 -p icmp --icmp-type Echo-Reqeust -j DROP iptables -A INPUT -i eth0 -p icmp --icmp-type Echo-Reply-j DROP
-
s:指定源 IP 地址或网络地址。可以使用 CIDR 表示法来指定一个网络范围。例如,
s 192.168.1.0/24
表示匹配源 IP 地址在192.168.1.0
到192.168.1.255
之间的数据包。 -
d:指定目标 IP 地址或网络地址,用法与
s
类似。例如,d 10.0.0.1
表示匹配目标 IP 地址为10.0.0.1
的数据包。 -
-sport:指定源端口号。可以是一个具体的端口号,也可以是一个端口范围。例如,
-sport 80
表示匹配源端口为80
的数据包,-sport 1024:65535
表示匹配源端口在1024
到65535
之间的数据包。 -
-dport:指定目标端口号,用法与
-sport
类似。例如,-dport 443
表示匹配目标端口为443
的数据包。
其他参数
- i interface:指定数据包进入的网络接口。例如,
i eth0
表示只处理从eth0
接口进入的数据包。 - o interface:指定数据包出去的网络接口。例如,
o wlan0
表示只处理从wlan0
接口出去的数据包。 - j target:指定规则的目标动作,即当数据包匹配到规则时要执行的操作,如前面提到的
ACCEPT
、DROP
、REJECT
、DNAT
、SNAT
等。例如,j ACCEPT
表示允许数据包通过
规则动作参数 [-j 规则动作]
- ACCEPT:允许数据包通过。当数据包匹配到规则且动作是
ACCEPT
时,数据包将被允许通过防火墙,继续其传输路径。 - DROP:丢弃数据包。数据包将被直接丢弃,不做任何响应,就好像目标主机不存在一样。这是一种常用的阻止未经授权访问的方式。
- REJECT:拒绝数据包,并向源主机发送一个错误消息,告知对方连接被拒绝。与
DROP
不同,REJECT
会让源主机知道连接被拒绝的原因,而DROP
则是默默地丢弃数据包,源主机可能会一直等待响应而不知道发生了什么。 - DNAT:目标地址转换(Destination Network Address Translation)。用于将数据包的目标 IP 地址和端口转换为指定的地址和端口,通常用于实现端口转发和服务器负载均衡等功能。
- SNAT:源地址转换(Source Network Address Translation)。将数据包的源 IP 地址转换为指定的地址,常用于共享网络连接,使多个内部主机能够通过一个公共 IP 地址访问外部网络。
示例
iptables -A FORWARD -s 192.168.1.11 -j REJECT
# 拒绝192.168.1.11进入FORWARD的请求
iptables -A INPUT -i eth1 -s 172.16.0.0\12 -j DROP
# 将指定的源网段访问网卡eth1的数据包丢弃
iptables -A FORWARD-o eth1 -d 61.35.4.3 -j DROP
# 将从eth1网卡上出去的发往指定目的的数据包丢弃(路由)
# 一般路由器才会做FORWARD上做策略
firewalld
firewalld
是一个动态防火墙管理工具,它为 Linux 系统提供了更灵活、更方便的防火墙管理方式
firewalld防火墙是Centos默认的防火墙管理工具,取代了之前的iptables防火墙,也是工作在网络层,属于包过滤防火墙。
iptables属于静态防火墙
firewalld属于动态防火墙
zone
不同的区域代表了不同的信任级别和安全策略。常见的区域有public
(公共网络,安全性较低)、trusted
(信任网络,允许所有流量)等。用户可以根据网络环境和设备的安全需求,将不同的网络接口或源 IP 地址分配到不同的区域,从而应用不同的防火墙规则。
firewalld定义了9个区域
区域 | 说明 |
---|---|
trusted(信任区域) | 允许所有网络流量连接,即使没有开放任何服务,那么使用此 zone 的流量照样通过 |
public(公共区域) | 默认的 zone,部分公开,不信任网络中其他计算机,只放行特定服务 |
external(外部区域) | 允许与 ssh 预定义的服务传入流量,其余均拒绝。默认将通过此区域转发的 IPv4 传出流量进行地址伪装,可用于为路由器启用了伪装功能的外部网络 |
home(家庭区域) | 允许与 ssh、ipp-client、mdns、samba-client 或 dhcpv6-client 预定义的服务传入流量,其余均拒绝 |
internal(内部区域) | 默认值时与 home 区域相同 |
work(工作区域) | 允许与 ssh、ipp-client、dhcpv6-client 预定义的服务传入流量,其余均拒绝 |
dmz(隔离区域也称为非军事区域) | 允许与 ssh 预定义的服务传入流量,其余均拒绝 |
block(限制区域) | 任何流入的包都被拒绝,返回 icmp-host-prohibited 报文(ipv4)或 icmp6-adm-prohibited 报文(ipv6)。只允许由该系统初始化的网络连接 |
drop(丢弃区域) | 任何流入的包都被丢弃,不做任何响应,只允许流出的数据包 |
Linux命令
# 显示所有可用区域
# firewall-cmd --get-zones
# 显示当前默认区域
# firewall-cmd --get-default-zone
# 设置默认区域
# firewall-cmd --set-default-zone=public
# 显示当前使用的区域和对应网卡
# firewall-cmd --get-active-zones
# 显示指定接口绑定的区域
# firewall-cmd --get-zone-of-interface=ens33
# 为指定接口绑定区域
# firewall-cmd --zone=dmz --add-interface=ens37
# 为指定的区域更改绑定的网络接口
# firewall-cmd --zone=dmz --change-interface=ens33
# 为指定的区域删除绑定的网络接口
# firewall-cmd --zone=dmz --remove-interface=ens37
# 查看默认区域设置
# firewall-cmd --list-all
# 查看指定的区域设置
# firewall-cmd --zone=dmz --list-all
# 显示指定区域可以访问的服务
# firewall-cmd --zone=public --list-services
# 显示系统预定义的服务名
# firewall-cmd --get-service
# 为指定区域添加允许访问的服务
# firewall-cmd --zone=public --add-service=http
# 为指定区域删除允许访问的服务
# firewall-cmd --zone=public --remove-service=http
# 添加多个服务
# firewall-cmd --zone=public --add-services={http,https,redis,ssh}
# 永久生效,运行时配置结束后统一执行
# firewall-cmd --runtime-to-permanent
# 永久生效,需要在设置时加--permanent选项,但是并不是运行时生效,
# 需要重启启动firewalld或者重新reload
# firewall-cmd --permanent --zone=public --add-services=http
# firewall-cmd --reload 或者 systemctl restart firewalld
# 显示指定域中允许访问的端口
# firewall-cmd --zone=public --list-port
# 为指定域中添加允许访问的端口
# firewall-cmd --zone=public --add-port=22/tcp --add-port=80-100/tcp
# 为指定域中删除允许访问的端口
# firewall-cmd --zone=public --remove-port=22/tcp --remove-port=80-100/tcp
# firewalld 端口映射
# 设置禁止来源IP为192.168.100.134的ip地址访问
# firewall-cmd --add-source=192.168.100.134/24 --zone=drop
# --类似于iptables中DROP
# firewall-cmd --add-source=192.168.100.134/24 --zone=block
#--类似于iptables中REJECT
# 设置允许来源IP为192.168.100.134的ip地址访问
# firewall-cmd --add-source=192.168.100.134/24 --zone=trusted
# 地址转发端口映射
# firewall-cmd --zone=public --add-forward-port=port=80:proto=tcp:toport=8080
# firewall-cmd --zone=public --remove-forward-port=port=80:proto=tcp:toport=80:toaddr=192.168.100.134
#(在访问添加了这个规则的ip的数据包会转发到192.168.100.134的80端口)