防火墙 iptables和firewalld
防火墙概述
防火墙是整个数据包进入主机前的第一道关卡,是一种应用于网络上的过滤机制。 从保护对象上可分为:主机防火墙、网络防火墙;从物理上可分为:硬件防火墙、软件防火墙; 防火墙主要通过Netfilter与TCP Wrappers两个机制来管理的。 1)Netfilter:数据包过滤机制 2)TCP Wrappers:程序管理机制 关于数据包过滤机制(Netfilter)有两个软件:firewalld与iptables
一、Netfilter 机制
1. netfilter 组件
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
2. 三表五链
三表: filter #对包进行过滤,即定义允许或者不允许的 nat #进行地址转换/端口转发 mangle #对数据包进行修改 实际上还有raw 和security表,常用到的只有filter和nat表 raw #一般是为了不再让iptables对数据包进行跟踪,提高性能 security #用于强制访问控制(MAC)网络规则 五链: PREROUTING #路由之前 INPUT #数据包入口;作用于输入本机的数据包 FORWARD #转发管卡;作用于与本机无关的数据包 OUTPUT #数据包出口;作用与本机输出的数据包 POSTROUTING #路由之后
filter表:
INPUT | FORWARD | OUTPUT |
作用于输入本机的数据包 | 作用于与本机无关的数据包 | 作用与本机输出的数据包 |
nat表:
PRERPUTING | OUTPUT | POSTROUTING |
在包刚刚到达防火墙时改变它的目的地址(DNAT) | 改变本地产生的包的目的地址 | 在包离开防火墙之前改变其源地址 (SNAT) |
一般mangle表很少用到;当filter和nat表不够用时,才用mangle表来进行补充说明。
3.数据流向
报文流向: 流入本机:PREROUTING --> INPUT-->用户空间进程 流出本机:用户空间进程-->OUTPUT--> POSTROUTING 转发:PREROUTING --> FORWARD --> POSTROUTING
内核中数据包的传输过程: (1)当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去 (2)如果数据包就是进入本机的,数据包就会到达INPUT链。经INPUT链检查后,数据包被发往本地进程。 本地进程进行相应处理后发送响应数据包,数据包经过OUTPUT链,然后到达POSTROUTING链输出; 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
二、Firewalld 与 Iptables
Firewalld:
firewalld是一种提供了支持网络/防火墙区域(zone)定义网络链接以及接口安全等级的动态防火墙管理工具
它自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,
他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结构以及使用方法不一样罢了。
(1). 区域管理
通过将网络划分成不同的区域,制定出不同区域之间的访问控制策略来控制不同程序区域间传送的数据流。
例如,互联网是不可信任的区域,而内部网络是高度信任的区域。网络安全模型可以在安装,
初次启动和首次建立网络连接时选择初始化。该模型描述了主机所连接的整个网络环境的可信级别,并定义了新连接的处理方式。
(2). firewalld域
firewalld的默认区域是public
(3). 配置文件
firewalld默认提供了九个zone配置文件:
block.xml、dmz.xml、drop.xml、external.xml、 home.xml、internal.xml、public.xml、trusted.xml、work.xml
他们都保存在“/usr/lib/firewalld/zones/”目录下。
Iptables:
iptables是与内核集成的 IP 信息包过滤系统。它是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
它准确来讲并不是防火墙,真正的防火墙是运行于系统内核中的 netfilter,而 iptables 仅仅是 netfilter 的代言人,
其所负责的主要功能便是与用户交互,获取到用户的要求,并转化成 netfilter 可以接受的信息。
三 、Firewalld 和 Iptables 的异同
相同点: firewalld 与 iptables 都是 linux 中防火墙的管理程序, 但其实其角色主要为对于防火墙策略的管理,真正的防火墙执行者是位于内核中的netfilter 不同点: 1. iptables 仅能通过命令行进行配置;而 firewalld 提供了图形接口,类似windows防火墙的操作方式 2. iptables 每一个单独更改意味着清除所有旧的规则,并从 /etc/sysconfig/iptables 中读取所有新的规则;
而 firewalld 在有规则变动后,可以仅仅运行规则中的不同之处,即在 firewalld 运行时间内,改变设置时可以不丢失现行链接 3. iptables 的配置文件在 /etc/sysconfig/iptables 中;而 firewalld 的配置文件在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件中 4. iptables 没有守护进程,并不能算是真正意义上的服务;而 firewalld 有守护进程 5. iptables 通过控制端口来控制服务,而 firewalld 则是通过控制协议来控制端口
四 、SNAT与DNAT
SNAT 在路由之后 做源地址转换 (postrouting)
DNA 在路由之前 做目的地地址转换 (prerouting)
SNAT: A--->B--->C (比如我们想要访问百度,淘宝等网站)
企业内部的主机A想访问互联网上的主机C,首先将请求数据包(源:ipA,目标:ipC)发送到防火墙所在主机B,
B收到后将数据包源地址改为本机公网网卡的ip(源:ipB,目标:ipC),然后经互联网发送给C;
C收到后将回应包(源:ipC,目标:ipB)转发给C的路由器,经互联网将回应包转发给B,
B收到回应包后修改其目的地址,即回应包改为(源:ipC,目标:ipA)然后将数据包转发给A。
在这个过程中,修改了请求报文的源地址,叫做SNAT(source NAT POSTROUTING),用于局域网访问互联网。
不能在防火墙B的prerouting链上设置转换源地址的防火墙策略,因为若在B的prerouting链上设置转换源地址的防火墙策略,此时还未检查路由表,
还不知道要到达数据包中目标主机需经过本机的哪个网卡接口,即还不知道需将源地址替换为哪个公网网卡的ip,需在postrouting设置转换源地址的防火墙策略。
DNAT: C--->B--->A (比如对外发布web网站)
互联网主机C想访问企业内部的web服务器A,但A的地址是私有地址,无法直接访问。此时,C可以访问防火墙的公网地址,
C的请求数据包(源:ipC,目标:ipB)到达防火墙B后,在B的prerouting上将请求数据包的目标地址进行修改,并将数据包(源:ipC,目标:ipA)发送给A。
A收到后进行回复发送响应包(源:ipA,目的ipC)到防火墙,防火墙收到后对数据包源地址进行修改,并将响应包(源:ipB,目标:ipC)给C。
利用这种机制可以将企业内部的服务发布到互联网。
在这个过程中,修改了请求报文的目标地址,叫做DNAT(destination NAT POSTROUTING),用于互联网访问局域网。
必须在防火墙的prerouting上设置修改目标地址的防火墙策略,因为若不在此处修改,请求数据包通过prerouting和路由表后,
由于目标主机是本机,就会将数据包发往input,进而被发往本地进程。
(2).用途
SNAT:源地址转换,其作用是将ip数据包的源地址转换成另外一个地址。 1.保护内网用户安全,因为公网地址总有一些人恶意扫描,而内网地址在公网没有路由所以无法被扫描,能被扫描的只有防火墙这一台,这样就减少了被攻击的可能。 2.Ipv4地址匮乏,很多公司只有一个ipv4地址,但是却有几百个用户需要上网,这个时候就需要使用SNAT。 3.省钱,公网地址付费,使用SNAT只需要一个公网ip就可以满足几百人同时上网。
DNAT:目的地地址转换,其作用是将一组本地内部的地址映射到一组全球地址。 在内网中有服务器,如果想让公网用户访问有两种方法。 1.配置双网卡,一网卡对内,一网卡对外;一般是高访问量的web服务器,为了避免占用网关的流量才这样做,使用不是很广泛。 2.内网web服务器,或是ftp服务器,为了用户在公网也可以访问,有不想买公网ip地址,采用DNAT方案。
(3). 应用场景
SNAT:
内部地址要访问公网上的服务时(如web访问),内部地址会主动发起连接,由路由器或者防火墙上的网关对内部地址做个地址转换,
将内部地址的私有IP转换为公网的公有IP,网关的这个地址转换称为SNAT,主要用于内部共享IP访问外部。
DNAT:
当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部,
此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
五、iptables常用命令
安装iptables
systemctl disable firewalld --now #必须停止firewalld,否则会冲突 yum –y install iptables-services systemctl enable iptables --now
查看已添加的iptables规则
iptables -nvL #默认查看filter表
iptables -nvl -t nat #指定查看nat表
将所有iptables以序号标记显示
iptables -L -n --line-numbers
删除指定规则
比如要删除INPUT里序号为8的规则
iptables -D INPUT 8
清除所有iptables规则
iptables -F #清除所有
iptables -t filter -F INPUT # 清除 filter 表 INPUT 链中的所有规则
允许规则
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口 #如不指定-p tcp,则默认all所有协议
iptables -A INPUT -p tcp --sport 80 -j ACCEPT # 允许外部的来自80端口的数据访问本地服务器
iptables -A INPUT -s 172.18.0.3 -j ACCEPT #允许来源地址为 172.18.0.3 的数据包进入本机
禁止规则
iptables -I INPUT -p tcp --dport 80 -j DROP #禁止访问80端口
iptables -A INPUT -s 172.18.0.3 -p icmp -j DROP #禁止源ip的ping协议,注意:因为禁用了从3机器来的icmp协议,那么当前机器也不能ping通机器3,原因是收不到响应数据。
但是机器B确实能收到请求,可以在机器B上执行抓包tcpdump -i eth0 icmp
。
iptables -A INPUT -j REJECT #禁止其他未允许的规则访问(禁止后,后续允许不生效)
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
dnat-目的地址转换
# 把从 eth0 进来的要访问 TCP/81 的数据包目的地址改为 172.18.0.3:80 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 81 -j DNAT --to 172.18.0.3:80 # 把从 eth0 进来的要访问 TCP/80 的数据包目的地址改为地址池 172.18.0.3-172.18.0.10 iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.18.0.3-172.18.0.10
snat-源地址转换
# 将 172.18.0.3:80 的原地址修改为 172.18.0.2 iptables -t nat -A POSTROUTING -p tcp --dport 80 -d 172.18.0.3 -j SNAT --to 172.18.0.2 # 将内网 172.18.0.1/24 的原地址修改为 1.1.1.1 iptables -t nat -A POSTROUTING -d 172.18.0.1/24 -j SNAT --to 1.1.1.1 # 同上,只不过修改成一个地址池里的 IP iptables -t nat -A POSTROUTING -d 172.18.0.1/24 -j SNAT --to 1.1.1.1-1.1.1.10
持久化规则配置
iptables-save > /etc/sysconfig/iptables #导出至文件,只是导出,导致不会自动加载 iptables-restore < /etc/sysconfig/iptables #通过文件恢复配置 注意: 这种方式只是保存规则和恢复的一种方式,并不是说保存规则后下次启动就会自动加载。一定要记住这点,如果要想系统启动后自动加载请看下面的方式。
install iptables-persistent systemctl list-units --type=service | grep "persistent" #模糊搜索 serviceName netfilter-persistent save #持久化当前iptables配置, 删除规则之后 重新执行save即可 # 当前建立的任何 iptables 规则都将保存到以下相应的 IPv4 和 IPv6 文件中: /etc/iptables/rules.v4 /etc/iptables/rules.v6 cat /etc/iptables/rules.v4
五、firewalld常用指令
查看防火墙基本状态
列出防火墙的所有配置: firewall-cmd --list-all 查看防火墙状态: firewall-cmd --status
富规则
添加指定ip访问指定端口规则 firewall-cmd --add-rich-rule 'rule family="ipv4" source address="1.1.1.1" port="80" port protocol="tcp" accept' 删除指定ip访问指定端口规则 firewall-cmd --remove-rich-rile 'rule family="ipv4" source address="1.1.1.1" port="80" port protocol="tcp" accept' 禁止某个ip访问 firewall-cmd --add-rich-rule 'rule family="ipv4" source address="1.1.1.1" drop' 允许ping firewall-cmd --add-rich-rule 'rule family="ipv4" protocol value="icmp" accept' 接受1.1.1.0/24网段的所有ip访问ssh服务 filewall-cmd -add-rich-rule 'rule family="ipv4" source address="1.1.1.0/24" service name="ssh" accept' ps:添加参数--permanent可以使所有富规则永久保存,在下次重启防火墙时不会消失
端口转发
将8888端口的流量转发到80端口 firewall-cmd --add-forward-port=port=8888:proto=tcp:toport=80 取消转发 firewall-cmd --remove-forward-port=port=8888:proto=tcp:toport=80 要想转发到非本地的端口需要开启ip伪装 开启伪装命令 firewall-cmd --add-masquerade 禁止伪装命令 firewall-cmd --remove-masquerade 将本机8888端口的流量映射带192.168.189.186的80端口 firewall-cmd --add-forward-port=port=8888:proto=tcp:toaddr=192.168.189.186:toport=80
防火墙配置重载
在配置好后要运行firewall-cmd reload进行重载之后配置才会生效
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?