iptables 是 Linux 系统中常用的防火墙工具,基于 netfilter 框架工作,通过配置规则对网络数据包进行过滤、转发或修改。以下是 iptables 的核心配置知识和常见操作:
一、基本概念
-
表(Table):iptables 通过不同的表管理规则,常用表包括:
filter:默认表,用于数据包过滤(最常用)nat:用于网络地址转换(如端口转发)mangle:用于修改数据包标记(较少用)
-
链(Chain):表中包含预设的规则链,按数据包流向分类:
INPUT:处理进入本机的数据包OUTPUT:处理本机发出的数据包FORWARD:处理经过本机转发的数据包
二、查看规则
所有 iptables 操作需 root 权限(加
sudo):# 查看filter表的所有规则(默认表)
sudo iptables -L
# 查看详细规则(包含端口、协议、统计等)
sudo iptables -L -v
# 查看指定表(如nat表)的规则
sudo iptables -t nat -L
# 查看规则时显示端口号(而非服务名)
sudo iptables -L -n
三、规则基本操作
1. 添加规则
语法:
iptables [-t 表名] -A/-I 链名 匹配条件 -j 动作-A:在链的末尾添加规则-I:在链的开头插入规则(可指定位置,如-I INPUT 1插入到第 1 位)- 动作:
ACCEPT(允许通过)、DROP(直接丢弃,不回应)、REJECT(拒绝并回应)
2. 常见匹配条件
-p 协议:指定协议(tcp/udp/icmp,如-p tcp)--dport 端口:目标端口(如--dport 22)--sport 端口:源端口(较少用)-s IP:源 IP 地址(如-s 192.168.1.100)-d IP:目标 IP 地址-i 网卡:入站网卡(如-i eth0)-o 网卡:出站网卡
3. 示例:添加常用规则
# 允许本机回环接口(lo)的所有通信(必需,否则本地服务可能异常)
sudo iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接和相关连接(避免阻断SSH等已连接的会话)
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 允许SSH连接(22端口)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许HTTP(80)和HTTPS(443)连接
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 拒绝来自192.168.1.200的所有连接
sudo iptables -A INPUT -s 192.168.1.200 -j DROP
# 设置INPUT链默认策略为DROP(未匹配规则的数据包全部拒绝)
sudo iptables -P INPUT DROP
四、删除与清空规则
# 删除指定规则(需知道规则所在链和序号,先通过iptables -L --line-numbers查看序号)
sudo iptables -D INPUT 3 # 删除INPUT链中第3条规则
# 清空指定链的规则(如INPUT链)
sudo iptables -F INPUT
# 清空所有链的规则
sudo iptables -F
# 重置规则计数器(数据包统计清零)
sudo iptables -Z
五、保存规则(防止重启丢失)
iptables 规则默认保存在内存中,重启后会失效,需手动保存:
-
Debian/Ubuntu 系统:
# 安装持久化工具 sudo apt-get install iptables-persistent # 保存规则(会保存到/etc/iptables/rules.v4) sudo netfilter-persistent save -
CentOS/RHEL 系统:
# 保存规则到/etc/sysconfig/iptables sudo service iptables save -
通用方法:
# 导出规则到文件 sudo iptables-save > /etc/iptables.rules # 重启后导入规则 sudo iptables-restore < /etc/iptables.rules
六、高级应用:端口转发(nat 表)
需开启内核转发(临时生效):
sudo echo 1 > /proc/sys/net/ipv4/ip_forward
示例:将本机 80 端口转发到 192.168.1.100 的 8080 端口
# 在nat表的PREROUTING链添加转发规则
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080
# 允许转发的数据包通过(filter表FORWARD链)
sudo iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 8080 -j ACCEPT
注意事项
- 规则匹配顺序:按规则在链中的顺序匹配,第一条匹配的规则生效,建议将重要规则(如允许 SSH)放在前面。
- 配置时建议保持一个 SSH 会话连接,防止误操作导致无法连接服务器。
- 对规则不熟悉时,可先将默认策略设为
ACCEPT,测试无误后再改为DROP。
通过上述操作,可实现对 Linux 系统的网络访问控制,根据实际需求灵活配置规则即可。