Iptabels及其应用
介绍
iptables 是 Linux 系统中用于配置网络流量控制的工具,通过操纵 Linux 内核的 Netfilter 框架实现数据包过滤和网络地址转换(NAT)。它允许管理员定义规则来管理数据包的流入、流出和转发,从而实现防火墙和路由功能。
核心概念
表是规则的逻辑分组,主要分为以下几种类型:
filter 表用于处理数据包的过滤操作,这是默认表。
nat 表用于网络地址转换,如端口映射和源地址转换。
mangle 表用于修改数据包的标志位或头部信息。
raw 表用于跳过连接跟踪,通常用于高级数据包处理。
链是一组有序的规则集合,常见的链包括:
INPUT 链处理进入本地系统的数据包。
OUTPUT 链处理从本地系统发出的数据包。
FORWARD 链处理从一个网络接口转发到另一个的流量。
PREROUTING 链在路由决策之前处理入站流量。
POSTROUTING 链在路由决策之后处理出站流量。
规则是用户定义的数据包匹配条件,每条规则由匹配条件和目标动作组成。匹配条件可以包括 IP 地址、协议类型、端口号等,而目标动作决定如何处理匹配的数据包。
目标是匹配规则后采取的操作,包括 ACCEPT(接受数据包)、DROP(丢弃数据包)、REJECT(拒绝数据包并发送响应)、LOG(记录数据包信息)以及 NAT 中的 SNAT 和 DNAT(修改源或目标地址)。
工作流程
数据包进入系统时,Netfilter 框架捕获数据包并根据数据包的类型决定其流向。入站数据包首先被送入 PREROUTING 链,然后根据路由决定是否转发到 FORWARD 链或进入本地系统并送入 INPUT 链。出站数据包从 OUTPUT 链开始,最终进入 POSTROUTING 链。每个链中的规则按顺序检查,匹配规则后执行相应的目标动作,如果没有匹配规则,则执行链的默认策略。
示例
允许 80 端口的 TCP 流量进入本地系统,可以使用命令
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
禁止来自特定 IP 地址的数据包,例如禁止 IP 为 192.168.1.100 的流量
iptables -A INPUT -s 192.168.1.100 -j DROP
将入站流量的目标端口 8080 重定向到 80
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
优缺点
优点在于功能强大,可以实现细粒度的数据包控制,同时与 Linux 内核深度集成,性能优越。缺点是配置复杂,新手难以上手;规则匹配按顺序执行,在规则多的情况下可能影响性能;此外,规则集的维护也可能在复杂场景中变得困难。
nftables
iptables 是经典的防火墙工具,但随着网络环境的复杂性增加,nftables 被引入作为其替代方案。nftables 提供了更灵活的规则配置和更高的性能,同时保持对 iptables 的兼容性。尽管 nftables 正逐渐普及,但 iptables 仍然是许多生产环境的首选工具。
使用案例:修改博客端口
不需要装nginx就能实现这个功能。
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8090
sudo iptables-save
使得服务器上的80端口可以转发到8090端口。