wg-ops/tool_create.py

261 lines
8.4 KiB
Python
Raw Normal View History

2021-07-13 13:59:59 +08:00
# -*- coding: utf-8 -*-
import os
import getpass
2021-08-15 17:07:03 +08:00
from tool_common import load_config, save_config, json_to_base64
config = load_config()
if config:
2021-07-26 21:32:23 +08:00
print("Valid config found. Creation of server is skipped.")
2021-07-13 13:59:59 +08:00
exit(0)
else:
2021-07-26 21:32:23 +08:00
print("No config found. Start creating interactively.")
2021-07-26 21:32:23 +08:00
print("====== Choose Role ======")
2021-07-13 13:59:59 +08:00
op_mode = input("What will this node act as? (C)lient [S]erver [M]ixed: ").strip().lower()
if not op_mode:
print("Default to client mode.")
op_mode = "c"
if op_mode not in ("c", "s", "m"):
print("Invalid node mode. Please try again.")
exit(1)
udp2raw_config = {
"server": [],
2021-08-04 21:11:43 +08:00
"client": [],
"demuxer": [], # w2u
2021-07-13 13:59:59 +08:00
}
if op_mode in ("s", "m"):
print("====== Configuring udp2raw server ======")
while True:
print("====== Adding UDP2RAW Server {} ======".format(len(udp2raw_config["server"]) + 1))
while True:
udp_server_port = input("Please select an Internet-Facing port for incoming udp2raw connection: ").strip()
if not udp_server_port:
print("A udp2raw listen port is required. Try again.")
continue
break
while True:
udp_server_password = getpass.getpass('Tunnel Password: ').strip()
2021-07-13 13:59:59 +08:00
if not udp_server_password:
print("For security reasons, a udp2raw tunnel password is required. Try again.")
2021-07-13 13:59:59 +08:00
continue
if udp_server_password != getpass.getpass('Confirm Tunnel Password: ').strip():
print("Password mismatch. Try again.")
continue
2021-07-13 13:59:59 +08:00
break
is_enable_speeder = input("Enable UDP Speeder for this tunnel? [y/N]: ").strip()
if is_enable_speeder and is_enable_speeder.lower() in ('y', 'yes'):
2021-07-27 08:22:35 +08:00
speeder_ratio = input("Enter UDP Speeder Ratio (default to 20:10. Use 2:4 for gaming usage): ").strip() or "20:10"
2021-07-16 15:19:56 +08:00
speeder_info = {
"enable": True,
"port": 27100 + len(udp2raw_config["server"]),
"ratio": speeder_ratio
}
else:
speeder_info = {
"enable": False
}
2021-07-13 13:59:59 +08:00
udp2raw_config["server"].append({
"port": udp_server_port,
2021-07-16 15:19:56 +08:00
"password": udp_server_password,
"speeder": speeder_info
2021-07-13 13:59:59 +08:00
})
if not input("Add more udp2raw server? (Keep empty to finish): ").strip():
2021-07-13 13:59:59 +08:00
break
if op_mode in ("c", "m"):
print("====== Configuring udp2raw client ======")
while True:
print("====== Adding UDP2RAW Client {} ======".format(len(udp2raw_config["client"]) + 1))
while True:
udp_server_address = input("Please input remote node internet-facing udp2raw ip:port : ").strip()
if not udp_server_address:
print("A udp2raw remote server information is required. Try again.")
continue
break
while True:
udp_server_password = getpass.getpass('Tunnel Password: ').strip()
2021-07-13 13:59:59 +08:00
if not udp_server_password:
print("A udp2raw tunnel password is required. Try again.")
continue
if udp_server_password != getpass.getpass('Confirm Tunnel Password: ').strip():
print("Password mismatch. Try again.")
continue
2021-07-13 13:59:59 +08:00
break
is_enable_speeder = input("Enable UDP Speeder for this tunnel? [y/N]: ").strip()
if is_enable_speeder and is_enable_speeder.lower() in ('y', 'yes'):
2021-07-27 08:22:35 +08:00
speeder_ratio = input("Enter UDP Speeder Ratio (default to 20:10. Use 2:4 for gaming usage): ").strip() or "20:10"
2021-07-16 15:19:56 +08:00
speeder_info = {
"enable": True,
"port": 28100 + len(udp2raw_config["server"]),
"ratio": speeder_ratio
}
else:
speeder_info = {
"enable": False
}
2021-08-04 21:11:43 +08:00
is_enable_balance = input("Enable Load Balance? [y/N]: ").strip()
if is_enable_balance and is_enable_balance.lower() in ('y', 'yes'):
balance_count = input("Enter Balance Underlay Connection counts (default to 10): ").strip() or "10"
balance_count = int(balance_count)
default_balancer_port = 29000 + len(udp2raw_config["demuxer"])
balancer_port = input("Enter Balancer Listen Port (default to {}): ".format(default_balancer_port)).strip() or default_balancer_port
balancer_port = int(balancer_port)
udp2raw_config["demuxer"].append({
"port": balancer_port,
"forward": 29100 + len(udp2raw_config["client"]),
"size": balance_count
})
for i in range(balance_count):
udp2raw_config["client"].append({
"remote": udp_server_address,
"password": udp_server_password,
"port": 29100 + len(udp2raw_config["client"]),
"speeder": speeder_info,
"balanced": True
})
else:
udp2raw_config["client"].append({
"remote": udp_server_address,
"password": udp_server_password,
"port": 29100 + len(udp2raw_config["client"]),
"speeder": speeder_info,
"balanced": False
})
2021-07-16 15:19:56 +08:00
2021-07-13 13:59:59 +08:00
if not input("Add more udp2raw client? (Keep empty to finish)").strip():
break
wg_prik = os.getenv("WG_MYPRIK")
wg_pubk = os.getenv("WG_MYPUBK")
wg_mtu = "1000"
2021-07-13 15:16:10 +08:00
wg_public_ip = os.getenv("WG_PUBLICIP")
print('''
2021-07-31 03:06:58 +08:00
====== Your WireGuard Public Key ======
2021-07-13 15:16:10 +08:00
{}
======= Your Public IP Address ========
{}
=======================================
'''.format(wg_pubk, wg_public_ip))
2021-07-13 13:59:59 +08:00
2021-07-31 03:06:58 +08:00
ifname = input("Input new WireGuard interface name (wg0):").strip() or "wg0"
listen_port = input("Input new WireGuard listen port (51820): ").strip() or "51820"
2021-07-13 13:59:59 +08:00
while True:
2021-07-31 03:06:58 +08:00
ifip = input("Input WireGuard interface ip (Example: 10.0.0.1)\n> ").strip()
2021-07-13 13:59:59 +08:00
if not ifip:
2021-07-31 03:06:58 +08:00
print("You MUST set a valid WireGuard interface IP. Try Again.")
2021-07-13 13:59:59 +08:00
continue
break
print("Saving config...")
config = {
"version": 1,
"mode": op_mode,
"pubkey": wg_pubk,
"prikey": wg_prik,
"mtu": wg_mtu,
"interface": ifname,
"ip": ifip,
"listen": listen_port,
"peers": [],
"udp2raw": udp2raw_config
}
save_config(config)
if op_mode in ("s", "m"):
2021-07-26 21:32:23 +08:00
if ifip.endswith(".1"):
suggest_allowed = "{}.0/24".format('.'.join(ifip.split('.')[:-1]))
else:
suggest_allowed = ifip
print("===== Quick Import =====")
for info in udp2raw_config["server"]:
2021-07-26 21:32:23 +08:00
target_quick_config = {
"udp2raw_client": {
"remote": "{}:{}".format(wg_public_ip, info["port"]),
"password": "",
"port": "29100",
"speeder": info["speeder"]
},
2021-07-26 21:32:23 +08:00
"server_pubkey": wg_pubk,
"suggest_allowed": suggest_allowed
}
2021-07-26 21:32:23 +08:00
print("Connect to this server via tunnel at port {}: (credential excluded) \n".format(info["port"]))
print("#QCS#{}\n".format(json_to_base64(target_quick_config)))
# Configure Peer
2021-07-13 13:59:59 +08:00
while True:
print("====== Adding Peer {} ======".format(len(config["peers"]) + 1))
2021-07-13 13:59:59 +08:00
while True:
2021-07-31 03:06:58 +08:00
peer_pubk = input("Enter WireGuard Peer Public Key: ").strip()
2021-07-13 13:59:59 +08:00
if not peer_pubk:
print("A public key is required. Try Again.")
continue
break
while True:
2021-07-31 03:06:58 +08:00
peer_allowed = input("Enter WireGuard Peer AllowedIPs (CIDR, Example: 10.0.0.0/24)\n> ").strip()
2021-07-13 13:59:59 +08:00
if not peer_allowed:
print("Peer allowed ips required. Try Again.")
continue
break
if config["udp2raw"]["client"]:
2021-07-26 21:32:23 +08:00
print(">>> Choose from following udp2raw clients <<<")
for index, client_info in enumerate(config["udp2raw"]["client"]):
print("[{}] UDP2Raw Tunnel to Remote {}".format(index + 1, client_info["remote"]))
2021-07-13 13:59:59 +08:00
2021-07-31 03:06:58 +08:00
peer_endpoint = input("Enter WireGuard Peer Endpoint (ID from list, default to 1): ").strip() or "1"
peer_keepalive = input("Enter WireGuard Peer Keep Alive seconds (default to 30): ").strip() or "30"
2021-07-16 11:56:50 +08:00
else:
2021-07-26 21:32:23 +08:00
peer_endpoint = ""
peer_keepalive = ""
2021-07-13 13:59:59 +08:00
config["peers"].append({
2021-07-13 13:59:59 +08:00
"pubkey": peer_pubk,
"allowed": peer_allowed,
"endpoint": peer_endpoint,
"keepalive": peer_keepalive
})
print("Saving config...")
save_config(config)
2021-07-13 13:59:59 +08:00
if not input("Add more peers? (Keep empty to finish)").strip():
break