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

2019-08-05 15:59:22 +08:00
 cpj

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

5315 次点击
所在节点    程序员
24 条回复
jingxyy
2019-08-05 16:19:22 +08:00
配置文件里写:
server_name <nginx 机器的内网 ip>
....
这样如何?这样可以免去配置网段的麻烦 但你还得好好鼓捣一下如何来做到只限制一个应用的某一个接口
flyoungstudio
2019-08-05 16:32:52 +08:00
这个服务独占某个端口的话可以在防火墙上限制,仅允许某网段访问某端口
MonoLogueChi
2019-08-05 16:36:09 +08:00
网段太多是什么意思,公司内网用了公网 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
2019-08-05 16:37:59 +08:00
1. 如果一个字符串为 IP,判断 ip 是否属于某个范围最好的方式不是正则表达式,可以了解下子网掩码,相信你会有收获。
2. ip 限制这个最好还是 iptables+ipset 来做
MonoLogueChi
2019-08-05 16:38:30 +08:00
@MonoLogueChi #3 补充,如果只限制某个或者某些接口,就先用 location 匹配接口的路由,然后再限制
catcalse
2019-08-05 16:38:37 +08:00
nginx
local /data {

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

不走你的代理机器就访问不了
cpj
2019-08-05 18:08:19 +08:00
@aqqwiyth 这个阔以
aqqwiyth
2019-08-05 18:12:35 +08:00
@cpj 因为我经常这么干. 不过一般会在代理机器 nginx 上加入二次动态验证. 用来追踪请求
MonoLogueChi
2019-08-05 19:10:09 +08:00
@aqqwiyth x-forwarded-for 是用于记录代理过程的,每一次代理的 IP 都会记录,x-real-ip 用于获取真实 ip
rubycedar
2019-08-05 19:19:48 +08:00
@MonoLogueChi header 头可以伪造的
MonoLogueChi
2019-08-05 19:26:19 +08:00
@rubycedar X-Real-IP=$remote_addr
服务端设置成远程 IP,这样就能避免客户端伪造 IP 了
luziafy
2019-08-06 09:17:15 +08:00
用中间件控制
cyril4free
2019-08-06 09:25:56 +08:00
搞个网关?
cpj
2019-08-06 09:34:48 +08:00
@aqqwiyth @rubycedar 说 header 头可以伪造,你说的二次动态验证具体是什么呢
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
2019-08-06 13:16:52 +08:00
got it

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/589229

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX