iptables防火墙配置
iptables
是 Linux 系统中的一个强大且灵活的命令行工具,用于配置和管理网络防火墙。通过 iptables
,用户可以定义复杂的规则来控制进出系统的数据包流量。以下是 iptables
的基本配置和使用指南。
一、iptables 基本概念
-
表(Tables)
- 描述:
iptables
使用多个表来分类不同类型的规则,每个表包含多个链(Chains)。 - 主要表:
filter
:默认表,用于过滤数据包。nat
:用于网络地址转换(NAT)。mangle
:用于修改数据包。raw
:用于配置数据包的状态跟踪。
- 描述:
-
链(Chains)
- 描述:链是规则的集合,每个链包含一系列的规则。
- 主要链:
INPUT
:处理所有进入本地系统的数据包。OUTPUT
:处理所有本地系统发出的数据包。FORWARD
:处理所有转发的数据包。PREROUTING
:在数据包路由前处理。POSTROUTING
:在数据包路由后处理。
-
规则(Rules)
- 描述:每条规则定义了条件和相应的动作,当数据包匹配条件时,执行相应的动作。
- 主要动作:
ACCEPT
:接受数据包。DROP
:丢弃数据包。REJECT
:拒绝数据包并发送响应信息。LOG
:记录数据包日志。
二、基本命令
-
查看当前规则
sudo iptables -L sudo iptables -L -t nat
-
添加规则
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-
删除规则
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPT
-
插入规则
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
-
保存规则
sudo iptables-save > /etc/iptables/rules.v4
-
加载规则
sudo iptables-restore < /etc/iptables/rules.v4
三、基本配置示例
-
允许特定端口(如SSH)的入站流量
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-
允许本地回环接口的流量
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT
-
允许已建立的连接和相关流量
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
拒绝所有其他入站流量
sudo iptables -A INPUT -j DROP
-
允许HTTP和HTTPS流量
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
-
配置NAT规则进行端口转发
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 sudo iptables -t nat -A POSTROUTING -j MASQUERADE
四、高级配置示例
-
限制SSH登录尝试(防止暴力破解)
sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set sudo iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 -j DROP
-
记录丢弃的数据包
sudo iptables -A INPUT -j LOG --log-prefix "iptables: " sudo iptables -A INPUT -j DROP
-
允许特定IP地址的访问
sudo iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
-
限制每秒钟的ICMP请求数量
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
五、持久化配置
为了在系统重启后保留 iptables
规则,需要将其持久化。以下是几种常见的方法:
-
使用iptables-save和iptables-restore
sudo iptables-save > /etc/iptables/rules.v4 sudo iptables-restore < /etc/iptables/rules.v4
-
使用iptables-persistent(Debian/Ubuntu)
sudo apt-get install iptables-persistent sudo netfilter-persistent save sudo netfilter-persistent reload
-
使用systemd服务(CentOS/RHEL)
sudo systemctl enable iptables sudo service iptables save
六、管理工具
-
ufw(Uncomplicated Firewall)
- 描述:
ufw
是一个简化iptables
配置的工具,适用于大多数用户。 - 基本用法:
sudo ufw enable sudo ufw allow ssh sudo ufw deny 22/tcp sudo ufw status
- 描述:
-
firewalld
- 描述:
firewalld
提供动态管理iptables
规则的工具和服务。 - 基本用法:
sudo systemctl start firewalld sudo firewall-cmd --add-service=http --permanent sudo firewall-cmd --reload sudo firewall-cmd --list-all
- 描述:
总结
iptables
是一个功能强大且灵活的防火墙工具,通过定义和管理规则,可以有效地控制和保护网络流量。了解并掌握 iptables
的基本概念、命令和配置示例,可以帮助管理员在多种网络环境下构建安全的防火墙策略。对于更简化的管理,可以考虑使用 ufw
或 firewalld
等工具。
Netfilter框架
Netfilter是Linux内核中的一个框架,用于实现网络数据包过滤、网络地址转换(NAT)和数据包的修改。它为防火墙、NAT和其他网络数据包处理提供了基础设施。Netfilter与iptables一起工作,通过定义规则来控制网络流量的行为。
一、Netfilter框架的组成
-
钩子点(Hooks)
- 描述:Netfilter框架在数据包处理路径上提供了五个钩子点,允许模块在这些点上注册回调函数来处理数据包。
- 主要钩子点:
NF_INET_PRE_ROUTING
:数据包进入网络栈时最先到达的钩子点,用于预处理。NF_INET_LOCAL_IN
:数据包在路由决策之后,确定是本地接收的数据包。NF_INET_FORWARD
:数据包被转发之前。NF_INET_LOCAL_OUT
:数据包从本地主机发出之前。NF_INET_POST_ROUTING
:数据包离开网络栈之前,用于后期处理。
-
表(Tables)
- 描述:Netfilter使用表来组织规则集,每个表用于不同的网络操作。
- 主要表:
filter
:用于过滤数据包,包含常用的INPUT
、OUTPUT
和FORWARD
链。nat
:用于网络地址转换,包含PREROUTING
、OUTPUT
和POSTROUTING
链。mangle
:用于修改数据包,包含所有五个链。raw
:用于数据包处理的前期阶段,主要用于状态跟踪。
-
链(Chains)
- 描述:链是按顺序排列的规则集,用于决定如何处理数据包。每个表包含多个链,每个链可以包含多个规则。
- 主要链:
INPUT
:处理进入本地系统的数据包。OUTPUT
:处理本地系统发出的数据包。FORWARD
:处理通过本地系统转发的数据包。PREROUTING
:在数据包路由决策之前处理。POSTROUTING
:在数据包离开网络栈之前处理。
-
规则(Rules)
- 描述:规则定义了特定条件和相应的操作。当数据包匹配规则的条件时,执行相应的操作。
- 主要操作:
ACCEPT
:接受数据包。DROP
:丢弃数据包。REJECT
:拒绝数据包并发送ICMP响应。SNAT
:源地址转换。DNAT
:目的地址转换。LOG
:记录数据包日志。
二、Netfilter工作原理
-
数据包流动
- 当数据包到达网络接口时,它会依次经过Netfilter的五个钩子点。这些钩子点分别处理数据包的不同阶段,并根据定义的规则决定如何处理数据包。
-
钩子函数
- 在每个钩子点,Netfilter会调用已注册的钩子函数。钩子函数可以对数据包进行过滤、修改、转发或记录日志。
-
规则匹配
- 每个钩子点上的钩子函数会依次检查数据包是否匹配某个规则。如果匹配,执行相应的操作,并可能终止进一步的规则检查。
-
状态跟踪
- Netfilter框架还提供了状态跟踪功能,能够根据连接状态(如新建、已建立、相关等)来过滤数据包,提高防火墙规则的灵活性和准确性。
三、Netfilter与iptables的关系
- Netfilter:提供了数据包过滤、修改和NAT的核心框架,以及钩子点、表、链和规则的基础设施。
- iptables:用户空间工具,提供了配置和管理Netfilter规则的命令行接口。管理员通过iptables定义规则,并将这些规则传递给Netfilter框架。
四、Netfilter框架的使用示例
-
允许特定端口(如SSH)的入站流量
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-
配置NAT规则进行端口转发
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80 sudo iptables -t nat -A POSTROUTING -j MASQUERADE
-
记录丢弃的数据包
sudo iptables -A INPUT -j LOG --log-prefix "iptables: " sudo iptables -A INPUT -j DROP
-
限制每秒钟的ICMP请求数量
sudo iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/second -j ACCEPT sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
五、Netfilter模块
Netfilter框架支持各种模块,这些模块扩展了Netfilter的功能,使其能够处理更复杂的网络操作。例如:
-
conntrack模块
- 描述:用于状态跟踪,能够跟踪每个连接的状态(如新建、已建立、相关)。
- 用法:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
LOG模块
- 描述:用于记录数据包日志,帮助管理员进行网络诊断和分析。
- 用法:
sudo iptables -A INPUT -j LOG --log-prefix "iptables: "
-
NAT模块
- 描述:用于网络地址转换,支持SNAT、DNAT和MASQUERADE操作。
- 用法:
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
六、Netfilter框架的高级特性
-
连接跟踪
- 描述:Netfilter可以跟踪网络连接的状态,允许基于连接状态的过滤和处理。
- 示例:
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-
状态同步
- 描述:在多台防火墙设备上同步连接状态,确保高可用性和负载均衡。
- 工具:使用
conntrackd
工具进行状态同步。
-
扩展模块
- 描述:Netfilter支持各种扩展模块,增强数据包处理能力,如IPset、u32等。
- 示例:使用IPset模块创建和管理IP地址集合,提高规则匹配效率。
总结
Netfilter框架是Linux内核中强大且灵活的网络数据包处理框架,通过钩子点、表、链和规则的组合,实现复杂的网络过滤、地址转换和数据包修改功能。用户可以通过iptables命令行工具配置和管理Netfilter规则,从而构建灵活、高效的网络防火墙策略。了解和掌握Netfilter框架的工作原理和使用方法,可以帮助网络管理员有效地保护和管理网络安全。