本来打算在代码里获取 IP,通过正则判断是否为公司内网。后来发现,网段太多。。。 不知道 nginx 可否实现,只限制某一条接口通过内网访问,其他接口正常访问 或者有其他更好的解决方案
1 jingxyy 2019-08-05 16:19:22 +08:00 配置文件里写: server_name <nginx 机器的内网 ip> .... 这样如何?这样可以免去配置网段的麻烦 但你还得好好鼓捣一下如何来做到只限制一个应用的某一个接口 |
2 flyoungstudio 2019-08-05 16:32:52 +08:00 这个服务独占某个端口的话可以在防火墙上限制,仅允许某网段访问某端口 |
3 MonoLogueChi 2019-08-05 16:36:09 +08:00 via Android ![]() 网段太多是什么意思,公司内网用了公网 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 2019-08-05 16:37:59 +08:00 1. 如果一个字符串为 IP,判断 ip 是否属于某个范围最好的方式不是正则表达式,可以了解下子网掩码,相信你会有收获。 2. ip 限制这个最好还是 iptables+ipset 来做 |
5 MonoLogueChi 2019-08-05 16:38:30 +08:00 via Android @MonoLogueChi #3 补充,如果只限制某个或者某些接口,就先用 location 匹配接口的路由,然后再限制 |
6 catcalse 2019-08-05 16:38:37 +08:00 nginx local /data { allow 127.0.0.1; deny all; } |
8 cpj OP @MonoLogueChi 问了运维只好先这样 |
9 cpj OP @MonoLogueChi 但是这样会不会有一个问题,请求进来的 IP 在内部转发,被处理成本地的 |
10 aqqwiyth 2019-08-05 17:46:59 +08:00 ![]() 内网--->代理机器-->代理追加特殊 header--->真实服务端--验证是否存在特殊 header 追加--->完毕 不走你的代理机器就访问不了 |
13 MonoLogueChi 2019-08-05 19:10:09 +08:00 via Android @aqqwiyth x-forwarded-for 是用于记录代理过程的,每一次代理的 IP 都会记录,x-real-ip 用于获取真实 ip |
14 rubycedar 2019-08-05 19:19:48 +08:00 via iPhone @MonoLogueChi header 头可以伪造的 |
15 MonoLogueChi 2019-08-05 19:26:19 +08:00 via Android @rubycedar X-Real-IP=$remote_addr 服务端设置成远程 IP,这样就能避免客户端伪造 IP 了 |
![]() | 16 luziafy 2019-08-06 09:17:15 +08:00 via Android 用中间件控制 |
![]() | 17 cyril4free 2019-08-06 09:25:56 +08:00 搞个网关? |
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. 你的代理机 /服务端的加密 /签名逻辑 别人未知 |
20 cpj OP got it |
22 MonoLogueChi 2019-08-06 14:07:51 +08:00 via Android @aqqwiyth 但是你这样作要前端配合吧 |
23 aqqwiyth 2019-08-06 18:47:30 +08:00 @MonoLogueChi 不需要前端 /后端配合,, 题主说了是公司内网. 公司内网里面 DNS 与出口都是绝对可控的. 如果有运维参与的话, 开发完全不感知这个过程. 我用一个链路描述一下: 改造前: 前端请求--->nginx---->真实服务端 改造后: 前端请求(无感知)----内网 DNS---->内部 nginx(追加标识)----->服务端 nginx(验证标识,并卸载放行)----->真实服务端(无感知) |
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 都会增加一条记录,记录上一层请求发出的来源 |