commit fd522fdab7659bc5eaba227adb78103c4939b19b Author: aixiao Date: Fri Jul 19 15:05:40 2024 +0800 init diff --git a/amd64 b/amd64 new file mode 100644 index 0000000..42227bd Binary files /dev/null and b/amd64 differ diff --git a/build.sh b/build.sh new file mode 100644 index 0000000..44b84c2 --- /dev/null +++ b/build.sh @@ -0,0 +1,17 @@ +: + +_build() +{ + ARCH="amd64" + + for a in $ARCH + do + + CGO_ENABLED=0 GOOS=linux GOARCH=$a go build -ldflags '-w -s' -o $a main.go && upx -9 $a + done + + cp amd64 inet-ip + +} + +_build diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..a45e6ad --- /dev/null +++ b/go.mod @@ -0,0 +1,10 @@ +module main + +go 1.21.1 + +require github.com/sevlyar/go-daemon v0.1.6 + +require ( + github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect + golang.org/x/sys v0.22.0 // indirect +) diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..c032531 --- /dev/null +++ b/go.sum @@ -0,0 +1,6 @@ +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 h1:iQTw/8FWTuc7uiaSepXwyf3o52HaUYcV+Tu66S3F5GA= +github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8= +github.com/sevlyar/go-daemon v0.1.6 h1:EUh1MDjEM4BI109Jign0EaknA2izkOyi0LV3ro3QQGs= +github.com/sevlyar/go-daemon v0.1.6/go.mod h1:6dJpPatBT9eUwM5VCw9Bt6CdX9Tk6UWvhW3MebLDRKE= +golang.org/x/sys v0.22.0 h1:RI27ohtqKCnwULzJLqkv897zojh5/DwS/ENaMzUOaWI= +golang.org/x/sys v0.22.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= diff --git a/inet-ip b/inet-ip new file mode 100644 index 0000000..42227bd Binary files /dev/null and b/inet-ip differ diff --git a/inet-ip.conf b/inet-ip.conf new file mode 100644 index 0000000..3bb9b4a --- /dev/null +++ b/inet-ip.conf @@ -0,0 +1,17 @@ +server { + listen 80; + listen 443 ssl; + server_name inet-ip.aixiao.me; + ssl_certificate /opt/nginx/cert/aixiao.me.cer; + ssl_certificate_key /opt/nginx/cert/aixiao.me.key; + ssl_session_timeout 5m; + ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_prefer_server_ciphers on; + + location / { + proxy_pass http://localhost:90; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + } +} diff --git a/main.go b/main.go new file mode 100644 index 0000000..8a48d22 --- /dev/null +++ b/main.go @@ -0,0 +1,93 @@ +package main + +import ( + "fmt" + "log" + "net/http" + "os" + "os/signal" + "strings" + "syscall" + + "github.com/sevlyar/go-daemon" +) + +// 获取客户端IP的函数 +func getClientIP(r *http.Request) string { + // 尝试从X-Forwarded-For头部获取IP + forwarded := r.Header.Get("X-Forwarded-For") + if forwarded != "" { + // X-Forwarded-For可能包含多个IP地址,取第一个 + ips := strings.Split(forwarded, ",") + return strings.TrimSpace(ips[0]) + } + // 尝试从X-Real-Ip头部获取IP + realIP := r.Header.Get("X-Real-Ip") + if realIP != "" { + return realIP + } + // 最后从RemoteAddr中获取IP + return r.RemoteAddr +} + +// 处理HTTP请求的函数 +func handler(w http.ResponseWriter, r *http.Request) { + clientIP := getClientIP(r) + response := fmt.Sprintf("%s", clientIP) + fmt.Fprintln(w, response) + log.Printf("Handled request from %s\n", clientIP) // 记录日志 +} + +func main() { + // 定义守护进程的启动配置 + cntxt := &daemon.Context{ + PidFileName: "inet-ip.pid", + PidFilePerm: 0644, + LogFileName: "inet-ip.log", + LogFilePerm: 0640, + WorkDir: "./", + Umask: 027, + Args: []string{"[inet-ip]"}, + } + + // 启动守护进程 + d, err := cntxt.Reborn() + if err != nil { + log.Fatal("Unable to run: ", err) + } + if d != nil { + return + } + defer cntxt.Release() + + // 设置日志输出到文件 + logFile, err := os.OpenFile("inet-ip.log", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0666) + if err != nil { + log.Fatalf("Error opening log file: %s", err) + } + defer logFile.Close() + log.SetOutput(logFile) + + // 启动HTTP服务器 + go serveHTTP() + + // 创建一个通道来接收操作系统信号 + stop := make(chan os.Signal, 1) + signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM) + + log.Println("Server started") + + // 等待信号 + <-stop + + // 服务器停止时记录日志 + log.Println("Server stopped") +} + +func serveHTTP() { + http.HandleFunc("/", handler) + fmt.Println("Starting server on :90") + if err := http.ListenAndServe(":90", nil); err != nil && err != http.ErrServerClosed { + log.Fatalf("Error starting server: %s", err) + } +}