From 92efceb0342be7c97ab38f97b3a3312215dca2c1 Mon Sep 17 00:00:00 2001 From: Florian Hoss Date: Wed, 20 Jul 2022 14:57:17 +0200 Subject: [PATCH] More docu --- ESPFirewall/lib/Firewall/docs/api/api.tex | 2 +- .../lib/Firewall/docs/firewall/firewall.tex | 53 ++++++++++++++++++ ESPFirewall/lib/Firewall/docs/images/ufw.png | Bin 0 -> 28900 bytes ESPFirewall/lib/Firewall/docs/main.tex | 2 +- 4 files changed, 55 insertions(+), 2 deletions(-) create mode 100644 ESPFirewall/lib/Firewall/docs/images/ufw.png diff --git a/ESPFirewall/lib/Firewall/docs/api/api.tex b/ESPFirewall/lib/Firewall/docs/api/api.tex index 279d983..c9a617f 100644 --- a/ESPFirewall/lib/Firewall/docs/api/api.tex +++ b/ESPFirewall/lib/Firewall/docs/api/api.tex @@ -1,6 +1,6 @@ \section{API} \label{api} -Managing the firewall rules can be done over a rest api. Available routes are following and can be retrieved by visiting the API (e.g. \verb|https://10.93.0.224:8080/api|) of the device. +Managing the firewall rules can be done over a REST API\footnote{\href{https://www.ibm.com/cloud/learn/rest-apis}{What is a REST API}}. Available routes are following and can be retrieved by visiting the API (e.g. \verb|https://10.93.0.224:8080/api|) of the device. \lstset{style=json} \begin{lstlisting} diff --git a/ESPFirewall/lib/Firewall/docs/firewall/firewall.tex b/ESPFirewall/lib/Firewall/docs/firewall/firewall.tex index d8afbbe..5943822 100644 --- a/ESPFirewall/lib/Firewall/docs/firewall/firewall.tex +++ b/ESPFirewall/lib/Firewall/docs/firewall/firewall.tex @@ -1,5 +1,58 @@ \section{Firewall} +\subsection{Software Firewall} + +A software firewall is inspecting data that goes in and out of the device. It has to be installed on each device in the network. Therefore, can only protect one device at a time. Looking at already existing solutions for linux and other operating systems, rules and settings can be identified that need to be implemented for this firewall. + +\subsection{UFW (Uncomplicated Firewall)} + +To see how a firewall works, UFW was analyzed. A look at the table provides following information: + +\begin{figure}[H] + \begin{center} + \includegraphics[width=0.6\textwidth]{ufw} + \caption{UFW} + \label{fig:UFW} + \end{center} +\end{figure} + +A destination port on the device, the action of the firewall and the IP-Address from where the request originated can be setup. Also the protocol that the rule applies to, can be chosen with TCP or UDP. + +\newpage + \subsection{Parameter} +After analyzing existing solutions following firewall parameters were implemented: + +\lstset{style=c++} +\begin{lstlisting} + typedef enum firewall_targets : uint8_t + { + TARGET_REJECT = 0, + TARGET_DROP = 1, + TARGET_ACCEPT = 2, + } firewall_target_t; + + typedef enum firewall_protocols : uint8_t + { + PROTOCOL_TCP = 0, + PROTOCOL_UDP = 1, + PROTOCOL_ALL = 255, + } firewall_protocol_t; + + static const uint8_t IPV4ADDRESS_LENGTH = 16; + typedef struct firewall_rules + { + uint8_t key; + char ip[IPV4ADDRESS_LENGTH]; + uint32_t port_from; + uint32_t port_to; + firewall_protocol_t protocol; + firewall_target_t target; + struct firewall_rules *next; + } firewall_rule_t; +\end{lstlisting} + +A port can be a maximum of 65565, therefore cannot be of type \verb|uint16_t| but \verb|uint32_t|. Target as well as protocol are enums for the available options. To block a range of ports, there is a \verb|port_from| and \verb|port_to|. The firewall will store all the rules as linked list to dynamically add and remove rules. + \subsection{Benchmark} diff --git a/ESPFirewall/lib/Firewall/docs/images/ufw.png b/ESPFirewall/lib/Firewall/docs/images/ufw.png new file mode 100644 index 0000000000000000000000000000000000000000..2e0ee60db0f859091a0b1076cd843649eefe71a1 GIT binary patch literal 28900 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%0AC7eq?)#B;w=}ZK3pXzu4^M2K#d%N8fahWH~Et- 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 literal 0 HcmV?d00001 diff --git a/ESPFirewall/lib/Firewall/docs/main.tex b/ESPFirewall/lib/Firewall/docs/main.tex index 9f9b2a1..f032eb6 100644 --- a/ESPFirewall/lib/Firewall/docs/main.tex +++ b/ESPFirewall/lib/Firewall/docs/main.tex @@ -29,7 +29,7 @@ \lstdefinestyle{c++}{ language=C++, directivestyle={\color{codepurple}}, - emph={firewall_rule_t,uint8_t,fw,Firewall,API}, + emph={firewall_rule_t,uint8_t,uint32_t,firewall_protocol_t,firewall_target_t,fw,Firewall,API}, emphstyle={\color{codegreen}}, } \lstdefinestyle{platform-io}{