diff --git a/actions/wireguard b/actions/wireguard index a8a309316..693477bcb 100755 --- a/actions/wireguard +++ b/actions/wireguard @@ -43,6 +43,18 @@ def parse_arguments(): help='Remove a client') remove_client.add_argument('publickey', help=PUBLIC_KEY_HELP) + add_server = subparsers.add_parser('add-server', help='Add a server') + add_server.add_argument('--endpoint', required=True, + help='Server endpoint') + add_server.add_argument('--client-ip', required=True, + help='Client IP address provided by server') + add_server.add_argument('--public-key', required=True, + help='Public key of the server') + add_server.add_argument('--pre-shared-key', help='Pre-shared key') + add_server.add_argument( + '--all-outgoing', action='store_true', + help='Use this connection to send all outgoing traffic') + subparsers.required = True return parser.parse_args() @@ -52,6 +64,9 @@ def subcommand_setup(_): subprocess.run( ['ip', 'link', 'add', 'dev', SERVER_INTERFACE, 'type', 'wireguard'], check=True) + subprocess.run( + ['wg', 'set', SERVER_INTERFACE, 'listen-port', '51820'], check=True) + # TODO: generate key pair def subcommand_get_info(_): @@ -82,6 +97,7 @@ def subcommand_get_info(_): } clients.append(client_info) + # TODO: Add servers info from other interfaces. info = { 'server': server, 'clients': clients, @@ -103,6 +119,31 @@ def subcommand_remove_client(arguments): check=True) +def subcommand_add_server(arguments): + """Add a server.""" + output = subprocess.check_output( + ['wg', 'show', 'interfaces']).decode().strip() + interfaces = output.split() + interface_num = 1 + for interface in interfaces: + new_interface_name = 'wg' + str(interface_num) + if interface == new_interface_name: + interface_num += 1 + else: + break + + subprocess.run( + ['ip', 'link', 'add', 'dev', new_interface_name, 'type', 'wireguard'], + check=True) + + args = ['wg', 'set', interface, 'peer', arguments.public_key] + if arguments.pre_shared_key: + args += ['preshared-key', arguments.pre_shared_key] + + args += ['endpoint', arguments.endpoint] + subprocess.run(args, check=True) + + def main(): """Parse arguments and perform all duties.""" arguments = parse_arguments() diff --git a/plinth/modules/wireguard/forms.py b/plinth/modules/wireguard/forms.py index 54c65a584..2fe72d2d4 100644 --- a/plinth/modules/wireguard/forms.py +++ b/plinth/modules/wireguard/forms.py @@ -27,3 +27,28 @@ class AddClientForm(forms.Form): public_key = forms.CharField( label=_('Public Key'), strip=True, help_text=_('Public key of the peer.')) + + +class AddServerForm(forms.Form): + """Form to add server.""" + endpoint = forms.CharField( + label=_('Endpoint'), strip=True, + help_text=_('Server endpoint with the form "ip:port".')) + + client_ip_address = forms.CharField( + label=_('Client IP address provided by server'), strip=True, + help_text=_('Client IP address provided by server.')) + + public_key = forms.CharField( + label=_('Public key of the server'), strip=True, + help_text=_('Public key of the server.')) + + pre_shared_key = forms.CharField( + label=_('Pre-shared key'), strip=True, required=False, + help_text=_('Optional: a shared secret key provided by the server to ' + 'add an additional layer of encryption.')) + + all_outgoing_traffic = forms.BooleanField( + label=_('Use this connection to send all outgoing traffic'), + required=False, + help_text=_('Use this connection to send all outgoing traffic.')) diff --git a/plinth/modules/wireguard/templates/wireguard.html b/plinth/modules/wireguard/templates/wireguard.html index c94ceef0d..584c7abd6 100644 --- a/plinth/modules/wireguard/templates/wireguard.html +++ b/plinth/modules/wireguard/templates/wireguard.html @@ -74,7 +74,12 @@
{% trans "No connections to remove servers are configured yet." %}
-