iptables
是 Linux 操作系统中用于管理网络流量的工具。它通过配置一系列规则,来决定数据包的处理方式,如允许、拒绝、记录或转发网络数据包。iptables
在防火墙、安全和网络地址转换(NAT)方面发挥着重要作用。
iptables
的基本结构
iptables [选项] [链] [条件] -j [动作]
- 选项:影响命令执行方式,如使用哪张表,列出当前规则等。
- 链(Chain):指定规则应用于哪个数据包处理链,如
INPUT
(输入流量)、OUTPUT
(输出流量)或FORWARD
(转发流量)。 - 条件:指定规则适用的网络流量条件,如 IP 地址、端口号、协议等。
- 动作(Action):定义规则匹配时要执行的动作,如
ACCEPT
(允许)、DROP
(拒绝)、LOG
(记录日志)等。
iptables
的表格和链
表格 | 作用 |
---|---|
filter | 默认表,负责管理允许或拒绝数据包。 |
nat | 负责网络地址转换 (NAT),如端口转发、源地址转换 (SNAT)、目的地址转换 (DNAT)。 |
mangle | 修改数据包内容或修改服务质量 (QoS) 字段。 |
raw | 配置是否对数据包进行连接追踪。 |
常见链(Chains)
链 | 描述 |
---|---|
INPUT | 用于处理进入本地系统的数据包。 |
OUTPUT | 用于处理从本地系统发出的数据包。 |
FORWARD | 用于处理需要在系统间转发的数据包。 |
PREROUTING | 数据包进入路由前处理,通常用于目标地址转换 (DNAT)。 |
POSTROUTING | 数据包离开路由后处理,通常用于源地址转换 (SNAT)。 |
常用参数及作用
参数 | 作用 | 示例 |
---|---|---|
-t [表] | 指定使用的表(如 filter , nat 等)。 | iptables -t nat -A PREROUTING ... |
-A [链] | 在指定链的末尾添加规则。 | iptables -A INPUT ... |
-I [链] [编号] | 在指定链的指定位置插入规则。 | iptables -I INPUT 1 ... |
-D [链] [规则] | 删除指定链的某条规则,规则可通过行号或具体规则来确定。 | iptables -D INPUT 1 |
-L [链] | 列出指定链中的规则,如果不指定链,则列出所有链的规则。 | iptables -L |
-F [链] | 清空指定链中的所有规则,如果不指定链,则清空所有链的规则。 | iptables -F INPUT |
-s [地址] | 指定源 IP 地址,可以是具体 IP、网络段(CIDR)或主机名。 | iptables -A INPUT -s 192.168.1.1 ... |
-d [地址] | 指定目标 IP 地址,可以是具体 IP、网络段或主机名。 | iptables -A OUTPUT -d 192.168.1.100 ... |
-p [协议] | 指定协议(如 tcp ,udp ,icmp )。 | iptables -A INPUT -p tcp ... |
--dport [端口] | 指定目标端口(仅适用于 tcp 或 udp 协议)。 | iptables -A INPUT -p tcp --dport 80 |
--sport [端口] | 指定源端口(仅适用于 tcp 或 udp 协议)。 | iptables -A INPUT -p tcp --sport 22 |
-j [动作] | 指定匹配规则后执行的动作,如 ACCEPT (允许)、DROP (丢弃)、LOG (记录日志)。 | iptables -A INPUT -j ACCEPT |
-m state --state [状态] | 基于连接状态匹配数据包(如 NEW , ESTABLISHED , RELATED 等)。 | iptables -A INPUT -m state --state NEW |
-n | 禁止解析主机名和服务名称,直接显示 IP 和端口号,以提高显示速度。 | iptables -L -n |
--limit | 限制匹配规则的频率,防止大量日志记录或流量。 | iptables -A INPUT -p icmp --limit 5/m |
-v | 详细模式,显示更多信息,如接口名称、流量统计等。 | iptables -L -v |
--log-prefix "[信息]" | 在日志中添加自定义前缀,用于标识记录的数据包。 | iptables -A INPUT -j LOG --log-prefix "SSH attempt: " |
iptables
的常见用法示例
1. 允许 SSH 访问(端口 22)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
允许来自任何 IP 的 SSH 连接。
2. 拒绝所有外部访问除 HTTP (80) 和 HTTPS (443)
iptables -P INPUT DROP iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT
设置默认策略为拒绝所有外部流量,但允许 HTTP 和 HTTPS 连接。
3. 防止 IP 段 192.168.1.0/24
的访问
iptables -A INPUT -s 192.168.1.0/24 -j DROP
拒绝来自网络段 192.168.1.0/24
的所有流量。
4. 配置网络地址转换 (NAT)
将流量从端口 8080 转发到本地机器的端口 80:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80
5. 限制 ICMP ping 请求频率
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
限制 ping 请求的频率为每秒一次。
6. 记录访问失败的 SSH 尝试
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH attempt: "
在日志中记录所有尝试访问端口 22 的数据包。
总结
iptables
是一个强大的工具,通过定义一系列规则,它可以控制系统接收、转发或发出的数据包。你可以使用 iptables
配置防火墙、实现 NAT、限制网络流量或记录网络活动。理解其表格、链和参数的作用,可以帮助你更好地管理和保护 Linux 系统的网络安全。