关于代理:Wireguard部署

Wireguard部署背景应用Wireguard做VPN服务,平安的拜访内网中的资源应用Docker Compose部署frps部署在公网服务器上部署Frp服务端,配置文件frps.ini如下 [common]bind_port = ${port}# validation, same in frpc.initoken = ***# dashboard configdashboard_port = ${dashboard_port}dashboard_user = ${user}dashboard_pwd = ${passwd}bind port是承受Frp客户端连贯的端口(留神在云服务配置界面的防火墙配置中关上对应的端口)token用来验证Frp客户端连贯的合法性dashboard_port是Frp提供的dashboard的拜访端口,能够查看连贯状况执行docker run --restart=always --network host -d -v ${PWD}/frps.ini:/etc/frp/frps.ini --name frps snowdreamtech/frps 部署Frp服务端dashboard拜访端口能够不裸露在公网中,参考端口映射服务端部署Docker Compose联合 Frp内网穿透裸露部署在内网的VPN服务,wireguard.yaml version: "2"services: vpn: image: place1/wg-access-server volumes: - wg-data:/data ports: - 51820:51820/udp - 8000:8000 restart: unless-stopped cap_add: - NET_ADMIN environment: - WG_ADMIN_PASSWORD=admin - WG_WIREGUARD_PRIVATE_KEY=... devices: - /dev/net/tun:/dev/net/tun frp: image: snowdreamtech/frpc restart: always volumes: - ./frpc.ini:/etc/frp/frpc.ini container_name: frpc network_mode: "host"volumes: wg-data:WG_WIREGUARD_PRIVATE_KEY局部能够间接应用Wireguard生成一个私钥进去 ...

April 26, 2022 · 1 min · jiezi

关于代理:在终端使用代理

本地应用 Clash 做 查看 clash 代理配置 能够看到 127.0.0.1:7890 同时反对 http、socks5 协定的代理 在终端中间接运行: export http_proxy="http://127.0.0.1:7890"export https_proxy="http://127.0.0.1:7890"或者走 socket5 协定的话 export http_proxy="socks5://127.0.0.1:7890"export https_proxy="socks5://127.0.0.1:7890"或者罗唆间接设置 all_proxy export all_proxy=socks5://127.0.0.1:7890上面测试下代理是否失效 先查看本机公网 ip curl cip.cc 配置代理后再次查看本机公网 ip export all_proxy=socks5://127.0.0.1:7890curl cip.cc 能够看出,两次的公网地址不一样 参考 https://zhuanlan.zhihu.com/p/...

April 26, 2022 · 1 min · jiezi

关于代理:WSL2连接到宿主Windows程序的网络代理设置

WSL2想要连上宿主机Windows里设置的网络代理端口很是蛋疼。 前置条件PS C:\Users\overlord> wsl -l -v NAME STATE VERSION* Ubuntu-20.04 Running 2获取Host和WSL的ip首先咱们须要获取WSL2的动静IP,再每次Windows零碎重启之后,它会动静给WSL2调配一个新IP。 所以能够写个脚本displayip.sh,来动静获取。 #!/bin/bashecho "Host ip: $(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }')"echo "WSL client ip: $(hostname -I | awk '{print $1}')"运行可查看以后Windows host主机ip、WSL的ip。 chmod +x displayip.sh ./displayip.shHost ip: 172.20.96.1WSL client ip: 172.20.99.149Windows应用的代理程序我用的Clash for Windows反对http和socks5代理。 代理端口为1081。 谬误尝试Windows Defender 里新增入站规定管理员权限ps运行: New-NetFirewallRule -DisplayName "WSL" -Direction Inbound -InterfaceAlias "vEthernet (WSL)" -Action Allow会在Windows Defender 防火墙里减少开启一条入站规定“WSL”。这条规定容许全副接口名为 vEthernet (WSL) ——也就是WSL2的入站连贯。 在WSL的bash里ping宿主主机,测试连通: ...

February 25, 2022 · 2 min · jiezi

关于代理:日常记录2

谬误记录proxy代理,在低版本node上报错问题 const a = obj => new Proxy({},{ get(target, p){ return obj; }})应用proxy,代理一个空对象{}时,如果在get办法中,返回的属性是{}没有的,底层就会调用getOwnPropertyDescriptor属性,进而呈现问题,比方报如下问题 须要解决

February 16, 2022 · 1 min · jiezi

关于代理:nps-搭建代理

参考: https://blog.csdn.net/Qwertyuiop2016/article/details/122079699在客户端一栏点新增客户端, 其中Basic认证用户名和Basic认证明码 示意代理时的用户名明码 再填一下备注,其余默认即可 增加实现后会有个客户端命令: ./npc -server=hengdin.com:8024 -vkey=dgcvwbad2umpr9w2 -type=tcp去 https://github.com/ehang-io/nps/releases 下载客户端可执行文件 如果是Linux下载linux_amd64_client.tar.gz,如果是Windows下载windows_amd64_client.tar.gz 解压之后有一个npc(npc.exe) 而后 Linux ./npc install -server=hengdin.com:8024 -vkey=dgcvwbad2umpr9w2 -type=tcpWindows cmd执行npc.exe install -server=hengdin.com:8024 -vkey=dgcvwbad2umpr9w2 -type=tcp接着就能够 npc start启动了, 这个时候看客户端列表应该曾经从离线变成在线了 点击http代理一栏,新增,服务器端口填一个不被占用的,比方2048,在用宝塔放通一下防火墙的这个端口(2048) 接着就能够用 http://user:passwd@hengdin.com:2048 这个代理了 socks5也是一样

January 4, 2022 · 1 min · jiezi

关于代理:Java基础动态代理

前言Mybatis的源码实现中,应用到了动静代理的设计思维,为了搞明确Mybatis中的动静代理,本篇文章会联合实例和源码对JDK动静代理进行学习,并会在最初总结JDK动静代理与CGLIB动静代理的区别,以帮忙更好的了解动静代理,为Mybatis源码的学习打下基础。 注释一. 代理模式在学习动静代理之前,先回顾一下设计模式中的代理模式。代理模式定义为,给被代理对象提供一个代理对象以管制对被代理对象的拜访,即拜访对象不适宜或者不能间接援用被代理对象时,代理对象作为拜访对象和被代理对象之间的中介。代理模式中,有三种角色,别离为形象主题(AbstractSubject),实在主题(RealSubject )和代理(Proxy),三种角色含意如下表所示。 角色含意形象主题(AbstractSubject)通过接口或者抽象类申明实在主题和代理须要实现的业务办法。实在主题(RealSubject)实现了形象主题中的业务办法,是代理所代表的实在对象,是最终要援用的对象。代理(Proxy)实现了形象主题,提供了与实在主题雷同的办法,其外部含有对实在主题的援用,能够拜访,管制或扩大实在主题的性能。代理模式的三种角色的关系用类图示意如下。 二. 动态代理依据代理模式中的代理类的字节码文件的创立机会,能够将代理分为动态代理和动静代理:动态代理在程序运行前,代理类的字节码文件就曾经存在,而动静代理则是在程序运行期间JVM通过反射机制为代理类生成字节码文件。本大节以一个例子对动态代理进行学习。 定义形象主题,如下所示。 public interface TestServiceA { void executeTestA(); void submitTestA();}public interface TestServiceB { void executeTestB(); void submitTestB();}上述定义了两个接口作为形象主题,上面定义一个实在主题来实现形象主题,如下所示。 public class RealObject implements TestServiceA, TestServiceB { @Override public void executeTestA() { System.out.println("Test A execute."); } @Override public void submitTestA() { System.out.println("Test A submit."); } @Override public void executeTestB() { System.out.println("Test B execute."); } @Override public void submitTestB() { System.out.println("Test B submit."); }}再定义一个代理类,如下所示。 public class ProxyObject implements TestServiceA, TestServiceB { private RealObject realObject; public ProxyObject(RealObject realObject) { this.realObject = realObject; } @Override public void executeTestA() { before(); realObject.executeTestA(); after(); } @Override public void submitTestA() { before(); realObject.submitTestA(); after(); } @Override public void executeTestB() { before(); realObject.executeTestB(); after(); } @Override public void submitTestB() { before(); realObject.submitTestB(); after(); } private void before() { System.out.println("Begin to do."); } private void after() { System.out.println("Finish to do."); }}能够看到,实在主题RealObject和代理ProxyObject均实现了形象主题,同时代理ProxyObject还持有实在主题RealObject的援用,因而须要通过ProxyObject能力拜访到RealObject,同时ProxyObject在执行RealObject的办法时,还能够执行一些额定的逻辑来扩大RealObject的性能。编写一个客户端程序,如下所示。 ...

November 8, 2021 · 5 min · jiezi

关于vue.js:Vue3Vue2实现数据响应式的区别

Vue2实现响应式的外围: 对象:通过defineProperty对对象的已有属性值的读取和批改进行劫持(监督/拦挡)数组:通过重写数组更新数组一系列更新元素的办法来实现元素批改的劫持1、应用observe函数遍历data的每个属性 2、调用Object.defineProperty()对每个属性做响应式解决:利用拦截器属性get()和set()办法做订阅-公布解决。 3、当对一个属性进行响应式解决的适宜,会实例化一个Dep实例,并将用到这个属性的组件所对应的Watcher实例全副寄存在subs数组里,当属性被批改时,告诉watcher,调用外面的render函数,进行dom的diff和更新。 问题: 须要遍历须要监听的每个对象的每个属性,对其增加definePropert办法,通过其外部的get()和set()办法进行数据的监听和拦挡,实现非常复杂。对象间接新增加的属性或删除已有属性,界面不会自动更新,须要应用Vue.set()间接通过下标替换元素或更新length,界面也不会自动更新数据的响应式解决和视图未齐全解耦Vue3实现响应式的外围:通过proxy代理:拦挡对data任意属性的任意操作,包含属性值的读写,属性的增加,属性的删除等。通过reflect反射,动静对被代理对象的相应属性进行特定的操作。 //申明一个一般对象,让其变成一个proxy代理响应式对象let user = { name: 'Liane', age: 18}//通过new运算符,实例化一个proxy对象,new Proxy(target, handler)//参数1、target--指标对象//参数2、handler--处理器对象,用来监督数据,及数据操作let proxyUser = new Proxy(user, { //获取指标对象的某个属性值 get(target, prop) { console.log('get办法调用了') //通过Reflect反射,对被代理对象(指标对象)的相应属性进行特定操作 return Reflect.get(target, prop) }, //批改指标对象的属性值/为指标对象增加新的属性 set(target, prop, value) { console.log('set办法调用了') return Reflect.set(target, prop, value) }, //删除指标对象上的某个属性值 deleteProperty(target, prop) { console.log('delete办法调用了') return Reflect.deleteProperty(target, prop) }})console.log(proxyUser) //Proxy {name:"Liane",age:18}//通过代理对象获取指标对象中的某个属性值console.log(proxyUser.name) //Liane//批改源对象的属性,代理对象的值也会批改user.name = 'Ann'console.log(proxyUser.name) //Ann//通过代理对象,批改指标对象上的属性值proxyUser.name = 'Rose'console.log(user.name) //Rose//通过代理对象,删除指标对象上的属性值delete proxyUser.nameconsole.log(user) //{age:18}</script >长处: 在咱们动静为data增加属性时,不须要做任何解决,这个属性就曾经是响应式的了。(不必循环遍历data的每个属性,对属性都做一遍响应式解决,而是间接代理整个data对象)数组的任何操作也能够触发相应。

April 19, 2021 · 1 min · jiezi

关于代理:vue2x-配置代理-proxy

