美文网首页
go 实现正向代理和反向代理基本原理

go 实现正向代理和反向代理基本原理

作者: COMS | 来源:发表于2020-10-15 10:00 被阅读0次

go 实现正向代理和反向代理基本原理

由于这几天同学们抢课比较激烈,抢课的时候会用到 Press button above to start modifying headers 这个工具对其远程服务器进行欺骗。使用 go 语言对其分析其中的原理!

正向代理与反向代理区别!
正向代理的用途:

1.访问原来无法访问的资源,如google

  1. 可以做缓存,加速访问资源

  2. 对客户端访问授权,上网进行认证

4.代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息


download.png
反向代理的用途:

1.保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网

2.负载均衡,通过反向代理服务器来优化网站的负载

d2.png

学校的 vpn 原理是使用反向代理
所有用 go 语言对其实现反向代理服务,对其进行转发

用GO语言实现反向代理:
package main

import (
    "bufio"
    "context"
    "net"
    "net/http"
    "strings"
)

type forwardproxy struct {}

func (fwd forwardproxy) ServeHTTP(w http.ResponseWriter,r *http.Request) {
    transport := http.DefaultTransport
    outreq := r.Clone(context.Background())
    if clientIp,_,err := net.SplitHostPort(r.RemoteAddr);err != nil {
        if prior, ok := outreq.Header["X-Forwarded-For"]; ok {
            clientIp = strings.Join(prior,", ") + ", " + clientIp
        }
        outreq.Header.Set("X-Forwarded-For",clientIp)
    }

    res ,err := transport.RoundTrip(outreq)
    defer res.Body.Close()
    if err != nil {
        w.WriteHeader(http.StatusBadRequest)
        return
    }

    for key,value := range res.Header {
        for _, v := range value {
            w.Header().Add(key,v)
        }
    }
    w.WriteHeader(res.StatusCode)
    bufio.NewReader(res.Body).WriteTo(w)
}

func main() {
    http.Handle("/",&forwardproxy{})
    http.ListenAndServe("0.0.0.0:8082",nil)
}

以上就基本代理服务器源码!用go语言实现 反向代理是非常精简的,这里我没有使用 reserse_proxy来实现反向代理!只会对 X-Forwarder-For 这个协议进行分析!

X-Forwarded-For:

X-Forwarded-For 是一个 HTTP 扩展头部。HTTP/1.1(RFC 2616)协议并没有对它的定义,它最开始是由 Squid 这个缓存代理软件引入,用来表示 HTTP 请求端真实 IP。如今它已经成为事实上的标准,被各大 HTTP 代理、负载均衡等转发服务广泛使用,并被写入 RFC 7239(Forwarded HTTP Extension)标准之中。
X-Forwarded-For 的格式:X-Forwarded-For:client,proxy,proxy

go 反向代理 X-Forwarded-For

if clientIp,_,err := net.SplitHostPort(r.RemoteAddr);err != nil {
        // 获取client端的 ip 地址
        if prior, ok := outreq.Header["X-Forwarded-For"]; ok {
                      // 对 X-Forwarded-For 进行重组
            clientIp = strings.Join(prior,", ") + ", " + clientIp
        }
        // 设置重组 X-Forwarded-For Header 对内部服务进行转发功能
        outreq.Header.Set("X-Forwarded-For",clientIp)
    }

但是 X-Forwarded-For 只允许被修改的 , 当你访问学校的域名的时候,会先经过反向代理服务,反向代理服务获取你自己本机 ip 。当 ip 不符合要求会对其进行过滤拦截!
所以我们会用到 Press button above to start modifying headers ,当我们访问的时候把我们对反向代理的包对其重组,重新修改成
X-Forwarded-For:127.0.0.1 来对其欺骗反向代理服务。使认为这个数据包是内部【校内人员使用的】,从而对其进行绕过处理!


捕获.PNG

所有我们就可以访问校内的服务器了!

相关文章

  • go 实现正向代理和反向代理基本原理

    go 实现正向代理和反向代理基本原理 由于这几天同学们抢课比较激烈,抢课的时候会用到 Press button a...

  • 【Nginx】实现负载均衡的几种方式

    要理解负载均衡,必须先搞清楚正向代理和反向代理。 正向代理与反向代理【总结】 注: 正向代理,代理的是用户。反向代...

  • Nginx常用功能以及相关配置

    Nginx 常用的功能: 1、Http正向代理、反向代理 正向代理和反向代理的区别:1、正向代理:类似我们想要访问...

  • nginx系列3——nginx反向代理、动静分离、负载均衡

    nginx反向代理、动静分离、负载均衡 反向代理 要说反向代理,我们就先要理解正向代理 ,下面我们就谈谈正向代理和...

  • Servlet实现反向代理实践总结

    一、反向代理 反向代理顾名思义,是和正向代理相反,所以我们可以借助于正向代理来理解反向代理。 正向代理:多个客户端...

  • Nginx详解

    nginx详解 一、什么是正向代理和反向代理? 正向代理image反向代理image URI、URL和URN: U...

  • Nginx 的反向代理和负载均衡初涉

    正向代理和反向代理 我们经常看到正向代理和反向代理这两个名词,那么什么是正向代理,什么是反向代理呢?这里我举两个通...

  • 服务端知识之反向代理和正向代理

    最近正好看到项目里有说正向代理和反向代理,我就去查看了下,明白了什么是正向代理和反向代理。 1. 正向代理 正向代...

  • Nginx实现代理

    代理有正向代理和反向代理,这两种nginx都可以实现。 代理是什么?通俗讲,就是帮你处理一些事。 正反向代理区别:...

  • Nginx 反向代理与负载均衡

    Nginx特点:反向代理 正向代理说反向代理之前,我们先看看正向代理,正向代理也是大家最常接触的到的代理模式,我们...

网友评论

      本文标题:go 实现正向代理和反向代理基本原理

      本文链接:https://www.haomeiwen.com/subject/cnrnpktx.html