服务器安全基础设置教程|端口防火墙放行实操指南

发布时间:2026-07-16 23:44

# 前言介绍

服务器上线后面临的第一个挑战就是网络安全。黑客会持续扫描互联网上的IP地址,寻找开放端口进行攻击。如果不进行基础安全设置,服务器可能在几分钟内就被入侵。端口和防火墙是服务器安全的第一道防线,正确配置能过滤掉绝大多数恶意流量。本教程将从零开始,手把手教你完成服务器端口管理和防火墙规则设置,无论你是刚接触服务器的新手还是有一定经验的运维人员,都能按照步骤完成安全加固。

# 前置准备

在开始操作前,需要确保以下条件已经满足:

1. 拥有一台云服务器或物理服务器,操作系统为CentOS 7/8、Ubuntu 20.04/22.04或Debian 10/11。本教程以CentOS 7为例,其他系统命令会单独标注。

2. 已经通过SSH客户端(如Xshell、Putty或Windows Terminal)成功连接到服务器,并且拥有root权限或sudo权限。

3. 服务器已经分配了公网IP地址,并且你清楚当前需要开放哪些端口(例如Web服务需要80和443端口,SSH需要22端口)。

4. 了解当前服务器上运行了哪些服务,避免误关闭必要端口导致服务不可用。

5. 建议先备份当前防火墙规则,以防操作失误可以快速恢复。

# 分步操作步骤

## 步骤1:检查当前防火墙状态和规则

在修改防火墙之前,必须先了解当前服务器的防火墙状态和已有规则。

**操作细节:**

1. 使用SSH登录服务器,输入以下命令检查firewalld服务是否运行:

```

systemctl status firewalld

```

如果显示`active (running)`表示防火墙正在运行。如果显示`inactive (dead)`,需要先启动防火墙。

2. 如果防火墙未运行,执行启动命令:

```

systemctl start firewalld

```

设置开机自启:

```

systemctl enable firewalld

```

3. 查看当前所有防火墙规则:

```

firewall-cmd --list-all

```

输出结果中会显示当前开放的端口和服务。重点关注`ports`和`services`两行,例如:

```

ports: 80/tcp 443/tcp

services: ssh

```

这表示当前只开放了80、443端口和SSH服务。

4. 如果使用的是Ubuntu或Debian系统,默认防火墙可能是ufw。检查ufw状态:

```

ufw status

```

如果显示`Status: active`表示正在运行。如果未安装,先执行`apt install ufw`安装。

**注意:** 在没有确认当前规则前,不要盲目清空或修改防火墙,否则可能导致SSH连接断开,使你无法再管理服务器。

## 步骤2:开放必要的服务端口

根据你的业务需求,开放对应的端口。常见的端口包括:SSH(22)、HTTP(80)、HTTPS(443)、数据库(3306/5432)、自定义应用端口等。

**操作细节:**

1. 开放SSH端口(必须保留,否则会失去远程连接):

```

firewall-cmd --permanent --add-service=ssh

```

或者指定端口号:

```

firewall-cmd --permanent --add-port=22/tcp

```

2. 开放Web服务端口(如果运行网站):

```

firewall-cmd --permanent --add-service=http

firewall-cmd --permanent --add-service=https

```

或者直接指定端口:

```

firewall-cmd --permanent --add-port=80/tcp

firewall-cmd --permanent --add-port=443/tcp

```

3. 开放自定义端口(例如你的应用使用8080端口):

```

firewall-cmd --permanent --add-port=8080/tcp

```

如果需要UDP协议,将`tcp`改为`udp`,例如DNS服务需要开放53/udp。

4. 开放端口范围(例如需要开放10000-20000端口):

```

firewall-cmd --permanent --add-port=10000-20000/tcp

```

5. **Ubuntu/Debian系统使用ufw的对应操作:**

```

ufw allow ssh

ufw allow 80/tcp

ufw allow 443/tcp

ufw allow 8080/tcp

ufw allow 10000:20000/tcp

```

