防火墙配置教程

🎓 难度:中级 ⏱️ 阅读时间:25分钟 👥 适合人群:系统管理员、开发者

本指南将带您了解并配置Linux中最常用的两种防火墙工具:UFW和iptables。通过学习本教程,您可以为您的VPS建立坚实的第一道安全防线,保护服务器免受未授权的访问和常见网络攻击。

🛡️ 防火墙基础

主机防火墙是运行在单个服务器上的软件,用于控制进出该服务器的网络流量。它是服务器安全策略的核心组成部分。

为什么需要防火墙?

互联网是一个充满威胁的环境。您的VPS会持续不断地受到来自世界各地的自动扫描和恶意攻击。防火墙的作用就像一个忠诚的门卫,它根据您设定的一系列规则,决定哪些网络流量可以进入或离开您的服务器。

🚫

阻止未授权访问

只开放必要的服务端口,阻止对其他所有端口的访问尝试。

🎯

防止端口扫描

使您的服务器在网络扫描中“隐身”,减少成为攻击目标的几率。

🐛

限制恶意软件

如果服务器不幸被感染,防火墙可以阻止恶意软件向外连接或传播。

UFW vs. iptables

在Linux世界中,netfilter是内核级别的防火墙框架。iptablesUFW都是用户与之交互的工具:

  • iptables: 一个功能极其强大和灵活的工具,可以直接操作内核的netfilter规则。它的语法复杂,学习曲线陡峭,但提供了无与伦比的控制力。
  • UFW (Uncomplicated Firewall): 意为“简单的防火墙”,是Debian和Ubuntu发行版中默认的防火墙管理工具。它提供了一个非常友好的命令行界面,将复杂的iptables操作简化为易于理解的命令。对于大多数用户来说,UFW是最佳选择。

我们的建议是:从UFW开始。它能满足95%以上的常见需求。只有当您需要实现非常复杂的网络策略时,才需要深入研究iptables。

🔥 UFW简易防火墙

UFW的设计初衷就是简单易用。下面我们来看如何快速配置它。

第一步:安装和检查状态

UFW通常在Ubuntu上预装。如果您的系统没有,可以手动安装。

安装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

这组命令拒绝所有进入服务器的连接,但允许服务器主动向外发起连接(例如,用于系统更新或API请求)。

第三步:允许必要连接

警告:在启用防火墙之前,请务必先允许SSH连接,否则您将立即被锁定在服务器之外!

允许SSH连接 (端口22):

sudo ufw allow ssh

如果您修改了SSH端口(例如,改为2222),请使用新端口:

sudo ufw allow 2222/tcp

如果您正在运行Web服务器,还需要允许HTTP和HTTPS:

sudo ufw allow http sudo ufw allow https

第四步:启用UFW

在确认已允许SSH之后,可以安全地启用防火墙了。

sudo ufw enable

系统会提示操作可能会中断现有连接,输入`y`并回车确认。

现在,再次检查状态:

sudo ufw status verbose

您应该能看到防火墙已激活,并且列出了您添加的规则。

常用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连接(基于/etc/services)
sudo ufw allow 22/tcp 同上,按端口号允许
sudo ufw allow http 允许HTTP连接(端口80)
sudo ufw allow 8080/tcp 允许TCP协议的8080端口
sudo ufw allow from 192.168.1.100 允许特定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

当UFW无法满足需求时,就需要直接使用iptables。iptables通过“表(tables)”和“链(chains)”来组织规则。

核心概念

  • 表 (Tables): 最常用的表是 `filter` 表,它负责过滤数据包。其他表如 `nat` (网络地址转换) 和 `mangle` (修改数据包) 用于更高级的场景。
  • 链 (Chains): 每个表包含多个链。`filter` 表中最关键的三个链是:
    • INPUT: 处理发往服务器本身的数据包。
    • OUTPUT: 处理从服务器本身发出的数据包。
    • FORWARD: 处理经过服务器转发到其他地方的数据包(例如,当服务器作为路由器时)。
  • 规则 (Rules): 规则是链中的条目,定义了如何处理匹配的数据包(例如 `ACCEPT` 接受, `DROP` 丢弃, `REJECT` 拒绝并返回错误)。

基础iptables配置示例

以下是一组基础的iptables规则,可以实现与我们上面UFW配置类似的安全策略。

