소스 검색

* nil check for IP.To4() result
* use interface IP address in generated config

Rod Hynes 9 년 전
부모
커밋
b1e6488a8e
3개의 변경된 파일23개의 추가작업 그리고 21개의 파일을 삭제
  1. 8 8
      Server/main.go
  2. 3 0
      psiphon/networkInterface.go
  3. 12 13
      psiphon/server/config.go

+ 8 - 8
Server/main.go

@@ -31,25 +31,25 @@ import (
 
 
 func main() {
 func main() {
 
 
-	var generateServerIPaddress, newConfigFilename, newServerEntryFilename string
-	var networkInterface string
+	var generateServerIPaddress, generateServerNetworkInterface string
+	var generateConfigFilename, generateServerEntryFilename string
 	var generateWebServerPort, generateSSHServerPort, generateObfuscatedSSHServerPort int
 	var generateWebServerPort, generateSSHServerPort, generateObfuscatedSSHServerPort int
 	var runConfigFilenames stringListFlag
 	var runConfigFilenames stringListFlag
 
 
 	flag.StringVar(
 	flag.StringVar(
-		&newConfigFilename,
+		&generateConfigFilename,
 		"newConfig",
 		"newConfig",
 		server.SERVER_CONFIG_FILENAME,
 		server.SERVER_CONFIG_FILENAME,
 		"generate new config with this `filename`")
 		"generate new config with this `filename`")
 
 
 	flag.StringVar(
 	flag.StringVar(
-		&newServerEntryFilename,
+		&generateServerEntryFilename,
 		"newServerEntry",
 		"newServerEntry",
 		server.SERVER_ENTRY_FILENAME,
 		server.SERVER_ENTRY_FILENAME,
 		"generate new server entry with this `filename`")
 		"generate new server entry with this `filename`")
 
 
 	flag.StringVar(
 	flag.StringVar(
-		&networkInterface,
+		&generateServerNetworkInterface,
 		"interface",
 		"interface",
 		"",
 		"",
 		"generate server entry with this `network-interface`")
 		"generate server entry with this `network-interface`")
@@ -104,7 +104,7 @@ func main() {
 		configFileContents, serverEntryFileContents, err := server.GenerateConfig(
 		configFileContents, serverEntryFileContents, err := server.GenerateConfig(
 			&server.GenerateConfigParams{
 			&server.GenerateConfigParams{
 				ServerIPAddress:         generateServerIPaddress,
 				ServerIPAddress:         generateServerIPaddress,
-				ServerNetworkInterface:  networkInterface,
+				ServerNetworkInterface:  generateServerNetworkInterface,
 				WebServerPort:           generateWebServerPort,
 				WebServerPort:           generateWebServerPort,
 				SSHServerPort:           generateSSHServerPort,
 				SSHServerPort:           generateSSHServerPort,
 				ObfuscatedSSHServerPort: generateObfuscatedSSHServerPort,
 				ObfuscatedSSHServerPort: generateObfuscatedSSHServerPort,
@@ -114,13 +114,13 @@ func main() {
 			fmt.Errorf("generate failed: %s", err)
 			fmt.Errorf("generate failed: %s", err)
 			os.Exit(1)
 			os.Exit(1)
 		}
 		}
-		err = ioutil.WriteFile(newConfigFilename, configFileContents, 0600)
+		err = ioutil.WriteFile(generateConfigFilename, configFileContents, 0600)
 		if err != nil {
 		if err != nil {
 			fmt.Errorf("error writing configuration file: %s", err)
 			fmt.Errorf("error writing configuration file: %s", err)
 			os.Exit(1)
 			os.Exit(1)
 		}
 		}
 
 
-		err = ioutil.WriteFile(newServerEntryFilename, serverEntryFileContents, 0600)
+		err = ioutil.WriteFile(generateServerEntryFilename, serverEntryFileContents, 0600)
 		if err != nil {
 		if err != nil {
 			fmt.Errorf("error writing server entry file: %s", err)
 			fmt.Errorf("error writing server entry file: %s", err)
 			os.Exit(1)
 			os.Exit(1)

+ 3 - 0
psiphon/networkInterface.go

@@ -55,6 +55,9 @@ func GetInterfaceIPAddress(listenInterface string) (string, error) {
 			}
 			}
 			// TODO: IPv6 support
 			// TODO: IPv6 support
 			ip = iptype.IP.To4()
 			ip = iptype.IP.To4()
+			if ip == nil {
+				continue
+			}
 			return ip.String(), nil
 			return ip.String(), nil
 		}
 		}
 	}
 	}

+ 12 - 13
psiphon/server/config.go

@@ -367,8 +367,9 @@ type GenerateConfigParams struct {
 	// ServerIPAddress is the public IP address of the server.
 	// ServerIPAddress is the public IP address of the server.
 	ServerIPAddress string
 	ServerIPAddress string
 
 
-	// ServerNetworkInterface is the (optional) nic to expose the server on
-	// when running in unprivileged mode but want to allow external clients to connect.
+	// ServerNetworkInterface specifies a network interface to
+	// use to determine the ServerIPAddress automatically. When
+	// set, ServerIPAddress is ignored.
 	ServerNetworkInterface string
 	ServerNetworkInterface string
 
 
 	// WebServerPort is the listening port of the web server.
 	// WebServerPort is the listening port of the web server.
@@ -390,13 +391,19 @@ type GenerateConfigParams struct {
 // the config file and server entry as necessary.
 // the config file and server entry as necessary.
 func GenerateConfig(params *GenerateConfigParams) ([]byte, []byte, error) {
 func GenerateConfig(params *GenerateConfigParams) ([]byte, []byte, error) {
 
 
-	// TODO: support disabling web server or a subset of protocols
-
 	serverIPaddress := params.ServerIPAddress
 	serverIPaddress := params.ServerIPAddress
 	if serverIPaddress == "" {
 	if serverIPaddress == "" {
 		serverIPaddress = DEFAULT_SERVER_IP_ADDRESS
 		serverIPaddress = DEFAULT_SERVER_IP_ADDRESS
 	}
 	}
 
 
+	if params.ServerNetworkInterface != "" {
+		var err error
+		serverIPaddress, err = psiphon.GetInterfaceIPAddress(params.ServerNetworkInterface)
+		if err != nil {
+			return nil, nil, psiphon.ContextError(err)
+		}
+	}
+
 	// Web server config
 	// Web server config
 
 
 	webServerPort := params.WebServerPort
 	webServerPort := params.WebServerPort
@@ -469,14 +476,6 @@ func GenerateConfig(params *GenerateConfigParams) ([]byte, []byte, error) {
 		return nil, nil, psiphon.ContextError(err)
 		return nil, nil, psiphon.ContextError(err)
 	}
 	}
 
 
-	// Find IP address of the network interface (if not loopback)
-	serverNetworkInterface := params.ServerNetworkInterface
-	serverNetworkInterfaceIP, err := psiphon.GetInterfaceIPAddress(serverNetworkInterface)
-	if err != nil {
-		serverNetworkInterfaceIP = serverIPaddress
-		fmt.Printf("Could not find IP address of nic.  Falling back to %s\n", serverIPaddress)
-	}
-
 	// Assemble config and server entry
 	// Assemble config and server entry
 
 
 	config := &Config{
 	config := &Config{
@@ -516,7 +515,7 @@ func GenerateConfig(params *GenerateConfigParams) ([]byte, []byte, error) {
 	}
 	}
 
 
 	serverEntry := &psiphon.ServerEntry{
 	serverEntry := &psiphon.ServerEntry{
-		IpAddress:            serverNetworkInterfaceIP,
+		IpAddress:            serverIPaddress,
 		WebServerPort:        fmt.Sprintf("%d", webServerPort),
 		WebServerPort:        fmt.Sprintf("%d", webServerPort),
 		WebServerSecret:      webServerSecret,
 		WebServerSecret:      webServerSecret,
 		WebServerCertificate: strippedWebServerCertificate,
 		WebServerCertificate: strippedWebServerCertificate,