**关键提示:** 每次添加规则后,必须执行重载命令才能生效。`--permanent`参数表示规则永久保存,重启后依然有效。如果不加此参数,规则只在当前会话有效,服务器重启后会丢失。

## 步骤3:限制特定IP访问(可选但强烈推荐)

对于管理端口(如SSH、数据库端口),建议只允许特定IP地址访问,避免被全网扫描攻击。

**操作细节:**

1. 移除SSH端口的全局开放(如果之前已经开放):

```

firewall-cmd --permanent --remove-service=ssh

firewall-cmd --permanent --remove-port=22/tcp

```

2. 添加仅允许特定IP访问SSH的规则。假设你的办公网络公网IP是`123.123.123.123`:

```

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="123.123.123.123" port protocol="tcp" port="22" accept'

```

3. 如果需要允许多个IP,可以添加多条规则,或者使用IP段。例如允许`192.168.1.0/24`网段:

```

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" port protocol="tcp" port="22" accept'

```

4. 对于数据库端口(如MySQL的3306),同样限制仅允许应用服务器IP访问:

```

firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="10.0.0.5" port protocol="tcp" port="3306" accept'

```

5. **Ubuntu/Debian系统使用ufw的对应操作:**

```

ufw allow from 123.123.123.123 to any port 22

ufw allow from 10.0.0.5 to any port 3306

```

**重要提醒:** 在限制SSH访问IP之前,务必确认你的当前IP地址是允许的。如果不小心把自己排除在外,可以通过云服务商的控制台VNC功能登录服务器,或者联系机房人员处理。建议先保留一个备用IP或使用云服务商的安全组作为兜底。

## 步骤4:删除不需要的默认服务和端口

服务器默认可能开放了一些不必要的服务,需要及时关闭以减小攻击面。

**操作细节:**

1. 查看当前所有开放的服务和端口:

```

firewall-cmd --list-all

```

2. 移除不需要的服务(例如dhcpv6-client如果不需要):

```

firewall-cmd --permanent --remove-service=dhcpv6-client

```

3. 移除不需要的端口(例如测试用的8080端口如果已经不用):

```

firewall-cmd --permanent --remove-port=8080/tcp

```

4. 检查是否有危险的端口被开放,例如:

- 23端口(Telnet,明文传输,极不安全)

- 21端口(FTP,建议使用SFTP替代)

- 3306端口(MySQL,不应暴露在公网)

- 6379端口(Redis,默认无密码,极易被攻击)

如果发现这些端口开放且不是必须的,立即关闭:

```

firewall-cmd --permanent --remove-port=23/tcp

```

5. **Ubuntu/Debian系统使用ufw的对应操作:**

```

ufw delete allow 8080/tcp

ufw delete allow 23/tcp

```

**注意:** 删除规则时,如果之前是通过服务名添加的(如`--add-service=http`),必须用`--remove-service=http`删除。如果通过端口添加的,用`--remove-port=80/tcp`。混淆使用会导致删除失败。

## 步骤5:重新加载防火墙并验证配置

所有规则修改完成后,需要重新加载防火墙使配置生效,并进行验证。

**操作细节:**

1. 重新加载防火墙规则:

```

firewall-cmd --reload

```

执行后不会有输出信息,表示加载成功。

2. 查看最终生效的规则:

```

firewall-cmd --list-all

```

仔细检查输出的`ports`、`services`和`rich-rules`部分,确认所有需要的端口都已开放,不需要的端口已关闭。

3. 测试端口是否真正开放。在本地电脑(不是服务器上)使用telnet或nc命令测试。例如测试80端口:

```

telnet 你的服务器IP 80

```

或者使用在线端口检测工具(如tool.chinaz.com/port)。如果端口开放,会显示连接成功;如果被防火墙阻止,会显示连接超时或被拒绝。

4. 测试被限制的端口(如SSH的22端口,如果设置了IP限制)。从非允许的IP尝试连接,应该被拒绝。从允许的IP连接,应该正常登录。

5. 检查防火墙日志,确认没有异常拒绝记录:

```

firewall-cmd --get-log-denied

```

如果返回`off`,表示日志未开启。可以开启日志以便排查问题:

```

firewall-cmd --set-log-denied=all

```

**关键验证:** 务必在修改后保持SSH连接不要关闭,另开一个SSH窗口测试能否正常登录。如果新窗口无法连接,说明规则有问题,立即在旧窗口中修正规则,然后重新加载。如果旧窗口也不小心关闭了,只能通过VNC或物理控制台恢复。

## 步骤6:配置默认策略(进阶操作)

默认情况下,firewalld的默认策略是拒绝所有入站流量,只允许明确放行的流量。但为了安全起见,可以显式设置默认策略。

**操作细节:**

1. 查看当前默认区域和策略:

```

firewall-cmd --get-default-zone

```

通常返回`public`。

2. 设置默认区域为public(如果当前不是):

```

firewall-cmd --set-default-zone=public

```

3. 修改public区域的默认入站策略为拒绝:

```

firewall-cmd --permanent --zone=public --set-target=DROP

```

这样所有未明确放行的端口都会被拒绝。

4. 如果你有内网通信需求,可以创建trusted区域并添加内网IP:

```

firewall-cmd --permanent --zone=trusted --add-source=192.168.1.0/24

```

这样内网流量不受限制,外网流量受public区域规则限制。

5. 重载防火墙:

```

firewall-cmd --reload

```

**注意:** 修改默认策略为DROP后,一定要确保你已经开放了SSH端口并且IP限制正确,否则你会立即失去连接。建议先在测试环境验证。

# 常见问题

**问题1:执行firewall-cmd命令提示“command not found”**

原因:系统没有安装firewalld。执行安装命令:

```

yum install firewalld -y # CentOS

apt install firewalld -y # Ubuntu/Debian

```

安装完成后重新执行启动和配置命令。

**问题2:开放端口后仍然无法从外部访问**

可能原因:

- 云服务商的安全组/网络ACL没有放行对应端口。需要登录云控制台,在安全组规则中添加入站规则。

- 服务器上运行的服务没有监听在0.0.0.0(所有网络接口)上。检查服务配置文件,确保监听地址为0.0.0.0或::。

- 端口被其他程序占用。使用`netstat -tlnp`或`ss -tlnp`查看端口占用情况。

**问题3:不小心把自己SSH端口封了,无法连接服务器**

解决方法:

- 如果使用的是云服务器,登录云控制台,找到“远程连接”或“VNC登录”功能,通过浏览器直接登录服务器。

- 进入系统后,执行`firewall-cmd --remove-rich-rule='...'`删除错误的规则,然后重新加载。

- 或者直接停止防火墙:`systemctl stop firewalld`,然后重新配置。

- 如果连VNC也无法使用,联系云服务商的技术支持,请求他们从后台重置防火墙规则。

**问题4:firewall-cmd --reload后规则没有生效**

原因:可能是之前添加规则时没有加`--permanent`参数。检查方法:

```

firewall-cmd --list-all # 查看当前运行规则

firewall-cmd --permanent --list-all # 查看永久规则

```

如果两者不一致,说明有规则没有保存。将需要的规则重新用`--permanent`参数添加,然后再次reload。

**问题5:开放了端口范围,但是某些端口仍然无法访问**

可能原因:

- 端口范围格式错误,正确格式为`10000-20000/tcp`,注意中间是短横线。

- 服务监听的端口不在你开放的范围内。

- 端口被系统预留或已被占用。

# 收尾总结

通过本教程,你已经完成了服务器防火墙的基础安全设置。核心操作包括:检查防火墙状态、开放必要端口、限制管理端口IP访问、删除危险端口、重新加载验证配置。记住几个关键原则:最小权限原则(只开放业务需要的端口)、默认拒绝原则(未明确允许的流量一律拒绝)、IP白名单原则(管理端口只允许特定IP访问)。建议每季度检查一次防火墙规则,移除不再使用的端口,并关注安全公告及时更新规则。安全是一个持续的过程,防火墙只是第一步,后续还需要结合入侵检测、日志审计、定期更新补丁等措施构建完整的安全体系。现在你的服务器已经具备基本防护能力,可以更安全地对外提供服务了。