Skip to content

🔥 防火墙配置:iptables & ufw ​

防火墙是服务器的第一道门禁。没有防火墙的服务器就像没有锁的门——谁来都能推一把。

防火墙是什么 ​

简单说:防火墙根据你定的规则,决定哪些数据包放行、哪些丢掉。

Linux 上的防火墙工作在内核层面,通过 Netfilter 框架实现。我们操作它的工具有两种:

工具定位适合
iptables底层命令,直接操作 Netfilter需要精细控制的场景
ufwiptables 的友好封装日常快速配置

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.v4

ufw 则简单得多——sudo ufw enable 后自动开机启动,规则自动保存。

🧪 练习题 ​

  1. 用 iptables 实现:只允许来自内网 192.168.1.0/24 的 MySQL 连接(端口 3306)
  2. 用 ufw 只开放 HTTP 和 SSH,其他全部拒绝
  3. 思考:为什么 ESTABLISHED,RELATED 规则必须放在最前面?

下一步,锁定最常见的攻击入口——SSH 安全加固。



🎯 本章要点 ​

  • DROP 像黑洞,对方收不到任何回复会一直重试。
  • -A INPUT 追加到 INPUT 链,-p tcp 指定协议
  • ufw(Uncomplicated Firewall)底层还是调用 iptables
加载练习题中...