本来打算在代码里获取 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 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 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 1
内网--->代理机器-->代理追加特殊 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 都会增加一条记录,记录上一层请求发出的来源
|