VPSKnow

Linux 防火墙配置实战指南

中级
30分钟

本指南将带您了解并配置 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 ssh

2. 如果您修改了 SSH 端口 (例如 2222):

sudo ufw allow 2222/tcp

3. 如果运行 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
💡 Tip: 默认配置即可有效防御 SSH 爆破。它会自动监控 /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 添加:

net.ipv4.tcp_syncookies = 1 net.ipv4.tcp_max_syn_backlog = 2048 net.ipv4.tcp_synack_retries = 2

执行 sudo sysctl -p 生效。

📝 日志审计与监控

配置了防火墙不代表万事大吉,定期查看日志能让你知道谁在攻击你。

查看 UFW 拦截记录
tail -f /var/log/ufw.log
查看 Fail2ban 封禁记录
fail2ban-client status sshd

安全实践和技巧

🛡️ 默认拒绝策略

始终采用“默认拒绝所有,按需允许少数”的策略。这是最核心的防火墙思想。

🚪 最小化开放端口

只开放您当前需要的服务端口。定期使用 ss -tuln 检查。

🔢 更改默认 SSH 端口

将 SSH 端口从 22 更改为其他端口,可显著减少自动化扫描。

🔒 限制 IP 访问

如果某些服务(如数据库)只应由特定 IP 访问,务必添加源 IP 限制。

🚀 下一步行动

防火墙已就位,您的服务器更加安全了。接下来,您可以继续系统配置或开始部署服务:

想让服务器跑得更快?

如果优化后依然卡顿,可能是服务器底子太差。不妨看看我们精选的高性能 VPS。