go 实现正向代理和反向代理基本原理
由于这几天同学们抢课比较激烈,抢课的时候会用到 Press button above to start modifying headers 这个工具对其远程服务器进行欺骗。使用 go 语言对其分析其中的原理!
正向代理与反向代理区别!
正向代理的用途:
1.访问原来无法访问的资源,如google
-
可以做缓存,加速访问资源
-
对客户端访问授权,上网进行认证
4.代理可以记录用户访问记录(上网行为管理),对外隐藏用户信息

反向代理的用途:
1.保证内网的安全,阻止web攻击,大型网站,通常将反向代理作为公网访问地址,Web服务器是内网
2.负载均衡,通过反向代理服务器来优化网站的负载

学校的 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 来对其欺骗反向代理服务。使认为这个数据包是内部【校内人员使用的】,从而对其进行绕过处理!
所有我们就可以访问校内的服务器了!
网友评论