主题
🔥 防火墙配置:iptables & ufw
防火墙是服务器的第一道门禁。没有防火墙的服务器就像没有锁的门——谁来都能推一把。
防火墙是什么
简单说:防火墙根据你定的规则,决定哪些数据包放行、哪些丢掉。
Linux 上的防火墙工作在内核层面,通过 Netfilter 框架实现。我们操作它的工具有两种:
| 工具 | 定位 | 适合 |
|---|---|---|
| iptables | 底层命令,直接操作 Netfilter | 需要精细控制的场景 |
| ufw | iptables 的友好封装 | 日常快速配置 |
iptables 核心概念
iptables 用 表(table)→ 链(chain)→ 规则(rule) 三层结构管理流量。
三条核心链
| 链 | 触发时机 |
|---|---|
| INPUT | 目标是本机的数据包 |
| OUTPUT | 从本机发出的数据包 |
| FORWARD | 经过本机转发的数据包(路由器场景) |
大多数服务器场景,我们只和 INPUT 打交道。
规则基本语法
bash
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# │ │ │ │ └─ 动作:放行
# │ │ │ └─ 目标端口 80
# │ │ └─ 协议:tcp
# │ └─ 添加到 INPUT 链
# └─ 追加规则(A = Append)三个核心动作(-j 参数):
ACCEPT— 放行DROP— 悄悄丢掉(不给回复)REJECT— 拒绝并回复(告诉对方被拒绝了)
DROP vs REJECT
DROP 让扫描器以为端口没开,隐蔽性好。REJECT 更友好,对方马上知道被拒了。对外端口建议用 DROP,内网服务可用 REJECT。
iptables 实战
场景一:只开放 22/80/443,其余全拒
bash
# 1. 先允许已建立的连接继续通信(关键!)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 2. 放行本地回环
iptables -A INPUT -i lo -j ACCEPT
# 3. 开放必要端口
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. 最后兜底:其余全部拒绝
iptables -P INPUT DROP注意顺序
先 ACCEPT 再 DROP,而且务必在规则里保留 SSH 端口(22),否则你自己也连不上了!
场景二:禁止 ping(ICMP)
bash
iptables -A INPUT -p icmp --icmp-type echo-request -j DROP执行后,外界 ping 不到你,但你自己可以 ping 出去(OUTPUT 链没限制)。
场景三:限制 SSH 连接频率
bash
# 每分钟最多 3 个新 SSH 连接,超出则拒绝
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --update --seconds 60 --hitcount 4 --name SSH \
-j DROP实用指令速查
bash
iptables -L -n -v # 查看所有规则(带详细信息)
iptables -L -n --line-numbers # 带行号查看
iptables -D INPUT 3 # 删除 INPUT 链的第 3 条规则
iptables -F # 清空所有规则(危险!)
iptables-save > /etc/iptables/rules.v4 # 保存规则
iptables-restore < /etc/iptables/rules.v4 # 恢复规则ufw:不折腾的命令行防火墙
ufw(Uncomplicated Firewall)把复杂的 iptables 语法封装成了大白话。
bash
# 安装(一般已内置)
sudo apt install ufw
# 默认策略:拒绝所有入站,允许所有出站
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 开放端口
sudo ufw allow 22/tcp # SSH
sudo ufw allow 80/tcp # HTTP
sudo ufw allow 443/tcp # HTTPS
# 也可以按服务名开放
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
# 查看状态(带规则列表)
sudo ufw status verbose
# 开启/关闭/重置
sudo ufw enable
sudo ufw disable
sudo ufw reset注意
启用 ufw 前,确保已经 allow 了 SSH 端口,否则远程连接会被切断。
保存规则与开机自启
iptables 规则重启后会消失,必须手动持久化:
bash
# 安装持久化工具
sudo apt install iptables-persistent
# 保存当前规则
sudo netfilter-persistent save
# 保存并立即应用
sudo iptables-save | sudo tee /etc/iptables/rules.v4ufw 则简单得多——sudo ufw enable 后自动开机启动,规则自动保存。
🧪 练习题
- 用 iptables 实现:只允许来自内网
192.168.1.0/24的 MySQL 连接(端口 3306) - 用 ufw 只开放 HTTP 和 SSH,其他全部拒绝
- 思考:为什么
ESTABLISHED,RELATED规则必须放在最前面?
下一步,锁定最常见的攻击入口——SSH 安全加固。
🎯 本章要点
- DROP 像黑洞,对方收不到任何回复会一直重试。
- -A INPUT 追加到 INPUT 链,-p tcp 指定协议
- ufw(Uncomplicated Firewall)底层还是调用 iptables
加载练习题中...