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

5769 次点击
所在节点    分享创造
53 条回复
Aloento
2023-04-11 03:28:25 +08:00
这个好
Ricky123
2023-04-11 09:00:52 +08:00
支持+1, 作者要不要发布到 brew
patrickyoung
2023-04-11 09:03:19 +08:00
molezznet
2023-04-11 09:03:52 +08:00
我把默认的改成 stun.syncthing.net 。 这样内外都能用了
否则出现 `Error: ErrTransactionTimeOut`
OutOfMemoryError
2023-04-11 09:06:16 +08:00
我用的 4.ipw.cn
rbe
2023-04-11 09:10:04 +08:00
curl cip.cc
8355
2023-04-11 09:18:12 +08:00
curl ip.gs
asmoker
2023-04-11 09:21:35 +08:00
kenvix
2023-04-11 09:32:17 +08:00
可以做到 KB 级吗,路由器上 1MB 还是太紧张了
NSAgold
2023-04-11 09:39:12 +08:00
我用的是 curl 4.ipw.cn 或 curl 6.ipw.cn
0o0O0o0O0o
2023-04-11 09:49:27 +08:00
还有 telnet 方式和 DNS 方式:

例如
dig -t txt o-o.myaddr.l.google.com @ns1.google.com +short
dig myip.opendns.com @resolver1.opendns.com +short
dig whoami.akamai.net. @ns1-1.akamaitech.net. +short

telnet telnetmyip.com

它们协议基础简单,也许真的能达到如 #9 所说的 KB 级?不过不清楚国内大厂有没有这类公益服务器。
blankmiss
2023-04-11 10:00:43 +08:00
curl ip.sb
Routeros
2023-04-11 10:34:01 +08:00
@blankmiss 哈哈哈 我也就能记住这个。
internelp
2023-04-11 10:44:50 +08:00
@blankmiss 我也用这个,以前用 ip.cn
cq65617875
2023-04-11 13:53:08 +08:00
yinmin
2023-04-11 15:34:47 +08:00
curl -4 ip.gs
curl -6 ip.gs
yinmin
2023-04-11 15:40:29 +08:00
还有 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
2023-04-11 15:59:13 +08:00
为什么之前没有这种工具
因为从 stun 获取 IP 是 stun 套件的其中一个示例功能,少有人单独掏出来 show 的

举例如
https://github.com/pion/stun/tree/master/cmd/stun-client

./stun_client
1.1.1.1:10101
1423
2023-04-11 16:08:32 +08:00
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
UnknoownUser
2023-04-11 17:17:08 +08:00
其实获取 ip 的网站一大把
ipconfig.me
ipconfig.co

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

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

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

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

© 2021 V2EX