iptables
是一个强大的防火墙管理工具,广泛用于 Linux 系统中的网络流量控制和过滤。它基于 netfilter 内核模块,可以实现包过滤、地址转换、端口映射等功能。
iptables 的基本概念
表 (Table)
iptables 中的表定义了规则的处理方式。主要的表包括:
- filter:默认表,用于包过滤。
- nat:用于网络地址转换。
- mangle:用于修改包的数据包头。
- raw:用于配置数据包的期望值。
链 (Chain)
链是规则集合的地方,不同的表有不同的链。例如:
filter 表:
- INPUT:进入本机的数据包。
- FORWARD:经过本机的数据包。
- OUTPUT:从本机发出的数据包。
nat 表:
- PREROUTING:在路由之前进行处理。
- POSTROUTING:在路由之后进行处理。
- OUTPUT:从本机发出的数据包。
mangle 表:
- PREROUTING:在路由之前进行处理。
- INPUT:进入本机的数据包。
- FORWARD:经过本机的数据包。
- OUTPUT:从本机发出的数据包。
- POSTROUTING:在路由之后进行处理。
规则 (Rule)
规则定义了特定条件下如何处理数据包。每个规则都包含匹配条件和目标动作。例如:
-A INPUT -p tcp --dport 22 -j ACCEPT
这条规则表示允许所有目的端口为 22(SSH)的 TCP 数据包进入本机。
iptables 基本操作命令
查看规则
sudo iptables -L [-t table] [-n]
-L
:列出规则。-t
:指定表名。-n
:以数字形式显示 IP 地址和端口号,而不是反向 DNS 查找。
清空规则
sudo iptables -F [-t table]
-F
:清空规则。-t
:指定表名。
删除规则
sudo iptables -D chain rule-number [-t table]
-D
:删除规则。chain
:链名。rule-number
:规则编号。-t
:指定表名。
添加规则
sudo iptables -A chain -j target [-t table]
-A
:追加规则。chain
:链名。-j
:目标动作。-t
:指定表名。
插入规则
sudo iptables -I chain rule-number -j target [-t table]
-I
:插入规则。chain
:链名。rule-number
:规则编号。-j
:目标动作。-t
:指定表名。
设置默认策略
sudo iptables -P chain policy [-t table]
-P
:设置默认策略。chain
:链名。policy
:策略类型,如ACCEPT
或DROP
。-t
:指定表名。
iptables 常见使用场景
允许 SSH 访问
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
拒绝所有非 SSH 访问
sudo iptables -A INPUT ! -p tcp --dport 22 -j DROP
允许 HTTP 和 HTTPS 访问
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
限制某个 IP 地址访问
sudo iptables -A INPUT -s 192.168.1.100 -j DROP
允许内部网络访问互联网
sudo iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT sudo iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables 高级特性
使用模块扩展功能
iptables 支持多种模块扩展功能,常见的有:
- state:状态模块,用于跟踪连接状态。
- limit:限速模块,用于限制日志记录频率。
- recent:最近访问模块,用于临时限制访问。
使用 state 模块
sudo iptables -A INPUT -m state --state NEW,ESTABLISHED -j ACCEPT
使用 limit 模块
sudo iptables -A INPUT -p tcp --dport 22 -m limit --limit 5/min -j LOG --log-prefix "SSH access attempt: "
使用多端口
sudo iptables -A INPUT -p tcp -m multiport --dports 22,80,443 -j ACCEPT
使用 ipset
ipset 可以将多个 IP 地址或端口组合成一个集合,方便管理和应用规则。
sudo ipset create myblocklist hash:ip sudo ipset add myblocklist 192.168.1.100 sudo iptables -A INPUT -m set --match-set myblocklist src -j DROP
使用 conntrack
conntrack 可以追踪网络连接的状态,适用于复杂的 NAT 和负载均衡环境。
sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -m conntrack --ctstate NEW -j DNAT --to-destination 192.168.1.100:80
iptables 保存与恢复
保存规则
sudo iptables-save > /etc/iptables/rules.v4
恢复规则
sudo iptables-restore < /etc/iptables/rules.v4
自动加载规则
可以通过编辑 /etc/network/interfaces
文件来自动加载规则:
pre-up iptables-restore < /etc/iptables/rules.v4
或者使用 netfilter-persistent
工具来自动加载:
sudo apt-get install netfilter-persistent sudo netfilter-persistent save
以上便是 iptables 命令的基本使用方法和一些常见场景。通过合理配置 iptables 规则,可以有效保护服务器的安全性和稳定性。