Linux 防火墙系统
iptables 和 nftables
iptables 是 Linux 中最常用的防火墙管理软件,它通过 Linux 内核中的 netfilter 模块提供的 Hook 来管理网络数据包的处理和转发。
nftables 是 iptables 的代替品,在 Debian 10、Ubuntu 22、CentOS 8 中默认的防火墙软件已经由 iptables 切换到了 nftables。
iptables 的操作命令是 iptables,nftables 的操作命令是 nft。在一些 Linux 发行版中为了实现兼容,会将 iptables 命令作为一个接口链接到 iptables-nft 来使用 nftables,也可以使用 update-alternatives 命令手动将 iptables 命令切换到 iptables-legacy 来使用原版的 iptables (通过 iptables -v
可以查看当前实现: iptables v1.8.9 (nf_tables)
)。
工具链
- netfilter 是 Linux 内核层的一个模块,用于管理网络数据包。netfilter 制定了五个数据包的挂载点(Hook),分别是 PRE_ROUTING、INPUT、OUTPUT、FORWARD 与 POST_ROUTING。
- iptables 是一个运行在用户空间的应用软件,它通过 netfilter 提供的 Hook 来实现对网络数据包的处理和转发。
- nftables 是 iptables 的代替品。
- ufw/firewalld 分别是 Debian/Redhat 系中的默认防火墙配置工具前端,为防火墙提供了轻量化的配置功能,它们后端通常是 iptables。
它们之间的关系可以总结为:netfilter 是 Linux 的一个内核模块,iptables/nftables 是基于 netfilter 模块实现的防火墙应用程序,ufw/firewalld 是防火墙功能的前端工具。
防火墙的原理
netfilter 的处理流程如下
iptables 由表,链和规则组成,netfilter 流程中的 5 个 Hook 对应了 iptables 四表五链中的五链(四表:raw、mangle、nat、filter,五链:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING),iptables 的执行顺序如下
网络数据包有两条执行路径:
- PREROUTING -> FORWARD -> POSTROUTING
- RREROUTING -> INPUT -> OUTPUT -> POSTROUTING
当路由选择判断数据包的目标地址不是当前设备时会执行第一条流程进行转发,否则会执行第二条流程。
在每条执行路径上的链中又会按照顺序执行各表中的规则,如 PREROUTING 链会按照 raw.PREROUTING -> mangle.PREROUTING -> nat.PREROUTING 的顺序执行规则
常用命令
iptables -t filter -n -v -L --line-numbers
背景:
docker container1 8080
docker container2 80
container2 -> container1
ufw deny 8080
ip:8080 可以访问
ip:80 -> ip:8080 无法访问
相关知识:
防火墙工具关系
解决步骤:
iptables 打印日志
解决方案: