浅谈外网通过反向代理访问内网资源时的权限保护
标题可能有些绕口,意思就是我在外网要访问内网一资源(比如网站)时需要身份验证,只有通过身份验证才能访问,这个该如何实现?
其实这是一朋友问我的一个问题,需求就是:
领导在外出差,要通过企业微信访问内网资源,而这个资源又是高度保密的,不能随便让别人看到,公司又不提供VPN等工具,要如何实现?
我觉得这个需求蛮有意思的,就去深入思考了一下。我们知道,微信开发很多情况下是需要绑定域名的,那么绑定域名的情况下又要访问内网资源,很容易让人想到反向代理。所以,要实现这个需求,通过反向代理是必须的,问题就是,如何进行身份验证?今天会介绍两种 方式,一种使用Apache服务器+验证模块(这里利用Java Web的Servlet,实现的语言不唯一)实现,另外一种使用内网穿透工具,frp实现。
Apache实现
测试环境
Apache 2.2.31
JDK 1.8
IntelliJ IDEA 15
实现思路
首先,Apache服务器要架设在一台内外网都可访问的计算机上。
这个问题其实我想了蛮久的,最早想的是通过Apache服务器自带的验证模块,也就是记录用户名和密码到.htaccess文件,但是发现,这个只适用于架设在本机上的网站项目,通过反向代理就没用了。后来想到可以利图片防盗链的思路,我们在做防盗链时,常会判断请求HTTP头里是否有诸如HTTP_REFERER之类的参数,然后根据这个参数进行重定向。我们在实现访问权限控制时不妨也效仿它,整体思路都一样,不一样的地方就是在访问页面前进行授权,授权通过之后加上某个HTTP头,表示授权成功。
需求
假设我所在的公司开发了一套新的API,还没有开发完毕,不能随便公开,现在领导外出开会,需要对客户展示。(但是公司又不提供VPN)
实现步骤
Apache的httpd.conf文件配置
需要开启Apache的mod_rewrite模块。
Apache支持检测的HTTP头如下:
我这次就使用HTTP_REFERER头吧
Apache的反向代理设置如下:
<VirtualHost *:80> ServerName api.example.comServerAlias api.example.comRewriteEngine OnRewriteCond %{HTTP_REFERER} !^http://api.example.com/RewriteRule ^(.*)$ http://www.baidu.com/ [R=401] ProxyPreserveHost OnProxyRequests OffProxyPass / http://127.0.0.1:8080/api/sdk/ProxyPassReverse / http://127.0.0.1:8080/api/sdk/
</VirtualHost>
这里解释一下意思:
当对api.example.com发起请求时,Apache会检测请求头中是否有HTTP_REFERER,如果有,值是否以http://api.example.com/开头,如果不是,则401强制外部重定向到百度,其实你根本看不到百度的页面,只会看到401 Forbidden。
那为什么要判断HTTP_REFERER是否以http://api.example.com/呢?其实,当我们每次对api.example.com发起请求时,包括对子页面,Apache都会进行拦截,它会对每次的请求头进行检查,如果不符合就会直接返回401。所以,这个要观察子站点,看一下子站点是不是在页面见跳转时都会带HTTP_REFERER头,如果有的话就要按照它里面的规则来,验证成功后的入口页面的请求头要设置成一样的。否则我们永远只能看到一个页面了,页面间一旦跳转,就会401。
Apache的重写规则可以自行百度一下,这里推荐一篇简单的Apache的Rewrite规则详细介绍,里面关于重写标志的总结还是蛮清楚的。
Java端的编写
首先是Servlet
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;/*** Created by Martin Huang on 2018/5/16.*/
public class ProxyServlet extends HttpServlet {@Overrideprotected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//在这里进行验证授权resp.addHeader("REFERER","http://api.example.com/");resp.sendRedirect("http://api.example.com/");}
}
然后是HTML页面,这里比较简单,我直接使用一个a标签进行代替,主要是为了演示效果
<html>
<body>
<h2>Hello World!</h2>
<br/>
<a href="proxyServlet">Jump</a>
</body>
</html>
最后是web.xml中Servlet的配置
<servlet><servlet-name>proxyServlet</servlet-name><servlet-class>com.example.servlet.ProxyServlet</servlet-class></servlet><servlet-mapping><servlet-name>proxyServlet</servlet-name><url-pattern>/proxyServlet</url-pattern></servlet-mapping>
效果
未授权情况下:
可以发现子页面也是无法访问的
授权后:
子页面也是可以访问的
存在的问题
- 页面直接只能通过点击链接的方式跳转,不能直接输入地址栏,否则依然401
- HTTP_REFERER的值一旦被他人知道的话就容易使用第三方工具破解了
frp的实现(推荐)
对于访问网站的权限控制,我还是比较推荐frp的,毕竟这是一个开源项目,已经经过多个版本的迭代,安全性也好。
frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp, http, https 协议。
frp的文档点这里
实现步骤
搭建、配置可以见这篇文章LINUX | frp内网穿透穿透服务器
这里我们只关心网站访问的授权
frpc.ini配置文件如下:
[common]
server_addr = x.x.x.x #frp服务器IP
server_port = 7000 #与服务器进行通信的端口[web01]
type = http
local_ip = 127.0.0.1
local_port = 80
http_user = abc #用于授权的用户名
http_pwd = abc #用于授权的密码
custom_domains = api.example.com
注:
我在服务器上设置了5520为web的访问端口,所以我利用api.example.com:5520进行访问
效果
访问时会让你输入用户名和密码进行验证,子页面也会。它这个验证是session级别的,也就是说如果浏览器关闭后要重新进行验证。
浅谈外网通过反向代理访问内网资源时的权限保护相关推荐
- NetOk(免费反向代理)+访问内网网站
我们需要使用到的工具软件 NetOk(免费反向代理)( https://netok.link/a/download/) 首先我们需要将工具软件拷贝到需要进行远程调试的电脑上,进行一些简单配置,既可使用 ...
- 红蓝对抗之隧道技术第一篇(内网穿透、端口映射端口转发、Netsh端口转发、CS正反向连接多层内网、Burp设置上游代理访问内网、MSF protfwd端口转发/重定向)
文章目录 隧道应用 端口映射&端口转发 Netsh端口转发 Netsh端口转发meterpreter CS正向连接多层内网 CS反向连接多层内网 Burp设置上游代理访问内网 MSF prot ...
- 用ssh反向连接访问内网主机 ( 实例使用autossh隧道实现mysql的同步 )
一.准备知识 什么是autossh? 假设有两台主机: A主机为外网,B主机为内网 通常来说外网主机A是无法直接连接到内网主机B的,这时如果要实现A主机通过ssh控制B主机,通常来说有 两种方法: 1 ...
- 宿主机使用虚拟机中的全局代理访问内网
如何让宿主机使用虚拟机中的全局代理访问内网 背景 方法 配置VirtualBox 虚拟机下网络配置 最后的操作 背景 因为公司使用的 VPN 只有 Windows 客户端,所以只好在虚拟机中的 Win ...
- OpenWrt路由配置Openνρη服务器访问内网资源
OpenWrt路由配置Openνρη服务器访问内网资源(LuCI界面实现) 本篇文章想表达的意思是把OpenWrt路由器作为Openνρη服务端,就相当于一个服务器,然后手机/iPad/电脑需作为客户 ...
- ew通过socks5一层代理-访问内网二层网络-实战篇
文章目录 0x01网络拓扑 0x02背景介绍 0x03 ew一层代理(正向) 一.window server配置 二.测试连接 0x04 ew一层代理(反向) 一.kali配置 二.win serve ...
- IDEA配置:使用代理访问内网服务器
由于公司电脑的防火墙除了80和443之外都封了,使用IDEA无法连接线上集群,经过摸索,一个简便的方式是设置IDEA的虚拟机参数,即 VM options参数,示例: -DsocksProxyHost ...
- python内网穿透 开源_反向代理和内网穿透
概念 反向代理看上去看深奥,其实不然,只是因为汉语言文化的差异导致它看上去深奥.一般反派感觉都比较厉害和神秘. 要理解反向代理,我们就不得不说一下正向代理. 正向代理 (Forward Proxy) ...
- 阿里云服务器ECS利用反向代理FRP内网穿透
阿里云ECS利用反向代理 F#R#P 内@网@穿@透 FRP 服务端搭建 内网PC 客户端搭设(windows版本) 远程连接 内网PC 客户端搭设(linux版本) 远程连接 过程问题 1.Wind ...
- google浏览器 Proxy SwitchyOmega 插件设置代理访问内网服务器
通过代理实现访问内网系统 https://www.cnblogs.com/gwxaizxh/p/10455313.html 通过socks5方式连接内网服务器 1. 设置隧道 使用远程登陆工具,如se ...
最新文章
- 微服务认证模式_微服务之“网关模式”
- Python3 基础学习笔记 C03【操作列表】
- mysql-5.5.56配置_mysql 5.5.56免安装版配置方法
- zzulioj1111: 多个整数的逆序输出(函数专题)
- 数据科学、人工智能TED演讲TOP 10
- make,make install命令
- 销售流程图_34页财务管理制度和流程图!让你明白会计工作要点,总结全面清晰...
- Android Multimedia框架总结(十二)CodeC部分之OMXCodec与OMX事件回调流程
- 《C Primer Plus(第6版)中文版》一2.12 编程练习
- . mindoc linux amd64,搭建minDoc文件接口服务器
- Java将html转换PDF文件
- 「详解」torch.nn.Fold和torch.nn.Unfold操作
- 如何辅导孩子做学前班数学题?
- 云锁和安全狗哪个好 Bypass阿里云盾、百度云加速、安全宝、安全狗、云锁、360主机卫士SQL注入防御-系统/上网/安全
- html 淡入淡出效果,css3 transition实现淡入淡出效果 - 小俊学习网
- 破解神器Hashcat使用简介
- R语言基础—频数与相对频率计算
- 2.3 数值分析: 矩阵三角分解法
- Java的Mysql数据库的面试题
- 英语48个音标的快速记忆法