帮助中心

服务器、网络和账户的分步教程。

Linux 服务器

Linux 防火墙设置教程:VPS 使用 UFW 与 firewalld(含 IPv6)

Linux 防火墙设置教程:VPS 使用 UFW 与 firewalld(含 IPv6)

新安装的 Linux 服务器,任何服务打开的端口都会直接对外响应,因此主机防火墙是最先要设置的项目之一。本文说明如何在 Debian / Ubuntu 用 UFW 设置 Linux 防火墙,以及在 CentOS、Rocky Linux、AlmaLinux 使用 firewalld:先放行 SSH、开放网站端口、把敏感服务限制为特定来源 IP、同时保护 IPv6,以及不小心把自己锁在外面时如何恢复访问。JUSTG 位于东京、首尔、莫斯科的云服务器都免费提供 IPv6,所以 IPv6 规则和 IPv4 一样重要。

步骤 1:检查已打开的端口与 SSH 端口

写规则之前,先确认实际有哪些服务在监听,以及 SSH 使用哪个端口。如果您已把 SSH 改到自定义端口,以下所有 SSH 规则都要改用该端口,而不是 22。

# Which ports are services actually listening on?
ss -tulpn
# Which port does SSH use?
sshd -T | grep -i '^port' 

步骤 2:启用防火墙前先准备安全网

一条错误的规则就可能切断 SSH 连接。在后台设置一个计时器,时间到就自动关闭防火墙,等于替自己留一条退路。从新的终端确认仍可登录后,再取消计时器。

# Safety net: turn the firewall off again in 10 minutes unless you cancel it
nohup sh -c 'sleep 600; ufw disable' >/dev/null 2>&1 &             # UFW
nohup sh -c 'sleep 600; systemctl stop firewalld' >/dev/null 2>&1 & # firewalld

# Everything works? Cancel the timer:
pkill -f 'sleep 600' 

步骤 3:在 Debian / Ubuntu 设置 UFW 防火墙

UFW(Uncomplicated Firewall)是内核防火墙的简易前端。先把默认策略设为拒绝所有入站流量,接着优先放行 SSH,最后才启用防火墙。ufw limit 会允许 SSH,但若同一地址短时间内连接过多次,就暂时封锁。

apt update && apt install -y ufw

# Make sure IPv6 rules are managed too
grep '^IPV6' /etc/default/ufw          # should print IPV6=yes

ufw default deny incoming
ufw default allow outgoing

# SSH FIRST (use your real SSH port if you changed it)
ufw limit 22/tcp                       # allow + basic brute-force rate limit
# Web server
ufw allow 80,443/tcp

ufw enable                             # answer "y"
ufw status verbose

步骤 4:用 UFW 限制来源 IP(IPv4 与 IPv6)

数据库、管理后台与监控代理程序绝不应对整个互联网开放,只允许已知地址连接即可。UFW 依顺序比对规则,因此拒绝规则必须插入在范围较大的允许规则之前。

# Allow MySQL only from one office IPv4 and one IPv6 network
ufw allow from 198.51.100.25 to any port 3306 proto tcp
ufw allow from 2001:db8:10::/64 to any port 3306 proto tcp

# Block an abusive network (insert at the top so it is matched first)
ufw insert 1 deny from 203.0.113.0/24

# List rules with numbers and delete one
ufw status numbered
ufw delete 4

步骤 5:在 CentOS / Rocky Linux / AlmaLinux 设置 firewalld

firewalld 以“区域(zone)”工作,网络接口通常属于 public 区域,默认已允许 SSH。加上 --permanent 的规则重启后仍会保留,但必须运行 --reload 才会生效。

dnf install -y firewalld              # CentOS 7: yum install -y firewalld
systemctl enable --now firewalld

firewall-cmd --get-default-zone        # usually "public"
# SSH FIRST (or: --add-port=2222/tcp for a custom port)
firewall-cmd --permanent --add-service=ssh
# Web server
firewall-cmd --permanent --add-service=http --add-service=https
# Close what you do not use
firewall-cmd --permanent --remove-service=cockpit

firewall-cmd --reload
firewall-cmd --list-all
若 SSH 使用自定义端口,请先用 --add-port 加入该端口,再移除 ssh 服务。在 Rocky 与 AlmaLinux 上,该端口也必须在 SELinux 中允许。

步骤 6:用 firewalld Rich Rule 限制来源 IP

Rich rule 可以在一行中同时指定来源地址、端口与动作。每条规则只适用一种地址族,所以 IPv4 与 IPv6 要各写一条。

# Allow MySQL from one IPv4 address and one IPv6 network only
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="198.51.100.25" port port="3306" protocol="tcp" accept'
firewall-cmd --permanent --add-rich-rule='rule family="ipv6" source address="2001:db8:10::/64" port port="3306" protocol="tcp" accept'

# Drop all traffic from an abusive network
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.0/24" drop'

firewall-cmd --reload
firewall-cmd --list-rich-rules

步骤 7:确认 IPv6 也有被防火墙过滤