# 清空现有规则
iptables -F
iptables -X
iptables -Z

# 设置默认策略:拒绝所有入站和转发,允许所有出站
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# 允许已经建立的连接和相关的数据包通过
iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

# 允许本地回环接口的所有流量(重要!)
iptables -A INPUT -i lo -j ACCEPT

# 允许SSH、HTTP、HTTPS入站
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

# (可选)允许ICMP(ping请求)
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT

保存规则

iptables规则在系统重启后会丢失。要使规则持久化,需要安装 iptables-persistent

安装 (Debian/Ubuntu):

sudo apt-get install iptables-persistent

安装过程中会询问是否保存当前的IPv4和IPv6规则,选择“是”。

手动保存规则:

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(1.2.3.4)的包
iptables -P INPUT DROP 设置INPUT链的默认策略为丢弃
iptables -D INPUT 3 删除INPUT链中的第3条规则
iptables -F 清空所有规则
sudo apt-get install iptables-persistent 安装规则持久化工具(Debian/Ubuntu)
sudo netfilter-persistent save 保存当前规则

🚪 通用端口管理

有效管理端口是防火墙配置的关键。原则是:最小化开放端口

常见服务端口

了解常见服务的默认端口有助于您制定正确的规则。

端口 服务 描述
21 FTP 文件传输协议(不安全,建议使用SFTP)
22 SSH / SFTP 安全远程登录和文件传输
25 SMTP 简单邮件传输协议(用于发送邮件)
53 DNS 域名系统服务
80 HTTP 超文本传输协议(Web服务)
110 POP3 邮局协议版本3(用于接收邮件)
143 IMAP 互联网消息访问协议(用于接收邮件)
443 HTTPS 安全超文本传输协议(加密的Web服务)
3306 MySQL MySQL数据库服务
5432 PostgreSQL PostgreSQL数据库服务
6379 Redis Redis内存数据库服务

检查开放端口

在配置完防火墙后,您应该检查哪些端口仍在监听连接。这可以帮助您发现潜在的安全风险。

使用 `ss` 命令 (推荐):

sudo ss -tuln

使用 `netstat` 命令 (旧版工具):

sudo netstat -tuln

参数解释: -t (TCP), -u (UDP), -l (监听状态), -n (数字格式显示端口)。

🌊 DDoS基础防护

分布式拒绝服务(DDoS)攻击是一种常见的网络攻击。虽然主机防火墙无法抵御大规模的DDoS攻击(这通常需要专业的硬件或云服务),但我们可以使用iptables来缓解小规模的攻击。

使用iptables进行速率限制

我们可以限制来自单个IP地址的连接速率,以防止暴力破解或小规模的连接耗尽攻击。

示例:缓解HTTP和SSH攻击

# 限制单个IP地址的并发连接数
iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j DROP

# 限制新连接的速率
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

第一条规则:使用 connlimit 模块,如果来自单个IP的到80端口的并发连接数超过20个,就丢弃新的连接。

第二、三条规则:使用 recent 模块,如果60秒内对SSH端口(22)的新连接尝试超过4次,就暂时阻止该IP的连接。

SYN Flood防护

SYN Flood是DDoS的一种。可以通过调整内核参数来增强防护。

编辑 /etc/sysctl.conf 文件,添加或修改以下行:

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

然后执行 `sudo sysctl -p` 使其生效。

重要提示:这些只是基础措施。专业的DDoS防护是一个复杂的领域,通常需要依赖于您的托管服务提供商或Cloudflare等CDN服务。

安全实践和技巧

🛡️ 默认拒绝策略

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

🚪 最小化开放端口

只开放您当前需要的服务端口。定期使用`ss -tuln`检查,关闭不再使用的端口。

🔢 更改默认SSH端口

将SSH端口从22更改为其他高位端口(如2222),可以显著减少自动化的暴力破解尝试。

🔒 限制IP访问

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

📝 定期审计规则

每隔几个月,回顾一下您的防火墙规则,确保它们仍然符合您的安全需求。

📃 使用日志

开启UFW或iptables的日志功能,可以帮助您分析可疑的连接尝试和排查网络问题。

防火墙已就位!接下来...

恭喜您完成了VPS安全的第一道防线。为了进一步加固您的服务器,可以继续学习: