端口不是打开端口“打开”的,是打开端口“放行”的。这两个词差别很大。打开端口你没法像拧水龙头那样直接拧开一个端口,打开端口你能做的打开端口只有两件事:让某个程序监听它,或者让防火墙别拦它。打开端口很多人搞混了,打开端口以为在路由器里点一下“端口映射”就叫打开端口,打开端口其实那只是打开端口告诉路由器:外面来的包,帮我转给内网某台机器。打开端口
先说个我上周遇到的打开端口事。朋友搭了个Minecraft服务器,打开端口默认端口25565。打开端口内网里自己连得好好的打开端口,外网朋友死活进不来。打开端口他跑去路由器管理页面,把25565的TCP和UDP都映射到了自己电脑的192.168.1.100上。还是不行。我让他查Windows防火墙,果然,Java平台被防火墙拦了。放行之后,秒通。所以你看,端口“打开”这件事,至少涉及三层:程序有没有在听、系统防火墙放不放、路由器转不转。
怎么判断一个端口是不是在监听?Windows下敲 netstat -ano | findstr :端口号,Linux或macOS用 lsof -i :端口号 或者 ss -tlnp。看到LISTEN状态,说明有程序占着这个端口。看不到,那就是没程序在听,外面再怎么放行也没用。这一步经常被跳过,很多人一上来就折腾防火墙,方向错了。
防火墙这块,Windows Defender防火墙默认会弹窗问你是否允许某个程序通信。你要是当时点了“取消”,后面就得手动去“高级安全Windows Defender防火墙”里加一条入站规则。Linux上更常见的是iptables或者firewalld。比如CentOS 7以后默认用firewalld,放行8080端口就是 firewall-cmd --add-port=8080/tcp --permanent 然后 firewall-cmd --reload。Ubuntu那边如果用ufw,就是 ufw allow 8080/tcp。命令不一样,逻辑一样:告诉系统,这个端口的包别丢。
路由器这一层,家庭宽带用户绕不开NAT。你的公网IP只有一个,内网一堆设备。外面来的请求到了路由器,路由器不知道给谁,所以需要端口映射(也叫端口转发)。在路由器后台找到“虚拟服务器”或者“端口转发”那一栏,填上外部端口、内部IP、内部端口。协议选TCP、UDP还是两者,看你程序用哪个。Minecraft Java版用TCP,基岩版用UDP。填错了,照样不通。
还有个坑:有些运营商不给公网IP。你路由器WAN口拿到的地址是100.64.x.x或者10.x.x.x,那是运营商级NAT。这种情况下,你在自己路由器上怎么映射都没用,因为外面根本到不了你的路由器。解决办法要么打电话给运营商要公网IP,要么用内网穿透工具,比如frp、ngrok、Tailscale。我自己的做法是直接上Tailscale,省事,不折腾端口。
另外提一句,别随便在公网上开放端口。22、3389、3306这些,暴露出去几小时内就会被扫。真要开,改默认端口、上密钥认证、加fail2ban,或者干脆只允许特定IP访问。端口打开容易,守住难。
总结一下实际操作的顺序:先确认程序在监听,再检查系统防火墙,然后看路由器映射,最后确认有没有公网IP。四步走完,端口才算真正“打开”了。少一步,外面都连不进来。