常见错误是 IPv4 规则写得很完整,同样的服务却在 IPv6 上完全敞开。UFW 只有在 IPV6=yes 时才管理 IPv6(ufw status 会出现“(v6)”规则);firewalld 的区域与服务则自动涵盖两种地址。请从另一台机器测试:

# Your server's IPv6 address
ip -6 addr show scope global

# From ANOTHER machine: test a port over IPv4 and IPv6
nc -vz 203.0.113.50 443
nc -vz 2001:db8:50::10 443
nc -vz 2001:db8:50::10 3306      # should fail from a non-allowed address

步骤 8:注意 Docker 对外发布的端口

Docker 会自行写入 iptables 规则,因此用 -p 8080:80 发布的端口,即使 UFW 或 firewalld 应该挡下,仍可能被外部访问。建议把容器发布在 127.0.0.1,前面再加反向代理,或自行管理 DOCKER-USER 链。

# Publish a container port on localhost only, then proxy it with Nginx
docker run -d -p 127.0.0.1:8080:80 nginx

步骤 9:被防火墙锁住时如何恢复访问

修改后 SSH 没有响应时,可先等待步骤 2 的计时器。否则请打开 VNC 控制台:登录 JUSTG 客户中心 → My Services(我的服务)→ 打开该 VPS(Product Details 页面)→ 在“Server Information”标签页的 VPS 面板中点击“VNC”。同一个 VNC 控制台也可在 Enduser Panel 中打开(Manage 卡片 → Virtualizor → “Enduser Panel”)。如找不到控制台可提交工单。以 root 登录后重新放行 SSH:

# Debian / Ubuntu (UFW)
ufw allow 22/tcp          # or: ufw disable
# CentOS / Rocky / AlmaLinux (firewalld)
firewall-cmd --panic-off 2>/dev/null
firewall-cmd --add-service=ssh   # runtime only; add --permanent once fixed
# last resort
systemctl stop firewalld

常见问题

UFW 和 firewalld 可以同时使用吗?

不建议。两者管理同一组内核规则表,会互相冲突。Debian/Ubuntu 用 UFW,CentOS/Rocky/AlmaLinux 用 firewalld,另一个若有安装请停用。

为什么重启后 firewalld 规则不见了?

因为添加时没有加 --permanent,只修改了运行中的设置。可运行 firewall-cmd --runtime-to-permanent 把目前规则存成永久设置。

可以封锁正在攻击服务器的 IP 吗?

可以:UFW 用 ufw insert 1 deny from 203.0.113.66,firewalld 则用带 drop 的 rich rule。若是大流量攻击,主机防火墙无法单独处理,请联系技术支持。

如设置 Linux 防火墙时仍遇到问题,请至 https://www.justg.com/submitticket.php 提交工单,JUSTG 技术支持团队会协助您处理。

这篇文章有帮助吗?
帮助中心
Linux 服务器 Linux SSH 密钥登录教程:设置 ed25519 密钥并禁用密码登录 只要服务器有公网 IPv4,上线几分钟内就会遇到 SSH 暴力破解机器人,而密码登录正是它们的首要目标。本文说明如何用较新的 ed25519 密钥完成 Linux SSH 密钥登录,再禁用 SSH 密码登录,全程避免把自己锁在门外。步骤适用于 Debian… Linux 服务器 Linux VPS 修改 SSH 端口与 root 密码教程(安全不断线) 把 SSH 从 22 端口移走虽然挡不住有心的攻击者,却能让日志里大部分自动扫描消失;而任何新服务器的第一件事,就是换一组新的 root 密码。本文说明如何在 Linux VPS 修改 SSH 端口与 root 密码且不断线:修改 sshd_config、在 Rocky… Linux 服务器 Linux VPS 添加 Swap 交换空间教程(适合 512MB / 1GB 小内存套餐) 在 512 MB 或 1 GB 的云服务器上,数据库、PHP-FPM 加上一次软件包更新,很容易在同一时间用光内存。这时内核的 OOM killer 会强制终止进程,最常被牺牲的就是 MySQL 或 MariaDB。在 Linux VPS 添加 Swap… Linux 服务器 Linux 硬盘空间已满怎么办?VPS 找出并释放磁盘空间教程 “No space left on device”几乎会让服务器上所有东西出问题:数据库无法写入、网站返回错误、软件包更新失败,有时甚至无法正常登录。本文一步步说明如何排除 Linux 硬盘空间已满:先确认是数据块还是 inode 用完,再用 du 与 ncdu… Linux 服务器 VPS 安装 aaPanel 教程:aaPanel(宝塔国际版)安装与安全设置 aaPanel 是宝塔面板的国际版,通过网页界面即可管理网站、数据库、PHP 版本、SSL 证书与备份。本文说明如何在 JUSTG VPS 安装 aaPanel(东京、首尔、莫斯科的云服务器或 JUSTG 独立服务器,系统支持…
AlipayUnionPayVISAMastercardPayPalUSDTstripe