iptables 设置黑名单,禁止内部程序访问外部某些地址
基础黑名单配置
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 插入到开头基础黑名单配置 |
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。
微信
支付宝