From ea6ab8ce09d4e84440185536f7b3e92346789233 Mon Sep 17 00:00:00 2001 From: Tushar Pankaj Date: Mon, 12 Nov 2018 17:59:39 -0600 Subject: Working client and server comms Signed-off-by: Tushar Pankaj --- client.c | 23 ++++++++++++----- client.h | 4 +-- server.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++-- server.h | 6 ++++- wg_dynamic_client.c | 22 ++++++++++++++-- wg_dynamic_server.c | 26 ++++++++++++++++--- 6 files changed, 138 insertions(+), 17 deletions(-) diff --git a/client.c b/client.c index 1a839b9..ebef8b3 100644 --- a/client.c +++ b/client.c @@ -4,16 +4,16 @@ */ #include -#include #include #include +#include #include #include #include #include "protocol.h" #include "client.h" -bool is_server_in_allowed_ips(const char interface[]) +bool is_server_in_allowed_ips(const char iface[]) { /* TODO: check if IP is in wg allowed ips, etc */ return true; @@ -22,21 +22,30 @@ bool is_server_in_allowed_ips(const char interface[]) int connect_to_server() { int sock = -1; + int ret; struct sockaddr_in6 addr; sock = socket(AF_INET6, SOCK_STREAM, 0); + if (sock < 0) { + return -errno; + } addr.sin6_family = AF_INET6; addr.sin6_port = htons(WG_DYNAMIC_SERVER_PORT); inet_pton(AF_INET6, WG_DYNAMIC_SERVER_IP, &addr.sin6_addr); - connect(sock, (struct sockaddr *)&addr, sizeof(addr)); + ret = connect(sock, (struct sockaddr *)&addr, sizeof(addr)); + if (ret < 0) { + return -errno; + } return sock; } -void close_connection(int sock) +int close_connection(int sock) { - if (close(sock) < 0) { - perror("error closing socket to server"); - exit(EXIT_FAILURE); + int ret; + ret = close(sock); + if (ret < 0) { + return -errno; } + return 0; } diff --git a/client.h b/client.h index 8dd35db..5a4b460 100644 --- a/client.h +++ b/client.h @@ -8,8 +8,8 @@ #include -bool is_server_in_allowed_ips(const char interface[]); +bool is_server_in_allowed_ips(const char iface[]); int connect_to_server(); -void close_connection(int sock); +int close_connection(int sock); #endif diff --git a/server.c b/server.c index 0315ccb..89a78c0 100644 --- a/server.c +++ b/server.c @@ -3,8 +3,78 @@ * Copyright (C) 2018 Wireguard LLC */ -int setup_server(const char interface[]) +#include +#include +#include +#include +#include +#include +#include +#include +#include "protocol.h" +#include "server.h" + +bool is_wg_up_on_iface(const char iface[]) +{ + /* TODO */ + return true; +} + +int setup_server() +{ + int sock = -1; + int reuseaddr = 1; + int ret; + struct sockaddr_in6 addr; + + sock = socket(AF_INET6, SOCK_STREAM, 0); + if (sock < 0) { + return -errno; + } + setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuseaddr, + sizeof(reuseaddr)); + addr.sin6_family = AF_INET6; + addr.sin6_port = htons(WG_DYNAMIC_SERVER_PORT); + inet_pton(AF_INET6, WG_DYNAMIC_SERVER_IP, &addr.sin6_addr); + ret = bind(sock, (struct sockaddr *)&addr, sizeof(addr)); + if (ret < 0) { + return -errno; + } + ret = listen(sock, 5); + if (ret < 0) { + return -errno; + } + return sock; +} + +static void handle_connection(int conn, struct sockaddr_in6 addr) { /* TODO */ - return -1; +} + +int handle_connections(int sock) +{ + int conn = -1; + pid_t pid = -1; + struct sockaddr_in6 addr; + socklen_t addr_size = sizeof(addr); + ; + while (1) { + conn = accept(sock, (struct sockaddr *)&addr, &addr_size); + if (conn < 0) { + return -errno; + } + pid = fork(); + if (pid < 0) { + return -errno; + } else if (pid == 0) { + close(sock); + handle_connection(conn, addr); + close(conn); + exit(EXIT_SUCCESS); + } else { + close(conn); + } + } + return 0; } diff --git a/server.h b/server.h index 3ffa9c5..43f8af2 100644 --- a/server.h +++ b/server.h @@ -6,6 +6,10 @@ #ifndef SERVER_H #define SERVER_H -int setup_server(const char interface[]); +#include + +bool is_wg_up_on_iface(const char iface[]); +int setup_server(); +int handle_connections(int sock); #endif diff --git a/wg_dynamic_client.c b/wg_dynamic_client.c index 318714d..7862e9e 100644 --- a/wg_dynamic_client.c +++ b/wg_dynamic_client.c @@ -7,6 +7,7 @@ #include #include +#include const char *PROG_NAME; @@ -17,6 +18,9 @@ static void show_usage() int main(int argc, char *argv[]) { + const char *iface; + int sock; + PROG_NAME = argv[0]; if (argc == 1) { @@ -24,8 +28,22 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - if (connect_to_server(argv[1]) < 0) { - perror("error connecting to server"); + iface = argv[1]; + + if (!is_server_in_allowed_ips(iface)) { + fprintf(stderr, "server is not in allowed IPs for tunnel %s\n", + iface); + return EXIT_FAILURE; + } + + if ((sock = connect_to_server(argv[1])) < 0) { + fprintf(stderr, "error connecting to server: %s\n", + strerror(-sock)); + return EXIT_FAILURE; + } + + if ((sock = close_connection(sock)) < 0) { + fprintf(stderr, "error closing socket: %s\n", strerror(-sock)); return EXIT_FAILURE; } diff --git a/wg_dynamic_server.c b/wg_dynamic_server.c index dcc7737..75bf3af 100644 --- a/wg_dynamic_server.c +++ b/wg_dynamic_server.c @@ -7,6 +7,7 @@ #include #include +#include const char *PROG_NAME; @@ -17,6 +18,10 @@ static void show_usage() int main(int argc, char *argv[]) { + const char *iface; + int sock; + int ret; + PROG_NAME = argv[0]; if (argc == 1) { @@ -24,10 +29,25 @@ int main(int argc, char *argv[]) return EXIT_FAILURE; } - if (setup_server(argv[1]) < 0) { - perror("error setting up server"); + iface = argv[1]; + + if (!is_wg_up_on_iface(iface)) { + fprintf(stderr, "no such wireguard iface %s\n", iface); + return EXIT_FAILURE; + } + + if ((sock = setup_server(argv[1])) < 0) { + fprintf(stderr, "error setting up server: %s\n", + strerror(-sock)); + return EXIT_FAILURE; + } + + if ((ret = handle_connections(sock)) < 0) { + fprintf(stderr, "error while handling connections: %s\n", + strerror(-ret)); return EXIT_FAILURE; } - return EXIT_SUCCESS; + /* unreachable */ + return EXIT_FAILURE; } -- cgit v1.2.3-59-g8ed1b