本指南将带您了解并配置 Linux 中最常用的两种防火墙工具:UFW 和 iptables。通过学习本教程,您可以为您的 VPS 建立坚实的第一道安全防线,保护服务器免受未授权的访问和常见网络攻击。
🛡️ 防火墙基础
主机防火墙是运行在单个服务器上的软件,用于控制进出该服务器的网络流量。它是服务器安全策略的核心组成部分。
为什么需要防火墙?
互联网是一个充满威胁的环境。您的 VPS 会持续不断地受到来自世界各地的自动扫描和恶意攻击。防火墙的作用就像一个忠诚的门卫,它根据您设定的一系列规则,决定哪些网络流量可以进入或离开您的服务器。
阻止未授权访问
只开放必要的服务端口,阻止对其他所有端口的访问尝试。
防止端口扫描
使您的服务器在网络扫描中“隐身”,减少成为攻击目标的几率。
限制恶意软件
如果服务器不幸被感染,防火墙可以阻止恶意软件向外连接或传播。
UFW vs. iptables
- iptables 功能极其强大,直接操作内核 netfilter。语法复杂,学习曲线陡峭,但提供无与伦比的控制力。
- UFW 意为“简单的防火墙”,是 Debian/Ubuntu 默认工具。它提供友好的命令行界面,适合 95% 的用户。
我们的建议是:从 UFW 开始。只有当您需要实现非常复杂的网络策略时,才需要深入研究 iptables。
🔥 UFW 简易防火墙
UFW 的设计初衷就是简单易用。下面我们来看如何快速配置它。
第一步:安装和检查状态
安装 UFW (如果需要):
sudo apt update && sudo apt install ufw 检查 UFW 状态:
sudo ufw status 默认情况下,UFW 是禁用的,您会看到 Status: inactive。
第二步:设置默认策略
一个安全的防火墙策略是“默认全部拒绝,按需逐一允许”。
sudo ufw default deny incoming sudo ufw default allow outgoing 第三步:允许必要连接
⚠️ 警告:防止被锁
在启用防火墙之前,请务必先允许 SSH 连接,否则您将立即被锁定在服务器之外!
1. 允许 SSH 连接 (默认端口 22):
sudo ufw allow ssh2. 如果您修改了 SSH 端口 (例如 2222):
sudo ufw allow 2222/tcp3. 如果运行 Web 服务器 (HTTP/HTTPS):
sudo ufw allow http && sudo ufw allow https第四步:启用 UFW
在确认已允许 SSH 之后,可以安全地启用防火墙了。
sudo ufw enable 系统会提示操作可能会中断现有连接,输入 y 并回车确认。
常用 UFW 命令备忘
| 命令 | 描述 |
|---|---|
| sudo ufw status | 查看 UFW 状态 |
| sudo ufw enable | 启用 UFW |
| sudo ufw disable | 禁用 UFW |
| sudo ufw default deny incoming | 设置默认入站策略为拒绝 |
| sudo ufw default allow outgoing | 设置默认出站策略为允许 |
| sudo ufw allow ssh | 允许 SSH 连接(基于服务名) |
| sudo ufw allow 22/tcp | 同上,按端口号允许 |
| sudo ufw allow http | 允许 HTTP 连接(端口 80) |
| sudo ufw allow 8080/tcp | 允许 TCP 协议的 8080 端口 |
| sudo ufw allow from 1.2.3.4 | 允许特定 IP 的所有连接 |
| sudo ufw allow from 192.168.1.0/24 to any port 3306 | 允许特定子网访问 MySQL |
| sudo ufw deny 12345/tcp | 拒绝 TCP 协议的 12345 端口 |
| sudo ufw status numbered | 显示带编号的规则列表 |
| sudo ufw delete 1 | 删除编号为 1 的规则 |
| sudo ufw reset | 重置所有规则到初始状态 |
🔗 高级防火墙 iptables
基础 iptables 配置示例
以下是一组基础的 iptables 规则,可以实现与我们上面 UFW 配置类似的安全策略。
# 1. 允许本地回环 (重要!)
iptables -A INPUT -i lo -j ACCEPT
# 2. 允许已建立的连接
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# 3. 允许 SSH (22) 和 Web (80/443)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 4. 允许 Ping (可选)
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# 5. 设置默认策略:拒绝其他所有入站
iptables -P INPUT DROP 保存规则 (持久化)
安装工具 (Debian/Ubuntu):
sudo apt install iptables-persistent -y 保存当前规则:
sudo netfilter-persistent save 常用 iptables 命令备忘
| 命令 | 描述 |
|---|---|
| iptables -L -v -n | 查看所有链的规则(详细、数字格式) |
| iptables -A INPUT -p tcp --dport 22 -j ACCEPT | 允许 TCP SSH 端口(22)入站 |
| iptables -A INPUT -p tcp --dport 80 -j ACCEPT | 允许 HTTP(80)入站 |
| iptables -A INPUT -s 1.2.3.4 -j DROP | 丢弃来自特定 IP 的包 |
| iptables -P INPUT DROP | 设置 INPUT 链默认策略为丢弃 |
| iptables -D INPUT 3 | 删除 INPUT 链中的第 3 条规则 |
| iptables -F | 清空所有规则 |
| apt-get install iptables-persistent | 安装规则持久化工具 |
| netfilter-persistent save | 保存当前规则 |
🌍 进阶:ipset 封锁特定国家
如果您发现大量攻击来自特定国家(如俄罗斯、伊朗等),可以使用 ipset 批量封禁该国所有 IP 段,效率远高于逐个封禁。
1. 安装 ipset
apt install ipset -y 2. 创建黑名单并导入 IP 段
# 创建名为 blocklist 的集合
ipset create blocklist hash:net
# 下载国家 IP 列表 (以俄罗斯 RU 为例)
wget -O ru.zone http://www.ipdeny.com/ipblocks/data/countries/ru.zone
# 批量导入
for i in $(cat ru.zone); do ipset add blocklist $i; done 3. 关联 iptables
iptables -I INPUT -m set --match-set blocklist src -j DROP 👮 进阶:Fail2ban 自动防御
即使改了端口,服务器仍会被不停扫描。Fail2ban 可以监控日志,自动封禁多次尝试失败的恶意 IP。
# 1. 安装 Fail2ban
apt install fail2ban -y
# 2. 复制配置文件 (避免更新覆盖)
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
# 3. 启动服务
systemctl enable fail2ban
systemctl start fail2ban /var/log/auth.log,并在 IP 失败 5 次后将其封禁 10 分钟。
🚪 通用端口管理
有效管理端口是防火墙配置的关键。原则是:最小化开放端口。
常见服务端口速查
| 端口 | 服务 | 描述 |
|---|---|---|
| 21 | FTP | 文件传输协议(不安全,建议用 SFTP) |
| 22 | SSH | 安全远程登录和文件传输 |
| 25 | SMTP | 邮件发送协议 |
| 53 | DNS | 域名解析服务 |
| 80 | HTTP | Web 服务(未加密) |
| 443 | HTTPS | Web 服务(加密) |
| 3306 | MySQL | MySQL 数据库 |
| 6379 | Redis | Redis 缓存数据库 |
检查开放端口
配置完防火墙后,务必检查哪些端口仍在监听,以发现潜在风险。
sudo ss -tuln 参数解释: -t (TCP), -u (UDP), -l (监听状态), -n (数字格式)。
🌊 DDoS 基础防护
虽然主机防火墙无法抵御大规模 DDoS,但我们可以使用 iptables 缓解小规模的连接耗尽攻击。
使用 iptables 进行速率限制
我们可以限制来自单个 IP 地址的连接速率,以防止暴力破解。
# 限制单个 IP 地址的并发连接数
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j DROP
# 限制新连接的速率 (防止 SSH 爆破)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 4 -j DROP 这段脚本会限制 80 端口的并发连接数,并防止 SSH 端口被暴力破解。
SYN Flood 防护
编辑 /etc/sysctl.conf 添加:
执行 sudo sysctl -p 生效。
📝 日志审计与监控
配置了防火墙不代表万事大吉,定期查看日志能让你知道谁在攻击你。
查看 UFW 拦截记录
tail -f /var/log/ufw.log 查看 Fail2ban 封禁记录
fail2ban-client status sshd ✨ 安全实践和技巧
🛡️ 默认拒绝策略
始终采用“默认拒绝所有,按需允许少数”的策略。这是最核心的防火墙思想。
🚪 最小化开放端口
只开放您当前需要的服务端口。定期使用 ss -tuln 检查。
🔢 更改默认 SSH 端口
将 SSH 端口从 22 更改为其他端口,可显著减少自动化扫描。
🔒 限制 IP 访问
如果某些服务(如数据库)只应由特定 IP 访问,务必添加源 IP 限制。
🚀 下一步行动
防火墙已就位,您的服务器更加安全了。接下来,您可以继续系统配置或开始部署服务:
SSH 安全进阶
学习如何配置密钥登录、禁用密码验证,进一步加固 SSH。
自动化运维脚本
使用 Shell 脚本自动化日常任务,提高管理效率。
VPS 推荐榜单
查看经过实测验证的优质 VPS 商家推荐,找到最适合您的方案。
浏览更多教程
探索服务器安全、网站搭建、性能优化等进阶主题。