Appearance
iptables 说明
Warning:如果你使用的是 最新的 RHEL 8+ 或 Ubuntu 18.04+,建议使用
nftables代替iptables,因为iptables已逐步被nftables取代。
1. 常用参数说明
| 命令 | 简写 | 说明 |
|---|---|---|
--append | -A chain | 在链末尾添加规则 |
--insert | -I chain [rulenum] | 在链的指定位置插入规则(默认 1 表示第一个) |
--check | -C chain | 检查规则是否存在 |
--delete | -D chain | 从链中删除匹配的规则 |
--delete | -D chain rulenum | 从链中删除指定编号的规则(1 表示第一个) |
--flush | -F [chain] | 删除链中的所有规则或所有链 |
--replace | -R chain rulenum | 替换链中的规则(1 表示第一个) |
--policy | -P chain target | 更改链的默认策略 |
--list | -L [chain [rulenum]] | 列出链中的规则或所有链 |
--list-rules | -S [chain [rulenum]] | 打印链中的规则或所有链 |
--zero | -Z [chain [rulenum]] | 将指定链(或所有链)中的计数器置零 |
--new | -N chain | 创建一个新的用户定义链 |
--delete-chain | -X [chain] | 删除用户定义链 |
--rename-chain | -E old-chain new-chain | 更改链名称(自动更新相关引用) |
| 选项 | 简写 | 说明 |
|---|---|---|
--verbose | -v | 详细模式 |
--numeric | -n | 地址和端口的数字输出 |
--line-numbers | 列出时打印行号 | |
--table | -t table | 要操作的表(默认:`filter') |
--in-interface | -i input name[+] | 网络接口名称(+ 表示通配符) |
--out-interface | -o output name[+] | 网络接口名称(+ 表示通配符) |
--source | -s address[/mask][...] | 源地址 |
--destination | -d address[/mask][...] | 目标地址 |
--protocol | -p proto | 协议:按编号或名称,例如 `tcp' |
--ipv4 | -4 | 无效(ip6tables-restore 忽略该行) |
--ipv6 | -6 | 错误(iptables-restore 忽略该行) |
--jump | -j target | 指定动作(ACCEPT/DROP/REJECT ...) |
--goto | -g chain | 跳转到链而不返回 |
--match | -m match | 扩展匹配(可能加载扩展) |
--wait | -w [seconds] | 获取 xtables 锁之前放弃的最大等待时间 |
--exact | -x | 扩展数字(显示精确值) |
--fragment | -f | 仅匹配第二个或更多的片段 |
--version | -V | 打印软件包版本。 |
2. 查看规则
Bash
# 查看所有规则
iptables -L
# 查看带有行号的规则列表
iptables -L --line-numbers
# 查看 NAT 表的规则
iptables -t nat -L3. 添加规则
Bash
# 允许来自特定 IP 的所有连接
iptables -A INPUT -s 192.168.1.100 -j ACCEPT
# 允许特定端口的连接(例如 SSH)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT4. 删除规则
Bash
# 删除 INPUT 链中的第一条规则
iptables -D INPUT 1
# 清空特定链的所有规则
iptables -F INPUT
# 清空所有规则
iptables -F5. 修改默认策略
Bash
# 设置 INPUT 链默认策略为拒绝
iptables -P INPUT DROP
# 设置 OUTPUT 链默认策略为允许
iptables -P OUTPUT ACCEPT6. 保存和恢复规则
6.1. Debian 系
保存 iptables 规则
Bashsudo iptables-save > /etc/iptables/rules.v4 sudo ip6tables-save > /etc/iptables/rules.v6恢复 iptables 规则
Bashsudo iptables-restore < /etc/iptables/rules.v4 sudo ip6tables-restore < /etc/iptables/rules.v6使规则在系统重启后自动生效
Debian 系的
iptables不会自动加载规则,因此需要在系统启动时恢复:Bashsudo apt-get install netfilter-persistent # 依赖 iptables-persistent安装过程中会提示是否保存当前规则,选择 Yes。安装后,规则会自动保存到:
/etc/iptables/rules.v4/etc/iptables/rules.v6
以后要手动保存更新的规则:
Bashsudo netfilter-persistent save
6.2. RHEL 系
保存 iptables 规则
Bashsudo iptables-save > /etc/sysconfig/iptables sudo ip6tables-save > /etc/sysconfig/ip6tables恢复 iptables 规则
Bashsudo iptables-restore < /etc/sysconfig/iptables sudo ip6tables-restore < /etc/sysconfig/ip6tables使规则在系统重启后自动生效
RHEL 系使用
iptables-services来管理iptables规则:确保
iptables-services已安装:Bashsudo yum install iptables-services -y # RHEL 7/CentOS 7或:
Bashsudo dnf install iptables-services -y # RHEL 8+/Fedora设置
iptables为开机启动:Bashsudo systemctl enable iptables sudo systemctl enable ip6tables启动
iptables规则:Bashsudo systemctl start iptables sudo systemctl start ip6tables
6.3. 小结
| 操作 | Debian 系 | RHEL 系 |
|---|---|---|
| 保存规则 | iptables-save > /etc/iptables/rules.v4 | iptables-save > /etc/sysconfig/iptables |
| 恢复规则 | iptables-restore < /etc/iptables/rules.v4 | iptables-restore < /etc/sysconfig/iptables |
| 自动加载 | netfilter-persistent | iptables-services |
7. 例子
举个实际的例子,如果你要配置一个基本的防火墙规则集,可能会这样写:
Bash
# 1. 清空现有规则
iptables -F
# 2. 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 3. 允许本地回环接口
iptables -A INPUT -i lo -j ACCEPT
# 4. 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 5. 允许 SSH 连接(22 端口)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 6. 允许 HTTP 和 HTTPS(80 和 443 端口)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT8. 重置配置
Bash
iptables -F && \
iptables -X && \
iptables -Z && \
iptables -A INPUT -i lo -j ACCEPT && \
iptables -A INPUT -p tcp --dport 22 -j ACCEPT && \
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT && \
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT && \
iptables -P INPUT DROP && \
iptables -P FORWARD DROP && \
iptables -P OUTPUT ACCEPT && \
iptables -t nat -F && \
iptables -t nat -X && \
iptables -t nat -Z && \
iptables-save > /etc/iptables/rules.v4