uip - 获取公网 IP 的小程序 - V2EX
2023-4-12 11:10:58 Author: v2ex.com(查看原文) 阅读量:129 收藏

用 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

第 1 条附言  ·  1 天前

更多能用的 STUN 服务器:

CF:

$ uip stun.cloudflare.com

$ uip -4 stun.cloudflare.com # IPv4 only

国内 B 站的:

$ uip stun.chat.bilibili.com

第 2 条附言  ·  16 小时 40 分钟前

统一回复一下,写这个工具主要是因为我需要国内能稳定长期使用且不限流的 IP 查询服务。别的不说,就 ip.sb 这个因为在 Cloudflare 上,不止一次遇到过 IP 连不上去的情况,稳定性达不到我的需求。

如果说觉得 curl ip.sb 就可以满足自己要求的,那的确不要再下载一个二进制来做这件事情。

Ricky123

2

Ricky123      1 天前

支持+1, 作者要不要发布到 brew

kenvix

9

kenvix      1 天前

可以做到 KB 级吗,路由器上 1MB 还是太紧张了

yinmin

17

yinmin      19 小时 30 分钟前   ❤️ 1

还有 1 个地址能获取 IP 地址的: https://www.cloudflare.com/cdn-cgi/trace

给 1 段 python 函数,给需要做 ddns 的参考
```
import re
import requests
import socket

def find_my_ip():
url = 'https://www.cloudflare.com/cdn-cgi/trace'
requests.packages.urllib3.util.connection.HAS_IPV6 = False
match = re.search(
r'ip=(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})', requests.get(url).text)
if match:
return match.group(1)
else:
return None

print(find_my_ip())
```

1423

19

1423      19 小时 2 分钟前   ❤️ 2

telnet netgeartec.ga 8080
Connected to netgeartec.ga.
Escape character is '^]'.
HI
HELLO 2.9 (2.9.2) 2021-11-30.2159.ffae0e0
GETIP
YOURIP 1.1.1.1

speedtest.net 提供的 8080 端口上的服务器也都支持 GETIP 指令返回 IP

bagel

22

bagel      17 小时 25 分钟前

名字好评,功能不好说,下个二进制专门干这个事感觉稍麻烦。

xiangyuecn

26

xiangyuecn      11 小时 18 分钟前

今天刚好在找免费 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)

dndx

29

dndx      11 小时 0 分钟前

@0o0O0o0O0o 公益的就难了,大厂 STUN 本来设计的就不是公益服务,所以可用性要靠谱点...国内的公益服务基本都不持久

dndx

30

dndx      10 小时 58 分钟前

@qsnow6 实际上 `stun.qq.com` 甚至还做了 GeoDNS 国内分区解析,算是很用心了。可用性不太需要担心,甚至可以顺带作为网络通断的判断。

qsnow6

31

qsnow6      10 小时 36 分钟前

@dndx #30 非常靠谱, 大厂维护的确实要靠谱些, 我会把这个加入到我的脚本中作为备选通道.

tux

35

tux      4 小时 11 分钟前

怎么没有 windows 版?

swulling

36

swulling      2 小时 50 分钟前

Python 的话直接用 aiostun 库就行了。

v2wtf

37

v2wtf      1 小时 54 分钟前

提个意见:主要面向国内的程序,不要默认 G 家服务器。

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

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

这么麻烦,我为何不直接 curl ip.sb?

v2wtf

38

v2wtf      1 小时 51 分钟前

除上面的意见之外,我觉得 OP 这个思路是对的。

不需要自己搭建服务器,有大厂稳定性,零依赖的东西用起来真的很爽。


文章来源: https://v2ex.com/t/931402#reply38
如有侵权请联系:admin#unsafe.sh