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

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

  •  
  •   cpj ·
    cpj001 · 2019-08-05 15:59:22 +08:00 · 5291 次点击
    这是一个创建于 1717 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    24 条回复    2019-08-07 09:41:25 +08:00
    jingxyy
        1
    jingxyy  
       2019-08-05 16:19:22 +08:00
    配置文件里写:
    server_name <nginx 机器的内网 ip>
    ....
    这样如何?这样可以免去配置网段的麻烦 但你还得好好鼓捣一下如何来做到只限制一个应用的某一个接口
    flyoungstudio
        2
    flyoungstudio  
       2019-08-05 16:32:52 +08:00
    这个服务独占某个端口的话可以在防火墙上限制,仅允许某网段访问某端口
    MonoLogueChi
        3
    MonoLogueChi  
       2019-08-05 16:36:09 +08:00 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;

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

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

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

    二次验证: 参考 auth_request 模块


    上面所有的前提:
    1. 服务端仅对代理机器开放
    2. 你的代理机 /服务端的加密 /签名逻辑 别人未知
    cpj
        20
    cpj  
    OP
       2019-08-06 13:16:52 +08:00
    got it
    cpj
        21
    cpj  
    OP
       2019-08-06 13:17:43 +08:00
    @aqqwiyth ojbk
    MonoLogueChi
        22
    MonoLogueChi  
       2019-08-06 14:07:51 +08:00 via Android
    @aqqwiyth 但是你这样作要前端配合吧
    aqqwiyth
        23
    aqqwiyth  
       2019-08-06 18:47:30 +08:00
    @MonoLogueChi 不需要前端 /后端配合,, 题主说了是公司内网. 公司内网里面 DNS 与出口都是绝对可控的.

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

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