diff --git a/doc/Background.tex b/doc/Background.tex index 90dee88..c0e9eea 100644 --- a/doc/Background.tex +++ b/doc/Background.tex @@ -29,15 +29,21 @@ are discussed in section \ref{conclusion:P4}. As opposed to general purpose programming languages, P4 lacks some features, most notably loops. However within its constraints, P4 can guarantee operation at line speed, which general purpose programming languages -cannot guarantee in general and also fail to achieve in reality +cannot guarantee and also fail to achieve in reality (see section \ref{results:softwarenat64} for details). % ---------------------------------------------------------------------- -\section{\label{background:ipv6}IPv6} -The first IPv6 RFC \cite{rfc2460} was published in 1998. +\section{\label{background:ip}IPv6, IPv4 and Ethernet} +The first IPv6 RFC was published in 1998\cite{rfc2460}. Both IPv4 and +IPv4 operate on layer 3 of the OSI model. In this thesis we only +consider transmission via Ethernet, which operates at +layer 2. Inside the Ethernet frame a field named ``type'' specifies +the higher level protocol identifier (0x0800 for IPv4 \cite{rfc894} +and 0x86DD for IPv6 \cite{rfc2464}. This is important, because +Ethernet can only carry either of the two protocols. The figures \ref{fig:ipv4header} and \ref{fig:ipv6header} show the packet headers of IPv4 and IPv6. The most notable differences between -the two protocols for this project are: +the two protocols for this thesis are: \begin{itemize} \item Different address lengths (32 vs 128 bit) \item Lack of checksum in IPv6 @@ -96,35 +102,71 @@ the two protocols for this project are: \caption{IPv4 Header, \cite{rfc791}} \label{fig:ipv4header} \end{figure} - -++content! - % ---------------------------------------------------------------------- -\section{\label{background:transition}IPv6 Transition Mechanisms} -While in this thesis the focus was in NAT64 as a transition mechanism, +\section{\label{background:transition}IPv6 Translation Mechanisms} +While in this thesis the focus was in NAT64 as a translation mechanism, there are a variety of different approaches, some of which we would like to portray here. +% ---------------------------------------------------------------------- +\subsection{\label{background:transition:staticnat64}Static NAT64} +Static NAT64 describes static mappings between IPv6 and IPv4 +addresses. This can be based on longest prefix matchings (LPM), +ranges, bitmasks or individual entries. -proxying -translations +NAT64 translations as described in this thesis modify multiple layers +in the translation process: + +\begin{itemize} +\item Ethernet (changing the type field) +\item IPv4 / IPv6 (changing the protocol, changing the fields) +\item TCP/UDP/ICMP/ICMP6 checksums +\end{itemize} % ---------------------------------------------------------------------- -\subsection{\label{background:transition:nat64}Static NAT64} -1:1 mappings +\subsection{\label{background:transition:statefulnat64}Stateful NAT64} +Stateful NAT64 as defined in RFC6146\cite{rfc6146} defines how to +cretate 1:n mappings between IPv6 and IPv4 hosts. The motivation for +stateful NAT64 is similar to stateful NAT44\cite{/rfc3022}: it allows +translating many IPv6 addresses to one IPv4 address. While the +opposite translation is also technically possible, the differences in +address space don't justify its use in general. -% ---------------------------------------------------------------------- -\subsection{\label{background:transition:nat64}Dynamic NAT64} -1:n mappings, requesting temporary ID for connection, used for -outgoing NAT64 +Stateful NAT64 in particular uses information in higher level +protocols to multiplex connections: Given one IPv4 address and the tcp +protocol, outgoing connections from IPv6 hosts can dynamically mapped +to the range of possible tcp ports. After a session is closed, the +port can be reused again. +\begin{figure}[h] + \includegraphics[scale=0.7]{statefulnat64} + \centering + \caption{Stateful NAT64} + \label{fig:statefulnat64} +\end{figure} +The selection of mapped ports is usually based on the availability on +the IPv4 side and not related to the original port. To support +stateful NAT64, the translator needs to store the mapping in a table and +purge entries regularly. +Stateful usually NAT64 uses information found in protocols at layer 4 +like TCP \cite{rfc793} or UDP \cite{rfc768}. However it can also +support ICMP \cite{rfc792} or ICMP6 \cite{rfc4443}. % ---------------------------------------------------------------------- -\subsection{\label{background:transition:Protocol dependent}Protocol - dependent translation} -http, -https, -TLS sni -TLS1.3 SNI might be unreadable -Disadvantage +\subsection{\label{background:transition:Protocol dependent}Higher + layer Protocol Dependent Translation} +Further translation can be achieved by using information in higher +level protocols like HTTP \cite{rfc2616} or TLS +\cite{rfc4366}. Application proxies like nginx +\cite{nginx:_nginx_high_perfor_load_balan} use layer 7 protocol +information to proxy towards backends. Within this proxying method, +the underlying IP protocol can be changed from IPv6 to IPv4 and vice +versa. However the requested hostname that is usually used for +selecting the backend is encrypted in TLS 1.3 \cite{rfc8446}, which +poses a challenge for implementations. + +While protocol dependent translation has the highest amount of +information to choose from for translation, complex parsers or even +cryptographic methods are required for it. That reduces the +opportunities of protocol dependent translation % ---------------------------------------------------------------------- \subsection{\label{background:transition:Port based}Port based diff --git a/doc/Introduction.tex b/doc/Introduction.tex index d85d41e..82fed05 100644 --- a/doc/Introduction.tex +++ b/doc/Introduction.tex @@ -74,7 +74,6 @@ extra device in the network, our proposed method is transparent to the user. This way neither the operator nor the end user has to configure extra devices. Figures \ref{fig:v6v4standard} shows the standard NAT64 approach and \ref{fig:v6v4innetwork} shows our solution. - \begin{figure}[h] \includegraphics[scale=0.7]{v6-v4-innetwork} \centering @@ -88,12 +87,17 @@ approach and \ref{fig:v6v4innetwork} shows our solution. \caption{Standard NAT64 translation} \label{fig:v6v4standard} \end{figure} - -HERE: development difference Currently network operators have to focus on two network stacks when -designing networks: IPv6 and IPv4. As To simplify network setups - - +designing networks: IPv6 and IPv4. While in a small scale setup this +might not introduce significant complexity, however figure +\ref{fig:v6v4mixed} shows how the complexity quickly grows +quickly with the number of nodes. +\begin{figure}[h] + \includegraphics[scale=0.4]{v6-v4-mixed} + \centering + \caption{Differenent network design with in network NAT64 translation} + \label{fig:v6v4mixed} +\end{figure} The in network solution does not only ease the installation and deployment of IPv6, but it also allows line speed translation, because it is compiled into target dependent low level code that can run in diff --git a/doc/appendix.tex b/doc/appendix.tex index 0ca1b07..b91de4d 100644 --- a/doc/appendix.tex +++ b/doc/appendix.tex @@ -9,7 +9,7 @@ to reproduce the test results. All compilations were made on Ubuntu \item 4.15.0-55-generic (Desktop with NetFPGA \end{itemize} -\section{\label{chapterminus1:thesis}Master Thesis} +\section{\label{chapterminus1:thesis:general}Master Thesis} The master thesis including all self developed source code is available by git via @@ -19,7 +19,7 @@ git clone git@gitlab.ethz.ch:nicosc/master-thesis.git It can be browsed online on \url{https://gitlab.ethz.ch/nicosc/master-thesis}. % ---------------------------------------------------------------------- -\section{\label{chapterminus1:thesis}Xilinx Toolchain} +\section{\label{chapterminus1:thesis:xilinx}Xilinx Toolchain} A prerequisite for building the NetFGPA source code is the installation of \begin{itemize} @@ -1542,6 +1542,7 @@ Describe your task. \abbrev{ASIC}{Application-specific integrated circuit} \abbrev{FGPA}{Field-programmable gate array} +\abbrev{LPM}{Longes prefix matching} \abbrev{NAT}{Network Address Translation} \abbrev{NAT64}{Network Address Translation from / to IPv6 to / from IPv4} \abbrev{RIR}{Regional Internet Registry} diff --git a/doc/graphviz/statefulnat64.dot b/doc/graphviz/statefulnat64.dot new file mode 100644 index 0000000..ed62bad --- /dev/null +++ b/doc/graphviz/statefulnat64.dot @@ -0,0 +1,16 @@ +graph G { + node [ shape="box"]; + + + v6host1 [ label="IPv6/TCP: [2001:db8::1]:2323"]; + v6host2 [ label="IPv6/TCP: [2001:db8::17]:4242"]; + + v4host [ label="IPv4/TCP: 198.51.100.2:4323, 198.51.100.2:3345"]; + + nat64gw [ label="NAT64 translator", rank=max ]; + + v6host1--nat64gw; + v6host2--nat64gw; + + nat64gw--v4host; +} diff --git a/doc/graphviz/statefulnat64.png b/doc/graphviz/statefulnat64.png new file mode 100644 index 0000000..8db10a1 Binary files /dev/null and b/doc/graphviz/statefulnat64.png differ diff --git a/doc/refs/refs.bib b/doc/refs/refs.bib index 22b3f49..4409bb4 100644 --- a/doc/refs/refs.bib +++ b/doc/refs/refs.bib @@ -78,3 +78,8 @@ author = {ungleich}, title = {Die IPv4, die!}, howpublished = {\url{https://ungleich.ch/en-us/cms/blog/2019/01/09/die-ipv4-die/}}} + +@Misc{nginx:_nginx_high_perfor_load_balan, + author = {NGINX}, + title = {NGINX | High Performance Load Balancer, Web Server, & Reverse Proxy}, + howpublished = {\url{https://www.nginx.com/}}}