vue2.x本地开发配置代理1、关上我的项目中config -> index.js文件 2、批改proxyTable中的内容proxyTable: { "/service-core": { // 把 localhost:8080 代理为上面的地址 target: "https://test.eastgrain.cn", // localhost:8080代理为这个地址 secure: true, // 如果是https,须要配置true changeOrigin: true, // 是否跨域 // pathRewrite: { // 重写,如果开发环境地址中不须要service-core,那么能够将其重写为'' // "^/service-core": "" // } } // 想要代理的地址:'localhost:8080/service-core/wechat/serviceAccount/qrCode/create' // 代理后的地址 'https://test.eastgrain.cn/service-core/wechat/serviceAccount/qrCode/create' // axios 申请接口写法 axios.get('/service-core/wechat/serviceAccount/qrCode/create')...}依照下面的办法能够配置多个代理。 3、重启我的项目,就能够实现本地代理了。

April 14, 2021 · 1 min · jiezi

关于代理:每日一题面试官问谈谈你对ES6的proxy的理解

关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle一、前言2020.12.23 日刚立的 flag,每日一题,题目类型不限度,能够是:算法题,面试题,论述题等等。 本文是「每日一题」第 8 题:[每日一题]面试官问:谈谈你对ES6的proxy的了解 往期「每日一题」: 第 7 题[[每日一题]面试官问:for in和for of 的区别和原理?](https://mp.weixin.qq.com/s/Rs...第 6 题[[每日一题]面试官问:Async/Await 如何通过同步的形式实现异步?](https://mp.weixin.qq.com/s/UA...第 5 道「每日一题」到底该如何答复:vue数据绑定的实现原理?第 4 道「每日一题」与面试官手撕代码:如何迷信高效的寻找反复元素?第 3 道「「每日一题」面试官问你对 Promise 的了解?可能是须要你能手动实现各个个性」第 2 道[「[每日一题]ES6 中为什么要应用 Symbol?」](https://mp.weixin.qq.com/s/om...第 1 道「一道面试题是如何引发深层次的灵魂拷问?」二、什么是Proxy?Proxy,代理,是ES6新增的性能,能够了解为代理器(即由它代理某些操作)。 Proxy 对象用于定义或批改某些操作的自定义行为,能够在外界对指标对象进行拜访前,对外界的拜访进行改写。 1、Proxy定义var proxy = new Proxy(target, handler)new Proxy()示意生成一个 Proxy 实例 target:指标对象handler:一个对象,其属性是当执行一个操作时定义代理的行为的函数。留神:要实现拦挡操作,必须是对 Proxy 实例进行操作,而不是针对指标对象 target 进行操作。 2、proxy拦挡get和set操作咱们先来看一下proxy拦挡get和set操作,示例代码如下: let handler = { get: function(target, key, receiver) { console.log(`getter ${key}!`) return Reflect.get(target, key, receiver) }, set: function(target, key, value, receiver) { console.log(`setter ${key}=${value}`) return Reflect.set(target, key, value, receiver) }}var obj = new Proxy({}, handler)obj.a = 1 // setter a=1obj.b = undefined // setter b=undefinedconsole.log(obj.a, obj.b) // getter a!// getter b!// 1 undefinedconsole.log('c' in obj, obj.c) // getter c!// false undefined3、proxy笼罩组件的原始行为咱们来看一下,示例代码如下: ...

January 10, 2021 · 3 min · jiezi

关于代理:每日一题面试官问谈谈你对ES6的proxy的理解

关注「松宝写代码」,精选好文,每日一题 作者:saucxs | songEagle一、前言2020.12.23 日刚立的 flag,每日一题,题目类型不限度,能够是:算法题,面试题,论述题等等。 本文是「每日一题」第 8 题:[每日一题]面试官问:谈谈你对ES6的proxy的了解 往期「每日一题」: 第 7 题[[每日一题]面试官问:for in和for of 的区别和原理?](https://mp.weixin.qq.com/s/Rs...第 6 题[[每日一题]面试官问:Async/Await 如何通过同步的形式实现异步?](https://mp.weixin.qq.com/s/UA...第 5 道「每日一题」到底该如何答复:vue数据绑定的实现原理?第 4 道「每日一题」与面试官手撕代码:如何迷信高效的寻找反复元素?第 3 道「「每日一题」面试官问你对 Promise 的了解?可能是须要你能手动实现各个个性」第 2 道[「[每日一题]ES6 中为什么要应用 Symbol?」](https://mp.weixin.qq.com/s/om...第 1 道「一道面试题是如何引发深层次的灵魂拷问?」二、什么是Proxy?Proxy,代理,是ES6新增的性能,能够了解为代理器(即由它代理某些操作)。 Proxy 对象用于定义或批改某些操作的自定义行为,能够在外界对指标对象进行拜访前,对外界的拜访进行改写。 1、Proxy定义var proxy = new Proxy(target, handler)new Proxy()示意生成一个 Proxy 实例 target:指标对象handler:一个对象,其属性是当执行一个操作时定义代理的行为的函数。留神:要实现拦挡操作,必须是对 Proxy 实例进行操作,而不是针对指标对象 target 进行操作。 2、proxy拦挡get和set操作咱们先来看一下proxy拦挡get和set操作,示例代码如下: let handler = { get: function(target, key, receiver) { console.log(`getter ${key}!`) return Reflect.get(target, key, receiver) }, set: function(target, key, value, receiver) { console.log(`setter ${key}=${value}`) return Reflect.set(target, key, value, receiver) }}var obj = new Proxy({}, handler)obj.a = 1 // setter a=1obj.b = undefined // setter b=undefinedconsole.log(obj.a, obj.b) // getter a!// getter b!// 1 undefinedconsole.log('c' in obj, obj.c) // getter c!// false undefined3、proxy笼罩组件的原始行为咱们来看一下,示例代码如下: ...

January 10, 2021 · 3 min · jiezi

关于代理:链式调用与proxy

链式调用尽管高兴,可每个办法前面的 return this 略显繁琐与俊俏,括号与引号也未免太多。 例如上面这个简略的logger new Logger() .addLabel("warn", "l4", "登录", "游客", "error") .addContent("失败") .addContent("明码不对") .end();你可能曾经对这样的封装司空见惯了,但其实他还能这样写! Log.warn.l4.label("登录", "游客").log("失败").error.明码不对;我感觉后者有一种简洁美 具体实现如下 class Logger { label: string[] = []; content: unknown[] = []; addLabel(...label: string[]) { this.label.push(...label); return this; } addContent(content: unknown) { this.content.push(content); return this; } end() { // 做一些存储打印之类的操作 console.log(this); }}function getLog() { const logger = new Logger(); /** 拜访链路 */ const propertyLink: (string | number | symbol)[] = []; const self = (new Proxy(/** 指标不重要,因为实际上应用 target */ getLog, { get(target, property, receiver) { propertyLink.push(property); // console.log(property); if (/** 表等级用 */ typeof property === "string" && /l\d+/.test(property)) { logger.addLabel(property); } else if (/** 间接增加标签 */ typeof property === "string" && ["warn", "error"].includes(property)) { logger.addLabel(property); } else if (/** 能够调用的办法 */ typeof property === "string" && ["log", "label"].includes(property)) { // 调用则增加内容 } else { //over logger.addContent(property); return logger.end(); } return self; }, apply(target, thisArg, argumentsList) { const previousProperty = propertyLink[propertyLink.length - 1]; if (previousProperty === "label") { logger.addLabel(...argumentsList); } else if (previousProperty === "log") { logger.addContent(argumentsList); } return self; }, }) as any) as Log; return self;}const Log = new Proxy(getLog(), { get() { return getLog(); },});type Log = { error: Log; warn: Log; info: Log; label: (...lables: string[]) => Log; l1: Log; l2: Log; l3: Log; l4: Log; l5: Log; l6: Log; l7: Log; l8: Log; l9: Log; /** 具体音讯 */ [k: string]: void | Log | any; log: (...arg: unknown[]) => Log; end: void;};Log.error.l9.错了呀;Log.error.l9.warn.错了呀;Log.error.l4.那天夕阳下的奔跑是我逝去的青春;Log.warn.l4.log("有毒?").end;Log.warn.l4 .label("登录") .label("游客") .log("失败").end;Log.warn.l4.label("登录", "游客").log("失败").error.明码不对;new Logger() .addLabel("warn", "l4", "登录", "游客", "error") .addContent("失败") .addContent("明码不对") .end(); ...

August 20, 2020 · 2 min · jiezi

快速进阶Vue30

在2019.10.5日发布了Vue3.0预览版源码,但是预计最早需要等到 2020 年第一季度才有可能发布 3.0 正式版。 可以直接看 github源码。 新版Vue 3.0计划并已实现的主要架构改进和新功能: 编译器(Compiler) 使用模块化架构优化 "Block tree"更激进的 static tree hoisting 功能 (检测静态语法,进行提升)支持 Source map内置标识符前缀(又名"stripWith")内置整齐打印(pretty-printing)功能移除 Source map 和标识符前缀功能后,使用 Brotli 压缩的浏览器版本精简了大约10KB运行时(Runtime) 速度显著提升同时支持 Composition API 和 Options API,以及 typings基于 Proxy 实现的数据变更检测支持 Fragments (允许组件有从多个根结点)支持 Portals (允许在DOM的其它位置进行渲染)支持 Suspense w/ async setup()目前不支持IE111.剖析Vue Composition API可以去看官方地址 Vue 3 使用ts实现了类型推断,新版api全部采用普通函数,在编写代码时可以享受完整的类型推断(避免使用装饰器)解决了多组件间逻辑重用问题 (解决:高阶组件、mixin、作用域插槽)Composition API 使用简单先尝鲜Vue3.0看看效果 <script src="vue.global.js"></script><div id="container"></div><script> function usePosition(){ // 实时获取鼠标位置 let state = Vue.reactive({x:0,y:0}); function update(e) { state.x= e.pageX state.y = e.pageY } Vue.onMounted(() => { window.addEventListener('mousemove', update) }) Vue.onUnmounted(() => { window.removeEventListener('mousemove', update) }) return Vue.toRefs(state); } const App = { setup(){ // Composition API 使用的入口 const state = Vue.reactive({name:'youxuan'}); // 定义响应数据 const {x,y} = usePosition(); // 使用公共逻辑 Vue.onMounted(()=>{ console.log('当组挂载完成') }); Vue.onUpdated(()=>{ console.log('数据发生更新') }); Vue.onUnmounted(()=>{ console.log('组件将要卸载') }) function changeName(){ state.name = 'webyouxuan'; } return { // 返回上下文,可以在模板中使用 state, changeName, x, y } }, template:`<button @click="changeName">{{state.name}} 鼠标x: {{x}} 鼠标: {{y}}</button>` } Vue.createApp().mount(App,container);</script>到这里你会发现响应式才是Vue的灵魂2.源码目录剖析packages目录中包含着Vue3.0所有功能 ...

October 16, 2019 · 6 min · jiezi

GolangHTTPReverseProxy反向代理Nginx硬件指纹校验

原文地址 https://mojotv.cn/go/hardware-footprint-gui-proxy

October 15, 2019 · 1 min · jiezi

ES6新特性之Proxy

基本概念字面意思的理解就是代理。 用于定义基本操作的自定义行为,就是我们可以自定义某些行为,比如属性的查找,赋值,枚举,函数调用等。实际上我们利用这个Proxy实现对编程语言进行编程,就是把一些内部的方式,内置的方法改变了,这种编程就叫做语言编程。属性代理就做拦截。关于Proxy需要注意的地方有:Proxy内部的this关键字的指向是Proxy代理本身;它的构建方式需要借助一个Proxy的构造函数new Proxy(target,handler),其中target叫做目标对象,Proxy构造函数返回的是一个包装过后的目标对象,handler是代理的行为的函数。 let handler = { get: function(target, name) { return name in target ? target[name] : 'Eric'; }};let p = new Proxy({}, handler);p.name;// Eric let proxy = new Proxy({}, { get: function(target, property) { return 'Eric'; }});let obj = Object.create(proxy);obj.name;// Eric (说明Proxy是可以继承的)代理操作get, 拦截某个属性的读取操作,接收三个参数:target(目标对象)、property(属性名)、receiver(一般是Proxy对象本身,可选参数) let teacher = { name: "Eric" }; let proxy = new Proxy(teacher, { get: function(target, property) { if (property in target) { return target[property]; } else { throw new ReferenceError("\"" + property + "\" does not exist."); } } }); proxy.name; // Eric proxy.age; // ReferenceError: "age" does not exist. get属性拦截可以继承,需要注意的一点是,当某个对象不可配置(configurable)或者不可写(writable),使用get会报错。 ...

August 21, 2019 · 2 min · jiezi

SquidSSH-Tunnel实现加密代理

工具和资料QQ群 - Javascript高级爬虫 - 作者自建群,欢迎加入!中国商标网加密接口 - 仅作演示awesome-java-crawler - 作者收集的爬虫相关工具和资料前言今天研究了一下如何在CentOS上部署Squid代理服务器并可加密访问,以前从来没接触过,这里记录一下。具体需求如下: 有两台CentOS服务器,设为A和B基本要求是在服务器A上部署代理服务器,A-B间建立隧道,达到客户端使用B的IP作为代理,最终却通过A代理上网的目的进一步要求,A上的代理仅允许B连接,避免被无处不在的扫描器弄到人家的代理池中A-B间的数据传输应是加密的,即使客户端访问的是普通HTTP页面而非HTTPS页面Squid部署和配置A服务器上安装Squid:yum install squid为了达到绑定B的IP,需要修改配置文件,在/etc/squid/squid.conf,添加两行: acl server_b src <A的外网IP>...http_access allow server_b注意!如果不需要A-B间的加密隧道,仅仅是绑定到B的IP,那么上面配置中acl行后面用B的外网IP即可,但若使用SSH隧道则实际是由本机SSHD转发的,因此这里需要设置成A的外网IP,至于为何不能直接用127.0.0.1,抱歉我也没搞明白(T_T)启动Squid:squid修改配置后重启Squid: squid -k reconfigure这时候可以curl验证一下本机代理是否生效:curl -x localhost:<代理端口> https://httpbin.org/get?showenv=1SSH Tunnel配置在服务器B的shell下执行: ssh -L 0.0.0.0:<B的本地端口>:<服务器A的IP>:<A的代理端口> root@<A的主机名或IP> -N -f注意:执行此条命令需要输入服务器A的root密码命令成功执行后即可建立B到A的加密隧道,注意上面的0.0.0.0不能省略,否则这个隧道只能从B本机访问如果需要关闭隧道,直接杀掉ssh进程即可: 首先用ps -ef | grep <本地端口>找到进程PID然后kill -9 <PID>即可关闭隧道用curl验证代理及隧道是否生效: 在任意电脑上执行:curl -x <B的外网IP>:<B的本地端口> https://httpbin.org/get?showenv=1在上面httpbin的应答中可以看到,虽然指定代理IP为B,但目标站点看到的实际访问IP则是A至此,已初步达到目的 SSH免登陆为了上面的整个流程可以脚本化,还需要实现B到A的SSH免登录首先在B上执行ssh-keygen -t rsa,在后面的交互式界面中不要设定密钥的密码cat /root/.ssh/id_rsa.pub,复制公钥内容在A上编辑/root/.ssh/authorized_keys,把B的公钥文本粘贴到最后,确保独占一行,保存以后在B上执行ssh -L ...命令时,就不需要输入密码了

July 16, 2019 · 1 min · jiezi

从前端角度用正向反向代理解决开发时的跨域问题

前言这篇文章的初衷是结合我看到其他前辈们的文章所总结的一些心得,可能不会很全面,不过大概的知识流程应该还是能传达给大家的。 内容大概浏览器输入url的时候,到回来显示整个大致流程正向代理,反向代理前端处理跨域浏览器输入url之后,到页面显示回来的大致过程(前端角度)举例:比如我准备在浏览器输入https://baidu.com 过程分析:第一步:获取IP地址 (1)在浏览器输入地址之后,注意,咱们这个baidu是域名,不是IP地址; (2)这个时候浏览器会去找这个域名对应的是哪个IP地址,一般来说,会先找我们电脑本地硬盘的 hosts 文件,看一下有没有相关规则; (3)如果本地hosts文件没有找到IP地址,那这个时候就去会去DNS服务器找,并返回IP地址; 第二步:发请求,建立TCP连接(三次握手)(1)这里的细节我不过多说,我们只需要知道,上一步获取到IP地址之后,客户端开始向这个IP地址发送请求前,会先进行TCP连接; 三次握手是指这个连接的过程中:1)客户端先发送一次报文给服务器;2)服务端收到,再发一个给客户端;3)客户端接受到,再发一次报文,同时也把这次的HTTP请求一起发过去 (2)经过握手之后,TCP连接成功,服务端这时也接受到了请求(在最后一次握手),接着处理之后把响应发回给客户端的同时,服务端会先单方面关闭TCP连接; (3)客户端接受到请求数据,也把TCP连接关闭,这时才算完成一次请求; 小结论:从这里我们就可以知道,为什么要说前端减少HTTP请求会对性能有优化作用,就是因为你每一个请求它都要跑上面的过程,握手耗时 第三步:浏览器拿到html文件,开始渲染,并且发送请求获取嵌入在 HTML 中的资源(如CSS、JS、图片、音频、视频等)(这里后面再补充) 代理1、在讲之前先说一下最终的结论(个人理解,可能有误) 正向代理:知道真正的请求地址,在向这个地址发送请求的时候,被代理服务器拦截,然后帮你去请求这个地址,最后把请求结果从真实服务器拿回来,再返回给你;反向代理:不知道真正的请求地址,知道一个假的,在你请求这个假地址(这个假地址就是在代理配置的,当然也把正确的地址配置进去,通常是在服务端配置这个代理服务器,所以说这个真实地址对客户端是透明的)的时候,被代理服务器拦截,然后步骤跟上面一样;2、讲解(1)正向代理说明:正向代理(forward)是一个位于客户端【用户A】和原始服务器(origin server)【服务器B】之间的服务器【代理服务器Z】,为了从原始服务器取得内容,用户A向代理服务器Z发送一个请求并指定目标(服务器B),然后代理服务器Z向服务器B转交请求并将获得的内容返回给客户端。客户端必须要进行一些特别的设置才能使用正向代理。 通俗大白话:正向代理需要在客户端设置,在这个过程中,真正的服务器B并不知道到底是哪个客户端发起的请求,因为它所有的请求都是来自代理服务器Z,所以说,在正向代理中,我们会说此时客户端是透明的。 正向代理用途:1)科学上网;2)对客户端访问授权,上网进行认证3)可以做缓存,加速访问资源 (2)反向代理说明:反向代理正好与正向代理相反,对于客户端而言代理服务器就像是原始服务器,并且客户端不需要进行任何特别的设置。客户端向反向代理的命名空间(name-space)中的内容发送普通请求,接着反向代理将判断向何处(原始服务器)转交请求,并将获得的内容返回给客户端。 通俗大白话:反向代理不需要在客户端设置,在这个过程,客户端只需要请求这个代理服务器,这个代理服务器会自动根据相关设置去请求对应的真正的服务器,所以说,在反向代理中,我们会说此时服务端是透明的。 反向代理用途:1)负载均衡,减轻服务器压力(目前只知道这个); (3)小结论是不是觉得有点奇怪?两个都是请求代理服务器,都是由代理服务器去请求真正的服务器?到底有什么不同?请看我最开始上面说的结论。 (4)图解借用知乎两张图来表达:https://www.zhihu.com/questio... 跨域(重点来了)我前面说了这么多,什么敲入地址,代理啊,都是为了讲一下在我们平时的开发中,怎么解决跨域这个问题。 (1)概念跨域是由浏览器同源策略引起的,是指页面请求的接口地址,必须与页面url地址处于同域上(即域名,端口,协议相同)。这是为了防止某域名下的接口被其他域名下的网页非法调用,是浏览器对JavaScript施加的安全限制。 注意:通过后台调接口是不会有跨域问题的,而是会出现这个接口设置了不让其他服务器调用的其他问题 例子:从http://www.lizi.com/home/index.html向以下地址发送请求 1. http://www.lizi.com/home/detail.html 成功,路径不同 2. http://www.lizi.com/description/detail.html 成功,路径不同 3. https://www.lizi.com/home/list.html 失败,协议不同(http 和 https) 4. http://www.lizi.com:8848/home/manange.html 失败, 端口不同(默认80 和 8848) 5. http://mobile.lizi.com/home/secret.html 失败,域名不同(www 和 mobile)(2)怎么解决呢虽然浏览器有限制,但是HTML中有两个属性是不受限制的,那就是src和href属性 <img src="http://www.lizi.com/xxx.jpeg"></script><link rel="stylesheet" href="http://www.lizi.com/css/reset.css"> <script src="https://cdn.bootcss.com/jquery/3.4.0/jquery.min.js"></script><link href="https://cdn.bootcss.com/twitter-bootstrap/4.3.1/css/bootstrap.min.css" rel="stylesheet">是不是很熟悉?我们平时开发中上面代码肯定经常用。根据这个特性,前端大佬们想到了一个解决跨域的方式---JSONP2.1)JSONP先说结论:这个方法是前后端要互相配合,比如约定那个函数的名字叫啥之类 //这个是请求页面//里面有一个script标签,它的src是一个请求地址,在地址后面拼接了一个参数callback,值为sendStudent//页面也写了一个sendStudent的函数,跟传过去的callback值是对应的//当这个请求成功返回来之后,咱们页面这个sendStudent就会自动触发//当然触发的时机,是服务端那边执行了 sendStudent('数据数据') 这段代码,这个写法就是咱们JS触发函数的写法,只是现在把这段代码放在了服务端<!doctype html><html lang="en"><head> <meta charset="UTF-8"> <title>JSONP</title> <script src="http://www.baidu.com/api/student?callback=sendStudent"></script></head><body><script> function sendStudent(res){ console.log('这里就是服务端返回来的数据',res); }</script></body></html>//假装这里是后台代码xxxxxxxxxsendStudent({user:'我是数据'})2.2)CORS先说结论:这个只需要后端设置就行了,前端不用 ...

July 11, 2019 · 1 min · jiezi

Nginx之正向代理与反向代理的理解

nginx的一大用处是进行反向代理来完成完成负载均衡。那么有反向代理,就有正向代理。来看看他们的区别正向代理图解:用户(客户端)去饭店吃饭(发送一个请求),用户要吃的是小龙虾(请求),可是你不能自己做,那么就需要让大厨(服务端)给你做 ,可是去了饭店,大厨是在后台的,你也不能直接去告诉大厨,因为你没有权限(服务端在后台)这时候就需要服务员(代理)来帮忙告诉说某某某客户(客户端)要一份10斤小龙虾(请求/访问资源)大厨(服务端)收到给做好然后交给服务员(代理)服务员拿到小龙虾(资源/响应)给客户(用户端)送回来。 反向代理 图解:用户(客户端)去饭店要小龙虾(请求),服务员(代理)收到这个请求发现大厨做不了这个小龙虾,可是又需要挣钱,这怎么办呢?服务员这么一想,隔壁那家饭店可以做,而我也和那家大厨(另一个服务端)有交集,那我去让另一家大厨给做怎么样?好。于是服务员就去告诉另一家大厨说你帮我做一个小龙虾(请求)吧,隔壁大厨说好呀,可以。就做好交给服务员。那么这个时候,这个服务员(反向代理)就成为了反向代理,因为他去调用别的服务端。这个时候我们(客户端)通常来说是没必要知道这小龙虾怎么来的,只要有就好。 注意点:那这个服务员是谁都可以当的吗?肯定不可以呀,所以这个服务员(代理)需要在饭店任职(配置)之后才可以。也就是代理需要配置。 那么反向代理需要吗?答案是不需要的,自己思考就会明白。 那么反向代理的优点就体现出来了,我不需要配置,而且我不仅只能在一家调用请求,我可以向多个服务端去发出请求。而且反向代理还可以向多台后端服务器进行负载平衡。

June 28, 2019 · 1 min · jiezi

正向代理与反向代理的区别

△正向代理( Forward Proxy ):是一个位于客户端和原始服务器之间的服务器,为了从原始服务器取得内容, 客户端向代理发送一个请求并指定目标(原始服务器),然后代理向原始服务器转交请求并将获得的内容返回给客户端。客户端才能使用正向代理。 △反向代理( Reverse Proxy ):是指以代理服务器来接受 Internet 上的连接请求,然后将请求转发给内部网络上的服务器,并将从服务器上得到的结果返回给 Internet 上请求连接的客户端,此时代理服务器对外就表现为一个反向代理服务器。 共同点:都是做为服务器和客户端的中间层。都可以加强内网的安全性,阻止 Web 攻击。都可以做缓存机制,提高访问速度。 区别:正向代理其实是客户端的代理,反向代理则是服务器的代理。正向代理中,服务器并不知道真正的客户端到底是谁;而在反向代理中,客户端也不知道真正的服务器是谁。作用不同。正向代理主要是用来解决访问限制问题;而反向代理则是提供负载均衡、安全防护等作用。

June 20, 2019 · 1 min · jiezi

vue-proxyTable-配置代理解决跨域

vue + webpack 构建的项目解决浏览器跨域问题在 config/index.js 中配置 proxyTable 代理,如下图所示: proxyTable: { // 配置代理 '/api': { // 匹配所有以 '/api' 开头的请求路径 target: 'http://localhost:4000', // 代理目标的基础路径 changeOrigin: true, // 支持跨域 pathRewrite: { // 重写路径: 去掉路径中开头的'/api' '^/api': '' } }},

June 11, 2019 · 1 min · jiezi

前后端分离之更好的mock你的后端api

注意! 广告警告! 广告警告! 广告警告!在一个web应用的开发周期中, 一般前端与后端都是并行开发的, 各自完成自己的开发工作后进行联调, 联调通过再进行提测/发布. 开发过程中, 前端都会以后端提供的 api 文档作为标准, mock 模拟 api 返回数据, 以确保在开发中就保证功能的完整性. 而关于如何更好的进行 mock, 业界/开源社区可谓有相当多质量上乘的解决方案, 如easy-mock, yapi等. 但是越是大而全的工具很多时候功能会超越需求非常多, 要简单实现 mock api 的需求其实也有非常多小而美工具库可以使用. 而本文主要介绍 mock-server 这个工具的使用 选用 mock-server 的主要原因除了是我开发的使用比较简单之外, 更多的是满足了下文提到的一些开发需求, 如果你也有同样的需求而还没找到解决方案的话, 不妨试用一下. 安装 & 基本配置可选全局安装, 安装完成过后, 就可以通过mock命令启动来 mock server npm install -g mock-server-localmock -h # 即安装成功# 用 -d 指定mock数据配置目录, 为空时默认为当前目录 `.`mock -d ./mock# 用 -p 指定server的端口, 默认为8888, 如果8888被占用会端口号+1, 直至端口可用# 注意如果指定了端口号, 但是端口号被占用的话, 会抛出错误mock -d ./mock -p 8080个人比较习惯在项目中进行安装, 并通过npm script启动, 而 mock 数据也存放在项目当中, 通过 git 等版本管理工具在项目成员当中共享, 假设项目目录为proj ...

May 18, 2019 · 4 min · jiezi

nodejs中request库使用HTTPS代理

正在尝试改用NodeJS编写爬虫,http请求库选择了request,用起来还是挺简单的。现在有个需求,需要用Fiddler抓包我发出去的请求,以便和浏览器发出去的包进行对比。因为需要解密HTTPS报文,需要让node要么忽略证书安全,要么信任Fiddler的CA证书。网上找了一圈,总结如下: 设置环境变量设置环境变量NODE_TLS_REJECT_UNAUTHORIZED=0即"不拒绝未认证的证书"但是直接修改系统环境变量比较危险,因为会影响到所有nodejs的程序;比较稳妥的办法是脚本中调用process.env["NODE_TLS_REJECT_UNAUTHORIZED"] = 0; 这样仅对本进程生效每请求单独设置忽略证书安全上述方法还是有一定风险,因为当前nodejs进程都受此全局设置影响可以在request的options中添加rejectUnauthorized: false选项来针对单个请求忽略证书检查当然也可以用request.defaults直接设置默认选项 const request = require("request").defaults({ proxy: "http://127.0.0.1:8888", rejectUnauthorized: false, }) request.get("https://www.baidu.com").on("response", console.log)直接使用Fiddler的CA证书这个方法是最稳妥的,不会对你的子系统之外产生任何溢出影响首先在Fiddler内把其根证书导出到桌面:Tools -> Options -> HTTPS -> Actions -> Export Root Certificate to Desktop导出的文件是个.cer证书,经测试nodejs不直接支持,需要用openssl转换成PEM格式(我的openssl是cygwin装的)openssl x509 -inform DER -in FiddlerRoot.cer -outform PEM -out fiddler.pem把转换出来的fiddler.pem放到你的程序能访问的位置使用ca选项来指定CA证书 const request = require("request").defaults({ proxy: "http://127.0.0.1:8888", ca: require("fs").readFileSync("path/to/fiddler.pem", {encoding: "utf-8"}), }) request.get("https://www.baidu.com").on("response", console.log)另外:request当然也支持自签名证书,不过我暂时没这方面需求,就没继续摸索了

April 29, 2019 · 1 min · jiezi

github 代理设置 https/git 速度直接从14k/s 飙升 5m+/s

参考链接: https://gist.github.com/fearb…很多时候我们在使用 github 的时候会出现下载很慢的情况。如果你有代理,可以直接设置代理,来获取更快下载和上传资源的速度。给 git 设置 SOCKS5 代理:使用 https 的时候,就是使用 https 协议复制仓库的时候如: https://github.com/KyleBing/T...git config –global http.proxy ‘socks5://127.0.0.1:1080’git config –global https.proxy ‘socks5://127.0.0.1:1080’也可以直接修改用户主目录下的 .gitconfig 文件[http] proxy = socks5://127.0.0.1:1080[https] proxy = socks5://127.0.0.1:1080在使用 git 开头的路径时,也就是在使用 ssh 通道时如: git@github.com:KyleBing/TouchbarBBT.git打开用户主目录下的 .ssh/config 文件,添加以下内容ProxyCommand nc -x localhost:1080 %h %p效果,速度是真快之前的速度:之后的速度:言外terminal 中设置临时代理直接执行export ALL_PROXY=socks5://127.0.0.1:1080或者在用户主目录下的 .bash_profile 添加别名,这样以后在使用的时候就可以直接输入 proxy了alias proxy=“export ALL_PROXY=socks5://127.0.0.1:1080”

April 10, 2019 · 1 min · jiezi

charles ios设备 https代理配置

首先需要在Mac上打开Charles,并启动代理,完成了一系列配置后,能正常监听流量了以后,再进行下面操作(配置电脑证书等).PC端Charles设置,可以参考我另外一篇文章https://segmentfault.com/a/11…监听iOS设备流量(信任https请求),安卓端与iOS类似,只不过安卓端下载证书后,需要去系统文件中打开证书安装并信任(IOS只有下载立即安装,如果下载完成没有安装,以后如果需要安装证书,只能重新下载)打开Charles帮助, 查看移动端证书安装提示按照提示设置IOS WIFI代理.(IOS设备与电脑需要处于同一网络).上图红圈标红的内容是,我电脑在局域网的内网IP,8888是我电脑设置的代理监听端口.如果有必要,修改步骤2红框中的端口Mac电脑Charles代理设置方式.上图中1是必选项,只有勾选了,才能启动代理.2是代理监听端口,默认8888配置iOS设置代理(需要与电脑处于同一WIFI),服务器和端口就是步骤2红框中的内容下载证书.在iOS上配置好WIFI代理后,使用Safari浏览器打开http://chls.pro/ssl ,浏览器会自动下载一个 证书,安装即可.注意:只能用Safari浏览器打开才有用浏览器打开http://chls.pro/ssl 后的提示如果下载文件成功,点击允许,会跳转到该界面点击安装即可.安装成功会如下图所示如果安装成功,在设置–> 通用 –> 描述文件 中会新增一个Charles Proxy的描述文件.前往 设置–> 通用 –> 关于本机–> 证书信任设置 里,将刚刚新增的Charles证书设置为启用状态,设置为启用后,应该如下图所示(开关选项会显示为绿色)完成上面的步骤,iOS上的Charles代理https证书就设置完成啦.打开浏览器,随便打开个https网页,电脑端的记录就会显示详细内容了,而不会显示问号疑难杂症:问: 如果你移动端配置好以后,还是无法监听https流量答: 请你先确定,你是否能够监听移动端的http流量,如果http流量都无法监听,那么是你电脑Charles设置问题,与移动设备无关问: iOS设备用浏览器打开http://chls.pro/ssl 后,手机没有弹出允许的窗口,而是直接让你保存下载文件,或者打开后无反应.答: 请先确认你手机电脑是否使用到是同一WIFI,并且保证你iOS中WIFI设置的代理是步骤2中的 >IP+端口.然后,再使用移动设备默认浏览器打开,iOS必须要用Safari浏览器打开如果你是使用Mac电脑,那么,你还需要检查你的电脑中是否安装有Charles证书,并且设置为始终信任.下图是我电脑的钥匙串系统证书列表

January 26, 2019 · 1 min · jiezi

Git和Golang配置Shadowsocks代理

使用场景golang get 很慢,需要进行httpx代理composer很慢可以使用代理git clone github的包时候也很慢shadowsocks 安装1分钟配置 点击查看转化代理模式ssr提供sock5代理,所以我们需要转化成http协议的代理层,golang有个工具cow,安装如下。据说目前git已经支持socks5代理,所以后面我有进行尝试socks5直接配置代理参数。包括环境参数也是同样有些软件支持socks5,我们可以按需配置go get github.com/cyfdecyf/cow 在cow目录下提供一个配置文件rc.txt,更多需求了解【cow文档】listen = http://127.0.0.1:7777proxy = socks5://127.0.0.1:1080运行daemon&在windows下的git bash可以使用,没有的话可以看官方提供的其他工具$ cow &测试一下是否代理成功$ curl localhost:7777 git配置使用git config -e –global就可以编辑配置文件~/.git[http] proxy = http://127.0.0.1:7777[https] proxy = http://127.0.0.1:7777其他配置git bash的话添加一个~/.bashrc 文件export http_proxy=http://127.0.0.1:7777export https_proxy=http://127.0.0.1:7777# 增加GOPATHexport GOPATH=/d/workspace/Golangsock5代理配置git配置如下[http] proxy = socks5://127.0.0.1:1080[https] proxy = socks5://127.0.0.1:1080[https “https://golang.org”] proxy = socks5://127.0.0.1:1080Envexport http_proxy=http://127.0.0.1:7777#export https_proxy=http://127.0.0.1:7777export https_proxy=socks5:127.0.0.1:1080# 增加GOPATHexport GOPATH=/d/workspace/Golang

December 22, 2018 · 1 min · jiezi

macos,使用nginx设置mysql反向代理

应用场景:服务器端程序异常,需要在本地搭建测试环境,并将服务器上的数据库同步到本地测试环境。遇到的问题:navicat备份的时候,会根据操作系统不同,生成不同的备份文件。所以由服务器复制下来的备份文件,不能够在本地的MACOS上直接还原。解决方案:在本地的其它windows电脑上,将备份的数据还原到MACOS上。实施步骤:安装nginx使用nginx进行反向代理,将本地的3306端口映射到3305端口。配置如下:http { # xxx}stream { upstream mysql { hash $remote_addr consistent; server 127.0.0.1:3306 max_fails=3 fail_timeout=30s; } server { listen 3305; proxy_connect_timeout 30s; proxy_timeout 600s; proxy_pass mysql; }}此时,我们使用与macos处于同一个局域网的电脑,打开navicat,设置访问的地址为 MACOS电脑IP,端口设置为3305,即可访问。当然也可以使用navicat的还原功能,来快速还原数据库了。

December 21, 2018 · 1 min · jiezi

docker使用笔记

docker的安装这里不再赘述,直接pip安装即可一、创建私有仓库安装docker1.7之后版本,在仓库主机做如下操作注:仓库的主机是ubuntu,其他系统会稍有不同#修改docker启动项vim /etc/docker/daemon.json#添加内容:{ “insecure-registries”:["${addressOfBasicImage}"] }#修改docker配置:vim /etc/default/docker#在DOCKER_OPTS值中添加以下内容DOCKER_OPTS="–insecure-registry 0.0.0.0/0"#重新加载daemonsystemctl daemon-reload#重启dockersystemctl restart docker#拉取仓库镜像,${addressOfRegistry}代表仓库镜像地址,例如:10.75.9.72:5000docker pull ${addressOfRegistry}/registry#启动容器建立私有仓库镜像,${addressOfRegistry}代表仓库镜像地址,例如:10.75.9.72:5000docker run -d -it -p 5000:5000 –name registry ${addressOfRegistry}/registry bash二.管理镜像:在节点主机进行如下操作#拉取目标镜像docker pull public-docker-virtual.dns/python:3.6#启动容器run -d -v /opt/registry:/var/lib/registry -i –restart=always –name python3 public-docker-virtual.dns/python:3.6#修改容器配置,安装需要打入基础镜像的库#打好标签docker tag public-docker-virtual.dns/python:3.6 10.9.220.139:5000/python3:latest#上传到仓库docker push 10.9.220.139:5000/python3查看仓库的镜像:三.配置docker上网代理本章节适用于宿主机使用代理访问网络的情况,如果宿主机不用使用代理上网,可以直接跳过本节在宿主机上配置dockercentos7:在目录/etc/systemd/system/docker.service.d中新建文件http-proxy.conf,在文件中添加内容:[Service]Environment=“HTTP_PROXY=http://proxy_addr:proxy/” “HTTPS_PROXY=https://proxy_addr:proxy/“然后重启docker服务如果需要在镜像中需要访问外网的权限,只用加环境变量即可:export http_proxy=proxy_addr:proxyexport https_proxy=proxy_addr:proxyexport proxy=proxy_addr:proxy

December 17, 2018 · 1 min · jiezi