3000 端口被防火墙拦截了,到底怎么开启?
在电脑上跑了一个 3000 端口的服务,如果手机上不能访问,我通常会这样排查:
- 确认电脑 IP 地址是否正确;
- 确认手机与电脑在同一个局域网内;
- 检查
host是否是0.0.0.0; - 检查防火墙是否开放
3000端口。
通常来说,前面 3 步都能排查出问题来。然而这次又遇到了这个问题,却耗费了我不少时间!
案例
一次,我用Bun在电脑上跑一个 3000 端口的服务,server.ts代码如下:
const server = Bun.serve({
port: 3000,
fetch(request) {
return new Response("Welcome to Bun!");
},
});
console.log(`Listening on ${server.url}`);启动服务:
bun server.ts直接在电脑浏览器上访问http://localhost:3000是没有任何问题的。
然而在手机上用电脑的IP+端口却访问不了。
排查
首先电脑 IP 地址是没问题的,手机与电脑也在同一个局域网的同一个网段内。
是不是host不是0.0.0.0?
修改一下代码:
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 端口:
“
- 按下
Win+R键,输入control firewall.cpl回车; - 点击“高级设置”,并选择“入站规则”;

在入站规则中,按“端口排序”,发现确实没有允许 3000 端口的规则。
然后继续按照教程新增一条 3000 端口的规则。


然后一路“下一页”,最后“完成”就可以了。
本以为这样就大功告成了,结果手机上还是访问不了!
作为一名前端开发,经常需要手机访问电脑进行测试,以前怎么就没有出现过此问题呢?也没有手动配置过 3000 端口。
难道是Bun的问题?
我又写了一个简单的 demo 服务,像以前一样使用Nodejs运行:
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 规则
就这样盯着“入站规则”界面发呆了许久,突然脑子里冒出了一个问题:
为什么入站规则会有这么多?而且并不是每条规则都配置了端口。
以前很少会手动配置防火墙规则,这次静下心来看这些规则,其实大概是能够看懂的。
“
- 规则有“✅ 允许”和“🚫 阻止”两种类型;
- 规则除了“端口”之外,还有“程序、协议”等属性;
于是我按“名称”对规则进行排序,真的发现了bun 相关的规则:

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

手机再次访问,果然就没问题了。
总结
说来惭愧,竟然在防火墙上面浪费了这么多时间。说到底还是平时防火墙用得少,以前大多都是粗暴地“直接关闭防火墙”。
但同时也明白了一个道理:有些东西看起来复杂,但只要静下心来看的话,其实并不难。