防火墙配置教程
本指南将带您了解并配置Linux中最常用的两种防火墙工具:UFW和iptables。通过学习本教程,您可以为您的VPS建立坚实的第一道安全防线,保护服务器免受未授权的访问和常见网络攻击。
防火墙基础
主机防火墙是运行在单个服务器上的软件,用于控制进出该服务器的网络流量。它是服务器安全策略的核心组成部分。
为什么需要防火墙?
互联网是一个充满威胁的环境。您的VPS会持续不断地受到来自世界各地的自动扫描和恶意攻击。防火墙的作用就像一个忠诚的门卫,它根据您设定的一系列规则,决定哪些网络流量可以进入或离开您的服务器。
阻止未授权访问
只开放必要的服务端口,阻止对其他所有端口的访问尝试。
防止端口扫描
使您的服务器在网络扫描中“隐身”,减少成为攻击目标的几率。
限制恶意软件
如果服务器不幸被感染,防火墙可以阻止恶意软件向外连接或传播。
UFW vs. iptables
在Linux世界中,netfilter
是内核级别的防火墙框架。iptables
和UFW
都是用户与之交互的工具:
- 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的日志功能,可以帮助您分析可疑的连接尝试和排查网络问题。