基础黑名单配置

1. 禁止访问特定 IP 地址

# 禁止访问单个 IP(例如 192.0.2.1)
iptables -A OUTPUT -d 192.0.2.1 -j DROP

# 禁止访问 IP 段(例如 192.0.2.0/24)
iptables -A OUTPUT -d 192.0.2.0/24 -j DROP

# 禁止访问多个特定 IP
iptables -A OUTPUT -d 198.51.100.1 -j DROP
iptables -A OUTPUT -d 198.51.100.2 -j DROP

2. 禁止访问特定端口 + IP 组合

# 禁止访问特定 IP 的特定端口(如禁止访问 1.2.3.4 的 443 端口)
iptables -A OUTPUT -d 1.2.3.4 -p tcp --dport 443 -j DROP

# 禁止访问外部所有 25 端口(防止邮件外发)
iptables -A OUTPUT -p tcp --dport 25 -j DROP

3. 按用户/程序限制(高级)

# 禁止特定 UID 的程序访问外部(如 UID 1000 的用户)
iptables -A OUTPUT -m owner --uid-owner 1000 -d 203.0.113.0/24 -j DROP

# 禁止特定 GID 的程序访问外部
iptables -A OUTPUT -m owner --gid-owner 1000 -d 192.0.2.1 -j DROP

实用配置脚本

#!/bin/bash

# 清空现有 OUTPUT 规则(谨慎使用)
# iptables -F OUTPUT

echo "=== 配置 iptables 黑名单 ==="

# 定义黑名单 IP 数组
BLACKLIST_IPS=(
    "192.0.2.1"           # 示例恶意 IP 1
    "198.51.100.0/24"     # 示例恶意 IP 段
    "203.0.113.5"         # 示例恶意 IP 2
    "8.8.8.8"             # 示例:禁止访问 Google DNS
)

# 添加到 OUTPUT 链(禁止本机主动访问)
for ip in "${BLACKLIST_IPS[@]}"; do
    # 先检查是否已存在
    if ! iptables -C OUTPUT -d "$ip" -j DROP 2>/dev/null; then
        iptables -A OUTPUT -d "$ip" -j DROP
        echo "✓ 已禁止访问: $ip"
    else
        echo "⚠ 已存在规则: $ip"
    fi
done

# 可选:记录被拦截的访问(用于审计)
iptables -A OUTPUT -d 192.0.2.1 -j LOG --log-prefix "BLACKLIST_DROP: " --log-level 4

echo "=== 当前 OUTPUT 规则 ==="
iptables -L OUTPUT -n --line-numbers

查看和管理规则

# 查看所有 OUTPUT 规则
iptables -L OUTPUT -n -v

# 查看带行号的规则(方便删除)
iptables -L OUTPUT -n --line-numbers

# 删除指定行号的规则(例如删除第 3 条)
iptables -D OUTPUT 3

# 清空所有 OUTPUT 规则
iptables -F OUTPUT

# 保存规则(CentOS/RHEL)
service iptables save

# 保存规则(Ubuntu/Debian)
iptables-save > /etc/iptables/rules.v4

持久化配置(重启后生效)

Ubuntu/Debian:

apt-get install iptables-persistent
iptables-save > /etc/iptables/rules.v4

CentOS/RHEL:

iptables-save > /etc/sysconfig/iptables
systemctl enable iptables

注意事项

注意点 说明
OUTPUT vs INPUT OUTPUT 控制本机主动发出的流量,INPUT 控制进入本机的流量
DNS 解析 如果禁止的是域名,确保在 DNS 解析前拦截(基于 IP)
程序缓存 部分程序会缓存 DNS 结果,可能需要重启程序
规则顺序 iptables 按顺序匹配,-A 追加到末尾,-I 插入到开头基础黑名单配置