Files
wiki/wireguard/wireguard.py
2024-08-30 13:02:58 +09:00

160 lines
4.8 KiB
Python

#!/usr/bin/env python
import sys, os
CYAN, YELLOW, GREEN, WHITE = '\x1b[96m', '\x1b[93m', "\033[92m", '\x1b[0m'
def dedent(text):
return '\n'.join(
line.lstrip() for line in text.splitlines()
)
def keygen():
if os.system('wg --version >/dev/null 2>&1'):
print(dedent(f'''\n
🚨 Ensure that WireGuard is installed on your system.
{YELLOW}sudo apt update && sudo apt install -y wireguard\n{WHITE}
'''))
exit(-1)
private = os.popen('wg genkey').read().strip()
return dict(
private=private,
public=os.popen(f'echo {private} | wg pubkey').read().strip()
)
def generate_config(server_ip, server_port=51820):
server_key, client_key = keygen(), keygen()
with open('server.sh', 'w') as f:
f.write(dedent(f'''\
#!/bin/sh
wg --version >/dev/null
if [ $? -ne 0 ]; then
sudo apt update && sudo apt install -y wireguard
fi
mkdir -p ~/.wg
cat > ~/.wg/server.conf <<EOF
[Interface]
PrivateKey = {server_key['private']}
Address = 10.0.0.1/24
ListenPort = {server_port}
[Peer]
PublicKey = {client_key['public']}
AllowedIPs = 10.0.0.0/24
EOF
chmod 600 ~/.wg/server.conf
sudo wg showconf server >/dev/null 2>&1
if [ $? -eq 0 ]; then
if [ "$1" = "down" ]; then
sudo wg-quick down ~/.wg/server.conf >/dev/null 2>&1
echo "interface: server deleted"
else
echo
sudo wg
echo
fi
else
if [ "$1" = "down" ]; then
echo "no interface: server"
else
sudo wg-quick up ~/.wg/server.conf >/dev/null 2>&1
echo
echo "interface: server created"
echo
sudo wg
echo
fi
fi
'''))
with open('client.sh', 'w') as f:
f.write(dedent(f'''\
#!/bin/sh
wg --version >/dev/null
if [ $? -ne 0 ]; then
sudo apt update && sudo apt install -y wireguard
fi
mkdir -p ~/.wg
cat > ~/.wg/client.conf <<EOF
[Interface]
PrivateKey = {client_key['private']}
Address = 10.0.0.2/24
[Peer]
PublicKey = {server_key['public']}
Endpoint = {server_ip}:{server_port}
AllowedIPs = 10.0.0.1/32
PersistentKeepalive = 25
EOF
chmod 600 ~/.wg/client.conf
sudo wg showconf client >/dev/null >/dev/null 2>&1
if [ $? -eq 0 ]; then
if [ "$1" = "down" ]; then
sudo wg-quick down ~/.wg/client.conf >/dev/null 2>&1
echo "interface: client deleted"
else
echo
sudo wg
echo
fi
else
if [ "$1" = "down" ]; then
echo "no interface: client"
else
sudo wg-quick up ~/.wg/client.conf >/dev/null 2>&1
echo
echo "interface: client created"
echo
sudo wg
echo
fi
fi
'''))
os.system('chmod +x server.sh client.sh')
return dedent(f'''
Shell scripts generated: ./server.sh ./client.sh\n
{YELLOW}[Server]
- External IP: {server_ip}
- Internal IP: 10.0.0.1
{CYAN}[Client]
- Internal IP: 10.0.0.2\n{WHITE}
🚨 {WHITE}{server_ip}{YELLOW}:{server_port}/udp{WHITE} should be reachable from {CYAN}client\n
{WHITE}Handshake:
{YELLOW}(server) $ ./server.sh
{CYAN}(client) $ ./client.sh\n
{WHITE}cURL test:
{CYAN}(client) $ python -m http.server
{YELLOW}(server) $ curl 10.0.0.2:8000\n
{WHITE}Disconnect:
{CYAN}(server) $ ./server.sh down
{YELLOW}(client) $ ./client.sh down{WHITE}
''')
if __name__ == '__main__':
if len(sys.argv) != 2:
print(dedent(f'''
Usage: {GREEN}python3 wireguard.py SERVER_IP_OR_DOMAIN [PORT]{WHITE}
Examples:
{GREEN}python3 wireguard.py 192.168.0.2
python3 wireguard.py wg.yauk.tv 12345{WHITE}
'''))
else:
print(generate_config(sys.argv[1]))