防火墙种类说明概述
以下概述,厂商手册,博文都介绍了,耐心看完总有收获。防火墙
网络安全第四讲 防火墙工作原理及应用-腾讯云开发者社区-腾讯云 (tencent.com)
深信服防火墙白皮书Windows 用户 (sangfor.com.cn)
奇安信 新一代智慧防火墙-技术支持 (qianxin.com)
硬件防火墙
-
H3C、华为、Cisco(思科):这些厂商提供的硬件防火墙设备通常部署在网络的边缘,作为企业的第一道防线。它们能够提供高性能的数据包过滤、状态检测、入侵防御和其他安全功能。这些设备通常具有较高的吞吐量和稳定性,适合大规模网络使用。
-
Juniper:Juniper 也是一个知名的网络设备供应商,其防火墙产品同样适用于企业级应用,提供了先进的安全功能和网络管理能力。
软件防火墙
-
开源软件:有许多开源的防火墙解决方案,如 pfSense、OPNsense、Untangle 等,这些软件可以安装在标准硬件上,为企业提供定制化的安全防护。
-
iptables:这是 Linux 内核中的一个数据包过滤系统,通过
iptables
命令行工具可以配置防火墙规则。它主要用于处理第 4 层(传输层)的流量。 -
firewalld:这是 Red Hat 系统(如 CentOS 7)中默认的防火墙管理工具,它提供了动态的防火墙管理功能,可以与
iptables
或nftables
后端一起工作。 -
nftables:这是较新的防火墙框架,用于替换
iptables
,它提供了更高效的配置语言和更高的性能,通常在 CentOS 8 及更新版本的系统中使用。 -
ufw:这是 Ubuntu 发行版中默认的防火墙管理工具,它简化了
iptables
的配置,使用户更容易管理防火墙规则。
云防火墙
-
阿里云安全组:安全组是阿里云提供的虚拟防火墙,用于控制进入或离开实例的流量。通过安全组,你可以封 IP 地址或端口,实现对网络流量的精细化控制。
-
NAT 网关:阿里云 NAT 网关提供了共享上网和端口映射等功能,可以帮助你管理内部网络的 NAT 配置。
-
WAF 应用防火墙:Web 应用防火墙(WAF)专门用于保护 Web 应用程序免受针对应用层(第 7 层)的攻击,如 SQL 注入、跨站脚本(XSS)等。阿里云提供的 WAF 服务可以帮助企业抵御这类攻击。
netfilter的介绍
netfilter
是 Linux 内核中的一个框架,用于处理网络数据包的过滤、地址转换(NAT)以及其他网络相关的功能。它提供了一种机制,使得开发者能够编写模块化插件来扩展内核的网络栈功能,而无需直接修改内核代码。这些插件可以动态地加载到内核中,用来拦截、检查和修改网络数据包。
以下是 netfilter
的一些关键组件和概念:
组件
-
钩子(Hooks):
netfilter
在网络数据包通过内核的不同阶段设置了“钩子”(也称为“挂钩点”)。在这些点上,内核会调用注册在此处的任何模块函数,允许这些函数检查和修改数据包。主要的钩子位置包括:-
NF_IP_PRE_ROUTING:数据包刚进入系统,还未被路由选择之前。
-
NF_IP_LOCAL_IN:数据包到达本地系统,准备交给本地协议栈处理。
-
NF_IP_FORWARD:数据包被转发给其他网络接口。
-
NF_IP_LOCAL_OUT:数据包由本地进程发送出去之前。
-
NF_IP_POST_ROUTING:数据包已经被路由选择,即将离开系统。
-
-
表(Tables):
netfilter
结合iptables
使用不同的表来组织规则,例如filter
表用于定义接受或拒绝数据包的基本策略,nat
表用于网络地址转换,mangle
表用于数据包的特殊标记或修改,raw
表用于确定是否绕过某些处理(如连接追踪)。 -
链(Chains):链是规则的集合,它们按照顺序被应用于通过某个特定钩子的数据包。
iptables
中预定义了一些链,如INPUT
、OUTPUT
和FORWARD
。
工作原理
当一个数据包到达 netfilter
钩子时,它会被传递给与该钩子关联的链。链中的每条规则都会被依次评估,直到找到一条匹配的规则。匹配规则的目标决定了数据包的命运:可能是被接受、被丢弃、被跳转到另一个链,或者是执行其他动作。
应用
iptables
是最常用的 netfilter
接口,它提供了命令行工具来管理 netfilter
规则。除了 iptables
,还有 ip6tables
用于 IPv6 数据包,arptables
用于 ARP 数据包,以及 ebtables
用于桥接设备。这些工具都构建在 netfilter
框架之上,为用户提供了一个强大的防火墙和网络管理工具集。
随着时间的发展,nftables
作为一种新的用户空间接口出现,旨在简化配置语法并提高性能。nftables
提供了一个统一的框架来处理 IPv4、IPv6 和其他协议,同时支持更高效的内存管理和更灵活的匹配条件。尽管如此,iptables
仍然是许多系统管理员熟悉的工具,并且在很多环境中继续使用。
firewalld,iptables,ufw等这些防火墙管理工具本质上都是调用了netfilter
接口。使用其中一种停掉别的服务,以免发生冲突
iptables五链四表
iptable是linux防火墙的管理工具。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构。
相关概念名词 表(table): 存放链的容器,防火墙最大概念 链(chain): 存放规则的容器 规则(policy): 准许或拒绝规则 ,未来书写的防火墙条件就是各种防火墙规则 一环套一环 四表 filter表——过滤数据包 Nat表——用于网络地址转换(IP、端口) Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS Raw表——决定数据包是否被状态跟踪机制处理 五链 INPUT链——进来的数据包应用此规则链中的策略 OUTPUT链——外出的数据包应用此规则链中的策略 FORWARD链——转发数据包时应用此规则链中的策略 PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来的时侯都先由这个链处理) POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理)
我们着重点在于学习filter表和Nat表
filter表介绍
是iptables默认的表,filter表示过滤. 实现防火墙功能:(对数据包的filter过滤)屏蔽或准许,端口,ip
nat表介绍
-
PREROUTING:此链处理所有到达系统但尚未被路由的数据包。在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等。做目的地址转换,要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的机器。
-
OUTPUT:和主机放出去的数据包有关,改变主机发出数据包的目的地址
-
POSTROUTING:在数据包离开防火墙时进行路由判断之后执行的规则。源地址转换,要把你的内网地址转换成公网地址才能让你上网。
nat功能相当于网络的acl控制,和网络交换机acl类似
iptables相关命令格式
格式:iptables [ -t 表名 ] 选项 [ 链名 ] [ 条件 ] [ j 控制类型 ] 其中-t参数不指定表名,默认filter表处理 这是选项相关的参数 -A 添加防火墙规则 //这个是往底部加 -D 删除防火墙规则 -I 插入防火墙规则 //这个是往最顶部添加 -F 清空防火墙规则 -L 列出添加防火墙规则 -R 替换防火墙规则 -Z zero 链的计数器清零(数据包计数器与数据包字节计数器) iptables -P 设置链默认规则 -v 显示数据包,数据量 -X 删除用户自定义的链 -v 显示数据包,数据量 ------------------------------------------------------- 条件上常用的参数 [!]-p 匹配指定协议 protocal tcp/udp/icmp/all,! 表示取反 [!]-s 匹配源地址 [!]-d 匹配目标地址 [!]-i 匹配入站网卡接口 [!]-o 匹配出站网卡接口 [!]--sport 匹配源端口 [!]--dport 匹配目标端口 [!]--src-range 匹配源地址范围 [!]--dst-range 匹配目标地址范围 [!]--limit 四配数据表速率 [!]--mac-source 匹配源MAC地址 [!]--sports 匹配源端口 [!]--dports 匹配目标端口 [!]--stste 匹配状态(INVALID、ESTABLISHED、NEW、RELATED) [!]--string 匹配应用层字串 [!] -m 指定模块 multiport --------------------------------------------------------------- -j 控制类型相关参数 ACCEPT 允许数据包通过 DROP 丢弃数据包 REJECT 拒绝数据包通过 LOG 将数据包信息记录 syslog 曰志 DNAT 目标地址转换 SNAT 源地址转换 MASQUERADE 地址欺骗 REDIRECT 重定向 其中DROP REJECT都表示拒绝 区别在于DROP把数据丢掉 不会返回信息给用户,REJECT会返回
以centos为例
安装:yum install -y iptables-services //iptables配置文件的完整路径 rpm -ql iptables-services #防火墙相关模块 加载到内核中 #写入到开机自启动. modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state #永久 cat >>/etc/rc.local<<EOF modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state EOF
运行:rpm -ql iptables-services
这些文件和目录的存在表明了系统中 iptables
和 ip6tables
的配置和管理方式。
-
配置文件:
/etc/sysconfig/ip6tables
和/etc/sysconfig/iptables
分别包含了 IPv6 和 IPv4 防火墙规则的配置。这些配置文件在系统启动时会被加载。 -
服务单元文件:
/usr/lib/systemd/system/ip6tables.service
和/usr/lib/systemd/system/iptables.service
定义了如何通过 Systemd 管理ip6tables
和iptables
服务。 -
脚本文件:
/usr/libexec/initscripts/legacy-actions
目录下的脚本文件用于处理iptables
和ip6tables
的各种操作,如保存当前规则、处理系统错误等。 -
初始化脚本:
/usr/libexec/iptables/ip6tables.init
和/usr/libexec/iptables/iptables.init
可能是用于管理ip6tables
和iptables
服务的初始化脚本。
systemctl status iptables.service 查看运行状态是否生效
这里为什么是active(exited)而非active(running),原因有以下
一次性任务:
-
iptables
服务的主要任务是在系统启动时加载和应用防火墙规则。一旦规则被成功加载,服务的任务就完成了。 -
因此,
iptables
服务并不需要一直运行在后台,而是在完成任务后退出。 -
系统设计:
-
iptables
服务的设计初衷是为了在系统启动时加载规则,并在需要时重新加载规则。这意味着它不是一个需要长时间运行的守护进程。 -
由于
iptables
规则实际是由内核中的netfilter
框架执行的,所以iptables
服务本身并不需要持续运行。
-
Linux iptables命令详解 - 知乎 (zhihu.com)
filter表综合使用
配置之前先清空规则
[root@centos ~]# iptables -F [root@centos ~]# iptables -X [root@centos ~]# iptables -Z [root@centos ~]# iptables -nL
这里其实也可以看出不指定表的时候,默认就是filter表
禁止访问8080端口
现在可以访问的情况。
iptables -t filter -A INPUT -p tcp --dport 8080 -j DROP //拒绝用户访问8080
删除规则命令 iptables -t filter -nL --line-number //获取规则编号 iptables -t filter -D INPUT 1 //根据编号删除 删除之后又能访问了
禁ip&网段(黑名单)
实验机:centos 10.10.10.138 ubuntu 10.10.10.137
禁掉Ubuntu的ip阻止通信。
iptables -I INPUT -s 10.10.10.137 -j DROP iptables -nL //查看规则 //禁掉这个网段 iptables -I INPUT -s 10.10.10.0/24 -j DROP 禁止网段连入(禁止10.0.0.0/24网段访问 8080端口) iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8080 -j DROP
配置前后发生变化,能通信配置规则之后变得不能通信
允许指定网段&ip连入(白名单)
iptables -I INPUT ! -s 10.10.10.137 -j DROP //除了10.10.10.137,其他不能连入 iptables -I INPUT ! -s 10.10.10.0/24 -j DROP //除了10.10.10.0/24,其他不能连入
配置之后ubuntu可以连接,但是win12还是连接不了。这里相当于给ubuntu设置了白名单
指定多个端口
iptables -A INPUT -m multiport -p tcp --dport 80,443 -j ACCEPT iptables -A INPUT -p tcp --dport 1:1024 -j ACCEPT //为连续1-1024端口,可以不指定-m multiport参数 iptables -I INPUT -p tcp -m multiport ! --dport 80,443 -j DROP ------------------------------------------------------ 使用 -m multiport 模块。这个模块允许您在一个规则中指定多个端口或端口范围,从而避免为每个端口单独创建多条规则。
禁用ping
通过防火墙规则 控制是否可以ping
iptables -t filter -I INPUT -p icmp --icmp-type 8 -j DROP iptables -t filter -I INPUT -p icmp -j DROP 以上两种都可以禁止ping 通过内核参数控制禁止被ping
--icmp-type 8一般指的是ping命令,回声请求
具体icmp类型可参考第16节 ICMP协议详解_icmp报文结构-CSDN博客
临时会话生效:echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
想要永久禁止被ping,编辑/etc/sysctl.conf,添加
net.ipv4.icmp_echo_ignore_all = 1 //忽略ping请求 sysctl -p /etc/sysctl.conf //应用新设置
匹配网络状态(TCP/IP连接状态)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
限制并发及速率
-m limit --limit 10/minute 一分钟10次包 m limit --limit n/{second/minute/hour}:
nat表的使用
实现共享上网
实验没有搭成功,我这边环境有点问题,原因未知。可参考以下
iptables 实现内部共享上网 - nick_xm - 博客园 (cnblogs.com)
linux 各网卡作用(docker0、eth0、lo、rndis0、usb0、dummy0、l4tbr0)ens33-CSDN博客
Iptables 实现共享上网方法 - 命令记不住 (opsxdev.com)
端口转发
通常是在需要将外部请求重定向到内部服务器的情况。端口转发通常涉及NAT(Network Address Translation)表中的PREROUTING
和POSTROUTING
链。
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 10.10.10.5:80
这个命令是在nat
表的PREROUTING
链中添加一条规则,将发往192.168.88.154:8080
的所有TCP请求重定向到内部服务器10.10.10.5:80
。在这里做了一个目的地址转换。结合上面对prerouting的理解。对方客户访问公网的最外层防火墙,他的目的地址肯定是防火墙地址。但是我们的服务器是部署在内网里面的。防火墙根据规则做了目的地址转换指向了内网服务器端口。
访问公网的8080,就是访问内网的80端口。
ip映射
iptables
进行IP映射通常指的是将到达特定IP地址的流量重定向到另一台服务器的IP地址。这种技术常用于负载均衡、代理服务器、或需要将外部请求重定向到内部服务器的场景。
服务器(IP地址为192.168.88.154
),需要将所有发往192.168.88.154
的请求重定向到内部服务器10.10.10.5
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 10.10.10.5
跟上面的端口转发的命令相同,在10.10.10.5起个80服务。访问192.168.88.154的80服务就是访问10.10.10.5的80服务。
也可以添加SNAT的规则,反过来的而已。
sudo iptables -t nat -A POSTROUTING -o ens37 -j SNAT --to-source 192.168.88.154