跳转到内容

3000 端口被防火墙拦截了,到底怎么开启?

在电脑上跑了一个 3000 端口的服务,如果手机上不能访问,我通常会这样排查:

  1. 确认电脑 IP 地址是否正确;
  2. 确认手机与电脑在同一个局域网内;
  3. 检查host是否是0.0.0.0
  4. 检查防火墙是否开放3000端口。

通常来说,前面 3 步都能排查出问题来。然而这次又遇到了这个问题,却耗费了我不少时间!

案例

一次,我用Bun在电脑上跑一个 3000 端口的服务,server.ts代码如下:

ts
const server = Bun.serve({
  port: 3000,
  fetch(request) {
    return new Response("Welcome to Bun!");
  },
});

console.log(`Listening on ${server.url}`);

启动服务:

bash
bun server.ts

直接在电脑浏览器上访问http://localhost:3000是没有任何问题的。

然而在手机上用电脑的IP+端口却访问不了。

排查

首先电脑 IP 地址是没问题的,手机与电脑也在同一个局域网的同一个网段内。

是不是host不是0.0.0.0

修改一下代码:

ts
const server = Bun.serve({
  hostname: '0.0.0.0',
  port: 3000,
  fetch(request) {
    return new Response("Welcome to Bun!");
  },
});

console.log(`Listening on ${server.url}`);

重启后依然访问不了。

问题直接就锁定到了防火墙上面。

开放 3000 端口

作为程序员,其实很少会操作防火墙的,大多数人都是直接关掉防火墙,一劳永逸解决问题。

但我这是个人电脑,自然不想这样做。

所以就网上搜了一下如何开放 3000 端口:

  1. 按下Win+R键,输入control firewall.cpl回车;
  2. 点击“高级设置”,并选择“入站规则”;

入站规则

在入站规则中,按“端口排序”,发现确实没有允许 3000 端口的规则

然后继续按照教程新增一条 3000 端口的规则。

选择端口

输入端口

然后一路“下一页”,最后“完成”就可以了。

本以为这样就大功告成了,结果手机上还是访问不了

作为一名前端开发,经常需要手机访问电脑进行测试,以前怎么就没有出现过此问题呢?也没有手动配置过 3000 端口。

难道是Bun的问题?

我又写了一个简单的 demo 服务,像以前一样使用Nodejs运行:

js
import { createServer } from 'node:http';

const server = createServer((req, res) => {
  res.writeHead(200, { 'Content-Type': 'text/plain' });
  res.end('Hello World!\n');
});

// starts a simple http server locally on port 3000
server.listen(3000, () => {
  console.log('Listening on 127.0.0.1:3000');
});

此时手机访问完全没问题!

允许 Bun 规则

就这样盯着“入站规则”界面发呆了许久,突然脑子里冒出了一个问题:

为什么入站规则会有这么多?而且并不是每条规则都配置了端口。

以前很少会手动配置防火墙规则,这次静下心来看这些规则,其实大概是能够看懂的。

  1. 规则有“✅ 允许”和“🚫 阻止”两种类型;
  2. 规则除了“端口”之外,还有“程序、协议”等属性;

于是我按“名称”对规则进行排序,真的发现了bun 相关的规则

bun 规则

🚫 阻止连接状态!

在属性面板中将这两条规则改成了“✅ 允许连接”状态:

允许连接

手机再次访问,果然就没问题了。

总结

说来惭愧,竟然在防火墙上面浪费了这么多时间。说到底还是平时防火墙用得少,以前大多都是粗暴地“直接关闭防火墙”。

但同时也明白了一个道理:有些东西看起来复杂,但只要静下心来看的话,其实并不难。