Iptables基础

Iptables基础

概述

iptables 是 Linux 内核自带的包过滤防火墙,通过规则链对数据包进行过滤、转发和修改。本文档涵盖基础配置场景,包括 IP 白名单、端口管控和内网互通等常用需求。

核心概念

  • 表(Table)filter(过滤)、nat(地址转换)、mangle(修改)、raw(原始)
  • 链(Chain)INPUT(入站)、OUTPUT(出站)、FORWARD(转发)
  • 策略(Policy)ACCEPT(放行)、DROP(丢弃)、REJECT(拒绝并回应)

前提说明

  1. 所有命令需 root 权限(或前缀加 sudo
  2. 规则默认保存在内存中,重启后失效,配置完成后需执行保存命令
  3. 公网网卡假设为 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 访问

需求拆解

  1. 公网(eth0):仅允许 80(HTTP)和 443(HTTPS)端口访问
  2. SSH(22 端口):仅允许 192.168.1.100203.0.113.20 访问
  3. 内网(192.168.1.0/24):所有主机互通
  4. 放行已建立的连接

配置命令

# 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/24192.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 iptables

Ubuntu/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 savenetfilter-persistent save)。

网卡名称错误

通过 ip addr 查看实际网卡名称(如 ens33eth0),替换命令中的网卡名。

UDP 端口开放

如需开放 UDP 端口(如 DNS 53),将 -p tcp 改为 -p udp

iptables -A INPUT -p udp --dport 53 -j ACCEPT

参考链接