\documentclass[12pt]{beamer} \usepackage{amsmath} \usepackage{url} \usepackage{ucs} \usepackage[utf8]{inputenc} \usepackage[ngerman]{babel} % Manual syntax highlighting \newcommand{\synfunc} [1]{\color{blue!50!black}#1\color{black}} \newcommand{\synstr} [1]{\color{red!50!black}#1\color{black}} \newcommand{\synvar} [1]{\color{purple!50!black}#1\color{black}} \newcommand{\synclass} [1]{\color{green!50!black}#1\color{black}} \newcommand{\syncomment}[1]{\color{blue!20!black}#1\color{black}} \newcommand{\syncool} [1]{\color{beamer@blendedblue}#1\color{black}} \newcommand{\synoder} {\ \ \color{black}$\vee$\ \ } \newcommand{\hr} {\rule[4pt]{\textwidth}{0.1pt}\\} \title{SSH-Tunnel} \author{Ingo Blechschmidt \\\texttt{<iblech@web.de>}} \institute{LUGA} \date{8. Juni 2005} \usetheme{Warsaw} \usecolortheme{seahorse} \setbeamercovered{transparent} \begin{document} \frame{\titlepage} \section{Weiterleitung eines Ports} \subsection{Problem und L"osungsidee} \frame[t]{ \frametitle{Problem} \begin{itemize} \item Keine Möglichkeit der Verbindungsaufnahme zu Computern hinter einem NAT-Gateway für außenstehende Computer \pause \item Err, keine NAT-Gateways bei IPv6 \item Problem gelöst, vielen Dank für die Aufmerksamkeit! \end{itemize} } \frame[t]{ \frametitle{Inhalt} \tableofcontents } \frame[t]{ \frametitle{Lösungsidee} \begin{itemize} \item Bei IPv4: Keine direkte Ansprechmöglichkeit von Computern hinter einem NAT-Gateway wegen Fehlen von öffentlichen IP-Adressen \item Lösung: SSH-Tunnel \end{itemize} \hfill\includegraphics[scale=0.38]{../Inhalte/Sonstiges/1337/LUGA/ssh-tunnel-1.png} } \subsection{Umsetzung} \frame[t]{ \frametitle{Init-Skript} \texttt{% \syncomment{\#!/bin/sh}\\ \ \\ \synfunc{case}\ "\synvar{\$1}"\ \synfunc{in}\\ \ \ \synstr{start})\\ \only<1>{\ \ \ \ \synfunc{echo}\ -n "\synstr{Establishing SSH tunnels...}"\ >{}\&2\\ \ \ \ \ \synfunc{su}\ tunnel -c '\synstr{/home/tunnel/tunnel.sh 20000}' \&\\ \ \ \ \ \synfunc{su}\ tunnel -c '\synstr{/home/tunnel/tunnel.sh 20001}' \&\\ \ \ \ \ \synfunc{su}\ tunnel -c '\synstr{/home/tunnel/tunnel.sh 20002}' \&\\ \ \ \ \ \synfunc{echo}\ "\synstr{done.}"\ >{}\&2}% \only<2->{\ \ \ \ \textit{[...]}}% ;;\\ \ \ \synstr{stop})\\ \only<2>{\ \ \ \ \synfunc{echo}\ -n "\synstr{Stopping SSH tunnels...}"\ >{}\&2\\ \ \ \ \ \synfunc{killall}\ \synstr{tunnel.sh}\ \ \ \ \ \ \ \ \syncomment{\# hacky}\\ \ \ \ \ \synfunc{sleep}\ 2\\ \ \ \ \ \synfunc{killall}\ -9 \synstr{tunnel.sh}\ \ \ \ \ \syncomment{\# hacky}\\ \ \ \ \ \synfunc{echo}\ "\synstr{done.}"\ >{}\&2}% \only<1,3->{\ \ \ \ \textit{[...]}}% ;;\\ \ \ *)\\ \only<3>{\ \ \ \ \synfunc{echo}\ "\synstr{Usage: }\synvar{\$0}\synstr{\ start|stop}"\ >{}\&2\\ \ \ \ \ \synfunc{exit}\ 1}% \only<1-2>{\ \ \ \ \textit{[...]}}% ;;\\ \synfunc{esac}\\ } } \frame[t]{ \frametitle{Konfiguration von SSH} \only<1>{ \begin{itemize} \item Keine Möglichkeit von Passworteingaben $\Rightarrow$ \\ SSH-Schlüssel zur Authentifizierung \item Hinzufügen des neuen Schlüssels zur Liste erlaubter Keys auf dem vermittelnden Server \end{itemize} } \only<2>{ \begin{block}{Auf dem Rechner hinter dem NAT-Gateway} \texttt{% tunnel@hinter-nat \$ \textbf{\synfunc{ssh-keygen}\ -t dsa}\\ \scriptsize Generating public/private dsa key pair.\\ Enter file in which to save the key (/home/tunnel/.ssh/id\_{}dsa): \\ Enter passphrase (empty for no passphrase): \\ Enter same passphrase again: \\ Your identification has been saved in /home/tunnel/.ssh/id\_{}dsa.\\ Your public key has been saved in /home/tunnel/.ssh/id\_{}dsa.pub.\\ The key fingerprint is:\\ 45:ab:b7:8c:b6:b3:4b:76:3b:20:93:78:28:0c:61:25 tunnel@hinter-nat\\ } \ \\ Wichtig: Keine Passphrase! \end{block} } \only<3>{ \begin{block}{Auf dem vermittelnden Server} \footnotesize \texttt{% tunnel@verm-server \$ \textbf{\synfunc{cat}\ >{}>{} \synstr{\~{}/.ssh/authorized\_{}keys}}\\ command="/home/tunnel/sleep.sh",\\ \ \ no-pty,\\ \ \ no-X11-forwarding,\\ \ \ no-agent-forwarding\\ \ \ \textnormal{[Inhalt von \texttt{hinter-nat:\~{}tunnel/.ssh/id\_{}dsa.pub}]} } \ \\\vspace{-3mm} \begin{itemize} \item \texttt{command="\textit{[...]}"}: \\ Nutzung des Accounts \textbf{nur} für's Tunneln, \textbf{kein} Shell-Zugriff \item \texttt{no-pty}: \\ Keine Alloziierung von Pseudo Terminals (Ressourcenschonung) \item \texttt{no-X11-forwarding}, \texttt{no-agent-forwarding}: \\ Erneut: Nutzung ausschließlich für's Tunneln \end{itemize} \end{block} } } \frame[t]{ \frametitle{\texttt{sleep.sh}} \begin{itemize} \item Verhindern von möglichen Problemen bei Nichtbenutzung des Tunnels \item Alle fünf Minuten Ausgabe des aktuellen Datums $\Rightarrow$ \item SSH-Verbindung immer aktiv \end{itemize} \begin{block}{\texttt{verm-server:/home/tunnel/sleep.sh}} \texttt{% \synfunc{echo}\ -e "\synstr{This account may only be used for\\\ \ port forwarding.\textbackslash{}r}"\\ \ \\ \synfunc{while}\ \synfunc{:}; \synfunc{do}\\ \ \ \synfunc{sleep}\ 300\\ \ \ \synfunc{echo}\ -e "\`{}\synfunc{date}\`{}\synstr{: Still alive.\textbackslash{}r}"\\ \synfunc{done}\\ } \end{block} } \frame[t]{ \frametitle{Kernskript} \only<1>{ \begin{block}{\texttt{hinter-nat:/home/tunnel/tunnel.sh}} \texttt{\small% \syncomment{\#!/bin/sh}\\ \ \\ \symbol{91}\ "\synvar{\$1}"\ ] || \{\\ \ \ \synfunc{echo}\ "\synstr{Usage: }\synvar{\$0}\synstr{\ port}"\\ \ \ \synfunc{exit}\ 1\\ \}\\ \ \\ \synfunc{while}\ \synfunc{:}; \synfunc{do}\\ \ \ \synfunc{ssh}\ -T -R \synvar{\$1}\synstr{:localhost:22}\ \textbackslash{}\\ \ \ \ \ \synstr{tunnel@verm-server}\ '\synstr{/home/tunnel/sleep.sh}'\\ \ \ \synfunc{sleep}\ 30\\ \synfunc{done}\\ } \end{block} } \only<2->{ \begin{itemize} \item \texttt{\synfunc{ssh}\ -T}: \\ "`Danke, aber wir brauchen kein Pseudo Terminal."' \item \texttt{\synfunc{ssh}\ -R \synvar{\$1}\synstr{:localhost:22}}: \\ Tunnel \texttt{\synstr{verm-server:}\synvar{\$1}} $\rightarrow$ \texttt{\synstr{localhost:22}} \item \texttt{\synfunc{sleep}\ 30}: \\ Kein Flooding des Netzes, Schonung des Prozessors (ansonsten evtl. ständiges Forken!) \end{itemize} } } \frame[t]{ \frametitle{Aktive Kontrolle} \begin{block}{\texttt{hinter-nat:/home/tunnel/tunnel-check.sh}} \texttt{% \syncomment{\#!/bin/sh}\\ \ \\ \synfunc{nc}\ -z -w 20 \synstr{verm-server}\ 20000 || \{\\ \ \ \synfunc{sleep}\ 10\\ \ \ \synfunc{nc}\ -z -w 20 \synstr{verm-server}\ 20000 || \{\\ \ \ \ \ \synfunc{killall}\ \synstr{ssh}\ \ \ \ \ \ \ \ \ \ \syncomment{\# hacky!}\\ \ \ \ \ \synfunc{sleep}\ 2\\ \ \ \ \ \synfunc{killall}\ -9 \synstr{ssh}\ \ \ \ \ \ \ \syncomment{\# hacky!}\\ \ \ \}\\ \}\\ } \end{block} Start von \texttt{tunnel-check.sh} per Cron alle fünf Minuten } \section{Tunneln von ganzen Netzen} \subsection{Problem und Lösungsidee} \frame[t]{ \frametitle{Problem und Lösungsidee} \begin{itemize} \item Weiterleitung nur eines Ports ungenügend \item Wunsch nach \textbf{transparenter} Weiterleitung ganzer Netze \item Lösung: Point-to-Point Protocol Daemon (pppd) \end{itemize} \vfill \begin{block}{Funktionsweise des pppd} \begin{itemize} \item Bereitstellen von einfacher Byte-Übertragung durch beliebige untere Schicht ("`Modem"', "`ISDN"', "`Funk"', DNS (!), SSH) \item Bereitstellen von IP durch die pppd auf beiden Seiten \item Neues Interface: \texttt{ppp\textit{N}} \end{itemize} \end{block} } \frame{ \frametitle{Netzwerkdiagramm} \begin{center} \includegraphics[scale=0.45]{../Inhalte/Sonstiges/1337/LUGA/ssh-tunnel-2.png} \end{center} } \subsection{Umsetzung} \frame[t]{ \frametitle{Umsetzung} \begin{itemize} \item Simpel: Ersetzen des SSH-Aufrufs in \texttt{tunnel.sh} durch \texttt{vpn-pppssh} von \url{http://www.tldp.org/HOWTO/ppp-ssh/configclient.html\#AEN305} \pause \item (Fertig.) \end{itemize} } \section{Ausstehende Probleme} \frame[t]{ \frametitle{Ausstehende Probleme} \begin{itemize} \item Manuelle Eingriffe erforderlich zur Installation und (Um-)Konfigurierung der Tunnel \item (Kleiner) Overhead durch SSH und PPP (aber: Verschlüsselung!) \item Trotzdem: Stabile Tunnel mit Neuaufbau möglich \end{itemize} \vfill\pause \begin{block}{Einzige cleane Lösung} \begin{itemize} \item Einmalige Installation von IPv6 auf den Routern \item \texttt{\# \textbf{modprobe ipv6}} \item Fertig. \end{itemize} \end{block} } \end{document}
Download