搭建网站需要开放哪些端口|防火墙策略(安全配置入门教程)

发布时间:2026-07-23 12:10

# 搭建网站需要开放哪些端口|防火墙策略(安全配置入门教程)

## 前言介绍

当你购买一台云服务器或者自己搭建一台物理服务器准备发布网站时,最常遇到的一个问题就是:网站搭建好了,外网却访问不了。绝大多数情况下,这不是代码或配置的问题,而是服务器的防火墙没有开放正确的端口。防火墙就像服务器的门卫,它会拦截所有未经允许的进出流量。如果你没有明确告诉门卫“让访问网站的人进来”,那么即使网站程序跑得再好,外部用户也无法连接。

本教程将手把手教你理解网站运行所需的核心端口,以及如何在主流操作系统(Linux CentOS/Ubuntu、Windows Server)和云服务商的安全组中正确配置防火墙策略。学完本教程,你将彻底搞清楚“开放端口”这件事,并且能按照最小权限原则安全地配置防火墙,既保证网站可访问,又避免暴露不必要的风险。

---

## 前置准备

在开始操作之前,请确认你已经具备以下条件:

1. **一台服务器**:可以是云服务器(阿里云、腾讯云、华为云、AWS等),也可以是本地虚拟机或物理机。确保你拥有服务器的管理员账号(Linux下为root或具有sudo权限的用户,Windows下为Administrator)。

2. **远程连接工具**:

- Linux服务器:建议使用SSH客户端,如Putty、Xshell、Termius或直接使用命令行。

- Windows服务器:使用远程桌面连接(RDP)。

3. **网站服务已安装**:例如Nginx、Apache、IIS等Web服务器软件已经安装并启动。如果你还没有安装,可以先安装一个测试页面(例如Nginx默认欢迎页)。

4. **知道服务器的公网IP**(如果是云服务器)或局域网IP(如果是内网测试)。

5. **了解你的云服务商控制台**:如果你使用的是云服务器,你需要登录到云服务商的控制台,找到“安全组”或“防火墙”设置页面。不同厂商界面略有差异,但核心功能相同。

---

## 分步操作步骤

### 1. 明确网站运行需要开放哪些核心端口

在动手配置之前,你必须清楚你的网站需要哪些端口。以下是搭建一个常规网站最常用的端口清单:

- **HTTP(80端口)**:用于普通网页访问。用户输入网址时,默认走80端口。几乎所有网站都必须开放。

- **HTTPS(443端口)**:用于加密网页访问。如果你的网站配置了SSL证书(https),必须开放443端口。现在主流网站都强制HTTPS,所以443端口几乎是必开的。

- **SSH(22端口)**:用于Linux服务器的远程管理。如果你需要通过SSH连接服务器,必须开放22端口。**注意:22端口只对你自己或可信IP开放,不要暴露给全网。**

- **RDP(3389端口)**:用于Windows服务器的远程桌面管理。类似SSH,只对可信IP开放。

- **数据库端口(如MySQL的3306、PostgreSQL的5432、Redis的6379)**:如果你的网站需要远程连接数据库,才需要开放这些端口。**强烈建议:数据库端口只对应用服务器IP开放,绝不开放给公网。**

- **其他服务端口**:例如FTP(21端口)、邮件服务(25、110、143等)、游戏服务器端口等,根据实际需要开放。

**最小开放原则**:只开放网站运行绝对必要的端口,其余全部关闭。例如一个纯静态网站,只需要开放80和443端口。如果有后台管理,也尽量通过VPN或跳板机访问,而不是直接开放管理端口。

### 2. 在Linux服务器上使用iptables/firewalld配置防火墙(以CentOS 7/8为例)

大多数Linux服务器默认使用firewalld或iptables作为防火墙管理工具。以下以firewalld为例(CentOS 7/8、RHEL、Fedora等),这是最常用且操作简单的方式。

**步骤2.1:检查firewalld状态**

```bash

sudo systemctl status firewalld

```

如果显示“active (running)”,说明防火墙正在运行。如果未运行,先启动并设置开机自启:

```bash

sudo systemctl start firewalld

sudo systemctl enable firewalld

```

**步骤2.2:开放80和443端口(HTTP和HTTPS)**

```bash

sudo firewall-cmd --zone=public --add-port=80/tcp --permanent

sudo firewall-cmd --zone=public --add-port=443/tcp --permanent

```

- `--zone=public`:表示应用于公共网络区域(默认)。

- `--add-port=80/tcp`:开放TCP协议的80端口。

- `--permanent`:永久生效,重启后依然保留。

**步骤2.3:开放22端口(SSH)并限制来源IP(强烈建议)**

首先,确认你当前的SSH连接IP地址(可以在本地电脑上查询你的公网IP)。然后执行:

```bash

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="你的公网IP/32" port protocol="tcp" port="22" accept' --permanent

```

例如,你的公网IP是`123.123.123.123`,则命令为:

```bash

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

```

这条规则只允许指定IP访问22端口,其他IP全部拒绝。如果你不确定自己的IP,或者需要从多个地方管理,可以先开放给一个临时IP,后续再调整。

**步骤2.4:删除默认的SSH开放规则(如果有)**

如果你之前已经开放了22端口给所有IP,需要先删除:

```bash

sudo firewall-cmd --zone=public --remove-port=22/tcp --permanent

```

注意:必须先添加限制IP的规则,再删除全局规则,否则你会立刻断开SSH连接。

**步骤2.5:重新加载防火墙配置**

```bash

sudo firewall-cmd --reload

```

**步骤2.6:验证端口是否开放**

```bash

sudo firewall-cmd --zone=public --list-ports

sudo firewall-cmd --zone=public --list-rich-rules

```

你应该看到80/tcp和443/tcp在列表中,以及你添加的SSH限制规则。

**步骤2.7:测试网站访问**

在本地浏览器中输入`http://你的服务器公网IP`,如果看到Nginx或Apache的默认页面,说明80端口已生效。如果访问失败,检查服务器上的Web服务是否启动,以及云服务商的安全组是否也开放了端口(见步骤4)。

### 3. 在Linux服务器上使用ufw配置防火墙(以Ubuntu 20.04/22.04为例)

Ubuntu系统默认使用ufw(Uncomplicated Firewall),比firewalld更简洁。

**步骤3.1:安装并启用ufw(如果未安装)**

```bash

sudo apt update

sudo apt install ufw -y

sudo ufw enable

```

启用时如果提示“Command may disrupt existing ssh connections”,输入`y`确认。注意:启用前请确保你已经允许了SSH端口,否则会断开连接。

**步骤3.2:开放80和443端口**

```bash

sudo ufw allow 80/tcp

sudo ufw allow 443/tcp

```

**步骤3.3:限制SSH端口(22)的访问来源**

```bash

sudo ufw allow from 你的公网IP to any port 22 proto tcp

```

例如:

```bash

sudo ufw allow from 123.123.123.123 to any port 22 proto tcp

```

**重要**:先执行这条命令,再删除默认的SSH允许规则。默认情况下,ufw可能已经允许了22端口(如果之前用`ufw allow ssh`或`ufw allow 22`)。检查当前规则:

```bash

sudo ufw status numbered

```

如果看到类似`[ 1] 22/tcp ALLOW IN Anywhere`的规则,记下它的编号(比如1),然后删除:

```bash

sudo ufw delete 1

```

再次确认规则列表,确保只有你指定的IP可以访问22端口。

**步骤3.4:查看当前规则并确认**

```bash

sudo ufw status verbose

```

你应该看到类似:

```

To Action From

-- ------ ----

80/tcp ALLOW Anywhere

443/tcp ALLOW Anywhere

22/tcp ALLOW 123.123.123.123

```

**步骤3.5:测试网站访问**

同样,在浏览器中访问`http://你的服务器IP`,验证是否成功。

### 4. 在Windows Server上配置防火墙(以Windows Server 2019/2022为例)

Windows Server自带高级安全Windows Defender防火墙,配置方式直观。

**步骤4.1:打开防火墙管理工具**

- 按下`Win + R`,输入`wf.msc`,回车。

- 或者:控制面板 → 系统和安全 → Windows Defender防火墙 → 高级设置。

**步骤4.2:创建入站规则开放80端口**

- 在左侧点击“入站规则”,然后在右侧点击“新建规则”。

- 规则类型:选择“端口”,点击下一步。

- 协议和端口:选择“TCP”,在“特定本地端口”中输入`80`,点击下一步。

- 操作:选择“允许连接”,点击下一步。

- 配置文件:保持默认(域、专用、公用都勾选),点击下一步。

- 名称:输入“HTTP-80”或任意你记得的名字,点击完成。

**步骤4.3:同样方法创建443端口规则**

重复步骤4.2,将端口号改为`443`,名称改为“HTTPS-443”。

**步骤4.4:限制RDP端口(3389)的访问来源(强烈建议)**

- 找到系统自带的“远程桌面(TCP-In)”规则(通常名称为“远程桌面 - 用户模式(TCP-In)”)。

- 右键该规则,选择“属性”。

- 切换到“作用域”选项卡。

- 在“远程IP地址”区域,选择“下列IP地址”,然后点击“添加”。

- 输入你的公网IP(例如`123.123.123.123`),或者一个IP段(例如`192.168.1.0/24`如果在内网)。点击确定。

- 点击“应用”和“确定”。

**注意**:如果你没有先添加自己的IP,就直接修改了作用域,你的远程桌面连接可能会立即断开。建议先添加IP,再应用规则。如果已经断开,可以通过云服务商的控制台VNC登录修复。

**步骤4.5:验证规则**

在“入站规则”列表中,确保HTTP和HTTPS规则已启用(绿色图标),并且远程桌面规则的作用域已限制。

**步骤4.6:测试网站访问**

在浏览器中输入`http://你的服务器IP`,如果IIS默认页面出现,说明配置成功。

### 5. 在云服务商控制台配置安全组(以阿里云为例)

如果你的服务器是云服务器,除了服务器内部的防火墙,云平台还有一层“安全组”防火墙。**这两层都必须开放相应端口,缺一不可**。很多新手只配置了服务器内部防火墙,却忘了云平台的安全组,导致网站依然无法访问。

**步骤5.1:登录云服务商控制台**

进入ECS(云服务器)管理页面,找到你的实例,点击“更多” → “网络和安全组” → “安全组配置”。

**步骤5.2:进入安全组规则管理**

在安全组列表中,找到你的实例关联的安全组(通常默认有一个),点击“配置规则”。

**步骤5.3:添加入方向规则(开放80和443)**

- 点击“添加安全组规则”。

- 规则方向:入方向(即外部访问服务器的流量)。

- 授权策略:允许。

- 协议类型:选择“HTTP(80)”或“自定义TCP”,端口范围填`80/80`。

- 授权对象:`0.0.0.0/0`(表示所有IP都可以访问80端口)。如果只想让特定IP访问,可以填具体IP(例如`123.123.123.123/32`)。

- 优先级:保持默认(1-100,数字越小优先级越高)。

- 描述:例如“允许HTTP访问”。

- 点击“保存”。

同样方法添加443端口规则:协议类型选择“HTTPS(443)”或自定义TCP,端口范围`443/443`,授权对象`0.0.0.0/0`。

**步骤5.4:限制SSH(22端口)的授权对象**

- 再次点击“添加安全组规则”。

- 协议类型:SSH(22)或自定义TCP,端口范围`22/22`。

- 授权对象:填写你的公网IP(例如`123.123.123.123/32`),不要填`0.0.0.0/0`。

- 保存。

**步骤5.5:检查默认规则**

有些云服务商默认会开放所有端口(比如腾讯云的新机器默认开放全部端口),有些则默认关闭。务必检查一下,如果有不需要的端口(比如21、3306等),可以删除或修改授权对象为限制IP。

**步骤5.6:测试网站**

此时,即使服务器内部防火墙没有开放端口,云安全组已经开放了80和443,网站应该可以访问。但为了安全,建议同时配置服务器内部防火墙,形成双重防护。

