用 Rust 写了一个获取公网 IP 的小程序。
其实本来不想造这个轮子的,但是发现国内能稳定提供获取 IP 的服务少之又少,要么不稳定,要么会有各种限流。
今天突发奇想,NAT 打洞用的 STUN 服务本身就会返回客户端的 IP 地址,国内有不少大厂维护的 STUN 服务器,直接用肯定是最稳定的(因为大厂本身自己的服务也需要用到)。这些 STUN 服务器的稳定性应该不是个人搭建的 IP 查询服务能比的,跑路被打的风险也小很多。
简单 Google 了一下,竟然还没有人做过专门用来做这个的程序。我就基于 Rust 的 stun
Crate example 改了一个。
用起来非常简单,直接到 Release 页面下载自己架构的可执行文件 chmox +x uip
或者 cargo install uip
即可。编译的二进制大小也进行了优化,只有 1 MB 多点,也没有别的运行时依赖。
不带参数默认使用 Google 的 STUN 服务器,但是也可以使用国内的服务器,比如:
$ uip
203.0.113.1
$ uip stun.qq.com
203.0.113.1
$ uip stun.miwifi.com
203.0.113.1
通过返回值是否为 0
可以判断是否成功获得 IP 地址。
也欢迎大家分享可以使用的公开 STUN 服务器地址,可以在项目 README.md
里提 PR 。
第 1 条附言 · 1 天前
更多能用的 STUN 服务器:
CF:
$ uip stun.cloudflare.com
$ uip -4 stun.cloudflare.com # IPv4 only
国内 B 站的:
$ uip stun.chat.bilibili.com
2 Ricky123 1 天前支持+1, 作者要不要发布到 brew |
9 kenvix 1 天前可以做到 KB 级吗,路由器上 1MB 还是太紧张了 |
17 yinmin 19 小时 30 分钟前 1还有 1 个地址能获取 IP 地址的: https://www.cloudflare.com/cdn-cgi/trace 给 1 段 python 函数,给需要做 ddns 的参考 def find_my_ip(): print(find_my_ip()) |
19 1423 19 小时 2 分钟前 2telnet netgeartec.ga 8080 speedtest.net 提供的 8080 端口上的服务器也都支持 GETIP 指令返回 IP |
22 bagel 17 小时 25 分钟前名字好评,功能不好说,下个二进制专门干这个事感觉稍麻烦。 |
26 xiangyuecn 11 小时 18 分钟前今天刚好在找免费 turn 服务,qq 的也挺好用,本地网卡 ip 、外网 ip 统统拿下 var conn=new RTCPeerConnection({iceServers:[{ urls:["stun:stun.qq.com"] }]}) |
29 dndx 11 小时 0 分钟前@0o0O0o0O0o 公益的就难了,大厂 STUN 本来设计的就不是公益服务,所以可用性要靠谱点...国内的公益服务基本都不持久 |
30 dndx 10 小时 58 分钟前@qsnow6 实际上 `stun.qq.com` 甚至还做了 GeoDNS 国内分区解析,算是很用心了。可用性不太需要担心,甚至可以顺带作为网络通断的判断。 |
35 tux 4 小时 11 分钟前怎么没有 windows 版? |
36 swulling 2 小时 50 分钟前Python 的话直接用 aiostun 库就行了。 |
37 v2wtf 1 小时 54 分钟前提个意见:主要面向国内的程序,不要默认 G 家服务器。 这种东西最重要的事情之一是:方便。 如果默认 G 家服务器,那么每次还得手动输入个国内服务器地址,或者写个 shell 脚本包一道。 这么麻烦,我为何不直接 curl ip.sb? |
38 v2wtf 1 小时 51 分钟前除上面的意见之外,我觉得 OP 这个思路是对的。 不需要自己搭建服务器,有大厂稳定性,零依赖的东西用起来真的很爽。 |