用go语言写一个内网穿透
时间: 2023-12-29 20:52:08 浏览: 40
内网穿透是一种将内网中的应用程序映射到公网的技术,通常使用反向代理或者中转服务器来实现。
以下是一个使用 Go 语言编写的简单的内网穿透示例:
1. 首先需要安装 Go 语言环境,并创建一个新的 Go 项目。
2. 在项目目录下创建一个名为 `main.go` 的文件。
```go
package main
import (
"fmt"
"net"
"net/http"
"net/http/httputil"
)
func main() {
// 监听本地的 8080 端口
localAddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:8080")
if err != nil {
panic(err)
}
localListener, err := net.ListenTCP("tcp", localAddr)
if err != nil {
panic(err)
}
// 启动 HTTP 服务器
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, World!")
})
go http.Serve(localListener, nil)
// 监听公网的 80 端口,将请求转发到本地的 8080 端口
remoteAddr, err := net.ResolveTCPAddr("tcp", "0.0.0.0:80")
if err != nil {
panic(err)
}
remoteListener, err := net.ListenTCP("tcp", remoteAddr)
if err != nil {
panic(err)
}
for {
remoteConn, err := remoteListener.Accept()
if err != nil {
panic(err)
}
localConn, err := net.DialTCP("tcp", nil, localAddr)
if err != nil {
panic(err)
}
go func() {
defer remoteConn.Close()
defer localConn.Close()
proxy := httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http",
Host: "127.0.0.1:8080",
})
proxy.ServeHTTP(httputil.NewProxyResponseWriter(remoteConn), &http.Request{
Method: "GET",
URL: r.URL,
Proto: "HTTP/1.1",
ProtoMajor: 1,
ProtoMinor: 1,
Header: r.Header,
Host: r.Host,
})
}()
}
}
```
3. 使用 `go run main.go` 命令运行程序。
4. 现在你可以通过公网访问本地的应用程序了。例如,如果你的公网 IP 地址为 `1.2.3.4`,则可以通过 `http://1.2.3.4` 访问本地的应用程序。