---

## 常见问题

**Q1:我已经开放了80端口,为什么网站还是无法访问?**

可能的原因及排查顺序:

1. **云安全组未开放**:检查云服务商控制台的安全组规则,确认入方向有80端口且授权对象为`0.0.0.0/0`。

2. **服务器内部防火墙未开放**:使用`firewall-cmd --list-ports`或`ufw status`确认80端口已开放。

3. **Web服务未启动**:检查Nginx/Apache/IIS是否正在运行。Linux下用`systemctl status nginx`,Windows下检查服务管理器。

4. **Web服务端口配置错误**:检查配置文件(如Nginx的`listen 80;`是否被注释或改成了其他端口)。

5. **服务器监听地址错误**:确保Web服务监听的是`0.0.0.0`(所有网络接口),而不是`127.0.0.1`(仅本机)。例如Nginx配置中`listen 80;`默认监听所有接口,但如果写成`listen 127.0.0.1:80;`则只能本机访问。

6. **本地网络或浏览器缓存**:尝试使用手机热点或另一台电脑访问,排除本地网络问题。

**Q2:开放了22端口,但SSH连接不上,怎么办?**

1. **检查云安全组**:确认22端口入方向规则中,授权对象包含你的当前IP。如果你在配置时写错了IP,可以通过云服务商的“VNC远程连接”或“管理终端”登录服务器修改。

2. **检查服务器内部防火墙**:如果使用了限制IP的规则,确认你的IP是否正确。可以用`curl ifconfig.me`查看你当前的公网IP(注意:有些网络会使用运营商NAT,IP可能变化)。

3. **SSH服务是否运行**:`systemctl status sshd`检查。

4. **端口是否被占用**:`netstat -tlnp | grep 22`查看22端口是否被其他程序占用。

**Q3:我开放了3306端口(MySQL),但数据库连接还是失败?**

1. **确认MySQL配置允许远程连接**:默认MySQL只允许本地连接(`bind-address = 127.0.0.1`)。需要修改配置文件`/etc/mysql/mysql.conf.d/mysqld.cnf`,将`bind-address`改为`0.0.0.0`,然后重启MySQL。

2. **确认用户权限**:MySQL用户需要具有从远程IP访问的权限。例如:`GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '密码';`(注意:`%`表示所有IP,实际使用时应限制具体应用服务器IP)。

3. **防火墙和安全组**:检查3306端口是否在防火墙和安全组中开放,并且授权对象只允许应用服务器IP。

**Q4:如何查看当前服务器上所有开放的端口?**

- Linux:`ss -tlnp` 或 `netstat -tlnp`(需要安装net-tools)。

- Windows:以管理员身份运行命令提示符,输入`netstat -ano | findstr LISTEN`。

**Q5:配置防火墙时,不小心把自己踢出了SSH连接,怎么恢复?**

- 云服务器:使用云服务商控制台的“VNC远程连接”或“管理终端”功能,直接通过浏览器登录服务器(不需要SSH)。登录后修复防火墙规则。

- 物理服务器:需要本地接入显示器键盘,或者通过IPMI/BMC管理口登录。

---

## 收尾总结

通过本教程,你已经掌握了搭建网站所需的核心端口(80、443、22/3389)以及如何在Linux(firewalld/ufw)和Windows Server上配置防火墙策略,同时还学会了云安全组的双重防护配置。最关键的是,你懂得了“最小权限原则”——只开放必要的端口,并且对管理端口(SSH、RDP)限制来源IP,这是服务器安全的第一道防线。

实际生产环境中,你还可以进一步优化:使用VPN或堡垒机访问管理端口,将Web服务放在反向代理后面(如Nginx只开放80/443,应用服务监听内网端口),以及定期审计防火墙规则。但无论如何,今天学到的内容已经足够你安全地发布一个网站,并且避免了新手最容易犯的“全端口开放”或“只配一层防火墙”的错误。

现在,去检查你的服务器吧,确保只有该开的端口开着,不该开的全部关掉。你的网站不仅会跑得更稳,也会更安全。