iptables 高级防火墙规则教程
iptables 是 Linux 内核中 Netfilter 框架的用户空间管理工具,几乎所有 Linux 发行版都预装了它。掌握 iptables 的高级用法可以帮助你在搬瓦工 VPS 上构建强大而灵活的防火墙策略,实现精细的流量控制、端口转发、DDoS 防护等功能。本文将深入讲解 iptables 的高级规则配置。
一、iptables 架构回顾
iptables 包含四张表和五条链:
- filter 表:默认表,用于数据包过滤(INPUT、FORWARD、OUTPUT)。
- nat 表:网络地址转换(PREROUTING、POSTROUTING、OUTPUT)。
- mangle 表:修改数据包头部信息。
- raw 表:决定数据包是否被连接追踪处理。
二、基础安全规则集
以下是一套适合搬瓦工 VPS 的基础防火墙规则:
# 清空现有规则
iptables -F
iptables -X
iptables -Z
# 设置默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许环回接口
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# 允许 SSH
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许 ICMP(ping)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
三、SSH 暴力破解防护
# 限制 SSH 新连接速率:每分钟最多 5 次
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 5 --name SSH -j DROP
也可以使用 hashlimit 模块实现更精确的限速:
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
-m hashlimit --hashlimit-above 3/min --hashlimit-burst 5 \
--hashlimit-mode srcip --hashlimit-name ssh_limit -j DROP
四、端口转发(DNAT)
将外部端口的流量转发到内部地址:
# 开启 IP 转发
echo 1 > /proc/sys/net/ipv4/ip_forward
# 将 VPS 的 8080 端口转发到内网 192.168.1.10 的 80 端口
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A POSTROUTING -d 192.168.1.10 -p tcp --dport 80 -j MASQUERADE
iptables -A FORWARD -p tcp -d 192.168.1.10 --dport 80 -j ACCEPT
五、SNAT 与 MASQUERADE
# MASQUERADE(动态 IP 环境)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# SNAT(固定 IP 环境,性能更好)
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 你的VPS公网IP
六、速率限制与 DDoS 防护
# 限制每个 IP 的并发连接数
iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 50 -j DROP
# 限制 SYN 包速率(防 SYN Flood)
iptables -A INPUT -p tcp --syn -m limit --limit 30/s --limit-burst 50 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP
# 防止无效数据包
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# 限制 ICMP 速率
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 4 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
七、基于时间的规则
# 仅在工作时间允许特定端口访问
iptables -A INPUT -p tcp --dport 8080 -m time \
--timestart 08:00 --timestop 18:00 --weekdays Mon,Tue,Wed,Thu,Fri -j ACCEPT
# 周末禁止某些服务
iptables -A INPUT -p tcp --dport 8080 -m time --weekdays Sat,Sun -j DROP
八、字符串匹配
# 拦截包含特定字符串的数据包
iptables -A INPUT -p tcp --dport 80 -m string --string "malicious" --algo bm -j DROP
# 阻止特定 User-Agent
iptables -A INPUT -p tcp --dport 80 -m string --string "BadBot" --algo kmp -j DROP
九、日志记录
# 记录被丢弃的数据包
iptables -N LOGGING
iptables -A INPUT -j LOGGING
iptables -A LOGGING -m limit --limit 5/min -j LOG --log-prefix "iptables-dropped: " --log-level 4
iptables -A LOGGING -j DROP
日志可在 /var/log/kern.log 或 /var/log/messages 中查看。
十、规则持久化
# Debian/Ubuntu
apt install iptables-persistent -y
netfilter-persistent save
netfilter-persistent reload
# CentOS
service iptables save
# 或
iptables-save > /etc/iptables.rules
十一、常用管理命令
# 查看所有规则(带行号)
iptables -L -n -v --line-numbers
# 查看 NAT 表规则
iptables -t nat -L -n -v
# 删除指定行号的规则
iptables -D INPUT 3
# 插入规则到指定位置
iptables -I INPUT 2 -p tcp --dport 8080 -j ACCEPT
# 清空所有规则
iptables -F
十二、常见问题
规则顺序问题
iptables 规则是按顺序匹配的,一旦匹配则不再继续。请确保更具体的规则放在前面,通用规则放在后面。
锁定自己
修改 SSH 相关规则前,建议先通过搬瓦工 KiwiVM 后台的 Shell 功能作为备用访问通道,避免错误的规则导致无法登录。
总结
iptables 是 Linux 网络安全的核心工具,掌握其高级用法可以构建强大的防火墙保护。如果你使用较新的 Linux 内核,建议了解其后继者 nftables,它在语法和性能上都有显著改进。购买搬瓦工 VPS 请查看 全部方案,使用优惠码 NODESEEK2026 可享 6.77% 折扣,购买链接:bwh81.net。