Linux 防火墙 Systemctl 常用命令速查
这篇博客主要记录我日常使用 Linux 防火墙(通常指 firewalld
)时,用 systemctl
管理服务的常用命令,以及一些端口操作和 Java 开发相关的命令,方便自己快速查阅。
为什么使用 Systemctl 管理防火墙?
systemctl
是 Linux 中用于管理系统服务的主要工具。我们通常使用它来启动、停止、重启、查看服务状态等等。对于防火墙服务,例如 firewalld
,也是如此。使用 systemctl
可以更统一、更方便地管理系统服务,包括防火墙。
常用 Systemctl 命令
以下是一些我常用的 systemctl
命令,用于管理 firewalld
防火墙服务:
1. 启动防火墙
bash
sudo systemctl start firewalld
- 说明: 这条命令会启动 firewalld 服务,使其开始生效。
2. 停止防火墙
arduino
sudo systemctl stop firewalld
- 说明: 这条命令会停止 firewalld 服务,此时防火墙规则将不再生效。请谨慎使用,在必要情况下才停止防火墙。
3. 重启防火墙
markdown
sudo systemctl restart firewalld
- 说明: 这条命令会先停止 firewalld 服务,然后重新启动它。通常用于在修改防火墙配置后使其生效。
4. 查看防火墙状态
lua
sudo systemctl status firewalld
- 说明: 这条命令会显示 firewalld 服务的当前状态,包括是否正在运行,以及任何相关的错误信息。这是检查防火墙是否正常运行的常用命令。
5. 设置防火墙开机自启
bash
sudo systemctl enable firewalld
- 说明: 这条命令会将 firewalld 服务设置为开机自启动,即每次系统启动时都会自动启动防火墙。
6. 取消防火墙开机自启
bash
sudo systemctl disable firewalld
- 说明: 这条命令会取消 firewalld 服务的开机自启动。
7. 查看防火墙是否开机自启
csharp
systemctl is-enabled firewalld
- 说明: 这条命令会检查 firewalld 服务是否设置为开机自启,输出结果可能是 enabled 或 disabled。
端口操作 (firewall-cmd)
以下命令使用 firewall-cmd 来操作端口,这些命令和 Java 开发密切相关:
1. 开放指定端口
css
sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
sudo firewall-cmd --zone=public --add-port=8080/udp --permanent
- --zone=public: 见文末
- 说明: 开放 8080 端口的 TCP 和 UDP 流量,--permanent 参数表示永久生效。
- Java 应用常用端口: 8080 通常是 Tomcat 或其他 Java Web 应用的默认端口。
css
sudo firewall-cmd --zone=public --add-port=22/tcp --permanent
- 说明: 开放ssh 服务端口22。
css
sudo firewall-cmd --zone=public --add-port=3306/tcp --permanent
- 说明: 开放 mysql 默认端口3306。
2. 查看已开放端口
css
sudo firewall-cmd --zone=public --list-ports
- 说明: 列出 public 区域已开放的所有端口。
3. 删除已开放端口
css
sudo firewall-cmd --zone=public --remove-port=8080/tcp --permanent
- 说明: 删除 public 区域中开放的 8080/tcp 端口。
4. 使配置生效
css
sudo firewall-cmd --reload
- 说明: 在修改防火墙规则后,使用该命令使更改立即生效。
5. 查看指定端口是否开放
css
sudo firewall-cmd --zone=public --query-port=8080/tcp
- 说明: 查询8080端口的tcp服务是否开放。
6. 批量开放端口
css
sudo firewall-cmd --zone=public --add-port={8080-8085}/tcp --permanent
sudo firewall-cmd --zone=public --add-port={8080-8085}/udp --permanent
- 说明: 批量开放 8080 到 8085 端口的 TCP 和 UDP 流量。使用大括号 {} 和短横线 - 来表示一个端口范围。
7. 批量删除端口
css
sudo firewall-cmd --zone=public --remove-port={8080-8085}/tcp --permanent
- 说明: 批量删除 8080 到 8085 端口的 TCP 流量。
8. 批量开放多个不连续端口
css
sudo firewall-cmd --zone=public --add-port={8080,8085,9000}/tcp --permanent
- 说明: 批量开放 8080、8085 和 9000 端口的 TCP 流量。使用大括号 {} 和逗号 , 来表示多个不连续端口。
9. 批量删除多个不连续端口
css
sudo firewall-cmd --zone=public --remove-port={8080,8085,9000}/tcp --permanent
- 说明: 批量删除 8080、8085 和 9000 端口的 TCP 流量。
Java 相关端口补充
- 8080, 8009: Tomcat 默认 HTTP 和 AJP 端口。
- 80: HTTP 默认端口
- 443: HTTPS 默认端口
- 22: SSH 默认端口
- 3306: MySQL 默认端口
- 6379: Redis 默认端口
- 5432: PostgreSQL 默认端口
- 1099, 9999: JMX 端口
- 其他根据实际情况开放的端口
其他一些有用的命令 (可选)
-
查看所有已安装的服务 (包括防火墙):
inisystemctl list-units --type=service
-
查看所有正在运行的服务:
csssystemctl list-units --type=service --state=running
注意事项
- 请务必使用 sudo 执行上述命令,因为管理系统服务需要管理员权限。
- 在修改防火墙配置后,通常需要重启防火墙服务以使更改生效 (sudo systemctl restart firewalld) 或者使用 sudo firewall-cmd --reload。
- 对于 firewalld 防火墙本身的配置,还需要使用 firewall-cmd 等工具。本文主要关注使用 systemctl 管理 firewalld 服务本身,以及使用 firewall-cmd 配置端口。
- --permanent 参数非常重要,不加此参数配置重启后会失效。
- 批量操作端口时,注意端口范围和端口列表的格式。
说明 --zone=public
-
默认区域:
- firewalld 有多个区域(zone)的概念,比如 public、trusted、dmz 等。每个区域都有不同的默认规则和信任级别。
- 当你使用 firewall-cmd 命令时,如果没有明确指定 --zone 参数,firewalld 会使用默认区域 (default zone) 的配置。
- 默认区域通常是 public,但可以通过 firewall-cmd --get-default-zone 命令查看当前系统的默认区域。也可以通过 firewall-cmd --set-default-zone= 命令修改默认区域。
- 因此,如果你当前系统的默认区域是 public, 那么在 firewall-cmd 操作时省略 --zone=public 也能达到同样的效果,因为默认就是 public。
-
不指定 --zone 的后果:
- 当你不指定 --zone 时,firewall-cmd 将会作用于 当前默认区域。
- 如果你修改了默认区域(比如修改成了dmz),那么所有省略 --zone 的 firewall-cmd 命令都会作用于新的默认区域,而非 public。
- 这可能会导致潜在的配置问题,例如,你可能以为在 public 区域开放了端口,但实际上是在 dmz 区域开放了,从而产生意想不到的安全风险。
-
最佳实践:
- 为了清晰和避免歧义, 强烈建议 在 firewall-cmd 命令中明确指定 --zone 参数。 即使你想操作的是 public 区域,也最好加上 --zone=public,这样可以确保你的意图明确,且不会因为默认区域的改变而导致配置错误。
- 特别是在脚本或自动化部署中使用 firewall-cmd 时,更要明确指定 --zone ,防止出现不可控的情况。
-
总结:
- 省略 --zone=public 并非错误,但在当前默认区域是 public 的情况下,才等效于指定 --zone=public 。
- 为了代码的可读性、可维护性和避免潜在的配置错误, 最好在所有 firewall-cmd 命令中明确指定 --zone 参数。
简单来说:
虽然不指定 --zone=public 有时可以运行,但是它依赖于系统当前默认的防火墙区域配置。为了更明确和避免歧义,强烈建议在所有 firewall-cmd 命令中 明确指定 --zone=public 。
总结
这些是我常用的 systemctl 命令,用于管理 firewalld 防火墙服务,以及常用的端口操作和 Java 开发相关的端口。希望这篇博客对你有所帮助,可以随时查阅!