|
48 | 48 |
|
49 | 49 | %%%%% |
50 | 50 |
|
51 | | -\pdfbookmark[1]{inetd}{inetd} |
52 | | - |
53 | | -\begin{slide} |
54 | | -\sltitle{Správa síťových služeb: \texttt{inetd}} |
55 | | -\setlength{\baselineskip}{0.8\baselineskip} |
56 | | -\begin{itemize} |
57 | | -\item servery síťových služeb se spouští buď při startu systému, nebo je |
58 | | -startuje démon \texttt{inetd} při připojení klienta. |
59 | | -\item démon \texttt{inetd} čeká na portech definovaných v |
60 | | -\texttt{/etc/inetd.conf} a když detekuje příchozí spojení/datagram, |
61 | | -spustí příslušný server a přesměruje mu deskriptory. |
62 | | -\item příklad obsahu \texttt{/etc/inetd.conf}: |
63 | | -\end{itemize} |
64 | | -\begin{alltt} |
65 | | -ftp stream tcp nowait root /usr/etc/ftpd ftpd -l |
66 | | -shell stream tcp nowait root /usr/etc/rshd rshd -L |
67 | | -login stream tcp nowait root /usr/etc/rlogind rlogind |
68 | | -exec stream tcp nowait root /usr/etc/rexecd rexecd |
69 | | -finger stream tcp nowait guest /usr/etc/fingerd fingerd |
70 | | -ntalk dgram udp wait root /usr/etc/talkd talkd |
71 | | -tcpmux stream tcp nowait root internal |
72 | | -echo stream tcp nowait root internal |
73 | | -\end{alltt} |
74 | | -\end{slide} |
75 | | - |
76 | | -\label{INETD} |
77 | | - |
78 | | -\begin{itemize} |
79 | | -\item \texttt{inetd} je v podstatě velký \texttt{poll} cyklus obhospodařující |
80 | | -sadu socketů podle konfigurace. |
81 | | -\item Start přes \texttt{inetd} šetří prostředky, protože příslušný server běží |
82 | | -pouze po čas, kdy jsou jeho služby opravdu potřeba. Nehodí se tedy pro pro |
83 | | -spoustění vytížených služeb (HTTP) nebo služeb kde může být velký overhead při |
84 | | -inicializaci (např. SSH). |
85 | | -\item Typicky se pomocí \texttt{inetd} spouští servery, které se používají málo |
86 | | -nebo jejichž inicializace je relativně nenáročná (\texttt{telnetd}, |
87 | | -\texttt{ftpd}). Silně vytížené a dlouho startující servery (\texttt{httpd}) se |
88 | | -obvykle startují ze systémových inicializačních skriptů a běží stále. |
89 | | -\item Často má cenu mít \texttt{inetd} vypnutý úplně. Pokud na vašem stroji běží |
90 | | -např. pouze SSH, tak pro to se \texttt{inetd} ve většině případů nepoužívá, |
91 | | -\texttt{inetd} by byl jen dalším serverem běžícím na stroji a zdroj |
92 | | -potenciálního nebezpečí, pokud by se v něm nebo v jednom z něj spouštěných |
93 | | -programů objevila bezpečnostní chyba. To by ostatně mělo platit pro všechny |
94 | | -instalované programy poskytující síťové služby - buďto by měly implicitně |
95 | | -poslouchat pouze na localhostu (resp. používat unixové sockety) nebo by |
96 | | -implicitně neměly běžet a měly by být spuštěny (ve smyslu permanentně |
97 | | -zapnuty) až tehdy když jsou skutečně třeba (tento přístup se označuje jako |
98 | | -\emph{secure by default}). |
99 | | - |
100 | | - |
101 | | -\end{itemize} |
102 | | - |
103 | | -%%%%% |
104 | | - |
105 | | -\begin{slide} |
106 | | -\sltitle{Formát souboru \texttt{/etc/inetd.conf}} |
107 | | -\texttt{služba soket proto čekání uživ server argumenty} |
108 | | -\begin{itemize} |
109 | | -\item \texttt{služba} \dots{} jméno síťové služby podle \texttt{/etc/services} |
110 | | -\item \texttt{soket} \dots{} \texttt{stream} nebo \texttt{dgram} |
111 | | -\item \texttt{proto} \dots{} komunikační protokol (\texttt{tcp}, \texttt{udp}) |
112 | | -\item \texttt{čekání} \dots{} \texttt{wait} (\texttt{inetd} čeká na ukončení |
113 | | -serveru před akceptováním dalšího klienta), \texttt{nowait} (\texttt{inetd} |
114 | | -akceptuje dalšího klienta hned) |
115 | | -\item \texttt{uživatel} \dots{} server poběží s identitou tohoto uživatele |
116 | | -\item \texttt{server} \dots{} úplná cesta k programu serveru nebo |
117 | | -\texttt{internal} (službu zajišťuje \texttt{inetd}) |
118 | | -\item \texttt{argumenty} \dots{} příkazový řádek pro server, včetně |
119 | | -\texttt{argv[0]} |
120 | | -\end{itemize} |
121 | | -\end{slide} |
122 | | - |
123 | | -\begin{itemize} |
124 | | -\item Soket typu \texttt{stream}: |
125 | | - \begin{itemize} |
126 | | - \item \texttt{wait} \dots{} server dostane soket, na který musí aspoň |
127 | | - jednou zavolat \texttt{accept}. Teprve tím získá nový soket, přes který |
128 | | - může komunikovat s klientem. Po skončení serveru přebírá řízení soketu |
129 | | - zpět \texttt{inetd}. |
130 | | - \item \texttt{nowait} \dots{} \texttt{inetd} zavolá \texttt{accept} a |
131 | | - získaný soket předá serveru, server tedy může rovnou komunikovat (může |
132 | | - používat standardní vstup a výstup) a nemusí vědět, že komunikuje po |
133 | | - síti. Mezitím \texttt{inetd} čeká na další klienty a podle potřeby |
134 | | - spouští další instance serveru. |
135 | | - \end{itemize} |
136 | | -\item Jak pro \texttt{wait} tak pro \texttt{nowait} provedl \texttt{inetd} |
137 | | -na soketu volání \texttt{bind} aby mu přiřadil číslo portu podle pole |
138 | | -\texttt{služba}. |
139 | | -\item V případě \texttt{wait} dostane server soket od \texttt{inetd} v podobě |
140 | | -deskriptoru 0 (standarní vstup). \texttt{inetd} před voláním \texttt{fork} |
141 | | -provedl \texttt{dup2(sock, 0)}, kde \texttt{sock} je nabindovaný socket. |
142 | | -Viz příklad \example{inetd/accept-rw.c}. |
143 | | -\item V případě \texttt{nowait} \texttt{inetd} zavolá \texttt{accept} (pro TCP |
144 | | -spojení), přesměruje deskriptory 0, 1, a 2 do síťového socketu a spustí daný |
145 | | -server. |
146 | | -Viz příklad: \example{inetd/echo-server.sh}. Podívejte se do daného skriptu pro |
147 | | -podrobné instrukce, jak ho použít. |
148 | | -\item Pro soket typu \texttt{dgram} má smysl pouze \texttt{wait}. Server musí |
149 | | -přečíst ze soketu aspoň jeden datagram. |
150 | | -\item Jestliže \texttt{inetd} restartuje server (kromě \texttt{stream~nowait}) |
151 | | -příliš často (cca jednou za sekundu), usoudí, že nastala chyba a po určitou dobu |
152 | | -(asi 10 minut) službu zablokuje (nespouští server a odmítá spojení). Ostatní |
153 | | -servery spouští normálně dál. |
154 | | -\item Pro zajímavost, ne všechny systémy musí nutně \texttt{inetd.conf} používat |
155 | | -stejným způsobem. Například od Solarisu 10 se tento soubor použije pouze pro |
156 | | -po\-čá\-teč\-ní konverzi do interní databáze pomocí \texttt{inetconv(1M)} a pro |
157 | | -zapínání a vypínání služeb se pak používá příkaz \texttt{inetadm(1M)}. |
158 | | -\end{itemize} |
159 | | - |
160 | 51 | \endinput |
0 commit comments