首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  程序员

限制某个接口只能通过公司内网访问

  •  
  •   cpj · 129 天前 · 2210 次点击
    这是一个创建于 129 天前的主题,其中的信息可能已经有所发展或是发生改变。

    本来打算在代码里获取 IP,通过正则判断是否为公司内网。后来发现,网段太多。。。 不知道 nginx 可否实现,只限制某一条接口通过内网访问,其他接口正常访问 或者有其他更好的解决方案

    24 回复  |  直到 2019-08-07 09:41:25 +08:00
        1
    jingxyy   129 天前
    配置文件里写:
    server_name <nginx 机器的内网 ip>
    ....
    这样如何?这样可以免去配置网段的麻烦 但你还得好好鼓捣一下如何来做到只限制一个应用的某一个接口
        2
    flyoungstudio   129 天前
    这个服务独占某个端口的话可以在防火墙上限制,仅允许某网段访问某端口
        3
    MonoLogueChi   129 天前 via Android   ♥ 1
    网段太多是什么意思,公司内网用了公网 IP ?如果没使用公网 IP,只要判断是否是局域网 IP 就可以了,都是连续的一段,直接比较大小就能判断出来,不需要正则匹配。

    如果是 Nginx 的话,可以使用 ngx_http_access_module

    allow 192.168.0.0/16;
    allow 172.16.0.0/12;
    allow 10.0.0.0/8;

    如果你们公司网络环境特别复杂的话,当我前面什么都没说。
        4
    gesse   129 天前
    1. 如果一个字符串为 IP,判断 ip 是否属于某个范围最好的方式不是正则表达式,可以了解下子网掩码,相信你会有收获。
    2. ip 限制这个最好还是 iptables+ipset 来做
        5
    MonoLogueChi   129 天前 via Android
    @MonoLogueChi #3 补充,如果只限制某个或者某些接口,就先用 location 匹配接口的路由,然后再限制
        6
    catcalse   129 天前
    nginx
    local /data {

    allow 127.0.0.1;
    deny all;
    }
        7
    cpj   129 天前
    @catcalse 嗯嗯 目前先用的这种方法
        8
    cpj   129 天前
    @MonoLogueChi 问了运维只好先这样
        9
    cpj   129 天前
    @MonoLogueChi 但是这样会不会有一个问题,请求进来的 IP 在内部转发,被处理成本地的
        10
    aqqwiyth   129 天前   ♥ 1
    内网--->代理机器-->代理追加特殊 header--->真实服务端--验证是否存在特殊 header 追加--->完毕

    不走你的代理机器就访问不了
        11
    cpj   129 天前
    @aqqwiyth 这个阔以
        12
    aqqwiyth   129 天前
    @cpj 因为我经常这么干. 不过一般会在代理机器 nginx 上加入二次动态验证. 用来追踪请求
        13
    MonoLogueChi   129 天前 via Android
    @aqqwiyth x-forwarded-for 是用于记录代理过程的,每一次代理的 IP 都会记录,x-real-ip 用于获取真实 ip
        14
    rubycedar   129 天前 via iPhone
    @MonoLogueChi header 头可以伪造的
        15
    MonoLogueChi   129 天前 via Android
    @rubycedar X-Real-IP=$remote_addr
    服务端设置成远程 IP,这样就能避免客户端伪造 IP 了
        16
    luziafy   128 天前 via Android
    用中间件控制
        17
    cyril4free   128 天前
    搞个网关?
        18
    cpj   128 天前
    @aqqwiyth @rubycedar 说 header 头可以伪造,你说的二次动态验证具体是什么呢
        19
    aqqwiyth   128 天前
    @cpj @MonoLogueChi 我说的是自定义 header 不是你说的代理 IP.
    比如我增加一个 x-v2ex-com: xxx 服务端验证这个 x-v2ex-com 就行了.
    简单点这个 xxx 是固定的. 复杂点接入 lua 做成动态的 时间戳+密钥 +md5 签名

    二次验证: 参考 auth_request 模块


    上面所有的前提:
    1. 服务端仅对代理机器开放
    2. 你的代理机 /服务端的加密 /签名逻辑 别人未知
        20
    cpj   128 天前
    got it
        21
    cpj   128 天前
    @aqqwiyth ojbk
        22
    MonoLogueChi   128 天前 via Android
    @aqqwiyth 但是你这样作要前端配合吧
        23
    aqqwiyth   128 天前
    @MonoLogueChi 不需要前端 /后端配合,, 题主说了是公司内网. 公司内网里面 DNS 与出口都是绝对可控的.

    如果有运维参与的话, 开发完全不感知这个过程.

    我用一个链路描述一下:
    改造前:
    前端请求--->nginx---->真实服务端
    改造后:
    前端请求(无感知)----内网 DNS---->内部 nginx(追加标识)----->服务端 nginx(验证标识,并卸载放行)----->真实服务端(无感知)
        24
    MonoLogueChi   127 天前
    @aqqwiyth 这不跟我说的是一回事吗,前端请求 -> nginx 代理(设置 header 头 X-Real-IP=$remote_addr,同时会自动记录 X-Forwarded-For) -> 经历 N 层代理 -> 后端。从得到前端请求的代理服务器到最后和后端对接的代理服务器,中间会一直带着这两个 header 头,X-Real-IP 记录的是前端发出请求的 IP,而每经过一层代理,X-Forwarded-For 都会增加一条记录,记录上一层请求发出的来源
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   982 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 21:08 · PVG 05:08 · LAX 13:08 · JFK 16:08
    ♥ Do have faith in what you're doing.