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

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。