Iptables基础
概述
iptables 是 Linux 内核自带的包过滤防火墙,通过规则链对数据包进行过滤、转发和修改。本文档涵盖基础配置场景,包括 IP 白名单、端口管控和内网互通等常用需求。
核心概念:
- 表(Table):
filter(过滤)、nat(地址转换)、mangle(修改)、raw(原始) - 链(Chain):
INPUT(入站)、OUTPUT(出站)、FORWARD(转发) - 策略(Policy):
ACCEPT(放行)、DROP(丢弃)、REJECT(拒绝并回应)
前提说明:
- 所有命令需 root 权限(或前缀加
sudo) - 规则默认保存在内存中,重启后失效,配置完成后需执行保存命令
- 公网网卡假设为
eth0,内网网卡为eth1,请根据实际环境修改(通过ip addr查看)
场景 1:只允许指定 IP 访问服务器
需求
仅允许 192.168.1.100(内网管理机)和 203.0.113.20(外网固定 IP)访问服务器所有开放端口,拒绝其他所有 IP。
配置命令
# 1. 清空现有规则(首次配置建议执行)
iptables -F
iptables -X
# 2. 放行本地回环(必须保留)
iptables -A INPUT -i lo -j ACCEPT
# 3. 放行已建立的连接(避免 SSH 登录后被踢掉)
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 4. 允许指定 IP 访问
iptables -A INPUT -s 192.168.1.100 -j ACCEPT # 内网管理机
iptables -A INPUT -s 203.0.113.20 -j ACCEPT # 外网固定 IP
# 5. 默认拒绝所有未匹配的入站流量
iptables -P INPUT DROP参数说明
| 参数 | 说明 |
|---|---|
-F |
清空所有链规则 |
-X |
删除用户自定义链 |
-i lo |
本地回环网卡 |
-m state --state RELATED,ESTABLISHED |
匹配已建立或相关的连接 |
-s |
源 IP 地址 |
-P INPUT DROP |
默认策略设为丢弃 |
警告:配置
DROP默认策略前,务必先放行 SSH 管理 IP,否则会被踢下线无法远程恢复。
场景 2:公网仅开放 80/443,SSH 仅指定 IP 访问
需求拆解
- 公网(
eth0):仅允许 80(HTTP)和 443(HTTPS)端口访问 - SSH(22 端口):仅允许
192.168.1.100和203.0.113.20访问 - 内网(
192.168.1.0/24):所有主机互通 - 放行已建立的连接
配置命令
# 1. 清空现有规则
iptables -F
iptables -X
# 2. 放行本地回环
iptables -A INPUT -i lo -j ACCEPT
# 3. 放行已建立的连接
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 4. 内网互通:允许内网网段所有流量
iptables -A INPUT -i eth1 -s 192.168.1.0/24 -j ACCEPT
# 5. SSH(22 端口):仅允许指定 IP 访问
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.20 -j ACCEPT
# 6. 公网开放 80/443 端口
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
# 7. 默认拒绝所有未匹配的入站流量
iptables -P INPUT DROP
# 8. 放行出站流量(默认通常为 ACCEPT)
iptables -P OUTPUT ACCEPT参数说明
| 参数 | 说明 |
|---|---|
-i eth0 |
指定入站网卡(仅匹配该网卡流量) |
-i eth1 |
指定内网网卡 |
-p tcp |
匹配 TCP 协议 |
--dport |
目标端口(服务器开放的端口) |
-s |
源 IP 地址 |
场景 3:多内网网段互通
若内网有多个网段(如 192.168.1.0/24 和 192.168.2.0/24),需分别放行:
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
iptables -A INPUT -s 192.168.2.0/24 -j ACCEPT若需允许服务器主动访问内网其他主机,确保 OUTPUT 链为 ACCEPT:
iptables -P OUTPUT ACCEPT保存规则
CentOS/RHEL
# 方式一(推荐)
service iptables save
# 方式二
iptables-save > /etc/sysconfig/iptables
# 设置开机自启
systemctl enable iptables
systemctl start iptablesUbuntu/Debian
# 安装持久化工具
apt-get install -y iptables-persistent
# 保存规则
netfilter-persistent save
# 或手动保存
iptables-save > /etc/iptables/rules.v4验证与调试命令
| 操作 | 命令 |
|---|---|
| 查看 INPUT 链规则 | iptables -L INPUT -n --line-numbers |
| 查看所有规则 | iptables -L -n -v |
| 查看 NAT 表规则 | iptables -t nat -L -n |
| 测试端口连通性 | telnet <服务器IP> <端口> |
| 清空所有规则(紧急恢复) | iptables -F && iptables -X && iptables -P INPUT ACCEPT |
常见问题与注意事项
配置后 SSH 被踢
原因:未先放行 SSH 管理 IP 就设置了 DROP 默认策略。
恢复方法(需本地或带外管理):
iptables -F
iptables -P INPUT ACCEPT云服务器配置后仍无法访问
云服务器(阿里云、腾讯云等)需同时在云控制台 安全组 中开放对应端口,否则外部流量无法到达服务器。
规则重启后丢失
确认已执行保存命令(service iptables save 或 netfilter-persistent save)。
网卡名称错误
通过 ip addr 查看实际网卡名称(如 ens33、eth0),替换命令中的网卡名。
UDP 端口开放
如需开放 UDP 端口(如 DNS 53),将 -p tcp 改为 -p udp:
iptables -A INPUT -p udp --dport 53 -j ACCEPT