这篇文章其实是笔者讨论wireguard那篇文章扩展出来的内容,因为其配置的一些比较核心的内容,涉及到了iptables的使用和配置,深入研究后发现内容有点多,也有很多有趣而且值得分析的地方,所以专门撰文记录。
概述
在Linux系统中,我们常用iptables来进行防火墙的配置和管理,所以很自然的认为iptables是Linux系统内置的防火墙软件,其实这个理解其实稍有偏差。严格的说,iptables并不是防火墙软件或者模块,而是一个在Linux系统中用于配置和管理网络包过滤规则的命令行工具。它允许您定义各种规则,以控制网络流量的传入和传出。iptables可以指示在不同的网络层(如网络层、传输层和应用层)进行流量的过滤,并允许执行各种操作,例如允许、拒绝、重定向、修改和日志记录数据包。
iptables操作的目标是Netfilter框架,Netfilter是Linux内核中的一个网络包过滤子系统,用于在数据包通过网络栈时进行处理,它才是真正对数据进行处理的程序。iptables命令提供了一种用户空间工具,用于与Netfilter交互,配置和管理过滤规则。
使用iptables,可以执行的任务其实不限于配置防火墙:
- 配置防火墙规则:设置规则以允许或阻止特定IP地址、端口、协议或网络流量
- 实现网络地址转换(NAT):将内部网络的IP地址转换为外部接口的IP地址,实现局域网和互联网之间的通信
- 限制连接和连接状态:控制特定IP地址或端口的连接数,以及处理连接状态如新建、已建立和相关连接
- 日志记录和统计:记录网络流量和事件,并生成日志文件以进行分析和监控
iptables具有强大的功能和灵活的配置选项,但同时也需要一定的理解和学习。它是Linux系统中常用的网络安全工具之一,广泛用于服务器和网络设备的防火墙配置。
一些核心概念
要理解和更好的使用iptables,需要先理解和明确一些核心概念。
- 表 Table
iptables使用表来存储规则。常见的表包括:
filter: 默认表,用于过滤数据包
nat : 用于网络地址转换
mangle :用于数据包修改
raw :用于原始数据包处理
- 链Chain
iptables使用链来组织和处理规则。常见的链包括:
INPUT :处理进入系统的数据包
OUTPUT :处理离开系统的数据包
FORWARD : 处理通过系统进行转发的数据包
POSTROUTING: 路由处理之前,常用于NAT
- 规则Rule
iptables的主要操作单位是规则,一般情况下,一条iptables命令,其实就是在定义一个规则。规则定义了要匹配的条件和对匹配数据包要执行的操作。规则由多个匹配条件和一个动作(action)组成。
- 匹配 Match
iptables使用匹配条件来检查数据包是否满足规则。匹配条件可以基于数据包的源IP地址、目标IP地址、协议、端口等属性。
- 动作 Action
iptables中的动作指定当数据包与规则匹配时要执行的操作。常见的动作包括:
ACCEPT :接受数据包
DROP :丢弃数据包
REJECT :拒绝数据包并发送拒绝消息
LOG :记录日志
- 规则操作
在一条iptables指令中,对于一条规则的操作,主要包括:
Append: A, 在链中追加规则
Insert,I, 在链的特定的位置插入规则
Delete: D, 删除某个链规则
这里作为使用者的理解,其实已经对iptables的完整结构内容进行了大幅度,这里有一张流程图,相对完整的描述了iptables包过滤处理的流程(非笔者绘制),可以给我们更好的理解和概念。
常见参数
有了这些核心概念,我们就可以很好的理解一些经常在iptables命令和语句中出现的常见参数(一般使用-指定参数前缀):
- t: 指定要操作的表,如nat,如果没有指定,则默认为过滤器filter
- A: Append, 追加规则到链中
- I: Insert, 在指定的链中,插入参数,可能需要指定插入的位置,如1表示第一个规则
- D: Delete, 在链中删除规则
- p: 指定要匹配的协议,如tcp、udp、icmp等等
- d: 指定目标地址或端口
- s: Source,源地址或网络,通常使用子网
- o: Object,目标接口,通常使用网络接口名称
- j: jump, 指定要执行的操作,或者跳转到目标链
- L: 列表链中的规则
实例分析
我们以下面这几条iptables命令来具体分析和说明:
iptables -A INPUT -p tcp –dport 80 -j ACCEPT
这个命令,通常用于打开http标准端口80,它的意思是,向INPUT链中,追加一个协议为tcp,目标端口为80的匹配规则,匹配后接受。
iptables -t nat -I POSTROUTING 1 -s 192.168.10.9/24 -o ens18 -j MASQUERADE
这个命令可以用于实现NAT,它在POSTROUTING链中的第一个位置,插入一条规则,源来自192子网,目标是ens18接口,类型是nat,MASQUREADE是伪操作,NAT专用。
持久化
iptables设置命令是立即生效的,但这个设置只存在于程序内存当中。如果需要在重启后能能够使用,则需要对其设置进行持久化,就是将设置规则保存在文件中,并且在重启时加载。 但遗憾的是,iptables没有提供类似于服务的自动化方式,需要手动进行操作和设置。
可以使用iptables-save 保存规则信息(可以考虑在关机脚本中使用):
iptables-save > /etc/sysconfig/iptables
从文件中加载防火墙规则,可以将这个命令放在启动脚本中实现启动加载:
iptables-restore < /etc/sysconfig/iptables
有些发行版本也支持自动化的规则加载,如某些版本的debian支持:
iptables-save > /etc/iptables/rules.v4
ufw和firewalld
在一些Linux发行版中,我们发现它们更推荐使用ufw或者firewalld来管理防火墙。在了解了iptables的定位和原理之后,笔者觉得,它们其实也是类似的管理工具,而非防火墙核心程序
iptables功能非常强大,但随之而来对于普通用户配置和使用就有点复杂了,针对这种情况,ufw和firewalld提供了易用性和不同的配置管理逻辑,来简化规则的管理和配置,以适合不同层次和需求的用户使用。比如firewalld就可以使用服务的方式,并且加入区域的概念进行管理等等,管理更加灵活和方便。
所以,关于这两个软件,有需要的读者可以自行研究,这里就不再深入讨论了。