static string GetClientConfig(KeyData clientKey, string serverKey, string serverIp, string serverPort, string subnet, int ip) { var sb = new StringBuilder(); sb.AppendLine("[Interface]"); sb.AppendLine($"PrivateKey = {clientKey.PrivateKey}"); sb.AppendLine($"Address = {GetSubnetIp(subnet, ip++)}/24"); sb.AppendLine("DNS = 94.140.14.14,94.140.15.15"); sb.AppendLine(string.Empty); sb.AppendLine("[Peer]"); sb.AppendLine($"PublicKey = {serverKey}"); sb.AppendLine($"PresharedKey = {clientKey.PresharedKey}"); sb.AppendLine($"Endpoint = {serverIp}:{serverPort}"); sb.AppendLine("PersistentKeepalive = 25"); sb.AppendLine($"AllowedIPs = {subnet}/24"); return(sb.ToString()); }
static void Main(string[] args) { bool needQrCode = false; try { var utf8 = new UTF8Encoding(false); var configFolder = Path.Combine(Directory.GetCurrentDirectory(), "config"); Console.WriteLine("Config folder: " + configFolder); if (args.Length == 0) { Console.WriteLine("Usage:"); Console.WriteLine("--config <server_ip> <server_port> <subnet> <clients_count>: generate wg config"); Console.WriteLine("--folder <config folder override>"); return; } for (int i = 0; i < args.Length; i++) { var arg = args[i]; switch (arg) { case "--folder": { configFolder = args[++i]; Console.WriteLine("configFolder folder override: " + configFolder); break; } case "--routes": { Directory.CreateDirectory(configFolder); var fileName = args[++i]; Console.WriteLine("Resolving dns..."); var hosts = Utils.ReadConsoleLines(true); ResolveDns(hosts, out string ips_cidr, out string ips_mask); Console.WriteLine("Saving resolved to files..."); File.WriteAllText(Path.Combine(configFolder, $"cidr_{fileName}.txt"), ips_cidr); File.WriteAllText(Path.Combine(configFolder, $"mask_{fileName}.txt"), ips_mask); Console.WriteLine("Done"); break; } case "--cidr-convert": { Directory.CreateDirectory(configFolder); var fileName = args[++i]; Console.WriteLine("Converting cidr subnets..."); var cidrSubnets = Utils.ReadConsoleLines(true); var converted = ConvertCIDR(cidrSubnets); Console.WriteLine("Saving converted to file..."); File.WriteAllLines(Path.Combine(configFolder, $"{fileName}.txt"), converted); Console.WriteLine("Done"); break; } case "--qrcode": { needQrCode = true; Console.WriteLine("Generating QR codes enabled"); break; } case "--config": { Directory.CreateDirectory(configFolder); var serverIp = args[++i]; var serverPort = args[++i]; var subnet = args[++i]; int clients = int.Parse(args[++i]); if (clients > 254) { throw new Exception("No more than 254 clients"); } Console.WriteLine("Generating configs..."); var serverKeys = KeyData.Generate(); var clientKeys = KeyData.Generate(clients); for (int j = 0; j < clientKeys.Length; j++) { var configName = $"client{j + 1:D3}"; var configData = GetClientConfig(clientKeys[j], serverKeys.PublicKey, serverIp, serverPort, subnet, j + 2); var configPath = Path.Combine(configFolder, $"{configName}.conf"); File.WriteAllText(configPath, configData, utf8); if (needQrCode) { var configQRPath = Path.Combine(configFolder, $"{configName}.png"); Utils.GenerateQrCode(configData, configQRPath); } } var serverConfigPath = Path.Combine(configFolder, "server.conf"); var serverConfigData = GetServerConfig(serverKeys.PrivateKey, clientKeys, subnet, serverPort); File.WriteAllText(serverConfigPath, serverConfigData, utf8); Console.WriteLine("Done"); break; } default: throw new Exception("Unknown argument: " + arg); } } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }