V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Recommended Services
Amazon Web Services
LeanCloud
New Relic
ClearDB
mofe
V2EX  ›  云计算

如何搭建一个获取公网 ip 的服务(在中国)

  •  2
     
  •   mofe · 2018-05-08 19:09:29 +08:00 · 18652 次点击
    这是一个创建于 2389 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一直有在用 ifconfig.coifconfig.mewhatismyip.akamai.com 获取当前的公网 ip, 最近有需求要在浏览器中获取用户的真实 IP, 现有的轮子有跨域资源访问的问题, 并且 ifconfig.co 还被 block 了,遂产生了写一个支持跨域访问的获取公网 ip 的服务

    关于为啥不能直接获取到用户的真实 IP 地址我也解释下,应用程序是部署在 k8s 集群中的 Sentry, 用于监控服务的错误信息, 但因为使用了阿里云 LoadBalance , calico 以及 k8s 的 ingress 控制器, 导致获取用户真实 IP 变得不那么容易,虽然这样能在一定程度上保证服务的稳定。

    后来翻到在提交错误信息的时候是可以手动提交 IP 地址的,就产生了搭建这个服务的想法

    1 图 1. sentry 报告的 IP 地址均为内网地址

    以上是背景


    开始兴匆匆撸代码,有用的代码就三行(完整代码)

    add_header Access-Control-Allow-Origin *; # 允许跨域访问
    content_by_lua '
        ngx.say(ngx.var.remote_addr) # 返回客户端 IP 地址
    ';
    

    用不了几分钟就写完了,测试没问题,找个服务器部署吧,k8s 肯定是不能用了,据说腾讯云最近搞活动 研究了下活动内容, 花了 526 买了台 1 核 1G 200M 宽带的机器三年...

    2 3

    心里美滋滋,比首页的活动优惠并且配置还更好

    复制粘贴没多久就搭好服务,解析域名,咱域名可是有备案的

    虽然听说腾讯云和阿里云的备案是分开的, 想想再复杂能复杂到哪去。。悻悻的解析好域名,期望运气差的不会是我

    果不其然,隔两天上去就发现被封了

    4

    那就老实备案吧

    5

    没多久第一个问题就出来了

    6

    备案密码是什么鬼。怎么一点印象都没

    7

    翻文档才想起来备案成功后有个短信告诉密码。。拿到后没用过就没了印象, 只能找回密码

    8

    信息需要填的不多,很快就提示操作成功,我就不吐槽网站的 UI 了。

    再后来发现如果是在上海备案的机器,迁移备案也必须填写上海地址,电话以及上海户口(或者居住证)

    碰巧居住证过期了没有续期。。。。。。

    心痛。。结论,迁移备案比直接备案痛苦多了。。。

    那就换一条路,注册一个新域名,本想等着 app 域名发布, 后来想到域名备案还不支持 app 域名,果断放弃

    机智的花了 248 买了个 iiip.co 域名,

    9

    这会不用忍受迁移备案的痛苦了,美滋滋

    10 11 12 13

    万念俱灰。遂买了个香港阿里云静静的搭好服务器....


    如果不用备案。这篇文章应该是这样

    写好代码

    add_header Access-Control-Allow-Origin *; # 允许跨域访问
    content_by_lua '
        ngx.say(ngx.var.remote_addr) # 返回客户端 IP 地址
    ';
    

    搭好服务

    完。。。

    第 1 条附言  ·  2018-05-09 15:25:27 +08:00

    新增支持https访问。。

    发现 https 的网站通过 ajax 请求 http 的会无法发起请求。估计是chrome的新特性,所以现在加了对https的支持

    通过阿里云的 loadbalance 实现的,顺便也可以看到这个小接口的访问情况

    curl -v https://iiip.co

    不过在使用中发现 https 间歇性的不能访问。。估计是遇到了跨境公网访问中不可描述的原因。。http不会出现这种问题。。我会继续监测下去的。

    1

    代码也更新了下,参考了 @ywgx 的意见

    add_header Access-Control-Allow-Origin *;
    content_by_lua '
          ngx.say(ngx.var.http_x_forwarded_for or ngx.var.remote_addr)
    ';
    
    65 条回复    2018-05-10 11:06:47 +08:00
    mofe
        1
    mofe  
    OP
       2018-05-08 19:11:39 +08:00
    额,悻悻的附上新写的博客的链接。。。https://www.mofe.me/2018/0508/
    huiyifyj
        2
    huiyifyj  
       2018-05-08 19:15:21 +08:00 via Android
    233😂
    看来备案转移确实麻烦。emm 下回转移会掂量着点。
    songz
        3
    songz  
       2018-05-08 19:16:49 +08:00   ❤️ 1
    一篇文章就这么被那些表情毁了
    mofe
        4
    mofe  
    OP
       2018-05-08 19:19:04 +08:00
    @songz 图片没有缩放。。的确不容易排版。但是只有表情才能表达我的心情。。
    mofe
        5
    mofe  
    OP
       2018-05-08 19:21:03 +08:00
    @songz 没啥干货。。

    精简版在这。。。https://www.mofe.me/2018/0504/
    ichuan
        6
    ichuan  
       2018-05-08 19:21:06 +08:00   ❤️ 2
    不错,个人常用的一个是:

    $ curl httpbin.org/ip
    {
    "origin": "1.2.3.4"
    }
    XSugar
        7
    XSugar  
       2018-05-08 19:21:22 +08:00 via iPhone
    开 https 就不用备案了
    mofe
        8
    mofe  
    OP
       2018-05-08 19:24:21 +08:00
    开 https 获取个 ip 输入的字母就多了。。curl 默认不会重定向。。。
    moult
        9
    moult  
       2018-05-08 19:24:31 +08:00
    其实这种服务可以直接用 SAE 跑,完全不需要单独搞一台服务器。
    mofe
        10
    mofe  
    OP
       2018-05-08 19:32:51 +08:00
    @moult 赞。。 不过 SAE 存在感好低。。想到自己有 k8s 集群就没考虑过同类的产品。。
    mofe
        11
    mofe  
    OP
       2018-05-08 19:37:28 +08:00
    @ichuan httpbin.org 不开代理好像没法访问。。
    crbee
        12
    crbee  
       2018-05-08 19:44:20 +08:00
    是按流量计费的么?
    valorachen
        13
    valorachen  
       2018-05-08 19:44:36 +08:00
    这是腾讯云什么活动?能给个链接吗?我好像找不到额
    imdong
        14
    imdong  
       2018-05-08 19:46:07 +08:00
    偷偷告诉楼主,根据协议原理,没备案的域名用 https 也不会被发现的。
    litter123
        15
    litter123  
       2018-05-08 19:47:13 +08:00
    获取公网 IP,写一个 PHP 就行了,$_SERVER['REMOTE_ADDR'],然后在 web 服务器设置允许的域名
    tangzipeng
        16
    tangzipeng  
       2018-05-08 19:54:40 +08:00
    @imdong 难怪我前阵子域名没备案,一直可以用……
    bzq2810
        17
    bzq2810  
       2018-05-08 20:00:14 +08:00 via iPhone
    curl ip.cn
    curl ipinfo.io
    mofe
        18
    mofe  
    OP
       2018-05-08 20:06:24 +08:00
    @crbee 估计按流量会更优惠,所以搞的按流量收费
    mofe
        19
    mofe  
    OP
       2018-05-08 20:07:34 +08:00
    @valorachen 两个优惠叠加诶,包年本来就有优惠,然后实名认证之后送的优惠券是可以叠加使用的,所以算下来比官网的优惠力度还要大,而且官网的宽带小水管,还是系列 1 的机器。。
    mofe
        20
    mofe  
    OP
       2018-05-08 20:10:24 +08:00
    @litter123 如果要比性能,openresty 应该比 PHP 会更快。。毕竟 cloudflare 之前用的就是 openresty

    1 核 1G 的机器在从上海访问上海平均十几毫秒
    mofe
        21
    mofe  
    OP
       2018-05-08 20:12:28 +08:00
    @bzq2810 ipinfo.io 好像要梯子才能访问, ip.cn 返回的内容有点杂,并且不能在浏览器里发起请求。。
    litter123
        22
    litter123  
       2018-05-08 20:20:15 +08:00
    @mofe #20 就获取个变量,又不用运算不用追求什么性能,千万并发又如何
    mofe
        23
    mofe  
    OP
       2018-05-08 20:51:38 +08:00
    @litter123 哈哈,也是,当时主要是觉得 openresty 很好玩,性能又很快,部署也方便
    qq316107934
        24
    qq316107934  
       2018-05-08 21:15:35 +08:00 via Android
    @mofe 200M 这么便宜简直了...去找找去,要毕业了要没学生云用了
    mofe
        25
    mofe  
    OP
       2018-05-08 21:18:19 +08:00
    @qq316107934 为了防止误导,解释下这是按流量收费的 200M。。
    mofe
        26
    mofe  
    OP
       2018-05-08 21:22:28 +08:00   ❤️ 2
    @qq316107934 其实 1M 宽带也有办法变成 200M 的,阿里云的方法就是在前面挂一个 tcp 的 LoadBalance,后端挂那个 1M 的机器,收费和按量收费一样,还多一个 IP..
    xsn
        27
    xsn  
       2018-05-08 21:24:26 +08:00
    showfom

    Example (Plain text): https://api.ip.sb/ip
    Example (curl): curl ip.sb
    afpro
        28
    afpro  
       2018-05-08 21:30:18 +08:00
    qinxi
        29
    qinxi  
       2018-05-08 22:55:37 +08:00 via Android
    这种东西,,,lambda 就行了吧
    xfspace
        30
    xfspace  
       2018-05-08 23:24:01 +08:00 via Android
    。。。
    ip.la 了解下
    SingeeKing
        31
    SingeeKing  
       2018-05-08 23:28:34 +08:00
    curl ip.sb
    flynaj
        32
    flynaj  
       2018-05-09 01:33:39 +08:00 via Android
    httpbin.org 是开源的,部署到服务器上改一下端口
    appdomain
        33
    appdomain  
       2018-05-09 01:49:38 +08:00 via iPhone
    nginx 取
    ywgx
        34
    ywgx  
       2018-05-09 07:55:45 +08:00 via Android
    难道没有人发现,楼主提供的获取真实 IP 是错误的方法吗? 业务前有代理呢? 比如有 WAF, 或者高防设备呢? 幼稚啊
    2010
        35
    2010  
       2018-05-09 08:29:20 +08:00 via Android
    楼上的问题~X-Forwarded-For 字段
    isCyan
        36
    isCyan  
       2018-05-09 08:56:48 +08:00
    526 是用了 500 块的券?哪里有的?
    gsw945
        37
    gsw945  
       2018-05-09 09:05:02 +08:00
    不知道 ipify?
    gsw945
        38
    gsw945  
       2018-05-09 09:14:08 +08:00
    ipfy ( A Simple Public IP Address API ):
    官网(展示了各种在各种语言中调用): https://www.ipify.org
    Github (开源的,go 开发的): https://github.com/rdegges/ipify-api
    api 调用(支持纯 ip 字符串、json 和 jsonp 方式):
    纯字符串格式: https://api.ipify.org/
    json 格式: https://api.ipify.org/?format=json
    jsonp 格式: https://api.ipify.org?format=jsonp&callback=getip
    ywgx
        39
    ywgx  
       2018-05-09 09:48:25 +08:00
    楼主 local ip=headers["X-REAL-IP"] or headers["X_FORWARDED_FOR"] or ngx.var.remote_addr or "-"
    qnwx1
        40
    qnwx1  
       2018-05-09 09:50:57 +08:00
    关键词:“公网 ip ”内容已经被我们记录。根据 2017 年 7 月最新出台的《互联网发言管理认证条例》, 由于您违反其中相关规定,已经被列入 2018 年网络通缉人员名单,您的 IP 已经锁定。 有关部门正在组织网络技术相关人员对您的资料搜集工作及相关惩罚措施的。在这里,希望您可以主动前往当地执法机关投案自首。
    (
    satanandroid
        41
    satanandroid  
       2018-05-09 09:58:07 +08:00
    frp
    mofe
        42
    mofe  
    OP
       2018-05-09 10:09:18 +08:00
    @ywgx 我自己搭建了一个 k8s 集群,之所以要买新服务器就是为了不挡住真实的 ip。。
    mofe
        43
    mofe  
    OP
       2018-05-09 10:12:37 +08:00
    @2010 事实上我的 k8s 集群会自动管理 https 证书,所以 Loadbalance 必须得用 tcp,所以没有 X-Forwarded-For 字段,并没有测试过阿里云的 tcp Loadbalance 可不可以 forward 真实 ip 进来。。但能 forward 进来也不符合我需求的场景,因为还有一层 ingress 控制器挡在服务前面,解决问题最简单的方式就是前段传一个真实 ip 进来就行,所以选择了最简单的方式,哈哈
    mushan099
        44
    mushan099  
       2018-05-09 10:13:43 +08:00
    看完楼主的帖子我决定打死也不入国内主机了。。。
    mofe
        45
    mofe  
    OP
       2018-05-09 10:16:17 +08:00
    @isCyan 用的是满 1000 减 500 的券,实名认证就有

    @qnwx1 心痛到无法呼吸。。。
    LukeChien
        46
    LukeChien  
       2018-05-09 10:17:22 +08:00 via Android
    前端用 jsonp 就好了,新浪搜狐都有 js 接口,返回 IP 地址和归属地
    aru
        47
    aru  
       2018-05-09 10:23:16 +08:00
    mofe
        48
    mofe  
    OP
       2018-05-09 10:23:31 +08:00
    @mushan099 哈哈,只是吐槽一下,国内主机还是可以入的,只是需要注意一些小坑

    比如某些域名不能备案
    某些地区备案有一些特殊的规定,类似上海必须要上海户口或者居住证,使用上海本地的电话和住址。
    并且用小本本记录好之前备案的所有信息
    而且新备其实比迁移备案要舒服些的。是我自己给自己留的坑。。。

    国内云还是有很多优势的,国外的服务器很有可能在某些天访问特别不稳定。。
    ety001
        49
    ety001  
       2018-05-09 12:24:26 +08:00
    Harry1993
        50
    Harry1993  
       2018-05-09 12:29:19 +08:00   ❤️ 1
    dig +short myip.opendns.com @resolver1.opendns.com
    Arnie97
        51
    Arnie97  
       2018-05-09 12:35:46 +08:00 via Android
    /t/451784 自己挑吧
    opengps
        52
    opengps  
       2018-05-09 13:38:26 +08:00
    如果只是获取 ip,直接访问服务器 ip 就行了,服务器直接返回客户端 ip
    mofe
        53
    mofe  
    OP
       2018-05-09 13:50:07 +08:00
    查了一下,阿里云的 TCP LoadBalance 不会挡住用户的真实 ip,https://www.alibabacloud.com/help/zh/doc-detail/54007.htm
    AppxLite
        54
    AppxLite  
       2018-05-09 14:13:38 +08:00
    楼主,我这个域名很适合你哦,转给你吧。

    ipv.app
    Qiss
        55
    Qiss  
       2018-05-09 14:38:56 +08:00
    <?
    $iipp=$_SERVER["REMOTE_ADDR"];
    echo $iipp;
    ?>

    这个是拍黄片的
    mofe
        56
    mofe  
    OP
       2018-05-09 14:42:10 +08:00
    @AppxLite 我买了一个 jumpto.app ...
    xidadada
        57
    xidadada  
       2018-05-09 15:02:59 +08:00
    花了 526 买了台 1 核 1G 200M 宽带的机器三年?????? 200m 宽带 3 年 5 百块?????重点在这里,怎样做到的,v2ex 网站宽带估计都没有 200m 吧?
    AppxLite
        58
    AppxLite  
       2018-05-09 15:06:13 +08:00
    @mofe 那个难记啊,ipv.app 好记不贵,ipv4 ipv6 ipv*
    mofe
        59
    mofe  
    OP
       2018-05-09 15:31:29 +08:00
    @xidadada 实名认证送好多张券,用了满 1000 减 500 的券,叠加买三年的优惠。。所以就很便宜,200M 是按流量收费的

    @AppxLite 额。。暂时还不想换域名。。。
    460881773
        60
    460881773  
       2018-05-09 15:33:35 +08:00
    现在 还能上车吗 200M 的带宽!!
    AppxLite
        61
    AppxLite  
       2018-05-09 15:41:38 +08:00
    原价 push 给你咯
    xidadada
        62
    xidadada  
       2018-05-09 15:47:23 +08:00
    @mofe 吓死,按流量收费就不要说 200m,按流量我还开到 1g 呢,还以为是固定宽带 200m
    mofe
        63
    mofe  
    OP
       2018-05-09 15:53:42 +08:00
    @460881773 200M 按流量收费。。。

    @xidadada 我上面回复了是流量 😂

    @AppxLite 我不想再花更多钱在这个服务上了。。本来就是公益项目。。如果你想玩可以把 cname 指过来,不用买服务器,我给你配置个 server_name ...
    panzhc
        64
    panzhc  
       2018-05-09 17:04:53 +08:00
    只要 nginx 就足够了,curl ip.qaros.com ,支持 https
    location / {
    default_type html;
    return 200 "$remote_addr";
    }
    JoyChou
        65
    JoyChou  
       2018-05-10 11:06:47 +08:00
    一句话就能写完的,要写这么多,楼主辛苦了…
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   982 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 21:59 · PVG 05:59 · LAX 13:59 · JFK 16:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.