Iptables基础

Iptables基础

核心前提说明

  1. 以下命令均需 root 权限 执行(或前缀加 sudo)。

  2. iptables 规则默认保存在内存中,重启后失效,配置完成后需执行 “保存命令”(见文末)。

  3. 假设环境:

  • 公网网卡:eth0(可根据实际修改,如 ens33eth1

  • 内网网卡:eth1(内网网段示例:192.168.1.0/24

  • 本地回环:lo(必须放行,否则影响本地服务通信)

场景 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 访问(添加需要放行的 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

逻辑解释

  • -s:指定 “源 IP”(即访问方的 IP)。

  • DROP:默认拒绝所有未匹配的入站流量,安全性最高(需确保已放行必要 IP,否则会失联)。

  • 若需添加多个 IP,重复执行 iptables -A INPUT -s 目标IP -j ACCEPT 即可。

场景 2:公网仅开放 80/443 端口,22 端口仅指定 IP 访问,内网互通

需求拆解

  1. 公网(eth0 网卡):仅允许 80(HTTP)、443(HTTPS)端口访问,其他端口拒绝。

  2. 22 端口(SSH):仅允许 192.168.1.100(内网)和 203.0.113.20(外网管理 IP)访问。

  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. 内网互通:允许内网网段(192.168.1.0/24)所有入站流量

iptables -A INPUT -i eth1 -s 192.168.1.0/24 -j ACCEPT  # 按内网网卡限制

# 或(不限制网卡,仅按网段):iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

# 5. 22 端口(SSH):仅允许指定 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   # 外网管理 IP

# 6. 公网开放 80/443 端口(TCP 协议)

iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT   # HTTP

iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT  # HTTPS

# 7. 默认策略:拒绝所有未匹配的入站流量

iptables -P INPUT DROP

# (可选)放行出站流量(默认通常为 ACCEPT,若需限制可调整)

iptables -P OUTPUT ACCEPT

关键参数说明

参数 作用
-i eth0 指定网卡(公网网卡),仅匹配该网卡的流量
-p tcp 指定协议(TCP,80/443/22 均为 TCP 协议)
--dport 指定 “目标端口”(即服务器开放的端口)
-s 目标IP 指定 “源 IP”(仅允许该 IP 访问对应端口)
-j ACCEPT 匹配后放行流量
-m state --state RELATED,ESTABLISHED 匹配 “已建立的连接” 或 “与已建立连接相关的流量”(如服务器访问外部后,外部返回的数据)

场景 3:补充说明(内网互通的其他实现方式)

若内网有多网段(如 192.168.1.0/24192.168.2.0/24),需放行所有内网网段:

# 放行 192.168.1.0/24 网段

iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

# 放行 192.168.2.0/24 网段

iptables -A INPUT -s 192.168.2.0/24 -j ACCEPT

若需允许服务器主动访问内网其他主机(出站流量),确保 OUTPUT 链策略为 ACCEPT(默认通常如此):

iptables -P OUTPUT ACCEPT

重要操作:保存 iptables 规则(避免重启失效)

CentOS/RHEL 系统

# 保存规则到配置文件

service iptables save

# 或

iptables-save > /etc/sysconfig/iptables

# 设置开机自启(确保规则加载)

systemctl enable iptables

systemctl start iptables

Ubuntu/Debian 系统

默认无内置保存工具,需安装 iptables-persistent

# 安装工具

apt-get install -y iptables-persistent

# 保存规则(保存后重启自动加载)

netfilter-persistent save

# 或手动保存到文件

iptables-save > /etc/iptables/rules.v4

验证与调试命令

# 查看当前 iptables 规则(INPUT 链)

iptables -L INPUT -n --line-numbers

# 测试端口是否可访问(从外部主机执行)

telnet 服务器IP 80    # 测试 80 端口

telnet 服务器IP 22    # 测试 22 端口(仅指定 IP 可通)

# 清空所有规则(出错时紧急恢复)

iptables -F

iptables -X

iptables -P INPUT ACCEPT  # 临时放行所有入站,避免失联

注意事项

  1. 先放行关键 IP / 端口:配置 DROP 默认策略前,务必先放行 SSH 管理 IP(如 192.168.1.100),否则会被踢下线,无法远程恢复。

  2. 网卡名称确认:通过 ip addr 命令查看实际网卡名称(如 ens33eth0),避免配置错误。

  3. 协议匹配:80/443/22 均为 TCP 协议,需指定 -p tcp;若需开放 UDP 端口(如 53 DNS),需改为 -p udp

  4. 云服务器安全组:若为云服务器(阿里云、腾讯云等),需同时在云厂商的 “安全组” 中开放对应端口,否则 iptables 配置生效但外部仍无法访问。