proxy multi listen

This commit is contained in:
Ljcbaby
2025-09-10 21:33:46 +08:00
committed by Yuhui Xu
parent cc804e81b6
commit 7884531a24
2 changed files with 40 additions and 32 deletions

View File

@@ -62,7 +62,7 @@ func accessHandler(next http.Handler) http.Handler {
type settingType struct { type settingType struct {
birdSocket string birdSocket string
listen string listen []string
allowedNets []*net.IPNet allowedNets []*net.IPNet
tr_bin string tr_bin string
tr_flags []string tr_flags []string
@@ -76,32 +76,40 @@ func main() {
parseSettings() parseSettings()
tracerouteAutodetect() tracerouteAutodetect()
fmt.Printf("Listening on %s...\n", setting.listen) mux := http.NewServeMux()
var l net.Listener // Prepare HTTP server
var err error mux.HandleFunc("/", invalidHandler)
mux.HandleFunc("/bird", birdHandler)
mux.HandleFunc("/bird6", birdHandler)
mux.HandleFunc("/traceroute", tracerouteHandler)
mux.HandleFunc("/traceroute6", tracerouteHandler)
if strings.HasPrefix(setting.listen, "/") { for _, listenAddr := range setting.listen {
// Delete existing socket file, ignore errors (will fail later anyway) go func(addr string) {
os.Remove(setting.listen) fmt.Printf("Listening on %s...\n", addr)
l, err = net.Listen("unix", setting.listen)
} else { var l net.Listener
listenAddr := setting.listen var err error
if !strings.Contains(listenAddr, ":") {
listenAddr = ":" + listenAddr if strings.HasPrefix(addr, "/") {
} // Delete existing socket file, ignore errors (will fail later anyway)
l, err = net.Listen("tcp", listenAddr) os.Remove(addr)
l, err = net.Listen("unix", addr)
} else {
if !strings.Contains(addr, ":") {
addr = ":" + addr
}
l, err = net.Listen("tcp", addr)
}
if err != nil {
panic(err)
}
http.Serve(l, handlers.LoggingHandler(os.Stdout, accessHandler(mux)))
}(listenAddr)
} }
if err != nil { select {}
panic(err)
}
// Start HTTP server
http.HandleFunc("/", invalidHandler)
http.HandleFunc("/bird", birdHandler)
http.HandleFunc("/bird6", birdHandler)
http.HandleFunc("/traceroute", tracerouteHandler)
http.HandleFunc("/traceroute6", tracerouteHandler)
http.Serve(l, handlers.LoggingHandler(os.Stdout, accessHandler(http.DefaultServeMux)))
} }

View File

@@ -11,12 +11,12 @@ import (
) )
type viperSettingType struct { type viperSettingType struct {
BirdSocket string `mapstructure:"bird_socket"` BirdSocket string `mapstructure:"bird_socket"`
Listen string `mapstructure:"listen"` Listen []string `mapstructure:"listen"`
AllowedNets string `mapstructure:"allowed_ips"` AllowedNets string `mapstructure:"allowed_ips"`
TracerouteBin string `mapstructure:"traceroute_bin"` TracerouteBin string `mapstructure:"traceroute_bin"`
TracerouteFlags string `mapstructure:"traceroute_flags"` TracerouteFlags string `mapstructure:"traceroute_flags"`
TracerouteRaw bool `mapstructure:"traceroute_raw"` TracerouteRaw bool `mapstructure:"traceroute_raw"`
} }
// Parse settings with viper, and convert to legacy setting format // Parse settings with viper, and convert to legacy setting format
@@ -37,7 +37,7 @@ func parseSettings() {
pflag.String("bird", "/var/run/bird/bird.ctl", "socket file for bird, set either in parameter or environment variable BIRD_SOCKET") pflag.String("bird", "/var/run/bird/bird.ctl", "socket file for bird, set either in parameter or environment variable BIRD_SOCKET")
viper.BindPFlag("bird_socket", pflag.Lookup("bird")) viper.BindPFlag("bird_socket", pflag.Lookup("bird"))
pflag.String("listen", "8000", "listen address, set either in parameter or environment variable BIRDLG_PROXY_PORT") pflag.StringSlice("listen", []string{"8000"}, "listen address, set either in parameter or environment variable BIRDLG_PROXY_PORT")
viper.BindPFlag("listen", pflag.Lookup("listen")) viper.BindPFlag("listen", pflag.Lookup("listen"))
pflag.String("allowed", "", "IPs or networks allowed to access this proxy, separated by commas. Don't set to allow all IPs.") pflag.String("allowed", "", "IPs or networks allowed to access this proxy, separated by commas. Don't set to allow all IPs.")