ifconfig.io porttest功能实战:一条curl命令测试服务器远程端口是否可达
ifconfig.io porttest功能实战:一条curl命令测试服务器远程端口是否可达
【免费下载链接】ifconfig.io项目地址: https://gitcode.com/gh_mirrors/if/ifconfig.io
ifconfig.io 是一个用 Go 编写的高性能公网 IP 查询服务,它内置的porttest功能让你仅用一条 curl 命令,就能测试服务器远程 TCP 端口是否从公网可达。无论是刚配置好路由器端口映射,还是给云服务器开放了安全组,这篇指南都能在 30 秒内帮你验证端口连通性,避免"本地能连、外网不通"的经典坑。
为什么用 porttest 测端口,比 nmap、telnet 更直观?
平时测端口,大多数人习惯用telnet或nmap,但它们的视角是从你自己出发去连对方。而 porttest 做的是"反向连接测试"(reverse connectivity test):
| 工具 | 测试视角 | 回答的问题 |
|---|---|---|
| telnet / nmap | 我 → 对方 | 我能不能连上对方? |
| ifconfig.io porttest | 公网 → 我 | 别人(公网)能不能连上我的端口? |
这正是部署服务时最关心的场景:你的服务器在 NAT 后面,端口映射到底配没配对?云厂商安全组放行没有?本地localhost能访问不代表公网能访问,而 porttest 直接模拟公网视角来拨测。
快速上手:一条 curl 命令测试远程端口是否可达
打开终端,把端口号换成你要测的端口:
curl ifconfig.io/porttest/80输出只有两种结果之一:
true或
false就这么简单——命令发出去后,ifconfig.io 服务器拿到你的公网 IP,并立刻从公网向你的IP:80发起一次 TCP 连接,连通返回true,不通返回false。
看懂输出:true、false 和 400 错误分别代表什么
| 返回结果 | HTTP 状态 | 含义 |
|---|---|---|
true | 200 | 端口从公网可达,NAT/防火墙配置生效 ✅ |
false | 200 | 3 秒内无法建立 TCP 连接:端口未开放、被防火墙拦截或映射失效 ⚠️ |
Invalid Port Number | 400 | 端口不是 1~65535 之间的合法数字 |
Need Port | 400 | 你忘了在 URL 里带上端口号 |
💡 小提示:false不代表端口一定有问题,也可能是拨测服务器到你之间的临时网络抖动,建议间隔几秒重试一次再下结论。
原理揭秘:porttest 反向拨测是如何工作的?
整个功能的核心就在main.go里,源码非常轻量:
- 端口测试入口(
main.goL99-L110):当请求路径以porttest开头时,解析 URL 中的端口参数并做合法性校验(必须大于 0 且不超过 65535),然后执行拨测。 - TCP 拨测函数(
main.goL77-L83):testRemoteTCPPort调用 Go 标准库net.DialTimeout,以 3 秒为超时上限尝试 TCP 连接,成功返回true,失败或超时返回false。 - 真实客户端 IP 识别(
main.goL89-L97):默认取 TCP 连接的远端地址;如果部署在 Cloudflare 之后,会优先读取CF-Connecting-IP请求头,确保拨测目标是你真实的公网 IP 而非 CDN 节点 IP。
也就是说:它测的不是 ifconfig.io 的端口,而是你的端口——服务器扮演了"公网访客"的角色替你验证。
进阶玩法:用 curl 脚本批量测试多个端口
一次测一个端口固然方便,但如果你同时开放了 SSH、Web、数据库等多个端口,可以写个循环一次测完:
for port in 22 80 443 3306; do echo -n "port $port: " curl -s ifconfig.io/porttest/$port done输出示例:
port 22: true port 80: true port 443: false port 3306: false一眼就能看出哪些端口对外暴露。⚠️ 安全提醒:数据库端口(如 3306)返回true时请谨慎,公网暴露的数据库是攻击者的最爱,建议只对 22/80/443 这类业务端口放行。
这个循环也可以放进 cron 定时任务,做成简易的端口可达性监控。
自建部署:搭建你自己的 ifconfig.io 端口测试服务
不想依赖公网公共实例?项目提供了完整的容器化部署方案,一条命令即可拉起:
docker run -d --name ifconfig -p 8080:8080 ifconfig.io:latest启动后访问http://你的域名:8080即为首页,端口测试命令相应改为:
curl your-domain:8080/porttest/80项目里现成的部署文件可以直接参考:
- 镜像构建:
Dockerfile(多阶段构建,最终产物基于scratch,镜像积极小) - 容器编排:
docker-compose.yml(支持 TLS、自定义 HOSTNAME 等环境变量) - 系统服务:
web-service.systemd(裸机部署时作为 systemd 单元运行) - 服务配置说明见
README.md,其中FORWARD_IP_HEADER等环境变量决定了反向代理场景下如何识别真实客户端 IP
常见误区与 FAQ
❓ 为什么端口明明开着却返回 false?
最常见的原因:拨测拿到的公网 IP 和你以为的不一致。如果你处于运营商级 NAT(CGNAT)或公司内网出口之后,请求经多次 NAT 转发,ifconfig.io 看到的可能是上级网关 IP,回拨到网关 IP 上你的端口自然不通。判断方法:先执行curl ifconfig.io/ip看看拿到的 IP 是否就是你服务器的公网 IP。
❓ false 和超时有什么区别?
没有区别——3 秒内没连上统一返回false(见main.goL77-L83 的实现),不会单独提示"超时"。
❓ 能测 IPv6 吗?
可以。它拨测的是服务器侧解析到的客户端地址,请求走 IPv6 时自然测试 IPv6 端口的连通性。
❓ 高频请求会被限流吗?
服务本身不做限流,但作为公共公共服务,建议保持礼貌频率(每秒几次足够),大批量拨测请自建实例。
总结
ifconfig.io 的 porttest 用最朴素的方式解决了一个高频运维问题:从公网视角验证端口可达性。一条 curl 命令、一个 true/false 结果,配合批量脚本和自建部署,就能覆盖从家庭 NAS 到云服务器的绝大多数端口连通性排查场景。下次配置完端口映射,别再猜了——curl ifconfig.io/porttest/端口号,答案立判。
【免费下载链接】ifconfig.io项目地址: https://gitcode.com/gh_mirrors/if/ifconfig.io
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
