一个简单的tcp代理(golang实现)
2015-05-13 14:49
561 查看
最近需要在生产环境中调试一个http的问题,但是网管说不能安装抓包工具......
想到的一种替代方案是,增加个反向代理,然后把所有的request和response打印一下即可
1. nginx/haproxy来做反向代理,肯定可行,但是我配置的不太熟练
2. 自己写个简单的即可,正好golang写这类程序很快,所以就花了一会儿重新熟悉下go的语法(有阵子没看忘掉了......)然后写了个
主要的思路就是接收客户端的request,然后把里面的Host header改成真正的服务器的Host,然后转发,并把接收到的response回发个客户端即可
下面是全部的代码,用法很简单 ./tcpproxy 127.0.0.1 1080 www.baidu.com:80
想到的一种替代方案是,增加个反向代理,然后把所有的request和response打印一下即可
1. nginx/haproxy来做反向代理,肯定可行,但是我配置的不太熟练
2. 自己写个简单的即可,正好golang写这类程序很快,所以就花了一会儿重新熟悉下go的语法(有阵子没看忘掉了......)然后写了个
主要的思路就是接收客户端的request,然后把里面的Host header改成真正的服务器的Host,然后转发,并把接收到的response回发个客户端即可
下面是全部的代码,用法很简单 ./tcpproxy 127.0.0.1 1080 www.baidu.com:80
// TcpProxy project main.go package main import ( "fmt" "net" "os" "regexp" "strconv" ) func main() { if len(os.Args) < 4 { fmt.Println("missing message!") return } ip := os.Args[1] port, err := strconv.Atoi(os.Args[2]) if err != nil { fmt.Println("error happened ,exit") return } addr := os.Args[3] host := "Host: " + addr Service(ip, port, addr, host) } func Service(ip string, port int, dstaddr string, dsthost string) { // listen and accept listen, err := net.ListenTCP("tcp", &net.TCPAddr{net.ParseIP(ip), port, ""}) if err != nil { fmt.Println("listen error: ", err.Error()) return } fmt.Println("init done...") for { client, err := listen.AcceptTCP() if err != nil { fmt.Println("accept error: ", err.Error()) continue } go Channal(client, dstaddr, dsthost) } } func Channal(client *net.TCPConn, addr string, rhost string) { tcpAddr, _ := net.ResolveTCPAddr("tcp4", addr) conn, err := net.DialTCP("tcp", nil, tcpAddr) if err != nil { fmt.Println("connection error: ", err.Error()) client.Close() return } go ReadRequest(client, conn, rhost) ReadResponse(conn, client) } func ReadRequest(lconn *net.TCPConn, rconn *net.TCPConn, dsthost string) { for { buf := make([]byte, 10240) n, err := lconn.Read(buf) if err != nil { break } mesg := changeHost(string(buf[:n]), dsthost) // print request fmt.Println(mesg) rconn.Write([]byte(mesg)) } lconn.Close() } func ReadResponse(lconn *net.TCPConn, rconn *net.TCPConn) { for { buf := make([]byte, 10240) n, err := lconn.Read(buf) if err != nil { break } fmt.Println(string(buf[:n])) rconn.Write(buf[:n]) } lconn.Close() } func changeHost(request string, newhost string) string { reg := regexp.MustCompile(`Host[^\r\n]+`) return reg.ReplaceAllString(request, newhost) }
相关文章推荐
- 一个简单的tcp代理实现
- golang简单实现一个基于TLS/SSL的 TCP服务器和客户端
- 一个极其简单的用golang net写的tcpip echoserver
- Linux网络编程:一个简单的正向代理服务器的实现
- goLang实现一个控制台的输入和输出(最简单的那种)
- 一个简单Tcp通信的实现
- Linux Socket 事件触发模型 epoll 示例 这里会写一个用C语言的TCP服务器的完全实现的简单程序
- golang使用net库实现一个简单的服务端和客户端通信
- 用Python实现一个简单的多线程TCP服务器的教程
- Golang实现简单tcp服务器04 -- 服务器的粘包处理
- win32汇编实现一个简单的TCP服务端程序(WinSock的简单认知应用)
- TCP方式实现一个简单的RPC
- 【远程调用框架】如何实现一个简单的RPC框架(三)优化一:利用动态代理改变用户服务调用方式
- golang信号处理及一个简单例子实现
- Golang实现简单tcp服务器03 -- 文本广播式聊天服务器/客户端
- 基于tcp的c/s模型的一个简单的socket实现
- 复习笔记:一个简单的动态代理实现
- java的动态代理,jdk动态代理,一个Sping AOP的简单实现
- 实现一个大容量、高并发的tcp代理,模拟移动网络报文延迟的情况
- 网络编程学习笔记二(实现一个基于简单TCP的用户注册程序)