uip - 获取公网 IP 的小程序

2023-04-11 03:14:10 +08:00
 dndx

用 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 。

项目地址: https://github.com/dndx/uip

6400 次点击
所在节点    分享创造
53 条回复
mikewang
2023-04-11 17:38:15 +08:00
轮子是不错的,不过有更简单的呀
curl ip.sb
curl ifconfig.co
都能直接返回本机 IP 呀🤣
bagel
2023-04-11 17:45:04 +08:00
名字好评,功能不好说,下个二进制专门干这个事感觉稍麻烦。
EsWann
2023-04-11 22:04:43 +08:00
curl ipip.sh
crazyweeds
2023-04-11 22:55:08 +08:00
curl https://www.hutubox.com/api/ip/info

特殊之处就是。。是我自己的接口,哈哈。
qsnow6
2023-04-11 23:50:30 +08:00
使用 myip.ipip.netip.sb 的人都没有长期使用这些服务,因为长期使用这些服务的人都知道它们不太可靠。我之前在家里运行了一个定时查询公网提交到 DDNS 的脚本,发现这两个服务经常会拒绝服务或者打不开。我猜测这可能是因为请求过多触发了风控。
我第一次听说这个 STUN 服务,非常感谢!
顺便也分享我使用的查询 IP 的接口, 非常稳定: http://checkip.amazonaws.com/
xiangyuecn
2023-04-11 23:52:23 +08:00
今天刚好在找免费 turn 服务,qq 的也挺好用,本地网卡 ip 、外网 ip 统统拿下


var conn=new RTCPeerConnection({iceServers:[{ urls:["stun:stun.qq.com"] }]})
conn.onicecandidate=function(e){
if(e.candidate){
if(/([\d\.]+) \d+ typ (\w+)/.test(e.candidate.candidate))
console.log(RegExp.$2+" ip: "+RegExp.$1);
}else{
console.log("完成");
}
}
conn.createDataChannel("test")
var offer=await conn.createOffer()
conn.setLocalDescription(offer)
xiangyuecn
2023-04-11 23:59:27 +08:00
STUN 在线测试 https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/

两个域名看起来比较老牌的服务,好像都是德国的:
stun.sipgate.net
stun.voipstunt.com
dndx
2023-04-12 00:09:16 +08:00
@qsnow6 没错,我测试 ipip 也经常超时或者跳出来 5 秒盾,总体来说稳定性还是达不到要求。

国内能提供稳定 IP 查询接口的太少了。找来找去还是大厂的 STUN 服务器最稳定,比如 B 站的就是他们用来做直播 WebRTC P2P 的,甚至还写了优化文章: https://www.bilibili.com/read/cv19672394?from=articleDetail ,必然比各种公益性的服务要靠谱点。
dndx
2023-04-12 00:10:19 +08:00
@0o0O0o0O0o 公益的就难了,大厂 STUN 本来设计的就不是公益服务,所以可用性要靠谱点...国内的公益服务基本都不持久
dndx
2023-04-12 00:12:21 +08:00
@qsnow6 实际上 `stun.qq.com` 甚至还做了 GeoDNS 国内分区解析,算是很用心了。可用性不太需要担心,甚至可以顺带作为网络通断的判断。
qsnow6
2023-04-12 00:34:25 +08:00
@dndx #30 非常靠谱, 大厂维护的确实要靠谱些, 我会把这个加入到我的脚本中作为备选通道.
someonedeng
2023-04-12 00:56:01 +08:00
ip.sb 已经刻进 dna
crazyweeds
2023-04-12 01:11:16 +08:00
@Ricky123 确实发布一下比较方便,虽然我个人网站支持,但确实命令行来得快。
serafin
2023-04-12 05:00:42 +08:00
我发个长亿点点的
curl -s https://www.cloudflare.com/cdn-cgi/trace | awk -F= '/^ip/{print $2}'
curl -s https://1.1.1.1/cdn-cgi/trace | awk -F= '/^ip/{print $2}'
curl -s visa.com/cdn-cgi/trace | awk -F= '/^ip/{print $2}'
tux
2023-04-12 06:59:42 +08:00
怎么没有 windows 版?
swulling
2023-04-12 08:20:22 +08:00
Python 的话直接用 aiostun 库就行了。
v2wtf
2023-04-12 09:16:32 +08:00
提个意见:主要面向国内的程序,不要默认 G 家服务器。

这种东西最重要的事情之一是:方便。

如果默认 G 家服务器,那么每次还得手动输入个国内服务器地址,或者写个 shell 脚本包一道。

这么麻烦,我为何不直接 curl ip.sb?
v2wtf
2023-04-12 09:19:40 +08:00
除上面的意见之外,我觉得 OP 这个思路是对的。

不需要自己搭建服务器,有大厂稳定性,零依赖的东西用起来真的很爽。
dndx
2023-04-12 13:37:00 +08:00
@v2wtf 感谢建议。实际上 G 家的 STUN 服务器在国内用起来也没问题,所以这个默认值也不是完全没道理。UDP 3478 比 TCP 443 被阻塞的概率也低多了。
v2wtf
2023-04-12 15:35:32 +08:00
@dndx 我下载回来第一次运行 uip 就是超时,看了下上面说的换了国内服务器才测试成功,所以才给出你提的建议。
第一次运行直接就失败,所以默认服务器成功率就不可能高。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/931402

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX