Sieci Linux. Receptury
 978-83-246-6108-4 [PDF]

  • 0 0 0
  • Gefällt Ihnen dieses papier und der download? Sie können Ihre eigene PDF-Datei in wenigen Minuten kostenlos online veröffentlichen! Anmelden
Datei wird geladen, bitte warten...
Zitiervorschau

Tytuł oryginału: Linux Networking Cookbook Tłumaczenie: Radosław Meryk ISBN: 978-83-246-6108-4 © Helion S.A. 2009

Authorized translation of the English edition of Linux Networking Cookbook © 2008 O'Reilly Media Inc. This translation is published and sold by permission of O'Reilly Media, Inc., the owner of all rights to publish and sell the same. All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher. Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji. Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli. Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce. Wydawnictwo HELION ul. Kościuszki 1c, 44-100 GLIWICE tel. 032 231 22 19, 032 230 98 63 e-mail: WWW:

[email protected] http://helion.pl (księgarnia internetowa, katalog książek)

Drogi Czytelniku! Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres

http://helion.pl/user/opinie?sielir_ebook Możesz tam wpisać swoje uwagi, spostrzeżenia, recenzję. Printed in Poland.



Poleć książkę na Facebook.com



Księgarnia internetowa



Kup w wersji papierowej



Lubię to!» Nasza społeczność



Oceń książkę

Książkę tę dedykuję Terry'emu Hanson - dziękuję Ci! Dzięki Tobie to wszystko miało sens.

Spis treci

Przedmowa .................................................................................................................. 15 1. Wprowadzenie do sieci linuksowych .........................................................................23 1.0. Wprowadzenie

23

2. Tworzenie bramy linuksowej na komputerze jednopytowym ................................35 2.0. Wprowadzenie 2.1. Zapoznanie z pyt Soekris 4521 2.2. Konfigurowanie wielu profili Minicom 2.3. Instalowanie systemu Pyramid Linux na karcie Compact Flash 2.4. Sieciowa instalacja dystrybucji Pyramid z poziomu systemu Debian 2.5. Sieciowa instalacja dystrybucji Pyramid z poziomu systemu Fedora 2.6. adowanie systemu Pyramid Linux 2.7. Wyszukiwanie i modyfikowanie plików w dystrybucji Pyramid 2.8. Wzmacnianie dystrybucji Pyramid 2.9. Pobieranie i instalowanie najnowszej kompilacji dystrybucji Pyramid 2.10. Instalacja dodatkowych programów w dystrybucji Pyramid Linux 2.11. Instalacja sterowników nowego sprztu 2.12. Personalizacja jdra dystrybucji Pyramid 2.13. Aktualizacja programu comBIOS pyty Soekris

35 37 39 40 41 44 46 48 49 50 51 54 55 56

3. Budowanie linuksowej zapory firewall ......................................................................59 3.0. Wprowadzenie 3.1. Budowa linuksowej zapory firewall 3.2. Konfigurowanie kart sieciowych w dystrybucji Debian 3.3. Konfigurowanie kart sieciowych w dystrybucji Fedora 3.4. Identyfikacja kart sieciowych 3.5. Budowanie zapory firewall obsugujcej wspódzielone cze internetowe w przypadku dynamicznego przypisywania adresów IP w sieci WAN 3.6. Budowanie zapory firewall obsugujcej wspódzielone cze internetowe w przypadku stosowania statycznych adresów IP w sieci WAN

59 66 68 71 73 74 78

5

3.7. Wywietlanie statusu zapory firewall 80 3.8. Wyczanie zapory firewall iptables 81 3.9. Uruchamianie programu iptables w momencie startu systemu oraz rczne wczanie i wyczanie zapory firewall 82 3.10. Testowanie zapory firewall 85 3.11. Konfiguracja zapory firewall w celu umoliwienia zdalnej administracji przez SSH 88 3.12. Zezwalanie na zdalne poczenia SSH poprzez zapor firewall z mechanizmem NAT 89 3.13. Uzyskiwanie wielu kluczy hostów SSH spoza NAT 91 3.14. Uruchamianie usug publicznych w komputerach o prywatnych adresach IP 92 3.15. Konfiguracja jednohostowej zapory firewall 94 3.16. Konfiguracja zapory firewall na serwerze 98 3.17. Konfiguracja rejestrowania iptables 101 3.18. Reguy filtrowania ruchu wychodzcego 102

4. Tworzenie linuksowego punktu dostpowego sieci bezprzewodowej ................. 105 4.0. Wprowadzenie 4.1. Budowanie linuksowego punktu dostpowego sieci bezprzewodowej 4.2. Tworzenie mostu sieci bezprzewodowej z przewodow 4.3. Konfiguracja serwera nazw 4.4. Konfiguracja statycznych adresów IP z wykorzystaniem serwera DHCP 4.5. Konfigurowanie linuksowych i windowsowych statycznych klientów DHCP 4.6. Wprowadzanie serwerów pocztowych do systemu dnsmasq 4.7. Wzmocnienie algorytmu WPA2-Personal niemal do poziomu WPA-Enterprise 4.8. Rozwizanie korporacyjne — uwierzytelnianie z wykorzystaniem serwera RADIUS 4.9. Konfiguracja bezprzewodowego punktu dostpowego w celu wykorzystania programu FreeRADIUS 4.10. Uwierzytelnianie klientów z wykorzystaniem systemu FreeRADIUS 4.11. Nawizywanie poczenia z internetem i wykorzystanie zapory firewall 4.12. Zastosowanie routingu zamiast mostkowania 4.13. Sondowanie bezprzewodowej karty sieciowej 4.14. Zmiana nazwy hosta routera Pyramid 4.15. Wyczanie zrónicowania anten 4.16. Zarzdzanie pamici podrczn DNS programu dnsmasq 4.17. Zarzdzanie buforem podrcznym windowsowego systemu DNS 4.18. Aktualizacja czasu w momencie startu systemu

105 109 111 113 116 118 120 121 124 128 129 130 132 136 137 138 140 143 144

5. Tworzenie serwera VoIP za pomoc systemu Asterisk ........................................... 147 5.0. Wprowadzenie 5.1. Instalacja systemu Asterisk z kodu ródowego 5.2. Instalacja systemu Asterisk w dystrybucji Debian

6

_

Spis treci

147 151 155

5.3. Uruchamianie i zamykanie systemu Asterisk 5.4. Testowanie serwera Asterisk 5.5. Dodawanie nowych telefonów wewntrznych do systemu Asterisk i nawizywanie pocze 5.6. Konfiguracja telefonów programowych 5.7. Konfiguracja rzeczywistego systemu VoIP z wykorzystaniem usugi Free World Dialup 5.8. Podczanie centrali PBX Asterisk do analogowych linii telefonicznych 5.9. Tworzenie cyfrowej recepcjonistki 5.10. Rejestrowanie niestandardowych komunikatów 5.11. Definiowanie komunikatu dnia 5.12. Przekazywanie pocze 5.13. Kierowanie pocze na grup telefonów 5.14. Parkowanie pocze 5.15. Personalizacja muzyki odtwarzanej w trakcie oczekiwania na poczenie 5.16. Odtwarzanie w systemie Asterisk plików dwikowych MP3 5.17. Przesyanie komunikatów za pomoc poczty gosowej w trybie rozgoszeniowym 5.18. Obsuga konferencji z wykorzystaniem systemu Asterisk 5.19. Monitorowanie konferencji 5.20. Przesyanie ruchu SIP przez zapory firewall z funkcj NAT 5.21. Przesyanie ruchu IAX przez zapory firewall z funkcj NAT 5.22. Korzystanie z pakietu AsteriskNOW. System Asterisk w 30 minut 5.23. Instalowanie i usuwanie pakietów w systemie AsteriskNOW 5.24. Poczenia dla osób bdcych w podróy oraz zdalnych uytkowników

156 159 160 167 169 171 174 176 179 181 181 182 183 184 185 186 187 188 190 191 193 194

6. Routing z wykorzystaniem systemu Linux ............................................................... 197 6.0. Wprowadzenie 6.1. Obliczanie podsieci za pomoc polecenia ipcalc 6.2. Ustawienia domylnej bramy 6.3. Konfiguracja prostego, lokalnego routera 6.4. Konfiguracja najprostszego sposobu wspódzielenia poczenia z internetem 6.5. Konfiguracja statycznego routingu dla wielu podsieci 6.6. Definiowanie statycznych tras na stae 6.7. Wykorzystanie dynamicznego routingu na bazie protokou RIP w dystrybucji Debian 6.8. Wykorzystanie dynamicznego routingu protokou RIP w dystrybucji Fedora 6.9. Korzystanie z wiersza polece pakietu Quagga 6.10. Zdalne logowanie si do demonów Quagga 6.11. Uruchamianie demonów Quagga z wiersza polece 6.12. Monitorowanie demona RIPD 6.13. Odrzucanie tras za pomoc demona Zebra

Spis treci

197 200 202 204 206 208 210 211 214 215 217 218 220 221

_

7

6.14. Wykorzystanie OSPF do skonfigurowania prostego, dynamicznego routingu 222 6.15. Wprowadzenie zabezpiecze dla protokoów RIP i OSPF 224 6.16. Monitorowanie demona OSPFD 225

7. Bezpieczna, zdalna administracja z wykorzystaniem SSH ...................................... 227 7.0. Wprowadzenie 7.1. Uruchamianie i zamykanie OpenSSH 7.2. Tworzenie silnych hase 7.3. Konfiguracja kluczy hosta w celu utworzenia najprostszego systemu uwierzytelniania 7.4. Generowanie i kopiowanie kluczy SSH 7.5. Wykorzystanie uwierzytelniania z kluczem publicznym do ochrony hase systemowych 7.6. Zarzdzanie wieloma kluczami identyfikacyjnymi 7.7. Wzmacnianie systemu OpenSSH 7.8. Zmiana hasa 7.9. Odczytywanie odcisku klucza 7.10. Sprawdzanie skadni plików konfiguracyjnych 7.11. Wykorzystanie plików konfiguracyjnych klienta OpenSSH w celu atwiejszego logowania si 7.12. Bezpieczne tunelowanie komunikacji X Window z wykorzystaniem SSH 7.13. Uruchamianie polece bez otwierania zdalnej powoki 7.14. Wykorzystanie komentarzy do opisywania kluczy 7.15. Wykorzystanie programu DenyHosts w celu udaremnienia ataków SSH 7.16. Tworzenie skryptu startowego programu DenyHosts 7.17. Montowanie zdalnego systemu plików za pomoc sshfs

227 230 231 232 234 236 237 238 239 240 240 241 242 244 245 245 248 249

8. Wykorzystanie midzyplatformowych zdalnych pulpitów graficznych ................ 251 8.0. Wprowadzenie 8.1. Nawizywanie pocze z Linuksa do Windowsa za pomoc programu rdesktop 8.2. Generowanie i zarzdzanie kluczami SSH systemu FreeNX 8.3. Wykorzystanie FreeNX do uruchamiania Linuksa z poziomu Windowsa 8.4. Wykorzystanie FreeNX w celu uruchomienia sesji Linuksa z poziomu systemów Solaris, Mac OS X lub Linux 8.5. Zarzdzanie uytkownikami w systemie FreeNX 8.6. Obserwowanie uytkowników programu Nxclient z serwera FreeNX 8.7. Uruchamianie i zatrzymywanie serwera FreeNX 8.8. Konfigurowanie spersonalizowanego pulpitu 8.9. Tworzenie dodatkowych sesji programu Nxclient 8.10. Monitorowanie sesji Nxclient za pomoc programu NX Session Administrator 8.11. Wczenie wspódzielenia plików i drukarek oraz obsugi multimediów w programie Nxclient 8

_

Spis treci

251 253 256 256 260 262 263 264 265 267 268 269

8.12. Zapobieganie zapisywaniu hase w programie Nxclient 8.13. Rozwizywanie problemów z FreeNX 8.14. Wykorzystanie VNC do zarzdzania Windowsem z poziomu Linuksa 8.15. Korzystanie z VNC w celu jednoczesnego zarzdzania systemami Windows i Linux 8.16. Wykorzystanie VNC do zdalnej administracji Linux-Linux 8.17. Wywietlanie tego samego pulpitu Windows dla wielu zdalnych uytkowników 8.18. Zmiana hasa serwera VNC w systemie Linux 8.19. Personalizacja zdalnego pulpitu VNC 8.20. Ustawianie rozmiaru zdalnego pulpitu VNC 8.21. Nawizywanie poczenia VNC z istniejc sesj X 8.22. Bezpieczne tunelowanie x11vnc w poczeniu SSH 8.23. Tunelowanie poczenia TightVNC pomidzy systemami Linux i Windows

269 271 271 273 275 277 279 280 281 282 284 285

9. Tworzenie bezpiecznych midzyplatformowych wirtualnych sieci prywatnych z wykorzystaniem OpenVPN ....................................................................................289 9.0. Wprowadzenie 9.1. Konfiguracja bezpiecznego laboratorium testowego dla OpenVPN 9.2. Uruchamianie i testowanie OpenVPN 9.3. Testowanie szyfrowania z wykorzystaniem statycznych kluczy 9.4. Poczenie zdalnego klienta linuksowego z wykorzystaniem kluczy statycznych 9.5. Tworzenie wasnej infrastruktury PKI na potrzeby programu OpenVPN 9.6. Konfiguracja serwera OpenVPN dla wielu klientów 9.7. Uruchamianie OpenVPN przy rozruchu systemu 9.8. Odwoywanie certyfikatów 9.9. Konfiguracja serwera OpenVPN w trybie mostkowania 9.10. Uruchamianie OpenVPN z wykorzystaniem konta nieuprzywilejowanego uytkownika 9.11. Nawizywanie pocze przez klienty Windows

289 292 294 296 298 300 303 305 306 307 309 310

10. Tworzenie linuksowego serwera VPN PPTP .............................................................311 10.0. Wprowadzenie 10.1. Instalacja serwera Poptop w dystrybucji Debian 10.2. Instalacja atek jdra Debiana w celu zapewnienia obsugi protokou MPPE 10.3. Instalacja serwera Poptop w dystrybucji Fedora 10.4. Instalacja atek jdra Fedory w celu zapewnienia obsugi protokou MPPE 10.5. Konfiguracja samodzielnego serwera VPN PPTP 10.6. Dodawanie serwera Poptop do usugi Active Directory 10.7. Poczenia klientów linuksowych z serwerem PPTP 10.8. Poczenia z serwerem PPTP poprzez zapor firewall iptables 10.9. Monitorowanie serwera PPTP 10.10. Rozwizywanie problemów z serwerem PPTP Spis treci

311 314 315 317 318 319 322 323 324 325 326 _

9

11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows ...................................................................329 11.0. Wprowadzenie 11.1. Sprawdzanie, czy wszystkie czci s na miejscu 11.2. Kompilacja Samby z kodu ródowego 11.3. Uruchamianie i zamykanie Samby 11.4. Wykorzystanie Samby w roli Podstawowego Kontrolera Domeny 11.5. Migracja do kontrolera PDC na bazie Samby z NT4 11.6. Doczanie komputera linuksowego do domeny Active Directory 11.7. Podczanie komputerów z systemami Windows 95/98/ME do domeny zarzdzanej przez Samb 11.8. Podczanie komputerów z systemem Windows NT4 do domeny zarzdzanej przez Samb 11.9. Podczanie komputerów z systemem Windows NT/2000 do domeny zarzdzanej przez Samb 11.10. Podczanie komputerów z systemem Windows XP do domeny zarzdzanej przez Samb 11.11. Podczanie klientów linuksowych do domeny zarzdzanej przez Samb z wykorzystaniem programów wiersza polece 11.12. Podczanie klientów linuksowych do domeny zarzdzanej przez Samb z wykorzystaniem programów graficznych

329 331 334 336 337 341 343 347 348 349 350 351 354

12. Scentralizowane sieciowe usugi katalogowe z wykorzystaniem OpenLDAP ....... 357 12.0. Wprowadzenie 12.1. Instalacja systemu OpenLDAP w dystrybucji Debian 12.2. Instalacja systemu OpenLDAP w dystrybucji Fedora 12.3. Konfiguracja i testowanie serwera OpenLDAP 12.4. Tworzenie nowej bazy danych w dystrybucji Fedora 12.5. Wprowadzanie dodatkowych uytkowników do katalogu 12.6. Poprawianie wpisów w katalogu 12.7. Nawizywanie poczenia ze zdalnym serwerem OpenLDAP 12.8. Wyszukiwanie informacji w katalogu OpenLDAP 12.9. Indeksowanie bazy danych 12.10. Zarzdzanie katalogiem z wykorzystaniem programów z interfejsem graficznym 12.11. Konfigurowanie bazy danych Berkeley DB 12.12. Konfiguracja mechanizmu rejestrowania programu OpenLDAP 12.13. Tworzenie kopii zapasowej i odtwarzanie katalogu 12.14. Dostrajanie ustawie kontroli dostpu 12.15. Zmiana hase

10

_

Spis treci

357 364 366 366 369 372 374 376 377 379 380 383 387 389 390 394

13. Monitorowanie sieci z wykorzystaniem systemu Nagios .......................................395 13.0. Wprowadzenie 13.1. Instalacja programu Nagios z kodu ródowego 13.2. Konfigurowanie serwera Apache w celu wykorzystania go z programem Nagios 13.3. Organizacja plików konfiguracyjnych Nagios 13.4. Konfiguracja programu Nagios w celu monitorowania hosta localhost 13.5. Konfiguracja uprawnie CGI w celu uzyskania penego dostpu do wasnoci systemu Nagios za porednictwem interfejsu w przegldarce 13.6. Uruchamianie systemu Nagios przy starcie systemu 13.7. Definiowanie dodatkowych uytkowników systemu Nagios 13.8. Przyspieszanie systemu Nagios za pomoc polecenia check_icmp 13.9. Monitorowanie SSHD 13.10. Monitorowanie serwera WWW 13.11. Monitorowanie serwera pocztowego 13.12. Wykorzystanie grup usug do grupowania usug powizanych ze sob 13.13. Monitorowanie usug rozwizywania nazw 13.14. Konfiguracja bezpiecznego, zdalnego mechanizmu administracji systemem Nagios z wykorzystaniem OpenSSH 13.15. Konfiguracja bezpiecznego, zdalnego mechanizmu administracji systemem Nagios z wykorzystaniem OpenSSL

395 396 400 403 404 412 414 415 416 417 420 423 425 426 428 429

14. Monitorowanie sieci z wykorzystaniem systemu MRTG ......................................... 431 14.0. Wprowadzenie 14.1. Instalacja MRTG 14.2. Konfiguracja protokou SNMP w Debianie 14.3. Konfiguracja protokou SNMP w Fedorze 14.4. Konfiguracja usugi HTTP do dziaania z programem MRTG 14.5. Konfiguracja i uruchamianie programu MRTG w Debianie 14.6. Konfiguracja i uruchamianie programu MRTG w Fedorze 14.7. Monitorowanie aktywnego obcienia procesora CPU 14.8. Monitorowanie wykorzystania CPU przez uytkowników oraz czasu bezczynnoci 14.9. Monitorowanie wykorzystania fizycznej pamici 14.10. Monitorowanie dostpnego miejsca w pliku wymiany razem z pamici fizyczn 14.11. Monitorowanie wykorzystania miejsca na dysku 14.12. Monitorowanie pocze TCP 14.13. Wyszukanie i testowanie identyfikatorów MIB i OID 14.14. Testowanie zdalnych zapyta SNMP 14.15. Monitorowanie zdalnych hostów 14.16. Tworzenie wielu stron skorowidza programu MRTG 14.17. Uruchomienie programu MRTG w postaci demona

431 432 433 436 436 438 441 442 445 447 448 449 451 452 454 455 456 457

Spis treci

_

11

15. Wprowadzenie w tematyk protokou IPv6 ............................................................ 461 15.0. Wprowadzenie 15.1. Testowanie instalacji systemu Linux pod ktem obsugi IPv6 15.2. Wysyanie sygnaów ping do lokalnych hostów IPv6 15.3. Ustawianie unikatowych lokalnych adresów interfejsów 15.4. Wykorzystanie SSH z adresami IPv6 15.5. Kopiowanie plików w sieci IPv6 z wykorzystaniem scp 15.6. Automatyczna konfiguracja z wykorzystaniem IPv6 15.7. Obliczanie adresów IPv6 15.8. Wykorzystywanie iPv6 w internecie

461 466 467 468 470 471 471 472 474

16. Konfiguracja bezobsugowego mechanizmu sieciowej instalacji nowych systemów .....................................................................................................475 16.0. Wprowadzenie 16.1. Tworzenie nonika startowego do sieciowej instalacji dystrybucji Fedora Linux 16.2. Instalacja dystrybucji Fedora z wykorzystaniem sieciowego nonika startowego 16.3. Konfiguracja serwera instalacji dystrybucji Fedora bazujcego na HTTP 16.4. Konfiguracja serwera instalacji dystrybucji Fedora bazujcego na FTP 16.5. Tworzenie instalacji dystrybucji Fedora Linux dostosowanej do wasnych potrzeb 16.6. Wykorzystanie pliku Kickstart do automatycznej instalacji dystrybucji Fedora systemu Linux 16.7. Sieciowa instalacja dystrybucji Fedora z wykorzystaniem rodowiska PXE 16.8. Sieciowa instalacja dystrybucji Debian 16.9. Tworzenie penego serwera lustrzanego Debiana za pomoc narzdzia apt-mirror 16.10. Tworzenie czciowego serwera lustrzanego Debiana za pomoc narzdzia apt-proxy 16.11. Konfigurowanie klienckich komputerów PC w celu wykorzystywania lokalnego serwera lustrzanego Debiana 16.12. Konfiguracja serwera rozruchu przez sie PXE na bazie Debiana 16.13. Instalacja nowych systemów z lokalnego serwera lustrzanego Debiana 16.14. Automatyzacja instalacji Debiana za pomoc plików wstpnej konfiguracji

475 477 478 480 482 484 486 488 490 491 493 495 496 497 498

17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli podczanej przez port szeregowy ........................................................................... 501 17.0. Wprowadzenie 17.1. Przygotowanie serwera do administrowania za porednictwem konsoli szeregowej 17.2. Konfiguracja serwera w trybie headless z wykorzystaniem LILO 17.3. Konfiguracja serwera w trybie headless z wykorzystaniem programu GRUB 12

_

Spis treci

501 503 506 509

17.4. adowanie systemu w trybie tekstowym w Debianie 17.5. Konfiguracja konsoli szeregowej 17.6. Konfiguracja serwera do administracji za porednictwem poczenia wdzwanianego 17.7. Dzwonienie do serwera 17.8. Zabezpieczenia czy szeregowych 17.9. Konfiguracja rejestrowania informacji 17.10. Wgrywanie plików na serwer

511 513 515 518 519 521 522

18. Uruchomienie linuksowego serwera Dial-Up ..........................................................525 18.0. Wprowadzenie 18.1. Konfiguracja pojedynczego konta Dial-Up za pomoc programu WvDial 18.2. Konfiguracja wielu kont w programie WvDial 18.3. Konfiguracja uprawnie Dial-Up dla nieuprzywilejowanych uytkowników 18.4. Tworzenie kont WvDial dla uytkowników innych ni root 18.5. Wspódzielenie konta internetowego Dial-Up 18.6. Konfiguracja wasnoci dzwonienia na danie 18.7. Planowanie dostpnoci serwera Dial-Up za pomoc mechanizmu cron 18.8. Wybieranie numeru w warunkach sygnalizacji obecnoci wiadomoci w poczcie gosowej 18.9. Przesanianie opcji poczenie oczekujce 18.10. Ustawienia hasa poza plikiem konfiguracyjnym 18.11. Tworzenie osobnego pliku dziennika pppd

525 525 528 529 530 532 533 534 536 536 537 538

19. Rozwizywanie problemów z sieci ........................................................................539 19.0. Wprowadzenie 19.1. Tworzenie laptopa do diagnozowania sieci i napraw 19.2. Testowanie pocze za pomoc polecenia ping 19.3. Profilowanie sieci za pomoc polece FPing i Nmap 19.4. Wyszukiwanie zdublowanych adresów IP za pomoc polecenia arping 19.5. Testowanie przepustowoci i opónie protokou HTTP za pomoc polecenia httping 19.6. Wykorzystanie polece traceroute, tcptraceroute i mtr do wykrywania problemów z sieci 19.7. Wykorzystanie polecenia tcpdump do przechwytywania i analizowania ruchu 19.8. Przechwytywanie flag TCP za pomoc polecenia tcpdump 19.9. Pomiary przepustowoci, parametru jitter oraz procentu utraconych pakietów za pomoc polecenia iperf 19.10. Wykorzystanie polecenia ngrep do zaawansowanego sniffingu pakietów 19.11. Wykorzystanie polecenia ntop do kolorowego i szybkiego monitorowania sieci 19.12. Rozwizywanie problemów z serwerami DNS

Spis treci

539 540 543 545 547 549 551 553 557 559 562 564 567

_

13

19.13. Rozwizywanie problemów z klientami DNS 19.14. Rozwizywanie problemów z serwerami SMTP 19.15. Rozwizywanie problemów z serwerami POP3, POP3s lub IMAP 19.16. Tworzenie kluczy SSL dla serwera Syslog-ng w Debianie 19.17. Tworzenie kluczy SSL dla serwera Syslog-ng w dystrybucji Fedora 19.18. Konfiguracja programu stunnel dla serwera Syslog-ng 19.19. Tworzenie serwera syslog

570 571 573 576 581 583 584

A Niezbdne materiay referencyjne ...........................................................................587 B Glosariusz poj dotyczcych sieci ........................................................................... 591 C Kompilacja jdra systemu Linux ............................................................................... 613 Kompilacja spersonalizowanego jdra

613

Skorowidz .................................................................................................................. 621

14

_

Spis treci

Przedmowa

A zatem tu jesteś, Czytelniku! Wpatrujesz się w swój komputer, zastanawiając się, dlaczego połączenie z internetem działa wolniej niż wolno, i żałując, że nie masz wystarczającej wiedzy, aby rozszyfrować kolejne krętactwa Twojego dostawcy usług internetowych. A może jesteś samotnym informatykiem w małej firmie? Otrzymałeś tę pracę dlatego, że wiedziałeś, czym się różni przełącznik od koncentratora, a teraz wszyscy oczekują od Ciebie umiejętności od­ powiedzi na wszelkie pytania? Być może po prostu interesują Cię sieci i chcesz się dowiedzieć o nich więcej, tak by stały się Twoim zawodem? A może w Twojej wiedzy jest kilka luk, któ­ re trzeba wypełnić? Niestety, odkryłeś, że na temat sieci komputerowych napisano tony ma­ teriałów. Nie zawsze są one spójne i łatwe do studiowania. Czasem trzeba bardzo wiele prze­ czytać, aby się dowiedzieć, który przycisk należy wcisnąć. Aby było jeszcze ciekawiej, musisz zintegrować hosty z Linuksem i Windowsem. Jeśli szukasz książki, która opisuje krok po kroku sposób wykonania konkretnych zadań i czytelnie objaśnia potrzebne komendy oraz konfiguracje, a jednocześnie nie wystawia na próbę Twojej cierpli­ wości niekończącymi się nudnymi wywodami i teorią lub odwołaniami do tajemniczych do­ kumentów RFC - ta książka jest dla Ciebie.

Dla kogo jest ta książka? Idealny Czytelnik tej książki powinien mieć jakieś doświadczenie z systemem Linux. Powinien wiedzieć, jak się instaluje i usuwa programy, porusza po systemie plików, zarządza upraw­ nieniami do plików oraz tworzy użytkowników i grupy. Powinien znać podstawy protokołu TCP lIP i sieci Ethernet, adresowania IPv4 i IPv6, podstawy sieci LAN, WAN, podsieci, route­ rów, firewalli, bram, przełączników, koncentratorów i okablowania. Czytelnicy, którzy za­ czynają od zera, powinni sięgnąć do książek dla początkujących, które pomogą im w pozna­ niu podstaw. Osobom, które nie mają podstawowej wiedzy na temat Linuksa, polecam sięgnięcie do po­ zycji Linux. Receptury (Helion, 2005). Książkę Linux. Receptury (której jestem autorką) można traktować jako pozycję towarzyszącą niniejszej książce. Opisano w niej zagadnienia związane z instalacją i usuwaniem oprogramowania, zarządzaniem kontami użytkowników, współdzie­ leniem plików i drukarek, uwierzytelnianiem użytkowników dla wielu platform, uruchamia­ niem serwerów (na przykład pocztowego, WWW, ONS), archiwizacją i odtwarzaniem, awa­ ryjnym odtwarzaniem i naprawą systemu, wykrywaniem sprzętu, konfiguracją środowiska X Window, zdalną administracją i wieloma innymi przydatnymi tematami.

15

Użytkownicy niewielkich sieci (tzw. sieci home/SOHO) także znajdą w tej książce kilka przy­ datnych rozdziałów. Każdy, kto chce się nauczyć pracy w sieci komputerowej w systemie Li­ nux, będzie mógł zrealizować wszystko, co opisano w tej książce, za pomocą kilku zwyczaj­ nych komputerów PC i niedrogiego sprzętu sieciowego .

Zawartość tej książki Niniejsza książka zawiera 19 rozdziałów i 3 dodatki: Rozdział 1 . "Wprowadzenie do sieci linuksowych" Ogólny przegląd informacji na temat sieci komputerowych . W rozdziale opisano zagad­ nienia związane z okablowaniem, routingiem i przełącznikami, interfejsami, usługami in­ ternetowymi różnego typu oraz podstawy architektury i wydajności sieci. Rozdział 2. "Tworzenie bramy linuksowej na komputerze jednopłytowym" W rozdziale opisano zagadnienia związane z fascynującym i dającym się przystosować do różnych warunków światem Linuksa w urządzeniach rouŁerboard na przykład pro­ dukcji firm Soekris i PC Engines . Pokazano w nim również, że Linux na tych niewielkich urządzeniach daje więcej możliwości i jest bardziej elastyczny niż wielokrotnie droższe produkty komercyjne. -

Rozdział 3. "Budowanie linuksowej zapory firewall" Z rozdziału można się nauczyć posługiwania linuksowym filtrem pakietów iptables. Za­ mieszczono w nim kompletne receptury dotyczące brzegowych zapór firewall, zapór jed­ nohostowych, korzystania z usług poprzez mechanizm translacji adresów sieciowych (Network Address Translation NAT), blokowania dostępu z zewnątrz do usług sieci we­ wnętrznej, bezpiecznego zdalnego dostępu do tych usług za pośrednictwem zapory fire­ wall oraz sposobów bezpiecznego testowania nowych zapór firewall przed ich zainstalo­ waniem w systemach produkcyjnych. -

Rozdział 4. "Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej " System Linux na urządzeniu routerboard (lub dowolnym standardowym sprzęcie PC) moż­ na wykorzystać do stworzenia bezpiecznego, w pełni funkcjonalnego punktu dostępowego sieci bezprzewodowej, zawierającego doskonałe mechanizmy uwierzytelniania i szyfrowa­ nia, usługi nazw, a także funkcje routingu i bridgingu. Można go dostosować do indywi­ dualnych potrzeb użytkownika. Rozdział 5. "Tworzenie serwera VolP za pomocą systemu Asterisk" Ten rozdział zawiera szczegółowe informacje na temat doskonałego i bardzo popularnego serwera telefonii VolP Asterisk. Oczywiście wiemy, że dziś każdy ma dostęp do interfejsu GUl typu wskaż i kliknij pozwalającego na zarządzanie systemami iPBX, w dalszym ciągu trzeba jednak zrozumieć, co się dzieje w jego wnętrzu. W tym rozdziale pokazano, w jaki sposób można zainstalować i skonfigurować system Asterisk: omówiono sposoby two­ rzenia numerów wewnętrznych użytkowników i skrzynek poczty głosowej, zarządzania pozdrowieniami i komunikatami głosowymi, przesyłania komunikatów głosowych w try­ bie rozgłoszeniowym, konfigurowania telefonów, cyfrowych automatycznych sekretarek, integrowania systemu z siecią publiczną (Public Switched Telephone Network PSTN), po­ sługiwania się klasycznymi funkcjami systemu VolP, zarządzania użytkownikami zdalny­ mi i wiele innych. -

16

Przedmowa

Rozdział 6. "Routing z wykorzystaniem systemu Linux" Zakres funkcji sieciowych systemu Linux jest bardzo obszerny. Obejmuje, między innymi, zaawansowane własności routingu. W rozdziale zamieszczono reguły dotyczące tworze­ nia routerów bazujących na systemie Linux, obliczania podsieci (dokładnie i bez proble­ mów), blokowania niepożądanych gości (ang. blackholing) oraz monitorowania ciężko pra­ cujących routerów. Rozdział 7. "Bezpieczna, zdalna administracja z wykorzystaniem SSH" OpenSSH to wspaniała i niezwykle przydatna implementacja bezpiecznego protokołu SSH. Implementacja obsługuje tradycyjne operacje logowania bazujące na hasłach, logowanie bez haseł na podstawie infrastruktury klucza publicznego oraz bezpieczną komunikację w niezaufanych sieciach. W rozdziale pokazano sposoby wykonywania wszystkich tych operacji, omówiono bezpieczne metody zdalnego logowania oraz wzmacniania i zabezpie­ czeń samego protokołu SSH. Rozdział 8. "Wykorzystanie wieloplatformowych zdalnych graficznych pulpitów" OpenSSH jest szybki i elastyczny. Oferuje zarówno konsolę tekstową, jak i bezpieczny tu­ nel X Window pozwalający na uruchamianie graficznych aplikacji. Dostępnych jest wiele doskonałych programów (FreeNX, rdesktop i VNC), które oferują takie funkcje uzupełniają­ ce, jak zdalny helpdesk, zdalne pulpity do wyboru oraz klienty serwera terminali zarówno dla systemu Linux, jak i Windows . Użytkownik może zarządzać wieloma komputerami, używając jednej klawiatury i monitora, a nawet prowadzić lekcję, na której wielu użytkow­ ników przegląda bądź uczestniczy w tej samej zdalnej sesji Rozdział 9. "Tworzenie bezpiecznych, wieloplatformowych wirtualnych sieci prywatnych z wykorzystaniem OpenVPN" Wydaje się, że każdy chciałby mieć dostęp do bezpiecznej i przyjaznej dla użytkownika sieci VPN (Virtual Private Network) . Nie sposób jednak ostatecznie określić, czym napraw­ dę są VPN oraz liczne produkty komercyjne, które w rzeczywistości nie są prawdziwymi sieciami VPN, a jedynie portalami SSL dla ograniczonego zbioru usług. OpenVPN to rze­ czywiste rozwiązanie VPN bazujące na SSL, które wymaga, aby wszystkie punkty koń­ cowe były zaufane, oraz wykorzystujące zaawansowane metody zabezpieczania połączeń i zapewnienia ich bezpiecznego szyfrowania. OpenVPN zawiera klienty dla systemu Linux, Solaris, Mac OS X, OpenBSD, FreeBSD i NetBSD - można go zatem porównać do sklepu, w którym jest wszystko, co dotyczy VPN. Dzięki lekturze tego rozdziału Czytelnik nauczy się tworzenia i zarządzania własną infrastrukturą klucza publicznego (Public Key Infra­ structure - PKI - narzędzie o kluczowym znaczeniu dla bezproblemowej administracji systemem OpenVPN) . Omówiono w nim również zagadnienia bezpiecznego testowania systemu VPN, konfigurowania serwera oraz nawiązywania połączeń klienckich. Rozdział 10. "Tworzenie linuksowego serwera VPN PPTP" W tym rozdziale opisano tworzenie i konfigurowanie linuksowego serwera VPN PPTP dla klientów w systemie Windows i Linux. Omówiono sposoby aktualizacji klientów window­ sowych, tak by zawierały potrzebną obsługę szyfrowania, integracji z Active Directory oraz sposoby przesyłania ruchu PPTP przez zaporę firewall iptables . Rozdział 1 1 . "Pojedyncze logowanie z wykorzystaniem Samby dla mieszanych sieci Linux-Windows " Wykorzystanie Samby jako kontrolera domeny w stylu Windows NT4 to elastyczny, nie­ zawodny i niedrogi mechanizm uwierzytelniania klientów sieci. Z rozdziału można się

Przedmowa

17

nauczyć migracji z windowsowych kontrolerów domeny do Samby pracującej w systemie Linux, migracji kont użytkowników z Windowsa do Samby, integracji klientów linukso­ wych z Active Directory oraz nawiązywania połączeń klienckich. Rozdział 12. "Scentralizowany sieciowe usługi katalogowe z wykorzystaniem OpenLDAP " LDAP to doskonały mechanizm, na którego bazie można zbudować usługi katalogowe w sieci. W tym rozdziale pokazano, w jaki sposób tworzy się od podstaw katalog Open­ LDAP, jak wprowadza się zmiany, wyszukuje informacje, przyspiesza operacje wyszuki­ wania dzięki inteligentnemu indeksowaniu oraz zaprezentowano sposoby dostrajania sys­ temu gwarantujące uzyskanie maksymalnej wydajności. Rozdział 13. "Monitorowanie sieci z wykorzystaniem systemu Nagios" Nagios to doskonały system monitorowania sieci, w którym mądrze wykorzystano stan­ dardowe polecenia Linuksa do monitorowania usług i hostów oraz informowania o proble­ mach. Raporty dotyczące stanu sieci wyświetlają się w formie interesujących, kolorowych wykresów na stronach w formacie HTML, które można przeglądać za pomocą dowolnej przeglądarki internetowej . Z rozdziału można się nauczyć monitorowania podstawowej kondycji systemu oraz popularnych serwerów, takich jak DNS, WWW i pocztowych, a tak­ że wykonywania zdalnej administracji systemu Nagios . Rozdział 14. "Monitorowanie sieci z wykorzystaniem systemu MRTG" MRTG to monitor sieciowy bazujący na protokole SNMP, zatem teoretycznie można go zaadaptować do monitorowania dowolnego urządzenia lub usługi bazujących na SNMP. Z rozdziału można się nauczyć monitorowania sprzętu i usług oraz sposobów wyszukiwa­ nia danych SNMP umożliwiających stworzenie własnych monitorów sieciowych. Rozdział 15. "Wprowadzenie w tematykę protokołu IPv6" Czy ktoś jest na to przygotowany, czy też nie, protokół IPv6 nadchodzi i pewnego dnia za­ stąpi protokół IPv4. Warto się do tego przygotować, uruchamiając protokół IPv6 w swojej sieci oraz w połączeniach przez internet. Z rozdziału czytelnicy dowiedzą się, dlaczego te bardzo długie adresy są w rzeczywistości prostsze do zarządzania w porównaniu z adre­ sami IPv4. Można się również dowiedzieć, jak używa się połączeń SSH w sieci IPv6 oraz w jaki sposób dokonuje się automatycznej konfiguracji klientów bez użycia DHCP. Rozdział 16. "Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów" Fedora Linux oraz wszystkie systemy z nim spokrewnione (Red Hat, CentOS, Mandriva, PC Linux OS, itp .), a także Debian Linux i jego potomkowie (Ubuntu, Mepis, Knoppix itp.) zawierają narzędzia tworzenia i klonowania niestandardowych instalacji oraz konfiguro­ wania nowych systemów przez sieć. Dzięki tego typu mechanizmom wystarczy włączyć komputer PC, a po kilku minutach będzie na nim kompletna instalacja przygotowana do pracy. W tym rozdziale opisano, jak można wykorzystać standardowe obrazy instalacyjne ISO do sieciowej instalacji systemu Fedora oraz jak tworzy się i utrzymuje kompletne lo­ kalne serwery lustrzane systemu Debian. Rozdział 17. "Administrowanie serwerem linuksowym z wykorzystaniem konsoli podłączanej przez port szeregowy" W przypadku awarii sieci Ethernet konsola szeregowa pozwala na łączność zarówno lo­ kalną, jak i zdalną. Dodatkowo za pośrednictwem konsoli szeregowej można zarządzać routerami i przełącznikami. W tym rozdziale czytelnicy dowiedzą się, w jaki sposób moż­ na skonfigurować komputer linuksowy do przyjmowania połączeń szeregowych oraz

18

Przedmowa

w jaki sposób można używać dowolnego komputera PC z systemem Linux, Mac OS X lub Windows w roli szeregowego terminala. Czytelnicy zapoznają się również ze sposobami " "wdzwanianej (ang . dial-up) administracji serwerem oraz wgrywania plików na serwer z wykorzystaniem łącza szeregowego. Rozdział 18. "Uruchomienie linuksowego serwera Dial-Up " Nawet dziś, w świecie nowoczesnych połączeń, wdzwaniane połączenia mają duże zna­ czenie. Daleko nam jeszcze do czasów, kiedy połączenia szerokopasmowe będą dostępne we wszystkich miejscach na świecie. Z tego rozdziału czytelnicy dowiedzą się, jak można skonfigurować współdzielenie łącza internetowego przez sieć dial-up, jak można wykony­ wać połączenia na żądanie (dial-on-demand), wykorzystywać mechanizm cran do plano­ wania sesji wdzwanianych, a także do konfiguracji wielu kont dial-up. Rozdział 19. "Rozwiązywanie problemów z siecią" System Linux zawiera mnóstwo doskonałych narzędzi do diagnozowania i naprawy pro­ blemów z siecią. Czytelnik zapozna się z sekretami polecenia p i n g, korzystania z polecenia t c p d u m p oraz narzędzia Wireshark do nasłuchiwania transmisji we własnej sieci. Dowie się również, jak się rozwiązuje problemy z serwerami nazw i serwerami pocztowymi, za­ pozna ze sposobami wykrywania wszystkich hostów we własnej sieci, wyszukiwania źró­ deł problemów oraz konfiguracji bezpiecznego centralnego serwera rejestrowania. W roz­ dziale przedstawiono także wiele mniej znanych, ale równie przydatnych narzędzi, takich jak fping, httping, arping i mtr, oraz pokazano, co zrobić, aby przekształcić zwykły stary lap­ top w przenośne narzędzie do diagnozowania i rozwiązywania problemów z siecią. Dodatek A "Niezbędne materiały referencyjne" Sieci komputerowe to bardzo rozległe i skomplikowane zagadnienie. W tym dodatku za­ mieszczono listę książek oraz innych materiałów referencyjnych, z których można się na­ uczyć niezbędnych umiejętności. Dodatek B "Glosariusz pojęć dotyczących sieci" Nie wiesz, co znaczy jakieś pojęcie? Zajrzyj do tego dodatku. Dodatek C "Kompilacja jądra systemu Linux" Ponieważ jądro systemu Linux staje się coraz bardziej rozbudowane i obsługuje coraz wię­ cej własności, często warto skompilować własne jądro, w którym niepotrzebne fragmenty będą wyłączone. Z tego dodatku Czytelnik nauczy się kompilacji własnego jądra systemu Linux w sposób typowy dla dystrybucji Fedora, Debian oraz w sposób niestandardowy.

Zakres materiału W niniejszej książce opisano zarówno stare i sprawdzone, jak i całkowicie nowe technologie. Do starych technologii można zaliczyć administrację systemem za pośrednictwem konsoli szeregowej, sieci wdzwaniane, tworzenie bramy internetowej, sieci VLAN, różne metody bez­ piecznego zdalnego dostępu, routingu oraz kontroli ruchu. Nowoczesne technologie to two­ rzenie własnej centrali iPBX z wykorzystaniem systemu Asterisk, łączność bezprzewodowa, wieloplatformowe zdalne pulpity graficzne, bezobsługowa instalacja sieciowa nowych syste­ mów, pojedyncze logowanie do mieszanych sieci linuksowo-windowsowych oraz podstawy protokołu IPv6. W książce zamieszczono również rozdziały poświęcone monitorowaniu, po­ wiadamianiu i rozwiązywaniu problemów z siecią.

Przedmowa

19

Jakie dystrybucje systemu Linux wykorzystano w tej książce? Istnieją dosłownie setki, jeśli nie tysiące dystrybucji Linuksa: są to dystrybucje "live" na wszel­ kiego rodzaju nośnikach wymiennych - począwszy od miniaturowych płyt CD, poprzez bre­ loczki USB, do płyt DVD; obszerne dystrybucje ogólnego przeznaczenia, niewielkie specjalizo­ wane dystrybucje do obsługi zapór firewall, routerów i starych komputerów PC; dystrybucje multimedialne; dystrybucje naukowe, klastrowe, dystrybucje zdolne do uruchamiania aplika­ cji windowsowych oraz dystrybucje superbezpieczne. Nie ma sposobu, aby nawet spróbować opisać je tu wszystkie. Na szczęście dla zdezorientowanych autorów świat Linuksa można z grubsza podzielić na dwa obozy: Red Hat Linux oraz Debian Linux. Obie technologie są podstawowymi dystrybucjami, które dały początek wielu dystrybucjom pochodnym i klonom. W niniejszej książce świat Red Hat jest reprezentowany przez Fedora Linux - darmową, two­ rzoną przez społeczność użytkowników (ang. community-driven) dystrybucję sponsorowaną przez firmę Red Hat. Fedora jest całkowicie darmowa - podstawowa dystrybucja składa się wyłącznie z darmowego oprogramowania, a cykl wydawania nowych wersji jest znacznie szybszy w porównaniu z dystrybucją Red Hat Enterprise Linux (RHEL). Ola dystrybucji RHEL obowiązuje 18-miesięczny cykl wydawania wersji. Zaprojektowano ją z akcentem na stabil­ ność i przewidywalność. Nie istnieje jej darmowa wersja, choć dostępnych jest wiele darmo­ wych klonów. Klony są tworzone z pakietów SRPM dystrybucji RHEL z usuniętymi znaka­ mi firmowymi firmy Red Hat. Niektóre dystrybucje bazujące na RHEL to CentOS, White Box Linux, Lineox, White Box Enterprise Linux, Tao Linux oraz Pie Box Linux. Ponadto istnieje wiele pochodnych dystrybucji Red Hat do wyboru. Są to chociażby Mandriva czy PCLinuxOS. Dla wszystkich tych dystrybucji powinny działać receptury prezentowane dla dystrybucji Fedora, choć mogą wystąpić pewne niewielkie różnice w nazwach plików, ich lokalizacji oraz nazwach pakietów. Dystrybucje bazujące na Debianie powstają jak przysłowiowe grzyby po deszczu: Ubuntu, Kubuntu, Edubuntu, Xandros, Mepis, Knoppix, Kanotix i Linspire, to nazwy tylko kilku z nich. Chociaż dla nich wszystkich opracowano własne ulepszenia i modyfikacje, zarządzanie pa­ kietami za pomocą systemów aptitude lub synaptic działa tak samo we wszystkich tych dys­ trybucjach. Dystrybucja Novellj SUSE bazuje na pakietach RPM, podobnie jak Red Hat, ale charaktery­ zuje się własnymi cechami. Dystrybucje Gentoo i Slackware mają swoje własne, unikatowe miejsce. Nie zamierzam nawet próbować uwzględniać wszystkich tych dystrybucji, zatem ich użytkownicy będą musieli poradzić sobie sami. Na szczęście wszystkie dystrybucje są wypo­ sażone w bardzo dobre dokumentacje i mają liczne społeczności użytkowników chętnych do udzielenia pomocy. Poza tym nie różnią się aż tak bardzo od swoich wielu kuzynów.

Pliki do pobrania i komentarze Pomimo heroicznych wysiłków, moich i fantastycznego zespołu O'Reilly, niniejsza książka z pewnością zawiera usterki, błędy i braki. Komentarze i sugestie można przesyłać na adres [email protected]. Dzięki temu drugie wydanie będzie mogło być jeszcze lepsze. Warto odwiedzić stronę http://www.oreilly.comjcatalog/9780596102487, gdzie można znaleźć erratę, ak­ tualizacje oraz pobrać skrypty wykorzystane w niniejszej książce. 20

Przedmowa

Konwencje Pogrubienie Służy do oznaczenia nowych elementów w momencie ich definiowania.

Kursywa Oznacza nazwy ścieżek, plików i programów, a także adresów internetowych nazw domen i adresów URL. C z c i o n k a o s t ałej s z erokości Służy do prezentowania wyniku działania programów oraz słów kluczowych w przykładach. Czcionka o stalej szerokości - kursywa Służy do przezentowania parametrów do zastąpienia lub elementów opcjonalnych podczas prezentowania składni poleceń. Czcionka o stałej szerokości - pogrubiona Służy do prezentowania poleceń, które należy wpisywać dosłownie, a także do wyróżnia­ nia fragmentów wewnątrz kodu programów i konfiguracji. Polecenia systemu Unix (Linux), które może wprowadzać zwykły użytkownik, są poprzedzo­ ne standardowym symbolem zachęty zakończonym znakiem $. Polecenia, które muszą być wpisywane przez użytkownika root, są poprzedzone symbolem zachęty użytkownika root za­ kończonym znakiem #. W praktyce, w celu uniknięcia logowania jako użytkownik root, lepiej skorzystać z polecenia s u do . Oba rodzaje symboli zachęty zawierają nazwę użytkownika, bie­ żący host oraz bieżący katalog roboczy (na przykład: root@xe n a : / v a r / l l i b tftpboot#). Ta ikona oznacza wskazówkę, sugestię lub ogólną uwagę.

Ta ikona oznacza ostrzeżenie bądź uwagę dotyczącą określonego zagrożenia.

Wykorzystanie przykładowego kodu Celem tej książki jest ułatwienie czytelnikom wykonywanie ich pracy. Ogólnie rzecz biorąc, kod zamieszczony w tej książce można wykorzystywać w programach i dokumentacji. Nie trzeba prosić o zgodę, chyba że mamy zamiar wykorzystać znaczną część przykładów. Napi­ sanie programu, w którym wykorzystano kilka fragmentów kodu z tej książki, nie wymaga zezwolenia. Z kolei sprzedaż lub dystrybucja płyty CD-ROM z przykładami z książki wyma­ ga uzyskania zgody. Udzielanie odpowiedzi na pytania poprzez cytowanie tej książki i przy­ taczanie przykładowego kodu nie wymaga zezwolenia, natomiast włączanie znaczącej ilości przykładów kodu z tej książki do dokumentacji własnych produktów wymaga zgody. Mile widziana, choć nieobowiązkowa, jest wzmianka o źródle wykorzystywanych materiałów. Powinna ona zawierać tytuł, nazwisko autora, wydawcę i numer ISBN. Na przykład: Linux Ne­ tworking Cookbook, Carla Schroder. Copyright 2008 O'Reilly Media, Inc., 978-0-596-10248-7.

Przedmowa

21

Aby uzyskać zgodę na wykorzystanie przykładów kodu w sposób wykraczający poza ramy określone powyżej, można wysłać e-mail na adres [email protected].

Podziękowania Napisanie książki takiej jak ta to olbrzymi wysiłek wielu osób . Specjalne podziękowania kie­ ruję do mojego redaktora prowadzącego Mike'a Loukidesa. Doprowadzenie książki takiej jak ta do wydania wymaga niezwykłej cierpliwości, taktu, dobrego smaku, uporu i niesamowitych umiejętności. Dobra robota. Jeszcze raz serdecznie dziękuję. Dziękuję również następującym osobom: Jamesowi Lopemanowi Danie Sibera Kristianowi Kielhofnerowi Edowi Sawickiemu Geraldowi Carterowi Michellowi Murrainowi Jameshie Fisher Carolowi Williamsowi Rudy'emu Zijlstrze Marii Blackmore Meredyddowi Luffowi Devdasowi Bhagatowi Akkanie Peck Valorie Henson Jennifer Scalf Sanderowi Marechalowi Mary Gardiner Conorowi Daly'emu Alvin Goats Draganowi Stanojević-Nevidljvlowi

22

Przedmowa

ROZDZIAŁ 1.

Wprowadzenie do sieci linu ksowych

1 . 0 . Wprowadzenie Zasadniczym elementem umożliwiającym pracę sieciową komputerów jest nauczenie ich ko­ munikowania się między sobą. Łatwo to powiedzieć, ale trudniej zrealizować. Niniejsze wpro­ wadzenie zawiera ogólne omówienie komunikacji sieciowej Ethernet w systemie Linux i opis poszczególnych elementów, które umożliwiają działanie całości: routerów, zapór firewall, przełączników, okablowania, interfejsów od strony sprzętowej, a także różnego typu usług w sieciach WAN i internet. Zarówno sieć LAN, jak i WAN można podzielić na dwie zasadnicze części: komputery oraz wszystko to, co znajduje się pomiędzy komputerami. W niniejszej książce skoncentrowano się na elementach umożliwiających komunikację: zaporach firewall, punktach dostępowych sieci bezprzewodowych, bezpiecznej zdalnej administracji, zdalnej pomocy helpdesk, zdalnym dostępie użytkowników, wirtualnych sieciach prywatnych, uwierzytelnianiu, monitorowaniu sieci oraz dynamicznie rozwijających się usługach telefonii lP. Omówimy takie zagadnienia, jak połączenia sieciowe komputerów z systemami Linux i Unix, integrację hostów z systemem Windows, routing, identyfikację sieciową i uwierzytelnianie, współdzielenie łącza internetowego, podłączenie oddziałów firm, usługi nazw, komunikacja przewodowa i bezprzewodowa, bezpieczeństwo, monitorowanie sieci i rozwiązywanie pro­ blemów.

Połączen ie z i nternetem Jednym z największych problemów administratorów sieci jest bezpieczne połączenie z inter­ netem. Jaki rodzaj zabezpieczeń jest niezbędny? Czy są potrzebne drogie, komercyjne routery i zapory firewall? W jaki sposób fizycznie podłączyć sieć LAN do internetu? Oto odpowiedzi na pierwsze dwa pytania: do bezpiecznego połączenia z internetem potrzeb­ ne są co najmniej zapora firewall i router, w żadnym wypadku nie są konieczne drogie urzą­ dzenia komercyjne. System Linux zainstalowany na standardowym sprzęcie PC gwarantuje wystarczającą moc i uniwersalność, które są potrzebne większości użytkowników w domach i niewielkich firmach.

23

Wybór dostawcy usług i nternetowych Dostawcę usług internetowych należy wybierać bardzo uważnie. Nie jest to dziedzina, w któ­ rej opłaca się oszczędzać, ponieważ dobry dostawca jest wart pieniędzy zapłaconych za świad­ czone usługi. Zły wybór dostawcy usług internetowych to dodatkowe koszty. Dobry dostawca powinien zapewnić usługi i doradztwo na wysokim poziomie oraz pośredniczyć we wszyst­ kich sprawach między odbiorcami usług a operatorami telekomunikacyjnymi oraz innymi firmami.

W witrynie DSLReports (http://dslreports.com) można znaleźć opis dostawców inter­

netu oraz mnóstwo informacji technicznych. Alternatywą dla hostingu własnych serwerów jest wynajęcie przestrzeni na półce w komercyjnym ośrodku obliczeniowym - można w ten sposób zaoszczędzić pieniądze na łącze i nie trzeba się martwić awaryjnym zasilaniem oraz bezpieczeństwem fizycznym.

Odpowiedź na ostatnie pytanie zależy od typu usługi internetowej. Połączenia kablowe i łącza OSL są proste - jak widać na rysunku 1 .1, do linii kablowej lub OSL instaluje się niedrogi modem szerokopasmowy, który jest podłączony do linuksowej zapory firewall (bramy) połą­ czonej z przełącznikiem sieci LAN. Linu ksowa zapora Modem

firewall/router

szerokopasmowy

Przełącznik

Rysunek 1 . 1 . Szerokopasmowy internet podłączony do niewielkiej sieci LAN

W tym wprowadzeniu dla interfejsu pomiędzy siecią LAN a sieciami zewnętrznymi będę uży­ wała określenia brama. Funkcję bramy może pełnić co najmniej router. Może to być router de­ dykowany, który nie odgrywa żadnej innej roli. Można do niego dodać zaporę firewall. Można też wprowadzić inne usługi, takie jak usługi nazw, portal VPN, punkt dostępowy sieci bez­ przewodowej lub zdalną administrację. Często chciałoby się załadować bramę usługami wszel­ kiego rodzaju tylko dlatego, że jest to możliwe, ale ze względu na bezpieczeństwo oraz sprawną administrację jest najlepiej, aby brama internetowa była jak najprostsza. Nie należy instalować na niej serwerów WWW, FTP czy też serwerów uwierzytelniania. Brama internetowa powin­ na być skromna, prosta i jak najbardziej zamknięta. Jeśli ktoś myśli o aktualizacji szerokopasmowego dedykowanego łącza, następnym krokiem jest linia T1 . Ceny łączy Tl są konkurencyjne w stosunku do biznesowych łączy OSL, ale do obsługi linii Tl potrzeba profesjonalnego sprzętu sieciowego, który kosztuje znacznie więcej niż modem OSL. W celu uzyskania maksymalnej elastyczności i kontroli najlepiej zainstalo­ wać wewnątrz linuksowej bramy kartę PCI interfejsu Tl . Są one dostępne w wielu konfigu­ racjach (na przykład wieloportowe) i obsługują zarówno protokoły danych, jak i protokoły głosowe, zatem można dokładnie dostosować rozwiązanie do potrzeb . Jeśli ktoś woli router komercyjny, powinien poszukać oferty dostawcy usług internetowych, w której router jest dodawany za darmo. Warto również poszperać w licznych ofertach route­ rów używanych. Router powinien posiadać kartę interfejsu Tl WAN oraz moduł CSU lOSU (Channel Service Unit/ Data Service Unit) . Nie należy spodziewać się zbyt wiele po tanich ro-

24

Rozdział 1. Wprowadzenie do sieci linuksowych

uterach - komputer linuksowy z kartą Tl zazwyczaj charakteryzuje się znacznie większą mocą obliczeniową i możliwościami dostosowania do indywidualnych potrzeb . Typową konfigurację łącza T1 pokazano na rysunku 1 .2 . Urządzenia końcowe łącza telek omun ikacyj neg o

Linuksowa zapora firewal l Route r

Przełącznik

/ p ro c / s y s / n e t / i p v 4 / i c m p_e c h o_i g n ore_bro a d c a s t s e c h o O > / p ro c / s y s / n e t / i p v 4 / i c m p_e c h o_i g n ore_bro a d c a s t s e c h o O > / p ro c / s y s / n e t / i p v4 / c on f / a l l / a c c e p t_s o u r c e_ro u t e

Osobiście preferuję kontrolowanie tych opcji za pomocą programu sysctl, ponieważ właśnie do tego celu został stworzony. Wolę, aby opcje te działały niezależnie od zapory firewall. Jest to jednak kwestia preferencji. Każdy ze sposobów jest dobry. Użycie poleceń e c h o z wiersza poleceń przesłania ustawienia z plików konfiguracyjnych, za­ tem polecenia te są doskonałym narzędziem testowania. Działanie poleceń znika po ponow­ nym uruchomieniu systemu, zatem bez trudu można zacząć wszystko od początku. Częstym źródłem nieporozumień jest użycie kropek i ukośników. Można używać je zamien­ nie, na przykład: n et . i pv 4 . t c p_s y n c oo k i e s n et / i p v 4 / t c p_s y n c oo k i e s

1 1

Patrz także •

man 8 s y s c t l



m a n 5 s y s c t l . c onf



aby dowiedzieć się czegoś więcej na temat poszczególnych poziomów startu i sposobów zarządzania nimi, warto przeczytać rozdział 7. "Uruchamianie i zamykanie systemu Linux" książki autorstwa Carli Schroder Linux. Receptury (Helion, 2005)



man 8 iptables





rozdział 1 . "Overview of TCPJIP" w książce Craiga Hunta TCPjIP Network Administration (O'Reilly, 2002) samouczek programu Ipsysctl Oskara Andreassona: http://ipsysctl-tutorialjrozentux.net/

3 . 1 6 . Konfiguracja zapory firewall na serwerze

Problem Chcemy zaimplementować zaporę firewall iptables na serwerze. W sieci istnieje zewnętrzna zapora firewall i chcemy uściślić kontrolę na serwerze lub mamy serwer bezpośrednio podłą­ czony do internetu. Zwróciliśmy szczególną uwagę na wzmocnienie naszego serwera i jesteśmy przekonani, że mógłby on się obyć bez zapory firewall. Jest to dodatkowa warstwa zabezpie-

98

Rozdział 3. Budowanie linuksowej zapory firewall

czeń, na wypadek popełnienia błędów. Chcemy zablokować cały ruch, który nie powinien docierać do serwera, na przykład wszystkie automatyczne ataki siłowe oraz robaki wszech­ obecne w internecie.

Rozwiązanie Poniższy skrypt zezwala wyłącznie na ruch przeznaczony d o prawidłowych portów, na przy­ kład portu 80. serwera WWW, portu 25. serwera SMTP itp . #!/bin/sh ##/usrllocal/bin/fiv_.\'erver # dla serwera # chkconfig: 2 3 4 5 01 9 9 # definicja zmiennych

ipt� " ! s b i n ! iptables " mod� " ! s b i n ! m o d p ro b e " # usunięcie wszystkich reguł i łU/icuchów

$ipt $ipt $ipt $ipt $ipt $ipt

-F -X -t -t -t -t

n at - F n at - X mangle - F mangle - X

# wyzerowanie wszystkich liczników

$ipt - Z $ i p t - t n at - Z $ i p t - t m a n g l e -Z # pod\,tawowy zbiór modułówjądra

$mod $mod $mod $mod $mod $mod $mod $mod

ip_t a b l e s ip_c o n n t ra c k i p t a b l e_fi l t e r i p t a b l e_nat i p t a b l e_ma n g l e i p t_LOG i p t_limit i p t_st a t e

#opcjonalne moduły dla usług irc i flp #$mod ip_conntrack_irc #$mod ip_conntrackjlp #ustawienie domy,(fnych strategii $ i p t - p I N P UT DROP

$ipt $ipt $ipt $ipt $ipt $ipt $ipt

-P -P -t -t -t -t -t

FORWARD DROP OUTPUT AC C E PT n at - P OUTP UT ACC E P T n at - P P R E ROUTING ACC E P T n at - P POSTROUTING AC C E PT m a n g l e - P P R E ROUTING AC C E PT m a n g l e - P POSTROUTING ACC E P T

# Poniższe wiersze s ą niezbędne do prawidłowego działania interfejsu pętli zwrotnej # oraz wewnętrznych usług bazujących na gniazdach,

$ i p t -A I N P UT - i lo -j AC C E PT # łU/icuch zezwalający na niestandardowy ruch tcp

$ipt $ipt $ipt $ipt

-N -A -A -A

A L LOW A L LOW - p TC P - - s y n -j ACC E P T A L LOW - p TC P - m s t a t e - - s t a t e E STAB L ISH E D , RE LAT E D - j AC C E P T A L LOW - p TC P -j DROP

3.16. Konfiguracja zapory firewall na serwerze

99

# akceptacja istotnych komunikatów ICMP

$ i p t -A I N P UT - p i c mp - - i c m p - t y p e e c h o - re q u e s t - j AL LOW $ i p t -A I N P UT - p i c mp - - i c m p - t y p e t i m e - e x c e e d e d -j A L LOW $ i p t -A I N P UT - p i c mp - - i c m p - t y p e d e s t i n a t i o n - u n re a c h a b l e - j AL LOW

Następnie należy dodać reguły dotyczące specyficznych uruchomionych usług. W przypad­ ku serwera FTP należy dodać moduły ip_conntrackJtp oraz ip_natJtp . Następnie dodajemy poniższe reguły, które zezwalają na wchodzące połączenia do serwera oraz na wychodzące odpowiedzi: # port sterujący FTP

$ i p t -A I N P UT - p t c p - - d p ort 2 1 - j AL LOW # port danych FTP

$ i p t -A I N P UT - p t c p - - s p ort 20 - j AC C E PT

Pasywna komunikacja FTP stanowi pewien problem, ponieważ wykorzystuje trudne do prze­ widzenia porty o wysokich numerach. Serwer FTP można tak skonfigurować, aby wykorzy­ stywał tylko ograniczony zakres portów, a następnie można wymienić je w regule iptables: $ i p t -A I N P UT - p TC P - - d e s t i n a t i o n - port 6 2 000 : 64000 -j ACC E PT

Reguła dotycząca transmisji SSH ma następującą postać: $ i p t -A I N P UT - p t c p - - d p ort 22 - - s port 1 0 24 : 6 5 5 3 5 -j A L L OW

Serwery IRC wymagają modułu ip_conntrack_irc oraz następującej reguły: $ i p t -A I N P UT - p t c p - - d p ort 6 6 6 7 - - s port 1 0 24 : 6 5 5 3 5 -j A L LOW

Oto reguła dla serwera WWW: $ i p t -A I N P UT - p t c p - - d p ort 80 - - s port 1 0 24 : 6 5 5 3 5 - j A L L OW

W przypadku, gdy serwer WWW wykorzystuje wiele portów, na przykład SSL lub port te­ stowy, należy je wymienić za pomocą opcji m u l t i port: $ i p t -A I N P UT - p t c p - m m u l t i port - - d port 80 , 443 , 8080 - - s port 1 0 24 : 6 5 5 3 5 - j AL LOW

Dla serwerów pocztowych również można wykorzystywać reguły jednoportowe lub wielo­ portowe. Przykłady ich użycia zamieszczono poniżej: $ i p t -A I N P UT - p t c p - - d p ort 25 - - s port 1 0 24 : 6 5 5 3 5 -j A L L OW $ i p t -A I N P UT - p t c p -m m u l t i port - - d port 2 5 , 1 1 0 , 1 4 3 - - s p ort 1 0 2 4 : 6 5 5 3 5 -j A L LOW

Serwery ONS wymagają następujących reguł: $ i p t -A I N P UT - p u d p - - d p ort 5 3 -j AC C E PT $ i p t -A I N P UT - p t c p - - d p ort 5 3 -j AL LOW

Jeśli serwer wymaga wykonania operacji wyszukiwania ONS, należy wprowadzić poniższe reguły: $ i p t -A OUTPUT - p u d p - - d port 5 3 -j ACC E P T $ i p t -A OUTPUT - p t c p - - d port 5 3 -j ACC E P T

Dyskusja Łańcuch AL L OW akceptuje wyłącznie pakiety TCP z ustawioną flagą SYN. Subtelnym zagroże­ niem dla zapory iptables jest to, że użycie statusu N EW pozwala na przechodzenie pakietów TCP, dla których nie ustawiono flagi S Y N . W związku z tym trzeba pamiętać, aby dozwolone były tylko pakiety z ustawioną flagą S Y N . Ustawienie flagi SYN zawsze jest pierwszym krokiem podczas inicjowania nowej sesji TCP. W związku z tym nie chcemy akceptować pakietów, dla których flaga ta nie została ustawiona.

100

I

Rozdział 3. Budowanie linuksowej zapory firewall

Otwieranie luk w zabezpieczeniach zapory firewall hosta, które dają dostęp do usług, nie jest trudne, ponieważ nie trzeba przejmować się mechanizmem NAT lub przekazywaniem ruchu. Należy uważnie dobierać numery portów oraz sprawdzać, czy potrzebny jest port UOP, czy TCP. W przypadku większości usług zarezerwowane są zarówno porty UOP, jak i TCP, choć większość z nich wymaga jednego bądź drugiego . W związku z tym, aby uzyskać pewność, należy poszukać informacji w dokumentacji serwera. Żądania połączeń niemal zawsze pochodzą od portów źródłowych o wysokich numerach (tzn. 1024:65535). Cały ruch z uprzywilejowanego portu jest podejrzany. Z tego powodu nie powinien być akceptowany poza sytuacjami, w których mamy pewność, że serwer powinien zaakceptować wybraną transmisję - na przykład FTP. Należy zachować ostrożność i uważać, by nie pomieszać łańcuchów ACC E PT i AL LOW. Łańcu­ chy AL L OW można wykorzystywać wyłącznie w celu filtrowania wchodzących pakietów SYN, które nie występują w przypadku ruchu do portów danych FTP lub datagramów UOP.

Patrz także •

man 8 s y s c t l



m a n 5 s y s c t l . c onf



man 8 iptables





rozdział 1 . "Overview of TCP JIP" w książce Craiga Hunta TCPjIP Network Administration (O'Reilly, 2002) samouczek programu Ipsysctl Oskara Andreassona: http://ipsysctl-tutorialjrozentux.net/

3.17. Konfiguracja rejestrowania iptables

Problem Przetestowaliśmy skrypty obsługi zapory firewall. Wszystko działa poprawnie, wiemy, do czego służą poszczególne reguły, i jesteśmy pewni naszych umiejętności edycji reguł zapory firewall. Teraz chcemy wiedzieć, w jaki sposób skonfigurować pliki dzienników, które po­ mogą w debugowaniu i monitorowaniu.

Rozwiązanie Program iptables m a wbudowany cel umożliwiający włączenie rejestrowania dla poszczegól­ nych reguł. Domyślnie komunikaty programu iptables są umieszczane w pliku jvar/log/kern.log. Łatwym sposobem na to, by zobaczyć je w akcji, jest zarejestrowanie jednej z reguł ICMP: $ i p t -A I N P UT - p i c mp - - i c m p - t y p e e c h o - re q u e s t -j LOG \ - - l o g - l e v e l i n fo - - lo g - prefix " p i n g " $ i p t -A I N P UT - p i c mp - - i c m p - t y p e e c h o - re q u e s t -j AC C E P T

Spróbujmy kilka razy wykonać polecenie p i n g d o hosta, a następnie odczytajmy plik jvar/logj kern.log lub wykorzystajmy polecenie t a i l w celu odczytania ostatnich zapisów w tym pliku:

3.17. Konfiguracja rejestrowania iptables

101

$ tail -f Ivar/log/kern . log O c t 3 1 7 : 3 6 : 3 5 xe n a k e rn e l : [ 1 7 2 1 3 5 14 . 5 04000 J p i n g IN-et hl OUT- MAC-00 : 0 3 : 6 d : 00 : 8 3 : c f : 00 : O a : e4 : 40 : 8 b : fd : 08 : 00 SRC-1 9 2 . 1 6 8 . 1 . 1 2 DST-1 9 2 . 1 6 8 . 1 . 1 0 L E N-60 TOS-OxOO P RE C-OxOO TTL - 1 2 8 ID-46 2 8 P ROTO-ICMP TY P E - 8 CODE-O I D- 5 1 2 S EQ-1 2 8 0 O c t 3 1 7 : 3 6 : 3 6 xe n a k e rn e l : [ 1 7 2 1 3 5 1 5 . 5 00000 J p i n g I N -e t h 1 OUT- MAC-00 : 0 3 : 6 d : 00 : 8 3 : c f : 00 : O a : e4 : 40 : 8 b : fd : 08 : 00 SRC-1 9 2 . 1 6 8 . 1 . 1 2 DST-1 9 2 . 1 6 8 . 1 . 1 0 L E N-60 TOS-OxOO P RE C-OxOO TTL - 1 2 8 ID-46 2 9 P ROTO-ICMP TY P E - 8 CODE-O I D- 5 1 2 S EQ-1 5 3 6

W przypadku utworzenia tylko jednej reguły z celem L O G pakiety zostaną zarejestrowane i odrzucone. Jest to zatem bezpieczny sposób na testowanie nowej reguły. Aby pakiety do­ tarły do swojej docelowej lokalizacji, należy utworzyć drugą regułę. Cel LOG pozwala na uży­ cie wszystkich standardowych poziomów mechanizmu syslog: d e b u g, i n fo, n o t i c e, warn i n g, e rr, c ri t, a l e rt oraz e m e r g . Program iptables wykorzystuje linuksowy wbudowany mechanizm syslog, który jest dość ogra­ niczony. Użycie opcji - - log - prefix celu LOG jest jednym ze sposobów ułatwienia analizowania pliku kern.log. Lepszym sposobem jest użycie opcji s y slog - n g, która daje większe możliwości konfiguracji i ma wbudowaną obsługę sieci, zatem pozwala na skonfigurowanie doskonałego serwera rejestrowania. Wprowadzenie poniższych wierszy do pliku /etc/syslog-ng/syslog-ng.conf kieruje wszystkie ko­ munikaty dziennika iptables do pliku /var/log/iptables.log. Zwróćmy uwagę na opcję I PT-, infor­ mującą mechanizm syslog-ng o tym, które komunikaty należy umieścić w pliku /var/log/iptables. log. Dzięki temu frazę I PT należy umieścić we wszystkich opcjach - - lo g - p refix: d e s t i n ation i p t a b l e s { file C " I v a r / log l i p t a b l e s . l og " ) ; } ; f i l t e r Li p t a b l e s { m at c h C " I P T- " ) ; } ; log { s o u rc e C s r c ) ; filt e r C f_i pt a b l e s ) ; d e s t i n ation C i p t a b l e s ) ; } ;

Patrz także •

m a n 8 syslogd



m a n 5 s y slog . c onf



m a n 8 s y slog - n g



man 8 iptables





rozdział 1 . "Overview of TCP /IP" w książce Craiga Hunta TCP/IP Network Administration (O'Reilly, 2002) samouczek programu iptables Oskara Andreassona: http://iptables-tutorialjrozentux.net/

3 . 1 8 . Reguły filtrowania ruchu wychodzącego

Problem Preferujemy stosowanie strategii otwartości dla pakietów wychodzących (OUTPUT ACC E PT), ale chcemy wprowadzić kilka reguł filtrowania pakietów wychodzących (tzw. filtrowanie egress), aby uniemożliwić wychodzenie z sieci pakietów kierowanych do znanych niepożądanych portów. Chcemy również wprowadzić pewne podstawowe zabezpieczenia, takie jak zabloko­ wanie ruchu NetBIOS, oraz uniemożliwić opuszczanie sieci adresom prywatnym.

102

I

Rozdział 3. Budowanie linuksowej zapory firewall

Rozwiązanie Poniżej zamieszczono kilka przykładów reguł filtrowania ruchu wychodzącego, które stosuje się wraz ze strategią OUTPUT ACC E PT. Reguły te można dodać do dowolnego ze skryptów ob­ sługi zapory firewall zamieszczonych w tym rozdziale. Najpierw tworzymy zmienne zawierające pożądane numery portów. Zmienna E V I L PORTS za­ wiera numery portów znane z tego, że są używane przez złośliwe oprogramowanie różnego typu. Zmienna GOODPORTS służy do uniemożliwienia opuszczania sieci przez niektóre rodzaje ruchu w sieci LAN: E V I L PORTS � " 5 8 7 , 6 6 6 , 77 7 , 778 , 1 1 1 1 , 1 2 1 8 " GOODPORTS � " 2 3 , 1 3 7 , 1 3 8 , 1 3 9 , 1 77 "

Zapora iptables niezbyt dobrze obsługuje listy składające się z więcej niż 15 numerów portów. Możemy teraz wykorzystać zdefiniowane zmienne w sposób zaprezentowany w poniższych przykładach: $ i p t -A OUTPUT - i $ LAN_IFAC E - p - - d port $ E V I L PORTS -j DROP $ i p t -A OUTPUT - i $ LAN_IFAC E - p - - d port $GOODPORTS -j DROP

Zamiast nazwy interfejsu można również określić adresy źródłowe: $ i p t -A OUTPUT

-5

1 9 2 . 1 6 8 . 2 . 0 / 2 4 - p a l I - - d p ort $ E V I L PORTS -j DROP

Szczegółowe informacje na temat blokowanych portów zamieszczono w punkcie "Dyskusja" . Można blokować specyficzne adresy lub całe sieci: $ i p t -A OUTPUT - i $ LAN_IFAC E - p - d 1 1 . 2 2 . 3 3 . 44 -j DROP $ i p t -A OUTPUT -i $ LAN_IFAC E -p - d 2 2 . 3 3 . 44 . 5 5 / 3 0 -j DROP

Z sieci nie powinny wychodzić pakiety z adresami wymienionymi w dokumencie RFC 1918 oraz adresami rozgłoszeniowymi, a także w trybie multicast: $ipt $ipt $ipt $ipt $ipt $ipt $ipt $ipt $ipt $ipt

-A -A -A -A -A -A -A -A -A -A

OUTPUT - 5 1 0 . 0 . 0 . 0 / 8 -j DROP OUTPUT -5 1 7 2 . 1 6 . 0 . 0 / 1 2 - j DROP OUTPUT -5 1 9 2 . 1 6 8 . 0 . 0 / 1 6 -j DROP OUTPUT -5 2 24 . 0 . 0 . 0 / 4 - j DROP OUTPUT -5 2 40 . 0 . 0 . 0 / 5 - j DROP OUTPUT -5 1 2 7 . 0 . 0 . 0 / 8 - j DROP OUTPUT -5 0 . 0 . 0 . 0 / 8 - j DROP OUTPUT -d 2 5 5 . 2 5 5 . 2 5 5 . 2 5 5 - j DROP OUTPUT -5 1 6 9 . 2 5 4 . 0 . 0 / 1 6 -j DROP OUTPUT -d 2 24 . 0 . 0 . 0 / 4 - j DROP

Sieci nie powinien również opuszczać ruch pakietów bez prawidłowego adresu źródłowego - czyli adresu sieci WAN. $ i p t -A OUTPUT -o $WAN INTE RFAC E

-5

! 3 3 . 44 . 5 5 . 6 6 -j DROP

Dyskusja Szanujący się "obywatele sieci" blokują potencjalnie niebezpieczne porty wychodzące. W przy­ padku zainfekowania hostów w sieci należy zrobić wszystko, aby nie dołączyły one do armii złych hostów w internecie i nie przyczyniły się do rozprzestrzeniania epidemii. Decyzja o tym, które porty docelowe należy zablokować, zależy od indywidualnych uwarun­ kowań. Trzeba ją podjąć samodzielnie, a informacji należy szukać w witrynach internetowych poświęconych zagadnieniom bezpieczeństwa. Dobrym punktem startowym do rozpoczęcia poszukiwań jest wpisanie w wyszukiwarce frazy "niebezpieczne porty TCP lIP" . 3.18. Reguły filtrowania ruchu wychodzącego

I

103

Aby podjąć decyzję, które lokalne usługi należy ograniczyć, trzeba przeanalizować plik /etcj services. Oto częściowe objaśnienie listy portów wymienionych w zmiennej GOODPORTS: 23 Klient teInet. Usługa telnet jest zupełnie niezabezpieczona, ponieważ transmituje dane w po­ staci zwykłego tekstu. 1 3 7- 1 3 9 Do tych portów trafiają komunikaty Windows NetBIOS oraz komunikaty rozgłoszeniowe Samby. 177 Kompletnie niezabezpieczony protokół X Display Manager Control Protocol (XOMCP). Dla zdalnych sesji systemu X Window należy zastosować tunelowanie z wykorzystaniem SSH. O ile program iptables wystarcza do zdefiniowania podstawowych zabezpieczeń, o tyle ma bardzo ograniczone możliwości filtrowania ruchu wychodzącego . Wiele złośliwych progra­ mów korzysta z portów zarejestrowanych dla uprawnionych usług, dlatego blokowanie ich oznacza brak możliwości dostępu do takich usług. Zapora iptables nie jest w stanie kontrolo­ wać zawartości, ponadto nie obsługuje list kontroli dostępu. Aby uzyskać większą kontrolę nad ruchem wychodzącym z sieci oraz możliwość zarządzania działaniami podejmowany­ mi przez użytkowników, warto zastanowić się nad wykorzystaniem serwera proxy, na przy­ kład Squid.

Patrz także •

104

Ouane Wessels, Squid: The Definitive Guide (O'Reilly, 2004)

I

Rozdział 3. Budowanie linuksowej zapory firewall

ROZDZIAŁ 4.

Tworzenie lin u ksowego pu n ktu dostępowego sieci bezprzewodowej

4.0. Wprowadzenie Sieci bezprzewodowe są wszędzie. Pewnego dnia będziemy nosili bezprzewodowe odbiorni­ ki w naszych głowach. Tymczasem poprawia się los administratorów sieci bezprzewodowych w Linuksie. Wystarczy się dobrze rozejrzeć, aby zakupić kartę sieci bezprzewodowej z dobrą obsługą Linuksa wraz z obsługą standardu WPA2 . Wykorzystanie dobrze obsługiwanych interfejsów bezprzewodowych oznacza możliwość przejścia bezpośrednio do wykonywania zadań konfigurowania sieci, bez konieczności borykania się z problemami związanymi ze ste­ rownikami. W niniejszym rozdziale pokazano, w jaki sposób zbudować bezpieczną, uniwer­ salną kombinację punktu dostępowego sieci bezprzewodowej z routerem i internetową zaporą firewall, wykorzystując dystrybucję Pyramid Linux na komputerze jednopłytowym Soekris . Urządzenie będzie obsługiwało połączenia przewodowych i bezprzewodowych klientów pra­ cujących w systemach Linux, Windows i Mac OS X, współdzielących szerokopasmowe połą­ czenie z internetem i usługi w sieci LAN. Po prostu jedna duża i szczęśliwa grupa przewodo­ wych i bezprzewodowych klientów współpracujących ze sobą w harmonii. Po co te wszystkie kłopoty? Ponieważ dzięki temu zyskujemy większą kontrolę nad systemem, elastyczne funkcje, o jakich nam się nie śniło, a jednocześnie oszczędzamy pieniądze. Utworzenie urządzenia typu "wszystko w jednym" nie jest konieczne . Receptury zamiesz­ czone w niniejszym rozdziale można łatwo rozdzielić i wykorzystać do stworzenia osobnych urządzeń - na przykład dedykowanej zapory firewall i osobnego punktu dostęp owego sieci bezprzewodowej . W przykładach wykorzystałam dystrybucję Pyramid Linux, płyty Soekris lub WRAP firmy PC Engines oraz interfejsy bezprzewodowe Atheros, ponieważ są to dobrze przetestowane rozwiązania i doskonale znam ich pracę. Informacje o sposobach wykorzystania tych dosko­ nałych płyt routerowych można znaleźć w rozdziale 2 . Przykładowe konfiguracje różnych usług, takich jak OHCP, ONS, uwierzytelnianie, iptables itp ., można bez przeszkód zastosować w innych dystrybucjach bazujących na Oebianie oraz 105

na dowolnym sprzęcie w architekturze x86. Dostosowanie przykładów do standardów innych dystrybucji oznacza zastosowanie innych sposobów konfiguracji kart interfejsów sieciowych. Konfiguracja takich aplikacji, jak hostapd, dnsmasq i iptables, w każdej dystrybucji przebiega w sposób bardzo zbliżony. Wiele osób ma trudności ze zrozumieniem kategorii "rodzima obsługa Linuksa" . Oznacza ona brak konieczności używania programu ndiswrapper - linuksowego opakowania dla binarnych sterowników systemu Windows. Nie zdecydowałabym się na jego użycie, chyba że byłaby to ostateczność i nie byłoby mnie stać na zakup karty interfejsu z rodzimą obsługą systemu Linux. Binarne sterowniki systemu Windows działają tylko po stronie klienta, nie obsługują wszyst­ kich urządzeń lub własności, a wyodrębnienie binarnych sterowników windowsowych wy­ maga sporo pracy. Co gorsza, użycie opakowania ndiswrapper promuje producentów, którzy nie wspierają użytkowników systemu Linux. Obecnie najbardziej przyjaznymi dla Linuksa producentami bezprzewodowych chipsetów są firmy Ralink, Realtek, Atheros, Intel i Atmel. W następnej kolejności można wymienić opra­ cowane za pomocą technik wstecznej inżynierii linuksowe sterowniki GPL dla popularnych układów Broadcom i Intersil Prism. Chociaż wszystkie z wymienionych urządzeń mają sterowniki typu open source (http://open­ souree.org), układy Atheros wymagają załadowania w jądrze Linuksa binarnego modułu HAL (Hardware Aeeess Layer) . Starsze układy Intela wymagają zastrzeżonego binarnego demona ste­ rującego w przestrzeni użytkownika, ale współczesna generacja już go nie potrzebuje. W ukła­ dach Ralink i Realtek to samo zadanie jest zaimplementowane w oprogramowaniu firmware części radiowej . Przypuszczalnie ma to na celu spełnienie wymagań FCC, według których użyt­ kownicy nie powinni mieć możliwości modyfikacji częstotliwości i kanałów poza dozwolony­ mi granicami. Umieszczenie zamkniętego modułu binarnego w jądrze powoduje, że pisanie i debugowanie sterowników dla Linuksa staje się znacznie trudniejsze, ponieważ kluczowe elementy funkcji radiowych są ukryte. Dodatkowy problem wynika z tego, że binarny ładu­ nek może uszkodzić jądro. Błędnie działająca binarna część jądra może spowodować jego błąd (tzw. kernel panie), który będzie mógł poprawić jedynie producent sprzętu. Błędnie działające oprogramowanie firmware nie stwarza tak wielu problemów, ponieważ oznacza to jedynie, że urządzenie przestaje działać. Problem regulacyjnego modułu binarnego jest źródłem dys­ kusji i elementem, który należałoby zmodyfikować (interesujące materiały na ten temat wy­ mieniono w punkcie "Patrz także") . W moich punktach dostępowych sieci bezprzewodowych używam interfejsu mini-PC! Wistron CM9 (bazującego na układzie Atheros AR5213), ponieważ gwarantuje on pełny zestaw funk­ cji: klient, tryb master, tryb ad hoc, monitorowanie trybu raw, WPA/WPA2 oraz wszystkie trzy zakresy WiFi (a/b/g). W systemie Linux, po stronie klienta, będą działały wszystkie ob­ sługiwane interfejsy bezprzewodowe. Należy zachować ostrożność z bezprzewodowymi kar­ tami sieciowymi podłączanymi przez USB - niektóre doskonale działają w systemie Linux, podczas gdy inne nie działają wcale . Informacji można poszukać w wyszukiwarce Google. Dostępne zasoby wymieniono również na końcu tego wprowadzenia. Rozpoznanie chipsetu w urządzeniu przed jego zakupem nastręcza wielu trudności - więk­ szość producentów nie ujawnia tej informacji i uwielbia bawić się w zmiany chipsetu bez po­ dania prostego sposobu na rozpoznanie chipsetu przed dokonaniem zakupu. Aby zainstalować sprzęt jak najmniejszym nakładem sił, warto skonsultować się z wyspecjalizowanym produ­ centem sprzętu bezprzewodowego dla systemu Linux.

106

I

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

Niedrogą, ale dającą duże możliwości alternatywą dla płyt routerowych Soekris i PC Engine są szerokopasmowe 4-portowe routery bezprzewodowe, na przykład Linksys serii WRT54G. Dostępnych jest wiele podobnych urządzeń pod różnymi nazwami marek za cenę nieprzekra­ czającą 150 zł. Co prawda nie gwarantują one wszystkich funkcji, jakie oferują większe płyty routerowe, ale to cenne urządzenia, które doskonale nadają się do wykorzystania w roli de­ dykowanych bezprzewodowych punktów dostępowych. Kluczem do konwersji tych urządzeń ze sprzętu do zastosowań domowych w maszyny porównywalne mocą do urządzeń wartych ponad 1000 zł jest zamiana oprogramowania firmware na OpenWRT (http://openwrt.org/) lub DD-WRT (www.dd-wrt.com/). Są to darmowe programy firmware o statusie open source (choć przesłanie drobnych kwot ich twórcom nie zrani niczyich uczuć), przeznaczone specjalnie do zastosowania w takich niewielkich routerach . Wgranie nowego oprogramowania firmware pozwala na wykorzystywanie funkcji filtrowania pakietów, kształtowania pasma, zabezpie­ czeń sieci bezprzewodowych, sieci wirtualnych, usług nazw oraz wielu innych.

Bezpieczeństwo Podczas konfigurowania sieci bezprzewodowych bezpieczeństwo ma szczególne znaczenie. Nasze bity wędrują sobie w powietrzu, zatem podsłuchanie ruchu sieciowego przez przypad­ kowego podsłuchiwacza jest szczególnie łatwe. Niezabezpieczone punkty dostępowe sieci bez­ przewodowych narażają nas na dwa rodzaje zagrożeń: •

Włamania do sieci LAN. Istnieje ryzyko kradzieży danych bądź przekształcenia hostów z sieci LAN na boty rozsyłające oprogramowanie malware lub nielegalne serwery utwo­ rów MP3 bądź materiałów porno .



Utrata pasma. Dzielenie się z innymi jest piękne, ale dlaczego ma cierpieć wydajność na­ szej sieci z powodu korzystania z niej przez obce osoby? Może się też zdarzyć gorsza rzecz - wykorzystanie naszego pasma do nielegalnych celów.

Jeśli chcemy stworzyć otwarty punkt dostępowy do korzystania przez wszystkich, powinni­ śmy to zrobić mądrze i świadomie. Taki punkt dostępowy powinien być oddzielony od sieci LAN i mieć ograniczone pasmo. Jednym ze sposobów realizacji punktu dostępowego o takich cechach jest wykorzystanie drugiego interfejsu bezprzewodowego, jeśli nasza płyta routero­ wa go obsługuje, lub użycie dedykowanego punktu dostępowego i skorzystanie z zapory iptables w celu przekazywania ruchu z niego do interfejsu WAN oraz blokowania dostępu do sieci LAN. Pyramid Linux jest wyposażony w program WiFiDog captive portal, który można wykorzystać do przypomnienia odwiedzającym o naszej hojności. Program konfiguruje się za pośrednictwem przeglądarki - wystarczy kilka kliknięć myszą. Szyfrowanie i uwierzytelnianie ruchu bezprzewodowego powinno mieć najwyższy priory­ tet. W jaki sposób można to zrobić? Dawniej korzystano głównie z szyfrowania WEP (Wired Equivalent Privacy). Używanie szyfrowania WEP to tylko niewiele więcej niż nieużywanie ni­ czego - algorytm jest znany ze swojej słabości. Złamać może go każdy w ciągu mniej niż 15 minut za pomocą narzędzi powszechnie dostępnych do pobrania, takich jak AirSnort oraz WEPCrack. Nie polecam korzystania z szyfrowania WEP. Lepiej wymienić urządzenia na ta­ kie, które obsługują szyfrowanie WPA (Wi-Fi Protected Access). Istnieją dwie odmiany szyfrowania WPA: WPA i WPA2 . WPA to zaktualizowany algorytm WEP. Zarówno w szyfrowaniu WEP, jak i WPA wykorzystuje się szyfrowanie strumieniowe RC4. Algorytm WPA opracowano jako protokół przejściowy pomiędzy WEP a WPA2 . Szyfro­ wanie WPA jest silniejsze niż WEP, ale nie tak silne jak WPA2 . W algorytmie WPA2 wyko­ rzystywano nowy protokół silnego szyfrowania o nazwie Counter Mode wraz z protokołem 4.0. Wprowadzenie

I

107

CBC-MAC (CCMP) bazującym na standardzie AES (Advanced Encryption Standard) . WPA2 to pełna implementacja standardu 802.11i. Więcej informacji na temat różnych sposobów szyfro­ wania można znaleźć w doskonałej książce Matthew Gasta 802.11. Sieci bezprzewodowe. Prze­ wodnik encyklopedyczny (Helion, 2003). Mówiąc krótko, wykorzystanie algorytmu WPA2 gwa­ rantuje najlepsze zabezpieczenie. Korzystanie z nowoczesnych urządzeń bezprzewodowych obsługujących algorytm WPA2 pozwala na łatwe szyfrowanie i uwierzytelnianie całego ruchu bezprzewodowego. Algorytm WPA obsługuje dwa różne typy uwierzytelniania: WPA-PSK (znany również jako WPA-Per­ sonal i wykorzystujący wstępnie współdzielone klucze - ang. preshared keys) oraz WPA-EAP (znany również jako WPA-Enterprise i wykorzystujący algorytm EAP - Extensible Authenti­

cation Protocol) . Skonfigurowanie szyfrowania WPA-Personal nie jest trudne. Algorytm bazuje na współdzie­ lonym kluczu. Jest nim hasło, które musi być dostarczone do wszystkich uprawnionych użyt­ kowników . Nie istnieje wbudowana, automatyczna metoda dystrybucji kluczy. Trzeba to zrobić ręcznie, wykorzystać inteligentny skrypt lub skorzystać z mechanizmu podobnego do cfengine. Oczywistą wadą tego rozwiązania jest to, że wszyscy posługują się tym samym klu­ czem. W związku z tym, jeśli zajdzie potrzeba zmiany klucza, trzeba to zrobić we wszystkich klientach. Istnieje jednak sposób nadania użytkownikom niepowtarzalnych kluczy - w tym celu można wykorzystać hostapd - demon punktu dostępowego . Narzędzie to jest częścią zbioru sterowników i urządzeń do obsługi sieci bezprzewodowych HostAP i zawiera prosty mechanizm zarządzania wieloma kluczami. Jest to bezproblemowy, prosty sposób implemen­ tacji dobrych i silnych zabezpieczeń. WPA-Enterprise wymaga serwera uwierzytelniania. Najczęściej jest to serwer RAOIUS. Jego konfiguracja jest nieco bardziej pracochłonna, ale kiedy już uda się go skonfigurować, zarzą­ dzanie użytkownikami i kluczami jest proste. Zastosowanie serwera RAOIUS to przesada, jeśli chcemy uruchomić pojedynczy punkt dostępowy, ale jest to element, który ratuje życie, jeśli do sieci jest kilka punktów wejścia, na przykład połączenia modemowe, brama VPN oraz wiele bezprzewodowych punktów dostępowych, ponieważ wszystkie one, w celu uwierzytelniania i autoryzacji, mogą korzystać z pojedynczego serwera RAOIUS. Pakiet HostAP zawiera wbudowany serwer RAOIUS. Inne punkty dostępowe mogą korzystać z niego tak jak z samodzielnego serwera RAOIUS. Moduł wpa_supplicant obsługuje interakcje pomiędzy klientem a serwerem. Moduł ten wcho­ dzi w skład niemal każdej dystrybucji Linuksa, choć niekoniecznie jest instalowany domyślnie. Dla systemów Mac OS X i Windows również są dostępne moduły supplicant. Słowo supplicant (z ang . wnioskodawca, petent) zostało wybrane celowo - oznacza ono bowiem uprzejmą prośbę o zgodę na połączenie z siecią.

Patrz także Problemy związane z "binarnym obiektem blob " omówiono w poniższych artykułach: " • "OpenBSO: wpi, A Blob Free Intel PRO/Wireless 3945ABG Oriver :

http://kerneltrap .org/node/6650 •

108

" "Feature: OpenBSO Works To Open Wireless Chipsets : http://kerneltrap.org/node/41 18

I

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

Aby zbudować własny punkt dostępowy sieci bezprzewodowej i uzyskać informacje o produktach napisane prostym językiem, bez marketingowego bełkotu, warto odwiedzić serwisy WWW sprzedawców online: • serwis Metrix.net pod adresem http://metrix.net/metrix/ oferuje bezprzewodowe punkty do-

stępowe i akcesoria bazujące na dystrybucji Pyramid Linux i usługach niestandardowych

• Netgate.com: http://netgate.com/ • Mini-box.com: http://www.mini-box.com/ • Routerboard.com: http://www.routerboard.com • sklep internetowy DamnSmallLinux.org store: http://www.damnsmallinux.org/store/

W poniższych serwisach można zidentyfikować chipsety kart bezprzewodowych według nazwy marki i numeru modelu: • MadWifi.org dla urządzeń Atheros: http://madwifi.org/ • Atheros.com: http://www.atheros.com/ • projekt Open Source rt2x00 urządzeń Ralink:

http://rt2x00.serialmonkey.com/wiki/index.php?title=Main_Page • karty interfejsów zatwierdzone przez fundację FSF:

http://www.fsf.org/resources/hw/net/wireless/cards.html Ogólne zasoby dotyczące sprzętu bezprzewodowego: • Ralinktech.com: http://www.ralinktech.com/ • projekt Linux on Realtek: http://rtl8181.sourceforge.net/ • Realtek.com: http://www.realtek.com.tw/default.aspx • lista kart bezprzewodowych wspieranych przez fundację FSF:

http://www.fsf.org/resources/hw/net/wireless/cards.html • Seattle Wireless — doskonały zasób informacji dotyczących techniki bezprzewodowej,

a w szczególności tworzenia sieci społeczności: http://seattlewireless.net/

• LiveKiosk: http://www.livekiosk.com • zasoby dotyczące bezprzewodowych sieci LAN w systemie Linux — gigantyczne źródło

informacji dotyczących sieci bezprzewodowych w systemie Linux: http://www.hpl.hp.com/personal/Jean_Tourrilhes/Linux/

4.1. Budowanie linuksowego punktu dostępowego sieci bezprzewodowej Problem Nie chcemy poprzestać na korzystaniu z prefabrykowanych, komercyjnych punktów dostępowych sieci bezprzewodowej. Albo są za proste i niezbyt elastyczne, aby można je było wykorzystać do własnych potrzeb, albo zbyt drogie. W związku z tym, jak przystało na entuzjastów systemu Linux, postanowiliśmy zbudować własny punkt dostępowy. Potrzebne jest nam 4.1. Budowanie linuksowego punktu dostępowego sieci bezprzewodowej

|

109

niewielkie, ciche, kompaktowe i konfigurowalne urządzenie, w którym można dodawać bądź usuwać własności w miarę potrzeb, tak jak w każdym komputerze linuksowym. Na początek chcemy umieścić wszystko w jednym urządzeniu: bezprzewodowy punkt dostępowy z funkcją uwierzytelniania, współdzielenie szerokopasmowego połączenia internetowego, zaporę firewall iptables oraz usługi nazw.

Rozwiązanie • Zainstaluj Pyramid Linux na komputerze jednopłytowym Soekris lub PC Engines WRAP. • Zainstaluj bezprzewodową kartę mini-PCI bazującą na chipsecie Atheros i podłącz ze-

wnętrzną antenę. • Skonfiguruj i przetestuj sieć LAN, a także usługi DHCP i DNS. • Router powinien być rozłączony z internetem do czasu, kiedy będzie odpowiednio wzmoc-

niony, zabezpieczony przez zaporę firewall i przetestowany. • Podłącz router do internetu. To wszystko!

Skorzystaj z kolejnych recept, aby się dowiedzieć, jak wykonać poszczególne kroki.

Dyskusja Receptury zamieszczone w niniejszym rozdziale można łatwo przystosować do sytuacji, w której chcielibyśmy umieścić bezprzewodowy punkt dostępowy, zaporę firewall i serwer nazw w osobnych urządzeniach. Firma Soekris produkuje dwie serie płyt routerowych: 45xx i 48xx. Należy wybrać model, który najbardziej odpowiada naszym potrzebom. Potrzebne jest co najmniej 64 MB RAM, gniazdo karty Compact Flash, gniazdo mini-PCI oraz dwa porty Ethernet. Zawsze mile widziany jest lepszy procesor i więcej pamięci RAM. Drugie gniazdo mini-PCI pozwala na zainstalowanie drugiego interfejsu bezprzewodowego. Gniazda PCMCIA dają większe możliwości, ponieważ obsługują zarówno interfejsy przewodowe, jak i bezprzewodowe. Płyty 45xx są wyposażone w procesory 100 lub 133 MHz oraz 32 – 128 MB pamięci SDRAM. Płyty 48xx są wyposażone w procesory 233 lub 266 MHz oraz 128 – 256 MB pamięci SDRAM. Zastosowanie płyt routerowych 45xx pozwala na uzyskanie szybkości sieci około 17 Mb/s, a mocniejsze płyty 48xx pozwalają na uzyskanie szybkości do 50 Mb/s. 17 Mb/s to szybciej niż pozwala większość połączeń kablowych z internetem oraz linii DSL. Płyty 45xx z powodzeniem wystarczają do surfowania w sieci WWW oraz przesyłania poczty elektronicznej. W sieciach, które udostępniają usługi VoIP, gry online i mają więcej niż 50 użytkowników lub wykorzystują dowolny z protokołów P2P, na przykład BitTorrent, należy raczej zastosować płyty 48xx. Płyty PC Engines WRAP są podobne do płyt Soekris i zazwyczaj nieco droższe. W obydwu rodzajach płyt zastosowano procesory Geode, oba mają zbliżony rozmiar i podobny zestaw funkcji. Na życzenie obaj producenci dostosowują płyty do indywidualnych potrzeb.

Patrz także • rozdział 2. • rozdział 17. 110

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

• Soekris.com: http://www.soekris.com/ • MadWifi.org: http://madwifi.org/

4.2. Tworzenie mostu sieci bezprzewodowej z przewodową Problem W jaki sposób zintegrować bezprzewodowe i przewodowe klienty, tak aby współdzieliły połączenie internetowe i usługi sieci LAN w jednej dużej, szczęśliwej podsieci? Wiemy, że jeśli w tym samym komputerze mamy wiele interfejsów Ethernet, nie mogą wszystkie one należeć do tej samej podsieci, ale muszą mieć adres z oddzielnych podsieci. Chcemy mieć wszystkich w jednej podsieci i nie chcemy mieć zbyt wielu problemów administracyjnych. W jaki sposób to zrobić?

Rozwiązanie Na płycie routerowej potrzebujemy co najmniej trzech interfejsów sieciowych: interfejsu Atheros oraz dwóch interfejsów Ethernet. ath0 to interfejs bezprzewodowy, eth0 to interfejs LAN, natomiast eth1 to interfejs WAN. Zamierzamy utworzyć most ethernetowy pomiędzy interfejsami ath0 i eth0. W tym celu wystarczy skopiować poniższy przykład skryptu /etc/network/interfaces, zastępując podane adresy własnymi adresami LAN oraz własnym identyfikatorem ESSID. Należy pamiętać, aby wcześniej uruchomić polecenie /sbin/rw, które uaktywni funkcję zapisywania danych w systemie plików dystrybucji Pyramid: pyramid:~# /sbin/rw pyramid:~# nano /etc/network/interfaces ##/etc/network/interfaces ## konfiguracja mostu z siecią bezprzewodową auto lo iface lo inet loopback auto br0 iface br0 inet static address 192.168.1.50 network 192.168.1.0 netmask 255.255.255.0 broadcast 192.168.1.255 bridge_ports ath0 eth0 post-down wlanconfig ath0 destroy pre-up wlanconfig ath0 create wlandev wifi0 wlanmode ap pre-up iwconfig ath0 essid "alrac-net" channel 01 rate auto pre-up ifconfig ath0 up pre-up sleep 3

Możemy teraz przetestować ten skrypt poprzez połączenie w sieć z hostami LAN o statycznych adresach IP. Najpierw restartujemy obsługę sieci na routerze: pyramid:~# /etc/init.d/networking restart

4.2. Tworzenie mostu sieci bezprzewodowej z przewodową

|

111

Uruchomienie tego polecenia tworzy szeroko otwarty bezprzewodowy punkt dostępowy. Wystarczy wskazać w klientach domyślną bramę pod adresem 192.168.1.50, aby podłączyć klienty do sieci LAN. Można teraz wysyłać polecenia ping do komputerów PC podłączonych zarówno przewodowo, jak i bezprzewodowo. Po zakończeniu wprowadzania modyfikacji należy pamiętać, aby przywrócić tryb tylko do odczytu w systemie plików: pyramid:~# /sbin/ro

Dyskusja Niniejsza receptura prezentuje konfigurację całkowicie bez zabezpieczeń, ale umożliwia przetestowanie mostu oraz łączności bezprzewodowej przed zainstalowaniem dodatkowych usług. Przeanalizujmy opcje użyte w tej konfiguracji: bridge_ports

Definicja dwóch interfejsów, dla których tworzymy most. post-down wlanconfig ath0 destroy

To polecenie niszczy punkt dostępowy w przypadku wyłączenia interfejsów sieciowych. Program wlanconfig jest częścią pakietu MadWiFi-ng. Narzędzie służy do tworzenia, niszczenia i zarządzania punktami dostępowymi. Narzędzie wlanconfig pozwala na stworzenie wielu punktów dostępowych w ramach jednego urządzenia. pre-up wlanconfig ath0 create wlandev wifi0 wlanmode ap

wifi0 to nazwa, jaką jądro nadaje interfejsowi Atheros. Można ją odczytać za pomocą polecenia dmesg. Następnie program wlanconfig tworzy wirtualny punkt dostępowy ath0 na bazie interfejsu wifi0. pre-up iwconfig ath0 essid "alracnet" channel 01 rate auto

Przypisujemy identyfikator ESSID, kanał i szybkość. Aby odczytać kanały, częstotliwości i szybkości obsługiwane przez kartę interfejsu, można skorzystać z następującego polecenia: pyramid:~# wlanconfig ath0 list chan

Jak się dowiedzieć, który kanał wykorzystać? Jeśli mamy tylko jeden punkt dostępowy, kanał numer 1 powinien działać prawidłowo. Jeśli mamy dostęp do trzech kanałów, spróbujmy wykorzystać kanały 1., 6. i 11. W przypadku bardziej złożonych sieci warto zajrzeć do doskonałej książki Matthew Gasta 802.11. Sieci bezprzewodowe. Przewodnik encyklopedyczny (Helion, 2003). pre-upifconfigath0 up

Włączenie interfejsu ath0 przed włączeniem mostu. pre-upsleep3

Krótka pauza w celu upewnienia się, że wszystko zostało poprawnie włączone. Nie musimy budować mostu w sposób tradycyjny, poprzez skonfigurowanie interfejsu eth0 z zerowym adresem IP lub włączaniem go przed zbudowaniem mostu, ponieważ tymi zadaniami zajmują się skrypty w katalogu /etc/network/if-pre-up.d. Jestem pewna, że wielu czytelników zastanawia się, czym jest program ebtables. Narzędzie to odgrywa podobną rolę do iptables, ale dotyczy mostów ethernetowych. Zapora iptables nie może filtrować ruchu przez mosty, natomiast narzędzie ebtables może. Istnieje wiele genialnych sposobów wykorzystania programu ebtables i mostów Ethernet w sieci. W tym rozdziale świadomie pominęłam omawianie programu ebtables, ponieważ w naszym punkcie dostępowym 112

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

będziemy wykorzystywać internetową zaporę firewall iptables. Program ebtables nie nadaje się do zastosowania w roli internetowej zapory firewall, a próba wykorzystania obu w tym samym komputerze jest zbyt skomplikowana.

Patrz także • dystrybucja Pyramid Linux nie zawiera stron podręcznika man, dlatego albo należy zain-

stalować aplikacje zaprezentowane w tym rozdziale w komputerze PC, albo poszukać informacji w Google

• wlanconfig jest częścią pakietu MadWiFi-ng • informacje o opcjach mostu można znaleźć na stronie man 8 brctl • narzędzie iwconfig jest częścią pakietu wireless-tools • man 8 iwconfig • Pyramid Linux: http://pyramid.metrix.net/ • podrozdział 3.2 • książka Matthew Gasta 802.11. Sieci bezprzewodowe. Przewodnik encyklopedyczny (Helion,

2003)

4.3. Konfiguracja serwera nazw Problem W sieci LAN mają się znaleźć zarówno hosty ze statycznymi adresami IP, jak i klienty DHCP, które otrzymują adres dynamicznie po podłączeniu — dotyczy to przede wszystkim klientów bezprzewodowych. Chcemy, aby klienty DHCP były automatycznie rejestrowane w systemie DNS, tak by można się było odwoływać do nich przez nazwę — analogicznie do hostów ze statycznymi adresami IP.

Rozwiązanie Żądanie nie jest wyszukane. Na szczęście bez trudu można je spełnić. W dystrybucji Pyramid jest dostępny program dnsmasq, który obsługuje usługi DHCP i DNS oraz automatycznie wprowadza klienty DHCP do systemu DNS. Wymaga to od klientów przesłania ich nazw hostów w momencie żądania dzierżawy DHCP. Klienty systemu Windows robią to domyślnie. Większość klientów linuksowych tego nie robi (informacje o konfiguracji klientów linuksowych można znaleźć w punkcie 4.5). Teraz zmodyfikujemy plik /etc/dnsmasq.conf w urządzeniu z dystrybucją Pyramid Linux. Najpierw włączymy funkcję zapisywania w systemie plików poprzez uruchomienie polecenia /sbin/rw. Następnie należy skopiować poniższy przykład, wykorzystując własną nazwę sieci zamiast alrac.net, dowolny, wybrany zakres DHCP oraz własne serwery nazw dla ruchu „w górę”: pyramid:~# /sbin/rw pyramid:~# nano /etc/dnsmasq.conf domain-needed

4.3. Konfiguracja serwera nazw

|

113

bogus-priv local=/alrac.net/ expand-hosts domain=alrac.net interface=br0 listen-address=127.0.0.1 # serwery nazw ruchu "w górę" server=22.33.44.2 server=22.33.44.3 dhcp-range=lan,192.168.1.100,192.168.1.200,12h dhcp-lease-max=100

Następnie dodajemy wszystkie hosty, które mają przypisane statyczne adresy IP do pliku /etc/hosts w systemie Pyramid, wykorzystując tylko ich nazwy hostów i adresy IP. W pliku powinien się znaleźć co najmniej zapis hosta localhost oraz routera Pyramid: ## /etc/hosts 127.0.0.1 192.168.1.50 192.168.1.10 192.168.1.74

localhost pyramid xena uberpc

Restartujemy dnsmasq: pyramidwrap:~# killall dnsmasq

W celu przetestowania nowego serwera nazw wykonujemy polecenia ping z hostów w sieci LAN do innych hostów w sieci lokalnej: $ ping pyramid $ ping xena $ ping uberpc

Powinniśmy otrzymać odpowiedzi podobne do następujących: PING pyramid.alrac.net (192.168.1.50) 56(84) bytes of data. 64 bytes from pyramid.alrac.net (192.168.1.50): icmp_seq=1 ttl=64 time=0.483 ms 64 bytes from pyramid.alrac.net (192.168.1.50): icmp_seq=2 ttl=64 time=0.846 ms

Za pomocą polecenia ping możemy bez trudu uzyskiwać dostęp zarówno do przewodowych, jak i bezprzewodowych klientów, a klienty DHCP powinny być automatycznie wprowadzane do tabeli DNS. Na koniec sprawdzamy, czy system DNS prawidłowo przypisuje nazwy domen: $ hostname xena $ hostname -f xena.alrac.net $ dnsdomainname alrac.net

Dyskusja Pyramid Linux montuje sporo plików, na przykład /etc/resolv.conf, w tymczasowym, zapisywalnym systemie plików. Aby je zobaczyć, można przejrzeć katalog /rw. Można też uruchomić polecenie ls-l/etc, aby zobaczyć, które z plików mają dowiązania symboliczne do katalogu /rw. Pliki te w czasie rozruchu systemu są kopiowane z katalogu /ro. Katalog /rw służy do zapisywania tymczasowych zmian. Można zatem zmodyfikować katalog /ro lub ustawić opcję niezmienności plików w katalogu /etc.

114

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

Plik dnsmasq.conf umożliwia skonfigurowanie wielu własności za pomocą zaledwie kilku linijek. Spróbujmy zatem przyjrzeć mu się nieco bliżej: domain-needed

Nie należy przekazywać żądań prostych nazw hostów, w których nie ma kropek lub części nazw domen, do serwerów DNS ruchu „w górę”. Jeśli nie ma nazwy w pliku /etc/hosts bądź w tabeli DHCP, serwer nazw zwraca odpowiedź „nie znaleziono”. Oznacza to, że niepełne żądania (na przykład google lub oreilly zamiast google.com lub oreilly.com) zostaną odrzucone, zanim zdążą opuścić sieć. bogus-priv

Odrzucenie wyszukiwania prywatnych adresów. Operacje wyszukiwania prywatnych adresów IP (na przykład 192.168.x.x) nie będą przekazywane w górę. Jeśli serwer nie znajdzie ich w pliku /etc/hosts lub w pliku dzierżaw DHCP, zwróci odpowiedź „nie ma takiej domeny”. Używanie opcji domain-needed i bogus-priv należy do dobrych praktyk w sieci. local=/alrac.net/

Za pomocą tej opcji ustawia się nazwę lokalnej domeny. Dzięki temu odpowiedzi na zapytania o nazwy z lokalnej domeny będą udzielane wyłącznie na podstawie pliku /etc/hosts oraz systemu DHCP i nie będą przekazywane w górę. Opcja daje dostęp do interesującego mechanizmu, który pozwala na wybranie dowolnej nazwy domeny dla prywatnej sieci, bez konieczności jej rejestrowania. Aby opcja działała prawidłowo, trzeba jednocześnie skorzystać z opcji expand-hosts i domain. expand-hosts

Użycie tej opcji powoduje automatyczne dodawanie nazwy domeny do nazw hostów. domain=alrac.net Opcja expand-hosts z tego ustawienia odczytuje nazwę domeny. interface

Definiuje interfejs, którego powinien nasłuchiwać program dnsmasq. W przypadku więcej niż jednego interfejsu każdy interfejs należy umieścić w osobnym wierszu.

listen-address=127.0.0.1

Opcja jest poleceniem dla programu dnsmasq dotyczącym używania własnego lokalnego bufora, zamiast kierowania zapytań „w górę”, do nadrzędnych serwerów nazw, w przypadku każdego żądania. Użycie opcji przyspiesza operacje wyszukiwania z routera, a także umożliwia routerowi korzystanie z lokalnego systemu DNS. Opcję można zweryfikować poprzez wysłanie polecenia ping do hostów sieci LAN z routera, posługując się nazwami hostów bądź pełną, kwalifikowaną nazwą domeny (FQDN). server

Opcja server może być wykorzystywana do kilku różnych celów. W tym przypadku opcja definiuje nadrzędne serwery DNS. dhcp-range=lan,192.168.1.100,192.168.1.200,12h

Definicja puli dzierżaw DHCP wraz z czasem dzierżawy. Opcja definiuje również strefę sieciową o nazwie lan. Używanie stref identyfikowanych przez nazwy pozwala na przypisywanie serwerów i tras do grup klientów oraz różnych podsieci. Przykład użycia tego mechanizmu zaprezentowano w recepturze 3.13. dhcp-max-lease

Maksymalna liczba dzierżaw DHCP. Domyślna wartość wynosi 150. Można użyć dowolnej liczby, na jaką pozwala zakres adresów.

4.3. Konfiguracja serwera nazw

|

115

Patrz także • w recepturze 4.12 zaprezentowano przykład użycia stref identyfikowanych przez nazwy • strona podręcznika man 8 dnsmasq zawiera mnóstwo przydatnych informacji dotyczących

wszystkich dostępnych opcji wiersza poleceń; wiele z nich można również wykorzystywać w pliku konfiguracyjnym dnsmasq.conf • plik dnsmasq.conf również może być cennym źródłem pomocy • na stronie macierzystej programu dnsmasq można znaleźć archiwa list mailingowych oraz

doskonałe dokumenty zawierające wiele pomocnych wskazówek: http://www.thekelleys.org.uk/dnsmasq/doc.html

• rozdział 24. „Rozwiązywanie nazw” z książki Carli Schroder Linux. Receptury (Helion,

2005)

4.4. Konfiguracja statycznych adresów IP z wykorzystaniem serwera DHCP Problem Chcemy zarządzać komputerami LAN za pomocą DHCP, zamiast konfigurować je indywidualnie. Dzięki wykorzystaniu DHCP chcemy uniknąć konieczności ciągłego modyfikowania konfiguracji w poszczególnych komputerach. Chcemy, aby wszystkie adresy IP w sieci — komputerów, bram i serwerów — zarówno statyczne, jak i dynamiczne, były przypisywane za pomocą DHCP.

Rozwiązanie Wszystko to można to osiągnąć za pomocą programu dnsmasq. Istnieje kilka sposobów przypisywania statycznych adresów IP na podstawie pliku dnsmasq.conf. Jeden z nich polega na wykorzystaniu adresu MAC jako identyfikatora klienta. Robi się to w następujący sposób: dhcp-host=11:22:33:44:55:66,192.168.1.75

Moim ulubionym sposobem jest identyfikacja hostów według nazwy: dhcp-host=penguina,192.168.1.75

Należy upewnić się, aby nazwy hostów z pliku dnsmasq.conf nie były wymienione w pliku /etc/hosts. Jedyna konfiguracja klienta, jaka jest wymagana polega na nadaniu nazwy hosta, a w przypadku klientów DHCP, na wysłaniu nazwy hosta do serwera DHCP w momencie zażądania nowej dzierżawy. Po wykonaniu tych czynności, można kontrolować przypisywaniem adresów IP wyłącznie z poziomu serwera. Należy pamiętać, aby po każdej modyfikacji pliku dnsmasq.conf, uruchomić polecenie killall dnsmasq .

W konfiguracji klienta jest kilka kruczków — opisano je w recepturze 4.5.

116

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

Dyskusja Zmiany w pliku dnsmasq.conf są bardzo łatwe do przetestowania. Po zrestartowaniu programu dnsmasq, należy spróbować uruchomić poniższe polecenia z poziomu klientów linuksowych. Polecenie ifupdown zatrzymuje i restartuje interfejsy: # ifdown eth0 # ifup etho

Czasami wykonanie tych poleceń nie daje efektu. W takich przypadkach można skorzystać z następujących poleceń: # /etc/init.d/network restart # /etc/init.d/networking restart

Pierwsze z nich pochodzi z dystrybucji Fedora, drugie z dystrybucji Debian. Polecenie odczytuje adres przypisany przez serwer DHCP i zapisuje informacje o serwerze lub serwerach DNS do pliku /etc/resolv.conf. Jeśli uruchomienie tych poleceń nie przyniesie efektu, należy zrestartować system. Adresy MAC można znaleźć za pomocą polecenia ifconfig w przypadku przewodowych kart sieciowych oraz iwconfig w przypadku kart bezprzewodowych. Polecenie ifconfig wykrywa zarówno karty przewodowe, jak i bezprzewodowe, ale ich nie rozróżnia. Polecenie iwconfig identyfikuje wyłącznie interfejsy bezprzewodowe. W przypadku używania adresu MAC, po wymianie karty sieciowej nie należy zapominać o zmianie zapisu w pliku dnsmasq.conf. Adresy MAC są unikatowe, ale nazwy hostów nie, zatem trzeba zachować ostrożność, aby nie dublować nazw hostów. W sieci nie może jednak być zdublowanych nazw hostów. Adresy MAC są niezwykle łatwe do sfałszowania, dlatego nie należy sądzić, że poleganie na nich jako na bezpiecznych, unikatowych identyfikatorach jest jakimkolwiek zabezpieczeniem.

Patrz także • strona podręcznika man 8 dnsmasq zawiera mnóstwo przydatnych informacji dotyczących

wszystkich dostępnych opcji wiersza poleceń; wiele z nich można również wykorzystywać w pliku konfiguracyjnym dnsmasq.conf • plik dnsmasq.conf również może być cennym źródłem pomocy • na stronie macierzystej programu dnsmasq (http://www.thekelleys.org.uk/dnsmasq/doc.html)

można znaleźć archiwa list mailingowych oraz doskonałe dokumenty pomocy • rozdział 24. „Rozwiązywanie nazw” z książki Carli Schroder Linux. Receptury (Helion,

2005)

4.4. Konfiguracja statycznych adresów IP z wykorzystaniem serwera DHCP

|

117

4.5. Konfigurowanie linuksowych i windowsowych statycznych klientów DHCP Problem A gdyby tak w sieci istniały klienty zarówno linuksowe, jak i windowsowe oraz różne dystrybucje Linuksa, w których operacje są wykonywane w różny sposób? Czyż nie byłoby doskonale, gdyby program dnsmasq mógł nadać im statyczne adresy IP?

Rozwiązanie Kluczem do przydzielania statycznych adresów IP przez serwer DHCP jest przesyłanie przez klienty nazw hostów do serwera DHCP wraz z żądaniem dzierżawy. Klienty systemów Windows 2000, 2003 i XP robią to automatycznie. Wystarczy tylko skonfigurować je zgodnie z wymogami serwera DHCP. W maszynach linuksowych należy przede wszystkim upewnić się, że w pliku /etc/hosts nie ma niczego poza zapisami dla lokalnej domeny. Większość dystrybucji Linuksa nie przesyła domyślnie nazw hostów. Aby to poprawić, należy dodać jedną linijkę do plików konfiguracji klientów DHCP. W dystrybucji Debian jest to plik /etc/dhcp3/dhclient.conf. Poniższy przykład dotyczy komputera o nazwie Pingwin: send host-name "pingwin";

Należy również wprowadzić nazwę hosta w pliku /etc/hostname: pingwin

Należy wprowadzić samą nazwę hosta i nic innego. Następnie należy skonfigurować DHCP w standardowy sposób w pliku /etc/network/interfaces, tak jak pokazano poniżej: ##/etc/network/interfaces auto lo iface lo inet loopback auto eth0 iface eth0 inet dhcp

W dystrybucji Fedora każdy interfejs uzyskuje własny plik klienta DHCP, na przykład /etc/ dhclient-eth1. W przypadku braku tego pliku należy go utworzyć. W pliku należy umieścić taką samą instrukcję jak w dystrybucji Debian: send host-name "pingwin";. Następnie należy dodać poniższy wiersz do pliku /etc/sysconfig/network-scripts/ifcfg-eth0: DHCP_HOSTNAME=pingwin

Trzeba pamiętać o sprawdzeniu, czy wiersz HOSTNAME w pliku /etc/sysconfig/network jest pusty. Pewnym sposobem na przetestowanie nowej konfiguracji jest ponowne uruchomienie systemu, a następnie uruchomienie następujących poleceń: $ hostname pingwin $ hostname -f pingwin.alrac.net $ dnsdomainname alrac.net

118

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

Wynik działania polecenia ping powinien wyglądać następująco: carla@xena:~$ ping pingwin PING pingwin.alrac.net (192.168.1.75) 56(84) bytes of data. 64 bytes from pingwin.alrac.net (192.168.1.75): icmp_seq=1 ttl=128 time=8.90 ms carla@pingwin:~$ ping pingwin PING pingwin.alrac.net (192.168.1.75) 56(84) bytes of data. 64 bytes from pingwin.alrac.net (192.168.1.75): icmp_seq=1 ttl=64 time=0.033 ms

Dyskusja Najczęstszym źródłem problemów w przypadku przydzielania statycznych adresów IP za pomocą DHCP jest nieprawidłowe skonfigurowanie nazw hostów. Należy sprawdzić wszystkie stałe pliki konfiguracyjne. Oto kompletny przykład konfiguracji interfejsu eth0 dla dystrybucji Fedora: ##/etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 ONBOOT=yes BOOTPROTO=dhcp HWADDR=11.22.33.44.55.66 DHCP_HOSTNAME=pingwin TYPE=wireless PEERDNS=yes MODE=managed RATE=auto

Pliki konfiguracyjne w dystrybucji Fedora można modyfikować bezpośrednio lub za pomocą konfiguratora z graficznym interfejsem. Nie należy jednak używać obu metod naraz, ponieważ graficzny konfigurator nadpisuje modyfikacje wprowadzone ręcznie. Program dnsmasq automatycznie wprowadza klienty DHCP do systemu DNS. Jest to bardzo duże udogodnienie, a po wdrożeniu schematu adresacji IPv6 będzie to coś więcej niż tylko udogodnienie — będzie to konieczność, chyba że ktoś nie będzie miał żadnych trudności z zapamiętywaniem i wpisywaniem długich adresów IPv6. Program dnsmasq łączy mnóstwo złożonych funkcji w krótkim pliku konfiguracyjnym. Można go używać w połączeniu z programami BIND, djbdns, MaraDNS oraz innymi serwerami nazw. Programu dnsmasq należy używać do rozwiązywania nazw w sieci LAN, natomiast jednego z wymienionych systemów w roli autorytatywnego serwera publicznego. W ten sposób oba serwery będą od siebie całkowicie oddzielone. Należy zapamiętać zasadę numer jeden dotyczącą serwera DNS: serwer autorytatywny powinien być ściśle oddzielony od serwera buforującego. Oznacza to użycie dwóch fizycznie oddzielonych od siebie interfejsów sieciowych oraz różnych adresów IP. Serwery autorytatywne nie odpowiadają na zapytania dla innych domen — takie zadanie spełnia system buforujący, taki jak dnsmasq. Może się wydawać, że utrzymywanie dwóch oddzielnych serwerów to więcej pracy, ale w praktyce jest to łatwiejsze i bezpieczniejsze od próby skonfigurowania pojedynczego serwera do wykonywania obu zadań.

Patrz także • man 5 dhclient • plik dnsmasq.conf jest cennym źródłem pomocy

4.5. Konfigurowanie linuksowych i windowsowych statycznych klientów DHCP

|

119

• na stronie macierzystej programu dnsmasq (http://www.thekelleys.org.uk/dnsmasq/doc.html)

można znaleźć archiwa list mailingowych oraz doskonałe dokumenty pomocy • rozdział 24. „Rozwiązywanie nazw” z książki Carli Schroder Linux. Receptury (Helion,

2005)

4.6. Wprowadzanie serwerów pocztowych do systemu dnsmasq Problem W sieci jest kilka lokalnych serwerów pocztowych. Chcemy, aby hosty w sieci LAN wiedziały o ich obecności. W jaki sposób można to zrobić za pomocą programu dnsmasq?

Rozwiązanie W programie dnsmasq jest specjalny typ rekordu dla serwerów pocztowych. Należy wprowadzić następujące trzy linijki: mx-host=alrac.net,mail.alrac.net,5 mx-target=mail.alrac.net localmx

W opcji mx-host należy określić nazwę domeny, nazwę serwera oraz priorytet MX. Opcja mx-target służy do wprowadzenia nazwy serwera. Atrybut localmx oznacza, że wszystkie lokalne maszyny powinny korzystać z tego serwera.

Dyskusja Priorytet o wartości 5. oznacza, że serwer ma wyższy priorytet od serwerów oznaczonych wyższymi wartościami. Zazwyczaj priorytety mają wartość liczby 10 i jej wielokrotności. Nawet jeśli mamy tylko jeden serwer pocztowy, powinniśmy mimo wszystko nadać mu priorytet.

Patrz także • man 5 dhclient • plik dnsmasq.conf również może być cennym źródłem pomocy • na stronie macierzystej programu dnsmasq (http://www.thekelleys.org.uk/dnsmasq/doc.html)

można znaleźć archiwa list mailingowych oraz doskonałe dokumenty pomocy • rozdział 24. „Rozwiązywanie nazw” z książki Carli Schroder Linux. Receptury (Helion,

2005)

120

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

4.7. Wzmocnienie algorytmu WPA2-Personal niemal do poziomu WPA-Enterprise Problem Wykorzystywanie niezabezpieczonego punktu dostępowego jest irytujące. Zanim zrobimy cokolwiek innego, chcemy go zabezpieczyć. Sprawdziliśmy, że wszystkie bezprzewodowe karty sieciowe w naszej sieci obsługują WPA2, zatem jesteśmy gotowi. Nie chcemy uruchamiać serwera uwierzytelniania RADIUS, ale używanie tego samego klucza dla wszystkich klientów nie wydaje się zbyt bezpieczne. Czy nie istnieje jakieś rozwiązanie pośrednie?

Rozwiązanie Tak, jest takie rozwiązanie. W dystrybucji Pyramid Linux jest program hostapd — demon przestrzeni użytkownika dla punktów dostępowych i serwerów uwierzytelniania. W tej recepturze pokażemy, w jaki sposób przydzielić klientom klucze wstępne (ang. pre-shared keys). Będzie to alternatywa używania przez wszystkie klienty tego samego klucza. Zamiast słabszego szyfrowania bazującego na algorytmie RC4 występującego w standardach WPA i WEP wykorzystamy silne szyfrowanie AES-CCM. Najpierw uruchomimy polecenie /sbin/rw w celu włączenia funkcji zapisu w systemie plików Pyramid. Następnie utworzymy plik /etc/hostapd.conf: ##/etc/hostapd.conf interface=ath0 bridge=br0 driver=madwifi debug=0 ssid=alrac-net macaddr_acl=0 auth_algs=3 wpa=1 wpa_psk_file=/etc/hostapd_wpa_psk wpa_key_mgmt=WPA-PSK wpa_pairwise=CCMP

Następnie utworzymy plik /etc/hostapd_wpa_psk, w którym współdzielone hasło jest zapisane zwykłym tekstem: 00:00:00:00:00:00 dlugiehaslo

Modyfikujemy plik /etc/network/interfaces tak, aby program hostapd uruchamiał się w momencie włączenia interfejsu br0. Na końcu rekordu dotyczącego interfejsu br0 dodajemy poniższe linijki: up hostapd -B /etc/hostapd.conf post-down killall hostapd

Uruchamiamy /sbin/ro, po czym restartujemy obsługę sieci: pyramid:~# /etc/init.d/networking restart

4.7. Wzmocnienie algorytmu WPA2-Personal niemal do poziomu WPA-Enterprise

|

121

Następnie przechodzimy do linuksowego klienta PC w celu przetestowania rozwiązania. W komputerze-kliencie tworzymy plik /etc/wpa_supplicant.conf o zawartości zamieszczonej poniżej. Wykorzystujemy własny identyfikator ESSID i supertajne hasło z pliku /etc/hostapd_ wpa_psk: ##/etc/wpa_supplicant.conf network={ ssid="alrac-net" psk="dlugiehaslo" pairwise=CCMP group=CCMP key_mgmt=WPA-PSK }

Zamykamy interfejs bezprzewodowy klienta, a następnie testujemy wymianę kluczy: # ifdown ath0 # wpa_supplicant -iath0 -c/etc/wpa_supplicant.conf -Dmadwifi -w Trying to associate with 00:ff:4a:1e:a7:7d (SSID='alrac-net' freq=2412 MHz) Associated with 00:ff:4a:1e:a7:7d WPA: Key negotiation completed with 00:ff:4a:1e:a7:7d [PTK=CCMP GTK=CCMP] CTRL-EVENT-CONNECTED - Connection to 00:2b:6f:4d:00:8e

Wynik tego polecenia pokazuje, że wymiana kluczy przebiegła pomyślnie, i potwierdza użycie szyfrowania CCMP — znacznie silniejszego algorytmu w porównaniu ze strumieniowym szyfrowaniem RC4 wykorzystywanym w WEP. Wciskamy Ctr+C, aby zakończyć test wymiany kluczy. Możemy teraz dodać więcej klientów i przypisać każdemu z nich unikatowy klucz. Wystarczy wymienić je w pliku /etc/hostapd_wpa_psk i przypisać hasła do ich adresów MAC: 00:0D:44:00:83:CF 00:22:D6:01:01:E2 23:EF:11:00:DD:2E

unikatowehaslotekstowe innehaslotekstowe jeszczejednohaslo

Zainstalowaliśmy dobre, silne szyfrowanie bazujące na algorytmie AES-CCMP. Jeśli teraz któryś z użytkowników ujawni swój klucz, nie będziemy zmuszeni zmieniać kluczy wszystkim użytkownikom. Odebranie użytkownikowi uprawnień sprowadza się do ujęcia w komentarz wiersza z jego hasłem bądź jego usunięcia. Aby hasła zostały na trwałe przydzielone do klientów, można tak skonfigurować ich interfejsy bezprzewodowe, aby w momencie włączenia wywoływały skrypt wpa_supplicant. W dystrybucji Debian należy wprowadzić następujące wiersze: ##/etc/network/interfaces auto ath0 iface ath0 inet dhcp pre-up wpa_supplicant -iath0 -Dmadwifi -Bw -c/etc/wpa_supplicant/wpa_supplicant.conf post-down killall -q wpa_supplicant

W dystrybucji Fedora należy dodać poniższy wiersz w pliku /etc/sysconfig/network-scripts/ ifup-wireless: wpa_supplicant -ieth0 -c/etc/wpa_supplicant/wpa_supplicant.conf -Dmadwifi -Bw

Należy się upewnić, że ścieżka dostępu do pliku wpa_supplicant.conf jest prawidłowa, że podaliśmy właściwy interfejs za pomocą opcji -i oraz że wprowadziliśmy odpowiedni dla interfejsu bezprzewodowego sterownik za pomocą opcji -D.

Dyskusja Podczas testowania wymiany kluczy należy określić sterownik dla bezprzewodowej karty sieciowej (w przykładzie jest za to odpowiedzialna opcja -Dmadwifi). Listę dostępnych opcji 122

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

można obejrzeć za pomocą polecenia man 8 wpa_supplicant. wext to sterownik ogólnego przeznaczenia dla jądra systemu Linux. W niektórych dokumentacjach można spotkać zalecenie, aby z niego korzystać. Lepiej najpierw wypróbować sterownik specjalnie przeznaczony dla wybranej karty bezprzewodowej, a następnie, w przypadku problemów, skorzystać ze sterownika wext. Użyte przykładowe hasła są złe i nie należy ich stosować w praktyce. Rzeczywiste hasła powinny mieć maksymalną długość 63 znaków i nie powinny zawierać słów bądź imion. Dobre hasło to losowa mieszanka liter i cyfr. Należy unikać stosowania znaków przestankowych w hasłach, ponieważ niektóre klienty windowsowe nie obsługują ich prawidłowo. Dostępnych jest wiele losowych generatorów hasła. Aby je znaleźć, wystarczy poszukać w internecie. Obsługa szyfrowania WPA w systemie Windows XP wymaga zainstalowania dodatku SP2 oraz oprogramowania klienckiego dostarczanego z kartami interfejsów bezprzewodowych. Wymagane oprogramowanie klienckie dla starszych wersji Windowsa powinno być dołączone do kart bezprzewodowych. Czasami jednak producenci go nie dostarczają — należy kupować z rozwagą. Szyfrowanie haseł w postaci zwykłego tekstu wymaga sporej mocy obliczeniowej, dlatego wykorzystanie takich haseł może doprowadzić do spowolnienia działania systemu. Do szyfrowania haseł można zastosować program wpa_password. Po zaszyfrowaniu wystarczy skopiować zaszyfrowane ciągi znaków: $ wpa_passphrase alrac-net w894uiernnfif98389rbbybdbyu8i3yenfig87bfop network={ ssid="alrac-net" #psk="w894uiernnfif98389rbbybdbyu8i3yenfig87bfop" psk=48a37127e92b29df54a6775571768f5790e5df87944c26583e1576b83390c56f }

Dzięki zastosowaniu zaszyfrowanych haseł klienty i punkt dostępowy nie będą zmuszone do poświęcania tak wielu cykli procesora na obsługę haseł. W zaszyfrowanych hasłach nie wprowadza się znaków cudzysłowu w pliku wpa_supplicant.conf; hasła w postaci zwykłego tekstu muszą być podane w cudzysłowie. Zapis 00:00:00:00:00:00 w naszym pierwszym przykładzie oznacza „akceptuj wszystkie adresy MAC”. Aby obejrzeć wykorzystanie kluczy w praktyce, można skorzystać z polecenia iwlist ath0 key wydanego z poziomu punktu dostępowego lub klientów. Punkt dostępowy obsługuje niemal wszystkie typy klientów: Linux, Mac OS X, Windows, Unix, BSD… można wykorzystać dowolnego klienta z modułem supplicant oraz obsługą protokołów. NetworkManager i Kwlan to dobre graficzne narzędzia do zarządzania siecią dla klientów linuksowych. NetworkManager jest przeznaczony dla wszystkich komputerów desktop z systemem Linux oraz wszystkich menedżerów okien. System jest częścią pakietu Gnome; narzędzie Kwlan wchodzi w skład środowiska KDE. Oba narzędzia obsługują profile, spełniają funkcje zarządzania kluczami i pozwalają na łatwe przełączanie w sieci. W przypadku zastosowania mostu ethernetowego należy pamiętać o wprowadzeniu interfejsów bezprzewodowych i mostu do pliku /etc/hostapd.conf. Plik hostapd.conf obsługuje mechanizmy kontroli dostępu bazujące na adresach MAC. Można je wykorzystać, choć uważam, że to strata czasu. Adresy MAC są tak łatwe do sfałszowania, że może to zrobić… nawet nasz kot. 4.7. Wzmocnienie algorytmu WPA2-Personal niemal do poziomu WPA-Enterprise

|

123

HostAP to projekt, który początkowo obsługiwał tylko bezprzewodowe układy Prism. Teraz jednak obsługuje on następujące sterowniki: • sterownik Host AP dla układów Prism2/2.5/3; • madwifi (Atheros ar521x); • Prism54.org (Prism GT/Duette/Indigo); • BSD — net80211.

Patrz także • dystrybucja Pyramid Linux nie zawiera stron podręcznika man, dlatego albo należy zain-

stalować aplikacje zaprezentowane w tym rozdziale w komputerze PC, albo poszukać informacji w wyszukiwarce Google • wlanconfig jest częścią pakietu MadWiFi-ng • man 8 wlanconfig • w domyślnym pliku hostapd.conf jest mnóstwo cennych komentarzy • pomocny może być również domyślny plik wpa_supplicant.conf • książka Matthew Gasta 802.11. Sieci bezprzewodowe. Przewodnik encyklopedyczny (Helion,

2003)

• MadWiFi.org: http://madwifi.org/

4.8. Rozwiązanie korporacyjne — uwierzytelnianie z wykorzystaniem serwera RADIUS Problem Poprzednia receptura prezentuje zgrabny sposób nadawania klientom bezprzewodowym indywidualnych kluczy. W dalszym ciągu nie jest to jednak prawdziwa infrastruktura klucza publicznego (Public Key Infrastructure — PKI), która bardziej się nadaje do zastosowania w większych instalacjach i zapewnia większe bezpieczeństwo. Zadecydowaliśmy, że warto uruchomić samodzielny serwer RADIUS do uwierzytelniania bezprzewodowych klientów, ponieważ gwarantuje on lepsze zabezpieczenia i większą uniwersalność. Serwer będzie można wykorzystać do uwierzytelniania wszystkich klientów w sieci, nie tylko bezprzewodowych, i będzie można odpowiednio skalować rozwiązanie — stosownie do potrzeb. A zatem w jaki sposób wykorzystać serwer RADIUS do uwierzytelniania klientów bezprzewodowych?

Rozwiązanie Można skorzystać z pakietu FreeRADIUS razem z OpenSSL. Aby to zrobić, należy wykonać cztery czynności:

1. Zainstalować i skonfigurować serwer FreeRADIUS. 2. Utworzyć i przeprowadzić dystrybucję serwera OpenSSL oraz certyfikatów klienckich.

124

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

3. Skonfigurować punkt dostępowy sieci bezprzewodowej. 4. Skonfigurować klienckie moduły supplicant. Punkt dostępowy sieci bezprzewodowej stanie się serwerem dostępu do sieci (Network Access Server — NAS), ponieważ przekazuje zadanie uwierzytelniania użytkowników do serwera FreeRADIUS. Aby stracić mniej włosów i zapewnić niższe ciśnienie krwi podczas instalacji systemu FreeRADIUS, lepiej wykorzystać do tego celu menedżera pakietów wybranej dystrybucji. Użytkownicy, którzy preferują instalację z kodów źródłowych, mogą znaleźć potrzebne informacje w dokumencie INSTALL archiwum tarball zawierającego kody źródłowe. Niniejsza receptura wymaga zastosowania środowiska PKI z wykorzystaniem zabezpieczeń EAP-TLS (Extensible Authentication Protocol-Transport Layer Security), co oznacza konieczność wzajemnego uwierzytelniania serwera i klienta z wykorzystaniem certyfikatów X.509. W związku z tym potrzebne będą: • własny urząd certyfikatów; • prywatny klucz serwera oraz certyfikat podpisany przez urząd certyfikatów; • unikatowy klucz prywatny oraz certyfikat podpisany przez urząd certyfikatów dla każ-

dego klienta. Jest to najsilniejsze uwierzytelnianie, z jakiego możemy skorzystać. W recepturze 9.5 można znaleźć informacje, jak łatwo wykonać te czynności z wykorzystaniem doskonałych skryptów pomocniczych systemu OpenVPN. Użytkownicy, którzy nie mają zainstalowanego programu OpenVPN, mogą pobrać skrypty z serwisu OpenVPN.net (http://openvpn.net/). Są dwie operacje, które trzeba zrobić inaczej. Po pierwsze, należy skorzystać z certyfikatów klienckich zabezpieczonych hasłem: # ./build-key-pass [nazwa hosta klienta]

Trzeba również utworzyć certyfikaty PKI2 dla klientów windowsowych: # ./build-key-pkcs12 [nazwa hosta klienta]

W niniejszej recepturze dane dotyczące urzędu certyfikatów, prywatnego klucza serwera i publicznego klucza serwera są zapisane w pliku /etc/raddb/keys. Katalog powinien mieć tryb 0750, a jego właścicielem powinien być użytkownik root. Katalogowi należy również nadać identyfikator grupy programu FreeRADIUS właściwy określonej dystrybucji Linuksa. W dystrybucji Debian jest to grupa root: freerad. W dystrybucji Fedora — root:radiusd. Należy zmodyfikować następujące pliki programu FreeRADIUS: /etc/raddb/clients.conf /etc/raddb/users /etc/raddb/eap.conf /etc/raddb/radiusd.conf W dystrybucji Debian pliki znajdują się w katalogu /etc/freeradius zamiast /etc/raddb. Najpierw należy poinformować program FreeRADIUS o bezprzewodowych punktach dostępowych, umieszczając odpowiednie zapisy w pliku clients.conf (każda sekcja opisuje oddzielny punkt dostępowy). Zamiast dodawania zapisów w pliku domyślnym można utworzyć nowy, pusty plik:

4.8. Rozwiązanie korporacyjne — uwierzytelnianie z wykorzystaniem serwera RADIUS

|

125

##/etc/raddb/clients.conf client 192.168.1.50 { secret = supersilnehaslo shortname = wap1 nastype = other }

Następnie należy utworzyć listę nazw uprawnionych użytkowników w pliku users oraz zdefiniować komunikat, który wyświetli się w przypadku próby zalogowania się przez użytkownika spoza listy uprawnionych. Nazwy użytkowników to wartości pola Common Name z certyfikatów klienckich. Należy je dodać do istniejącego pliku users: ##/etc/raddb/users "alrac sysadmin" Auth-Type := EAP "terry rockstar" Auth-Type := EAP "pinball wizard" Auth-Type := EAP DEFAULT Auth-Type := Reject Reply-Message = "Słyszałem, że ktoś puka, ale nie mogę otworzyć."

Następnie utworzymy dwa pliki zawierające losowe dane wymagane przez protokół EAP do wykonywania zadania. Ich właścicielem powinien być użytkownik root, a identyfikator grupy powinien być zgodny z tym, jaki przydzielono programowi FreeRADIUS. Prawo do odczytu pliku powinien mieć wyłącznie jego właściciel: # # # # # #

openssl dhparam -check -text -5 512 -out /etc/raddb/dh dd if=/dev/random of=/etc/raddb/random count=1 bs=128 chown root:radiusd /etc/raddb/dh chown root:radiusd /etc/raddb/random chmod 0640 /etc/raddb/dh chmod 0640 /etc/raddb/random

Trzeba pamiętać, aby wykorzystać grupę RADIUS właściwą używanej dystrybucji. Moduł EAP konfiguruje się za pomocą pliku eap.conf. Należy znaleźć i zmodyfikować poniższe wiersze w pliku konfiguracyjnym, używając własnych nazw plików: ##/etc/raddb/eap.conf default_eap_type = tls tls { private_key_password = [twoje hasło] private_key_file = /etc/raddb/keys/xena.crt certificate_file = /etc/raddb/keys/xena.key CA_file = /etc/raddb/keys/ca.crt dh_file = /etc/raddb/keys/dh2048.pem random_file = /etc/raddb/keys/random fragment_size = 1024 include_length = yes }

Plik radiusd.conf jest obszerny i poprzeplatany opisowymi komentarzami. W związku z tym zaprezentuję tylko te fragmenty, w których mogą być potrzebne zmiany. W module Authorization należy usunąć komentarz z wiersza dotyczącego protokołu eap: ##/etc/raddb/radiusd.conf # Authorization. First preprocess (hints and huntgroups files), authorize { ... eap ... }

W module Authentication należy usunąć komentarz z wiersza dotyczącego protokołu eap:

126

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

# Authentication. authenticate { ... eap ... }

Na koniec należy się upewnić, że nie ma komentarza w poniższych wierszach oraz że wprowadzono właściwe dane użytkownika i grupy. Mogą to być różne dane — w zależności od dystrybucji: user = radiusd group = radiusd

Zamykamy program FreeRADIUS, jeśli jest włączony, a następnie uruchamiamy poniższe polecenia w celu jego przetestowania: # freeradius -X ... "Ready to process requests" # radtest test test localhost 0 testing123

Pierwsze polecenie uruchamia program FreeRADIUS w trybie debugowania. Drugie polecenie przesyła test uwierzytelniania, który powinien zakończyć się porażką. Chcemy, aby program FreeRADIUS odpowiedział na żądanie. W trybie debugowania wyświetla się mnóstwo opisowych komunikatów, jeśli zatem wystąpią błędy w konfiguracji, nie powinno być problemów z ich znalezieniem.

Dyskusja Najtrudniejsze jest uzyskanie właściwych certyfikatów, ale — na szczęście — dzięki skryptom Easy-RSA nie jest to trudne. Dobrym rozwiązaniem jest doskonały menedżer infrastruktury PKI TinyCA (http://tinyca.sm-zone.net/). Interesującą własnością systemu FreeRADIUS jest brak konieczności używania listy odwołań certyfikatów (Certification Revocation List — CRL). Nic jednak nie stoi na przeszkodzie, aby skorzystać z takiej listy, ponieważ odwołanie użytkownika sprowadza się do usunięcia go z pliku users. W różnych dystrybucjach Linuksa użytkownicy programu FreeRADIUS — podobnie jak grupy — są obsługiwani w różny sposób. W niektórych dystrybucjach wykorzystywany jest użytkownik nobody. W dystrybucji Debian tworzona jest grupa i użytkownik freerad. Ważne jest, aby program FreeRADIUS był uruchamiany z konta nieuprzywilejowanego użytkownika. Z tego względu należy się upewnić, czy w pliku radiusd.conf zostały właściwie skonfigurowane wiersze dotyczące użytkownika i grupy. Jeśli w sieci jest kilka bezprzewodowych punktów dostępowych, nie trzeba indywidualnie zarządzać dostępem do nich – można to robić według podsieci. ##/etc/raddb/clients.conf client 192.168.0.0/24 { secret = supersilnehaslo shortname = wap_herd nastype = other

Jest to rozwiązanie mniej bezpieczne, ponieważ wszystkie punkty dostępowe wykorzystują ten sam klucz, ale łatwiejsze do zarządzania.

4.8. Rozwiązanie korporacyjne — uwierzytelnianie z wykorzystaniem serwera RADIUS

|

127

Patrz także • man 1 openssl • man dhparam • doskonałymi materiałami referencyjnymi są domyślne pliki eap.conf, radiusd.conf, clients.conf

i users

• książka RADIUS Jonathana Hassella (O’Reilly, 2002) jest wyczerpującym przewodnikiem

obsługi serwera RADIUS

• strona Wiki na temat programu FreeRADIUS: http://wiki.freeradius.org/ • TinyCA (http://tinyca.sm-zone.net/) to interesujące graficzne narzędzie do tworzenia i zarzą-

dzania infrastrukturą PKI oraz do importowania i eksportowania certyfikatów i kluczy

• receptura 9.5

4.9. Konfiguracja bezprzewodowego punktu dostępowego w celu wykorzystania programu FreeRADIUS Problem Skonfigurowanie programu FreeRADIUS nie było trudne. Co teraz należy zrobić, aby nasz punkt dostępowy z niego skorzystał?

Rozwiązanie Nasz punkt dostępowy bazujący na dystrybucji Pyramid Linux wymaga umieszczenia zaledwie kilku wierszy w pliku /etc/hostapd.conf. W zaprezentowanym przykładzie adres IP serwera FreeRADIUS to 192.168.1.250: ##/etc/hostapd.conf interface=ath0 bridge=br0 driver=madwifi debug=0 ssid=alrac-net ieee8021x=1 auth_algs=0 eap_server=0 eapol_key_index_workaround=1 own_ip_addr=192.168.1.50 nas_identifier=pyramid.alrac.net auth_server_addr=192.168.1.250 auth_server_port=1812 auth_server_shared_secret=superstrongpassword wpa=1 wpa_key_mgmt=WPA-EAP wpa_pairwise=TKIP wpa_group_rekey=300 wpa_gmk_rekey=640

128

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

Następnie zmodyfikujemy plik /etc/network/interfaces tak, aby program hostapd uruchamiał się w momencie włączenia interfejsu LAN. Na końcu rekordu dotyczącego interfejsu LAN dodajemy poniższe linijki: pre-up hostapd -B /etc/hostapd.conf post-down killall hostapd

Restartujemy obsługę sieci: pyramid:~# /etc/init.d/networking restart

Jesteśmy prawie u celu. Sposób konfiguracji klienta opisano w następnej recepturze.

Dyskusja Różne bezprzewodowe punkty dostępowe konfiguruje się w różny sposób. Trzy elementy wspólne dla wszystkich punktów dostępowych to: • adres IP serwera FreeRADIUS; • port programu FreeRADIUS: domyślnie wykorzystywany jest port o numerze 1812; • klucz programu FreeRADIUS: współdzielone hasło.

Należy pamiętać o tym, że nie trzeba się przejmować kluczami i certyfikatami w punkcie dostępowym. Jest to tylko pośrednik.

Patrz także • książka RADIUS Jonathana Hassella (O’Reilly, 2002) jest wyczerpującym przewodnikiem

obsługi serwera RADIUS • strona Wiki na temat programu FreeRADIUS: http://wiki.freeradius.org/ • przykładowy plik hostapd.conf

4.10. Uwierzytelnianie klientów z wykorzystaniem systemu FreeRADIUS Problem Po przygotowaniu punktu dostępowego i serwera FreeRADIUS należy odpowiednio skonfigurować klienty, tak by mogły się z nim komunikować.

Rozwiązanie Wszystkie klienty wymagają kopii pliku ca.crt. Dla klientów pracujących w systemie Mac OS i Linux wymagane są oddzielne pliki [nazwa_hosta].crt oraz [nazwa_hosta].key. Klienty systemu Windows korzystają z pliku [nazwa_hosta].p12. Klienty pracujące w systemach Windows i Mac OS są wyposażone we wbudowane narzędzia graficzne do importowania i zarządzania certyfikatami oraz konfigurowania modułów supplicant. Jak to się robi w systemie Linux? Nie znalazłam niczego łatwiejszego od modyfikacji 4.10. Uwierzytelnianie klientów z wykorzystaniem systemu FreeRADIUS

|

129

plików tekstowych. Wróćmy do receptury 4.7 i rozpocznijmy od modyfikacji pliku /etc/wpa_ supplicant.conf. Plik ten powinien mieć następującą zawartość: ##/etc/wpa_supplicant.conf network={ ssid="alrac-net" scan_ssid=1 key_mgmt=WPA-EAP pairwise=CCMP TKIP group=CCMP TKIP eap=TLS identity="alice sysadmin" ca_cert="/etc/cert/ca.crt" client_cert="/etc/cert/stinkpad.crt" private_key="/etc/cert/stinkpad.key" private_key_passwd="bardzobardzosilnehaslo" }

Wartość atrybutu identity pochodzi z pliku /etc/raddb/users na serwerze FreeRADIUS. Certyfikaty i klucze mogą być przechowywane w dowolnym miejscu, pod warunkiem, że odpowiednio skonfigurowano plik wpa_supplicant.conf, umieszczając w nim informacje o ich lokalizacji. Testowanie i dalszą konfigurację modułu wpa_supplicant opisano w recepturze 4.7.

Dyskusja Należy pamiętać, aby plikom .key nadać tryb 0400 oraz aby ich właścicielem był użytkownik właściwy dystrybucji Linuksa. Pliki .crt powinny mieć tryb 0644, a ich właścicielem także powinien być ten użytkownik. W pliku wpa_supplicant.conf można wprowadzić wiele zapisów dla różnych sieci. Należy pamiętać, że w celu oddzielenia ich od siebie należy wykorzystać następującą konstrukcję: network{ }

NetworkManager (http://www.gnome.org/projects/NetworkManager/) jest najlepszym linuksowym narzędziem do bezproblemowego zarządzania wieloma profilami sieciowymi. Program wchodzi w skład pakietu Gnome i jest dostępny dla wszystkich dystrybucji Linuksa.

Patrz także • man 8 wpa_supplicant • man 5 wpa_supplicant.conf

4.11. Nawiązywanie połączenia z internetem i wykorzystanie zapory firewall Problem Nadszedł czas, aby zakończyć prace w sieci LAN i podłączyć sieć do internetu. Sieć bezprzewodowa jest zaszyfrowana, usługi sieci LAN działają, a użytkownicy domagają się podłączenia sieci do internetu. Jesteśmy gotowi do skonfigurowania interfejsu WAN i stworzenia mocnej zapory firewall iptables. 130

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

Rozwiązanie Bułka z masłem! Najpierw skonfigurujemy interfejs WAN, a następnie zaporę firewall iptables (aby się dowiedzieć, jak to zrobić, można sięgnąć do rozdziału 3.). Trzeba wprowadzić kilka prostych zmian w pliku /usr/local/bin/fw-nat po to, by umożliwić przepływ ruchu przez most. Wprowadzamy takie dwie linijki: $ipt -A INPUT -p ALL -i $LAN_IFACE -s 192.168.1.0/24 -j ACCEPT $ipt -A FORWARD -p ALL -i $LAN_IFACE -s 192.168.1.0/24 -j ACCEPT

Trzeba oczywiście użyć danych dotyczących własnej podsieci. Następnie zmieniamy wartość parametru LAN_IFACE na br0: LAN_IFACE="br0"

Restartujemy system i testujemy wszystko zgodnie ze wskazówkami w rozdziale 3. Na tym konfiguracja się kończy.

Dyskusja Mosty ethernetowe łączą podsieci w jedną domenę rozgłoszeniową, gdzie komunikaty rozgłoszeniowe trafiają jednocześnie do wielu miejsc. Most jest łatwy do skonfigurowania i jest przezroczysty dla użytkowników. Podsieci funkcjonują jako pojedynczy segment sieci, dzięki czemu działają usługi sieci LAN, takie jak drukowanie, serwery Samby oraz Otoczenie sieciowe, bez konieczności wykonywania dodatkowych czynności. W sieci połączonej mostem można przemieszczać komputery, bez konieczności nadawania im nowych adresów. Technika polegająca na wykorzystaniu mostów — tzw. mostkowanie (ang. bridging) jest mało wydajna, ponieważ powoduje zwiększenie intensywności ruchu rozgłoszeniowego. W związku z tym nie jest to rozwiązanie dostatecznie skalowalne. Most ethernetowy działa w warstwie łącza danych modelu OSI (warstwa nr 2). Most rozpoznaje adresy MAC, ale nie rozpoznaje adresów IP. Ruchu przez most nie da się filtrować za pomocą programu iptables. Aby to zrobić, trzeba skorzystać z programu ebtables, który odgrywa rolę zapory firewall w sieciach z mostami. Routing daje większą kontrolę nad segmentami sieci. Ruch można filtrować w dowolny sposób. Routing jest bardziej wydajny od mostkowania, ponieważ komunikaty rozgłoszeniowe nie są rozsyłane do wszystkich podsieci. Przy zastosowaniu routingu sieci można dowolnie skalować. Odzwierciedleniem tych możliwości jest istnienie sieci internet. Główną wadą routingu w sieci LAN jest nieco większa pracochłonność podczas jego implementacji. Sposób wykorzystania routingu zamiast mostkowania dla bezprzewodowego punktu dostępowego opisano w recepturze 4.12.

Patrz także • rozdział 6.

4.11. Nawiązywanie połączenia z internetem i wykorzystanie zapory firewall

|

131

4.12. Zastosowanie routingu zamiast mostkowania Problem Zamiast mostkowania chcemy wykorzystać routing pomiędzy dwoma segmentami sieci LAN, ponieważ gwarantuje on lepszą wydajność i daje większe możliwości kontroli. Na przykład można skonfigurować osobne łącze tylko po to, aby dać gościom dostęp do internetu i jednocześnie w łatwy sposób zablokować im dostęp do sieci LAN. Można również zapewnić rodzaj separacji i udostępnić różne usługi LAN w każdym z segmentów sieci. Wiemy, że będzie to wymagało nieco więcej pracy przy konfiguracji, ale nas to nie przeraża. Po prostu chcemy wiedzieć, jak to zrobić.

Rozwiązanie W przykładowym punkcie dostępowym w niniejszym rozdziale są trzy interfejsy ethernetowe: ath0, eth0 i eth1. Zamiast mostkowania interfejsów ath0 i eth0 w celu stworzenia interfejsu LAN br0 można zastosować inną strategię: interfejsy ath0 i eth0 będą osobnymi interfejsami LAN, natomiast eth1 w dalszym ciągu będzie interfejsem WAN. Zapora iptables będzie przekazywała ruch pomiędzy interfejsami eth0 i eth0, a w pliku dnsmasq.conf będzie trzeba wprowadzić kilka wierszy w celu obsługi dodatkowej podsieci. W tej recepturze założono, że będziemy wykorzystywali standard WPA-PSK lub WPA-Enterprise z osobnym serwerem RADIUS (sposób konfigurowania szyfrowania i uwierzytelniania opisano w poprzednich recepturach niniejszego rozdziału). Ujęcie w komentarz dwóch wierszy zarządzających programem hostapd spowoduje utworzenie otwartego punktu dostępowego. Taką konfigurację można wykorzystać do testowania. ##/etc/network/interfaces auto lo iface lo inet loopback auto ath0 iface ath0 inet static address 192.168.2.50 network 192.168.2.0 netmask 255.255.255.0 broadcast 192.168.2.255 post-down wlanconfig ath0 destroy pre-up wlanconfig ath0 create wlandev wifi0 wlanmode ap pre-up iwconfig ath0 essid "alrac-net" channel 01 rate auto pre-up ifconfig ath0 up pre-up sleep 3 up hostapd -B /etc/hostapd.conf post-down killall hostapd auto eth0 iface eth0 inet static address 192.168.1.50 network 192.168.1.0 netmask 255.255.255.0 broadcast 192.168.1.255 auto eth1 iface eth1 inet static address 12.169.163.241

132

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

gateway 12.169.163.1 netmask 255.255.255.0 ##/etc/dnsmasq.conf domain-needed bogus-priv local=/alrac.net/ expand-hosts domain=alrac.net listen-address=127.0.0.1 listen-address=192.168.1.50 listen-address=192.168.2.50 server=12.169.174.2 server=12.169.174.3 dhcp-range=lan,192.168.1.100,192.168.1.200,255.255.255.0,12h dhcp-range=wifi,192.168.2.100,192.168.2.200,255.255.255.0,12h dhcp-lease-max=100 #domyślna brama dhcp-option=lan,3,192.168.1.50 dhcp-option=wifi,3,192.168.2.50 #Serwer DNS dhcp-option=lan,6,192.168.1.50 dhcp-option=wifi,6,192.168.2.50 #przypisanie statycznych adresów IP dhcp-host=stinkpad,192.168.2.74,net:wifi dhcp-host=pingwin,192.168.2.75,net:wifi dhcp-host=uberpc,192.168.1.76,net:lan dhcp-host=xena,192.168.1.10,net:lan

Trzeba jeszcze dodać zbiór reguł do skryptu zarządzającego zaporą firewall iptables. Kompletny przykład skryptu zarządzającego zaporą firewall iptables omówiono w punkcie „Dyskusja”.

Dyskusja Zaprezentowany w tym punkcie przykład skryptu konfigurującego zaporę iptables przekazuje cały ruch pomiędzy dwoma segmentami LAN i udostępnia usługi nazw dla wszystkich klientów sieci. Jest to liberalna konfiguracja, bez ograniczeń. Należy pamiętać, że ruch rozgłoszeniowy nie przechodzi przez router, a niektóre protokoły sieciowe, takie jak Samba oraz inne protokoły przekazywane przez NetBIOS, są nierutowalne. Cały rutowalny ruch, na przykład SSH, polecenia ping, serwery pocztowy i WWW, będą przesyłane pomiędzy podsieciami bez większych problemów. Dzięki zastosowaniu routingu pomiędzy przewodowym i bezprzewodowym segmentem sieci możliwości są olbrzymie: ograniczenie usług dostępnych dla dowolnego segmentu sieci, filtrowanie na poziomie indywidualnych hostów, dokładne kształtowanie ruchu — można osiągnąć wszystko, co się chce. W pliku dnsmasq.conf serwery są reprezentowane przez numery opcji z dokumentu RFC 2132. W tym dokumencie można znaleźć ich kompletną listę. Niektóre, często wykorzystywane serwery to: dhcp-option=2 ,[przesunięcie]

Przesunięcie względem czasu UTC (Universal Time Coordinated). Wartość tę należy ręcznie zmodyfikować dwa razy w roku w okresach zmian czasu z zimowego na letni i odwrotnie. Dzięki temu jednak możemy kontrolować wszystko z poziomu serwera. Na przykład 4.12. Zastosowanie routingu zamiast mostkowania

|

133

strefę PST (Pacific Standard Time) należy ustawić za pomocą opcji dhcp-option=2,-28800. Strefa PST odpowiada czasowi UTC – 8 godzin (UTC minus 8 godzin). dhcp-option=3 ,[adres IP]

Domyślna trasa dla klientów. Z opcji tej należy skorzystać, jeśli program dnsmasq nie jest na tym samym komputerze co router.

dhcp-option=7 ,[adres IP]

Serwer syslog.

dhcp-option=33, wifi ,[docelowy adres IP, adres routera] Przypisanie statycznej trasy do grupy wifi. Można wymienić dowolną liczbę tras. Każda

trasa jest definiowana przez parę adresów IP rozdzielonych przecinkiem. dhcp-option=40 ,[domena]

Nazwa domeny NIS.

dhcp-option=41 ,[adres IP]

Serwer domeny NIS.

dhcp-option=42 ,[adres IP]

Serwer NTP.

dhcp-option=69 ,[Adres IP]

Serwer SMTP.

dhcp-option=70 ,[Adres IP]

Serwer POP.

dhcp-option=72 ,[Adres IP]

Serwer HTTP

Ponieważ trasy w sieci LAN przechodzą przez zaporę firewall iptables z domyślną strategią DROP, dozwolony ruch musi być jawnie zaakceptowany i przekazany. Czytelnikom, którzy postępowali zgodnie ze wskazówkami z rozdziału 3. dotyczącymi zbudowania zapory firewall iptables, przypominam o możliwości użycia polecenia /etc/init.d/ firewall/stop|start|restart podczas testowania nowych reguł. Oto kompletny przykład skryptu /usr/local/bin/fw-nat, który gwarantuje podsieciom przewodowej i bezprzewodowej niemal nieograniczony wzajemny dostęp do siebie: #!/bin/sh # Skrypt firewall iptables do współdzielenia połączenia z internetem kablowego lub DSL; # bez usług publicznych; # Definicja zmiennych. ipt="/sbin/iptables" mod="/sbin/modprobe" LAN_IFACE="eth0" WAN_IFACE="eth1" WIFI_IFACE="ath0" #Załadowanie modułów jądra. $mod ip_tables $mod iptable_filter $mod iptable_nat $mod ip_conntrack $mod ipt_LOG $mod ipt_limit $mod ipt_state $mod iptable_mangle

134

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

$mod $mod $mod $mod $mod

ipt_MASQUERADE ip_nat_ftp ip_nat_irc ip_conntrack_ftp ip_conntrack_irc

# Usunięcie wszystkich aktywnych reguł i niestandardowych łańcuchów. $ipt -F $ipt -t nat -F $ipt -t mangle -F $ipt -X $ipt -t nat -X $ipt -t mangle -X #Ustawienie domyślnych strategii. $ipt -P INPUT DROP $ipt -P FORWARD DROP $ipt -P OUTPUT ACCEPT $ipt -t nat -P OUTPUT ACCEPT $ipt -t nat -P PREROUTING ACCEPT $ipt -t nat -P POSTROUTING ACCEPT $ipt -t mangle -P PREROUTING ACCEPT $ipt -t mangle -P POSTROUTING ACCEPT # Poniższy wiersz jest niezbędny do prawidłowego działania interfejsu pętli zwrotnej # oraz wewnętrznych usług bazujących na gniazdach. $ipt -A INPUT -i lo -j ACCEPT #Zezwolenie na wchodzący ruch SSH z przewodowej sieci LAN tylko do komputera-bramy. $ipt -A INPUT -p tcp -i $LAN_IFACE -s 192.168.1.0/24 --dport 22 \ -m state --state NEW -j ACCEPT # Włączenie maskarady IP. $ipt -t nat -A POSTROUTING -o $WAN_IFACE -j SNAT --to-source 12.34.56.789 # Zezwolenie na nieograniczony ruch wychodzący, # wchodzący jest ograniczony wyłącznie do sesji inicjowanych lokalnie. #Nieograniczony ruch pomiędzy WIFI i LAN. $ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT $ipt -A FORWARD -i $WAN_IFACE -o $LAN_IFACE -m state --state \ ESTABLISHED,RELATED -j ACCEPT $ipt -A FORWARD -i $LAN_IFACE -o $WAN_IFACE -m state --state \ NEW,ESTABLISHED,RELATED -j ACCEPT #$ipt -A FORWARD -i $LAN_IFACE -o $WIFI_IFACE -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT #$ipt -A FORWARD -i $WIFI_IFACE -o $LAN_IFACE -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT #$ipt -A FORWARD -i $WIFI_IFACE -o $WAN_IFACE -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT #$ipt -A FORWARD -i $WAN_IFACE -o $WIFI_IFACE -m state --state ESTABLISHED,RELATED -j ACCEPT

\ \ \ \

#Włączenie wewnętrznych usług DHCP i DNS. $ipt -A INPUT -p udp -i $LAN_IFACE -s 192.168.1.0/24 --dport 53 -j ACCEPT $ipt -A INPUT -p tcp -i $LAN_IFACE -s 192.168.1.0/24 --dport 53 -j ACCEPT $ipt -A INPUT -p udp -i $LAN_IFACE --dport 67 -j ACCEPT $ipt -A INPUT -p udp -i $WIFI_IFACE -s 192.168.2.0/24 --dport 53 -j ACCEPT $ipt -A INPUT -p tcp -i $WIFI_IFACE -s 192.168.2.0/24 --dport 53 -j ACCEPT $ipt -A INPUT -p udp -i $WIFI_IFACE --dport 67 -j ACCEPT #Zezwolenie dla sieci LAN na dostęp do serwera HTTP routera. $ipt -A INPUT -p tcp -i $LAN_IFACE --dport 443 -j ACCEPT $ipt -A INPUT -p tcp -i $WIFI_IFACE --dport 443 -j ACCEPT # Zezwolenie na żądania ICMP echo-request oraz time-exceeded. $ipt -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

4.12. Zastosowanie routingu zamiast mostkowania

|

135

$ipt -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT $ipt -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT # Odrzucenie tych prób nawiązania połączenia, które nie zostały zainicjowane z sieci LAN. $ipt -A INPUT -p tcp --syn -j DROP echo "Zapora firewall została uruchomiona i chroni Twój system"

Patrz także • rozdział 3. • man 5 dhclient • plik dnsmasq.conf jest cennym źródłem pomocy • na stronie macierzystej programu dnsmasq (http://www.thekelleys.org.uk/dnsmasq/doc.html)

można znaleźć archiwa list mailingowych oraz doskonałe dokumenty zawierające wiele pomocnych wskazówek • rozdział 24. „Rozwiązywanie nazw” z książki Carli Schroder Linux. Receptury (Helion,

2005)

4.13. Sondowanie bezprzewodowej karty sieciowej Problem Bezprzewodowa karta sieciowa była zapakowana w kolorowe pudełko wraz z bardzo obszerną dokumentacją w wielu językach. W żadnym z dołączonych dokumentów nie było jednak technicznych parametrów, które nas naprawdę interesują, takich jak obsługiwane kanały, protokoły szyfrowania, tryby, częstotliwości — krótko mówiąc, tego, co jest naprawdę potrzebne.

Rozwiązanie Za pomocą programu wlanconfig, będącego częścią pakietu sterowników MadWiFi, oraz iwlist, należącego do pakietu narzędzi wireless-tools, można sondować kartę bezprzewodową. W ten sposób użytkownik może uzyskać informację o tym, jakie są jej możliwości. Na przykład poniższe polecenie wyświetla protokoły, które obsługuje karta: pyramid:~# wlanconfig ath0 list caps ath0=7782e40f

Oznacza to, że jest to nowoczesna karta obsługująca wszystkie istotne protokoły szyfrowania oraz uwierzytelniania i może odgrywać rolę punktu dostępowego. Poniższe polecenie pokazuje wszystkie kanały i częstotliwości obsługiwane przez kartę: pyramid:~# wlanconfig ath0 list chan

Aby dowiedzieć się, jakie klucze obsługuje karta, można skorzystać z takiego oto polecenia: pyramid:~# iwlist ath0 key

Poniższe polecenie wyświetla listę konfigurowalnych funkcji karty: pyramid:~# iwlist ath0 event

136

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

Ta karta obsługuje różne moce sygnału transmisji: pyramid:~# iwlist ath0 txpower

Jakie szybkości obsługuje? pyramidwrap:~# iwlist ath0 rate

Polecenie iwconfig pokazuje bieżącą konfigurację karty: pyramidwrap:~# iwconfig ath0

Dyskusja Co oznacza poniższy wynik działania polecenia? ath0=7782e40f

Oznacza, że nasza karta obsługuje szyfrowanie WEP, protokół TKIP (Temporal Key Integrity Protocol), standard AES (Advanced Encryption Standard) z trybem licznikowym oraz protokołem CBC-MAC (AES i AES_CCM). Wynik informuje nas również o tym, że punkt dostępowy może generować sygnały transmisji różnej mocy, obsługuje sprawdzanie tożsamości komunikatów TKIP (Message Identity Check), rozszerzanie i potokową transmisję ramek WPA/WPA2 (ang. frame bursting), a także standard WME (Wireless Media Extensions). Skróty SHSLOT i SHPREAMBLE oznaczają short slot — krótkie gniazdo oraz short preamble — krótka preambuła. Parametry te określają większe szybkości transmisji. Więcej informacji na ten temat można znaleźć w książce Matthew Gasta 802.11. Sieci bezprzewodowe. Przewodnik encyklopedyczny (Helion, 2003).

Patrz także • dystrybucja Pyramid Linux nie zawiera stron podręcznika man, dlatego albo należy zain-

stalować aplikacje zaprezentowane w tym rozdziale w komputerze PC, albo poszukać informacji w wyszukiwarce Google • wlanconfig jest częścią pakietu MadWiFi-ng • man 8 ifrename • man 8 wlanconfig • Matthew Gast, 802.11. Sieci bezprzewodowe. Przewodnik encyklopedyczny (Helion, 2003)

4.14. Zmiana nazwy hosta routera Pyramid Problem Pyramid to interesująca nazwa, ale chcielibyśmy ją zmienić na jakąś inną. Próbowaliśmy modyfikować plik /etc/hostname, ale nazwa powraca po ponownym uruchomieniu systemu. Do licha! Co zrobić, aby ustawić nazwę na taką, jaką chcemy?

4.14. Zmiana nazwy hosta routera Pyramid

|

137

Rozwiązanie Pliki z katalogu /etc/rw/ są zamontowane w tymczasowym, zapisywalnym systemie plików i w momencie ładowania systemu są kopiowane z katalogu /etc/ro. Plik /etc/hostname to dowiązanie symboliczne do pliku /rw/etc/hostname: pyramid:~# ls -l /etc/hostname lrwxrwxrwx 1 root root 18 Oct 30 2006 /etc/hostname -> ../rw/etc/hostname

Możemy zatem spowodować, aby plik /etc/hostname nie zmieniał się (wystarczy usunąć dowiązanie symboliczne do pliku /rw/etc/ hostname). Można też zmodyfikować plik /ro/etc/hostname.

Dyskusja System plików skonfigurowano w ten sposób dlatego, aby zmniejszyć liczbę zapisów, ponieważ liczba operacji zapisu na karcie Compact Flash jest ograniczona. Aby dowiedzieć się, które pliki z katalogu /etc są dowiązaniami symbolicznymi, można skorzystać z polecenia find: pyramid:~# find /etc -maxdepth 1 -type l -ls 6051 0 lrwxrwxrwx 1 root root 14 Oct 4 2006 /etc/mtab -> ../proc/ mounts 6052 0 lrwxrwxrwx 1 root root 21 Oct 4 2006 /etc/resolv.conf -> ../ rw/etc/resolv.conf 6079 0 lrwxrwxrwx 1 root root 30 Dec 31 2006 /etc/localtime -> /usr/ share/zoneinfo/US/Pacific 6081 0 lrwxrwxrwx 1 root root 18 Oct 4 2006 /etc/hostname -> ../rw/ etc/hostname 6156 0 lrwxrwxrwx 1 root root 15 Oct 4 2006 /etc/issue -> ../rw/ etc/issue 6195 0 lrwxrwxrwx 1 root root 17 Oct 4 2006 /etc/zebra -> ../usr/ local/etc/ 6227 0 lrwxrwxrwx 1 root root 16 Oct 4 2006 /etc/resolv -> ../rw/ etc/resolv 6426 0 lrwxrwxrwx 1 root root 19 Oct 4 2006 /etc/issue.net -> ../ rw/etc/issue.net 6427 0 lrwxrwxrwx 1 root root 17 Oct 4 2006 /etc/adjtime -> ../rw/ etc/adjtime

Patrz także • man 1 find • man 1 ls

4.15. Wyłączanie zróżnicowania anten Problem Interfejs bezprzewodowy obsługuje wykorzystanie dwóch anten, ale używamy tylko jednej. Wiemy, że to oznacza, iż połowa pakietów rozgłoszeniowych oraz pakietów unicast trafia donikąd, a to może wpłynąć na obniżenie wydajności. W jaki sposób przesyłać sygnały tylko do jednej anteny?

138

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

Rozwiązanie Należy ustawić tryb zapisu i odczytu systemu Pyramid, a następnie wprowadzić poniższe wiersze do pliku /etc/sysctl.conf: dev.wifi0.diversity = 0 dev.wifi0.rxantenna = 1 dev.wifi0.txantenna = 1

Następnie wystarczy załadować nową konfigurację: pyramid:~# /sbin/sysctl -p

Jeśli antena jest podłączona do drugiego portu, wystarczy zmienić 1 na 2 i ponownie załadować sysctl.

Dyskusja Jądro Linuksa widzi interfejs bezprzewodowy jako wifi0, co można zobaczyć, uruchamiając polecenie dmesg | grep wifi. Sterownik MadWiFi tworzy wirtualny interfejs o nazwie ath0. Wykorzystanie dwóch anten może poprawić jakość usług bezprzewodowych, ale nie musi. W danym momencie jest używana tylko jedna — ta, która odbiera silniejszy sygnał. Zróżnicowanie polaryzacji (ang. polarization diversity) zachodzi w sytuacji, gdy jedna z anten odbiera silniejszy sygnał dlatego, bo jest inaczej skierowana. Zróżnicowanie przestrzenne (ang. spatial diversity) odnosi się do odległości pomiędzy dwiema antenami. Różnicę stwarza nawet kilka centymetrów ze względu na odbicia, zanikanie sygnału (ang. fading), przeszkody fizyczne oraz zakłócenia. Odbiornik radiowy ocenia siłę sygnału na początku transmisji i porównuje sygnał z obu anten. Następnie na pozostałą część transmisji wybiera antenę z silniejszym sygnałem. Jedyną opcją możliwą do skonfigurowania przez użytkownika jest włączenie zróżnicowania anten bądź jego wyłączenie. Zastosowanie technologii MIMO (ang. multiple-input/multiple-output — wiele wejść, wiele wyjść) pozwala na uzyskanie większych szybkości danych i lepszej wydajności dzięki wykorzystaniu obu anten jednocześnie. Różni producenci sprzętu, używając terminu MIMO, mają na myśli coś innego. Niektórzy określają tym terminem wiele strumieni danych, podczas gdy inni używają tego terminu w znaczeniu zwykłego łączenia kanałów. Cel jest ten sam: szersze pasmo i większa niezawodność przesyłania strumieni wideo, głosu (VoIP) oraz innych wymagających aplikacji. Istnieje wiele kontrowersji i niekończących się dyskusji na temat umiejscowienia anteny, typu używanych anten oraz ich liczby. Bezcelowe dyskusje bywają zabawne. Kiedy nam się znudzą, weźmy analizator sieci 802.11 i zbierzmy trochę przydatnych danych, które pomogą nam w wyciągnięciu właściwych wniosków.

Patrz także • rozdział 16. „802.11 Hardware” w książce Matthew Gasta 802.11 Wireless Networks: The

Definitive Guide, wydanie II (O’Reilly). • rozdział 16. „802.11: Analiza sieci” w książce Matthew Gasta 802.11. Sieci bezprzewodowe.

Przewodnik encyklopedyczny (Helion, 2003). 4.15. Wyłączanie zróżnicowania anten

|

139

4.16. Zarządzanie pamięcią podręczną DNS programu dnsmasq Problem Wiemy, że program dnsmasq automatycznie tworzy lokalną pamięć podręczną DNS. W jaki sposób sprawdzić, czy ona działa? Jak sprawdzić jej zawartość i jak ją opróżnić w przypadku, gdy wprowadzamy zmiany w systemie DNS i chcemy mieć pewność, że są buforowane aktualne dane?

Rozwiązanie Sprawdzenie, czy pamięć podręczna działa, nie jest trudne. Z dowolnego linuksowego klienta lub z serwera Pyramid wystarczy dwukrotnie wysłać zapytanie do dowolnej witryny internetowej za pomocą polecenia dig: $ dig oreilly.com

;; Query time: 75 msec ;; SERVER: 192.168.1.50#53(192.168.1.50) $ dig oreilly.com

;; Query time: 3 msec ;; SERVER: 192.168.1.50#53(192.168.1.50)

Odpowiedź na drugie żądanie jest udzielana z wykorzystaniem lokalnej pamięci podręcznej programu dnsmasq, dlatego jest szybsza. Wykonanie powyższego polecenia to przy okazji weryfikacja tego, czy klienty kierują zapytanie do właściwego serwera DNS. Co zrobić, aby opróżnić pamięć podręczną programu dnsmasq? Wystarczy ją zrestartować: pyramid:~# killall dnsmasq

Program dnsmasq jest zarządzany za pomocą pliku /etc/inittab, zatem zrestartuje się automatycznie. Aby przeglądać zawartość pamięci podręcznej, należy najpierw otworzyć plik /etc/inittab i ująć w komentarz wiersz uruchamiający program dnsmasq: pyramid:~# /sbin/rw pyramid:~# nano /etc/inittab # dnsmasq. Poniższy wiersz zawsze powinien być włączony. # DN:23:respawn:/sbin/dnsmasq -k > /dev/null 2>&1

Wydajemy polecenie ponownego odczytania pliku inittab procesowi init, zatrzymujemy aktywny proces dnsmasq, a następnie uruchamiamy dnsmasq w trybie debugowania: pyramid:~# telinit q pyramid:~# killall dnsmasq pyramid:~# dnsmasq -d

Zadanie to uruchamia się na pierwszym planie, zatem następną czynnością, którą należy wykonać, jest otwarcie drugiej sesji SSH lub zalogowanie się z wykorzystaniem konsoli szeregowej i uruchomienie poniższego polecenia: pyramid:~# killall -USR1 dnsmasq

140

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

Jego wykonanie spowoduje wyświetlenie zawartości pamięci podręcznej na pierwszym ekranie. W wyniku powinny się pojawić wyłącznie lokalne hosty. Poniższy wiersz informuje nas, że bufor jest pusty: dnsmasq: cache size 150, 0/0 cache insertions re-used unexpired cache entries.

Jeszcze raz uruchamiamy program dnsmasq, odwiedzamy kilka serwisów internetowych z klienckich komputerów PC w celu wygenerowania pewnych zapisów w buforze, a następnie jeszcze raz wykonujemy zrzut pamięci podręcznej, aby zobaczyć, jaka jest jej zawartość. Teraz zapisów powinno być znacznie więcej. Po zakończeniu wprowadzania zmian umieszczamy plik /etc/inittab ponownie w tym samym miejscu i jeszcze raz uruchamiamy polecenia telinit q oraz /sbin/ro.

Dyskusja Jest mało prawdopodobne, żeby kiedykolwiek zaszła konieczność wykonywania jakichkolwiek operacji z pamięcią podręczną programu dnsmasq. W większości przypadków pamięć ta nie wymaga żadnych zabiegów. W pliku /etc/dnsmasq.conf są trzy opcje konfiguracji sposobu działania pamięci podręcznej: local-ttl

Wartość domyślna wynosi zero, co oznacza wyłączenie buforowania odpowiedzi z pliku /etc/hosts oraz dzierżaw DHCP. Oznacza to, że w buforze są zawsze świeże lokalne dane. Jeśli sieć jest stabilna i nie ma zbyt wielu klientów DHCP, które włączają się i wyłączają, można ustawić wartość czasu życia (Time To Live — TTL), która przyspieszy lokalne operacje wyszukiwania.

no-negcache

Zablokowanie buforowania negatywnych odpowiedzi. Buforowanie negatywnych odpowiedzi poprawia wydajność, ponieważ w buforze są umieszczane odpowiedzi „nie ma takiej domeny”. Dzięki temu klienty nie muszą oczekiwać na niepowodzenie operacji wyszukiwania. Program dnsmasq dobrze obsługuje negatywne buforowanie, zatem nie należy go blokować, o ile nie sprawia problemów.

cache-size

Domyślną wartością jest 150 nazw. Maksymalna wartość wynosi w przybliżeniu 2000. Ponieważ bufor podręczny jest zapisywany w pamięci RAM, zbyt duża objętość bufora ujemnie wpływa na wydajność routera bez wymiernych korzyści. Wartość 150 jest wystarczająca dla większości systemów. Nie należy przekraczać wartości 300.

Jeśli chodzi o odwiedzane domeny, jesteśmy na łasce administratorów serwerów autorytatywnych. Jeśli zmienią coś w swoich serwerach DNS bez ustawiania niskich wartości TTL, w całym internecie będą buforowane nieaktualne dane tak długo, aż upłynie ważność ich parametru TTL. Podczas debugowania systemu DNS warto opróżnić bufor dnsmasq i sprawdzić, czy problem dotyczący DNS jest lokalny, czy zdalny. Poniżej zaprezentowano przykłady wyświetlanych wyników. Oto pusty bufor — widoczne są tylko lokalne zapytania DNS: pyramidwrap:~# dnsmasq -d dnsmasq: started, version 2.23 cachesize 150 dnsmasq: compile time options: IPv6 GNU-getopt ISC-leasefile no-DBus dnsmasq: DHCP, IP range 192.168.1.100 -- 192.168.1.200, lease time 10h dnsmasq: using local addresses only for domain alrac.net dnsmasq: read /etc/hosts - 4 addresses dnsmasq: reading /etc/resolv.conf

4.16. Zarządzanie pamięcią podręczną DNS programu dnsmasq

|

141

dnsmasq: dnsmasq: dnsmasq: dnsmasq: dnsmasq: dnsmasq: dnsmasq: dnsmasq: dnsmasq: dnsmasq: dnsmasq: dnsmasq: dnsmasq:

using nameserver 12.169.174.3#53 using nameserver 12.169.174.2#53 using local addresses only for domain alrac.net cache size 150, 0/0 cache insertions re-used unexpired cache Host Address Flags stinkpad.alrac.net 192.168.1.102 4FRI localhost 127.0.0.1 4F I xena.alrac.net 192.168.1.10 4FRI pyramid.alrac.net 192.168.1.50 4FRI stinkpad 192.168.1.102 4F I xena 192.168.1.10 4F I localhost.alrac.net 127.0.0.1 4FRI pyramid 192.168.1.50 4F I

entries. Expires H H H H H H H H

A oto fragment zapełnionej pamięci podręcznej: dnsmasq: dnsmasq: dnsmasq: dnsmasq: dnsmasq: 2007 dnsmasq: 2007 dnsmasq: 2007 dnsmasq: 2007 dnsmasq: 2007 dnsmasq: 2007 dnsmasq: 2007

cache size 150, 0/178 cache insertions re-used unexpired cache entries. Host Address Flags Expires stinkpad.alrac.net 192.168.1.102 4FRI H localhost 127.0.0.1 4F I H i.cnn.net 64.236.16.137 4F Wed Jan 24 15:36:42 i.cnn.net

64.236.16.138

4F

Wed Jan 24 15:36:42

bratgrrl.com

67.43.0.135

4F

Wed Jan 24 17:45:49

a.tribalfusion.com

204.11.109.63

4F

Wed Jan 24 15:29:08

a.tribalfusion.com

204.11.109.64

4F

Wed Jan 24 15:29:08

ad.3ad.doubleclick.net

216.73.87.52

4F

Wed Jan 24 15:27:29

ads.cnn.com

64.236.22.103

4F

Wed Jan 24 16:21:41

Znaczenie poszczególnych flag opisano w tabeli 4.1. • Dla nazw z serwera DHCP lub pliku /etc/hosts można ustawić zarówno flagę F, jak i R.

Tabela 4.1. Flagi bufora podręcznego dnsmasq wraz z opisem ich znaczenia Flaga

Znaczenie

4

Adres IPv4

6

Adres IPv6

C

Rekord CNAME

F

Mapowanie przekazywania (nazwa adres)

R

Mapowanie odwrócone (nazwa adres)

I

Nieśmiertelność (bez czasu utraty ważności)

D

Pochodzi z DHCP

N

Odpowiedź negatywna (wiadomo, że nazwie nie odpowiada żaden adres)

X

Nie ma takiej domeny (wiadomo, że nazwa nie istnieje)

H

Nazwa pochodzi z pliku /etc/hosts

Patrz także • strona podręcznika man 8 dnsmasq zawiera mnóstwo przydatnych informacji dotyczących

wszystkich dostępnych opcji wiersza poleceń; wiele z nich można również wykorzystywać w pliku konfiguracyjnym dnsmasq.conf 142

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

• plik dnsmasq.conf również może być cennym źródłem pomocy • na stronie macierzystej programu dnsmasq (http://www.thekelleys.org.uk/dnsmasq/doc.html)

można znaleźć archiwa list mailingowych oraz doskonałe dokumenty zawierające wiele pomocnych wskazówek • rozdział 24. „Rozwiązywanie nazw” z książki Carli Schroder Linux. Receptury (Helion,

2005)

4.17. Zarządzanie buforem podręcznym windowsowego systemu DNS Problem Wiemy, że w systemach Windows 2000, XP i 2003 Server mechanizm rozwiązywania nazw DNS jest domyślnie wyposażony w bufory podręczne. Jest to olbrzymim zaskoczeniem dla większości użytkowników systemu Windows, którzy czasami napotykają na nieaktualne dane i nie mogą zrozumieć, dlaczego niektóre adresy nie są rozwiązywane prawidłowo. W większości przypadków nie trzeba nawet o tym myśleć, ale jeśli wprowadzamy zmiany, to chcemy mieć pewność, że klienty uzyskują aktualne informacje z systemu DNS. W jaki sposób można poradzić sobie z tą sytuacją?

Rozwiązanie Aby obejrzeć zawartość pamięci podręcznej systemu DNS, należy w systemie Windows otworzyć okno DOS i uruchomić następujące polecenie: C:\> ipconfig /displaydns | more

Poniższe polecenie zeruje bufor pamięci podręcznej: C:\> ipconfig /flushdns

Domyślna wartość czasu życia pozytywnych odpowiedzi wynosi 86 400 sekund (co odpowiada jednej dobie). Negatywne odpowiedzi na zapytania są przechowywane przez 300 sekund (5 minut). Wartości te można zmodyfikować lub całkowicie wyłączyć buforowanie. W tym celu wystarczy zmodyfikować rejestr systemu Windows. W systemie Windows 2000 należy otworzyć edytor rejestru i zmienić czas życia (TTL) pozytywnych odpowiedzi. W tym celu należy utworzyć bądź zmodyfikować wartość DWORD w poniższej lokalizacji: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters DWORD: MaxCacheEntryTtlLimit Value: 14400

14 400 odpowiada 4 godzinom, co jest dziś typową wartością dla większości dostawców usług internetowych. Wprowadzenie wartości 0 powoduje wyłączenie buforowania. Należy pamiętać, aby wprowadzać wartości dziesiętnie, a nie szesnastkowo. Wprowadzenie poniższego klucza blokuje negatywne odpowiedzi: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters DWORD: NegativeCacheTime Value: 0

4.17. Zarządzanie buforem podręcznym windowsowego systemu DNS

|

143

W systemach Windows XP i 2003 argument TTL dla pozytywnych odpowiedzi modyfikuje się za pomocą innej wartości DWORD: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ Services\Dnscache\Parameters DWORD: MaxCacheTtl Value: 14400

Buforowanie negatywnych odpowiedzi blokuje się za pomocą następującego klucza: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Dnscache\Parameters DWORD: MaxNegativeCacheTtl Value: 0

Aby całkowicie wyłączyć buforowanie, należy ustawić obie wartości na zero. Uaktywnienie zmian, jak zwykle, wymaga ponownego załadowania systemu.

Dyskusja W klientach linuksowych bufory podręczne systemu DNS nie są domyślnie aktywne. Uaktywnienie ich wymaga celowego działania. Buforowanie zapytań po stronie klienta to interesująca własność, która przyspiesza operacje wyszukiwania. Bufory podręczne stwarzają problemy tylko wtedy, gdy system DNS zmieni się i zawartość buforów zdezaktualizuje się.

Patrz także • wszystkie potrzebne informacje można znaleźć w dokumentacji wybranej odmiany sys-

temu Windows; aby uzyskać więcej danych, można również wpisać w wyszukiwarce Google frazę „pamięć podręczna dns Windows”

4.18. Aktualizacja czasu w momencie startu systemu Problem Dysponujemy jedną z płyt routerowych, które nie są wyposażone w podtrzymywanie bateryjne pamięci CMOS. Ustawienia BIOS-u są zapisywane do nieulotnej pamięci RAM, ale data i godzina znikają przy każdym wyłączeniu zasilania. W jaki sposób sprawić, aby były poprawnie ustawiane w momencie ładowania systemu?

Rozwiązanie Można to zrobić za pomocą starego, poczciwego programu ntpdate. Najpierw należy zmodyfikować plik /etc/default/ntp-servers w taki sposób, by wskazywał na serwer pool.ntp.org: # /sbin/rw # nano /etc/default/ntp-servers NTPSERVERS="pool.ntp.org"

Następnie należy stworzyć łącze startowe, aby polecenie uruchamiało się podczas rozruchu systemu: # ln /etc/init.d/ntpdate /etc/rc2.d/S90ntpdate

144

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

Teraz, za każdym razem, gdy będziemy uruchamiać płytę routerową, zostanie ustawiona prawidłowa data i godzina. Aby to sprawdzić, można posłużyć się poleceniem date: # date Mon Jan 29 20:52:50 UTC 2007

Dyskusja Czytelnicy, którzy znają dokumentację protokołu NTP, wiedzą, że wiele osób pracujących nad NTP próbuje pozbyć się programu ntpdate i zastąpić go poleceniem ntpd -g. Jednak polecenie ntpdate w dalszym ciągu najlepiej się sprawdza jako narzędzie do dużych korekt czasu.

Patrz także • man 1 ntpdate • rozdział 19. „Synchronizacja czasu przez NTP” z książki Carli Schroder Linux. Receptury

(Helion, 2005)

4.18. Aktualizacja czasu w momencie startu systemu

|

145

146

|

Rozdział 4. Tworzenie linuksowego punktu dostępowego sieci bezprzewodowej

ROZDZIAŁ 5.

Tworzenie serwera VoIP za pomocą systemu Asterisk

5.0. Wprowadzenie W niniejszym rozdziale omówiono system Asterisk, centralę typu PBX (Private Branch eXchange) zaimplementowaną w całości za pomocą oprogramowania. Asterisk to nowość w technologii telefonicznej. Urządzenie zarówno może zastąpić istniejące przestarzałe i zbyt drogie systemy PBX, jak i jest furtką do przyszłości. Nasz obecny system telefoniczny jest doskonały, ponieważ zastosowano w nim bardzo zbliżoną technologię do tej, którą wynalazł Bell. System ten był intensywnie usprawniany w ciągu lat, ale niewiele nowego wynaleziono. W staromodnej sieci telefonicznej PSTN nie ma wideofonów, konferencji wideo czy też integracji z oprogramowaniem i urządzeniami przenośnymi. Te nowości nadchodzą wraz z technologią Voice-over-IP (VoIP), sieciami z przełączaniem pakietów i szerokopasmowym internetem. Asterisk to centrala PBX oraz rozbudowany serwer telefonii IP. Asterisk obsługuje wiele protokołów telefonicznych (włącznie z SIP, IAX i H.323), pozwala na integrację technologii PSTN z VoIP oraz na łączenie i dopasowywanie usług i urządzeń (analogowych, cyfrowych, przewodowych, bezprzewodowych, IP). Asterisk można wykorzystywać w roli ulepszonej automatycznej sekretarki lub stosować jako lokalny system PBX zintegrowany z istniejącymi usługami telefonicznymi, albo też jako system wchodzący w skład rozległej sieci telefonii IP obejmującej wiele kontynentów. Wszędzie, gdzie dociera internet, może również dotrzeć Asterisk. W niniejszym rozdziale opisano sposób instalacji i konfigurowania systemu Asterisk w wersji 1.4. Skonfigurujemy podstawowe, biznesowe funkcje PBX: pocztę głosową, cyfrową recepcjonistkę, usługi wezwań przez internet, integrację z analogowymi usługami telefonicznymi, zarządzanie użytkownikami, konferencje oraz definiowane przez użytkownika nagrania odtwarzane w czasie oczekiwania, a także powitania głosowe. Przykładowe konfiguracje zaprezentowane w niniejszym rozdziale są okrojone i jak najprostsze. Wszystkie działają i są w pełni funkcjonalne, ale niepotrzebne niuanse zostały pominięte. Nie należy ulegać presji innych osób i nadmiernie komplikować konfiguracji systemu Asterisk, ponieważ może to spowodować problemy ze stabilnością i kłopoty. Opracowanie logiki systemu telefonicznego jest najtrudniejsze. Kiedy to się zrobi, można będzie rozwinąć przykłady zaprezentowane w recepturach z niniejszego rozdziału w celu stworzenia systemu dla większej liczby użytkowników oraz zaimplementowania dodatkowych funkcji.

147

Asterisk jest oprogramowaniem wolnym na dwa sposoby: jest darmowy i posiada licencję GPL. Nie należy wyciągać pochopnych wniosków ze słowa darmowy. Przetwarzanie rozmów VoIP wymaga znaczącej mocy procesora, zatem jeśli ktoś uważa, że do zainstalowania systemu Asterisk wykorzysta stare komputery 486, jest w błędzie. Potrzebny będzie dobrej jakości sprzęt oraz pasmo sieci wystarczające do obsłużenia obciążenia. Jaki sprzęt jest potrzebny? Jest tak wiele zmiennych, jakie trzeba uwzględnić podczas obliczeń, że całkowicie pominę to pytanie. Potrzebne informacje można znaleźć na stronie pomocy technicznej systemu Asterisk (http://www.asterisk.org/support) oraz na stronie Wiki Voip-info.org (http://voip-info.org/wiki/). Można je uznać za główne źródła danych na temat systemu Asterisk i związanej z nim pomocy technicznej.

Sprzęt i oprogramowanie do testowania Elastyczność systemu Asterisk jest zarówno jego mocną stroną, jak i największą wadą — jest tak wiele opcji, że z łatwością można się w nich pogubić. Jeśli dysponujemy starym sprzętem PC, możemy stworzyć laboratorium testowe praktycznie bez ponoszenia żadnych wydatków. W tym rozdziale utworzymy przykład takiego środowiska, które będzie składało się z serwera Asterisk pracującego pod Linuksem oraz dwóch klienckich komputerów PC z uruchomionymi programowymi telefonami IP (tzw. softtelefonami). Do podłączenia trzech komputerów PC potrzebny będzie przełącznik. Potrzebne będą również karty sieciowe oraz zestawy składające się z głośników i mikrofonów lub słuchawki zintegrowane z mikrofonami (ang. headset). W przypadku urządzeń headset podłączanych przez USB nie będą potrzebne karty dźwiękowe, głośniki czy też mikrofony. Potrzebne będzie szerokopasmowe połączenie z internetem w celu realizowania połączeń przez internet. Rozmowy VoIP zużywają 30–90 Kbps pasma w każdą stronę. Najlepszą jakość rozmów uzyskuje się w przypadku zastosowania łączy T1 (E1). Połączenie DSL również jest dobrym rozwiązaniem, zwłaszcza, jeśli dysponujemy dedykowaną linią DSL wyłącznie do połączeń VoIP. Od dostępnego zwykle łącza ADSL lepsze jest łącze symetryczne DSL. Połączenie kablowe z internetem, również się sprawdza. Warunkiem jest niezawodne łącze u dobrego dostawcy oraz odpowiednio szerokie pasmo w kierunku sieci.

Produkcyjny sprzęt i oprogramowanie System Asterisk opracowano z myślą o wykorzystaniu całej mocy obliczeniowej, jaką można uzyskać ze sprzętu o architekturze x86. System Asterisk zużywa dużo mocy procesora i pamięci, dlatego nie należy skąpić tych zasobów. Alternatywą jest znacznie droższy specjalizowany sprzęt do cyfrowego przetwarzania dźwięku, zatem jeśli ktoś życzyłby sobie kart interfejsu, które zabrałyby nieco obciążenia z systemowego procesora CPU, powinien pamiętać, że karty te kosztują więcej niż aktualizacja komputera PC. Od wyboru typu telefonu IP zależy to, czy nasze życie będzie łatwe, czy stanie się piekłem, bowiem typ telefonu znacząco wpływa na jakość rozmów. Sprzętowe telefony IP są wyposażone w porty Ethernet. Podłącza się je bezpośrednio do sieci. Dobrej jakości telefony zaczynają się od 300 zł i są wyposażone w różnego rodzaju opcje: wejścia słuchawkowe, porty do podłączania zestawów headset oraz obsługę wielu linii. Telefony te niwelują zniekształcenia dźwięku oraz pogłos i działają w sposób bardzo zbliżony do tradycyjnych telefonów biurowych. Zastosowanie zestawów headset wraz z telefonami programowymi pozwala zaoszczędzić nieco pieniędzy, ponieważ wiele tego rodzaju telefonów jest dostępnych za darmo lub są znacznie 148

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

tańsze od kosztownych telefonów sprzętowych. Dzięki zastosowaniu telefonów programowych można również zaoszczędzić na portach Ethernet i okablowaniu. Są zarówno przewodowe, jak i bezprzewodowe zestawy słuchawkowo-mikrofonowe oraz wiele programowych telefonów do wyboru. Warto je najpierw przetestować, ponieważ pomiędzy różnymi typami telefonów występują znaczne różnice w jakości połączeń i użyteczności. Znaną wadą wielu z nich jest zatłoczone i niepozwalające na zmianę rozmiaru okno interfejsu. Innym czynnikiem, na który należy zwrócić uwagę, jest zainstalowanie telefonów programowych na komputerze PC o odpowiedniej mocy. Przetwarzanie połączeń VoIP zajmuje sporo cykli procesora, dlatego komputer musi być zdolny zarówno do przetwarzania połączeń, jak i wykonywania innych zadań. Jeśli mamy telefony analogowe, nie powinniśmy poprzestawać na rozwiązaniu częściowym. Możemy zakupić adaptery telefonów analogowych lub adaptery PCI do zainstalowania na serwerze Asterisk. Karty PCI interfejsów analogowych produkują między innymi firmy Digium, Sangoma lub Rhino. Można nawet zakupić banki kanałów obsługujące wiele telefonów analogowych. Dostępnych jest mnóstwo samodzielnych wieloportowych adapterów analogowych wyposażonych w wiele różnych funkcji. Są to urządzenia oferujące ciekawe funkcje i łatwe w obsłudze. Należy jednak uważać na wysokie ceny i obsługę protokołów. Wiele spośród tych urządzeń nie obsługuje protokołu IAX (Inter-Asterisk Exchange), przydatnego i wydajnego wbudowanego protokołu Asterisk. Wszystkie typy urządzeń powinny obsługiwać protokół SIP (Session Initiation Protocol), który stał się najbardziej popularnym protokołem VoIP. Informacje na temat specyficznych marek i modeli można uzyskać w archiwach list mailingowych Asterisk i AstLinux.

Jakość połączeń Dabata na temat tego, jaki typ telefonu IP najlepiej wykorzystać, toczy się bez końca. W rzeczywistości jednak istnieje więcej różnic pomiędzy markami niż pomiędzy typami telefonów. Ogólnie rzecz biorąc, lepszą jakość i wydajność gwarantuje wykorzystanie telefonów sprzętowych. Dobre telefony programowe w połączeniu z wysokiej jakości sprzętem audio również spełniają oczekiwania użytkowników. Telefony analogowe wymagają adapterów i sprawiają problemy z pogłosem. Karty adapterów analogowych powinny być wyposażone w sprzętowe układy eliminowania pogłosu, a firma Digium dodatkowo oferuje programowy wysokowydajny moduł eliminacji pogłosu HPEC (High Performance Echo Canceller). Dla użytkowników sprzętu firmy Digium jest on darmowy, natomiast dla użytkowników innych analogowych adapterów PCI program kosztuje 10 USD za kanał. Opóźnienia są wrogiem telefonii IP, dlatego należy zapewnić, aby w sieci LAN nie było urządzeń, które je wprowadzają: nie powinno być koncentratorów — domeny kolizji są zabójcze dla jakości połączeń. Nie wolno stosować starego lub nieodpowiedniego okablowania, słabych kart sieciowych oraz nie może być hostów zainfekowanych wirusami, które skażają sieć masową ilością informacji. Kiedy bity składające się na komunikację VoIP opuszczą naszą sieć, przestajemy mieć nad nimi kontrolę. Aby się dowiedzieć, jak można poprawić jakość połączeń VoIP, należy się skontaktować z dostawcą usług. W niektórych przypadkach możliwe jest wynegocjowanie umowy dotyczącej jakości usług z gwarancjami.

5.0. Wprowadzenie

|

149

Digium — Asterisk i Zapata Telephony Project Mark Spencer, twórca systemu Asterisk, chciał stworzyć uniwersalną centralę PBX w swojej małej firmie dostępną za umiarkowaną cenę. W tamtych czasach nie było takiego rozwiązania, dlatego pan Spencer stworzył własne. Usiadł do kodowania i zaimplementował programową centralę PBX działającą pod kontrolą systemu Linux z wykorzystaniem standardowego sprzętu x86. W dalszym ciągu były jednak problemy, ponieważ system Asterisk nie miał możliwości współpracy ze standardowym sprzętem telefonicznym. Lukę tę wypełnił Jim Dixon, który w projekcie Zapata Telephony Project opracował kartę interfejsu przeznaczoną właśnie do tego celu. Ta pierwsza karta była znana pod nazwą Tormenta lub hurricane. Firmy Asterisk i Zapata pasowały do siebie jak czekolada i masło orzechowe. Wspólnie utworzyły one firmę Digium, Inc, a karta Tormenta wyewoluowała do linii kart T1 (E1) firmy Digium. Firma Digium dostarcza również adaptery analogowe przeznaczone dla analogowych linii telefonicznych i analogowych telefonów. Digium nie jest jedynym dostawcą kart interfejsu i adapterów. Wystarczy poszukać w Google, aby znaleźć innych dostawców sprzętu VoIP. W niniejszym rozdziale zamieszczono receptury dotyczące nagrywania własnych komunikatów głosowych. Firma Digium sprzedaje również profesjonalnie nagrane komunikaty głosowe w językach angielskim, francuskim i hiszpańskim. Komunikaty w językach angielskim i hiszpańskim są nagraniami z głosem Allison Smith. To jej głos można usłyszeć w plikach dźwiękowych dostarczanych wraz z systemem Asterisk. Nagrania po francusku i angielsku zostały nagrane przez June’a Wallacka.

Implementacje systemu Asterisk AsteriskNOW (http://www.asterisknow.org/) to pakiet oprogramowania, na który składają się: system Asterisk, bazujący na Linuksie system operacyjny rPath oraz doskonałe narzędzia administracyjne działające w środowisku przeglądarki internetowej zarówno dla systemu Asterisk, jak i systemu rPath Linux. Oprogramowanie jest udostępniane za darmo przez firmę Digium. Wersje Asterisk Business i Enterprise (http://www.digium.com/) to komercyjne wydania systemu dostarczane przez firmę Digium. Są to w większym stopniu rozwiązania pod klucz niż darmowe produkty, a firma Digium gwarantuje dobrą obsługę techniczną. Trixbox (http://www.trixbox.org) to kolejny popularny pakiet zawierający system Asterix. W jego skład wchodzą następujące składniki: system operacyjny CentOS, graficzna konsola zarządzania, warstwa backend bazy danych MySQL, pakiety SugarCRM, HUDLite oraz wiele innych zintegrowanych narzędzi. Pakiet jest niezwykle rozbudowany — do samej instalacji potrzeba kilku gigabajtów miejsca na dysku. Najnowsza wersja jest wyposażona w modularny pakiet instalacyjny, który pozwala na wybór składników do zainstalowania. AstLinux (http://www.astlinux.org/) to specjalizowana dystrybucja Linuksa zawierająca system operacyjny i program Asterisk. Całość zajmuje około 40 MB, dlatego dystrybucja ta jest doskonałym kandydatem do uruchomienia w komputerach jednopłytowych takich firm, jak Soekris, PC Engines WRAP oraz Gumstix Way Small Computers. Dystrybucja ta dobrze działa także na komputerach budowanych w standardzie SFF, takich jak Via, oraz na standardowym sprzęcie PC. 150

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

FreePBX (http://www.freepbx.org/) to działające w środowisku przeglądarki internetowej narzędzie do zarządzania systemem Asterisk. Program, który jest częścią pakietu Trixbox, był wcześniej znany pod nazwą AMP (Asterisk Management Portal). Pakiet Asterisk Appliance Developer’s Kit (http://www.digium.com/en/products/hardware/aadk.php) obejmuje narzędzia do tworzenia aplikacji i specjalizowane oprogramowanie do projektowania własnych, wbudowanych systemów PBX. Jest to kompletny pakiet zawierający telefon IP, obszerny zbiór dokumentacji i materiałów szkoleniowych, a nawet memorabilia związane z systemem Asterisk. Pakiet jest przeznaczony dla sprzedawców rozwiązań oraz firm, które posiadają możliwości i talent do tworzenia spersonalizowanych rozwiązań.

Korzystanie z systemu Asterisk System Asterisk można testować przez kilka godzin na niskiej klasy sprzęcie. Nauka obsługi Asteriksa zazwyczaj nie zajmuje zbyt dużo czasu, zatem zapoznanie się z tym systemem dla osób mających doświadczenie w systemach telefonicznych i obsłudze Linuksa nie powinna stanowić problemu Nie należy jednak zrażać się brakiem doświadczenia. Przed zbudowaniem systemu produkcyjnego warto stworzyć niewielki system testowy i nauczyć się posługiwania systemem Asterix. System jest interesujący i niezwykle uniwersalny, a podczas nauki zawsze dobrze jest mieć kontrolę nad własnymi systemami. Chociaż można skompilować i uruchomić system Asterisk w każdym systemie operacyjnym (przynajmniej można podjąć takie próby), system ten najlepiej działa pod Linuksem. Asterisk rozwija się tak szybko, że do czasu, kiedy Czytelnik weźmie tę książkę do ręki, być może będzie doskonale działał w każdym systemie operacyjnym. Z tego powodu warto studiować bieżącą dokumentację. System AsteriskNOW jest doskonałą implementacją systemu Asterisk. Twórcy systemu twierdzą, że jego zainstalowanie nie powinno zająć więcej niż 30 minut. Dobrym wstępem do korzystania z systemu AsteriskNOW są receptury 5.22 i 5.23 zamieszczone pod koniec niniejszego rozdziału.

5.1. Instalacja systemu Asterisk z kodu źródłowego Problem Jaki jest najlepszy sposób instalacji systemu Asterisk? Czy należy instalować go, używając pakietów dystrybucyjnych, czy też lepiej zrobić to, posługując się kodem źródłowym?

Rozwiązanie Obecnie pakiety instalacyjne są dostępne tylko dla dystrybucji Debian i jest to wersja starsza od bieżącego stabilnego wydania. W tym rozdziale zainstalujemy system Asterisk w dystrybucji CentOS 5.0. CentOS to klon dystrybucji Red Hat w wersji Enterprise. Jest bardzo stabilny i system Asterisk doskonale działa pod jego kontrolą. W recepturze 5.2 opisano sposób instalacji systemu Asterisk w dystrybucji Debian za pomocą menedżera pakietów apt-get.

5.1. Instalacja systemu Asterisk z kodu źródłowego

|

151

Minimalne wymagania sprzętowe wystarczają do uruchomienia systemu testowego. System Asterisk wymaga dużo mocy obliczeniowej. Serwer Asterisk musi być dedykowany — nie należy uruchamiać na nim innych usług. Wymagania sprzętowe: • komputer PC co najmniej z procesorem 500 MHz; • 256 MB RAM; • napęd CD; • 10 GB miejsca na twardym dysku; • karta dźwiękowa i głośniki lub zestaw słuchawkowo-mikrofonowy podłączany przez USB; • połączenie z internetem do pobierania dodatkowych plików dźwiękowych podczas instala-

cji (opcjonalnie). Wymagania programowe: Standardowe, linuksowe środowisko do kompilacji źródeł zawierające pakiety gcc, automake, glibc-devel, glibc-headers, glibc-kernheaders, binutils, doxygen oraz kernel-devel. Wszystkie te składniki można zainstalować jednocześnie poprzez zainstalowanie grupy pakietów Development Tools: # yum groupinstall "Development Tools"

Następnie należy zainstalować poniższe pakiety. Są to pakiety zależne (ang. dependencies) systemu Asterisk: # yum install ncurses ncurses-devel openssl openssl-devel zlib zlib-devel newt newtdevel

Można teraz pobrać bieżące wersje trzech głównych archiwów tarball z kodami źródłowymi z serwisu Asterisk.org (http://www.asterisk.org/downloads) do katalogu /usr/src. W tym przykładzie skorzystano z wersji 1.4.4: [root@asterisk1 src]# wget http://ftp.digium.com/pub/asterisk/releases/asterisk-1.4. 4.tar.gz \ http://ftp.digium.com/pub/zaptel/releases/zaptel-1.4.3.tar.gz \ http://ftp.digium.com/pub/libpri/releases/libpri-1.4.0.tar.gz

Rozpakowujemy pobrane archiwa: [root@asterisk1 src]# tar zxvf asterisk-1.4.4.tar.gz [root@asterisk1 src]# tar zxvf zaptel-1.4.3.tar.gz [root@asterisk1 src]# tar zxvf libpri-1.4.0.tar.gz

Jak zwykle, przy okazji instalowania nowego oprogramowania (przed właściwą instalacją) w każdym z katalogów należy zapoznać się z plikami README, uwagami na temat instalacji oraz innymi danymi. Trzy pakiety wchodzące w skład systemu Asterisk należy zainstalować we właściwej kolejności. Najpierw należy wejść do katalogu Zaptel i uruchomić poniższe polecenia: # # # # #

cd zaptel-1.4.3 make clean ./configure make make install

Następnie należy wejść do katalogu libpri i zainstalować tę bibliotekę:

152

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

# # # #

cd ../libpri-1.4.0/ make clean make install

Teraz przychodzi pora na deser — instalację systemu Asterisk: # # # #

cd ../asterisk-1.4.4 make clean ./configure make menuselect

Polecenie make menuselect to program, który pozwala nam spędzić trochę czasu na przejrzenie ustawionych opcji. Za jego pomocą można dostosować system Asterisk do własnych potrzeb, w odróżnieniu od poprzednich wersji dostarczanych w postaci monolitycznych obiektów binarnych. ************************************* Asterisk Module Selection ************************************* Press 'h' for help. ---> 1. Applications 2. Call Detail Recording 3. Channel Drivers 4. Codec Translators 5. Format Interpreters 6. Dialplan Functions 7. PBX Modules 8. Resource Modules 9. Voicemail Build Options 10. Compiler Flags 11. Module Embedding 12. Core Sound Packages 13. Music On Hold File Packages 14. Extras Sound Packages

Po menu można się poruszać za pomocą następujących poleceń: przewijanie => strzałki w górę/w dół zaznaczanie (anulowanie ) => Enter zaznacz wszystko => F8 anuluj zaznaczenie wszystkiego => F7 wstecz => strzałka w lewo koniec => q zapisz i wyjdź => x

Symbol XXX w menu Module Selection oznacza niespełnione zależności. Program menuselect informuje użytkownika, jakie zależności powinny być spełnione. Oto przykład: ************************************* Asterisk Module Selection ************************************* Press 'h' for help. [*] 1. codec_adpcm [*] 2. codec_alaw [*] 3. codec_a_mu [*] 4. codec_g726 [*] 5. codec_gsm [*] 6. codec_ilbc [*] 7. codec_lpc10 XXX 8. codec_speex [*] 9. codec_ulaw [*] 10. codec_zap Speex Coder/Decoder Depends on: speex

5.1. Instalacja systemu Asterisk z kodu źródłowego

|

153

W pokazanym przykładzie, aby spełnić brakującą zależność, należy zainstalować pakiet speex-devel (Speex to doskonały nieopatentowany format kompresji przeznaczony specjalnie do zastosowania w komunikacji głosowej). Pakiet ten musi być zainstalowany przed zainstalowaniem systemu Asterisk. W celu zaoszczędzenia czasu należy przejrzeć wszystkie opcje menuselect i zwrócić uwagę na pakiety, które trzeba zainstalować. Potrzebne są pakiety -devel. W tym przykładzie jednym z nich jest speex-devel. Należy zainstalować je wszystkie naraz, a następnie ponownie uruchomić polecenia make clean, ./configure oraz make menuselect. Program menuselect jest dość mocno rozbudowany, dlatego w przypadku trudności ze zrozumieniem wszystkich opcji należy zaakceptować opcje domyślne. Później można będzie je cofnąć. Po przejrzeniu ustawień należy uruchomić następujące polecenia: # # # #

make make install make config make progdocs

To by było na tyle. Można teraz przystąpić do nauki posługiwania się serwerem Asterisk.

Dyskusja Czytelnicy, którzy są przyzwyczajeni do systemu Asterisk 1.2, powinni zwrócić uwagę na to, że procedura instalacji najnowszej wersji jest nieco inna. Są w niej dostępne opcje skryptu ./configure dla sterowników Zaptel i systemu Asterisk. Aby je przejrzeć, można skorzystać z polecenia ./configure --help. Pliki dźwiękowe również instaluje się inaczej niż w wersji 1.2. Archiwum tarball z systemem Asterisk 1.4 zawiera angielskie komunikaty w formacie GSM oraz pliki MOH systemu FreePlay w formacie WAVE. Skrypt menuselect zawiera więcej opcji. Można wybrać zainstalowanie tylko elementów domyślnych, a następnie dodać pozostałe w późniejszym okresie, ponieważ niektóre archiwa tarball są mocno rozbudowane, na przykład archiwum asterisk-extra-sounds-en-wav-1.4.1.tar.gz ma objętość 144 MB. Może się wydawać, że w przypadku nowej instalacji uruchomienie polecenia make clean jest zbyteczne, ale często w systemie występują stare pliki obiektowe oraz inne losowe pozostałości. Uruchomienie polecenia make clean daje pewność rozpoczęcia od stanu zerowego. Program instalacyjny systemu Asterisk wyświetla czytelne komunikaty informujące o tym, czy instalacja systemu się powiodła, i udziela wskazówek na temat tego, co należy zrobić w dalszej kolejności: +--------- Asterisk Build Complete ---------+ + Asterisk has successfully been built, and + + can be installed by running: + + + + make install + +-------------------------------------------+

Bardzo ważne jest zapoznanie się z plikami README oraz innymi plikami informacyjnymi z drzewa źródłowego. Sterowniki Zaptel zarządzają kartami interfejsów Digium, wydawałoby się zatem, że jeśli nie korzystamy ze sprzętu firmy Digium, to nie musimy przejmować się sterownikami. Potrzebne jest jednak urządzenie czasowe do realizacji takich funkcji, jak muzyka w trakcie oczekiwania 154

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

oraz obsługa konferencji. Własności te udostępnia moduł ztdummy. W jądrach w wersji 2.6 moduł ten komunikuje się bezpośrednio ze sprzętowym zegarem systemowym. W jądrach 2.4 moduł ztdummy odczytuje czas z modułu jądra usb-uhci. Dokumenty, które odwołują się do modułu usb-uhci, są przestarzałe. W każdym przypadku system Asterisk należy uruchamiać w dystrybucjach linuksowych wyposażonych w jądro 2.6. Informacje o modułach dołączonych do sprzętu można znaleźć w pliku README w katalogu z kodem źródłowym biblioteki Zaptel. Aby obejrzeć listę grup pakietów w dystrybucji CentOS, można skorzystać z programu Yum: $ yum grouplist

Poniższe polecenie wyświetla listę pakietów z grupy Development Tools: $ yum groupinfo "Development Tools"

Patrz także • projekt dokumentacji systemu Asterisk: http://www.asteriskdocs.org/modules/news/ • serwis wsparcia technicznego systemu Asterisk: http://www.asterisk.org/support • rozdział 2. „Instalacja i zarządzanie oprogramowaniem w systemach opartych na RPM”

z książki Carli Schroder Linux. Receptury (Helion, 2005)

5.2. Instalacja systemu Asterisk w dystrybucji Debian Problem Chcemy uruchomić serwer systemu Asterisk w dystrybucji Debian. Czy można skorzystać z programu apt-get? Jakie są nazwy pakietów?

Rozwiązanie System Asterisk można łatwo zainstalować w dystrybucji Debian za pomocą polecenia apt-get, z jednym wyjątkiem: trzeba ręcznie skompilować moduły Zaptel. Dzięki programowi module-assistant nie jest to trudne. Najpierw należy zainstalować system Asterisk za pomocą poniższych poleceń: # apt-get install asterisk asterisk-sounds-main asterisk-sounds-extra asterisk-config asterisk-doc zaptel

Następnie należy skompilować sterowniki Zaptel z kodu źródłowego. Można to łatwo zrobić za pomocą programu module-assistant. To niewielkie narzędzie pozwala na pobranie wszystkiego, co jest potrzebne do kompilacji, i na stworzenie modułów jądra. Najpierw uruchomimy poniższe polecenia w celu zainstalowania programu module-assistant, a następnie skompilujemy i zainstalujemy sterowniki Zaptel: # apt-get install module-assistant # module-assistant prepare # module-assistant auto-install zaptel

Zainstalowanie sterowników Zaptel zajmuje niewiele czasu w przypadku, gdy w komputerze PC jest już zainstalowane środowisko do kompilowania kodów źródłowych. Proces trwa 5.2. Instalacja systemu Asterisk w dystrybucji Debian

|

155

dłużej, jeśli moduł module-assistant musi pobierać wiele pakietów. Po wykonaniu tych operacji należy uruchomić poniższe polecenie: # update-modules

Ostatni krok to skonfigurowanie systemu Asterisk w taki sposób, aby uruchamiał się w momencie rozruchu systemu. Do tego celu wykorzystamy polecenie update-rc.d: # update-rc.d asterisk start 40 2 3 4 5 . stop 60 0 1 6 .

To wszystko. Możemy teraz zacząć uczyć się posługiwać serwerem Asterisk.

Dyskusja Do czego tak naprawdę służą sterowniki Zaptel? Sterowniki Zaptel zarządzają kartami interfejsów Digium, wydawałoby się zatem, że jeśli nie korzystamy ze sprzętu firmy Digium, to nie musimy się przejmować sterownikami. Potrzebne jest jednak urządzenie czasowe do realizacji takich funkcji, jak muzyka w trakcie oczekiwania oraz obsługa konferencji. Własności te udostępnia moduł ztdummy. W jądrach w wersji 2.6 moduł ten komunikuje się bezpośrednio ze sprzętowym zegarem systemowym. W jądrach 2.4 moduł ztdummy odczytuje czas z modułu jądra usb-uhci. Dokumenty, które odwołują się do modułu usb-uhci, są przestarzałe. Pakiety Debiana zazwyczaj zawierają nieco starsze wersje systemu Asterisk — zwłaszcza te, które zostały wyposażone w wersje stabilne. Aby uzyskać nowsze wydania systemu Asterisk, należy skorzystać z pakietów testowych lub niestabilnych. W dystrybucji Debian, tak samo jak w innych dystrybucjach, można również skompilować system Asterisk z oficjalnych archiwów tarball z kodem źródłowym.

Patrz także • projekt dokumentacji systemu Asterisk: http://www.asteriskdocs.org/modules/news/ • serwis wsparcia technicznego systemu Asterisk: http://www.asterisk.org/support • man 8 module-assistant • rozdział 2. „Instalacja i zarządzanie oprogramowaniem w systemach opartych na RPM”

z książki Carli Schroder Linux. Receptury (Helion, 2005) • rozdział 7. „Uruchamianie i zamykanie systemu Linux” z książki Carli Schroder Linux.

Receptury (Helion, 2005)

5.3. Uruchamianie i zamykanie systemu Asterisk Problem Jaki jest najlepszy sposób na zamknięcie i uruchomienie systemu Asterisk? Czy należy go zrestartować po modyfikacji plików konfiguracyjnych, czy też można załadować zmiany bez przerw w działaniu usługi?

156

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

Rozwiązanie Jest kilka sposobów na to, by zatrzymać i ponownie uruchomić system Asterisk, w zależności od tego, co chcemy zrobić. Można skorzystać z dwóch różnych interfejsów poleceń: wiersza poleceń Linux oraz konsoli poleceń systemu Asterisk. Do zarządzania systemem Asterisk należy wykorzystywać konsolę Asterisk. Po zainstalowaniu systemu Asterisk najpierw należy ponownie załadować system, a następnie za pomocą polecenia ps sprawdzić, czy Asterisk działa: $ ps ax | grep asterisk

Powinien działać, jeśli podczas instalacji uruchomiliśmy polecenie make config, ponieważ jego uruchomienie tworzy pliki konieczne do automatycznego uruchomienia w momencie startu systemu. Następnie należy podłączyć się do działającego serwera Asterisk i otworzyć konsolę za pomocą poniższego polecenia: [root@asterisk1 ~]# asterisk -rvvv Asterisk 1.4.4, Copyright (C) 1999 - 2007 Digium, Inc. and others. Created by Mark Spencer Asterisk comes with ABSOLUTELY NO WARRANTY; type 'show warranty' for details. This is free software, with components licensed under the GNU General Public License version 2 and other licenses; you are welcome to redistribute it under certain conditions. Type 'show license' for details. ========================================================================= == Parsing '/etc/asterisk/asterisk.conf': Found == Parsing '/etc/asterisk/extconfig.conf': Found Connected to Asterisk 1.4.4 currently running on asterisk1 (pid = 31461) Verbosity was 0 and is now 3 You can exit from the Asterisk console and return to the Linux Bash shell with the quit or exit commands. Type help to see a list of Asterisk commands. The list is probably too long for your screen, so page up and down by holding down the Shift key and pressing Page Up/Page Down. Type help [commandname] to get information on specific commands: asterisk1*CLI> help stop gracefully Usage: stop gracefully Causes Asterisk to not accept new calls, and exit when all active calls have terminated normally.

System Asterisk instaluje się z typowymi skryptami startowymi. System można uruchomić lub zatrzymać z wiersza poleceń systemu Linux za pomocą następujących poleceń: # # # #

/etc/init.d/asterisk /etc/init.d/asterisk /etc/init.d/asterisk /etc/init.d/asterisk

start restart stop status

Polecenia te można wykorzystywać do testowania, jednak ze względu na to, że zakłócają usługę, nie są odpowiednie do stosowania w systemie produkcyjnym. W celu załadowania modyfikacji w poniższych plikach konfiguracyjnych bez przerywania aktywnych połączeń można skorzystać z następujących poleceń konsoli systemu Asterisk: sip.conf, sip_notify.conf reload chan_sip.so

5.3. Uruchamianie i zamykanie systemu Asterisk

|

157

iax.conf, iaxprov.conf reload chan_iax2.so

extensions.conf dialplan reload

dnsmgr.conf dnsmgr reload

extensions.ael ael reload

Ponowne załadowanie wszystkich plików konfiguracyjnych: reload

Zmiany w pliku zaptel.conf przeładowuje się za pomocą poniższego polecenia: !/sbin/ztcfg

Symbol wykrzyknika służy do uruchomienia zewnętrznych poleceń Linuksa z poziomu konsoli systemu Asterisk. Z poziomu konsoli systemu Asterisk można również otworzyć powłokę Linuksa: *CLI> ! [root@asterisk1 ~]#

Aby powrócić do systemu Asterisk, należy wpisać exit. Istnieje kilka sposobów zamykania systemu Asterisk: restart gracefully

Zatrzymanie akceptacji nowych połączeń i zimny restart po zakończeniu wszystkich aktywnych połączeń. restart now

Natychmiastowy restart systemu Asterisk z rozłączeniem wszystkich połączeń. restart when convenient

Restart systemu Asterisk w momencie braku jego aktywności. stop gracefully

Zatrzymanie akceptacji nowych połączeń i zimny restart po zakończeniu wszystkich aktywnych połączeń. stop now

Natychmiastowe zamknięcie systemu Asterisk. stop when convenient

Zatrzymanie systemu Asterisk w momencie braku jego aktywności. abort halt

Zmiana planów i anulowanie operacji zamykania.

Dyskusja Wprowadzanie i ładowanie zmian konfiguracyjnych w działającym serwerze nawet z minimalnymi zakłóceniami usług systemu Asterisk, takimi jak odłączenie abonentów w trakcie rozmowy, nie przysporzy nam przyjaciół. W mocno obciążonym systemie oczekiwanie na zamknięcie bez zakłóceń może być jednak zbyt długie, aby można je było zaakceptować, dlatego opcja stop now jest bardzo przydatna. 158

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

Jeśli nie dysponujemy skryptami startowymi systemu Asterisk lub nie chcemy, aby program ten uruchamiał się w momencie ładowania systemu, możemy uruchomić serwer Asterisk za pomocą następującego polecenia: # asterisk -cvvv

Patrz także • projekt dokumentacji systemu Asterisk: http://www.asteriskdocs.org/modules/news/ • serwis wsparcia technicznego systemu Asterisk: http://www.asterisk.org/support

5.4. Testowanie serwera Asterisk Problem Jesteśmy gotowi, aby zacząć korzystać z serwera Asterisk i uczyć się posługiwania tym programem. Od czego zacząć?

Rozwiązanie Należy rozpocząć od konsoli Asterisk na serwerze (patrz poprzednia receptura). Na razie nie należy modyfikować żadnych plików konfiguracyjnych. Do przetestowania wszystkich funkcji wystarczy zestaw słuchawkowo-mikrofonowy lub mikrofon i głośniki. W przypadku urządzenia słuchawkowo-mikrofonowego podłączanego przez USB nie jest potrzebna nawet karta dźwiękowa. Najpierw posłuchamy komunikatu powitalnego: asterisk1*CLI> dial 1000

Komunikat informuje o wszystkich podstawowych funkcjach: wywoływaniu zdalnego serwera w firmie Digium, wykonywaniu testu echa oraz nagrywaniu i odtwarzaniu poczty głosowej. Aby zasymulować używanie telefonu, można skorzystać z poleceń dial, console answer oraz console hangup. Wpisanie polecenia help w konsoli systemu Asterisk powoduje, że wyświetlają się wszystkie dostępne polecenia.

Dyskusja Czas poświęcony na ćwiczenia z konsolą systemu Asterisk jest dobrze spędzony, ponieważ z konsoli można uruchomić wszystkie funkcje systemu Asterisk, nie dotykając nawet plików konfiguracyjnych. Testowanie nowych konfiguracji z poziomu konsoli pozwala na zaoszczędzenie czasu, ponieważ w ten sposób można znaleźć błędy, zanim zmiany trafią do plików konfiguracyjnych (czasami jednak nie jest to praktyczne).

Patrz także • projekt dokumentacji systemu Asterisk: http://www.asteriskdocs.org/modules/news/ • serwis wsparcia technicznego systemu Asterisk: http://www.asterisk.org/support 5.4. Testowanie serwera Asterisk

|

159

5.5. Dodawanie nowych telefonów wewnętrznych do systemu Asterisk i nawiązywanie połączeń Problem Zabawa z serwerem Asterisk jest przyjemna, ale teraz chcielibyśmy skonfigurować kilka kont użytkowników i nawiązać prawdziwe połączenia. Jak można to zrobić?

Rozwiązanie Najpierw należy skonfigurować kilka kont użytkowników włącznie z kontami poczty głosowej i przetestować je na serwerze (w punkcie 5.6 pokazano, jak skonfigurować kilka telefonów programowych do nawiązywania rzeczywistych połączeń). Należy zmodyfikować poniższe pliki na serwerze Asterisk: • /etc/asterisk/sip.conf; • /etc/asterisk/extensions.conf; • /etc/asterisk/voicemail.conf.

Domyślne pliki są rozbudowane i zawierają wiele pożytecznych komentarzy, ale ich modyfikacja jest uciążliwa. W związku z tym odsuniemy je na bok: # mv sip.conf sip.conf.old # mv extensions.conf extensions.conf.old # mv voicemail.conf voicemail.conf.old

Utworzymy konta trzech użytkowników: Elizy Rogackiej, Sabiny Kowalskiej i Daniela Siewnickiego. W tym celu należy stworzyć nowy plik sip.conf zawierający poniższe zapisy. Zwróćmy uwagę na to, że do wprowadzenia komentarzy użyto średników, a nie znaków krzyżyka: ;;/etc/asterisk/sip.conf;; [general] context=default port=5060 bindaddr=0.0.0.0 disallow=all allow=gsm allow=ulaw allow=alaw [elizarog] ;Eliza Rogacka type=friend username=elizarog secret=4545 host=dynamic context=lokalni-uzytkownicy [sabkowal] ;Sabina Kowalska type=friend username=sabkowal secret=5656 host=dynamic context=lokalni-uzytkownicy

160

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

[dansiew] ;Daniel Siewnicki type=friend username=dansiew secret=6767 host=dynamic context=lokalni-uzytkownicy

Następnie utworzymy nowy plik extensions.conf zawierający następujące pozycje: ;;/etc/asterisk/extensions.conf;; [general] autofallthrough=yes clearglobalvars=yes [globals] CONSOLE=Console/dsp [default] ;Na razie nie ma żadnych zapisów. [lokalni-uzytkownicy] exten => 250,1,Dial(SIP/elizarog,10) exten => 250,2,VoiceMail(250@lokalni-uzytkownicy-pg,u) exten => 251,1,Dial(SIP/sabkowal,10) exten => 251,2,VoiceMail(251@lokalni-uzytkownicy-pg,u) exten => 252,1,Dial(SIP/dansiew,10) exten => 252,2,VoiceMail(252@lokalni-uzytkownicy-pg,u) ;Użytkownicy systemu mogą dzwonić do siebie nawzajem używając 3-cyfrowych numerów wewnętrznych: exten => _2XX,1,Dial(SIP/${EXTEN},30) exten => _2XX,n,Voicemail(${EXTEN}) exten => _2XX,n,Hangup ;odczytanie komunikatów poprzez połączenie z numerem wewnętrznym 550 exten => 550,1,VoiceMailMain(@lokalni-uzytkownicy-pg)

Na koniec konfigurujemy skrzynki poczty głosowej w pliku voicemail.conf: ;;/etc/asterisk/voicemail.conf;; [general] format=wav49 skipms=3000 maxsilence=10 silencethreshold=128 maxlogins=3 [lokalni-uzytkownicy-pg] ;numer skrzynki pocztowej, hasło, nazwisko użytkownika 250 => 1234,Eliza Rogacka 251 => 3456,Sabina Kowalska 252 => 4567,Daniel Siewnicki

Ładujemy nową konfigurację, a następnie nawiązujemy połączenia: asterisk1*CLI> reload asterisk1*CLI> dial 250@lokalni-uzytkownicy-pg asterisk1*CLI> console hangup

Pomiędzy tymi poleceniami wyświetli się wiele komunikatów na konsoli. Usłyszymy też komunikaty głosowe informujące o tym, co należy zrobić. Spróbujmy pozostawić wiadomości w poczcie głosowej, a następnie odczytajmy wiadomości z konta Elizy Rogackiej, która używa numeru wewnętrznego 250. Usłyszymy pytania o numer skrzynki pocztowej i hasło:

5.5. Dodawanie nowych telefonów wewnętrznych do systemu Asterisk i nawiązywanie połączeń

|

161

asterisk1*CLI> asterisk1*CLI> asterisk1*CLI> asterisk1*CLI>

dial 550 dial 250 dial 1234 console hangup

Aby odsłuchać nagrane wiadomości, należy postępować zgodnie ze wskazówkami. Pamiętajmy, że każdorazowo, kiedy wprowadzamy cyfry, powinniśmy skorzystać z polecenia dial. Jeśli wszystko działa, jesteśmy gotowi do zainstalowania i używania kilku telefonów programowych.

Dyskusja Aby zapoznać się z dostępnym zbiorem poleceń, wystarczy wpisać help w wierszu poleceń programu Asterisk. Mnóstwo przydatnych informacji można znaleźć w plikach README, changes oraz UPGRADE.txt umieszczonych w archiwach tarball z kodem źródłowym. Z plików tych można się dowiedzieć, jakie zmiany wprowadzono w nowych wersjach. Poziom 3. szczegółowości komunikatów (asterisk -rvvv) jest odpowiedni do monitorowania operacji związanych z połączeniami na serwerze. W przypadku dowolnych błędów można obejrzeć je na bieżąco. Komunikaty wyświetlane na konsoli są jednocześnie rejestrowane w pliku /var/log/asterisk/messages.

sip.conf W tym pliku są zdefiniowane wszystkie używane kanały SIP. W tym pliku konfigurujemy wewnętrznych użytkowników i łącza zewnętrzne. W pliku są również opcje pozwalające na wybór muzyki odtwarzanej w czasie oczekiwania, parametry zapory firewall NAT, kodeków, buforowania opóźnień oraz serwerów proxy. W sekcji [general] są zdefiniowane stałe globalne. port=5060 to ustawienie standardowego portu SIP. Nie należy go zmieniać.

Ustawienie bindaddr=0.0.0.0 oznacza nasłuchiwanie wszystkich interfejsów. Argument ten można zmienić w przypadku, gdy serwer systemu Asterisk jest wyposażony w więcej niż jeden interfejs sieciowy. Kodeki konwertują sygnały analogowe na format cyfrowy. W plikach sip.conf i iax.conf należy najpierw wyłączyć wszystkie kodeki za pomocą argumentu disallow=all, a następnie wymienić te, które chcemy włączyć w kolejności preferencji. Jakie należy włączyć? To zależy od tego, czego używają osoby, które do nas dzwonią, czego wymaga dostawca usług (jeśli korzystamy z usług jakiegoś) oraz jakie są nasze własne wymagania w stosunku do sieci. Wszystkie wchodzące połączenia wykorzystujące kodeki, których nasz serwer nie obsługuje, są transkodowane na format obsługiwany przez serwer. Przyczynia się to do dodatkowego obciążenia serwera i może spowodować pewne problemy z jakością głosu. Najbardziej wydajne jest używanie tych samych kodeków po obu stronach połączenia, ale to nie zawsze jest możliwe. Poniższa lista prezentuje najczęściej używane kodeki głosowe obsługiwane przez system Asterisk oraz prawidłową składnię parametrów z pliku konfiguracyjnego: Nazwa kodeka = argument pliku konfiguracyjnego G.711u ulaw = ulaw G.711a alaw = alaw G.726 = g726 G.729 = g729 GSM = gsm iLBC = ilbc

162

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

LPC10 = lpc10 Speex = speex

Kodeki VoIP są tworzone z uwzględnieniem kompromisu pomiędzy zużyciem pasma a procesora. Skompresowane kodeki wymagają mniej pasma, ale zużywają znacznie więcej cykli procesora. Mniejsza kompresja = mniejsze obciążenie procesora CPU i większe zużycie pasma: G.711u/a Kodek G.711 ulaw jest używany w Stanach Zjednoczonych i Japonii, natomiast w pozostałej części świata wykorzystuje się kodek G.711 alaw. To wysokowydajny kodek — macierzysty język nowoczesnej cyfrowej sieci telefonicznej. Jest obsługiwany niemal we wszystkich sieciach VoIP oraz przez wszystkie urządzenia. Łącze T1 przenosi 24-cyfrowe kanały PCM (Pulse Code Modulation), natomiast europejski standard E1 pozwala na przenoszenie 30 kanałów. Standard wymaga mniejszej mocy obliczeniowej procesora, ale zużywa więcej pasma. Komunikacja odbywa się ze stałą szybkością 64 Kb/s w obie strony plus około 20 Kb/s na nagłówki pakietów. Dla kodeka G.711 obowiązuje licencja open source. Standard zapewnia najlepszą jakość głosu i najmniejsze opóźnienia. G.726 G.726 pozwala na komunikację z kilkoma szybkościami: 16, 24 lub 32 Kb/s oraz, o czym nie należy zapominać, dodatkowe 20 Kb/s na nagłówki. Najpopularniejsza szybkość to 32 Kb/s — jedyna obsługiwana przez system Asterisk. Standard zużywa niewiele mocy procesora, gwarantuje dobrą jakość głosu i jest na licencji open source. Standard G.726 staje się coraz bardziej popularny. Jest obsługiwany niemal przez wszystkie urządzenia VoIP. G.729 Wysokiej jakości zastrzeżony kodek z kompresją z niewielkimi wymaganiami w zakresie pasma, pozwalający na szybkość transmisji 8 Kb/s (należy dodać około 20 Kb/s na nagłówki). Ceną niskiej zajętości pasma jest większe obciążenie dla procesora. Na przykład pakiet AstLinux zainstalowany na płycie Soekris 48xx może obsłużyć około ośmiu równoległych połączeń G.711, ale tylko dwa połączenia G.729. Dodatkowo występują problemy patentowe — używanie standardu G.729 w systemie Asterisk wymaga licencji 10 USD na kanał. Licencję można kupić w firmie Digium. GSM GSM to skrót od Global System for Mobile communications — globalny system przenośnej komunikacji — standard dla telefonii komórkowej. W komunikacji GSM używany jest kodek głosowy, element, który jest wykorzystywany przez system Asterisk. System jest zastrzeżony, ale wolny od opłat, zatem każdy może z niego skorzystać. Zapewnia komunikację z szybkością 13 Kb/s i zużywa ogółem około 30 Kb/s. Standard GSM zapewnia dobrą jakość głosu (GSM to również format pliku darmowych komunikatów głosowych dołączonych do systemu Asterisk). Dostępne są trzy odmiany kodeka GSM. Wersja wolna od opłat jest równocześnie znana jako GSM pełnej szybkości (GSM Full-Rate). Istnieją dwie nowsze wersje chronione patentem: EFR (Enhanced Full Rate) oraz HR (Half Rate). iLBC Standard iLBC jest przeznaczony do wykorzystania w sieciach o wąskim paśmie i wysokim współczynniku utraty pakietów. Zapewnia lepszą jakość głosu niż G.729 przy niemal tych samych wymaganiach w zakresie mocy obliczeniowej oraz zużywa około 20 – 30 Kb/s na połączenie dla każdej ze stron komunikacji. Jego szczególną zaletą jest bezproblemowa degradacja w sieciach niskiej jakości. Dzięki temu, nawet przy wysokim współczynniku utraty pakietów sięgającym 10 procent, głos w dalszym ciągu brzmi dobrze. Kodek jest darmowy i ma liberalną licencję pozwalającą na wprowadzanie modyfikacji. 5.5. Dodawanie nowych telefonów wewnętrznych do systemu Asterisk i nawiązywanie połączeń

|

163

LPC-10 Standard zapewnia niską jakość głosu, ale umożliwia jego zrozumienie (w przykładowym pliku iax.conf jest nawet komentarz przy opcji disallow=lpc10 informujący o nieprzyjemnej jakości dźwięku przypominającego mówiące roboty z filmów. Kodek został opracowany przez Departament Obrony USA. Jego największą zaletą są bardzo niskie wymagania w zakresie pasma oraz mocy procesora CPU. Standard zużywa zaledwie 2,5 Kb/s na każde połączenie. Przy tym samym połączeniu pozwala więc na prawie trzy razy tyle połączeń co w przypadku kodeka GSM. Nie należy zatem zapominać, że system Asterisk obsługuje ten standard. Czasami mogą się zdarzyć sytuacje, w których będzie przydatny (co prawda do większości bezludnych wysp nie dociera internet, ale nigdy nic nie wiadomo). Speex Speex to wysokowydajny kodek bazujący na licencji w stylu BSD i zapewniający komunikację z dynamiczną szybkością transmisji. Opracowano go jako alternatywę dla restrykcyjnych kodeków chronionych patentami. Jest bardzo uniwersalny i pozwala na ręczne dostrajanie za pomocą modyfikacji w pliku /etc/asterisk/codecs.conf. Jego jedyną wadą są największe wymagania mocy obliczeniowej spośród wszystkich kodeków. Ma aktywną społeczność projektantów oraz użytkowników i jest coraz szerzej stosowany, zatem z pewnością będzie coraz bardziej ulepszany. W domyślnym pliku sip.conf do zdefiniowania numerów wewnętrznych wykorzystywane są nazwy telefonów zamiast użytkowników. Osobiście wolę stosować nazwy pochodzące od użytkowników. Można wyróżnić trzy typy użytkowników: Peer, User i Friend. Typy peer i user charakteryzują się różnymi uprawnieniami, a użytkownicy typu friend mają wszystkie uprawnienia. Szczegółowe informacje na ten temat można znaleźć w domyślnym pliku extensions.conf. Argumenty username i secret to ustawienia nazwy użytkownika i hasła wykorzystywane przez użytkowników w konfiguracji telefonów programowych do zarejestrowania telefonu na serwerze. Opcja host=dynamic informuje serwer o tym, że telefon trzeba zarejestrować. Dzieje się tak za każdym razem, kiedy uruchamiamy bądź restartujemy telefon. Następnie przy każdej rejestracji urządzenia jest negocjowany limit czasu — zazwyczaj wynosi on 3600 sekund (60 minut). Urządzenie musi się ponownie zarejestrować. W przeciwnym przypadku system Asterisk usunie zapis z rejestru. Należy utworzyć domyślny kontekst dla każdego użytkownika. W ten sposób system Asterisk otrzymuje informację, od którego miejsca schematu połączeń (ang. dialplan) ma rozpocząć się przetwarzanie połączeń dla każdego z użytkowników. Jest to doskonały mechanizm pozwalający na definiowanie różnych zestawów uprawnień dla różnych grup użytkowników.

Schematy połączeń Sercem serwera Asterisk jest plik extensions.conf, ponieważ w nim jest zdefiniowany schemat połączeń. Schemat połączeń składa się z czterech elementów — numery wewnętrzne (ang. extensions), konteksty (ang. contexts), priorytety (ang. priorities) i aplikacje (ang. applications): Numery wewnętrzne Termin numery wewnętrzne jest niezbyt właściwy, ponieważ kojarzy się z numerami wewnętrznymi central telefonicznych starego typu. Numery wewnętrzne systemu Asterisk

164

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

są jednak rozbudowanymi mechanizmami wykonującymi różne czynności. Numery wewnętrzne definiuje się zgodnie z następującą składnią: exten => nazwa,priorytet,aplikacja( )

Nazwy mogą być słowami lub ciągami cyfr. Zazwyczaj do obsługi jednego połączenia wymaganych jest wiele numerów wewnętrznych; wszystkie one określa się terminem kontekstu. Konteksty Grupa numerów wewnętrznych nosi nazwę kontekstu. Każdy kontekst jest odrębną jednostką i nie komunikuje się z innymi kontekstami, pod warunkiem, że się go skonfiguruje w taki sposób za pomocą dyrektywy include. Priorytety Zawsze należy zdefiniować priorytet numer jeden; jest to pierwsze polecenie, które system Asterisk uruchamia podczas przetwarzania połączenia. Aplikacje System Asterisk jest dostarczany z obszernym asortymentem aplikacji. Są to wbudowane polecenia systemu. Aby zobaczyć listę aplikacji, można uruchomić polecenie core list applications z konsoli systemu Asterisk. Plik extensions.conf zawiera następujące sekcje: [general] [globals] [konteksty]

Sekcje [general] i [globals] to słowa zarezerwowane, dlatego nie należy ich zmieniać. Dla sekcji [konteksty] można stosować dowolne nazwy. W sekcji [general] są zdefiniowane zmienne o zasięgu systemowym. W przykładzie zaprezentowanym w tej recepturze opcja autofallthrough=yes powoduje zakończenie połączeń za pomocą poleceń BUSY, CONGESTION lub HANGUP w przypadku, gdy z konfiguracji nie wynika w czytelny sposób, jaki powinien być następny krok. Opcja clearglobalvars=yes oznacza, że zmienne będą wyczyszczone i ponownie przetworzone w momencie ponownego załadowania pliku extensions.conf lub ponownego załadowania systemu Asterisk. W przypadku ustawienia tej opcji w inny sposób zmienne globalne przetrwają operację restartu, nawet jeśli zostaną usunięte z pliku extensions.conf. Stałe globalne, takie jak schematy połączeń i zmienne środowiskowe, konfiguruje się w sekcji [globals]. Opcja CONSOLE=Console/dsp ustawia domyślne urządzenie dźwiękowe. Doszliśmy teraz do istotnego elementu: kontekstów definiowanych przez użytkownika. Konteksty definiują routing połączeń oraz operacje dozwolone dla użytkowników. Kontekst [lokalni-uzytkownicy] w niniejszej recepturze definiuje numery wewnętrzne użytkowników lokalnych oraz routing ich połączeń. Zaprezentowane przykłady są maksymalnie uproszczone — wybieramy numer wewnętrzny, a w przypadku braku odpowiedzi system odsyła nas do odpowiedniego kontekstu poczty głosowej. Opcja u poczty głosowej oznacza „w przypadku braku odpowiedzi odtwarzaj komunikat informujący o tym, że abonent jest niedostępny”. Znaki podkreślenia wewnątrz numerów wewnętrznych to symbole wieloznaczne. W przykładzie, który pozwala użytkownikom na wzajemne dzwonienie do siebie za pomocą trzycyfrowych numerów, pierwszym wybieranym numerem musi być 2. Następne dwa wybierane

5.5. Dodawanie nowych telefonów wewnętrznych do systemu Asterisk i nawiązywanie połączeń

|

165

numery są dopasowywane do istniejących numerów wewnętrznych. Zmienna EXTEN oznacza kanał, który przekazuje wybierane numery. Kolejność wewnątrz kontekstu jest bardzo ważna — kroki muszą być numerowane lub wyszczególnione w odpowiedniej kolejności (można wykorzystać opcję n, która oznacza przejście do następnego kroku). Używanie numerowanych priorytetów pozwala na przeskoki do różnych priorytetów, o czym przekonamy się w dalszej części niniejszego rozdziału. Numer wewnętrzny 550 w przykładzie zaprezentowanym w niniejszej recepturze skonfigurowano jako numer, pod który użytkownicy dzwonią, chcąc odebrać pocztę głosową. Można w tym celu wykorzystać dowolny numer. W pokazanej recepturze wykorzystano aplikację VoiceMailMain — wbudowany program systemu Asterisk do odbierania poczty głosowej, który wskazuje na właściwy kontekst poczty głosowej. W przypadku, gdy zdefiniowano więcej niż jeden kontekst poczty głosowej, należy określić właściwy. W recepturze są one określone z przyrostkiem @lokalni-uzytkownicy-pg. voicemail.conf W sekcji [general] są zdefiniowane stałe globalne. format Dozwolone wartości dla tego argumentu to wav49, gsm oraz wav. Komunikaty poczty głosowej są rejestrowane we wszystkich formatach, które są tu wymienione. System Asterisk wybiera optymalny format do odtwarzania. Aby dołączyć komunikaty poczty głosowej do wiadomości poczty elektronicznej, należy skorzystać z formatu wav49. Format ten jest identyczny z gsm z tą różnicą, że zawiera nagłówki rozpoznawane w systemie Microsoft Windows. Dzięki temu plik można odczytać za pomocą niemal każdego oprogramowania klienckiego. Format powoduje tworzenie plików o objętości około jednej dziesiątej rozmiaru plików WAVE. Pliki WAVE są duże, ponieważ są nieskompresowane, ale zapewniają one najlepszą jakość dźwięku.

Patrz także • dokumentacja pliku konfiguracyjnego systemu Asterisk sip.conf:

http://www.voip-info.org/wiki-Asterisk+config+sip.conf • dokumentacja pliku konfiguracyjnego systemu Asterisk extensions.conf:

http://www.voip-info.org/wiki/view/Asterisk+config+extensions.conf • dokumentacja pliku konfiguracyjnego systemu Asterisk voicemail.conf:

http://www.voip-info.org/wiki-Asterisk+config+voicemail.conf • dokumentacja aplikacji VoiceMailMain:

http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+VoiceMailMain • dokumentacja polecenia Dial:

http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+Dial • domyślne pliki extensions.conf, sip.conf i voicemail.conf

166

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

5.6. Konfiguracja telefonów programowych Problem Jesteśmy teraz gotowi do podłączenia telefonów programowych i przetestowania prawdziwego systemu telefonii IP w naszym laboratorium. Chcemy wykorzystać komputery PC z systemem Windows i Linux. Gdzie można znaleźć jakieś dobre telefony programowe i w jaki sposób się je konfiguruje?

Rozwiązanie Dostępnych jest wiele telefonów programowych do wypróbowania. W tej recepturze wykorzystamy telefon programowy Twinkle dla systemu Linux oraz X-Lite dla systemu Windows. Oba są dostępne za darmo. Telefon Twinkle ma licencję open source, dla telefonu X-Lite kod źródłowy jest niedostępny. Telefon Twinkle działa wyłącznie w systemie Linux, natomiast X-Lite jest dostępny w systemach Windows, Linux i Mac OS X. Program Twinkle oferuje obszerny zbiór własności, miły dla oka interfejs, jest łatwy w użyciu i ma dobrą dokumentację. X-Lite jest nieco mniej przejrzysty, a jego konfiguracja jest dosyć trudna. Możliwości konfiguracji są jednak duże, jakość dźwięku dobra, a potencjometry głośności są dostępne z poziomu głównego interfejsu. Do korzystania z telefonu Twinkle, jak pokazano na rysunku 5.1, potrzebna jest nazwa użytkownika i hasło z pliku /etc/asterisk/sip.conf oraz adres IP serwera Asterisk.

Rysunek 5.1. Konfiguracja systemu Twinkle

5.6. Konfiguracja telefonów programowych

|

167

Ekran pokazany na rysunku jest dostępny po wybraniu poleceń Edit/User Profile. Po wprowadzeniu zmian w ustawieniach systemu Twinkle należy użyć opcji Registration/Register, aby uaktywnić nowe opcje. W systemie X-Lite należy przejść do Main Menu/System Settings/SIP Proxy/Default, tak jak pokazano na rysunku 5.2.

Rysunek 5.2. Konfiguracja telefonu X-Lite

Należy pamiętać, aby ustawić opcję Enabled na wartość Yes. Aby uaktywnić zmiany, należy zamknąć program X-Lite, a następnie ponownie go uruchomić. Teraz możemy wypróbować wszystkie testy, jakie przeprowadziliśmy według ostatniej receptury z konsoli systemu Asterisk, oraz dodatkowo spróbować zatelefonować pomiędzy dwoma numerami wewnętrznymi. Można nawet zadzwonić na zewnątrz. W tym celu wystarczy skopiować kontekst [demo] z przykładowego pliku /etc/asterisk/extensions.conf do działającego pliku extensions.conf. Następnie należy dodać go do kontekstu [lokalni-uzytkownicy] w następujący sposób: [lokalni-uzytkownicy] include => demo

Zmiany należy przeładować z poziomu konsoli systemu Asterisk: asterisk1*CLI> dialplan reload

Aby uruchomić demo systemu Asterisk, wystarczy wybrać numer 1000, używając programowego telefonu. Demonstracje przeprowadzą użytkownika przez wiele różnych zadań: test pogłosu, wywołanie serwera demonstracyjnego Digium oraz test poczty głosowej. Test poczty głosowej nie zadziała bez domyślnego pliku voicemail.conf, ale ponieważ już przetestowaliśmy go w recepturze 5.4 i pomyślnie skonfigurowaliśmy własny plik voicemail.conf, nie powinno to sprawić problemów.

Dyskusja Warto przetestować kilka różnych telefonów programowych, ponieważ różnią się one znacznie pod względem sposobu posługiwania się i jakości dźwięku. W szczególności potrzebny jest 168

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

dobry sprzęt do odtwarzania dźwięku. Dobrej jakości zestawy słuchawkowo-mikrofonowe, takie jak Plantronics, brzmią ciepło i naturalnie, blokują szumy i są wyposażone w przyciski wyłączenia dźwięku oraz potencjometry do regulowania głośności. Zestawy słuchawkowo-mikrofonowe podłączane przez port USB nie wymagają karty dźwiękowej. Zamiast tego zawierają własny obwód przetwarzania dźwięku. Należy uważać na markowe telefony programowe dostosowane do rozwiązań wybranego producenta (na przykład Vonage), których nie można dowolnie używać bez wprowadzenia poważnych modyfikacji. W systemach linuksowych ważne jest, aby używać wyłącznie systemu dźwiękowego ALSA (Advanced Linux Sound Architecture). Nie należy korzystać z systemu aRtsd (serwer dźwięku środowiska KDE) lub systemu ESD (Enlightened Sound Daemon) dołączonego do środowiska Gnome. Należy je wyłączyć, ponieważ wprowadzają opóźnienia, które są wrogiem jakości dźwięku w rozwiązaniach VoIP. Nie należy również używać systemu OSS (Open Sound System), ponieważ jest przestarzały. Architektura ALSA udostępnia emulator OSS przeznaczony dla aplikacji i urządzeń takich jak konsola Asterisk — wymagających systemu OSS.

Patrz także • dokumentacja telefonów programowych • man 1 alsactl • man 1 alsamixer • projekt ALSA: http://www.alsa-project.org/

5.7. Konfiguracja rzeczywistego systemu VoIP z wykorzystaniem usługi Free World Dialup Problem Chcemy uruchomić serwer Asterisk i podłączyć go ze światem zewnętrznym tak szybko, jak się da. Chcemy zatem rozpocząć od podstawowych usług VoIP i zacząć dzwonić przez internet.

Rozwiązanie Można podłączyć serwer Asterisk do serwisu Free World Dialup (FWD). W systemie Free World Dialup istnieje możliwość nawiązywania darmowych połączeń z innymi użytkownikami FWD oraz z sieciami partnerskimi serwisu FWD (znanym wyjątkiem jest firma Vonage, która nie chce się łączyć z innymi sieciami VoIP). Najpierw musimy wejść do serwisu Free World Dialup (http://www.freeworlddialup.com/) i zarejestrować konto. Po otrzymaniu powitalnej wiadomości e-mail trzeba się zalogować i zmienić hasło. Następnie należy przejść do łącza Extra Features i włączyć obsługę protokołu IAX, ponieważ do połączenia z serwisem FWD będziemy wykorzystywali protokół IAX.

5.7. Konfiguracja rzeczywistego systemu VoIP z wykorzystaniem usługi Free World Dialup

|

169

Należy uruchomić wybrany edytor tekstu i skonfigurować pliki /etc/asterisk/iax.conf oraz etc/ asterisk/extensions.conf. Aby zilustrować ten przykład, skorzystamy z plików /etc/asterisk/sip.conf i /etc/asterisk/voicemail.conf utworzonych w recepturze 5.5. W zaprezentowanych przykładach korzystamy z konta FWD o nazwie uzytkownikasterisk, hasła 67890 i numeru telefonu 123456. Wchodzące połączenia FWD są przekierowywane do Elizy Rogackiej, pod numer wewnętrzny 250. ;;iax.conf;; [general] context=default port=4569 bindaddr=0.0.0.0 disallow=all allow=gsm allow=ulaw allow=alaw register => 123456:[email protected] [fwd-trunk] type=user context=fwd-iax-trunk auth=rsa inkeys=freeworlddialup ;;extensions.conf;; [general] autofallthrough=yes clearglobalvars=yes [globals] CONSOLE=Console/dsp ;ustawienia usługi free world dialup FWDNUMBER=123456 FWDCIDNAME=uzytkownikasterisk FWDPASSWORD=67890 FWDRINGS=SIP/elizarog [default] include => fwd-iax-trunk [lokalni-uzytkownicy] include => default include => outbound exten => 250,1,Dial(SIP/elizarog,10) exten => 250,2,VoiceMail(250@lokalni-uzytkownicy-pg,u) exten => 251,1,Dial(SIP/sabkowal,10) exten => 251,2,VoiceMail(251@lokalni-uzytkownicy-pg,u) exten => 252,1,Dial(SIP/dansiew,10) exten => 252,2,VoiceMail(252@lokalni-uzytkownicy-pg,u) ;Użytkownicy systemu mogą dzwonić do siebie nawzajem, używając 3-cyfrowych numerów wewnętrznych: exten => _2XX,1,Dial(SIP/${EXTEN},30) exten => _2XX,n,Voicemail(${EXTEN}) exten => _2XX,n,Hangup ;odczytanie komunikatów poprzez połączenie z numerem wewnętrznym 550 exten => 550,1,VoiceMailMain(@lokalni-uzytkownicy-pg)

170

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

[fwd-iax-trunk] ;wchodzące połączenia Free World Dialup exten => ${FWDNUMBER},1,Dial,${FWDRINGS} [outbound] ;wychodzące połączenia FWD exten => _393.,1,SetCallerId,${FWDCIDNAME} exten => _393.,2,Dial(IAX2/${FWDNUMBER}:${FWDPASSWORD}@iax2.fwdnet.net/${EXTEN:3},60) exten => _393.,3,Congestion

Ładujemy nowy schemat połączeń: asterisk1*CLI> dialplan reload

Konfigurujemy zaporę firewall w taki sposób, aby włączyć ruch przez port UDP 4569. Następnie dzwonimy pod numer 393613, aby wykonać test pogłosu usługi FWD. W tym połączeniu można rozmawiać z samym sobą. Następnie przechodzimy do profilu konta FWD (my.FWD) i klikamy przycisk Callme. Serwer FWD zadzwoni do nas z zaproszeniem na nieistniejącą konferencję. Wiemy teraz, że nasza konfiguracja jest prawidłowa i działa właściwie.

Dyskusja Przykład zaprezentowany w niniejszej recepturze to łatwy sposób konfiguracji łącza IAX oraz nawiązywania i odbierania połączeń VoIP. Za pomocą telefonu SIX lub IAX nasi przyjaciele mogą dzwonić na nasz numer FWD, unikając opłat za połączenie. Eliza nie chce przez cały czas odgrywać roli recepcjonistki, dlatego w recepturze 5.9 pokazano, w jaki sposób konfiguruje się cyfrową recepcjonistkę w celu przekierowywania przychodzących połączeń. Wraz z systemem Asterisk 1.4 jest dostarczany klucz szyfrowania systemu Free World Dialup w pliku /var/lib/asterisk/keys/freeworlddialup.pub. W przypadku problemów z tym kluczem można pobrać nowy z serwisu internetowego FWD. W tej recepturze pokazano, w jaki sposób w systemie Asterisk definiuje się zmienne użytkownika. Umieszcza się je w sekcji [globals] pliku extensions.conf.

Patrz także • opcje konfiguracji omówiono w punkcie „Dyskusja” w recepturze 5.5 • receptura 5.9 • receptura 5.21

5.8. Podłączanie centrali PBX Asterisk do analogowych linii telefonicznych Problem Prowadzimy mały sklep, w którym jest mniej niż 10 analogowych linii telefonicznych. Nie jesteśmy przygotowani na to, aby całkiem zrezygnować z naszego sprawdzonego i niezawodnego 5.8. Podłączanie centrali PBX Asterisk do analogowych linii telefonicznych

|

171

analogowego systemu telefonicznego, ale chcemy skonfigurować serwer Asterisk jako lokalną centralę PBX oraz zintegrować niektóre usługi VoIP. Pierwsze zadanie to podłączenie systemu Asterisk do linii analogowych — jak to można zrobić?

Rozwiązanie Najpierw należy postępować zgodnie z poprzednimi recepturami po to, aby zainstalować i przetestować podstawowe funkcje systemu Asterisk. W tej recepturze omówiono, w jaki sposób można kierować wchodzące i wychodzące połączenia przez serwer Asterisk. Łącza wchodzące będą kierowane do zdefiniowanego numeru wewnętrznego 250. Skonfigurowanie systemu na trwałe w taki sposób nie jest najlepsze, ale wystarczy dla celów testowych. W dalszej części niniejszego rozdziału skonfigurujemy prawidłową cyfrową recepcjonistkę. Załóżmy, że mamy trzy analogowe linie telefoniczne. Potrzebujemy serwera Asterisk oraz karty interfejsu PCI Digium TDM400P z trzema portami FXO. Trzeba również załadować właściwy sterownik Zaptel. Dla tej karty jest to moduł jądra wctdm. Instalujemy kartę TDM400P na serwerze Asterisk. Następnie modyfikujemy plik /etc/zaptel.conf and /etc/asterisk/zapata.conf. Najpierw należy zrobić kopię oryginalnego pliku /etc/zaptel.conf: # mv zaptel.conf zaptel.conf-old

Następnie tworzymy nowy plik zaptel.conf o zawartości pokazanej poniżej. W tym pliku należy wprowadzić właściwy kod kraju — pełną listę można znaleźć w pliku zonedata.c w obrębie drzewa źródłowego Zaptel: ;zaptel.conf loadzone = pl defaultzone=pl fxsks=1,2,3

Teraz ładujemy moduł wctdm i sprawdzamy, czy się załadował: # modprobe wctdm # lsmod Module Size Used by wctdm 34880 0

Aby upewnić się, że moduł Zaptel ładuje się automatycznie w momencie startu systemu, wracamy do katalogu źródłowego Zaptel i instalujemy pliki konfiguracyjne i startowe: # cd /usr/src/zaptel-1.4.3 # make config

Kolejny plik, który należy zmodyfikować, to /etc/asterisk/zapata.conf. Tworzymy kopię zapasową oryginału: # mv zapata.conf zapata.conf.old

Następnie wprowadzamy poniższe wiersze w nowym, pustym pliku zapata.conf: ## zapata.conf [channels] context=pstn-test-in signalling=fxs_ks language=pl usecallerid=yes echocancel=yes transfer=yes immediate=no group=1 channel => 1-3

172

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

Dodajemy wiersz TRUNK=Zap/g1 w sekcji [globals] pliku /etc/asterisk/extensions.conf. Następnie tworzymy nowy kontekst [pstn-test-in] w pliku /etc/asterisk/extensions.conf. W tym przykładzie wszystkie wchodzące połączenia są kierowane pod numer wewnętrzny 250: [pstn-test-in] ;połączenia wchodzące są kierowane na nr wewn. 250 exten => s,1,Dial(SIP/250,30) exten => s,n,Voicemail(250) exten => s,n,Hangup

Następnie tworzymy kontekst [outbound], tak aby lokalni użytkownicy mogli telefonować na zewnątrz: [outbound] ignorepat => 9 exten => _9NXXXXXX,1,Dial(TRUNK/${EXTEN:1}) exten => _91NXXNXXXXXX,1,Dial(TRUNK/${EXTEN:1}) exten => 911,1,Dial(TRUNK/911) exten => 9911,1,Dial(TRUNK/911)

Dodajemy kontekst [pstn-test-in] w obrębie kontekstu [default]: include => pstn-test-in

Dodajemy kontekst [outbound] wewnątrz kontekstu [lokalni-uzytkownicy]: include => outbound

Ładujemy nową konfigurację: asterisk1*CLI> dialplan reload

Teraz możemy przystąpić do testowania systemu. Powinniśmy mieć możliwość nawiązywania połączeń w standardowy sposób: wybieramy 9 dla linii zewnętrznej, a następnie standardowy 10-cyfrowy numer telefonu wraz z numerem kierunkowym. Jest to standardowy dla Polski system telefonowania. Aby zaadaptować go do standardów innych krajów, należy wprowadzić odpowiednie modyfikacje.

Dyskusja Opcja ignorepat (ang. ignore pattern — ignoruj wzorzec) oznacza odtwarzanie sygnału dzwonienia po wybraniu podanego numeru bądź numerów. W pliku zapata.conf zebraliśmy wszystkie trzy kanały w pojedynczą grupę o numerze 1. Oznacza to, że abonenci zawsze będą kierowani do pierwszej dostępnej linii. W przypadku użycia domyślnych plików konfiguracyjnych ładowane są wszystkie moduły Zaptel. To niczemu nie szkodzi, ale można tak skonfigurować system, aby były ładowane tylko te moduły, które są potrzebne. W dystrybucji CentOS (a także Fedora i Red Hat) należy ująć w komentarz wszystkie niepotrzebne moduły z pliku /etc/sysconfig/zapte (w dystrybucji Debian jest to plik /etc/default/zaptel). Podstawową zasadą bezpieczeństwa jest nieumieszczanie kontekstu wyjściowego w żadnym z kontekstów wejściowych ze względu na to, że oznaczałoby to udostępnienie światu usług telefonicznych za darmo. Czytelnik, który spróbował znaleźć sens w opisie modułów FXS/FXO, z pewnością zauważył, że urządzenie TDM400P składa się z trzech modułów FXO, a w konfiguracji występują sygnały FXS. Należy interpretować to w ten sposób: urządzenie akceptuje i przekształca sygnały FXO dotyczące połączeń wchodzących, ale jest zmuszone do przesyłania sygnałów FXS. 5.8. Podłączanie centrali PBX Asterisk do analogowych linii telefonicznych

|

173

Pracownicy biurowi są przyzwyczajeni do wybierania prefiksu w celu wyjścia na linię zewnętrzną. W przypadku zastosowania systemu Asterisk nie jest to wymagane, zatem nie ma konieczności konfigurowania systemu w ten sposób. Numer 911 w przykładzie zaprogramowano w taki sposób, by działał w obie strony. Dzięki temu użytkownicy nie muszą pamiętać, który prefiks czego dotyczy. Poniższy wiersz pokazuje, w jaki sposób wybierać numery zewnętrzne bez uprzedniego wybierania numeru 9: exten => _NXXXXXX,1,Dial(TRUNK/${EXTEN})

Usługa 911 może stanowić problem w systemie VoIP. Jeśli serwer Asterisk będzie wyłączony, nie będzie możliwości dzwonienia pod numer 911. Jednym z możliwych rozwiązań awaryjnych jest utrzymywanie jednej bądź kilku linii analogowych niezależnie od serwera Asterisk lub umieszczenie serwera w takiej lokalizacji, która pozwala na szybkie odłączenie linii analogowej z serwera i podłączenie jej do telefonu. Ponieważ usługi faksowe w systemach VoIP w dalszym ciągu są dużym problemem, utrzymanie standardowego faksu wraz z podłączonym do niego telefonem pozwala rozwiązać dwa problemy.

Patrz także • przykładowe pliki extensions.conf, sip.conf i voicemail.conf • dokumentacja zmiennych systemu Asterisk:

http://www.voip-info.org/wiki/index.php?page=Asterisk+Variables • dokumentacja pliku konfiguracyjnego systemu Asterisk zapata.conf:

http://www.voip-info.org/wiki-Asterisk+config+zapata.conf • dokumentacja pliku konfiguracyjnego systemu Asterisk zaptel.conf:

http://www.voip-info.org/wiki/index.php?page=Asterisk+config+zaptel.conf • dokumentacja pliku konfiguracyjnego systemu Asterisk extensions.conf:

http://www.voip-info.org/wiki/view/Asterisk+config+extensions.conf

5.9. Tworzenie cyfrowej recepcjonistki Problem Do tej pory wszystkie połączenia wchodzące były kierowane pod numer wewnętrzny 250 należący do Elizy Rogackiej. Eliza dzielnie sprawdzała się w tej roli, ale ma też własną pracę do wykonania. W jaki sposób skonfigurować system Asterisk, tak aby działał jak niezawodna i zawsze uprzejma recepcjonistka?

Rozwiązanie Zamiast kierowania wszystkich wchodzących połączeń do Elizy, można tak zaprogramować schemat połączeń, aby połączenia były kierowane według interaktywnego menu. Następnie można zarejestrować odpowiednie pozdrowienia i instrukcje (ze sposobami wykorzystania systemu Asterisk do nagrywania niestandardowych komunikatów można się zapoznać w następnej recepturze).

174

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

Uruchamiamy nasz ulubiony edytor tekstu i otwieramy plik /etc/asterisk/extensions.conf. Modyfikujemy kontekst [pstn-test-in] tak, by miał następującą postać: [pstn-test-in] ;interaktywne menu dla wchodzących połączeń exten => s,1,Answer() exten => s,2,Set(TIMEOUT(digit)=5) exten => s,3,Set(TIMEOUT(response)=15) exten => s,4 Background(local/main-greeting) ;numery wewnętrzne użytkowników exten => 1,1,Goto(lokalni-uzytkownicy,250,1) exten => 2,1,Goto(lokalni-uzytkownicy,251,1) exten => 3,1,Goto(lokalni-uzytkownicy,252,1) ;powrót do głównego menu w przypadku, ;gdy dzwoniący wprowadzi błędną opcję exten => i,1,Playback(local/invalid-option) exten => i,2,Goto(s,2) ;zerwanie połączenia w przypadku przekroczenia limitu czasu exten => t,1,Hangup

Teraz można zarejestrować komunikaty, które zostaną odtworzone dzwoniącym. Pierwszy z nich to powitanie (main-greeting), które może brzmieć następująco: „Dziękujemy za połączenie się z firmą Czysta Doskonałość. Aby rozmawiać z Elizą Rogacką, wybierz 1. Aby rozmawiać z Sabiną Kowalską, wybierz 2, lub wybierz 3, aby rozmawiać z Danielem Siewnickim”. Komunikat invalid-option to odpowiedź na wciśnięcie nieprawidłowego klawisza. Może on brzmieć następująco: „Przepraszamy. Wybrana opcja jest nieprawidłowa. Proszę wysłuchać listy dostępnych opcji i spróbować ponownie”. Ładujemy nowy schemat połączeń: asterisk1*CLI> dialplan reload

Można teraz zadzwonić do naszego serwera z linii zewnętrznej i przetestować nową cyfrową recepcjonistkę.

Dyskusja Za działanie systemu jest odpowiedzialnych zaledwie kilka linijek: Set(TIMEOUT(digit)=5) Set(TIMEOUT(response)=15)

System Asterisk rozłączy połączenie, jeśli wciskanie klawiszy lub udzielenie odpowiedzi zajmie użytkownikowi zbyt dużo czasu. Domyślne wartości to 5 sekund i 10 sekund. Polecenie Background odtwarza plik dźwiękowy, a następnie przerywa odtwarzanie tego pliku w przypadku wciśnięcia klawisza i przechodzi do następnego kroku w schemacie połączeń. Polecenie t (numer wewnętrzny timeout) to specjalna wartość, która informuje system Asterisk o tym, co należy zrobić, jeśli zostanie przekroczony limit czasu. Polecenie i (numer wewnętrzny invalid) obsługuje wciśnięcie nieprawidłowych klawiszy przez dzwoniącego. Kiedy dzwoniący zostanie skierowany pod numer wewnętrzny prawidłowego użytkownika, droga się kończy. W tym momencie ktoś podnosi słuchawkę lub następuje przekierowanie do poczty głosowej. 5.9. Tworzenie cyfrowej recepcjonistki

|

175

Patrz także • dokumentacja pliku konfiguracyjnego systemu Asterisk extensions.conf:

http://www.voip-info.org/wiki/view/Asterisk+config+extensions.conf • przykładowe pliki extensions.conf, sip.conf i voicemail.conf

5.10. Rejestrowanie niestandardowych komunikatów Problem Przeprowadziliśmy analizę możliwości utworzenia własnych komunikatów w systemie Asterisk i wiemy, że firma Digium sprzedaje profesjonalnie nagrane niestandardowe komunikaty za rozsądną cenę. Wiemy, że można poszaleć ze sprzętem nagrywającym i zrobić to samodzielnie. Obie możliwości brzmią interesująco. Na razie jednak chcemy zastosować rozwiązanie szybkie i tanie.

Rozwiązanie Jest dostępne takie rozwiązanie, o jakie nam chodzi. Potrzebna jest obsługa dźwięku na serwerze Asterisk. Może to być karta dźwiękowa wraz z mikrofonem i głośnikami lub karta dźwiękowa wraz z zestawem mikrofonowo-słuchawkowym bądź też zestaw mikrofonowo-słuchawkowy podłączany przez USB (zestaw mikrofonowo-słuchawkowy podłączany przez USB zastępuje kartę dźwiękową, mikrofon i słuchawki). Można również zadzwonić do naszego serwera z telefonu klienckiego. Następnie wystarczy utworzyć kontekst w systemie Asterisk służący wyłącznie do rejestrowania niestandardowych komunikatów. Najpierw utworzymy dwa nowe katalogi: # mkdir /var/lib/asterisk/sounds/local # mkdir /var/lib/asterisk/sounds/tmp

Następnie w pliku /etc/asterisk/extensions.conf utworzymy poniższy kontekst umożliwiający nagrywanie własnych komunikatów głosowych: [rejestruj-komunikaty] ;nagrywanie nowych plików dźwiękowych exten => s,1,Wait(2) exten => s,2,Record(tmp/newrecord:gsm) exten => s,3,Wait(2) exten => s,4,Playback(tmp/newrecord) exten => s,5,wait(2) exten => s,6,Hangup ;rejestrowanie nowych komunikatów exten => 350,1,Goto(rejestruj-komunikaty,s,1)

Przeładowujemy schemat połączeń: asterisk1*CLI> dialplan reload

Teraz wybieramy numer 350. Usłyszymy jedynie krótki sygnał dźwiękowy — zaczynamy mówić po usłyszeniu tego sygnału. Po zakończeniu nagrywania wciskamy krzyżyk. System odtworzy nasz nowy komunikat, a następnie rozłączy połączenie. Pierwszy plik, który zamierza-

176

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

my nagrać, powinien zawierać instrukcje w stylu: „Poczekaj na sygnał w celu zarejestrowania nowego komunikatu. Po zakończeniu nagrywania wciśnij krzyżyk”. Następnie przenosimy plik z katalogu tmp/ do katalogu local/ i dowolnie zmieniamy mu nazwę. W tym przykładzie plik nosi nazwę r-make-new-recording: # mv /var/lib/asterisk/sounds/tmp/newrecord.gsm \ /var/lib/asterisk/sounds/local/r-make-new-recording.gsm

Teraz nagrywamy drugi komunikat, który brzmi następująco: „Jeśli jesteś zadowolony z nowego nagrania, wciśnij 1. Jeśli chcesz nagrać go ponownie, wciśnij 2”. Po nagraniu zmieniamy nazwę pliku na r-keep-or-record.gsm. Nagrywamy trzeci komunikat, który brzmi: „Dziękujemy. Nowy komunikat został zapisany. Wciśnij 2, aby nagrać kolejny komunikat, lub 3, aby wyjść”. Temu nagraniu nadajemy nazwę r-thank-you-message-saved.gsm. Następnie modyfikujemy nasz schemat połączeń w taki sposób, by były wykorzystane nowe pliki dźwiękowe: [rejestruj-komunikaty] ;nagrywanie nowych plików dwiękowych exten => s,1,Wait(1) exten => s,2,Playback(local/r-make-new-recording) exten => s,3,Wait(1) exten => s,4,Record(tmp/znewrecord:gsm) exten => s,5,Wait(1) exten => s,6,Playback(tmp/znewrecord) exten => s,7,Wait(1) exten => s,8,Background(local/r-keep-or-record) ;skopiowanie plików do katalogu local/ i nadanie im unikatowych nazw plików exten => 1,1,System(/bin/mv /var/lib/asterisk/sounds/tmp/znewrecord.gsm /var/lib/ asterisk/sounds/local/${UNIQUEID}.gsm) exten => 1,2,Background(local/r-thank-you-message-saved) exten => 2,1,Goto(rejestruj-komunikaty,s,2) exten => 3,1,Playback(goodbye) exten => 3,2,Hangup

Do kontekstu [lokalni-uzytkownicy] dodajemy poniższe wiersze: ;rejestrowanie nowych komunikatów exten => 350,1,Goto(rejestruj-komunikaty,s,1)

Przeładowujemy schemat połączeń: asterisk1*CLI> dialplan reload

Teraz możemy przetestować system poprzez wybranie numeru 350. Wybranie tego numeru pozwala na odsłuchanie i ponowne nagranie nowego pliku dźwiękowego. Można to robić tak długo, aż będziemy zadowoleni z nagrania. W pojedynczej sesji można nagrać kilka nowych plików dźwiękowych bez konieczności ponownego wybierania numeru 350.

Dyskusja Jeśli rejestrujemy pliki dźwiękowe z poziomu konsoli systemu Asterisk zamiast telefonu IP podłączonego do klienckiego komputera PC, powinniśmy zdefiniować kontekst w następujący sposób: asterisk1*CLI> dial 350@rejestruj-komunikaty

5.10. Rejestrowanie niestandardowych komunikatów

|

177

Spróbujmy pokrótce przeanalizować nowy kontekst [rejestruj-komunikaty]. Numer wewnętrzny s (start) to specjalny numer, który jest wykorzystywany w przypadku, gdy dla określonego miejsca docelowego nie zostanie podana nazwa. Można to porównać do sytuacji, w której Asterisk sam odbiera telefon zamiast przekazać połączenie do użytkownika. Plikom dźwiękowym można nadawać dowolne nazwy. W przykładzie wykorzystaliśmy prefiks r-, który oznacza, że pliki są wykorzystywane do rejestrowania nowych komunikatów. Dzięki nadaniu tymczasowemu plikowi dźwiękowemu nazwy znewrecord.gsm będzie on ostatni na liście uporządkowanej alfabetycznie. Może się to przydać w sytuacji, gdyby ktoś się pogubił i chciał go szybko odszukać. System Asterisk zawiera setki plików. W związku z tym warto stosować konwencję nazewnictwa, dzięki której będą one w pewien sposób posortowane. Aplikacja Goto powoduje skoki do różnych części schematu połączeń oraz do różnych kontekstów. Jeśli ktoś jest asem programowania, prawdopodobnie nie myśli poważnie o używaniu instrukcji Goto, ale w przypadku systemu Asterisk użycie tej instrukcji zapewnia prosty sposób wielokrotnego wykorzystania kontekstów. Bez tej instrukcji nie można by było zarządzać schematami połączeń. Instrukcja Goto pobiera wiele opcji: exten => 100,1,Goto(kontekst,numer_wewnętrzny,priorytet)

W instrukcji należy co najmniej podać priorytet. Działanie domyślne polega na przejściu do numeru wewnętrznego i priorytetu w bieżącym kontekście. Osobiście wolę, jeśli wszystkie priorytety i numery wewnętrzne są jawnie określone. Aplikacja Playback odtwarza plik dźwiękowy. Domyślny katalog systemu Asterisk z plikami dźwiękowymi to /var/lib/asterisk/sounds/. W systemie Asterisk występuje założenie, że katalogi tmp/ i local/ są podkatalogami folderu /var/lib/asterisk/sounds/. Aplikacja Background odtwarza pliki dźwiękowe, które można przerwać przez wciśnięcie klawiszy. W związku z tym aplikację tę można wykorzystać do odtwarzania plików dźwiękowych z instrukcjami „wciśnij 1, wciśnij 2”. Dla aplikacji Playback i Background nie trzeba podawać rozszerzenia pliku dźwiękowego. System Asterisk automatycznie wybierze najbardziej odpowiedni dostępny plik. Wykorzystanie dwukropka w poleceniu Record, na przykład znewrecord:gsm, należy zinterpretować jako polecenie zarejestrowania nowego pliku dźwiękowego o nazwie znewrecord w formacie GSM. Dostępne są również formaty g723, g729, gsm, h263, ulaw, alaw, vox, wav oraz WAV. Formatowi WAV odpowiada symbol wav49. Jest to format WAVE skompresowany za pomocą algorytmu GSM. Pliki wav49 i GSM mają zaledwie jedną dziesiątą rozmiaru plików WAVE. Formaty gsm lub wav49 dobrze nadają się do rejestrowania komunikatów głosowych. Ich zastosowanie pozwala na zaoszczędzenie mnóstwa miejsca na dysku. GSM jest formatem darmowych komunikatów głosowych dostarczanych wraz z systemem Asterisk. Niniejsza receptura powinna pomóc w zrozumieniu, dlaczego poszczególne części schematu połączeń określa się terminem kontekstów. Numery wybierane przez użytkownika są interpretowane zgodnie z kontekstem. Znany taniec „wciśnij 1, wciśnij 2” ma swoje uzasadnienie dlatego, ponieważ wciskanie 1 i 2 działa inaczej w różnych kontekstach. Dzięki temu można wykorzystywać te same numery wielokrotnie do realizacji różnych zadań. Wartości oczekiwania (przekazywane do aplikacji wait) podaje się w sekundach. Można je dowolnie dostosować do potrzeb użytkownika. Można je również pominąć. Dzięki nim zyskujemy szansę wzięcia oddechu i przygotowania się do rozmowy. 178

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

Kiedy użytkownik wciśnie 1, aby poinformować system Asterisk, że jest zadowolony z nagrania, plik dźwiękowy zostanie skopiowany do katalogu /var/lib/asterisk/sounds/local/ pod unikatową nazwą pliku bazującą na zmiennej UNIQUEID. Plikom można zmienić nazwę na opisową.

Patrz także • opis poleceń systemu Asterisk:

http://www.voip-info.org/wiki-Asterisk+-+documentation+of+application+commands • opis zmiennych systemu Asterisk:

http://www.voip-info.org/wiki-Asterisk+variables

5.11. Definiowanie komunikatu dnia Problem Mamy w systemie kilka komunikatów, które często się zmieniają. Jest to komunikat powitalny, który słyszy abonent po wybraniu numeru, komunikat z listą dostępnych możliwości, komunikat dnia dla personelu — wszystkie te informacje trzeba często modyfikować. Potrzebny jest zatem łatwy sposób modyfikacji komunikatów oraz decydowania o tym, kto może je zmieniać.

Rozwiązanie Można utworzyć kontekst służący do słuchania i rejestrowania poszczególnych komunikatów, a następnie ochronić go hasłem. Rozpoczynamy od utworzenia katalogu przeznaczonego do przechowywania naszych komunikatów, na przykład /var/lib/asterisk/sounds/local/. Następnie rejestrujemy komunikaty z instrukcjami, używając kontekstu, który utworzono w poprzedniej recepturze. Załóżmy, że mamy komunikat zapisany w pliku store-schedule.gsm, który informuje dzwoniących o godzinach urzędowania i planie świąt. Potrzebne będą następujące instrukcje: r-schedule-welcome.gsm „Witamy w menu zarządzania harmonogramem pracy magazynu. Proszę podać swoje hasło”. r-listen-or-record.gsm „Aby odsłuchać bieżący harmonogram pracy magazynu, wciśnij 1. Aby przejść bezpośrednio do menu zarządzania rejestrowaniem, wciśnij 2”. r-record-at-tone.gsm „W celu zarejestrowania nowego harmonogramu pracy magazynu zacznij mówić po usłyszeniu sygnału. Kiedy skończysz, naciśnij krzyżyk”. r-accept-or-do-over.gsm „Aby ponownie zarejestrować komunikat, wciśnij 2. Po zakończeniu wciśnij 3”. r-thankyou-newschedule.gsm „Dziękujemy za zaktualizowanie harmonogramu pracy magazynu. Życzymy miłego dnia”. 5.11. Definiowanie komunikatu dnia

|

179

r-invalid-option.gsm „Przepraszam, ale ta opcja nie jest prawidłowa. Za chwilę usłyszysz menu od początku”. r-thankyou-new-schedule.gsm „Dziękuję za zaktualizowanie harmonogramu pracy magazynu. Do usłyszenia”. Oto kompletny przykład kontekstu [record-schedule]: [record-schedule] ;zalogowanie się użytkownika i odtworzenie istniejącego komunikatu exten => s,1,Wait(1) exten => s,2,Playback(local/r-schedule-welcome) exten => s,3,Set(TIMEOUT(digit)=5) exten => s,4,Set(TIMEOUT(response)=15) exten => s,5,Authenticate(2345) exten => s,6,Background(local/r-listen-or-record) exten => s,7,Background(local/r-accept-or-do-over) exten => 1,1,Wait(1) exten => 1,2,Playback(local/store-schedule) exten => 1,3,Goto(s,6) ;zarejestrowanie harmonogramu pracy magazynu exten => 2,1,Wait(1) exten => 2,2,Playback(local/r-record-at-tone) exten => 2,3,Wait(1) exten => 2,4,Record(local/store-schedule:gsm) exten => 2,5,Wait(1) exten => 2,6,Playback(local/store-schedule) exten => 2,7,Wait(1) exten => 2,8,Goto(s,7) ;akceptacja nowego komunikatu exten => 3,1,Playback(local/r-thankyou-new-schedule) exten => 3,2,Hangup ;zerwanie połączenia w przypadku przekroczenia limitu czasu exten => t,1,Hangup ;powrót do głównego menu w przypadku, ;gdy dzwoniący wprowadzi błędną opcję exten => i,1,Playback(local/r-invalid-option) exten => i,2,Goto(s,2)

Wewnątrz kontekstu [lokalni-uzytkownicy] należy wprowadzić poniższe instrukcje: ;zarejestrowanie nowego harmonogramu pracy magazynu exten => 351,1,Goto(record-schedule,s,1)

Od tej chwili każdy użytkownik znający hasło będzie mógł zaktualizować harmonogram pracy magazynu.

Dyskusja Dzięki zastosowaniu polecenia Authenticate konteksty można zabezpieczać hasłem. Należy pamiętać o uruchomieniu polecenia dialplan reload z wiersza poleceń systemu Asterisk po każdej modyfikacji wprowadzonej w pliku extensions.conf.

Patrz także • opis poleceń systemu Asterisk:

http://www.voip-info.org/wiki-Asterisk+-+documentation+of+application+commands 180

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

5.12. Przekazywanie połączeń Problem Chcemy zapewnić użytkownikom możliwość przekazywania połączeń.

Rozwiązanie Wystarczy dodać opcję t do definicji ich numerów wewnętrznych w pliku extensions.conf w następujący sposób: exten => 252,1,Dial(SIP/dansiew,10,t)

Aby przekazać połączenie, wystarczy wcisnąć krzyżyk na klawiaturze telefonu, a następnie wybrać numer wewnętrzny. Po wciśnięciu krzyżyka system Asterisk wygeneruje komunikat „transfer”. Następnie będzie odtwarzał ciągły sygnał do czasu wybrania numeru wewnętrznego.

Dyskusja Udostępnienie użytkownikom własności przekazywania połączeń to bardzo interesująca opcja, zwłaszcza kiedy mogą oni pomagać klientom. Konieczność ponownego dzwonienia do cyfrowej recepcjonistki w przypadku pomyłki nie jest zbyt miła dla klientów.

Patrz także • dokumentacja polecenia Dial:

http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+Dial

5.13. Kierowanie połączeń na grupę telefonów Problem Chcemy, aby dzwoniący został skierowany nie do jednej osoby, ale do wybranego wydziału, gdzie telefon odbierze pierwszy wolny pracownik; albo mamy więcej niż jeden telefon — na przykład telefon na biurku i telefon komórkowy — i chcemy, aby wszystkie dzwoniły w odpowiedzi na wywołanie.

Rozwiązanie Można utworzyć grupy dzwonienia. Oto proste instrukcje konfiguracyjne pozwalające na przypisanie grupy numerów wewnętrznych do jednego numeru: [pomoc-techniczna] exten => 380,1,Dial(SIP/604&SIP/605&SIP/606,40,t) exten => 380,2,VoiceMail(220@lokalni-uzytkownicy-pg)

Dzwoniący wybiera numer wewnętrzny 380. Wszystkie wymienione numery wewnętrzne dzwonią jednocześnie. Jeśli nikt nie odpowie w ciągu 40 sekund, połączenie jest przekazywane 5.13. Kierowanie połączeń na grupę telefonów

|

181

do poczty głosowej. Aby ten mechanizm mógł poprawnie działać, należy wcześniej zdefiniować numery wewnętrzne 604, 605 i 606 oraz skonfigurować skrzynkę poczty głosowej. Przekazywanie włącza polecenie składające się z małej litery t. Oto przykład dzwonienia najpierw na telefon biurkowy, a następnie na telefon komórkowy. [znajdz-karola] exten => 100,1,Dial(SIP/350,20,t) exten => 100,2,Dial(Zap/1/1231234567,20,t) exten => 100,3,VoiceMail(350@lokalni-uzytkownicy-pg)

Jeśli pierwszy numer nie odpowiada, Asterisk próbuje połączyć się z drugim numerem. Jeśli Karol właśnie leniuchuje i nie odbiera żadnego z telefonów, połączenie jest kierowane na skrzynkę głosową. Można tak skonfigurować telefony, aby dzwoniły jednocześnie: exten => 100,1,Dial(SIP/350&Zap/1/1231234567,20) exten => 100,2,VoiceMail(350@lokalni-uzytkownicy-pg)

Dyskusja Niniejsza receptura pokazuje, że numery wewnętrzne i skrzynki poczty głosowej nie muszą być te same. Polecenie Dial pozwala na wybieranie dowolnych numerów — tak samo jak ręcznie. Jeśli serwer Asterisk pozwala na wybranie jakiegoś numeru, można go wybrać za pomocą polecenia Dial. Z technicznego punktu widzenia operacja ta nie ma nic wspólnego z wybieraniem numeru. Stara terminologia bardzo się zakorzeniła. Zabawne, prawda?

Patrz także • dokumentacja polecenia Dial:

http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+Dial

5.14. Parkowanie połączeń Problem Sprawa dotyczy pracowników często zmieniających miejsce w trakcie pracy. Czasami otrzymują pytanie i żeby na nie odpowiedzieć, muszą przejść do innego pokoju. Oznacza to, że dzwoniący przez długi czas oczekuje na połączenie. Czyż nie byłoby miło, gdyby można było przekazać połączenie i odebrać je w nowej lokalizacji?

Rozwiązanie Pewnie, że byłoby miło — i na szczęście można to zrobić. W systemie Asterisk jest 20 zarezerwowanych miejsc parkingowych. Są to numery 701 – 720. Aby uaktywnić miejsce parkingowe, należy dodać kontekst parkedcalls do pożądanego wewnętrznego kontekstu, na przykład użytego w tym rozdziale kontekstu [lokalni-uzytkownicy]: [lokalni-uzytkownicy] include => parkedcalls

182

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

Należy pamiętać o dodaniu możliwości przekazywania połączeń. Do tego celu służy opcja t: exten => 252,1,Dial(SIP/dansiew,10,t)

Włączenie funkcji parkowanych połączeń wymaga zrestartowania serwera: asterisk1*CLI> restart gracefully

Aby przetestować nową funkcję, wywołamy własny numer wewnętrzny. Łatwym sposobem na to, by to zrobić, jest podłączenie do testowego komputera PC drugiego telefonu programowego, skonfigurowanego z innym kontem użytkownika. Do testowania funkcji systemu Asterisk nadają się również telefony komórkowe. Spróbujmy przekazać połączenie pod numer wewnętrzny 700. System Asterisk automatycznie zaparkuje je w pierwszym wolnym miejscu. System poinformuje nas o numerze zaparkowanego połączenia — aby je wznowić, wystarczy podnieść słuchawkę w innym miejscu i wybrać ten numer. W przypadku przekroczenia limitu czasu system zadzwoni pod numer wewnętrzny wybrany pierwotnie. Połączenie będzie tam interpretowane jak każde inne połączenie. Jeśli nie będzie odpowiedzi, połączenie zostanie przekazane do poczty głosowej. W przypadku użycia opcji oznaczonej małą literą t osoba odbierająca połączenie będzie mogła je przekazać. Oznacza to, że każde połączenie można zaparkować tylko raz. W przypadku użycia opcji oznaczonej wielką literą T, tak jak pokazano poniżej: exten => 252,1,Dial(SIP/dansiew,10,tT)

możliwość przekazywania będzie dostępna zarówno dla strony odbierającej, jak i wybierającej. Dzięki temu po wznowieniu zaparkowanego połączenia będzie można zaparkować je i przekazać jeszcze raz.

Dyskusja Parkowanie połączeń konfiguruje się w pliku /etc/asterisk/features.conf. Chociaż dostępnych jest wiele konfigurowalnych opcji, jedyna, która naprawdę ma znaczenie dla większości osób, to opcja parkingtime pozwalająca na skonfigurowanie wartości limitu czasu. Wartość domyślna wynosi 45 sekund. Oznacza to, że w przypadku, gdy abonent nie odbierze połączenia z innego aparatu w ciągu 45 sekund, nastąpi ponowna próba nawiązania połączenia z pierwotnym numerem.

Patrz także • przykładowy plik /etc/asterisk/features.conf

5.15. Personalizacja muzyki odtwarzanej w trakcie oczekiwania na połączenie Problem Chcemy dodać własne pliki muzyczne do utworów odtwarzanych w czasie oczekiwania na połączenie lub całkowicie zastąpić inną muzyką pliki dźwiękowe dostarczane wraz z systemem Asterisk. 5.15. Personalizacja muzyki odtwarzanej w trakcie oczekiwania na połączenie

|

183

Rozwiązanie Nic prostszego. Wystarczy wgrać własne pliki dźwiękowe w formacie WAVE lub GSM do katalogu /var/lib/asterisk/moh. Następnie należy skonfigurować plik /etc/asterisk/musiconhold w następujący sposób: [default] mode=files directory=/var/lib/asterisk/moh random=yes

Następnie skonfigurujemy testowy kontekst w celu przetestowania muzyki odtwarzanej podczas oczekiwania: exten exten exten exten

=> => => =>

1000,1,Answer 1000,n,SetMusicOnHold(default) 1000,n,WaitMusicOnHold(30) 1000,n,Hangup

Modyfikacje muzyki odtwarzanej podczas oczekiwania wymagają restartu serwera: asterisk1*CLI> restart gracefully

Aby usłyszeć zmodyfikowaną muzykę, wybieramy numer 1000. Muzyka będzie odtwarzana przez 30 sekund. Po tym czasie nastąpi rozłączenie.

Dyskusja Muzyka w trakcie oczekiwania jest opcją, która jest domyślnie włączona na poziomie globalnym. W związku z tym nie trzeba jej jawnie włączać.

Patrz także • dokumentacja polecenia systemu Asterisk Musiconhold:

http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+Musiconhold

5.16. Odtwarzanie w systemie Asterisk plików dźwiękowych MP3 Problem Chcemy, aby podczas oczekiwania na połączenie była odtwarzana muzyka w formacie MP3, a nie WAVE czy też GSM. System Asterisk nie chce jednak ich odtwarzać. Co zrobić, aby można było skorzystać z plików w tym formacie?

Rozwiązanie Należy pobrać pakiet asterisk-addons, w którego skład wchodzi odtwarzacz systemu Asterisk format_mp3. Aby zainstalować ten odtwarzacz, należy postępować zgodnie z instrukcjami zamieszczonymi w pliku /usr/src/asterisk-addons-1.4.[version]/format_mp3/README. Po zainstalowaniu odtwarzacza można bez problemu odtwarzać pliki MP3. 184

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

Odtwarzanie plików MP3 wymaga więcej cykli procesora w porównaniu z plikami WAVE lub GSM, dlatego nie należy z nich korzystać w systemach o ograniczonych zasobach. Pliki MP3 można z łatwością przekształcić na format WAVE. Do tego celu można wykorzystać program lame: $ lame --decode musicfile.mp3 musicfile.wav

Aby dokonać konwersji wszystkich plików MP3 z bieżącego katalogu, można użyć następujących instrukcji: $ for i in *.mp3; do lame --decode $i 'basename $i .mp3'.wav; done

Patrz także • man lame

5.17. Przesyłanie komunikatów za pomocą poczty głosowej w trybie rozgłoszeniowym Problem Chcemy za pomocą pojedynczego połączenia przesłać komunikaty motywujące dla całego personelu. Chcemy przekazać wszystkim użytkownikom ważne informacje. Tak czy inaczej, potrzebna jest funkcja pozwalająca na skonfigurowanie grup poczty głosowej w celu odbierania wiadomości w trybie rozgłoszeniowym.

Rozwiązanie W systemie Asterisk to łatwe. Najpierw należy utworzyć grupę skrzynek pocztowych w pliku /etc/asterisk/voicemail.conf: ;rozgłoszeniowa skrzynka pocztowa 375 => 1234,StaffGroup

Następnie utworzymy numer wewnętrzny w pliku /etc/asterisk/extensions.conf zawierający wszystkie skrzynki pocztowe należące do grupy: ;numer wewnętrzny do przesyłania wiadomości głosowych w trybie rozgłoszeniowym exten => 300,1,VoiceMail(375@lokalni-uzytkownicy-pg&250@lokalni-uzytkownicypg&251@lokalni-uzytkownicy-pg&252@lokalni-uzytkownicy-pg)

Teraz wystarczy jedynie zadzwonić pod numer wewnętrzny 375 i nagrać swoją wiadomość. Będzie ona skopiowana do wszystkich skrzynek pocztowych w grupie. Przydatną opcją jest usunięcie głównej wiadomości głosowej po przesłaniu jej do grupy. Robi się to w następujący sposób: 375 => 1234,StaffGroup,,,delete=1

Dyskusja Konteksty służące do definiowania kont poczty głosowej składają się z czterech pól: numer_wewnętrzny => hasło_poczty_głosowej,nazwa_uzytkownika,adres_email_uzytkownika, adres_pagera_uzytkownika,opcje_uzytkownika

5.17. Przesyłanie komunikatów za pomocą poczty głosowej w trybie rozgłoszeniowym

|

185

Minimalny zestaw opcji do zdefiniowania skrzynki głosowej to numer_wewnętrzny => hasło_ do_skrzynki_głosowej, nazwa_użytkownika. Dla wszystkich pominiętych pól należy umieścić przecinek. Oto przykład kontekstu, który powoduje przesłanie użytkownikowi kopii wiadomości głosowej dołączonej do wiadomości e-mail: 103 => 1234,Jan Gustawski,[email protected],,attach=yes

Aby użyć więcej niż jednej opcji użytkownika, należy rozdzielić poszczególne opcje za pomocą symbolu potoku: 103 => 1234,Jan Gustawski,[email protected],,attach=yes|delete=1

Jeśli wiadomości głosowe mają być przesyłane do użytkowników pocztą elektroniczną, można skorzystać ze skompresowanego formatu pliku dźwiękowego wav49. Pliki w tym formacie mają rozmiar równy jednej dziesiątej nieskompresowanych plików WAVE.

Patrz także • dokumentacja pliku konfiguracyjnego systemu Asterisk voicemail.conf:

http://www.voip-info.org/wiki/index.php?page=Asterisk+config+voicemail.conf • przykładowy plik voicemail.conf

5.18. Obsługa konferencji z wykorzystaniem systemu Asterisk Problem Jeden z powodów, dla których jest wykorzystywany system Asterisk, to niedroga i prosta obsługa konferencji. Komercyjne usługi konferencji są kosztowne, zaimplementowanie ich z użyciem tradycyjnych systemów PBX z reguły jest trudne. A zatem w jaki sposób definiuje się obsługę konferencji w systemie Asterisk?

Rozwiązanie Można wyróżnić dwa rodzaje konferencji: lokalne konferencje wewnątrz sieci LAN oraz konferencje z osobami spoza firmy. Wykorzystanie konferencji (lub funkcji meetme, jak się ją często nazywa) wewnątrz sieci LAN jest bardzo proste. Oto przykładowy plik konfiguracyjny /etc/asterisk/meetme.conf, który konfiguruje trzy pokoje konferencyjne: ;;/etc/asterisk/meetme.conf [general] [konferencje] ; sposób użycia: conf => [numer konferencji][,kod_pin] ; Użycie kodów Pin jest opcjonalne. conf => 8000,1234 conf => 8001,4567 conf => 8002,7890

Tworzymy numery wewnętrzne dla pokojów konferencyjnych wewnątrz kontekstu [lokalni-uzytkownicy] w pliku /etc/asterisk/extensions.conf: 186

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

;pokoje konferencyjne 8000, 8001, 8002 exten => 8000,1,Meetme(${EXTEN}) exten => 8001,1,Meetme(${EXTEN}) exten => 8002,1,Meetme(${EXTEN},,7890)

Przeładowujemy schemat połączeń tak jak zwykle: asterisk1*CLI> dialplan reload

Teraz możemy przetestować nowe pokoje konferencyjne. Pozdrowi nas głos Allison Smith, która poprosi nas o podanie kodu PIN i powie, ile osób jest obecnych na konferencji. W przykładzie kod PIN dla pokoju 8002 jest wprowadzany automatycznie. Co zrobić, jeśli w konferencji mają wziąć udział osoby spoza sieci LAN? Jeśli tylko mają oni informacje o numerze konferencji i kodzie PIN, a wchodzący kontekst obejmuje numer wewnętrzny pokoju konferencyjnego, wystarczy, że zadzwonią do naszego biura w zwyczajny sposób, a następnie wprowadzą numer wewnętrzny i kod PIN.

Dyskusja Numer wewnętrzny skonfigurowany do wybierania pokoju konferencyjnego nie musi być taki sam jak numer pokoju konferencyjnego, ponieważ ten ostatni jest opcją aplikacji MeetMe: exten => 100,1,Meetme(8000)

Inny sposób konfiguracji pokojów konferencyjnych polega na utworzeniu pojedynczego numeru wewnętrznego dla wszystkich pokojów konferencyjnych, na przykład: exten => 8000,1,Meetme()

Tego pojedynczego numeru wewnętrznego dla wszystkich pokojów konferencyjnych można używać dlatego, ponieważ system zada użytkownikom pytanie zarówno o numer pokoju, jak i kod PIN. Dostęp można ograniczyć jeszcze bardziej za pomocą kontekstów. Na przykład można zdefiniować dwa oddzielne konteksty użytkownika, a każdej z grup zostanie przypisany oddzielny pokój konferencyjny: [programisci] exten => 8001,1,Meetme(${EXTEN}) [ksiegowosc] exten => 8002,1,Meetme(${EXTEN})

Patrz także • przykładowy plik meetme.conf • dokumentacja aplikacji MeetMe systemu Asterisk:

http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+MeetMe

5.19. Monitorowanie konferencji Problem Chcemy mieć możliwość kontrolowania konferencji i mieć władzę administratora umożliwiającą uciszenie niektórych użytkowników konferencji, a nawet ich usunięcie z konferencji. 5.19. Monitorowanie konferencji

|

187

Rozwiązanie Można skorzystać z polecenia meetme z wiersza poleceń systemu Asterisk. Dostępne opcje można zobaczyć po wyświetleniu polecenia help: asterisk1*CLI> help meetme Usage: meetme (un)lock|(un)mute|kick|list [concise] Executes a command for the conference or on a conferee

Poniższe polecenie wyświetla wszystkie trwające konferencje: asterisk1*CLI> Conf Num 8001 * Total number

meetme Parties Marked 0002 N/A of MeetMe users: 2

Activity 00:01:10

Creation Static

Poniższe polecenie wyświetla użytkowników konferencji: asterisk1*CLI> meetme list 8001 User #: 01 250 Eliza Rogacka (unmonitored) 00:01:58 User #: 02 252 Daniel Siewnicki (unmonitored) 00:01:46 2 users in that conference.

Channel: SIP/eliza-08d6dc20 Channel: SIP/daniel-08d86350

Wydanie polecenia meetme lock blokuje użytkownikom możliwość dołączenia do konferencji. Aby usunąć (kick) bądź wyciszyć (mute) użytkownika, należy posłużyć się numerem konferencji oraz numerem wewnętrznym użytkownika: asterisk1*CLI> meetme kick 8001 02

Dyskusja Miejmy nadzieję, że nasi użytkownicy nie będą wymagali tego rodzaju niańczenia i że będziemy musieli zajmować się wyłącznie rozwiązywaniem problemów technicznych — na przykład brakiem rozłączenia użytkownika po opuszczeniu konferencji.

Patrz także • przykładowy plik meetme.conf • dokumentacja aplikacji MeetMe systemu Asterisk:

http://www.voip-info.org/wiki/index.php?page=Asterisk+cmd+MeetMe

5.20. Przesyłanie ruchu SIP przez zapory firewall z funkcją NAT Problem Mamy kłopoty z ruchem SIP, ponieważ trudno przesyłać go przez zapory firewall z funkcją NAT. Moglibyśmy umieścić serwer Asterisk w strefie DMZ, ale do tego byłby potrzebny wolny rutowalny publiczny adres IP. Moglibyśmy również użyć swego rodzaju serwera proxy dla ruchu SIP, ale z takim rozwiązaniem wiążą się inne problemy. Czy nie można by po prostu przerzucić tych pakietów SIP przez naszą zaporę firewall iptables z funkcją NAT za pomocą funkcji śledzenia połączeń (ang. connection tracking)? 188

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

Rozwiązanie Tak, jest to możliwe dzięki nowemu dla zapory iptables modułowi śledzenia połączeń SIP. Jest on dostarczany wraz z jądrem Linuksa 2.6.18. Można też użyć modułu Patch-O-Matic wchodzącego w skład pakietu Netfilter w celu dołączenia modułu do starszych jąder. Użytkownicy jądra w wersji 2.6.18 lub nowszej mogą sprawdzić w pliku /boot/config-[wersja_jądra], czy śledzenie połączeń SIP zostało włączone. Należy poszukać następujących linijek: CONFIG_IP_NF_NAT_SIP=y CONFIG_IP_NF_SIP=y

Jeśli te magiczne linijki są w naszym pliku, wówczas wystarczy jedynie wprowadzić kilka reguł do skryptu konfigurującego zaporę iptables i załadować moduły jądra. Poniższy przykład dotyczy samodzielnej zapory firewall NAT oraz routera, który przekazuje ruch SIP do osobnego serwera Asterisk znajdującego się pod prywatnym adresem IP 192.168.1.25. W przykładzie tym zastosowano konwencje zaprezentowane w rozdziale 3.: $ipt -t nat -A PREROUTING -p tcp -i $WAN_IFACE --dport 5060 -j DNAT --to-destination 192.168.2.25:5060 $ipt -A FORWARD -p tcp -i $WAN_IFACE -o $DMZ_IFACE -d 192.168.2.25 --dport 5060 -j ACCEPT

Poniższe reguły dotyczą serwera Asterisk z publicznym adresem IP, który jest bezpośrednio podłączony do internetu: $ipt -A INPUT -p udp --dport 5060 -j ACCEPT $ipt -A FORWARD -o eth0 -p udp --dport 5060 -j ACCEPT

Aby załadować moduły, należy umieścić poniższe wiersze w skrypcie konfigurującym zaporę iptables: modprobe ip_conntrack_sip modprobe ip_nat_sip

Teraz wystarczy jedynie przeładować reguły iptables.

Dyskusja Jeśli jądro nie obsługuje własności śledzenia połączeń SIP, można je zaktualizować (dotyczy to jąder w wersji 2.6.11 i nowszej). Potrzebne są kompletne źródła jądra (nie same nagłówki), jądro w wersji 2.6.11 lub nowszej oraz kod źródłowy zapory iptables. Pominę opis konfiguracji środowiska kompilacji jądra. Listę materiałów referencyjnych dotyczących tego tematu można znaleźć w punkcie „Patrz także”. Po skonfigurowaniu środowiska kompilacji jądra należy pobrać z witryny Netfilter.org (http:// netfilter.org/projects/iptables/downloads.html) archiwum tarball z aktualną stabilną wersją kodu źródłowego. Należy sprawdzić sumę kontrolną md5sum i rozpakować archiwum w dowolnym katalogu. Następnie trzeba pobrać najnowszą wersję narzędzia Patch-O-Matic (ftp://ftp.netfilter.org/pub/ patch-o-matic-ng/snapshot/snapshot). Znów sprawdzamy sumę kontrolną md5sum, rozpakowujemy archiwum tarball w dowolnym, wybranym katalogu i przechodzimy do jego katalogu głównego. Następnie instalujemy łatkę sip-conntrack-nat do źródeł jądra za pomocą polecenia pokazanego poniżej. W poleceniu należy umieścić ścieżki dostępu do kodów źródłowych jądra i zapory iptables: $ ./runme sip-conntrack-nat /home/karol/lib/iptables/ Hey! KERNEL_DIR is not set.

5.20. Przesyłanie ruchu SIP przez zapory firewall z funkcją NAT

|

189

Where is your kernel source directory? [/usr/src/linux] Hey! IPTABLES_DIR is not set. Where is your iptables source code directory? [/usr/src/iptables] Welcome to Patch-o-matic ($Revision$)!

Wyświetli się kilka komunikatów informacyjnych, a następnie taki oto komunikat: The SIP conntrack/NAT modules support the connection tracking/NATing of the data streams requested on the dynamic RTP/RTCP ports, as well as mangling of SIP requests/responses. ----------------------------------------------------------------Do you want to apply this patch [N/y/t/f/a/r/b/w/q/?]

Aby zainstalować łatkę, wystarczy wpisać y. Teraz trzeba skompilować nowe jądro. Podczas konfigurowania jądra należy pamiętać o zaznaczeniu opcji obsługi protokołu SIP (Networking/Networking support/Networking options/ Network packet filtering/IP: Netfilter Configuration. Teraz trzeba jeszcze zainstalować nowe jądro oraz stworzyć i ponownie załadować reguły iptables. W dystrybucji CentOS można zainstalować pliki źródłowe zapory iptables za pomocą menedżera pakietów Yum: # yum install iptables-devel

W dystrybucji Debian należy uruchomić poniższe polecenie: # apt-get install iptables-dev

Patrz także • każda dystrybucja Linuksa ma własne narzędzia do kompilacji jądra — użytkownicy

dystrybucji Debian znajdą odpowiednie wskazówki w rozdziale 7. podręcznika Debian Reference Manual (http://www.debian.org/doc/manuals/reference/ch-kernel.en.html); użytkownicy dystrybucji CentOS (a także Red Hat i Fedora) mogą sięgnąć do informacji zawartych w uwagach do wersji (ang. release notes)

• rozdział 10. „Łatanie, modyfikacje i aktualizacje jądra” z książki Carli Schroder Linux.

Receptury (Helion, 2005)

• dodatek C

5.21. Przesyłanie ruchu IAX przez zapory firewall z funkcją NAT Problem Chcemy się dowiedzieć, jakie reguły należy zastosować, aby można było przekazywać ruch IAX przez zapory firewall iptables.

Rozwiązanie Dla serwera Asterisk umieszczonego za samodzielną zaporą firewall iptables i routerem należy skorzystać z poniższych reguł: 190

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

$ipt -t nat -A PREROUTING -p tcp -i $WAN_IFACE --dport 4569 -j \ DNAT --to-destination 192.168.2.25:4569 $ipt -A FORWARD -p tcp -i $WAN_IFACE -o $DMZ_IFACE -d 192.168.2.25 \ --dport 4569 -j ACCEPT

Poniższe reguły dotyczą serwera Asterisk z publicznym adresem IP, który jest bezpośrednio podłączony do internetu i jest chroniony przez zaporę firewall iptables: $ipt -A INPUT -p udp --dport 4569 -j ACCEPT $ipt -A FORWARD -o eth0 -p udp --dport 4569 -j ACCEPT

Teraz wystarczy jedynie ponownie załadować reguły iptables. W przykładach wykorzystano konwencje zaprezentowane w rozdziale 3.

Dyskusja IAX to macierzysty protokół systemu Asterisk. Jest wydajny i łatwy do obsługi w zaporach firewall. Pozwala na przenoszenie kilku połączeń SIP w jednym łączu IAX.

Patrz także • rozdział 3.

5.22. Korzystanie z pakietu AsteriskNOW. System Asterisk w 30 minut Problem Nie obawiamy się wiersza poleceń lub edycji plików tekstowych, ale administracja serwerem Asterisk w taki sposób wydaje się trudna. Jest wiele komplikacji i okazji do popełnienia błędów. Czy nie istnieje dobry, czytelny graficzny interfejs pozwalający na administrację systemem Asterisk? Taki, który można by było łatwo zainstalować i który pozwalałby na wprowadzanie modyfikacji za pośrednictwem interfejsu GUI i plików tekstowych bez konfliktów?

Rozwiązanie Rzeczywiście jest takie narzędzie. Jest to produkt firmy Digium. AsteriskNOW to pakiet programów zawierający system operacyjny, system Asterisk oraz dobry interfejs graficzny działający w przeglądarce WWW, pozwalający na administrację serwerem Asterisk i systemem operacyjnym. Obraz instalacji można pobrać w witrynie AsteriskNOW.org (http://www.asterisknow.org/). Do wyboru jest kilka różnych obrazów — dla platform x86-32 i x86-64 gościnny obraz pakietu Xen, gościnny obraz pakietu VMWare oraz obraz wersji liveCD. Program instalacyjny potrzebuje danych serwera DHCP. Aby znaleźć jego adres IP, należy się zalogować na serwerze, wykorzystując nazwę użytkownika admin i hasło password. Adres IP serwera powinien się wyświetlić na konsoli. Jeśli się nie wyświetli — ponieważ wszyscy wiedzą, że Asterisk ewoluuje szybciej od stworów z literatury science fiction — należy skorzystać z polecenia ifconfig. 5.22. Korzystanie z pakietu AsteriskNOW. System Asterisk w 30 minut

|

191

Wciśnięcie klawiszy Alt+F9 powoduje przejście do znajomego wiersza poleceń systemu Asterisk, natomiast aby powrócić do menu konsoli, należy wcisnąć Alt+F1. Spróbujmy teraz zalogować się do programu administracyjnego, używając przeglądarki WWW na sąsiednim komputerze PC. Wystarczy uruchomić przeglądarkę Firefox i przejść do adresu https://[adres_ip]. Wyświetli się szereg budzących respekt ostrzeżeń dotyczących certyfikatu serwera. Należy zaakceptować certyfikat i kontynuować. Logujemy się do aplikacji, korzystając z konta admin i hasła password. Nie jest to to samo konto użytkownika admin, z którego korzystaliśmy na konsoli serwera, lecz konto użytkownika admin programu administracyjnego działającego w przeglądarce. Program poprosi nas o zmianę hasła. Po wykonaniu tej czynności należy ponownie się zalogować i uruchomić kreatora konfiguracji. Aby rozpocząć eksplorację interfejsu, należy szybko przejść przez kreatora instalacji. Kliknięcie opcji System Configuration w górnym prawym rogu interfejsu GUI systemu AsteriskNOW powoduje przejście do panelu sterowania systemem Linux rPath. W tym programie jest trzeci, odrębny użytkownik admin. Serwer SSH jest uruchomiony domyślnie, zatem można się zdalnie zalogować, używając następującego polecenia: $ ssh admin@[adres_ip]

W pakiecie AsteriskNOW jest domyślnie ustawione puste hasło użytkownika root. Dla większości zadań można skorzystać z polecenia sudo, ale mimo to na serwerze powinno być ustawione hasło użytkownika root. Aby je utworzyć z poziomu konsoli AsteriskNOW, można skorzystać z następującego polecenia: [admin@localhost ~]$ sudo passwd root

Dyskusja Używanie polecenia sudo w sposób, w jaki je skonfigurowano w systemie AsteriskNOW, jest wygodne. Trzeba zapamiętać tylko jedno hasło, a wszystkie polecenia sudo są rejestrowane. Mimo wszystko potrzebne jest jednak rzeczywiste hasło użytkownika root. Z poleceniem sudo nie działają wszystkie komendy, ponieważ niektóre polecenia i skrypty nie potrafią obsłużyć zapytania o hasło wyświetlane sudo. Co ważniejsze, w systemie plików ext3 5 procent objętości systemu plików jest przeznaczona wyłącznie dla użytkownika root. Dzięki temu użytkownik root może odtworzyć system w przypadku, gdy procesy użytkowników wymknęły się spod kontroli i spowodowały zapełnienie całego systemu plików. Pakiet AsteriskNOW jest wyposażony w narzędzie, które pozwala za pomocą jednego kliknięcia zakupić i skonfigurować usługę VoicePulse. Można też zaktualizować darmową wersję systemu AsteriskNOW do zapewniającej pomoc techniczną wersji Asterisk Business Edition. Wraz z kolejnymi wydaniami i aktualizacjami pakietu AsteriskNow należy oczekiwać jego lepszej integracji ze sprzętem i dostawcami usług.

Patrz także • tu można znaleźć strony Wiki, fora i wiele przydatnych informacji — pomoc techniczna

systemu AsteriskNOW: http://www.asterisknow.org/support

192

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

5.23. Instalowanie i usuwanie pakietów w systemie AsteriskNOW Problem Pomimo tego, że AsteriskNOW działa pod kontrolą systemu Linux, nie jest to taki Linux, jaki znamy. Co prawda przypomina nieco dystrybucję Red Hat, ale jest pozbawiony poleceń RPM lub Yum pozwalających na instalowanie i usuwanie pakietów. Pakiet wykorzystuje znajomą powłokę Bash, a w katalogach /bin i /sbin można znaleźć znajome polecenia systemu Linux. Zatem w jaki sposób można zarządzać programami?

Rozwiązanie AsteriskNOW wykorzystuje rPath Linux — specjalizowaną dystrybucję Linuksa przeznaczoną do tworzenia urządzeń programowych takich jak AsteriskNOW. Dystrybucję tę zaprojektowano w taki sposób, aby można ją było łatwo spersonalizować. W jej skład wchodzą tylko te pakiety, które są niezbędne do uruchomienia urządzenia. Wykorzystano w niej system zarządzania pakietami Conary. Daje on dostęp do niestandardowych repozytoriów pakietów i ma własne polecenia. Poniższe polecenia powodują wyświetlenie skróconej i rozszerzonej listy pomocy: [admin@localhost ~]$ conary [admin@localhost ~]$ conary help

Za pomocą tego polecenia można wyświetlić wszystkie pakiety zainstalowane w systemie: [admin@localhost ~]$ conary query | less

Polecenie grep ułatwia znalezienie określonego zainstalowanego programu: [admin@localhost ~]$ conary query | grep speex speex=1.1.10-2-0.1

Aby uzyskać informację o zainstalowanym pakiecie, należy skorzystać z polecenia następującej postaci: admin@localhost ~]$ conary q speex --info

W systemie Conary zależności i powiązane pakiety określa się terminem skarby (ang. troves). Zainstalowane skarby można wyświetlić za pomocą poniższego polecenia: admin@localhost ~]$ conary q speex --troves

To polecenie wyświetla wszystkie skarby — łącznie z tymi, które nie są zainstalowane: [admin@localhost ~]$ conary q speex --all-troves

Poniższe polecenie wyświetla zależności: [admin@localhost ~]$ conary q speex --deps

Aby obejrzeć pakiety dostępne do zainstalowania, można skorzystać z następującego polecenia: [admin@localhost ~]$ conary rq | less

To polecenie instaluje nowy pakiet bądź aktualizuje pakiet zainstalowany: [admin@localhost ~]# conary update [nazwa_pakietu]

5.23. Instalowanie i usuwanie pakietów w systemie AsteriskNOW

|

193

To polecenie usuwa pakiet: [admin@localhost ~]# conary erase [nazwa_pakietu]

Poniższe polecenie aktualizuje cały system: [admin@localhost ~]# conary updateall

Dyskusja Działający w przeglądarce internetowej panel sterowania dystrybucją rPath pozwala na zarządzanie konfiguracją sieci, kopiami zapasowymi, aktualizacjami, hasłami użytkownika admin oraz ustawieniami daty i godziny. Wszystkie pozostałe elementy można konfigurować za pomocą poleceń wydawanych z wiersza poleceń.

Patrz także • kompletny podręcznik administracji można znaleźć w serwisie internetowym systemu

Conary: http://wiki.rpath.com/wiki/index.php/Conary:User

5.24. Połączenia dla osób będących w podróży oraz zdalnych użytkowników Problem Chcemy, aby pracownicy będący w podróży służbowej mogli się zalogować na serwerze Asterisk z dowolnego miejsca. Mamy też grupę przyjaciół i członków rodziny, z którymi chcielibyśmy współdzielić nasz serwer. Dzięki temu moglibyśmy pozostawać w kontakcie i uniknąć ponoszenia wydatków.

Rozwiązanie Zdalni użytkownicy będą potrzebowali kont SIP lub IAX na naszym serwerze, szerokopasmowego połączenia z internetem, a serwer musi być dostępny z internetu. Będzie też potrzebny programowy telefon IP, adapter telefonów analogowych — na przykład IAXy (wymawia się „iksi”) firmy Digium lub Linksys Sipura SPA-1001 albo sprzętowy telefon IP. Telefony IAXy i SPA-1001 są trudne w konfiguracji, ale łatwe w użytkowaniu. Wykorzystanie telefonów programowych oznacza, że użytkownicy będą potrzebowali własnych komputerów ze sprzętem dźwiękowym i dostępem do szerokopasmowego internetu. Jeśli znajdują się za zaporami firewall, trzeba będzie tak je skonfigurować, aby był dozwolony ruch VoIP. Należy postępować zgodnie ze wskazówkami w punkcie 5.6. Trzeba się upewnić, że na serwerze jest dostępny prawidłowy, rutowany publicznie adres IP. Urządzenia IAXy i SPA-1001 są bardzo małe, zatem użytkownicy mogą bez trudu z nimi podróżować. Do korzystania z nich potrzebne są telefony analogowe oraz szerokopasmowy dostęp do internetu. W adapterach IAXy jest wykorzystywany protokół IAX. Cena urządzenia wynosi około 250 zł. SPA-1001 to urządzenie wykorzystujące protokół SIP. Kosztuje około

194

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

180 zł. Do obydwóch są dołączone szczegółowe instrukcje konfiguracji. Serwer Asterisk obsługuje zarówno protokół IAX, jak i SIP, zatem dowolne z tych urządzeń będzie działać. Dobrej jakości telefony sprzętowe kosztują od 250 zł. Są to zazwyczaj duże, obsługujące kilka linii telefony biurkowe, które niezbyt nadają się dla pracowników mobilnych. Mogą być jednak dobrymi prezentami dla mamy lub taty. Są łatwe w użytkowaniu i gwarantują dobrą jakość dźwięku. Niezbyt wiele telefonów sprzętowych obsługuje protokół IAX, zatem trzeba będzie skonfigurować konta SIP dla mamy lub taty.

Dyskusja Podczas konfigurowania tych zdalnych kont należy zachować ostrożność, tak by nie udostępniać światu wewnętrznych lub zewnętrznych usług telefonicznych. Jeśli nasz serwer jest wyposażony w zakończenie PSTN, zdalni użytkownicy będą mieli dostęp za darmo do lokalnego numeru kierunkowego oraz wszystkich innych usług, do których udzielimy im odstępu. Receptury w niniejszym rozdziale pokazują, w jaki sposób można oddzielić usługi i uprawnienia.

Patrz także • informacje i opinie użytkowników na temat specyficznych produktów można uzyskać

w serwisie VoIP-info.org (http://voip-info.org/wiki/) oraz na listach mailingowych systemu Asterisk (http://www.voip-info.org/wiki-Asterisk+Mailing+Lists) • poniżej zamieszczono listę witryn, gdzie można uzyskać porady na temat zakupów:

VoIP Supply: http://www.voipsupply.com Telephonyware.com http://www.telephonyware.com/

5.24. Połączenia dla osób będących w podróży oraz zdalnych użytkowników

|

195

196

|

Rozdział 5. Tworzenie serwera VoIP za pomocą systemu Asterisk

ROZDZIAŁ 6.

Routing z wykorzystaniem systemu Linux

6.0. Wprowadzenie Linux na standardowym sprzęcie może swobodnie pełnić funkcję routera w małych i średnich sieciach. W niskiej i średniej klasy routerach komercyjnych jest wykorzystywany sprzęt porównywalny do standardowego sprzętu PC. Różnią się one przede wszystkim pod względem obudowy i firmware. Routery wykorzystujące systemy operacyjne czasu rzeczywistego, na przykład Cisco IOS, w warunkach dużych obciążeń zapewniają nieco lepszą wydajność w porównaniu z routerami na bazie Linuksa. Duże firmy, w których stosowane są rozbudowane i złożone tabele routingu, a także dostawcy usług internetowych, wymagają sprzętu do obsługi dużych obciążeń. Pozostałych użytkowników powinno zadowolić tanie rozwiązanie. Nie oznacza to, że należy stosować sprzęt złej jakości — to zawsze jest zły pomysł. Po prostu nie trzeba wydawać fortuny, żeby zapewnić sobie proste funkcje routingu, takie jak te, które opisano w niniejszym rozdziale. Routery z najwyższej półki wykorzystują specjalistyczny sprzęt przeznaczony do przenoszenia maksymalnej liczby pakietów na sekundę. Są one wyposażone w wiele szerokich szyn danych, wiele procesorów oraz pamięć TCAM (Ternary Content Addressable Memory). Pamięć TCAM jest kilkakrotnie szybsza od najszybszych pamięci RAM i wielokrotnie droższa. Nie stosuje się jej w tańszych urządzeniach. Żadne oprogramowanie nie jest w stanie zapewnić przekazywania pakietów tak szybko, jak odbywa się to w pamięci TCAM. Jednak dla większości administratorów nie stanowi to problemu, ponieważ za zapewnienie obsługi dużych obciążeń odpowiedzialni są dostawcy usług internetowych. W sieci pod kontrolą przeciętnego administratora tabele routingu są niewielkich rozmiarów, ponieważ dotyczą tylko kilku połączonych ze sobą podsieci. W tym rozdziale pokażemy, w jaki sposób zrealizować statyczny routing z wykorzystaniem poleceń route i ip oraz dynamiczny routing z wykorzystaniem dwóch wewnętrznych protokołów RIP (Routing Information Protocol) oraz OSPF (Open Shortest Path First). W jaki sposób stwierdzić, który z nich należy wykorzystać? Protokół RIP jest najprostszy do zaimplementowania. Co 30 sekund przesyła w trybie ulticast całą tabelę routingu do całej sieci, a wszystkie routery obsługujące protokół RIP odpowiednio aktualizują swoje tablice routingu. 197

Protokół RIP jest znany jako algorytm routingu bazujący na wektorze odległości, ponieważ mierzy odległość trasy za pomocą liczby przeskoków. Ścieżka do następnego przeskoku nosi nazwę wektora. Protokół RIP obsługuje do 15 przeskoków. Jeśli jakaś lokalizacja znajduje się dalej, jest uznawana za nieosiągalną. Protokół RIP dobrze się sprawdza w zarządzaniu stabilnymi, mniej złożonymi sieciami. OSPF to algorytm bazujący na stanie łącza. Oznacza to, że router wyświetla informacje o swoim stanie w przypadku, gdy wystąpią zmiany, oraz rutynowo co 30 minut. Każdy router OSPF zawiera informacje o całej topologii sieci i jest w stanie samodzielnie obliczyć najlepszą ścieżkę w sieci. W miarę rozrastania się sieci jej wąskimi gardłami stają się aktualizacje. W przypadku, gdy w sieci znajduje się grupa 50, 100 lub więcej routerów, ich wzajemne komunikowanie się zajmuje dużo czasu i pasma. Zastosowanie protokołu OSPF rozwiązuje ten problem dzięki podziałowi sieci na obszary. Wszystkie one muszą być podłączone do wspólnego szkieletu. W takiej konfiguracji routery wewnątrz każdego obszaru muszą znać topologię tylko swojego obszaru, a pomiędzy obszarami komunikują się routery brzegowe.

Protokoły zewnętrzne Wszyscy czytelnicy tej książki z pewnością słyszeli o zewnętrznych protokołach routingu, takich jak BGP (Border Gateway Protocol) oraz EGP (Exterior Gateway Protocol). System Quagga obsługuje protokół BGP. W tym rozdziale nie będziemy zajmowali się nimi szczegółowo, ponieważ jeśli ktoś korzysta z protokołu BGP, ma dostawcę usług, którego zadaniem jest dopilnowanie, aby wszystko zostało poprawnie skonfigurowane. Kiedy jest potrzebny protokół BGP? Kiedy ktoś sam jest dostawcą usług lub jeśli korzysta z dwóch lub większej liczby dostawców tranzytowych i chce skonfigurować połączenie tak, by było odporne na awarie i zapewniało redundancję. Dostawcy usług internetowych często chwalą się takimi rzeczami, jak „czterech dostawców internetu warstwy pierwszej… wiele połączeń zarządzanych przez protokół BGP w celu zoptymalizowania routingu pomiędzy połączeniami zapewnia dostarczanie informacji z niewielkimi opóźnieniami do użytkowników na całym świecie”. Jeśli jesteśmy w sytuacji, kiedy potrzebujemy wysokiej dostępności i nie chcemy być zmuszeni do usprawiedliwiania się, powinniśmy raczej skorzystać z usług hostingu niż sami świadczyć tego rodzaju usługi. Wówczas to nasz dostawca będzie odpowiedzialny za wszystkie sprawy związane z bezpieczeństwem, utrzymaniem sprzętu, dostarczaniem właściwego pasma oraz równoważeniem obciążenia. Dostępnych jest wiele rodzajów doskonałych specjalizowanych dystrybucji Linuksa przeznaczonych do wykorzystania w routerach. Z fragmentem tej listy można się zapoznać w rozdziale 3.

Linuksowe polecenia routingu i obsługi sieci Trzeba znać kilka podobnych metod wykonywania tych samych czynności. Pakiet net-tools to narzędzie pozwalające na przeglądanie, tworzenie i usuwanie tras, przeglądanie informacji na temat interfejsów, przypisywanie adresów do interfejsów, włączanie i wyłączanie interfejsów oraz przeglądanie lub ustawianie nazw hostów. Polecenie netstat to narzędzie, z którego będziemy często korzystali w celu wyświetlania tras, statystyk interfejsu oraz pokazywa-

198

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

nia gniazd nasłuchiwania i aktywnych połączeń sieciowych. Oto polecenia udostępniane wraz z pakietem net-tools: • ifconfig; • nameif; • plipconfig; • rarp; • route; • slattach; • ipmaddr; • iptunnel; • mii-tool; • netstat; • hostname.

W dystrybucji Debian hostname jest osobnym pakietem. W jego skład wchodzą polecenia dnsdomainname, domainname, nisdomainname i ypdomainname. W rzeczywistości zawartość pakietu net-tools może być różna dla różnych dystrybucji Linuksa. Może się zatem zdarzyć, że w naszej dystrybucji będzie dostępnych kilka innych poleceń. Były plany, aby pakiet iproute2 zastąpił pakiet net-tools. Tak się jednak nie stało i prawdopodobnie nigdy tak się nie stanie. Pakiet iproute2 służy do routingu strategii, kształtowania ruchu oraz ma kilka interesujących własności, których jest pozbawiony pakiet net-tools, a poza tym udostępnia funkcje pakietu net-tools. W jego skład wchodzą następujące polecenia: • rtmon; • ip; • netbug; • rtacct; • ss; • lnstat; • nstat; • cbq; • tc; • arpd.

Polecenia ip i tc są najczęściej wykorzystywanymi poleceniami spośród poleceń pakietu iproute2. Polecenie ip wykonuje te same zadania co polecenia route, ifconfig, iptunnel i arp. Podobnie jak w przypadku pakietu net-tools, zawartość pakietu iproute2 może być różna w różnych dystrybucjach. Polecenie tc służy do kształtowania ruchu. Byłoby doskonale, gdyby trzeba było znać tylko jeden spośród tych pakietów. W sieciach można jednak spotkać obydwa, dlatego warto się zapoznać z wszystkimi poleceniami wchodzącymi w ich skład.

6.0. Wprowadzenie

|

199

6.1. Obliczanie podsieci za pomocą polecenia ipcalc Problem Często w dokumentacjach spotykamy się ze stwierdzeniem typu: „aby to mogło działać, trzeba wykorzystać różne podsieci” lub „należy zadbać o to, by wszystkie hosty były w tej samej sieci”. Nie wiemy jednak zbyt dokładnie, co to znaczy i w jaki sposób wykonuje się obliczenia adresów — czy jest do tego jakieś narzędzie?

Rozwiązanie Rzeczywiście jest takie narzędzie: ipcalc. To standardowy program dostępny w każdej dystrybucji Linuksa. Poniższe polecenie pokazuje wszystko, co trzeba wiedzieć na temat pojedynczej sieci: $ ipcalc 192.168.10.0/24 Address: 192.168.10.0 Netmask: 255.255.255.0 = 24 Wildcard: 0.0.0.255 => Network: 192.168.10.0/24 HostMin: 192.168.10.1 HostMax: 192.168.10.254 Broadcast: 192.168.10.255 Hosts/Net: 254

11000000.10101000.00001010. 00000000 11111111.11111111.11111111. 00000000 00000000.00000000.00000000. 11111111 11000000.10101000.00001010. 11000000.10101000.00001010. 11000000.10101000.00001010. 11000000.10101000.00001010. Class C, Private Internet

00000000 00000001 11111110 11111111

Można tu zobaczyć starą notację z czterema kropkami, nowomodną notację CIDR, dostępny zakres adresów hostów, liczbę hostów, które mogą występować w sieci, oraz adresy binarne. Polecenie ipcalc pokazuje sieciową część adresu — 192.168.10 — oraz część określającą host: 1 – 254. Wynik polecenia ipcalc to miła dla oka pomoc w zrozumieniu masek sieci. W dystrybucji Fedora polecenie ipcalc działa zupełnie inaczej i nie jest tak pomocne, jak rzeczywiste polecenie ipcalc. Oryginalne polecenie ipcalc można zainstalować z kodu źródłowego, który można pobrać pod adresem http://freshmeat.net/projects/ipcalc/. Można też wykorzystać program whatmask. Jest on podobny do ipcalc i można go znaleźć w repozytoriach dystrybucji Fedora. Dzięki temu można go zainstalować za pomocą polecenia yum install whatmask.

Maskę podsieci należy określić w przypadku, gdy jest ona różna od /24 (lub 255.255.255.0). Do częściej używanych masek podsieci w formacie CIDR należą: /8 /16 /24

Odpowiadają im następujące maski w notacji z czterema kropkami: 255.0.0.0 255.255.0.0 255.255.255.0 Maski podsieci wykorzystuje się w celu odróżnienia części adresu opisującej sieć od tej części, która opisuje host. Oto prywatne zakresy adresów w standardzie IPv4: 200

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

10.0.0.0 – 10.255.255.255 172.16.0.0 – 172.31.255.255 192.168.0.0 – 192.168.255.255 Pierwszy z nich: 10.0.0.0 – 10.255.255.255, daje najwięcej możliwych adresów. Jeśli pierwszą ćwiartkę wykorzystamy w roli adresu sieci, a ostatnie trzy w roli adresów hostów, otrzymamy 16 777 214 adresów do wykorzystania — wszystkie w jednej gigantycznej sieci. Zobaczmy to sami: $ ipcalc 10.0.0.0/8 Address: 10.0.0.0 Netmask: 255.0.0.0 = 8 Wildcard: 0.255.255.255 => Network: 10.0.0.0/8 HostMin: 10.0.0.1 HostMax: 10.255.255.254 Broadcast: 10.255.255.255 Hosts/Net: 16777214

00001010. 00000000.00000000.00000000 11111111. 00000000.00000000.00000000 00000000. 11111111.11111111.11111111 00001010. 00000000.00000000.00000000 00001010. 00000000.00000000.00000001 00001010. 11111111.11111111.11111110 00001010. 11111111.11111111.11111111 Class A, Private Internet

Sieć składająca się z 16 777 214 hostów w jednej podsieci nie jest zbyt wygodna, dlatego można ją podzielić na mniejsze podsieci. W poniższym przykładzie pokazano trzy podsieci, w których użyto pierwszych dwóch ćwiartek (wyróżnionych pogrubieniem) do opisania sieciowej części adresu: $ ipcalc 10.1.0.0/16 $ ipcalc 10.2.0.0/16 $ ipcalc 10.3.0.0/16

Można w ten sposób wydzielać podsieci aż do adresu 10.255.0.0/16. Można nawet wydzielić jeszcze mniejsze podsieci, stosując większe maski sieci: $ ipcalc 10.1.1.0/24 $ ipcalc 10.1.2.0/24 $ ipcalc 10.1.3.0/24

I tak dalej, aż do 10.255.255.0/16. Części opisujące adresy hostów mogą być liczbami z zakresu 1 – 254. Należy pamiętać, że w podsieci najwyższy numer zawsze ma adres rozgłoszeniowy. Polecenie ipcalc ma jedną dodatkową doskonałą cechę: obliczanie wielu podsieci za pomocą jednego polecenia. Załóżmy, że chcemy podzielić sieć 10.150.0.0 na trzy podsieci, w których w sumie znalazłoby się 100 hostów. Wystarczy przekazać do polecenia ipcalc maskę podsieci oraz liczbę hostów, które mają się znaleźć w każdym segmencie: $ ipcalc 10.150.0.0/16 --s 25 25 50

Następnie można skorzystać z polecenia ipcalc w celu wyświetlenia wszystkich informacji na ten temat. W wyniku polecenia można nawet znaleźć informacje o nieużywanych zakresach adresów.

Dyskusja Polecenie ipcalc ma kilka prostych opcji. Aby je zobaczyć, można uruchomić polecenie: $ ipcalc --help

6.1. Obliczanie podsieci za pomocą polecenia ipcalc

|

201

Notacja CIDR (Classless Inter-Domain Routing) jest kompaktowa i pozwala na wygodne dzielenie sieci, aż do sieci składającej się z jednego hosta (maska /32). Notacja ta ma zastąpić przestarzałą notację z czterema kropkami. Trzeba jednak znać obie, ponieważ istnieją aplikacje, które w dalszym ciągu nie obsługują notacji CIDR.

Patrz także • man 1 ipcalc • dokument RFC 1597 — Address Allocation for Private Internets

6.2. Ustawienia domyślnej bramy Problem Pojęcia bramy i domyślnej bramy są dla nas trochę mylące. Kiedy są potrzebne? Do czego służą? W jaki sposób się je konfiguruje?

Rozwiązanie Bramy przekazują ruch pomiędzy różnymi sieciami, na przykład pomiędzy różnymi podsieciami lub pomiędzy siecią lokalną a internetem. Bramy można inaczej określić terminem routerów następnego przeskoku. Domyślna brama określa domyślną trasę prowadzącą poza sieć. Domyślną bramę trzeba zdefiniować dla wszystkich hostów, które mają zezwolenie na dostęp poza sieć lokalną. Załóżmy, że nasza sieć jest skonfigurowana w następujący sposób: • sieć LAN ma adresy 10.10.0.0/24; • jest jedno współdzielone połączenie z internetem wykorzystujące statyczny adres WAN

208.201.239.36;

• dostawca usług internetowych przypisał nam domyślną bramę pod adresem 208.201.239.1.

Trzeba skonfigurować dwie bramy: od poszczególnych hostów w sieci LAN do routera, a następnie od routera do dostawcy usług internetowych. Sieć w takiej konfiguracji zilustrowano na rysunku 6.1.

Rysunek 6.1. Sieć LAN, router i brama dostawcy usług internetowych 202

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

Istnieje kilka różnych sposobów konfiguracji bram dla hostów sieci LAN. Jeden ze sposobów polega na wykorzystaniu polecenia route: # route add default gw 10.10.0.25

W tym celu można również skorzystać z polecenia iproute2: # ip route add default via 10.10.0.25

Jeśli komputer PC jest wyposażony w więcej niż jeden interfejs sieciowy, można wskazać ten, dla którego definiujemy bramę: # route add default gw 10.10.0.25 eth2 # ip route add default via 10.10.0.25 dev eth2

Jednak po ponownym uruchomieniu systemu zdefiniowane ustawienia przestaną obowiązywać. W dystrybucji Debian stała konfiguracja sieci jest zdefiniowana w pliku /etc/network/ interfaces. Dla hostów o statycznych adresach IP należy do pliku konfiguracji interfejsów dodać wiersz z definicją bramy — gateway: gateway 10.10.0.25

W dystrybucji Fedora każdemu interfejsowi odpowiada indywidualny plik konfiguracyjny w katalogu /etc/sysconfig/network-scripts. Interfejsowi eth0 odpowiada plik ifcfg-eth0, gdzie można zdefiniować bramę w następujący sposób: gateway 10.10.0.25

Aby router mógł uzyskać dostęp do internetu, w konfiguracji jego interfejsu WAN należy umieścić instrukcję gateway 208.201.239.1. Aby usunąć zdefiniowane bramy, można posłużyć się następującymi poleceniami: # # # #

route del default route del default gw 10.10.0.25 ip route del default ip route del default via 10.10.0.25

Polecenie ip nie pozwala na ustawienie więcej niż jednej domyślnej bramy, natomiast polecenie route zezwala na wykonanie takiej operacji. Prawidłowo powinna być jednak tylko jedna brama domyślna.

Dyskusja Dla bram nie można stosować adresów spoza własnych sieci. Pokazano to w przykładzie zamieszczonym w tej recepturze — interfejs WAN, pod adresem 208.201.239.36, jest w tej samej sieci co dostawca usług internetowych — 208.201.239.1. Z kolei interfejs bramy sieci LAN jest w sieci LAN. W jaki sposób podejmujemy decyzję o wyborze domyślnej bramy? Wszystko zależy od liczby tras obsługiwanych przez bramę. Brama internetowa prowadzi do setek tysięcy tras, natomiast w sieci lokalnej jest tylko kilka tras. Polecenia route i ip są doskonałymi narzędziami do testowania, ponieważ pozwalają na błyskawiczne definiowanie i usuwanie tras. Komputery nie potrzebują tras ani domyślnych bram w celu uzyskania dostępu do innych hostów w swojej własnej podsieci. Można to łatwo przetestować poprzez usunięcie domyślnej bramy i uruchomienie testów za pomocą polecenia ping.

6.2. Ustawienia domyślnej bramy

|

203

Bramy domyślne trzeba zdefiniować dla wszystkich hostów, które wymagają dostępu poza własną podsieć. Dla komputera można zdefiniować wiele tras, ale tylko jedną bramę domyślną. Dzięki temu można łatwo zarządzać tabelami routingu, ponieważ nie trzeba definiować tras dla każdej możliwej lokalizacji docelowej. Routing TCP/IP można porównać do serii przeskoków. Bardzo często będziemy się spotykali z terminem następny przeskok. Oznacza to, że w celu przekazywania pakietów router wymaga tylko następnego routera. Nie musi znać całej drogi do lokalizacji docelowej. Słowo brama ma wiele znaczeń. Oznacza wejście do sieci oraz mechanizm translacji pomiędzy różnymi protokołami lub kodekami. Kiedyś trzeba było instalować bramy między niezgodnymi ze sobą protokołami sieciowymi, takimi jak Token Ring, IPX/SPX i Ethernet. Obecnie TCP/IP i Ethernet to w zasadzie to samo, a większość komputerów obsługuje wiele protokołów. Technologia Voice over IP często wymaga konwersji kodowania różnych protokołów. W związku z tym do wykonywania tego zadania tworzone są bramy mediów (ang. media gateways).

Patrz także • w rozdziale 4. można się zapoznać ze sposobami konfiguracji usług DHCP i DNS za po-

mocą narzędzia dnsmasq • man 8 ip • man 8 route

6.3. Konfiguracja prostego, lokalnego routera Problem Mamy pojedyncze, współdzielone połączenie z internetem, a sieć LAN jest podzielona na wiele podsieci. Chcemy, aby podsieci mogły się ze sobą komunikować. Co trzeba zrobić, aby ta magia była możliwa?

Rozwiązanie Niezbyt wiele. Wystarczy pojedynczy router i podłączenie do niego wszystkich podsieci. Załóżmy, że mamy takie trzy podsieci: • 10.25.0.0/16; • 172.32.0.0/16; • 192.168.254.0/24.

Router powinien być wyposażony w trzy interfejsy sieciowe z jednym adresem przypisanym do każdego segmentu sieci: • eth0 = 10.25.0.10; • eth1 = 172.32.12.100; • eth2 = 192.168.254.31.

W każdej podsieci jest osobny przełącznik podłączony do routera, tak jak pokazano na rysunku 6.2. 204 |

Rozdział 6. Routing z wykorzystaniem systemu Linux

Rysunek 6.2. Lokalne podsieci podłączone do pojedynczego routera

Następnie włączamy w routerze przekazywanie IP. Można to zrobić z wiersza poleceń: # echo 1 > /proc/sys/net/ipv4/ip_forward

Po ponownym uruchomieniu systemu zmiany przestają obowiązywać, zatem można ustawić je na stałe w pliku /etc/sysctl.conf, a następnie natychmiast uruchomić: ##/etc/sysctl.conf net.ipv4.ip_forward = 1 # sysctl -p

Następnie przypisujemy trzy adresy wymienione wcześniej jako bramy domyślne hostów w każdej sieci. Wszystkie komputery w podsieci 10.25.0.0/16 będą wykorzystywały router 10.25.0.10 w roli swojej domyślnej bramy. Jestem pewna, że czytelnicy bez trudu zgadną, jakie bramy domyślne będą wykorzystywane w pozostałych dwóch podsieciach. Po wykonaniu tych czynności wszystkie trzy sieci będą mogły przekazywać pomiędzy sobą ruch TCP/IP.

Dyskusja Nie ma konieczności używania adresacji z całkowicie różnych zakresów adresów prywatnych, takich jak te, które zaprezentowano w tej recepturze. W przykładzie wykorzystałem je po to, aby było łatwiej zobaczyć różne sieci. W tym celu można zastosować dowolny niekolidujący ze sobą schemat adresacji, na przykład taki, jak pokazano w poniższych przykładach: 10.25.0.0/16 10.26.0.0/16 10.27.0.0/16 lub: 172.16.1.0/24 172.16.2.0/24 172.16.3.0/24 6.3. Konfiguracja prostego, lokalnego routera

|

205

W żadnej sieci nie mogą wystąpić powtarzające się adresy. Nie należy obawiać się używania narzędzia ipcalc — w niektórych przypadkach jest to ostatnia deska ratunku. Kiedy na routerze jest włączone przekazywanie IP, pakiety są automatycznie przekazywane pomiędzy jego wszystkimi interfejsami. Schemat ten dobrze działa dla dwóch typów sieci: • wykorzystujących adresy prywatne; • wykorzystujących publiczne, rutowalne adresy.

Schemat nie sprawdza się w przypadku, gdy chcemy współdzielić połączenie internetowe z sieciami wykorzystującymi adresację prywatną, ponieważ adresy z zakresów prywatnych nie są rutowalne w sieci internet. Aby taki układ mógł działać, potrzebna jest usługa translacji adresów sieciowych (NAT). Załóżmy, że router wyposażony w wiele interfejsów jest podłączony do dwóch sieci lokalnych z adresami prywatnymi i ma jeden, publiczny i rutowalny, adres IP przypisany do interfejsu podłączonego do internetu. Prywatne sieci będą bez kłopotów się wzajemnie widziały. Nie będą one jednak miały łączności z internetem do czasu skonfigurowania usługi NAT. Ściśle rzecz biorąc, prywatne zakresy adresów — o czym można się przekonać w sieciach lokalnych — są rutowalne, jednak większość dostawców usług internetowych filtruje te pakiety, którym udało się przedostać do internetu, i nie przekazuje ich dalej. Z oczywistych względów nie można bowiem pozwolić, aby internet był zatłoczony losowymi hordami zdublowanych prywatnych adresów IP. Z prostym sposobem wykorzystania usługi NAT do współdzielenia połączenia internetowego można się zapoznać w recepturze 6.4.

Patrz także • man 8 sysctl • ze sposobami konfigurowania interfejsów sieciowych można się zapoznać w recepturach

3.2 i 3.3

6.4. Konfiguracja najprostszego sposobu współdzielenia połączenia z internetem Problem Chcemy umożliwić współdzielenie połączenia internetowego na linuksowym routerze. Za routerem jest jedna lub kilka sieci, w których wykorzystywane są adresy z prywatnego zakresu. Nie chcemy skonfigurować zapory firewall, ponieważ funkcje te są realizowane w innym miejscu, lub chcemy wykonać kilka testów, dlatego interesuje nas skonfigurowanie prostego mechanizmu współdzielenia połączenia internetowego.

Rozwiązanie Można wykorzystać poniższy skrypt iptables, zgodny z konwencjami używanymi w rozdziale 3. #!/bin/sh ##/usr/local/bin/nat_share

206

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

#minimalny skrypt iptables #do współdzielenia połączenia z internetem # definicja zmiennych ipt="/sbin/iptables" mod="/sbin/modprobe" WAN_IFACE="eth1" #załadowanie modułów jądra $mod ip_tables $mod iptable_filter $mod iptable_nat $mod ip_conntrack $mod iptable_mangle $mod ipt_MASQUERADE $mod ip_nat_ftp $mod ip_nat_irc $mod ip_conntrack_ftp $mod ip_conntrack_irc # usunięcie wszystkich aktywnych reguł i niestandardowych łańcuchów $ipt -F $ipt -t nat -F $ipt -t mangle -F $ipt -X $ipt -t nat -X $ipt -t mangle -X #ustawienie domyślnych strategii $ipt -P INPUT ACCEPT $ipt -P FORWARD ACCEPT $ipt -P OUTPUT ACCEPT $ipt -t nat -P OUTPUT ACCEPT $ipt -t nat -P PREROUTING ACCEPT $ipt -t nat -P POSTROUTING ACCEPT $ipt -t mangle -P PREROUTING ACCEPT $ipt -t mangle -P POSTROUTING ACCEPT #zawsze należy pamiętać o wpisie dotyczącym interfejsu lo $ipt -A INPUT -i lo -j ACCEPT $ipt -A OUTPUT -i lo -j ACCEPT #przepisanie adresów źródłowych na adresy WAN $ipt -t nat -A POSTROUTING -o $WAN_IFACE -j SNAT --to-source 22.33.44.55

Oczywiście trzeba wprowadzić własną nazwę interfejsu oraz adres w sieci WAN. Jeśli nie używamy statycznego adresu WAN, tylko uzyskujemy go z DHCP, powinniśmy wykorzystać poniższy wiersz: # włączenie maskarady IP $ipt -t nat -A POSTROUTING -o $WAN_IFACE -j MASQUERADE

W tym skrypcie nie ma żadnych zabezpieczeń — w ogóle nie zdefiniowano filtrowania pakietów. Skrypt spełnia jedynie zadanie przepisania adresów prywatnych na adresy WAN i z powrotem.

Dyskusja Wielu czytelników z pewnością patrzy na ten skrypt i zastanawia się: „Co jest takiego prostego w tym gigantycznym skrypcie?”. Ten skrypt jest jednak rzeczywiście prosty. Wszystkie te moduły jądra są potrzebne. Aby się pozbyć tej części skryptu, można by wkompilować je w jądro zamiast zastosowania ładowalnych modułów. Można by również pominąć kolejny 6.4. Konfiguracja najprostszego sposobu współdzielenia połączenia z internetem

|

207

fragment — część, która usuwa istniejące reguły i łańcuchy. Aby to zrobić, można użyć osobnego skryptu, na przykład podobnego do skryptu fw_flush z rozdziału 3. Istotne znaczenie dla działania zapory iptables ma start od zera — tak by w jej pracy nie przeszkadzały pozostawione reguły lub łańcuchy. Trzeba również zastosować właściwe strategie. Jeśli się tego nie zrobi, można uzyskać nieoczekiwane wyniki. Ostatni wiersz skryptu umożliwia współdzielenie połączenia internetowego. Jest to całkowicie niezabezpieczona konfiguracja. Do czego można ją wykorzystać? Nadaje się do testowania oraz w sytuacji, kiedy zapora firewall służąca do zabezpieczenia sieci ma być umieszczona w innym miejscu. Na przykład można wykorzystać osobną zaporę firewall dla każdego segmentu sieci lub jedną zaporę firewall dla strefy DMZ i inną dla sieci prywatnych. Funkcje routerów i zapory iptables w wielu miejscach nakładają się na siebie. W związku z tym nie należy zbytnio komplikować konfiguracji routerów. Na przykład program ip również posiada opcje konfiguracji mechanizmu NAT. Jest to rozwiązanie dość kłopotliwe i pełne niebezpiecznych pułapek. Program iptables zapewnia znacznie lepszą kontrolę i niesie ze sobą o wiele mniej pułapek. Najlepiej stosować generalną zasadę — pozostawić routing routerom, natomiast zadania filtrowania i niszczenia pakietów powierzyć zaporze iptables.

Patrz także • więcej informacji na temat zapory iptables można znaleźć w rozdziale 3. • aby znaleźć więcej informacji na temat mechanizmu NAT oraz polecenia iproute2, warto

zajrzeć do doskonałego artykułu Martina Browna Guide to IP Layer Network Administration with Linux dostępnego pod adresem: http://linux-ip.net/html/index.html

6.5. Konfiguracja statycznego routingu dla wielu podsieci Problem Mamy kilka prywatnych podsieci do przejścia. Nie wszystkie one są fizycznie podłączone do tego samego routera, zatem w jaki sposób umożliwić im wzajemny dostęp do siebie?

Rozwiązanie Istnieje łatwy i trudny sposób rozwiązania tego zadania. Trudny sposób polega na stworzeniu tras statycznych pomiędzy routerami. Załóżmy, że mamy trzy podsieci i trzy routery, tak jak pokazano na rysunku 6.3. Każdy router potrzebuje dwóch tras. Na przykład trasy dla routera C należy ustawić w następujący sposób: # route add -net 192.168.10.0/24 gw 172.24.0.25 eth1 # route add -net 172.16.5.0/24 gw 172.24.0.25 eth1

Następnie należy je ustawić dla routera B: # route add -net 192.168.10.0/24 gw 172.16.5.125 eth1 # route add -net 172.24.0.0/24 gw 172.16.5.125 eth1

208 |

Rozdział 6. Routing z wykorzystaniem systemu Linux

Rysunek 6.3. Trzy podsieci i trzy routery

I, na koniec, dla routera A: # route add -net 172.16.5.0/24 gw 192.168.10.100 eth1 # route add -net 172.24.0.0/24 gw 192.168.10.100 eth1

Teraz mogą się ze sobą komunikować hosty ze wszystkich trzech podsieci. Aby usunąć trasy, należy skorzystać z następującego polecenia: # route del -net 192.168.10.0/24

Pokazany sposób jest dosyć pracochłonny. Trzeba znać maski podsieci oraz bardzo uważać, aby nigdzie nie popełnić błędu. Łatwy sposób polega na umieszczeniu wszystkich trzech routerów w tej samej sieci, tak jak pokazano na rysunku 6.4.

Rysunek 6.4. Trzy routery w tej samej sieci

W tym przypadku w ogóle nie trzeba konfigurować routerów. 6.5. Konfiguracja statycznego routingu dla wielu podsieci

| 209

Dyskusja W celu definiowania i usuwania tras można również skorzystać z polecenia ip: # ip route add 172.16.5.0/24 via 192.168.10.100 # ip route del 172.16.5.0/24

Czar konfigurowania statycznego routingu bardzo szybko pryska. Inny łatwy sposób polega na wykorzystaniu dynamicznego routingu. Zaczniemy się nim posługiwać, począwszy od receptury 6.7.

Patrz także • man 8 route

6.6. Definiowanie statycznych tras na stałe Problem Nie chcemy ciągle przepisywać poleceń route za każdym razem, kiedy wystąpią problemy z zasilaniem lub jeśli zmieni się konfiguracja sprzętu. Czy nie istnieją pliki konfiguracyjne pozwalające na zdefiniowanie statycznych tras na stałe?

Rozwiązanie Oczywiście, że istnieją: w dystrybucji Debian należy dodać poniższe wiersze do pliku /etc/ network/interfaces wewnątrz fragmentu dotyczącego określonego interfejsu: auto eth1 iface eth1 inet static address 192.168.10.100 netmask 255.255.255.0 gateway 22.33.44.55 broadcast 192.168.10.255 up route add -net 172.16.5.0/24 gw 192.168.10.100 eth1 up route add -net 172.24.0.0/24 gw 192.168.10.100 eth1 down route del -net 172.24.0.0/24 down route del -net 172.16.5.0/24

W dystrybucji Fedora należy utworzyć plik /etc/sysconfig/network-scripts/route-* o następującej zawartości: ##/etc/sysconfig/network-scripts/route-eth1 192.168.10.0/24 via 172.24.0.25 172.16.5.0/24 via 172.24.0.25

Wykorzystano tu składnię zgodną z poleceniem ip. Jest bardzo ważne, aby użyć właściwej nazwy pliku i odpowiedniej nazwy urządzenia. W przeciwnym razie konfiguracja nie zadziała. Nazwę urządzenia można odczytać z pliku konfiguracyjnego, na przykład /etc/sysconfig/ network-scripts/ifcfg-eth1.

Dyskusja W dystrybucji Fedora nie należy wykorzystywać pliku /etc/network/static-routes. Od kilku lat jego używanie jest niezalecane. 210

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

Routery będą wymagały domyślnej bramy, jeśli istnieje inna trasa prowadząca poza sieć, na przykład połączenie z internetem. Jeśli nie istnieje łącze z internetem lub inną, oddzielną siecią, definiowanie domyślnych bram dla routerów nie będzie konieczne.

Patrz także • man 5 interfaces (Debian) • man 8 ifup (Debian) • man 8 ip

6.7. Wykorzystanie dynamicznego routingu na bazie protokołu RIP w dystrybucji Debian Problem Nasze sieci nie są nadmiernie złożone, ale nie chcemy kłopotów związanych z ręczną konfiguracją tras. Czy nie jest to raczej praca, którą powinny zajmować się komputery — powtarzające się, nudne zadania? Nasze routery wykorzystują dystrybucję Debian.

Rozwiązanie Istotnie, jest to rodzaj operacji, z którymi doskonale radzą sobie komputery. Istnieją dwie kategorie protokołów dynamicznego routingu: wewnętrzne i zewnętrzne. W niniejszej recepturze wykorzystamy protokół RIP — najprostszy wewnętrzny protokół routingu. RIP jest dołączony do zestawu protokołów routingu Quagga. Instalacja tego pakietu jest niezwykle prosta: # aptitude install quagga

Teraz trzeba zmodyfikować kilka plików konfiguracyjnych. Rozpoczynamy od pliku /etc/ quagga/daemons i włączamy protokoły zebra i ripd: ##/etc/quagga/daemons zebra=yes bgpd=no ospfd=no ospf6d=no ripd=yes ripngd=no isisd=no

Następnie utworzymy plik /etc/quagga/zebra.conf: !/etc/quagga/zebra.conf hostname router1 password tajemnica enable password tajemnica service advanced-vty log file /var/log/quagga/zebra.log ! !ustawienia dostępu dla administratora — tylko komputer lokalny ! access-list localhost permit 127.0.0.1/32 access-list localhost deny any

6.7. Wykorzystanie dynamicznego routingu na bazie protokołu RIP w dystrybucji Debian

|

211

! line vty access-class localhost

Następnie utworzymy plik /etc/quagga/ripd.conf: !/etc/quagga/ripd.conf hostname router1 password scislatajemnica enable password scislatajemnica router rip network eth1 redistribute static redistribute connected service advanced-vty log file /var/log/quagga/ripd.log ! !ustawienia dostępu dla administratora — tylko komputer lokalny ! access-list localhost permit 127.0.0.1/32 access-list localhost deny any ! line vty access-class localhost

Teraz wprowadzimy właściwe ustawienia własności oraz uprawnień dla pliku: # chown quagga:quagga ripd.conf zebra.conf # chown :quaggavty vtysh.conf

Do pliku /etc/services należy dodać poniższe wiersze: zebrasrv zebra ripd

2600/tcp 2601/tcp 2602/tcp

# zebra service # zebra vty # RIPd vty

Na koniec należy dodać poniższy wiersz w pliku /etc/environment: VTYSH_PAGER=more

Teraz wystarczy uruchomić zestaw protokołów quagga: # /etc/init.d/quagga start

Wystarczy zrobić to na wszystkich routerach i na tym konfiguracja się kończy. Czekamy kilka minut, a następnie uruchamiamy ulubione polecenie w celu przejrzenia tabeli routingu: $ /sbin/route $ ip route show $ netstat -rn

Dyskusja W plikach konfiguracyjnych zestawu protokołów Quagga do oznaczania komentarzy wykorzystywane są wykrzykniki. Wszystkie demony Quagga zarządza się za pomocą jednego pliku startowego: # /etc/init.d/quagga {start|stop|restart|force-reload| [daemon]} Aby właściwie skonfigurować protokół RIP, wystarczy wykonać te czynności, które opisano w niniejszej recepturze. Każdy demon Quagga co 30 sekund wysyła komunikaty rozgłoszeniowe do pozostałych routerów obsługujących protokół RIP. Dzięki temu nie trzeba się przejmować tworzeniem statycznych tras we wszystkich routerach. 212

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

W dystrybucji Debian dostęp vty jest domyślnie ograniczony do maszyny lokalnej w pliku /etc/quagga/debian/conf, natomiast w dystrybucji Fedora jest wykorzystywany plik /etc/sysconfig/ quagga. Aby się dowiedzieć, w jaki sposób włącza się możliwość zdalnego logowania, można zajrzeć do receptury 6.10. Oto kilka definicji przydatnych do pracy z plikiem ripd.conf: hostname

Dowolna nazwa, która nie ma nic wspólnego z nazwą hosta w systemie Linux. Argument zarządza nazwą hosta, jaka wyświetla się w wierszu poleceń vtysh lub telnet. router rip

Za pomocą tego argumentu należy określić protokół routingu rip. Domyślnie dla wysyłki jest wykorzystywana wersja v2, a dla odbioru wersje 1. i 2. Inne dostępne protokoły to ripng, ospf, ospf6 i bgp. Protokoły te konfiguruje się za pomocą właściwych plików konfiguracyjnych. network eth1

Interfejs lub interfejsy, których nasłuchuje demon ripd. Dodatkowe interfejsy należy wymieniać w osobnych wierszach. redistribute static

Współdzielenie statycznych tras; są one wyszczególnione w pliku zebra.conf. redistribute connected

Współdzielenie bezpośrednio połączonych ze sobą routerów. Na przykład router jest podłączony do sieci 10.0.0.1/24, zatem poinformuje on pozostałe routery o tym, jak można do niego dotrzeć. service advanced-vty

Włącza zaawansowane funkcje vty, takie jak historia poleceń i uzupełnianie za pomocą klawisza Tab. access-list

Dwa wiersze z opcją access-list definiują nową klasę — localhost. Nazwa klasy może być dowolna — nie musi to być localhost. Znajdujące się za definicją klasy wiersze: line vty access-class localhost

oznaczają: „Zezwalaj na logowanie vty tylko z maszyny lokalnej. Logowanie zdalne jest niedozwolone”. Domyślny poziom rejestrowania to debugging. Na tym poziomie generowanych jest najwięcej informacji. Można wykorzystać dowolny z poniższych poziomów rejestrowania: emergencies, alerts, critical, errors, warnings, notifications, information lub debugging, tak jak pokazano poniżej: log file /var/log/quagga/ripd.log warnings

W przypadku braku pliku dziennika powstanie błąd i będzie wygenerowany plik dziennika awarii /var/tmp/quagga.[nazwa_demona].crashlog. Trzeba go usunąć, aby umożliwić generowanie innych dzienników awarii. Protokół RIP jest dostępny w dwóch wersjach. RIPv1 jest dość ograniczony i jeśli to możliwe, należy unikać jego wykorzystywania. Router ten nie obsługuje notacji sieciowych pozbawionych klas i wolno odpowiada na zmieniające się warunki, na przykład wyłączenie routerów. Protokół RIPv2 obsługuje notację bezklasową, nie blokuje się w przypadku sprzętu niższej 6.7. Wykorzystanie dynamicznego routingu na bazie protokołu RIP w dystrybucji Debian

|

213

jakości i wykorzystuje wyzwalane aktualizacje pozwalające na błyskawiczne odpowiedzi na zmiany. Jest zgodny z protokołem RIPv1, zatem zapewnia możliwości współpracy z bardzo starym sprzętem. Domyślne działanie protokołu RIP to wersja 2. dla wysyłania oraz wersje 1. i 2. dla odbioru. Opcja version 2 informuje, że router zarówno wysyła, jak i odbiera wyłącznie wersję v2. Protokół RIP jest ograniczony do 15 przeskoków, zatem nie nadaje się do wykorzystania w dużych i skomplikowanych sieciach. Pakiet Quagga zawiera pięć demonów routingu: ripd, ripngd, ospfd, ospf6d i bgpd oraz jednego demona zarządzającego — zebra. Demon zebra zawsze musi być uruchomiony w pierwszej kolejności. Każdy z demonów nasłuchuje na innym porcie: zebrasrv zebra ripd ripngd ospfd bgpd ospf6d ospfapi isisd

2600/tcp 2601/tcp 2602/tcp 2603/tcp 2604/tcp 2605/tcp 2606/tcp 2607/tcp 2608/tcp

Patrz także • dokumentacja pakietu Quagga: http://www.quagga.net/docs/docs-info.php • /usr/share/doc/quagga/README.Debian • man 8 ripd • man 8 zebra • receptura 6.9 • receptura 6.10

6.8. Wykorzystanie dynamicznego routingu protokołu RIP w dystrybucji Fedora Problem Nasze sieci nie są nadmiernie złożone, ale nie chcemy kłopotów związanych z ręczną konfiguracją tras. Czy nie jest to raczej praca, którą powinny zajmować się komputery — powtarzające się, nudne zadania? Nasze routery wykorzystują dystrybucję Fedora.

Rozwiązanie Protokół RIP w dystrybucji Fedora konfiguruje się dokładnie w taki sam sposób, jak w dystrybucji Debian (receptura 6.7). Jedyna różnica polega na sposobie uruchamiania demonów. W dystrybucji Fedora dla każdego demona występuje osobny plik sterujący. Należy skonfigurować pliki zebra.conf, ripd.conf i vtysh.conf w taki sam sposób, jak w poprzedniej recepturze, i nadać im te same uprawnienia i własności. 214

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

Teraz trzeba włączyć pliki startowe dla demonów zebra i ripd: # chkconfig --add zebra # chkconfig --add ripd

Następnie można wykorzystywać standardowe polecenia sterujące dla dystrybucji Fedora: # /etc/init.d/zebra {start|stop|restart|reload|condrestart|status}

Dyskusja Kiedy w pliku startowym w dystrybucji Fedora znajdziemy wiersz następującej postaci: # chkconfig: - 16 84

oznacza to, że można uruchomić polecenie chkconfig bez konieczności ręcznego określania poziomów startu i priorytetów.

Patrz także • dokumentacja pakietu Quagga: http://www.quagga.net/docs/docs-info.php • /usr/share/doc/quagga-* • man 8 ripd • man 8 zebra

6.9. Korzystanie z wiersza poleceń pakietu Quagga Problem Wolisz uruchamiać polecenia z poziomu powłoki, zamiast zawsze modyfikować pliki konfiguracyjne. W jaki sposób można to zrobić w programie Quagga?

Rozwiązanie Quagga ma swoją własną powłokę poleceń — vtysh (Virtual TeletYpe shell). Wykorzystując vtysh, można się komunikować ze wszystkimi demonami Quagga na komputerze lokalnym. Z każdym demonem routingu można się również komunikować bezpośrednio, wykorzystując telnet. Najpierw trzeba zmodyfikować lub utworzyć plik /etc/quagga/vtysh.conf: !/etc/quagga/vtysh.conf hostname router1 username root nopassword

W dystrybucji Debian należy dodać poniższy wiersz w pliku /etc/environment: VTYSH_PAGER=more

Teraz należy otworzyć nową sesję terminalu i będąc zalogowanym jako użytkownik root, uruchomić następujące polecenie: root@xena:~# vtysh Hello, this is Quagga (version 0.99.4).

6.9. Korzystanie z wiersza poleceń pakietu Quagga

|

215

Copyright 1996-2005 Kunihiro Ishiguro, et al. router1#

Powłoka vtysh ma dwa tryby: normal i enable. W trybie normal można przeglądać status systemu, w trybie enable można modyfikować pliki konfiguracyjne i uruchamiać polecenia. Powłoka vtysh otwiera się w trybie normal. Poniższe dwa polecenia wyświetlają zbiór dostępnych poleceń: router1# ? router1# list

Całą bieżącą konfigurację można przeglądać za pomocą jednego polecenia: router1# write terminal

W celu uruchomienia dowolnego polecenia routingu lub zmiany konfiguracji należy przejść do trybu konfiguracji: router1# configure terminal router1(config)#

Wszystkie dostępne polecenia można wyświetlić za pomocą tych samych poleceń: router1(config)# ? router1(config)# list

Polecenie exit zamyka kolejne sesje. Powłokę vtysh można uruchomić nawet wtedy, gdy nie działa żaden z demonów Quagga. Druga możliwość to skorzystanie z programu telnet. Program ten może się komunikować tylko z jednym demonem. W tym przykładzie komunikuje się on z demonem ripd: carla@xena:~$ telnet localhost 2602 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. Hello, this is Quagga (version 0.99.4). Copyright 1996-2005 Kunihiro Ishiguro, et al. User Access Verification Password: router1>

Z poziomu programu telnet może się zalogować każdy użytkownik, który zna hasło dostępu do demona. Tak jak w przypadku programu vtysh, powoduje to otwarcie sesji w trybie normal. Aby przejść do trybu enable, należy skorzystać z polecenia enable. Następnie, w celu uruchomienia poleceń konfiguracyjnych, należy użyć polecenia configure terminal: router1> enable router1# configure terminal router1(config)#

Polecenia exit, end bądź quit powodują zakończenie sesji telnet. Polecenia ? oraz list wyświetlają dostępne polecenia.

Dyskusja Wiersz username root nopassword jest niezbędny do tego, aby program vtysh mógł się uruchomić. Użytkownik wymieniony w tym poleceniu nie potrzebuje hasła do otwarcia sesji vtysh. 216

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

Można tu podać nazwę dowolnego użytkownika. Należy pamiętać, aby do pliku miał prawo odczytu i zapisu tylko użytkownik wymieniony w pliku. Trzeba również pamiętać o tym, że nie ma sposobu ustawienia hasła. W przypadku, gdy wyświetli się pusty ekran z napisem (END) w lewym dolnym rogu, należy dodać instrukcję VTYSH_PAGER=more do zestawu zmiennych środowiskowych. Można to zrobić we własnym pliku .profile lub globalnie w katalogu /etc/environment. Nazwa hosta zdefiniowana za pomocą argumentu hostname może być dowolnym ciągiem znaków. Dzięki temu w celu ułatwienia identyfikacji demonów routingu każdemu z nich można nadać inną nazwę hosta.

Patrz także • dokumentacja pakietu Quagga: http://www.quagga.net/docs/docs-info.php • /usr/share/doc/quagga • man 8 ripd • man 8 zebra

6.10. Zdalne logowanie się do demonów Quagga Problem Wiemy, że Quagga umożliwia logowanie za pośrednictwem telnetu. Wiemy też, że telnet jest całkowicie niezabezpieczony, ponieważ wszystkie informacje są przesyłane zwykłym tekstem. Czujemy się jednak dość bezpiecznie we własnej sieci, dlatego chcemy mieć możliwość logowania się i zdalnego zarządzania routerami. Nie chodzi o możliwość logowania się przez internet, co byłoby samobójstwem, ale o własną sieć LAN.

Rozwiązanie Należy skonfigurować demony w taki sposób, aby nasłuchiwały wszystkich interfejsów, a następnie skonfigurować kontrolę dostępu w plikach konfiguracyjnych poszczególnych demonów. Aby umożliwić nasłuchiwanie wszystkich interfejsów w dystrybucji Debian, należy zmodyfikować plik /etc/quagga/debian.conf: vtysh_enable=yes zebra_options=" --daemon" ripd_options=" --daemon"

W dystrybucji Fedora te same modyfikacje należy wprowadzić w pliku /etc/sysconfig/quagga. Następnie należy wprowadzić poniższe wiersze w plikach konfiguracyjnych demonów. Oto przykład modyfikacji dla pliku zebra. conf: access-list access-list access-list access-list access-list access-list !

localhost permit 127.0.0.1/32 localhost deny any lan1 permit 192.168.1.0/24 lan1 deny any lan2 permit 192.168.2.0/24 lan2 deny any

6.10. Zdalne logowanie się do demonów Quagga

|

217

line vty access-class localhost access-class lan1 access-class lan2

Wprowadzenie tych wierszy umożliwia logowanie z hosta localhost oraz dwóch lokalnych podsieci. Z pozostałych hostów logowanie nie jest możliwe. Każdej z podsieci oraz hostowi localhost przypisano oddzielną klasę. W ten sposób wystarczy ująć w komentarz wiersz z instrukcją access-class, aby zablokować dostęp do określonej klasy. Następnie w dystrybucji Debian należy zrestartować pakiet Quagga: # /etc/init.d/quagga restart

W przypadku dystrybucji Fedora każdy demon należy zrestartować indywidualnie: # /etc/init.d/zebra restart # /etc/init.d/ripd restart

Teraz powinniśmy mieć możliwość połączenia za pośrednictwem telnetu z sąsiednich hostów w sieci LAN. W tym celu wystarczy podać adres IP bądź nazwę hosta i numer portu: terry@uberpc:~$ telnet xena 2601

Dyskusja Nazwy wymienione w instrukcji access-list, którymi w tym przykładzie są localhost, lan1 i lan2, mogą być dowolne. Przykład zaprezentowany w tej recepturze jest dość złożony i zarządza dostępem według podsieci. Można go uprościć — wystarczy umieścić wszystko na jednej liście kontroli dostępu: access-list allowed permit 127.0.0.1/32 access-list allowed permit 192.168.1.0/24 access-list allowed permit 192.168.2.0/24 access-list allowed deny any ! line vty access-class allowed

Patrz także • dokumentacja pakietu Quagga: http://www.quagga.net/docs/docs-info.php • /usr/share/doc/quagga • man 8 ripd • man 8 zebra

6.11. Uruchamianie demonów Quagga z wiersza poleceń Problem Czy koniecznie trzeba modyfikować pliki konfiguracyjne? Czy nie można wpisać poleceń w wierszu poleceń pakietu Quagga lub wykonywać poleceń „w locie”? 218

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

Rozwiązanie Tak, można wykonać te czynności, zarówno z poziomu powłoki vtysh, jak i poprzez telnet. Polecenia są dokładnie takie same w wierszu poleceń jak w plikach konfiguracyjnych, zatem jeśli jest taka potrzeba, można wpisać wszystkie instrukcje konfiguracji z wiersza poleceń. Oto prosty przykład pliku zebra.conf: carla@xena:~$ telnet localhost 2601 router1> enable router1> write terminal router1# configure terminal router1(config)# hostname zebra2 zebra2(config)# password zebra zebra2(config)# enable password zebra zebra2(config)# log file /var/log/quagga/zebra.log zebra2(config)# write file Configuration saved to /etc/quagga/zebra.conf zebra2(config)# write terminal

Wykonanie tych instrukcji nie powoduje całkowitego nadpisania istniejącego pliku konfiguracyjnego. Powoduje modyfikację opcji i dodanie nowych, ale nie usuwa żadnej z nich. Polecenie write terminal wyświetla bieżącą konfigurację, zatem aby usunąć istniejące opcje, można najpierw zobaczyć ich wartości, następnie usunąć za pomocą odpowiedniego polecenia no: zebra2(config)# write terminal Current configuration: ! hostname zebra2 password zebra enable password zebra log file /var/log/quagga/zebra.log ! interface eth0 ipv6 nd suppress-ra ! interface eth1 ipv6 nd suppress-ra ! interface lo ! interface sit0 ipv6 nd suppress-ra ! access-list localhost permit 127.0.0.1/32 access-list localhost permit 192.168.1.0/24 access-list localhost permit 192.168.2.0/24 access-list localhost deny any ! ! line vty access-class localhost ! end zebra2(config)# no access-list localhost zebra2(config)# log file /var/log/quagga/zebra.log zebra2(config)# write file Configuration saved to /etc/quagga/zebra.conf

Aby obejrzeć wprowadzone modyfikacje, należy ponownie uruchomić instrukcję write terminal.

6.11. Uruchamianie demonów Quagga z wiersza poleceń

|

219

Za pomocą polecenia no nie można wykonać wszystkich operacji. Aby dowiedzieć się, jakie operacje są dostępne za pomocą polecenia no, można uruchomić polecenie list.

Dyskusja Interesującym bonusem pisania plików konfiguracyjnych w taki sposób jest automatyczna obsługa uprawnień do plików. Kiedy konfigurujemy plik zebra.conf z wiersza poleceń, dla każdego interfejsu są automatycznie dodawane wiersze ipv6 nd suppress-ra. Oznacza to: „Nie ogłaszaj tras IPv6”. Jeśli wiersze te są niepotrzebne, trzeba usunąć je bezpośrednio z pliku zebra.conf. Jeśli nie używamy adresacji IPv6, nie zaszkodzi, jeśli pozostawimy je na miejscu.

Patrz także • dokumentacja pakietu Quagga: http://www.quagga.net/docs/docs-info.php • /usr/share/doc/quagga

6.12. Monitorowanie demona RIPD Problem W jaki sposób sprawdzić, co robi demon RIPD w danym momencie?

Rozwiązanie Można otworzyć sesję telnet i uruchomić wbudowane polecenia obserwacji demona RIPD: $ telnet localhost 2602 ripd1> show ip rip ripd1> show ip rip status ripd1> show work-queues

Dostępnych jest również wiele pomocnych poleceń debugowania: ripd1> enable ripd1# debug rip zebra ripd1# debug rip events

Dyskusja Pierwsze trzy polecenia wyświetlają trasy oraz różne statystyki dotyczące komunikacji pomiędzy routerami. Polecenia debug wyświetlają znacznie więcej szczegółów, niż jest to zwykle potrzebne, ale w przypadku konieczności śledzenia problemu zazwyczaj udaje się go szybko znaleźć.

Patrz także • dokumentacja pakietu Quagga: http://www.quagga.net/docs/docs-info.php • /usr/share/doc/quagga

220

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

6.13. Odrzucanie tras za pomocą demona Zebra Problem Spamer lub inny szkodnik mocno atakuje naszą sieć. W związku z tym zamiast bawić się w filtry zawartości lub pakietów, chcemy odrzucić cały ruch, który pochodzi od niego na routerze.

Rozwiązanie Korzystając z polecenia ip, można ustawić puste trasy w pliku zebra.conf: ip route 22.33.44.55/24 null0

To samo można również zrobić w sesji telnet: $ telnet localhost 2601 router1> enable router1# configure terminal router1(config)# ip route 22.33.44.55/24 null0

Tę samą czynność można wykonać również innym sposobem — wykorzystując następujące polecenie: router1(config)# ip route 22.33.44.55/24 blackhole

Odmianą tego polecenia jest wykorzystanie opcji reject. Jej użycie generuje błąd „sieć jest nieosiągalna”: router1(config)# ip route 22.33.44.55/24 reject

Aby cofnąć tę opcję, można skorzystać z polecenia no: router1(config)# no ip route 22.33.44.55/24 reject

Dyskusja Wykonanie zaprezentowanych operacji blokuje cały wyspecyfikowany ruch w określonym zakresie sieci. W związku z tym ponosimy ryzyko, że razem z niechcianym ruchem zablokujemy także ruch, który nie powinien być zablokowany — wystarczy, że określimy zbyt szeroki zakres adresów. Aby dokładnie dowiedzieć się, jakie adresy są blokowane, można skorzystać z polecenia ipcalc. Notacja CIDR pozwala na dokładne wydzielenie wymaganych adresów. Na przykład 22.33.44.55/32 oznacza adres pojedynczego hosta. 22.33.44.55/31 to dwa hosty, natomiast 22.33.44.55/29 to sześć hostów (program ipcalc oblicza nawet sfałszowane adresy). 22.33.44.55/24 oznacza zablokowanie 254 adresów, natomiast /8 — 16 777 214 adresów. Pakiety wchodzące nie są blokowane — zamiast tego do wysyłającego nie jest dostarczana żadna odpowiedź, która mogłaby być odczytana jako informacja o blokadzie. Używając bardziej technicznego języka, można powiedzieć, że opcja blackhole pozwala pakietom SYN na wejście do sieci, ale uniemożliwia wysyłanie w odpowiedzi pakietów SYN/ACK. Można to porównać do sytuacji, w której ktoś dzwoni do naszych drzwi, ale my udajemy, że nie ma nas w domu. W końcu w tego typu połączeniu następuje przekroczenie limitu czasu. Użycie opcji reject powoduje całkowite zamknięcie połączenia.

6.13. Odrzucanie tras za pomocą demona Zebra

|

221

Osobiście jestem zwolenniczką używania do tego programu iptables, ponieważ całkowicie blokuje on wejście do sieci niepożądanym bitom. Dodatkowo zapora iptables umożliwia dostrajanie filtrowania pakietów w sposób nieosiągalny dla routerów. Pomimo wszystko odrzucanie tras to przydatne narzędzie w arsenale administratora sieci.

Patrz także • dokumentacja pakietu Quagga: http://www.quagga.net/docs/docs-info.php • man 8 zebra • /usr/share/doc/quagga • rozdział 3.

6.14. Wykorzystanie OSPF do skonfigurowania prostego, dynamicznego routingu Problem Nasza sieć staje się coraz większa i bardziej złożona. Mamy wrażenie, że demon ripd nie spełnia już swojego zadania. Jesteśmy coraz bardziej zajęci konfigurowaniem dodatkowych routerów, a wydajność na tym cierpi. Co teraz?

Rozwiązanie Wydaje się, że to zadanie dla demona ospfd. Jest nieco trudniejszy do administracji, ale rozwija się w miarę rozwoju sieci i nie zawodzi. Oto prosty plik konfiguracyjny /etc/quagga/ospfd.conf, który spełnia prawie takie samo zadanie co demon ripd: !/etc/quagga/ospfd.conf hostname ospfd1 password wielkisekret enable password wielkisekret log file /var/log/quagga/ospfd.log ! router ospf ospf router-id 33.44.55.66 network 0.0.0.0/0 area 0 redistribute connected redistribute static ! !ustawienia dostępu dla administratora — tylko komputer lokalny ! access-list localhost permit 127.0.0.1/32 access-list localhost deny any ! line vty access-class localhost

Przy takiej konfiguracji wszystkie trasy są przekazywane bez filtrowania i bez żadnych ograniczeń. Można ją wykorzystać do testowania, ale w przypadku systemów produkcyjnych należy dodać mechanizmy uwierzytelniania oraz wskazać określone trasy: 222

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

!/etc/quagga/ospfd.conf hostname ospfd1 password wielkisekret enable password wielkisekret log file /var/log/quagga/ospfd.log ! interface eth0 ip ospf authentication message-digest ip ospf message-digest-key 1 md5 wielkisekret ! router ospf ospf router-id 33.44.55.66 network 192.168.10.0/0 area 0 redistribute connected redistribute static area 0.0.0.0 authentication message-digest ! !ustawienia dostępu dla administratora — tylko komputer lokalny ! access-list localhost permit 127.0.0.1/32 access-list localhost deny any ! line vty access-class localhost

Demon ospfd jest bardziej wydajny niż ripd. W związku z tym może spełniać nasze potrzeby przez długi czas, bez konieczności złożonej konfiguracji. W dystrybucji Debian należy pamiętać o modyfikacji pliku /etc/quagga/daemons. Powinien się w nim znaleźć wiersz ospfd=yes. Następnie należy zrestartować pakiet Quagga: # /etc/init.d/quagga restart

W dystrybucji Fedora wystarczy uruchomić demona ospfd: # /etc/init.d/ospfd start

Należy pamiętać, że zebra to demon-menedżer, który zawsze powinien być uruchomiony w pierwszej kolejności.

Dyskusja Dajemy routerom kilka minut, a następnie wykorzystujemy jedno z ulubionych poleceń w celu wyświetlenia nowej tabeli routingu: $ /sbin/route $ ip route show $ netstat -rn

Oto kilka definicji: ospf router-id

Opcja służy do utworzenia dowolnego, unikatowego 32-bitowego identyfikatora dla każdego routera. W tej roli dobrze sprawdza się adres IP. passive interface

Dla tego interfejsu nie należy używać demona ospfd. Opcję tę należy zastosować dla interfejsów, które nie są w sieci z innymi naszymi routerami, oraz dla interfejsów, które prowadzą poza naszą sieć.

6.14. Wykorzystanie OSPF do skonfigurowania prostego, dynamicznego routingu

|

223

Patrz także • dokumentacja pakietu Quagga: http://www.quagga.net/docs/docs-info.php • man 8 zebra • /usr/share/doc/quagga

6.15. Wprowadzenie zabezpieczeń dla protokołów RIP i OSPF Problem Cała komunikacja pomiędzy routerami odbywa się przy użyciu zwykłego tekstu — czy nie można by dodać przynajmniej hasła lub podobnego zabezpieczenia, tak aby routery musiały się uwierzytelniać i aby żaden host podający się za router nie mógł narobić bałaganu w tabelach routingu?

Rozwiązanie Na routerach można skonfigurować hasło zakodowane za pomocą algorytmu MD5. Aby włączyć szyfrowane hasła dla demona ripd, należy w pliku /etc/quagga/ripd.conf dodać następujące wiersze: key chain localnet key 1 key-string wielkisekret interface eth1 ip rip authentication mode md5 ip rip authentication key-chain localnet

Należy zastąpić słowo wielkisekret swoim hasłem oraz localnet dowolną nazwą, a także upewnić się, że wprowadziliśmy właściwy interfejs sieciowy. Dla demona ospfd wykorzystuje się nieco odmienną składnię. Do pliku /etc/quaggga/ospfd.conf należy dodać poniższe wiersze: interface eth0 ip ospf authentication message-digest ip ospf message-digest-key 1 md5 wielkisekret router ospf network 172.16.5.0/24 area 0.0.0.1 area 0.0.0.1 authentication message-digest

Należy wprowadzić własne hasło, nazwę interfejsu i adres sieci. Dla wielu interfejsów można wprowadzić wiele kluczy i ponumerować je sekwencyjnie.

Dyskusja Należy pamiętać, aby zrestartować demony routingu po wprowadzeniu zmian w konfiguracji.

224

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

Protokół RIPv1 nie obsługuje uwierzytelniania w żadnej formie. Są dwa sposoby postępowania w tej sytuacji. Jeden polega na zezwoleniu w sieci wyłącznie na protokół RIPv2. W tym celu należy dodać poniższy wiersz do pliku ripd.conf: version 2

Jeśli istnieje konieczność włączenia obsługi protokołu RIPv1, demon ripd obsługuję tę sytuację w taki sposób, że zezwala urządzeniom z protokołem RIPv1 oraz innym nieuwierzytelnionym urządzeniom na otrzymywanie informacji dotyczących routingu, ale bez możliwości wprowadzania jakichkolwiek zmian w tabelach routingu.

Patrz także • dokumentacja pakietu Quagga: http://www.quagga.net/docs/docs-info.php • man 8 ospfd • man 8 ripd • /usr/share/doc/quagga

6.16. Monitorowanie demona OSPFD Problem W jaki sposób można monitorować demona ospfd w czasie rzeczywistym, tak aby zobaczyć status systemu i jego aktywność lub debugować problemy?

Rozwiązanie Można skorzystać z wbudowanych poleceń monitorowania i debugowania demona ospfd: $ telnet localhost 2604 ospfd1> show ip ospf ospfd1> show ip ospf interface ospfd1> show ip ospf database ospfd1> show ip ospf database self-originate ospfd1> show ip ospf route ospfd1> enable ospfd1# debug ospf zebra ospfd1# debug ospf lsa ospfd1# debug ospf ism

Polecenie show ip ospf interface wyświetla informacje na temat wszystkich interfejsów sieciowych. Aby uzyskać informacje na temat konkretnego interfejsu, można go wskazać w następujący sposób: ospfd1> show ip ospf interface eth2

Dyskusja Oprócz podanych poleceń nie należy zapominać o starych i niezawodnych wbudowanych poleceniach Linuksa, takich jak netstat, route, traceroute, ping oraz ip. Więcej informacji na temat wyszukiwania i rozwiązywania problemów można znaleźć w rozdziale 19.

6.16. Monitorowanie demona OSPFD

|

225

Patrz także • dokumentacja pakietu Quagga: http://www.quagga.net/docs/docs-info.php • man 8 ospfd

226

|

Rozdział 6. Routing z wykorzystaniem systemu Linux

ROZDZIAŁ 7.

Bezpieczna, zdalna administracja z wykorzystaniem SSH

7.0. Wprowadzenie W tym i w następnym rozdziale przyjrzymy się niektórym oferowanym przez Linux sposobom zdalnej administracji serwerem oraz zdalnego dostępu do stacji roboczej. System Linux daje użytkownikom doskonałe możliwości i obszerny zestaw funkcji. Można mieć tylko wiersz poleceń lub pełny graficzny pulpit — tak jakbyśmy byli fizycznie obecni przy odległym komputerze. OpenSSH to narzędzie służące do zdalnej administracji systemem z wiersza poleceń. Jest bezpieczne oraz łatwe w konfiguracji i użytkowaniu. Za jego pomocą można także uruchomić zdalny pulpit graficzny, ponieważ SSH pozwala na bezpieczne tunelowanie komunikacji X Window. Mechanizm ten dobrze się sprawdza w przypadku szybkich lokalnych łączy. Daje jednak gorsze efekty w przypadku łączy modemowych lub połączeń przez internet ze względu na znaczne opóźnienia. Rdesktop to prosty klient linuksowy pozwalający na nawiązanie połączenia z windowsowym serwerem terminali oraz zdalnym pulpitem systemu Windows XP Professional. Narzędzie to przydaje się do niektórych zadań administracji systemem, a także umożliwia dostęp do aplikacji windowsowych z Linuksa. Dla użytkowników łączy modemowych, którzy potrzebują graficznego pulpitu, dobrym rozwiązaniem jest program FreeNX. Jest tak zaprojektowany, aby zapewniał dobrą wydajność przy wolnych łączach. W bieżącej wersji można go wykorzystać w celu uzyskania dostępu do linuksowego komputera PC z poziomu systemów Linux, Windows, Mac OS X i Solaris. VNC jest niekwestionowanym mistrzem w dziedzinie międzyplatformowych pulpitów graficznych. Za pomocą VNC można wykonać wiele interesujących operacji: zarządzać kilkoma komputerami PC za pomocą jednej klawiatury, myszki i monitora, łączyć systemy operacyjne oraz świadczyć usługi zdalnej pomocy technicznej. W tym rozdziale przyjrzymy się, jak korzysta się z OpenSSH. Następny rozdział jest poświęcony programom Rdesktop, FreeNX i VNC.

227

OpenSSH OpenSSH to implementacja protokołu SSH firmy Free Software dostępna na zmodyfikowanej licencji BSD. Licencja ta pozwala na wykonywanie z oprogramowaniem dowolnych operacji, włącznie z modyfikowaniem i redystrybucją, pod warunkiem umieszczenia informacji o prawach autorskich. OpenSSH jest wykorzystywany w celu udaremnienia podsłuchiwania i zwodzenia ruchu sieciowego. Jest to możliwe dzięki zaszyfrowaniu całego ruchu podczas sesji — zarówno logowania, jak i przesyłania danych. System spełnia trzy zadania: uwierzytelnianie, szyfrowanie i gwarancja integralności transferu danych. W przypadku gdy zostanie podjęta próba zmodyfikowania naszych pakietów, SSH nas o tym poinformuje. Istnieją dwa, niezgodne ze sobą, protokoły SSH: SSH-1 i SSH-2. OpenSSH obsługuje obydwa, ale osobiście nie polecam używania protokołu SSH-1. W przypadku konieczności logowania się do zdalnych systemów, które nie znajdują się pod naszą kontrolą, a w których ciągle używa się protokołu SSH-1, warto spróbować postawić wszystko na jedną kartę, mówiąc, że nie chcemy ryzykować naszego bezpieczeństwa. To powinno zmusić ich do aktualizacji. Protokół SSH-1 był doskonały w swoim czasie, ale ten czas już minął. Ma wiele wad, które znikają po aktualizacji do wersji SSH-2. Więcej informacji można znaleźć w artykule CA-2001-35 (http:// www.cert.org/advisories/CA-2001-35.html). Warto się również zapoznać z materiałami referencyjnymi zamieszczonymi na końcu artykułu.

Tunelowanie SSH W celu bezpiecznej hermetyzacji niezabezpieczonych protokołów, takich jak komunikacja sieci bezprzewodowych oraz VNC (narzędzie to będzie używane w wielu recepturach w niniejszej książce), użytkownicy mogą korzystać z przekazywania portów SSH nazywanego również tunelowaniem. OpenSSH obsługuje wiele algorytmów silnego szyfrowania: 3DES, Blowfish, AES oraz arcfour. Algorytmy te nie są ograniczone patentami. W rzeczywistości zespół pracujący nad OpenSSH podjął działania zmierzające do tego, aby wewnątrz OpenSSH nie znalazł się kod opatentowany lub ograniczony w inny sposób.

Komponenty OpenSSH OpenSSH to zbiór narzędzi do zdalnej komunikacji: sshd Demon serwera OpenSSH. ssh Nazwa pochodzi od secure shell — bezpieczna powłoka, choć narzędzie w rzeczywistości nie zawiera powłoki, a jedynie dostarcza bezpiecznego kanału do powłoki poleceń w zdalnym systemie. scp Narzędzie zapewniające zaszyfrowany transfer plików.

228

|

Rozdział 7. Bezpieczna, zdalna administracja z wykorzystaniem SSH

sftp Bezpieczny protokół FTP. ssh-copy-id Niewielki program do instalacji osobistego klucza identyfikacyjnego w pliku authorized_ keys zdalnej maszyny. ssh-keyscan Wyszukuje i zbiera w sieci klucze hostów publicznych. W ten sposób pozwala zaoszczędzić nam trudu związanego z ich ręcznym wyszukiwaniem. ssh-keygen Generuje klucze uwierzytelniania RSA i DSA oraz zarządza nimi. ssh-add Dodaje identyfikatory RSA lub DSA do agenta uwierzytelniania ssh-agent. ssh-agent Zapamiętuje hasła dla wielu operacji logowania SSH, co umożliwia automatyczne uwierzytelnianie. Program ssh-agent jest powiązany z pojedynczą sesją logowania, zatem wylogowanie, otwarcie innego terminalu lub restart systemu powodują wyzerowanie zapamiętanych haseł. Lepszym narzędziem do tego celu jest keychain, który zapamiętuje hasła tak długo, jak długo nie zrestartujemy systemu.

Korzystanie z OpenSSH OpenSSH jest bardzo elastyczny. Obsługuje wiele typów uwierzytelniania: Uwierzytelnianie bazujące na kluczu hosta (ang. host-key authentication) Do uwierzytelniania wykorzystywana jest nazwa użytkownika i hasło systemu Linux, natomiast do szyfrowania sesji są wymagane klucze SSH. Jest to najprostsza metoda uwierzytelniania, ponieważ potrzebne są tu jedynie klucze hosta. Klucz hosta SSH daje pewność, że maszyna, do której się logujemy, jest tą, za którą się podaje. Uwierzytelnianie bazujące na kluczu publicznym (ang. public-key authentication) Zamiast na systemowej nazwie użytkownika uwierzytelnianie bazuje na kluczu identyfikacyjnym SSH. Klucze identyfikacyjne służą do uwierzytelniania indywidualnych użytkowników. Pod tym względem różnią się od kluczy hosta, które służą do uwierzytelniania serwerów. Ten sposób uwierzytelniania wymaga nieco więcej pracy przy konfiguracji, ponieważ oprócz kluczy hosta trzeba stworzyć i rozprowadzić klucze identyfikacyjne. Jest to dobry sposób na logowanie się do wielu hostów z wykorzystaniem tego samego loginu. Dodatkowo zabezpiecza on login systemowy, ponieważ do klucza identyfikacyjnego obowiązuje oddzielne hasło. Wystarczy dostarczyć kopie naszego klucza publicznego do każdego hosta, do którego chcemy mieć dostęp. Zawsze należy pamiętać o zabezpieczeniu klucza prywatnego — nigdy nie należy udostępniać go innym osobom. Uwierzytelnianie bez haseł Ten sposób działa podobnie do uwierzytelniania bazującego na kluczu publicznym, z tą różnicą, że para kluczy nie wymaga hasła. Ten sposób jest przydatny w przypadku usług zautomatyzowanych, takich jak skrypty i zadania cron. Ponieważ każdy, kto zdobędzie klucz publiczny, z łatwością będzie mógł uzyskać dostęp do systemu, trzeba zadbać o zabezpieczenie klucza prywatnego.

7.0. Wprowadzenie

|

229

Wykorzystywanie kluczy bez haseł stwarza największe zagrożenie, ponieważ każdy, kto zdobędzie prywatny klucz, będzie mógł się podszyć pod prawowitego użytkownika. Jednym ze sposobów używania haseł dla procesów automatycznych jest korzystanie z narzędzi ssh-agent lub keychain. Programy te zapamiętują hasła, dzięki czemu możliwe jest automatyczne uwierzytelnianie. Ich słabą stroną jest to, że wprowadzone hasła nie są w stanie przetrwać restartu systemu. W związku z tym po ponownym uruchomieniu systemu trzeba na nowo wprowadzić wszystkie hasła. W rozdziale 17. książki Linux. Receptury (Helion, 2005) można znaleźć receptury dotyczące sposobów używania tych doskonałych narzędzi.

Typy kluczy Są dwa różne zastosowania kluczy uwierzytelniania: klucze hostów służące do uwierzytelniania komputerów oraz klucze identyfikacyjne, które służą do uwierzytelniania użytkowników. Klucze same w sobie są tego samego typu — RSA lub DSA. Każdy klucz składa się z dwóch części: prywatnej i publicznej. Klucz prywatny jest przechowywany na serwerze, natomiast klient wykorzystuje klucz publiczny. Komunikacja jest szyfrowana z wykorzystaniem klucza publicznego i odszyfrowywana z wykorzystaniem klucza prywatnego. Jest to mechanizm bajecznie prosty i łatwy w użytkowaniu — można bezpiecznie i dowolnie rozprowadzać swoje klucze publiczne. Serwer i klient są zdefiniowane zgodnie z kierunkiem transakcji — na serwerze musi działać demon SSH i nasłuchiwać prób połączenia. Klientem jest każdy, kto loguje się na tej maszynie.

7.1. Uruchamianie i zamykanie OpenSSH Problem Zainstalowaliśmy OpenSSH i skonfigurowaliśmy w taki sposób, aby uruchamiał się w momencie startu systemu bądź nie — w zależności od preferencji. Teraz chcemy się dowiedzieć, w jaki sposób uruchamiać i zatrzymywać go ręcznie oraz jak spowodować, aby plik konfiguracyjny został wczytany ponownie bez konieczności restartowania.

Rozwiązanie Odpowiedź, tak jak zwykle, można znaleźć w pliku /etc/init.d. W dystrybucji Fedora należy skorzystać z następujących poleceń: # /etc/init.d/sshd {start|stop|restart|condrestart|reload|status}

W dystrybucji Debian należy skorzystać z poniższych poleceń: # /etc/init.d/ssh {start|stop|reload|force-reload|restart}

Jeśli po zainstalowaniu OpenSSH w dystrybucji Debian zdecydowaliśmy, że demony nie mają się uruchamiać automatycznie, powinniśmy zmienić nazwę bądź usunąć plik /etc/ssh/sshd_ not_to_be_run, zanim zdąży się uruchomić. Można również uruchomić polecenie dpkg-reconfigure ssh. Plik konfiguracyjny OpenSSH — sshd.conf — musi być dostępny. W innym przypadku system OpenSSH się nie uruchomi.

230

|

Rozdział 7. Bezpieczna, zdalna administracja z wykorzystaniem SSH

Dyskusja Port 22, domyślny port SSH, jest popularnym celem ataków. W internecie roi się od automatycznych ataków skierowanych przeciwko losowo wybranym hostom. Wystarczy sprawdzić pliki dzienników zapory firewall — można tam znaleźć wiele różnych dowodów przeprowadzanych ataków siłowych na port 22. W związku z tym niektórzy administratorzy wolą, jeśli demon SSH jest uruchamiany tylko wtedy, gdy wiadomo, że jest potrzebny. Niektórzy uruchamiają SSH w niestandardowym porcie. Można go ustawić w pliku /etc/ssh/ssh_config, na przykład: Port 2022

W pliku /etc/services można sprawdzić, czy nie wykorzystujemy portu, który jest używany, oraz wprowadzić zapis dla dowolnego niestandardowego portu. Użycie niestandardowego portu nie jest w stanie zatrzymać zdeterminowanych skanerów portów. Potrafi jednak znacząco złagodzić ataki i zmniejszyć obciążenie plików dzienników. Interesującym narzędziem do odpierania ataków jest program DenyHosts opisany w recepturze 7.15. Dostępne w dystrybucji Red Hat narzędzie condrestart (od conditional restart — warunkowy restart) restartuje usługę tylko wtedy, gdy jest uruchomiona. Jeśli nie, narzędzie kończy działanie bez wyświetlania komunikatów. Polecenie reload jest instrukcją do usługi dotyczącą ponownego odczytania pliku konfiguracyjnego. Jest to alternatywa dla całkowitego zamknięcia usługi i ponownego jej uruchomienia, a także interesujący sposób aktywacji zmian bez zakłócania pracy usługi. Użytkownicy, którym podobają się narzędzia niedostępne w ich dystrybucjach (na przykład condrestart), mogą skopiować je z dystrybucji, w których są używane, i dostosować do potrzeb własnej dystrybucji. Skrypty inicjalizacyjne to po prostu skrypty powłoki, można je zatem bez trudu dostosować do indywidualnych potrzeb.

Patrz także • rozdział 7. „Uruchamianie i zamykanie systemu Linux” z książki Carli Schroder Linux.

Receptury (Helion, 2005) • receptura 7.15

7.2. Tworzenie silnych haseł Problem Wiemy, że każdorazowo podczas tworzenia klucza SSH trzeba utworzyć silne hasło. Chcemy zdefiniować strategię, która definiuje znaczenie terminu „silne hasło”. A zatem jakie hasła można nazwać silnymi?

Rozwiązanie Do stworzenia własnej strategii można wykorzystać poniższe wskazówki: • hasło SSH musi się składać co najmniej z ośmiu znaków;

7.2. Tworzenie silnych haseł

|

231

• konto logowania do systemu Linux na zdalnym serwerze; • publiczny klucz hosta należy dostarczyć klientom.

Program instalacyjny SSH powinien wcześniej utworzyć klucze hosta. Jeśli tego nie zrobił, należy je wygenerować (patrz następna receptura). Najpierw należy ochronić prywatny klucz hosta przed przypadkowym nadpisaniem: # chmod 400 /etc/ssh/ssh_host_rsa_key

Następnie należy dostarczyć klientom klucz publiczny hosta. Jeden ze sposobów polega na zalogowaniu się z maszyny klienckiej i wykorzystaniu OpenSSH do przesłania klucza: foober@gouda:~$ ssh reggiano The authenticity of host 'reggiano (192.168.1.10)' can't be established. RSA key fingerprint is 26:f6:5b:24:49:e6:71:6f:12:76:1c:2b:a5:ee:fe:fe Are you sure you want to continue connecting (yes/no)? Warning: Permanently added '192.168.1.1' (RSA) to the list of known hosts. foober@reggiano's password: Linux reggiano 2.6.15 #1 Sun June 10 11:03:21 PDT 2007 i686 GNU/Linux Debian GNU/Linux Last login: S Sun June 10 03:11:49 PDT 2007 from :0.0 foober@reggiano:~$

Teraz użytkownik foober może pracować na komputerze reggiano, tak jakby fizycznie siedział przy tej maszynie, a cały ruch — włącznie z początkowym logowaniem — jest zaszyfrowany. Wymiana kluczy hosta odbywa się tylko raz — przy pierwszym logowaniu. System nigdy nie powinien ponownie pytać o klucz, chyba że zostanie on zastąpiony nowym lub zmodyfikujemy osobisty plik ~/.ssh/known_hosts.

Dyskusja Publiczny klucz hosta jest zapisany w pliku ~/.ssh/known_hosts na klienckim komputerze PC. Ten plik może zawierać dowolną liczbę kluczy hostów. Logowanie się na koncie użytkownika root przez SSH to zły pomysł. Lepiej zalogować się na koncie zwykłego użytkownika, a następnie, po zalogowaniu, wykorzystać polecenia su lub sudo w miarę potrzeb. Wykorzystując przełącznik -l (login), można się zalogować w zdalnym systemie na koncie dowolnego użytkownika, który posiada tam konto: foober@gouda:~$ ssh -l deann reggiano

Można również użyć następującego polecenia: foober@gouda:~$ ssh deann@reggiano

Nie należy zbyt ściśle interpretować terminów klient i serwer — w tym kontekście serwer to dowolna maszyna, do której się logujemy, natomiast klient jest komputerem, z którego się logujemy. Na kliencie nie musi być uruchomiony demon SSH. Istnieje niewielkie ryzyko przechwycenia transmisji klucza hosta i zastąpienia autentycznego klucza sfałszowanym. W tej sytuacji napastnik uzyskałby możliwość dostępu do naszych systemów. Przed wpisaniem yes należy zweryfikować adres IP oraz „odcisk” klucza publicznego (ang. fingerprint). Prymitywne metody weryfikacji, takie jak zapisanie odcisku na kartce papieru lub weryfikacja przez telefon, są skuteczne i odporne na eksploity w sieciach komputerowych. Osoby szczególnie ostrożne mogą skorzystać z ręcznego kopiowania kluczy (patrz receptura 7.4).

7.3. Konfiguracja kluczy hosta w celu utworzenia najprostszego systemu uwierzytelniania

|

233

Patrz także • rozdział 17. „Dostęp zdalny” z książki Carli Schroder Linux. Receptury (Helion, 2005) • man 1 ssh • man 1 ssh-keygen • man 8 sshd

7.4. Generowanie i kopiowanie kluczy SSH Problem W naszej instalacji OpenSSH klucze hostów nie utworzyły się automatycznie lub chcemy wygenerować nowe, zastępcze klucze hostów. Ponadto nie ufamy standardowemu automatycznemu transferowi klucza publicznego hosta, zatem chcemy ręcznie skopiować klucze hostów do klientów.

Rozwiązanie Czy należy utworzyć klucze RSA, czy DSA? Krótka odpowiedź: nie ma znaczenia. Pod względem kryptograficznym oba są silne. Najważniejsza różnica dla użytkownika jest taka, że klucze RSA mogą mieć długość do 2048 bitów, natomiast klucze DSA są ograniczone do 1024 bitów. W związku z tym, teoretycznie, klucze RSA są mniej podatne na zestarzenie się. Rozmiar domyślny dla kluczy obu typów wynosi 1024 bity. W poniższym przykładzie wygenerowano nową parę kluczy, wykorzystując domyślną nazwę klucza hosta z pliku /etc/ssh/sshd_config. Nigdy nie należy definiować hasła dla kluczy hosta — jeśli program o nie zapyta, należy wcisnąć klawisz Return: # cd /etc/ssh/ # ssh-keygen -t dsa -f ssh_host_dsa_key Generating public/private dsa key pair. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /etc/ssh/ssh_host_dsa_key. Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub. The key fingerprint is: 26:f6:5b:24:49:e6:71:6f:12:76:1c:2b:a5:ee:fe:fe root@windbag

W celu zachowania szczególnej ostrożności, aby uniknąć możliwego przechwycenia klucza podczas transmisji, można skopiować klucz publiczny ręcznie za pośrednictwem dyskietki, klucza USB lub programu scp w skonfigurowanym połączeniu OpenSSH. Aby skopiować plik ręcznie, należy go zmodyfikować. Oto oryginalny publiczny klucz hosta: ssh-dss AAAAB3NzaC1kc3MAAACBALeIrq77k20kUAh8u3RYG1p0iZKAxLQZQzxJ8422d+uPRwvVAARFnriNajoJaB9L7 qu5D0PCSNCOuBMOIkkyHujfXJejQQnMucgkDm8AhMfO8TPyLZ6pG459M+bfwbsBybyWav7eGvgkkTfZYDEd7H mQK6+Vkd9SYqWd+Q9HkGCRAAAAFQCrhZsuvIuZq5ERrnf5usmMPXlQkQAAAIAUqi61+T7Aa2UjE40hnO8rSVf FcuHE6BCmm0FMOoJQbD9xFTztZbDtZcna0db5l+6AYxtVInHjiYPj76/hYST5o286/28McWBF8+j8Nn/ tHVUcWSjOE8EJG8Xh2GRxab6AOjgo/ GAQli1qMxlJfCbOlcljVN8VDDF4XtPzqBPHtQAAAIBn7IOv9oM9dUiDZUNXa8s6UV46N4rqcD+HtgkltxDm+t RiI68kZsU5weTLnLRdZfv/o2P3S9TF3ncrS0YhgIFdGupI// 28gH+Y4sYvrUSoRYJLiDELGm1+2pI06wXjPpUH2Iajr9TZ9eKWDIE+t2sz6lVqET95SynXq1UbeTsDjQ== root@windbag

234

|

Rozdział 7. Bezpieczna, zdalna administracja z wykorzystaniem SSH

Należy usunąć nazwę hosta z końca pliku oraz poprzedzić klucz pełną kwalifikowaną nazwą domeny i adresem IP. Należy się upewnić, że nie ma spacji pomiędzy nazwą FQDN a adresem oraz że za adresem IP jest jedna spacja: windbag.carla.com,192.168.1.10 ssh-dss AAAAB3NzaC1kc3MAAACBALeIrq77k20kUAh8u3RYG1p0iZKAxLQZQzxJ8422d+uPRwvVAARFnriNajoJaB9L7 qu5D0PCSNCOuBMOIkkyHujfXJejQQnMucgkDm8AhMfO8TPyLZ6pG459M+bfwbsBybyWav7eGvgkkTfZYDEd7H mQK6+Vkd9SYqWd+Q9HkGCRAAAAFQCrhZsuvIuZq5ERrnf5usmMPXlQkQAAAIAUqi61+T7Aa2UjE40hnO8rSVf FcuHE6BCmm0FMOoJQbD9xFTztZbDtZcna0db5l+6AYxtVInHjiYPj76/hYST5o286/28McWBF8+j8Nn/ tHVUcWSjOE8EJG8Xh2GRxab6AOjgo/ GAQli1qMxlJfCbOlcljVN8VDDF4XtPzqBPHtQAAAIBn7IOv9oM9dUiDZUNXa8s6UV46N4rqcD+HtgkltxDm+t RiI68kZsU5weTLnLRdZfv/o2P3S9TF3ncrS0YhgIFdGupI// 28gH+Y4sYvrUSoRYJLiDELGm1+2pI06wXjPpUH2Iajr9TZ9eKWDIE+t2sz6lVqET95SynXq1UbeTsDjQ==

Począwszy od AAAAB, plik musi być jednym długim wierszem. W związku z tym należy pamiętać o wykorzystaniu właściwego edytora tekstu — takiego, który nie wstawia znaków podziału wiersza. Można również użyć nazwy hosta lub samego adresu IP. W przypadku gdy ręcznie skopiujemy klucze dodatkowych hostów do pliku known_hosts, powinniśmy się upewnić, że pomiędzy nimi nie ma pustych wierszy.

Dyskusja Jakie ryzyko ponosimy w przypadku automatycznego transferu kluczy hosta? Ryzyko jest niewielkie. Trudno przeprowadzić pomyślny atak man-in-the-middle, ale nie jest on niemożliwy. Weryfikacja adresu IP hosta oraz odcisku klucza publicznego przed zaakceptowaniem klucza hosta to proste i skuteczne środki zaradcze. Powodzenie włamania do sieci w rzeczywistości zależy tylko od determinacji napastnika. Napastnik musi najpierw przechwycić naszą komunikację w sposób niezwracający uwagi, następnie sfałszować adres IP (co nie jest trudne) oraz odcisk klucza publicznego naszego zaufanego serwera — wykonanie wszystkich tych czynności nie jest łatwe. Ponieważ większość użytkowników nie weryfikuje ani adresu IP, ani odcisku klucza publicznego, w większości przypadków ich fałszowanie nie jest nawet konieczne. Kiedy wpiszemy yes w celu zaakceptowania klucza, otrzymujemy klucz hosta napastnika. Aby uniknąć wykrycia, napastnik przekazuje cały ruch pomiędzy nami a zaufanym serwerem, a jednocześnie przechwytuje i czyta wszystko to, co jest przesyłane pomiędzy nami a zaufanym serwerem. Czy przechwycenie ruchu w sieci Ethernet jest trudne? W sieci LAN jest łatwe — można skorzystać z narzędzia arpspoof wchodzącego w skład zestawu do audytu i testów penetracyjnych sieci Dsniff. Czy użytkownicy sieci LAN są godni zaufania? Przez internet napastnik musiałby włamać się do naszego systemu DNS, co jest możliwe, ale przy założeniu, że nad systemem DNS mamy pełną kontrolę, włamanie do niego nie jest łatwe. Napastnik może być również osobą zaufaną — na przykład może być pracownikiem naszego dostawcy usług internetowych. Krótko mówiąc, ryzyko jest niewielkie, a decyzja należy do nas.

Patrz także • man 1 ssh-keygen

7.4. Generowanie i kopiowanie kluczy SSH

|

235

7.5. Wykorzystanie uwierzytelniania z kluczem publicznym do ochrony haseł systemowych Problem Jesteśmy trochę zaniepokojeni używaniem loginów kont systemowych w niezaufanych sieciach, mimo że są one zaszyfrowane w sesji SSH, lub mamy kilka zdalnych serwerów do zarządzania i chcielibyśmy użyć tej samej nazwy logowania w nich wszystkich, ale nie z wykorzystaniem konta systemowego. Krótko mówiąc, chcielibyśmy, aby nasze zdalne operacje logowania były oddzielone od systemowych, a ponadto chcielibyśmy, aby do zapamiętania było mniej nazw logowania i haseł.

Rozwiązanie Można wykorzystać pojedynczą nazwę logowania dla wielu hostów poprzez skorzystanie z uwierzytelniania z kluczem publicznym, które jest całkowicie oddzielone od naszych kont systemowych. Wykonaj następujące czynności: Zainstaluj OpenSSH na wszystkich maszynach, do których chcesz się logować, i skonfiguruj na nich klucze hostów (klucze hostów zawsze są konfigurowane w pierwszej kolejności). Następnie wygeneruj nową parę kluczy identyfikacyjnych, korzystając z konta zwykłego użytkownika bez uprawnień, i zapisz je w katalogu ~/.ssh swojej lokalnej stacji roboczej. Pamiętaj o zdefiniowaniu hasła: $ ssh-keygen -t rsa Generating public/private rsa key pair. Enter file in which to save the key (/home/carla/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/carla/.ssh/id_rsa. Your public key has been saved in /home/carla/.ssh/id_rsa.pub. The key fingerprint is: 38:ec:04:7d:e9:8f:11:6c:4e:1c:d7:8a:91:84:ac:91 carla@windbag

Zabezpiecz prywatny klucz identyfikacyjny przed przypadkowym nadpisaniem: $ chmod 400 id_rsa

Teraz skopiuj nowy klucz publiczny (id_rsa.pub) do wszystkich zdalnych kont użytkowników, których będziesz używał — do plików ~/.ssh/authorized_keys2. Jeśli taki plik nie istnieje, należy go utworzyć. Bezpiecznym i łatwym sposobem kopiowania jest wykorzystanie narzędzia ssh-copy-id: $ ssh-copy-id -i id_rsa.pub [email protected]

Dyskusja Narzędzie ssh-copy-id kopiuje klucze identyfikacyjne we właściwym formacie, sprawdza, czy uprawnienia do plików i ustawienia własności są prawidłowe, i daje pewność, że przez pomyłkę nie skopiowano klucza prywatnego.

236

|

Rozdział 7. Bezpieczna, zdalna administracja z wykorzystaniem SSH

Plikowi authorized_keys2 można nadać inną nazwę, na przykład authorized_keys lub freds_keys. Nazwa może być dowolna, pod warunkiem, że odpowiada ustawieniu opcji AuthorizedKeysFile w pliku /etc/ssh/sshd.conf. Zawsze należy definiować hasło dla kluczy uwierzytelniania użytkowników-ludzi — to bardzo proste zabezpieczenie. Jeśli komuś uda się ukraść nasz klucz prywatny, nie będzie miał z niego pożytku bez prawidłowego hasła. Wykorzystanie uwierzytelniania z kluczem publicznym w połączeniu z poleceniem sudo to dobry sposób powierzenia zadań administracyjnych podwładnym z jednoczesną możliwością ograniczenia ich uprawnień. Sesje SSH mogą uruchamiać zwykli użytkownicy. Wiedzą o tym mądrzy administratorzy sieci i mają odpowiednie strategie kontroli. W sesji SSH mogą być bowiem tunelowane różnorodne zakazane usługi, które w przypadku wykorzystania konta root mogłyby pominąć wspaniale skonfigurowane zapory firewall i monitory sieci.

Patrz także • man 1 ssh-copy-id • man 1 ssh • man 1 ssh-keygen • man 8 sshd • podrozdział 8.21. „Przyznawanie ograniczonych uprawnień użytkownika root za pomo-

cą sudo” z książki Carli Schroder Linux. Receptury (Helion, 2005)

7.6. Zarządzanie wieloma kluczami identyfikacyjnymi Problem Chcemy używać różnych kluczy identyfikacyjnych dla różnych serwerów. W jaki sposób utworzyć klucze z różnymi nazwami?

Rozwiązanie Aby nadać kluczom unikatowe nazwy, należy skorzystać z flagi -f polecenia ssh-keygen: [carla@windbag:~/.ssh]$ ssh-keygen -t rsa -f id_serwerpocztowy

Następnie podczas logowania do zdalnego hosta można skorzystać z flagi -i, aby wybrać klucz do zastosowania: $ ssh -i id_serwerpocztowy [email protected] Enter passphrase for key 'id_serwerpocztowy':

Dyskusja W identyfikatorach nie ma potrzeby używania prefiksu id_. Można dla nich wykorzystywać dowolne nazwy.

7.6. Zarządzanie wieloma kluczami identyfikacyjnymi

|

237

Patrz także • man 1 ssh-copy-id • man 1 ssh • man 1 ssh-keygen • man 8 sshd

7.7. Wzmacnianie systemu OpenSSH Problem Obawiasz się zagrożeń dla bezpieczeństwa sieci, zarówno z wewnątrz, jak i z zewnątrz. Boisz się ataków siłowych na konto root i chcesz ograniczyć możliwości użytkowników, aby zapobiec szkodom, zarówno przypadkowym, jak i celowym. Co można zrobić, aby maksymalnie wzmocnić system OpenSSH?

Rozwiązanie OpenSSH jest domyślnie stosunkowo dobrze zabezpieczony. Jest jednak kilka usprawnień, które można wprowadzić. Poniżej zaprezentowano listę czynności, które można wykonać w celu dostrojenia konfiguracji. Najpierw należy zmodyfikować plik /etc/sshd_config, wprowadzając poniższe restrykcyjne dyrektywy: ListenAddress 12.34.56.78 PermitRootLogin no Protocol 2 AllowUsers carla [email protected] lori meflin AllowGroups admins

Można też zmienić port, na którym nasłuchuje demon SSH: Port 2222

Można też skonfigurować OpenSSH w taki sposób, aby logowanie z użyciem haseł było niedozwolone oraz by wszyscy użytkownicy byli zmuszeni do posiadania kluczy identyfikacyjnych. Aby to zrobić, należy wprowadzić poniższy wiersz w pliku /etc/sshd_config: PasswordAuthentication no

Na koniec konfigurujemy filtrowanie ruchu przez zaporę iptables. Blokujemy cały ruch z wyjątkiem uprawnionego (patrz rozdział 3.).

Dyskusja Wskazanie interfejsów, których nasłuchuje demon SSH, i zablokowanie możliwości logowania z uprawnieniami użytkownika root to podstawowe, oczywiste środki zabezpieczające. Opcja Protocol 2 oznacza, że serwer będzie zezwalał wyłącznie na logowanie z wykorzystaniem protokołu SSH-2 i będzie odrzucał ruch SSH-1. Standard SSH-1 jest wystarczająco stary i ma dość słabych punktów, by warto było ponosić ryzyko związane z jego używaniem. Protokół SSH-2 jest dostępny od kilku lat, zatem nie ma powodu, by w dalszym ciągu korzystać z protokołu SSH-1. 238

|

Rozdział 7. Bezpieczna, zdalna administracja z wykorzystaniem SSH

Opcja AllowUsers blokuje możliwość logowania dla wszystkich użytkowników poza wskazanymi. Można wskazać określone nazwy użytkowników lub ograniczyć możliwości jeszcze bardziej poprzez zezwolenie na logowanie tylko ze wskazanych hostów, na przykład foober@ ?bumble.com. Opcja AllowGroups zapewnia szybki sposób definiowania uprawnionych użytkowników według grup. Dla wszystkich grup niewymienionych dostęp jest zablokowany. Grupy OpenSSH są standardowymi grupami systemu Linux zdefiniowanymi w pliku /etc/group. Można również skorzystać z opcji DenyHosts lub DenyGroups. Dyrektywy te działają przeciwnie do dyrektyw Allow — wszyscy użytkownicy, którzy nie są wymienieni, mają prawo logowania. Nie należy mieszać dyrektyw Allow z dyrektywami Deny. Należy wykorzystywać jedne bądź drugie. Zmiana portu na niestandardowy pozwala na odparcie tych ataków, które wyszukują wyłącznie port 22. Pomimo tego, niektóre skanery portów wykryją numer portu, którego nasłuchuje demon SSH. W związku z tym, nie należy polegać na tym, jako na znaczącym środku bezpieczeństwa — jest to jedynie sposób na zapobieżenie zbyt szybkiemu zapełnianiu się plików dzienników.

Patrz także • man 1 passwd • man 5 sshd_config • receptura 17.13 „Uprawnienia do plików ssh” z książki Carli Schroder Linux. Receptury

(Helion, 2005)

7.8. Zmiana hasła Problem Chcesz zmienić hasło dla jednego z kluczy prywatnych.

Rozwiązanie Należy skorzystać z opcji -p polecenia ssh-keygen: $ ssh-keygen -p -f ~/.ssh/id_dsa Enter old passphrase: Key has comment '/home/pinball/.ssh/id_dsa' Enter new passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved with the new passphrase.

Dyskusja Haseł nie da się odzyskać. W przypadku utraty hasła jedyną opcją jest utworzenie nowego klucza z nowym hasłem.

7.8. Zmiana hasła

|

239

Patrz także • man1ssh-keygen

7.9. Odczytywanie odcisku klucza Problem Wysyłamy publiczny klucz hosta lub klucz identyfikacyjny do innego użytkownika i chcielibyśmy, aby użytkownik mógł sprawdzić, czy klucz jest autentyczny, poprzez potwierdzenie odcisku klucza. Nie zapisaliśmy odcisku klucza w momencie jego utworzenia — jak można go teraz uzyskać?

Rozwiązanie Można skorzystać z polecenia ssh-keygen: [carla@windbag:~/.ssh]$ ssh-keygen -l Enter file in which the key is (/home/carla/.ssh/id_rsa): id_serwerpocztowy 1024 ce:5e:38:ba:fb:ec:e7:80:83:3e:11:1a:6f:b1:97:8b id_serwerpocztowy.pub

Dyskusja Jest to jedna z sytuacji, w której przydają się stare metody komunikacji, takie jak telefon lub sieć sneakernet. Nie należy korzystać z poczty elektronicznej, chyba że wcześniej skonfigurowaliśmy szyfrowaną pocztę elektroniczną z osobnym mechanizmem szyfrowania i uwierzytelniania. W przeciwnym przypadku każdy, kto potrafi przeprowadzić atak man-in-the-middle, będzie w stanie bez trudu włamać się do naszej poczty elektronicznej. Jest to ważne zwłaszcza dlatego, ponieważ znaczna większość wiadomości e-mail jest przesyłana w formacie zwykłego tekstu. W związku z tym ich podsłuchanie jest trywialnie proste.

Patrz także • man 1 ssh-keygen

7.10. Sprawdzanie składni plików konfiguracyjnych Problem Czy istnieje narzędzie do sprawdzania składni pliku sshd_config?

Rozwiązanie Ależ oczywiście. Po wprowadzeniu zmian należy uruchomić następujące polecenie: # sshd -t

240 |

Rozdział 7. Bezpieczna, zdalna administracja z wykorzystaniem SSH

Jeśli konfiguracja nie zawiera błędów, polecenie zakończy działanie bez wyświetlania jakichkolwiek komunikatów. Jeśli znajdzie błędy, będziemy o nich poinformowani: # sshd -t /etc/ssh/sshd_config: line 9: Bad configuration option: Porotocol /etc/ssh/sshd_config: terminating, 1 bad configuration options

Sprawdzanie składni może się odbywać w czasie działania demona SSH. Dzięki temu można poprawić błędy przed wydaniem poleceń reload lub restart.

Dyskusja Opcja -t oznacza „test”. Nie ma ona wpływu na działanie demona SSH, a jedynie sprawdza, czy w pliku /etc/sshd_config nie ma błędów składniowych. Dzięki temu można z niej korzystać w dowolnym momencie.

Patrz także • man 5 sshd_config • man 8 sshd

7.11. Wykorzystanie plików konfiguracyjnych klienta OpenSSH w celu łatwiejszego logowania się Problem Mamy kolekcję różnych kluczy do uwierzytelniania na różnych serwerach i kontach oraz różne opcje polecenia ssh dla każdego z nich. Wpisywanie długich ciągów poleceń jest dość żmudne i stwarza okazję do popełnienia błędów. W jaki sposób można to ułatwić i usprawnić?

Rozwiązanie Należy umieścić poszczególne piki konfiguracyjne dla każdego z serwerów w katalogu ~/.ssh/ i wybrać ten, którego chcemy użyć, za pomocą flagi -F. W tym przykładzie wykorzystano plik konfiguracyjny serwerpocztowy w celu ustawienia opcji połączenia dla serwera jarlsberg. [carla@windbag:~/.ssh]$ ssh -F serwerpocztowy jarlsberg

W przypadku logowania się przez internet potrzebna będzie pełna, kwalifikowana nazwa domeny serwera: [carla@windbag:~/.ssh]$ ssh -F serwerpocztowy jarlsberg.carla.net

Można również podać adres IP.

Dyskusja Wykorzystanie niestandardowych plików konfiguracyjnych pozwala na bezproblemowe zarządzanie wieloma różnymi kontami. Na przykład w pliku ~/.ssh/serwerpocztowy są następujące opcje: 7.11. Wykorzystanie plików konfiguracyjnych klienta OpenSSH w celu łatwiejszego logowania się

|

241

IdentityFile ~/.ssh/id_serwerpocztowy Port 2222 User administrator_poczty

O wiele łatwiej i z mniejszym prawdopodobieństwem pomyłki wpisuje się polecenie ssh -F serwerpocztowy jarlsberg niż ssh -i id_serwerpocztowy -p 2222 -l administrator_ poczty jarlsberg. Nie należy zapominać o skonfigurowaniu alternatywnych portów SSH w ustawieniach zapory firewall oraz o sprawdzeniu, czy w pliku /etc/services nie ma nieużywanych portów. Na pojedynczym serwerze OpenSSH można otworzyć dowolną liczbę alternatywnych portów. Aby sprawdzić operacje wykonywane w sieci, można skorzystać z polecenia netstat: # netstat -a --tcp -p | grep ssh tcp6 0 0 *:2222 *:* LISTEN 7329/sshd tcp6 0 0 *:ssh *:* LISTEN 7329/sshd tcp6 0 0 ::ffff:192.168.1.1:2222 windbag.localdoma:35474 ESTABLISHED7334/ sshd: carla tcp6 0 0 ::ffff:192.168.1.11:ssh windbag.localdoma:56374 ESTABLISHED7352/ sshd: carla

Należy pamiętać, że plik /etc/sshd_config zarządza demonem SSH. Plik /etc/ssh_config zawiera globalne ustawienia klienta SSH. W katalogu ~/.ssh/ można umieścić dowolną liczbę plików konfiguracyjnych różnych klientów SSH. Demon SSH stosuje następujące priorytety: • opcje wiersza poleceń; • plik konfiguracyjny użytkownika ($HOME/.ssh/config); • systemowy plik konfiguracyjny (/etc/ssh/ssh_config).

Pliki konfiguracyjne użytkowników nie przesłaniają globalnych ustawień zabezpieczeń. Jest to korzystne z punktu widzenia spokoju administratora oraz strategii zabezpieczeń.

Patrz także • man 1 ssh • man 5 ssh_config

7.12. Bezpieczne tunelowanie komunikacji X Window z wykorzystaniem SSH Problem Co prawda posługiwanie się wierszem poleceń jest łatwe i pozwala na sprawne wykonywanie zadań, ale pomimo wszystko chcielibyśmy mieć do dyspozycji estetyczne środowisko graficzne. Być może chcemy skorzystać z graficznych narzędzi do zarządzania serwerami? A może interesuje nas dostęp do zdalnej stacji roboczej wraz ze wszystkimi jej aplikacjami? Wiemy, że system X Window ma wbudowaną obsługę sieci, ale cały jego ruch jest przesyłany zwykłym tekstem, co ze względów bezpieczeństwa jest nie do zaakceptowania. Poza tym konfiguracja X Window jest trudna. Co można zrobić w takim przypadku? 242

|

Rozdział 7. Bezpieczna, zdalna administracja z wykorzystaniem SSH

Rozwiązanie Tunelowanie komunikacji X Window w połączeniu SSH jest proste i nie wymaga dodatkowego oprogramowania. Po pierwsze, należy się upewnić, że w zdalnym komputerze, w pliku /etc/ssh/sshd_config znajduje się poniższy wiersz: X11Forwarding yes

Następnie łączymy się z serwerem z wykorzystaniem flagi -X: [carla@windbag:~/.ssh]$ ssh -X stilton Enter passphrase for key '/home/carla/.ssh/id_rsa': Linux stilton 2.6.15-26-k7 #1 SMP PREEMPT Sun Jun 3 03:40:32 UTC 2007 i686 GNU/Linux Last login: Sat June 2 14:55:10 2007 carla@stilton:~$

Teraz możemy uruchomić dowolną aplikację X zainstalowaną na zdalnym komputerze PC, wpisując polecenie jej wywołania w wierszu poleceń: carla@stilton:~$ ppracer

SSH konfiguruje serwer proxy dla komunikacji X Window. Można się o tym przekonać za pomocą następującego polecenia: carla@stilton:~$ echo $DISPLAY localhost:10.0

Dyskusja Serwer X działa z przesunięciem określonym w pliku /etc/sshd.conf: X11DisplayOffset 10

Opcję tę należy skonfigurować po to, aby zapobiec kolizjom z istniejącymi sesjami X. Przesunięcie standardowej, lokalnej sesji X wynosi: 0.0. Zdalny system musi jedynie być włączony. Nie musi być zalogowany żaden z lokalnych użytkowników. Nie musi być nawet uruchomiona sesja X. System X Window musi działać tylko na klienckich komputerach PC. Począwszy od wersji 3.8, w OpenSSH wprowadzono opcję -Y dla zdalnych sesji X. W przypadku wykorzystania opcji -Y zdalny klient X jest traktowany jako zaufany. Przestarzały sposób spowodowania takiej samej interpretacji polegał na skonfigurowaniu pliku ssh_config z opcją ForwardX11Trusted yes (domyślna wartość opcji ForwardX11Trusted to no). Użycie flagi -Y umożliwia utrzymanie domyślnej opcji no i włączenie przekazywania zaufanych sesji X w miarę potrzeb. Teoretycznie niektóre funkcje nie powinny działać na niezaufanym kliencie, ale do tej pory nie spotkałam się z żadną tego typu opcją. Ryzyko uruchomienia zdalnej sesji X jako zaufanej ma znaczenie tylko wtedy, gdy włamano się do zdalnej maszyny i napastnik wie, w jaki sposób podsłuchać operacje wejściowe, które wykonujemy (na przykład wciskane kombinacje klawiszy, ruchy myszą oraz operacje kopiuj i wklej). Te same czynności może wykonać każdy, kto siedzi przy zdalnej maszynie. Czytelnicy pamiętający czasy sprzed SSH lubią wspominać zabawy polegające na manipulowaniu sesjami X innych użytkowników, co powodowało ich dezorientację.

7.12. Bezpieczne tunelowanie komunikacji X Window z wykorzystaniem SSH

| 243

SSH pozwala na tunelowanie całej sesji X i uruchomienie ulubionego pulpitu bądź menedżera okien, na przykład Gnome, KDE, IceWM itp. Osobiście jednak tego nie polecam, ponieważ istnieją na to łatwiejsze i lepsze sposoby, o czym przekonamy się w następnym rozdziale. Nie należy używać kompresji w szybkich sieciach, ponieważ może to spowodować spowolnienie transferu danych.

Patrz także • man 1 ssh • man 5 ssh_config

7.13. Uruchamianie poleceń bez otwierania zdalnej powłoki Problem Chcemy uruchomić jedno polecenie na zdalnej maszynie. Chcielibyśmy je uruchomić bez konieczności logowania się i otwierania zdalnej powłoki, a następnie wylogowywania po uruchomieniu polecenia. W końcu administratorzy sieci są znani ze swojego lenistwa, czyż nie?

Rozwiązanie Można bez trudu wykonać te czynności. OpenSSH pozwala na tego typu operacje. Oto przykład pokazujący, w jaki sposób zdalnie zrestartować usługę Postfix: $ ssh [email protected] sudo /etc/init.d/postfix restart

Oto w jaki sposób można uruchomić grę Kpoker wymagającą sesji X Window: $ ssh -X 192.168.1.10 /usr/games/kpoker

Wyświetli się pytanie o hasło, ale pomimo wszystko ten sposób zapewnia osiągnięcie celu poprzez wykonanie jednej czynności mniej.

Dyskusja Jeśli do uruchomienia tego polecenia są potrzebne uprawnienia administratora, należy skorzystać z polecenia sudo, a nie su, ponieważ nie można używać polecenia su bez wcześniejszego otwarcia zdalnej powłoki. Jest to również przydatny sposób umieszczania zdalnych poleceń w skrypcie. Trzeba przyznać, że lenistwo jest cnotą, jeśli prowadzi do lepszej wydajności oraz prostszych metod wykonywania zadań.

Patrz także • man 1 ssh

244 |

Rozdział 7. Bezpieczna, zdalna administracja z wykorzystaniem SSH

7.14. Wykorzystanie komentarzy do opisywania kluczy Problem Mamy wiele kluczy SSH. Potrzebny jest nam prosty sposób identyfikacji kluczy publicznych po ich przesłaniu do plików known_hosts i authorized_keys2.

Rozwiązanie Można skorzystać z opcji comment podczas tworzenia klucza w celu nadania mu opisowej etykiety: $ ssh-keygen -t rsa -C "serwer pocztowy na hoscie jarlsberg"

Klucz ma następującą postać: ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAIEAoK8bYXg195hp+y1oeMWdwlBKdGkSG8UqrwKpwNU9Sbo+uGPpNxU3iAjRa LYTniwnoS0j+Nwj+POU5s9KKBf5hx+EJT/ 8wl70KyoyslPghsQAUdODoEwCzNFdIME8nm0vxzlAxS+SO45RxdXB08j8WMdC92PcMOxIB1wPCIntji0= serwerpocztowy na hoscie jarlsberg

Wykorzystanie komentarzy przydaje się, jeśli jest dużo kluczy w plikach known_hosts i authorized_keys2, ponieważ pomimo nadania kluczom niepowtarzalnych nazw nazwy kluczy nie są zapisane w tych plikach.

Dyskusja OpenSSH ignoruje pole comment. Informacje te służą jedynie wygodzie użytkowników.

Patrz także • man 1 ssh-keygen

7.15. Wykorzystanie programu DenyHosts w celu udaremnienia ataków SSH Problem W internecie roi się od świrów, którzy nie mają nic lepszego do roboty, jak siedzenie i inicjowanie zautomatyzowanych ataków SSH przeciwko światu. Pomimo zastosowania wszystkich rozsądnych zabezpieczeń i poczucia, że nasze zabezpieczenia są właściwe, pliki dzienników są przez cały czas przepełnione tymi śmieciami. Czy istnieje jakiś sposób, aby usunąć tych kretynów z drogi?

Rozwiązanie Rzeczywiście jest taki sposób. W tym celu można posłużyć się programem The DenyHosts. Program DenyHosts analizuje dziennik auth i zapisuje dane do pliku /etc/hosts.deny w celu zablokowania prób działań intruzów w przyszłości. 7.15. Wykorzystanie programu DenyHosts w celu udaremnienia ataków SSH

| 245

DenyHosts to skrypt napisany w języku Python, zatem do jego uruchomienia jest potrzebny Python w wersji 2.3 lub nowszej. Aby się dowiedzieć, jaką wersją języka Python dysponujemy, możemy skorzystać z poniższego polecenia: $ python -V Python 2.4.2

Narzędzie DenyHosts można zainstalować za pomocą menedżera Aptitude lub Yum. Aby zainstalować je z kodów źródłowych, wystarczy rozpakować archiwum tarball w katalogu, w którym ma być zapisany program DenyHosts. Wraz z programem jest dostarczany plik denyhosts.cfg.dist — modelowy plik konfiguracyjny. Należy go zmodyfikować, a następnie zapisać w pliku /etc/denyhosts.conf (aby się dowiedzieć, w jaki sposób można skonfigurować skrypt startowy, można zajrzeć do receptury 7.16). Następnie należy utworzyć „białą listę” w pliku /etc/hosts.allow. Na liście tej powinny się znaleźć wszystkie ważne hosty, których nigdy nie chcemy blokować. Przykładowa konfiguracja zaprezentowana poniżej jest umiarkowanie ostra. Należy zadbać o to, aby ścieżki dostępu były odpowiednie dla naszego systemu: WORK_DIR = /var/denyhosts/data SECURE_LOG = /var/log/auth.log HOSTS_DENY = /etc/hosts.deny BLOCK_SERVICE = sshd DENY_THRESHOLD_INVALID = 3 DENY_THRESHOLD_VALID = 5 DENY_THRESHOLD_ROOT = 1 LOCK_FILE = /tmp/denyhosts.lock HOSTNAME_LOOKUP=NO SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES AGE_RESET_VALID=1d AGE_RESET_ROOT=25d AGE_RESET_INVALID= DAEMON_PURGE = 1h DAEMON_SLEEP = 30s DAEMON_LOG_TIME_FORMAT = %b %d %H:%M:%S ADMIN_EMAIL = [email protected]

Z domyślnego pliku konfiguracyjnego można się dowiedzieć, jakie opcje są obowiązkowe, które ustawienia są opcjonalne, a także wiele innych przydatnych informacji.

Dyskusja Program DenyHosts można uruchomić ręcznie, jako zadanie cron lub w postaci demona. Osobiście preferuję tryb demona — wystarczy raz skonfigurować i można o nim zapomnieć. Aby uruchomić go ręcznie w celach testowych, należy uruchomić skrypt DenyHosts: # python denyhosts.py

Aby się zapoznać z dostępnymi opcjami poleceń, należy przeczytać skrypt denyhosts.py. Oto opis dostępnych opcji: BLOCK_SERVICE=sshd

Program DenyHosts można wykorzystać w celu zablokowania SSH. Aby zablokować wszystkie usługi, należy użyć opcji BLOCK_SERVICE = ALL. DENY_THRESHOLD_INVALID=2

Próby logowania dla nieistniejących kont są blokowane po dwóch próbach. Ponieważ konta nie istnieją, blokowanie ich niczemu nie przeszkadza. 246 |

Rozdział 7. Bezpieczna, zdalna administracja z wykorzystaniem SSH

DENY_THRESHOLD_VALID=5

Dla prawidłowych kont można podjąć pięć prób logowania. Wartość tę należy dostosować do potrzeb użytkowników. DENY_THRESHOLD_ROOT=1

Dla logowania na koncie root jest tylko jedna próba. W przypadku gdy są potrzebne uprawnienia administracyjne i tak powinniśmy najpierw zalogować się na nieuprzywilejowanym koncie, a dopiero potem skorzystać z poleceń su lub sudo. HOSTNAME_LOOKUP=Yes

Program DenyHosts wyszukuje nazwy hostów dla zablokowanych adresów IP. Własność tę można wyłączyć, jeśli zbytnio spowalnia działanie sieci. W ty celu należy użyć opcji HOSTNAME_LOOKUP = NO. SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS Spróbujmy ustawić tę opcję na YES, a następnie monitorować raporty programu DenyHosts,

aby zobaczyć, czy jest przydatna. Opcja powoduje raportowanie podejrzanych operacji wykonywanych przez hosty z pliku /etc/hosts.allow. Opcja ta może być przydatna, ale nie musi. AGE_RESET_VALID=1d

Uprawnieni użytkownicy są odblokowywani po jednym dniu, jeśli zostali zablokowani z powodu pomyłek we wprowadzaniu hasła. AGE_RESET_INVALID=

Nieprawidłowe, zablokowane konta użytkowników nigdy nie są odblokowywane. DAEMON_PURGE=3d

Usuwanie wszystkich zablokowanych adresów po trzech dniach. Plik /etc/hosts.deny bardzo mocno się rozrasta, dlatego należy pamiętać o jego okresowym opróżnianiu. DAEMON_SLEEP=5m

Jak często powinien być uruchamiany demon DenyHosts? Jest to skrypt obciążający system w niewielkim stopniu, dlatego jego częste uruchamianie nie powinno wpłynąć na wydajność systemu. Należy dostosować tę opcję do konkretnej sytuacji — w przypadku zacięć można zwiększyć częstotliwość. W określeniach czasu można stosować następujące symbole: s: sekundy; m: minuty; h: godziny; d: dni; w: tygodnie; y: lata.

Patrz także • lista najczęściej zadawanych pytań (FAQ) na temat programu DenyHosts:

http://denyhosts.sourceforge.net/faq.html

7.15. Wykorzystanie programu DenyHosts w celu udaremnienia ataków SSH

|

247

7.16. Tworzenie skryptu startowego programu DenyHosts Problem Zainstalowaliśmy program DenyHosts z archiwum tarball z kodami źródłowymi. W związku z tym chcemy wiedzieć, jak można skonfigurować skrypt inicjalizacyjny umożliwiający uruchomienie demona przy starcie systemu oraz uruchamianie go i zatrzymywanie ręczne.

Rozwiązanie Modelowy skrypt startowy jest zapisany w pliku daemon-control-dist. Należy go odpowiednio zmodyfikować w zależności od dystrybucji Linuksa. Modyfikacje należy wprowadzić tylko w pierwszej sekcji: ##################################################### # Poniższe opcje należy ustawić stosownie do konfiguracji danego systemu # ##################################################### DENYHOSTS_BIN = "/usr/bin/denyhosts.py" DENYHOSTS_LOCK = "/var/lock/subsys/denyhosts" DENYHOSTS_CFG = "/etc/denyhosts.cfg"

Należy zadbać o to, aby ścieżki dostępu były odpowiednie dla naszego systemu. Następnie należy nadać plikowi sensowną nazwę, na przykład /etc/init.d/denyhosts. Konfigurację programu DenyHosts w celu jego uruchamiania przy starcie systemu przeprowadza się w zwykły sposób — za pośrednictwem skryptu chkconfig w dystrybucjach Red Hat i Fedora oraz update-rc.d w dystrybucji Debian: # chkconfig denyhosts --add # chkconfig denyhosts on # update-rc.d start 85 2 3 4 5 . stop 30 0 1 6 .

Ręczne zatrzymywanie i uruchamianie programu DenyHosts wykonuje się standardowo: # /etc/init.d/denyhosts {start|stop|restart|status|debug}

Taką możliwość mają również użytkownicy dystrybucji Fedora: # /etc/init.d/denyhosts condrestart

Uruchomienie tego polecenia powoduje zrestartowanie programu DenyHosts tylko wtedy, gdy już jest uruchomiony, w przeciwnym przypadku program kończy działanie bez wyświetlania żadnych komunikatów.

Dyskusja W przypadku tworzenia nowego skryptu startowego w dystrybucji Fedora należy wcześniej dołączyć program do listy programów kontrolowanych przez polecenie chkconfig. W tym celu należy skorzystać z polecenia chkconfig--add. Następnie można skorzystać z polecenia chkconfig foo on/off w celu uruchomienia lub zatrzymania programu w momencie startu systemu.

248 |

Rozdział 7. Bezpieczna, zdalna administracja z wykorzystaniem SSH

Patrz także • lista najczęściej zadawanych pytań (FAQ) na temat programu DenyHosts:

http://denyhosts.sourceforge.net/faq.html • rozdział 7. „Uruchamianie i zamykanie systemu Linux” z książki Carli Schroder Linux.

Receptury (Helion, 2005)

7.17. Montowanie zdalnego systemu plików za pomocą sshfs Problem OpenSSH jest dość szybki i wydajny. Nawet tunelowanie sesji X Window w połączeniu z OpenSSH nie wnosi zbyt dużych opóźnień. Czasami jednak jest potrzebny szybszy sposób modyfikacji zbioru zdalnych plików — jest potrzebne coś wygodniejszego od scp i łagodniejszego dla pasma od uruchamiania graficznego menedżera plików przez SSH.

Rozwiązanie sshfs jest odpowiednim narzędziem do tego celu. Pozwala ono na zamontowanie całego zdal-

nego systemu plików i korzystanie z niego tak jak z lokalnego. Najpierw należy zainstalować program sshfs. Operacja ta powinna również spowodować zainstalowanie modułu jądra fuse. Jako punkt montowania potrzebny jest katalog lokalny: carla@xena:~$ mkdir /sshfs

Następnie sprawdzamy, czy został załadowany moduł jądra fuse: $ lsmod|grep fuse fuse

46612

1

Jeśli nie, należy uruchomić polecenie modprobe fuse. Następnie dodajemy swoje konto użytkownika do grupy fuse. Można teraz zalogować się na zdalnym PC i przystąpić do pracy: carla@xena:~$ sshfs uberpc: sshfs/ carla@uberpc's password: carla@xena:~$

W tym momencie w katalogu ~/sshfs powinien być zamontowany zdalny system plików, równie dostępny jak lokalny. Po wykonaniu potrzebnych operacji należy odmontować zdalny system plików: $ fusermount -u sshfs/

Dyskusja Użytkownicy, dla których posługiwanie się programem sshfs jest nowością, zawsze zadają takie pytania: czy nie można po prostu uruchomić sesji X w łączu SSH lub skorzystać z systemu plików NFS? 7.17. Montowanie zdalnego systemu plików za pomocą sshfs

| 249

Zamontowanie zdalnego systemu plików jest szybsze od uruchomienia sesji X przez SSH, jest znacznie łatwiejsze do konfiguracji niż NFS i o wiele bardziej bezpieczne. To właśnie dlatego korzystamy z sshfs.

Patrz także • man 1 sshfs

250

|

Rozdział 7. Bezpieczna, zdalna administracja z wykorzystaniem SSH

ROZDZIAŁ 8.

Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

8.0. Wprowadzenie Tunelowanie sesji X w łączu SSH (opisane w poprzednim rozdziale) to jeden z dobrych sposobów uruchomienia zdalnego graficznego pulpitu. W Linuksie zarówno w tej dziedzinie, jak i w pozostałych obszarach jest kilka dobrych rozwiązań tego samego problemu. W tym rozdziale przyjrzymy się kilku dodatkowym programom gwarantującym inne sposoby uruchamiania zdalnych graficznych pulpitów. Powiemy, jak działa praca sieciowa z wykorzystaniem wielu platform oraz zdalna pomoc techniczna (helpdesk). Znacznie łatwiej jest zdalnie zarządzać komputerem użytkownika i rozwiązywać powstałe u niego problemy niż próbować diagnozować i naprawiać komputer przez telefon (cały czas zastanawiam się, jak komuś mogło przyjść do głowy, że to jest dobry pomysł). W świecie Linuksa jest dostępnych kilka sposobów na uruchomienie zdalnego graficznego pulpitu z doskonałą wydajnością dla wielu platform — zwłaszcza systemów Linux i Windows. W tym rozdziale zajmiemy się trzema różnymi aplikacjami: rdesktop, FreeNX oraz VNC.

rdesktop rdesktop to linuksowy klient, który pozwala na nawiązanie połączenia z usługami terminalowymi systemu Windows NT/2000/2003 za pośrednictwem protokołu RDP (Remote Desktop Protocol) oraz z wykorzystaniem programu Remote Desktop Connection w systemie Windows XP Pro. Program może dołączyć się do istniejącej sesji lub rozpocząć nową.

FreeNX Program FreeNX umożliwia uruchamianie graficznych pulpitów w wolnych łączach z dużymi opóźnieniami (na przykład modemowych) z zadowalającymi szybkościami. W bieżącej wersji pozwala on na logowanie się do komputerów linuksowych z klientów pracujących w systemach Windows, Solaris i Mac OS X. Program ma wbudowaną obsługę szyfrowania i pozwala na skonfigurowanie dowolnego pulpitu lub menedżera okien do wykorzystania w zdalnej sesji. Program obsługuje wyłącznie nowe, niezależne sesje X, zatem nie ma możliwości podłączenia się do istniejącej sesji X. 251

FreeNX ma kilka wad. Korzystanie z niego wymaga darmowego klienta linuksowego firmy NoMachine, który zależy od kilku bardzo starych bibliotek (komercyjny program NXServer korzysta z tego samego klienta). Wersje klienta i serwera muszą być ze sobą zgodne, co jest sporym problemem, ponieważ firma NoMachine rozprowadza tylko najnowsze wersje klientów, a pakiety serwera FreeNX nie zawsze mogą być zaktualizowane. Po uruchomieniu programu jego podstawowe funkcje pracują bez zarzutu, ale wybór pulpitu czasem nie działa oraz występują problemy ze współdzieleniem plików i drukarek. Firma NoMachine dostarcza również użytkownikom Linuksa darmowy serwer NX. Można go wykorzystać w przypadku, gdy nie jesteśmy w stanie spowodować, aby serwer FreeNX (open source) działał w taki sposób, w jaki sobie tego życzymy. Podobnie jak klient, serwer również zależy od kilku bardzo starych bibliotek, które trzeba zdobyć i zainstalować. Kiedy uda się zainstalować program, jego działanie jest szybkie, a wbudowane mechanizmy szyfrowania funkcjonują bez zarzutu. Moim zdaniem rozwiązaniem zasługującym na rekomendację jest VNC i wiele jego pochodnych. Jest to system o otwartym kodzie, bardzo elastyczny oraz łatwy w obsłudze i niezawodny. Potrzebne szyfrowanie? Można zastosować tunelowanie przez SSH.

VNC System VNC (Virtual Network Computing) jest dziadkiem międzyplatformowych zdalnych pulpitów. Jest to program niezwykle elastyczny. Jest dostępny w wielu odmianach i obsługuje większość systemów operacyjnych: Mac OS X, Linux, różne odmiany systemów Unix i Windows. Dzięki temu w praktyce pozwala na logowanie do dowolnego systemu i z dowolnego systemu. Pod Linuksem można utworzyć nowe niezależne sesje logowania lub dołączyć się do istniejącej sesji X za pomocą programu x11vnc. Unikatową własnością VNC jest możliwość kontrolowania dowolnych dwóch komputerów z wykorzystaniem jednej klawiatury i jednej myszy. System VNC jest w użytkowaniu na tyle długo, że doczekał się licznych klonów, odmian i programów pomocniczych. Jeśli zależy nam na niezawodności, należy wybierać utrwalone, stabilne wersje: • TightVNC (http://www.tightvnc.com/) to szybka odmiana systemu RealVNC. Dobrze spraw-

dza się w wolnych połączeniach, zwłaszcza po zainstalowaniu nowego sterownika wideo dla Windows DFMirage. • RealVNC (http://www.realvnc.com/) oferuje dobre wersje zarówno darmowe, jak i komercyjne. • UltraVNC (http://ultravnc.sourceforge.net/) to dobre narzędzie administracji Windows-Win-

dows. Program jest wyposażony w wiele usprawnień specyficznych dla Windowsa, takich jak lustrzany sterownik wideo podobny do DFMirage, szyfrowanie, monitorowanie użytkowników oraz zdolność logowania z uprawnieniami dowolnego użytkownika. • MSRC4 DSM (http://home.comcast.net/~msrc4plugin/) to wtyczka typu open source do pro-

gramu UltraVNC. • OS X VNC (http://www.redstonesoftware.com/VNC.html) to serwer VNC dla systemu Mac OS X. • Chicken of the VNC (http://sourceforge.net/projects/cotvnc/) to przeglądarka VNC dla syste-

mu Mac OS X. Nazwa została wybrana wyjątkowo nietrafnie. • Win2VNC (http://fredrik.hubbe.net/win2vnc.html) to windowsowy serwer VNC pozwalający

na współdzielenie myszy i klawiatury z drugim komputerem PC.

252

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

• x2VNC (http://fredrik.hubbe.net/x2vnc.html) to linuksowy serwer VNC pozwalający na współ-

dzielenie myszy i klawiatury z drugim komputerem PC. • x11vnc (http://www.karlrunge.com/x11vnc/) pozwala na dołączenie do istniejącej sesji X za-

miast uruchamiania nowej. Jest to doskonałe narzędzie dla osób, które lubią przemieszczać się z miejsca na miejsce pomiędzy komputerami PC, oraz do wykonywania zdalnych zadań pomocy technicznej. Istnieje wiele odmian programu VNC przeznaczonych dla innych platform. Oto fragment tej listy: • serwer VNC dla systemu MorphOS: http://binaryriot.com/dreamolers/vncserver/; • MorphVNC — klient VNC dla systemu MorphOS: http://bigfoot.morphos-team.net/files/; • TwinVNC — klient VNC dla systemów MorphOS i AmigaOS: http://twinvnc.free.fr/; • klient VNC J2ME dla telefonów komórkowych z obsługą języka Java™:

http://j2mevnc.sourceforge.net/; • VNCViewer — klient VNC dla systemu PocketPC:

http://www.cs.utah.edu/~midgley/wince/vnc.html; • serwer VNCServer dla Pocket PC oraz serwer dla systemu WindowsCE.NET:

http://www.pocketvnc.com/pocketVNC.aspx; • klient PalmVNC dla systemu Palm OS: http://palmvnc2.free.fr/.

Wbudowane mechanizmy współdzielenia pulpitów w środowiskach KDE i Gnome Zarówno środowisko KDE, jak i Gnome są wyposażone we wbudowane mechanizmy współdzielenia pulpitu. W środowisku KDE program nosi nazwę KDE Remote Desktop Connection. Można go uruchomić z wiersza poleceń za pomocą polecenia krdc. Program KRDC obsługuje zarówno połączenia VNC, jak i RDP (Remote Desktop Protocol) — windowsowy protokół współdzielenia zdalnego pulpitu. Mechanizm współdzielenia zdalnego pulpitu w środowisku Gnome bazuje na programie Vino — serwerze VNC dla środowiska Gnome. Program nie obsługuje RDP, a jedynie VNC. Obie implementacje są dobrze zrealizowane i łatwe w użytkowaniu.

8.1. Nawiązywanie połączeń z Linuksa do Windowsa za pomocą programu rdesktop Problem Chcemy się zalogować na serwerze Windows NT/2000/2003 lub stacji roboczej Windows XP Pro ze stacji roboczej Linux. Chcemy mieć dostęp do własnego pulpitu w systemie Windows oraz chcemy korzystać z aplikacji i zarządzać usługami. Nie chcemy instalować dodatkowego oprogramowania w komputerze windowsowym w celu umożliwienia zdalnego dostępu. Chcemy, aby komputer linuksowy był klientem windowsowych usług terminalowych. 8.1. Nawiązywanie połączeń z Linuksa do Windowsa za pomocą programu rdesktop

|

253

Rozwiązanie Można skorzystać z programu rdesktop — klienta typu open source protokołu RDP. Protokół RDP jest wykorzystywany przez usługi terminalowe systemu Windows. rdesktop to standardowy pakiet dostępny w większości dystrybucji Linuksa. Aby przygotować program rdesktop do pracy, wykonaj następujące czynności: • zainstaluj rdesktop w systemie Linux; • skonfiguruj usługi terminalowe na serwerze NT/2000/2003 lub współdzielenie zdalnego

pulpitu w systemie XP Professional; • zadbaj o to, aby konta, na które chcemy się logować, wymagały haseł; • w komputerze windowsowym musi być załadowany system, ale użytkownicy nie muszą

być zalogowani; • zaloguj się z poziomu Linuksa i przystąp do pracy.

Poniższy przykład pokazuje, jak zalogować się w Windowsie z wykorzystaniem adresu IP i określając rozmiar okna: $ rdesktop -g 1024x768 192.168.1.22

Wyświetli się znajome okno logowania systemu Windows. Program rdesktop obsługuje tryb pełnoekranowy. Aby przełączać się pomiędzy trybem pełnoekranowym a działaniem w oknie, należy wcisnąć kombinację klawiszy Ctrl+Alt+Enter. Na rysunku 8.1 pokazano dzieło stworzone z wykorzystaniem programu rdesktop.

Rysunek 8.1. Dzieło sztuki wykonane za pomocą programu rdesktop

254

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

To wszystko! Aby zakończyć sesję po zakończeniu pracy w systemie Windows, należy wybrać polecenie Start/Wyloguj lub Start/Rozłącz. Polecenie Wyloguj zamyka wszystkie aplikacje. Wybranie polecenia Rozłącz powoduje, że w dalszym ciągu są one uruchomione. Dzięki temu można do nich powrócić przy następnym połączeniu.

Dyskusja Jeśli użytkownik jest zalogowany do Windowsa, rdesktop dołącza się do istniejącej sesji i blokuje dostęp lokalny. Użytkownik może się logować z dowolnych lokalizacji i powracać do punktu, w którym pozostawił system, o ile wybierze polecenie Rozłącz zamiast Wyloguj. Należy pamiętać, że pozostawienie działających aplikacji zużywa więcej zasobów na serwerze. Jeśli serwer terminali systemu Windows jest skonfigurowany tak, aby wykorzystywał inny port niż 3389, należy określić inny port w momencie logowania. Można to zrobić w następujący sposób: $ rdesktop -g 1024x768 192.168.1.22:3000

Trzeba oczywiście sprawdzić, czy port nie jest zablokowany przez zaporę firewall. Istnieją pewne ograniczenia korzystania z usług terminalowych Windows i programu rdesktop. Program działa tylko z systemem Windows XP Professional oraz serwerami Windows NT/ 2000/2003. W serwerach Windows NT i 2000 serwer terminali zazwyczaj musi być instalowany osobno. W systemach Windows 2003 oraz Windows XP Professional jest to własność wbudowana. W przypadku zakupu odpowiedniej licencji z serwerów windowsowych może korzystać jednocześnie wielu klientów. W systemie XP Professional w danym momencie może logować się tylko jeden użytkownik, a pulpit jest zablokowany po to, by zapobiec przypadkowym szkodom. Administracja systemem jest w pewnym sensie ograniczona. Podczas instalowania aplikacji mogą wystąpić problemy z uprawnieniami, ponieważ Windows postrzega użytkownika, który jest zdalnym administratorem, jako różnego od lokalnego. W związku z tym może się zdarzyć, że w wyniku zdalnej konfiguracji powstaną dwa zestawy plików konfiguracyjnych i zapisów w rejestrze. TightVNC to program pozwalający na uruchomienie dowolnej wersji Windowsa z poziomu Linuksa, natomiast UltraVNC to dobry wybór programu do zdalnej administracji Windows-Windows, działający w dowolnej wersji Windowsa. W żadnym z tych programów nie mają znaczenia takie elementy, jak liczba klientów lub licencje serwera terminali.

Patrz także • man 1 rdesktop • w książce Jonathana Hassella Learning Windows Server 2003 (O’Reilly) oraz publikacji

Stefana Norberga Securing Windows NT/2000 Servers for the Internet (O’Reilly) znajdują się rozdziały, w których dobrze opisano usługi terminalowe systemu Windows • artykuł bazy wiedzy Microsoft nr 247930: Cannot Install Some Programs in a Terminal Ser-

vices Client Session

8.1. Nawiązywanie połączeń z Linuksa do Windowsa za pomocą programu rdesktop

|

255

• wyniki wyszukiwania frazy „Problemy z licencją serwera terminali” w witrynie http://

www.microsoft.com • serwis NoMachine: http://nomachine.com/

8.2. Generowanie i zarządzanie kluczami SSH systemu FreeNX Problem Pobraliśmy FreeNX spod adresu http://freenx.berlios.de/download.php i zainstalowaliśmy go. Program jest wyposażony w zbiór domyślnych kluczy SSH. W jaki sposób stworzyć własne klucze? Domyślne otrzymują przecież wszyscy na całym świecie.

Rozwiązanie Można skorzystać z programu /usr/bin/nxkeygen w celu wygenerowania nowej pary kluczy. Następnie należy skopiować nowy plik /var/lib/nxserver/home/.ssh/client.id_dsa.key do klienckich komputerów PC. Jeśli tego się nie zrobi, zdalne logowanie nie będzie możliwe. W systemie Windows klucze należy skopiować do katalogu \Program Files\NX Client for Windows\Share\. W systemach Linux, Mac OS X i Solaris klucze należy umieścić w pliku /usr/NX/share/.

Dyskusja Niepasujące do siebie klucze serwera i klienta to najczęstsza przyczyna niepowodzeń logowania.

Patrz także • podręcznik administratora serwera NX:

http://www.nomachine.com/documentation/admin-guide.php

8.3. Wykorzystanie FreeNX do uruchamiania Linuksa z poziomu Windowsa Problem Potrzebujemy możliwości zdalnego dostępu do komputera linuksowego z Windowsa. Jest kilka linuksowych aplikacji, z których chcielibyśmy skorzystać, a które nie są dostępne w systemie Windows, lub do wykonania zadań administracyjnych w systemie Linux mamy do dyspozycji jedynie komputer windowsowy. Co więcej, chcemy, aby w pełni graficzna sesja linuksowa w zadowalający sposób działała poprzez wolne łącze (nawet modemowe). Chcemy mieć możliwość użycia wybranego menedżera pulpitu lub menedżera okien. 256

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

Rozwiązanie Nasze życzenia nie są wyszukane. Na szczęście system FreeNX zaprojektowano specjalnie do tego celu. Aby przygotować program do pracy, wykonaj następujące czynności:

Skonfiguruj serwer Należy zainstalować serwer FreeNX w komputerze linuksowym, do którego chcemy się zdalnie logować. Następnie dodajemy uprawnionych użytkowników na serwerze FreeNX. Nazwę użytkownika i hasło należy utworzyć osobno. Użytkownicy programu FreeNX muszą mieć wcześniej skonfigurowane konta na serwerze: # nxserver --adduser pinball NX> 100 NXSERVER - Version 1.5.0-50 OS (GPL) NX> 1000 NXNODE - Version 1.5.0-50 OS (GPL) NX> 716 Public key added to: /home/pinball/.ssh/authorized_keys2 NX> 1001 Bye. NX> 999 Bye # nxserver --passwd pinball NX> 100 NXSERVER - Version 1.5.0-50 OS (GPL) New password: Password changed. NX> 999 Bye

Osobliwością programu FreeNX jest to, że jest tylko jedna szansa na wprowadzenie hasła. W związku z tym trzeba zachować ostrożność. Następnie należy się upewnić, czy na serwerze FreeNX działa demon OpenSSH oraz czy zapora firewall nie blokuje portu o numerze 22.

Pobranie klienta Przejdź do serwisu NoMachine.com (http://www.nomachine.com/) w celu pobrania darmowego klienta do zainstalowania w komputerze windowsowym. Należy się upewnić, czy główny i pomocniczy numer wersji klienta są takie same jak serwera FreeNX. Wersję serwera FreeNX można odczytać za pomocą następującego polecenia: # nxserver --version NX> 100 NXSERVER - Version 1.5.0-50 OS (GPL)

A zatem musimy pobrać klienta w wersji 1.5.x. Sposób rozwiązywania problemów ze znalezieniem odpowiedniego klienta można znaleźć w punkcie „Dyskusja”. Po zdobyciu odpowiedniego klienta można skonfigurować operację logowania z poziomu systemu Windows.

Skonfiguruj połączenie Aby otworzyć okno kreatora połączenia, kliknij ikonę NX Client For Windows (rysunek 8.2). Wpisz nazwę konfiguracji w wierszu Session. Na przykład nadaj nowej sesji nazwę windbag1. W wierszu Host trzeba wprowadzić nazwę hosta lub jego adres IP. Wybierz typ połączenia i kliknij Next.

8.3. Wykorzystanie FreeNX do uruchamiania Linuksa z poziomu Windowsa

|

257

Rysunek 8.2. Kreator konfiguracji klienta systemu NoMachine

W oknie Desktop wybierz Unix. Następnie wybierz pulpit Linuksa, który ma się wyświetlić w zdalnej sesji, oraz rozmiar okna w sposób pokazany na rysunku 8.3.

Rysunek 8.3. Konfiguracja ustawień pulpitu

Zaznacz opcję Enable SSL w celu zaszyfrowania całego ruchu, a następnie kliknij Next. Zaznacz opcję Create shortcut on desktop, a Nxclient utworzy skrót o nazwie windbag1. Upewnij się, że nazwa logowania zawiera litery odpowiedniej wielkości. Wpisz hasło i kliknij, aby się zalogować. Aktywną sesję pokazano na rysunku 8.4.

258

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

Rysunek 8.4. Estetyczny pulpit Linuksa wyświetlony z poziomu systemu Windows

Aby zamknąć sesję FreeNX, należy się wylogować ze zdalnego pulpitu w zwykły sposób. Można również kliknąć przycisk zamknięcia w oknie Nxclient. W odpowiedzi na to kliknięcie wyświetli się okno dialogowe z pytaniem o to, czy chcemy zawiesić (ang. suspend), czy zakończyć sesję (ang. terminate). W przypadku zawieszenia sesji uruchomione aplikacje nie będą zamknięte. Dzięki temu można się zalogować później i wznowić sesję w punkcie, w którym ją pozostawiliśmy. Zamknięcie sesji zamyka wszystkie aplikacje.

Dyskusja Jeśli próba nawiązania połączenia z serwerem zakończy się wyświetleniem komunikatu o błędzie: Unable to create the X authorization cookie, będzie to oznaczało, że Nxclient poszukuje programu xauth w niewłaściwej lokalizacji. Aby to poprawić, należy utworzyć dowiązanie symboliczne: # cd /usr/X11R6/bin # ln -sf /usr/bin/xauth

Kiedy firma NoMachine wydała wersję 2.0 programu, przestała rozwijać system FreeNX. Serwer FreeNX 1.5 nie działa z klientami NoMachine 2.0 bez modyfikacji konfiguracji, a nawet w tym przypadku może działać niestabilnie. W czasie, kiedy powstawała ta książka, można było pobrać starsze wersje klientów NoMachine z serwisu internetowego Industrial-Statistics. com: http://www.industrial-statistics.com/info/nxclients?IndStats=47ebcaa422e76eba8af14a1b6f31d971.

8.3. Wykorzystanie FreeNX do uruchamiania Linuksa z poziomu Windowsa

|

259

Inna możliwość to modyfikacja serwera FreeNX 1.5 do pracy z klientami NoMachine 2.0. Odpowiednie informacje można znaleźć na stronie FreeNX FAQ/Problem Solving pod adresem http://openfacts.berlios.de/index-en.phtml?title=FreeNX_FAQ/Problem_Solving. Domyślnie w systemie Nxclient nazwa bieżącego użytkownika systemu Windows na ekranie logowania Nxclient wyświetla się jako słowo pisane wielką literą. W operacjach logowania do systemu Linux wielkość liter ma znaczenie, dlatego należy zachować ostrożność. Można się zalogować z wykorzystaniem dowolnego użytkownika FreeNX. Nie ma znaczenia, jakie konto windowsowe jest w danym momencie aktywne. Okno logowania programu Nxclient pozwala na zapamiętanie hasła. Jest to wygodne, ale stwarza oczywiste zagrożenie dla bezpieczeństwa. Włączenie SSL powoduje zaszyfrowanie całego ruchu. Zaleca się używanie SSL przez cały czas. Warto zwiększyć rozmiar czcionki używanej w plikach dzienników. Domyślna czcionka jest prawie zupełnie nieczytelna. Można to zrobić w zakładce Environment. Aby uzyskać dostęp do wszystkich zakładek konfiguracyjnych, należy otworzyć okno NX Client For Windows, a następnie kliknąć przycisk Configure. Można skorzystać z dowolnego środowiska pulpitu lub menedżera okien, pod warunkiem, że jest zainstalowany na serwerze FreeNX. Jednak w czasie powstawania tej książki wybór innej opcji niż KDE lub Gnome powodował problemy z działaniem systemu. W przypadku dodania nowego użytkownika na serwerze FreeNX klucz użytkownika jest kopiowany z pliku /etc/nxserver/users.id_dsa.pub do pliku /home/user/.ssh/authorized_keys2. Na podstawie haseł użytkowników FreeNX są tworzone skróty i zapisywane w pliku /etc/ nxserver/passwords.

Patrz także • strona pobierania systemu NoMachine:

http://www.nomachine.com/download.php • centrum pomocy technicznej serwisu NoMachine.com:

http://www.nomachine.com/support.php • podręcznik administratora serwera NX:

http://www.nomachine.com/documentation/admin-guide.php

8.4. Wykorzystanie FreeNX w celu uruchomienia sesji Linuksa z poziomu systemów Solaris, Mac OS X lub Linux 8.4. Wykorzystanie FreeNX w celu uruchomienia Linuksa z poziomu systemów Solaris, Mac OS X lub Linux

Problem Nie interesuje nas zdalny dostęp do komputera linuksowego z Windowsa — chcemy uzyskać do niego dostęp z komputera PC pracującego w systemie Solaris, Mac OS X lub Linux. W jaki sposób je skonfigurować, by były klientami systemu FreeNX? 260

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

Rozwiązanie Należy to zrobić dokładnie tak samo jak w przypadku systemu Windows — w sposób pokazany w poprzedniej recepturze. Po skonfigurowaniu serwera FreeNX należy pobrać i zainstalować odpowiedniego klienta ze strony pobierania systemu NoMachine (http://www.nomachine. com/download.php). Następnie należy uruchomić kreatora połączenia NX Connection Wizard za pomocą polecenia /usr/NX/bin/nxclient--wizard. Należy skonfigurować go dokładnie w taki sam sposób jak pod Windowsem — interfejs klienta wygląda tak samo na wszystkich platformach. Jest jedna ważna różnica: klucz klienta jest kopiowany do folderu /usr/NX/share/keys/. Poza tym wszystkie operacje są identyczne. Jeśli przy próbie instalacji klienta nxclient użytkownicy dystrybucji Debian uzyskają komunikat o błędzie z informacją, że są wymagane biblioteki libstdc++2.10-glibc2.2 oraz libpng.so, będzie to oznaczało, że należy zdobyć te stare biblioteki i je zainstalować. Powinny one być dostępne w repozytoriach Woody Debiana. Użytkownicy dystrybucji Fedora powinni poszukać pakietu compat-libstdc++-296.

Dyskusja Kiedy firma NoMachine wydała wersję 2.0, przestała rozwijać system FreeNX. Serwer FreeNX 1.5 nie działa z klientami NoMachine 2.0 bez modyfikacji konfiguracji, a nawet w tym przypadku może działać niestabilnie. W czasie powstawania niniejszej książki można było pobrać starsze klienty systemu NoMachine z serwisu Industrial-Statistics.com (http://www.industrial-statistics.com/info/nxclients?IndStats=47ebcaa422e76eba8af14a1b6f31d971). Inna możliwość to modyfikacja serwera FreeNX 1.5 do pracy z klientami NoMachine 2.0. Informacje na ten temat można znaleźć na stronie FreeNX FAQ/Problem Solving, pod adresem http://openfacts.berlios.de/index-en.phtml?title=FreeNX_FAQ/Problem_Solving. Niektórzy czytelnicy być może zastanawiają się, po co instalować system FreeNX na platformach uniksowych, skoro tunelowanie sesji X w łączu OpenSSH jest standardowe i łatwe? Odpowiedź brzmi: ponieważ system FreeNX oferuje znacznie lepszą wydajność, zwłaszcza w przypadku użycia wolnych łączy. Kurt Pfeifle, jeden z głównych programistów systemu FreeNX, powiedział, że „pełnoekranowa sekwencja startowa dla sesji KDE 3.2 w przypadku użycia zdalnego połączenia X wymaga przesłania 4,1 MB danych. W przypadku uruchomienia w łączu NX objętość przesyłanych danych spada do 35 KB dzięki kombinacji kompresji, pamięci podręcznej oraz efektu minutowego przesunięcia w systemie NX” („Linux Journal” online, artykuł The Arrival of NX, Part 4 dostępny pod adresem http://www.Linuxjournal.com/ node/8489/). Oznacza to, że użytkownicy posługujący się połączeniem modemowym o szybkości co najmniej 40 Kb/sek odczują tylko niewielkie opóźnienie. W przypadku użycia lekkiego menedżera okien, na przykład IceWM lub Xfce, zauważalna wydajność będzie jeszcze lepsza (pod warunkiem, że uda się je poprawnie skonfigurować).

8.4. Wykorzystanie FreeNX w celu uruchomienia Linuksa z poziomu systemów Solaris, Mac OS X lub Linux |

261

Patrz także • strona pobierania systemu NoMachine:

http://www.nomachine.com/download.php • centrum pomocy technicznej serwisu NoMachine.com:

http://www.nomachine.com/support.php • podręcznik administratora serwera NX:

http://www.nomachine.com/documentation/admin-guide.php

8.5. Zarządzanie użytkownikami w systemie FreeNX Problem Chcemy się dowiedzieć, w jaki sposób wyświetlić listę użytkowników FreeNX, a także dodać bądź usunąć użytkownika.

Rozwiązanie Aby wyświetlić, dodać bądź usunąć użytkowników, należy skorzystać z poleceń wymienionych poniżej. Wcześniej należy się zalogować na koncie użytkownika root. W celu zademonstrowania przykładów skorzystamy z naszego ulubionego użytkownika pinball: # /usr/bin/nxserver --listuser # /usr/bin/nxserver --adduser pinball # /usr/bin/nxserver --adduser pinball

Administrator może zmienić hasła użytkowników, a także użytkownicy mogą zmienić swoje hasła, za pomocą opcji --passwd: # /usr/bin/nxserver --passwd pinball

Dyskusja Należy pamiętać, że użytkownik systemu FreeNX musi być najpierw użytkownikiem Linuksa — musi posiadać konto, na którym mógłby się zalogować.

Patrz także • aby obejrzeć listę wszystkich poleceń serwera, należy skorzystać z polecenia /usr/bin/

nxserver--help z uprawnieniami użytkownika root • centrum pomocy technicznej serwisu NoMachine.com:

http://www.nomachine.com/support.php • podręcznik administratora serwera NX:

http://www.nomachine.com/documentation/admin-guide.php

262

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

8.6. Obserwowanie użytkowników programu Nxclient z serwera FreeNX Problem Potrzebujemy centralnej konsoli zarządzania po to, by móc obserwować, kto jest zalogowany na serwerze FreeNX. Chcemy mieć możliwość kończenia sesji, przeglądania historii użytkowników i przesyłania do użytkowników ważnych komunikatów.

Rozwiązanie Można skorzystać z polecenia /usr/bin/nxserver. Aby zobaczyć listę zalogowanych użytkowników, można skorzystać z poniższego polecenia: # nxserver --list NX> 100 NXSERVER - Version 1.5.0-50 OS (GPL) NX> 127 Sessions list: Display ------1003 1001 NX> 999

Username Remote IP Session ID --------------- --------------- -------------------------------carla 192.168.1.17 1D0FB6F2759E350067E911D245E9 pinball 192.168.1.19 64A6BBAE7E9BDD8BC79EE5FCAB Bye

Historię sesji użytkownika można wyświetlić, posługując się poniższym poleceniem: # nxserver --history pinball NX> 100 NXSERVER - Version 1.5.0-50 OS (GPL) NX> 127 Session list: Display Username Remote IP Session ID Date Status ------- --------------- --------------- -------------------------------- ------------------ ----------1000 pinball 192.168.1.17 B5870BA4DF456E9126B0561402 2006-12-14 04:25:06 Finished 1001 pinball 192.168.1.17 64A6BBAE7E9BDB1C79EE5FCAB 2006-12-18 09:56:12 Running NX> 999 Bye

Użytkownik pinball stwarza problemy. W związku z tym chcemy usunąć go z serwera. Pojedynczą sesję można zakończyć, posługując się identyfikatorem sesji: # nxserver --terminate 64A6BBAE7E9BDB1C79EE5FCAB

Można też zamknąć wszystkie sesje użytkownika pinball, posługując się jego nazwą użytkownika: # nxserver --terminate pinball

Można przesyłać komunikaty do wskazanych użytkowników bądź do wszystkich: # nxserver --send pinball "Proszę zapisać swoją pracę. Rozłączenie nastąpi za pięć sekund." # nxserver --broadcast "Proszę zapisać swoją pracę. Za pięć sekund nastąpi rozłączenie, a potem idziemy na ucztę."

A oto polecenie, które przydaje się do usunięcia sesji pozostałych po awarii zasilania: # nxserver --cleanup

8.6. Obserwowanie użytkowników programu Nxclient z serwera FreeNX

|

263

Dyskusja Zaprezentowany sposób przydaje się również w przypadku problemów ze zdalnymi sesjami FreeNX. Na przykład jeśli zalogowaliśmy się z wielu różnych lokalizacji, możemy skorzystać z SSH w celu połączenia z serwerem FreeNX oraz użyć poleceń nxserver, aby zobaczyć, ile jest aktywnych sesji, i je zamknąć.

Patrz także • aby obejrzeć listę wszystkich poleceń serwera, należy skorzystać z polecenia /usr/bin/

nxserver--help z uprawnieniami użytkownika root • centrum pomocy technicznej serwisu NoMachine.com:

http://www.nomachine.com/support.php • podręcznik administratora serwera NX:

http://www.nomachine.com/documentation/admin-guide.php

8.7. Uruchamianie i zatrzymywanie serwera FreeNX Problem Nigdzie nie widzimy demona nx lub FreeNX, ale wiemy, że on działa. W jaki sposób można go zatrzymać i uruchomić oraz jak się sprawdza jego status?

Rozwiązanie W tym celu można skorzystać z poniższych trzech poleceń: # /usr/bin/nxserver --start # /usr/bin/nxserver --stop # /usr/bin/nxserver --status

System FreeNX korzysta z usług dostarczanych przez ssh, dlatego nie możemy zobaczyć działającego demona FreeNX. Jednak zatrzymanie systemu FreeNX nie ma wpływu na ssh lub inne usługi logowania.

Dyskusja Oto jak powinien wyglądać wynik działania poleceń wymienionych powyżej: # nxserver --status NX> 100 NXSERVER - Version 1.5.0-50 OS (GPL) NX> 110 NX Server is running NX> 999 Bye # nxserver --stop NX> 100 NXSERVER - Version 1.5.0-50 OS (GPL) NX> 123 Service stopped NX> 999 Bye # nxserver --status NX> 100 NXSERVER - Version 1.5.0-50 OS (GPL) NX> 110 NX Server is stopped NX> 999 Bye

264 |

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

# nxserver --start NX> 100 NXSERVER - Version 1.5.0-50 OS (GPL) NX> 122 Service started NX> 999 Bye

System FreeNX zazwyczaj nie wymaga zbyt wiele obsługi. Zwykle nie trzeba też dostrajać jego konfiguracji. Główny plik konfiguracyjny to /etc/nxserver/node.conf./usr/bin/nxserver. Jest to zwykły rozbudowany skrypt powłoki. Można go zmodyfikować, jeśli ktoś ma taką potrzebę.

Patrz także • aby obejrzeć listę wszystkich poleceń serwera, należy skorzystać z polecenia /usr/bin/

nxserver--help z uprawnieniami użytkownika root • centrum pomocy technicznej serwisu NoMachine.com:

http://www.nomachine.com/support.php • podręcznik administratora serwera NX:

http://www.nomachine.com/documentation/admin-guide.php

8.8. Konfigurowanie spersonalizowanego pulpitu Problem Kreator połączenia daje tylko cztery możliwości wyboru zdalnego pulpitu: KDE, Gnome, CDE oraz Custom. Nie chcemy menedżera KDE, Gnome lub CDE. Chcielibyśmy zastosować inny menedżer okien, na przykład IceWM lub Xfce. W związku z tym oczywistą opcją, którą należy wybrać, jest Custom. W jaki sposób konfiguruje się niestandardowe pulpity?

Rozwiązanie Najpierw należy się upewnić, że pulpit, który chcemy wykorzystać, jest zainstalowany na serwerze FreeNX. Następnie w systemie klienckim uruchamiamy aplikację Connection Wizard. Na zakładce Desktop aplikacji Connection Wizard należy kliknąć Custom, a następnie Settings. Aby wybrać swój pulpit, należy w oknie Settings kliknąć Run the following command, a następnie wpisać polecenie, które uruchamia wybrany pulpit. Zaznaczyć opcję New virtual desktop. Teraz wystarczy kliknąć OK, aby zakończyć konfigurację. Przykład zaprezentowano na rysunku 8.5.

Dyskusja W obecnej wersji systemu w przypadku niektórych niestandardowych pulpitów mogą wystąpić problemy z uruchomieniem. Należy sprawdzić, czy wersje serwera i klienta są ze sobą zgodne. W przeciwnym przypadku mogą wystąpić problemy z wyświetlaniem zdalnego pulpitu. Czasami nawet jego użytkowanie

8.8. Konfigurowanie spersonalizowanego pulpitu

|

265

Rysunek 8.5. Konfiguracja niestandardowego pulpitu

może się okazać niemożliwe. Klienty i serwer muszą mieć te same numery wersji — głównych i pomocniczych. W związku z tym serwerom w wersji 1.5.0-50 muszą odpowiadać klienty w wersji począwszy od 1.5. Środowiska Gnome i KDE działają dobrze nawet w przypadku wykorzystania wolnych łączy. Aby uzyskać lepszą wydajność, można skorzystać z „lekkich” menedżerów okien, takich jak IceWM lub Xfce. Są one w pełni funkcjonalne, ale wymagają mniej zasobów. System FreeNX jest jednak tak wydajny, że w przypadku zastosowania wolniejszego łącza zwykle nie zauważymy zbyt wyraźnej różnicy w porównaniu z łączem szybszym. Polecenia uruchamiającego wybrany menedżer okien lub pulpit należy szukać w dokumentacji wybranego programu. Niektóre wymagają tylko uruchomienia binarnego pliku wykonywalnego, dla innych trzeba utworzyć skrypt startowy. Kilka przykładów zestawiono w tabeli 8.1. Tabela 8.1. Polecenia uruchamiania popularnych menedżerów okien Menedżer okien

Polecenie uruchomienia

Afterstep

Afterstep

Enlightenment

Enlightenment

FVWM

vwm2

Gnome

gnome-session

IceWM

Icewm

KDE

Startkde

TWM

Twm

Xfce

tartxfce4

266

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

Wprowadzanie pełnej ścieżki dostępu do poleceń nie jest konieczne, o ile katalog, w którym znajduje się potrzebny plik wykonywalny, jest uwzględniony w zmiennej $PATH na serwerze FreeNX.

Patrz także • informacje o różnych menedżerach okien można znaleźć w serwisie XWinman (http://

xwinman.org/) • aby obejrzeć listę wszystkich poleceń serwera, należy skorzystać z polecenia /usr/bin/

nxserver--help z uprawnieniami użytkownika root • centrum pomocy technicznej serwisu NoMachine.com:

http://www.nomachine.com/support.php • podręcznik administratora serwera NX:

http://www.nomachine.com/documentation/admin-guide.php

8.9. Tworzenie dodatkowych sesji programu Nxclient Problem Mamy kilka zdalnych maszyn linuksowych, do których chcielibyśmy się zalogować. W jaki sposób skonfigurować dodatkowe sesje Nxclient?

Rozwiązanie Za każdym razem, kiedy chcemy utworzyć nową sesję, należy uruchomić aplikację NX Connection Wizard. W systemie Windows należy uruchomić polecenie Start/Nxclient For Windows/ NX Connection Wizard. W systemach Linux, Solaris i Mac OS X należy uruchomić polecenie /usr/NX/bin/nxclient --wizard.

Dla każdego pulpitu można utworzyć nowy skrót. Spowoduje to również wypełnienie rozwijanego menu na ekranie logowania Nxclient z nazwami poszczególnych sesji.

Dyskusja Nxclient jest wyposażony w dodatki pozwalające na tworzenie menu i ikon na pulpicie, nawet w systemie Linux. To, czy zostaną one zainstalowane, zależy od wybranej dystrybucji Linuksa.

Patrz także • aby obejrzeć listę wszystkich poleceń serwera, należy skorzystać z polecenia /usr/bin/

nxserver--help z uprawnieniami użytkownika root

8.9. Tworzenie dodatkowych sesji programu Nxclient

|

267

• centrum pomocy technicznej serwisu NoMachine.com:

http://www.nomachine.com/support.php • podręcznik administratora serwera NX:

http://www.nomachine.com/documentation/admin-guide.php

8.10. Monitorowanie sesji Nxclient za pomocą programu NX Session Administrator Problem Chcesz monitorować i zarządzać sesjami Nxclient — rozpoczynać i zatrzymywać sesje, przeglądać dzienniki, zbierać statystyki i monitorować wydajność. W jaki sposób można to zrobić?

Rozwiązanie Można skorzystać z programu NX Session Administrator, dostarczanego razem z programem Nxclient. W klientach z systemem Windows należy poszukać skrótu NX Session Administrator. W systemach Linux, Solaris i Mac OS X należy uruchomić polecenie /usr/NX/bin/nxclient --admin. Z programu korzysta się w oczywisty sposób — wystarczy wybrać właściwe polecenia menu. Interesujące jest menu Session — można w nim znaleźć wszystkie dzienniki, statystyki oraz przekonać się, jak wydajny, jeśli chodzi o wykorzystanie pasma, jest system FreeNX.

Dyskusja Zarówno projektanci systemów KDE, jak i Gnome dążą do integracji systemów FreeNX i Nxclient. Należy zatem mieć oczy szeroko otwarte i szukać narzędzi specyficznych dla środowisk KDE i Gnome.

Patrz także • aby obejrzeć listę wszystkich poleceń serwera, należy skorzystać z polecenia /usr/bin/

nxserver--help z uprawnieniami użytkownika root • centrum pomocy technicznej serwisu NoMachine.com:

http://www.nomachine.com/support.php • podręcznik administratora serwera NX:

http://www.nomachine.com/documentation/admin-guide.php

268

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

8.11. Włączenie współdzielenia plików i drukarek oraz obsługi multimediów w programie Nxclient Problem Skonfigurowaliśmy Sambę do współdzielenie plików i drukarek oraz podsystem drukowania CUPS. Chcemy współdzielić pliki i drukarki za pośrednictwem systemu FreeNX zamiast uruchamiania osobnego klienta Samby lub pakietu CUPS. Zauważyliśmy również, że efekty dźwiękowe nie są odtwarzane w kliencie Nxclient, pomimo tego, że są odtwarzane na hoście. W jaki sposób spowodować, aby efekty dźwiękowe działały zdalnie.

Rozwiązanie W systemie Microsoft Windows należy otworzyć aplikację Nxclient For Windows. W systemach Linux, Mac OS X i Solaris należy uruchomić polecenie /usr/NX/bin/nxclient. Kliknij przycisk Configure i przejdź do zakładki Services. Można tu znaleźć wszystkie pola wyboru pozwalające na włączenie obsługi multimediów oraz współdzielenie plików i drukarek.

Dyskusja W systemie należy wcześniej skonfigurować i przygotować do pracy Sambę i pakiet CUPS. Nxclient automatycznie wyszukuje wszystkie dostępne udziały — wystarczy wybrać z listy wyboru te, które są potrzebne.

Patrz także • w rozdziałach 14., 15. i 23. w książce Carli Schroder Linux. Receptury (Helion, 2005) opisa-

no sposób konfiguracji pakietu CUPS i Samby • aby obejrzeć listę dostępnych poleceń, można skorzystać z polecenia /usr/NX/bin/nxclient

--help

8.12. Zapobieganie zapisywaniu haseł w programie Nxclient Problem Chcemy trochę wzmocnić stronę klienta poprzez zablokowanie użytkownikom możliwości zapisywania haseł na ekranie logowania Nxclient.

8.12. Zapobieganie zapisywaniu haseł w programie Nxclient

|

269

Rozwiązanie Utwórz pusty plik w komputerze-kliencie i nadaj mu nazwę /usr/NX/share/nopasswd: # touch /usr/NX/share/nopasswd

W klientach windowsowych należy utworzyć plik \Program Files\Nxclient For Windows\Share\ nopasswd. Wykonanie tej czynności blokuje zapisywanie nazwy logowania i hasła.

Dyskusja Jeśli użytkownicy często zmieniają swoje miejsce bądź z jednego komputera z systemem Windows korzysta wielu użytkowników, lub są to terminale dostępne publicznie, warto zadbać o zablokowanie użytkownikom możliwości zapisywania haseł. Oczywiście wcześniej należy zadbać o to, aby dla użytkownika plik nopasswd miał tryb tylko do odczytu. W systemie Linux nie jest to trudne: # chown root:root nopasswd # chmod 644 nopasswd

W systemie Windows nie jest to tak proste. W systemach Windows NT, 2000, 2003 i XP Pro, w których działa system plików NTFS, można dostrajać uprawnienia do indywidualnych plików. Aby ustawić właściciela pliku i uprawnienia dostępu, wystarczy kliknąć prawym przyciskiem myszy ikonę pliku i przejść do zakładki Zabezpieczenia. Jednak w systemach Windows korzystających z systemu plików FAT32 nie ma list kontroli dostępu. Własności tej jest również pozbawiony system Windows XP Home oraz system Windows XP Pro w trybie prostego współdzielenia plików. W systemie Windows XP Pro proste udostępnianie plików jest domyślnie włączone. Aby je wyłączyć, należy kliknąć ikonę Mój komputer, a następnie wybrać polecenie Narzędzia/Opcje folderów/Widok i w obszarze Ustawienia zaawansowane anulować zaznaczenie opcji Użyj prostego udostępniania plików (zalecane). Należy to zrobić, korzystając z konta Administrator, ponieważ własność prostego udostępniania plików włącza się bądź wyłącza na poziomie użytkownika. Trzeba również ukryć plik nopasswd jako niewielkie zabezpieczenie dodatkowe.

Patrz także • aby obejrzeć listę wszystkich poleceń serwera, należy skorzystać z polecenia /usr/bin/

nxserver--help z uprawnieniami użytkownika root • centrum pomocy technicznej serwisu NoMachine.com:

http://www.nomachine.com/support.php • podręcznik administratora serwera NX:

http://www.nomachine.com/documentation/admin-guide.php

270

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

8.13. Rozwiązywanie problemów z FreeNX Problem Nie można nawiązać połączenia — pomocy!

Rozwiązanie Najpierw należy sprawdzić zawartość pliku /var/log/nxserver.log. Jeśli plik dziennika nie jest wystarczająco szczegółowy, należy przejść do pliku /etc/nxserver/node.conf i podwyższyć poziom szczegółowości rejestrowania zdarzeń. Dopuszczalne wartości mieszczą się w zakresie 0 – 7. Zazwyczaj wystarczający jest poziom 6.: NX_LOG_LEVEL=6

Nxclient jest wyposażony we własną przeglądarkę plików zdarzeń. Jest ona dostępna w programie NX Session Administrator za pośrednictwem menu Session/View session log. Pliki dzienników nie zawsze zawierają takie informacje, o których chcielibyśmy wiedzieć. Oto lista znanych problemów, które można łatwo rozwiązać: • należy sprawdzić, czy w komputerach-klientach nie jest zablokowany port 3389; • należy sprawdzić, czy na serwerze nie jest zablokowany port 22; • należy się upewnić, czy nazwa hosta bądź adres IP serwera FreeNX są prawidłowe; • należy sprawdzić, czy rozprowadzone klucze klienckie są prawidłowe — często się zdarza,

że administrator tworzy nową pary kluczy podczas instalacji serwera i zapomina o dystrybucji kluczy klienckich; • należy sprawdzić ścieżki dostępu do plików w pliku /etc/nxserver/node.conf oraz na klien-

tach NX.

Patrz także • centrum pomocy technicznej serwisu NoMachine.com:

http://www.nomachine.com/support.php • podręcznik administratora serwera NX:

http://www.nomachine.com/documentation/admin-guide.php

8.14. Wykorzystanie VNC do zarządzania Windowsem z poziomu Linuksa Problem Chcesz zdalnie zarządzać stacją roboczą lub serwerem Windows z poziomu komputera linuksowego albo chcesz mieć możliwość zdalnego zarządzania komputerem PC użytkownika w celu świadczenia pomocy helpdesk lub zdalnej administracji. 8.14. Wykorzystanie VNC do zarządzania Windowsem z poziomu Linuksa

|

271

Rozwiązanie Potrzebny jest system VNC (Virtual Network Computing). Dostępnych jest kilka odmian systemu VNC. W recepturach zaprezentowanych w tym rozdziale skorzystamy z implementacji TightVNC. VNC składa się z dwóch części: serwera i klienta (nazywanego przeglądarką). Najpierw należy zainstalować serwer TightVNC oraz sterownik DFMirage w systemie Windows (patrz serwis internetowy TightVNC: http://www.tightvnc.com/). Następnie należy zainstalować dowolną przeglądarkę VNC w systemie Linux. W niektórych dystrybucjach takie przeglądarki są zainstalowane domyślnie. Przeglądarka TightVNC zawiera przeglądarkę Javy, zatem każda przeglądarka internetowa z obsługą Javy może być przeglądarką VNC. Instalator Windows przeprowadzi nas przez kilka czynności instalacyjnych. Jedno z głównych pytań dotyczy tego, czy program TightVNC ma działać w trybie usługi, czy aplikacji. Tryb działania programu TightVNC można modyfikować w dowolnym momencie za pomocą poleceń Install VNC Service lub Remove VNC Service. Należy użyć trybu aplikacji w przypadku, gdy TightVNC jest wykorzystywany okazjonalnie, oraz trybu usługi, jeśli jest wykorzystywany często. Ważne są następujące opcje konfiguracji: • Należy pamiętać, aby na zakładce Server włączyć opcję Accept Socket Connections. • Należy zadbać o ustawienie haseł w polach Primary Password oraz View-Only Password.

Hasła nie mogą mieć więcej niż osiem znaków.

• W obrębie zakładki Administration należy zaznaczyć opcję Disable Empty Passwords. • Aby umożliwić używanie przeglądarki internetowej jako klienta, należy zaznaczyć opcję

Enable built-in HTTP server. • Opcja Enable logging; jeśli nie ma problemów, nie ma potrzeby włączania opcji debugowania.

Teraz możemy nawiązać połączenie z dowolnej przeglądarki VNC w dowolnym systemie operacyjnym. W tym celu wystarczy wprowadzić adres IP lub nazwę hosta komputera windowsowego. Ekran logowania programu Xvnc4viewer pokazano na rysunku 8.6.

Rysunek 8.6. Ekran logowania programu Xvnc4viewer

Można skorzystać z dowolnej przeglądarki z obsługą VNC, na przykład KDE Remote Desktop Connection, Gnome remote desktop, jtightvncviewer, vncviewer lub xvnc4viewer. Aby zamknąć zdalną sesję, wystarczy zamknąć okno. Aby otworzyć sesję VNC w przeglądarce WWW, należy wpisać w pasku adresu http://[nazwa_ hosta_lub_adres_IP]:5800. 272

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

Należy zwrócić uwagę na to, że wszystkie dane są przesyłane zwykłym tekstem, a uwierzytelnianie jest słabo chronione. W związku z tym nie należy korzystać z tej własności w niezaufanych sieciach.

Dyskusja W dystrybucji Debian przeglądarka Javy TightVNC jest dostępna jako osobny pakiet: tightvnc-java. Aby zaszyfrować sesję VNC, można wykorzystać tunelowanie VNC w łączu SSH (patrz receptura 8.22). Własność tę można wykorzystać na wszystkich platformach, które obsługują SSH i VNC. W odróżnieniu od programu rdesktop system VNC działa w dowolnej wersji systemu Windows. Ponieważ serwer TightVNC jest zabezpieczony oddzielnym hasłem, można się zalogować do dowolnej aktywnej sesji Windowsa. Nie ma znaczenia, jaki użytkownik systemu Windows jest zalogowany. Aby było możliwe zdalne logowanie w trybie aplikacji, użytkownik Windowsa musi być wcześniej zalogowany na windowsowym komputerze PC. W trybie usługi nie ma takiej potrzeby. Zmiany w konfiguracji serwera TightVNC działającego w trybie usługi mogą wprowadzać tylko użytkownicy Windowsa z uprawnieniami administratora. Dzięki temu zdalni użytkownicy nie mogą zamknąć serwera VNC lub zmienić jego ustawień. Kiedy serwer TightVNC działa w trybie aplikacji, każdy użytkownik Windowsa może go uruchomić według własnego życzenia. Zdalni użytkownicy mogą modyfikować ustawienia serwera VNC, a nawet go zamknąć. Jest to wygodne dla użytkowników, ale równocześnie to potencjalna luka w zabezpieczeniach.

Patrz także • RealVNC: http://www.realvnc.com/ • TightVNC: http://www.tightvnc.com/ • UltraVNC — narzędzie zdalnej administracji Windows-Windows:

http://ultravnc.sourceforge.net/

8.15. Korzystanie z VNC w celu jednoczesnego zarządzania systemami Windows i Linux Problem Jesteśmy zmuszeni do korzystania zarówno z windowsowego, jak i linuksowego komputera PC. Oczywiście moglibyśmy przeskakiwać od krzesła do krzesła lub przesuwać je w tę i z powrotem, ale byłoby miło, gdyby udało się zarządzać obydwoma komputerami z wykorzystaniem tej samej klawiatury i myszy. W tym celu nie chcemy jednak wydawać pieniędzy na sprzętowy przełącznik. 8.15. Korzystanie z VNC w celu jednoczesnego zarządzania systemami Windows i Linux

|

273

Rozwiązanie Jak zwykle, świat Linuksa oferuje mnóstwo przydatnych narzędzi. Oprócz windowsowego serwera VNC (zobacz poprzednia receptura) potrzebny będzie program x2vnc. Za zarządzanie obydwoma komputerami będzie oczywiście odpowiedzialny Linux. Najpierw należy zainstalować program x2vnc w systemie. Następnie należy się upewnić, że windowsowy serwer VNC działa i akceptuje połączenia. Następnie uruchamiamy x2vnc: $ x2vnc 192.168.1.28:0 -west x2vnc: VNC server supports protocol version 3.7 (viewer 3.3) Password: x2vnc: VNC authentication succeeded x2vnc: Desktop name "powerpc-w2k" x2vnc: Connected to VNC server, using protocol version 3.3 x2vnc: VNC server default format:

I oto mamy do dyspozycji odpowiednie narzędzie. Opcja -west oznacza kierunek w lewo, zatem wystarczy przesunąć kursor do lewej krawędzi ekranu w systemie Linux, a wyświetli się on na ekranie systemu Windows. Teraz można zarządzać obydwoma komputerami z wykorzystaniem tej samej klawiatury i myszy.

Dyskusja Jak można zauważyć, ten sposób zapewnia nieco żywszą pracę w porównaniu ze standardową sesją VNC, ponieważ na każdym z komputerów działają macierzyste sesje, a nie wirtualne serwery graficzne. Pokazany sposób można wykorzystać wyłącznie do zarządzania Windowsem z poziomu Linuksa. Aby zasadniczą sesją była ta, która działa na windowsowym komputerze PC, należy wykorzystać program Win2VNC na komputerze windowsowym oraz wybrany serwer VNC na komputerze z systemem Linux. Uruchomienie dwóch linuksowych komputerów PC wymaga klienta x11vnc do komunikacji z serwerem VNC. Działanie programu x2vnc polega na utworzeniu okna przełączenia o szerokości jednego piksela na krawędzi ekranu. Umieszczenie wskaźnika myszy w tym oknie powoduje przełączenie sterowania do komputera windowsowego. Od tej chwili ruchy myszą i ruchy klawiszy wciskanych na klawiaturze są przesyłane do komputera z systemem Windows. Oto opis kilku przydatnych opcji: -resurface

Użycie tej opcji powoduje, że okno przełączania znajduje się na wierzchu, dzięki czemu nie może być przykryte przez inne okno. -edgewidth 3

W przypadku problemów z oknem przełączania można spróbować je poszerzyć. Ustawienie opcji na wartość 0 powoduje całkowite jego wyłączenie. W takiej sytuacji przełączanie pomiędzy zarządzanymi komputerami odbywa się za pomocą skrótów klawiaturowych.

274

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

-debug

W przypadku problemów można zwiększyć poziom szczegółowości komunikatów diagnostycznych. -hotkey

Często spotykany komunikat o błędzie to Warning: Failed to bind x2vnc hotkey, hotkey disabled. Za pomocą opcji -hotkey można określić używany klawisz skrótu. Aby to zrobić, należy skorzystać z następującego polecenia: $ x2vnc -hotkey F12 192.168.1.28:0 -west

Wciskanie klawisza F12 powoduje przełączanie kursora pomiędzy ekranami — w jedną i w drugą stronę. Domyślny klawisz skrótu to Ctrl+F12. Równie dobrze można jednak użyć dowolnej kombinacji klawiszy.

Patrz także • man 1 x2vnc

8.16. Wykorzystanie VNC do zdalnej administracji Linux-Linux Problem Chcemy wykorzystać VNC do zarządzania innym komputerem linuksowym z poziomu systemu Linux.

Rozwiązanie Na obu komputerach linuksowych należy zainstalować serwer VNC i wybrane przeglądarki. W tej recepturze wykorzystamy serwer TightVNC. Uruchamiamy serwer VNC na pierwszym komputerze PC. W tym przykładzie pokazano pierwsze uruchomienie programu, podczas którego są tworzone pliki konfiguracyjne serwera i hasło: carla@windbag:~$ tightvncserver You will require a password to access your desktops. Password: Verify: New 'X' desktop is windbag:1 Creating default startup script /home/carla/.vnc/xstartup Starting applications specified in /home/carla/.vnc/xstartup Log file is /home/carla/.vnc/windbag:1.log

Następnie program zakończy działanie. Uruchamiamy go ponownie: carla@windbag:~$ tightvncserver New 'X' desktop is windbag:2 Starting applications specified in /home/carla/.vnc/xstartup Log file is /home/carla/.vnc/windbag:2.log

Zwróćmy uwagę, że program wyświetla wszystkie niezbędne informacje: parametry połączenia, plik konfiguracyjny oraz lokalizacje plików dzienników.

8.16. Wykorzystanie VNC do zdalnej administracji Linux-Linux

|

275

Następnie przechodzimy do drugiego komputera linuksowego, otwieramy przeglądarkę VNC i posługując się nazwą hosta, nawiązujemy połączenie: windbag:2

Można też wykorzystać adres IP: 192.168.1.28:2

Wyświetli się pytanie o hasło. Po poprawnym podaniu hasła połączenie zostanie nawiązane. Sesje tightvncserver można zamknąć na serwerze w sposób pokazany poniżej (z użyciem numeru sesji): $ tightvncserver -kill :2 Killing Xtightvnc process ID 24306

Należy zwrócić uwagę na to, że podanie numeru sesji jest obowiązkowe, ponieważ Linux umożliwia uruchomienie wielu serwerów VNC w tym samym czasie.

Dyskusja Jeśli skonfigurowano serwer w taki sposób, aby wykorzystywał inny numer portu niż domyślny 5800 (dla ruchu HTTP) lub 5900 (przeglądarka VNC), należy określić numer portu w konfiguracji klienta. Oto przykład ustawienia portu numer 6000: windbag:6002

VNC dodaje numer sesji do numeru portu, zatem sesji 3. odpowiada numer 6003 itd. Jak łatwo zauważyć, uruchomienie komputera linuksowego z poziomu systemu Linux działa szybciej niż w sytuacji wykorzystania VNC do uruchomienia Windowsa z Linuksa. Ten efekt wynika stąd, że VNC musi jedynie obsługiwać komunikację X Window, a program ten został stworzony właśnie do tego celu. W związku z tym VNC musi jedynie przesyłać w łączu TCP/IP dane wprowadzane za pomocą klawiatury i myszy. Nie musi replikować całego ekranu, tak jak w przypadku systemu Windows, w którym wykorzystywany jest zupełnie inny podsystem graficzny. W rezultacie VNC musi co jakiś czas wykonywać zrzut ekranu i przesyłać kopię ekranu Windows. Na jednym komputerze linuksowym można uruchomić dowolną liczbę serwerów VNC. Wystarczy otworzyć nowe egzemplarze serwera VNC. Nowy ekran zostanie przypisany automatycznie: $ tightvncserver New 'X' desktop is windbag:3 Starting applications specified in /home/carla/.vnc/xstartup Log file is /home/carla/.vnc/windbag:3.log

Można robić cuda i nawiązywać połączenia w dowolnych kierunkach. Można nawet utworzyć topologię rozety poprzez nawiązanie połączeń z innymi komputerami PC z poziomu sesji zdalnych. Aby się dowiedzieć, ile serwerów zostało uruchomionych w komputerze lokalnym, można skorzystać z polecenia ps ax | grep vnc: 18737 pts/1 S 0:00 Xtightvnc :1 -desktop X -httpd /usr/share/tightvnc-java auth /home/carla/.Xauthority -geometry 1024x768 -depth 24 -rfbwait 120000 -rfbauth / home/carla/.vnc/passwd -rfbport 5901 -fp /usr/share/X11/fonts/misc,/usr/share/X11/

276

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

fonts/cyrillic,/usr/share/X11/fonts/100dpi/:unscaled,/usr/share/X11/fonts/75dpi/: unscaled,/usr/share/X11/fonts/Type1,/usr/share/X11/fonts/CID,/usr/share/X11/fonts/ 100dpi,/usr/share/X11/fonts/75dpi,/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType,/ var/lib/defoma/x-ttcidfont-conf.d/dirs/CID -co /usr/X11R6/lib/X11/rgb 19479 pts/5 S 0:00 Xtightvnc :2 -desktop X -httpd /usr/share/tightvnc-java auth /home/carla/.Xauthority -geometry 1024x768 -depth 24 -rfbwait 120000 -rfbauth / home/carla/.vnc/passwd -rfbport 5902 -fp /usr/share/X11/fonts/misc,/usr/share/X11/ fonts/cyrillic,/usr/share/X11/fonts/100dpi/:unscaled,/usr/share/X11/fonts/75dpi/: unscaled,/usr/share/X11/fonts/Type1,/usr/share/X11/fonts/CID,/usr/share/X11/fonts/ 100dpi,/usr/share/X11/fonts/75dpi,/var/lib/defoma/x-ttcidfont-conf.d/dirs/TrueType,/ var/lib/defoma/x-ttcidfont-conf.d/dirs/CID -co /usr/X11R6/lib/X11/rgb

Aby je wszystkie zatrzymać, należy skorzystać z polecenia killall Xtightvnc. Nie należy bezpośrednio uruchamiać programu Xtightvnc, ponieważ tightvncserver to skrypt-opakowanie, który wykonuje potrzebne testy i generuje opisowe komunikaty o błędach.

Patrz także • RealVNC: http://www.realvnc.com/ • TightVNC: http://www.tightvnc.com/ • UltraVNC — narzędzie zdalnej administracji Windows-Windows:

http://ultravnc.sourceforge.net/

8.17. Wyświetlanie tego samego pulpitu Windows dla wielu zdalnych użytkowników Problem Chcemy uruchomić zdalną demonstrację dla kilku użytkowników lub przeprowadzić szkolenie, w którym kilka osób może korzystać z tego samego zdalnego pulpitu w systemie Windows.

Rozwiązanie TightVNC obsługuje wielu działających równolegle użytkowników. Połączenie może nawiązać każdy użytkownik posiadający przeglądarkę VNC: w systemie Linux, Mac lub Windows. Najpierw należy skonfigurować serwer TightVNC w systemie Windows w taki sposób, by akceptował wiele połączeń. Należy kliknąć dwukrotnie ikonę VNC w zasobniku systemowym lub wybrać polecenie Start/TightVNC/Show User Settings. Następnie należy przejść do zakładki Administration i zaznaczyć opcję Automatic shared sessions. Od tej pory użytkownicy mogą logować się do Windowsa w standardowy sposób. Wystarczy, że wpiszą nazwę hosta lub adres IP windowsowego komputera PC z poziomu klienta VNC. W przeglądarkach VNC należy ustawić numer portu 5900. W przeglądarce KDE Remote Desktop Connection (KRDC) posługiwanie się systemem wygląda tak, jak pokazano na rysunkach 8.7 i 8.8.

8.17. Wyświetlanie tego samego pulpitu Windows dla wielu zdalnych użytkowników

|

277

Rysunek 8.7. Ekran logowania

Rysunek 8.8. Znów w domu. Na ranczo

Wyobraźmy sobie teraz, co się stanie, kiedy wszyscy użytkownicy nawiążą połączenie — czy lepiej będzie, jeśli będą mieli kontrolę nad myszą i klawiaturą, czy też należy je zablokować. Czy zdalna kontrola ma być możliwa tylko w okresie bezczynności lokalnego użytkownika Windows? Opcje te można skonfigurować na zakładce Server w grupie Input handling.

Dyskusja Serwer TightVNC nie zawiera żadnych narzędzi monitorowania użytkowników — jedyny sposób, w jaki wyświetla połączenia klienckie, jest zmiana koloru ikony w zasobniku systemowym. Kliknięcie prawym przyciskiem myszy ikony w zasobniku systemowym daje dostęp do kilku opcji zarządzania klientami. Można zablokować możliwość nawiązywania połączeń przez nowych użytkowników lub odłączyć całą grupę połączonych klientów. 278

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

Sesję można również przeglądać w przeglądarce WWW z obsługą Javy. Parametry połączenia należy wprowadzić w formacie standardowego adresu URL, dodając numer portu: http://powerpc:5800

Można też wykorzystać adres IP: http://192.168.1.28:5800

W dystrybucji Debian należy skorzystać z pakietu tightvnc-java zainstalowanego na serwerze. Archiwa RPM serwera TightVNC oraz archiwa tarball z kodem źródłowym zawierają komponent języka Java.

Patrz także • RealVNC: http://www.realvnc.com/ • TightVNC: http://www.tightvnc.com/ • UltraVNC — narzędzie zdalnej administracji Windows-Windows:

http://ultravnc.sourceforge.net/

8.18. Zmiana hasła serwera VNC w systemie Linux Problem W jaki sposób zmienić hasło do linuksowego serwera VNC?

Rozwiązanie Należy skorzystać z polecenia vncpasswd: $ vncpasswd Password: Verify:

Dyskusja Należy pamiętać o poinformowaniu użytkowników o zmianie haseł. Można również całkiem zrezygnować z haseł, jeśli taka konfiguracja nam odpowiada.

Patrz także • man 1 vncpasswd • RealVNC: http://www.realvnc.com/ • TightVNC: http://www.tightvnc.com/ • UltraVNC — narzędzie zdalnej administracji Windows-Windows:

http://ultravnc.sourceforge.net/

8.18. Zmiana hasła serwera VNC w systemie Linux

|

279

8.19. Personalizacja zdalnego pulpitu VNC Problem Domyślny zdalny pulpit VNC w systemie Linux jest tylko trochę lepszy od standardowej sesji SSH — do dyspozycji mamy zaledwie prosty menedżer okien, na przykład TWM lub Metacity oraz Xterm. W jaki sposób uzyskać dostęp do wybranego menedżera okien lub zdalnego pulpitu?

Rozwiązanie Należy zmodyfikować plik ~/.vnc/xstartup na serwerze. Oto jego domyślna zawartość: #!/bin/sh xrdb $HOME/.Xresources xsetroot -solid grey x-terminal-emulator -geometry 80x24+10+10 -ls -title "Pulpit $VNCDESKTOP" & x-window-manager &

W przypadku braku pliku ~/.Xresources, ten wiersz należy ująć w komentarz. Wystarczy zastąpić polecenie x-window-manager poleceniem uruchomienia wybranego menedżera okien, na przykład: icewm &

Po każdym wprowadzeniu zmian w pliku należy zatrzymać serwer i uruchomić go ponownie: $ tightvncserver -kill :1 $ tightvncserver

Następnie można się ponownie zalogować ze zdalnego komputera PC. W tabeli 8.2 zestawiono przykładowe polecenia uruchomienia różnych menedżerów okien. Aby można było z nich skorzystać, trzeba je zainstalować na serwerze. Tabela 8.2. Polecenia uruchamiania popularnych menedżerów okien Menedżer okien

Polecenie uruchomienia

Afterstep

afterstep

Enlightenment

enlightenment

FVWM

fvwm2

Gnome

gnome-session

IceWM

icewm

KDE

startkde

TWM

twm

Xfce

startxfce4

Dyskusja W przypadku problemów z konfiguracją najpierw należy sprawdzić pliki dzienników w katalogu ~/.vnx.

280 |

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

W internecie można znaleźć wiele sprzecznych informacji na temat sposobów personalizacji zdalnych pulpitów. Dokumentacja programu VNC również nie jest zbyt pomocna. To bardzo źle, ponieważ dostosowywanie zdalnego środowiska nie jest trudne. Wystarczy jedynie zmodyfikować plik ~/.vnc/xstartup, tak jak pokazano w poniższym przykładzie: #!/bin/sh xsetroot -gray kwrite & konqueror & icewm &

Polecenie xsetroot ustawia kolor tła menedżera okien. Należy wymienić wszystkie aplikacje, które mają się automatycznie uruchomić — po jednej aplikacji w wierszu. Nie należy zapomnieć o tym, aby zakończyć każdy wiersz operatorem &. Jeśli się tego nie zrobi, aplikacje będą zablokowane i nie będą działały. Operator & to polecenie dla powłoki Bash kontynuowania przetwarzania kolejnych wierszy. Jeśli się go nie użyje, powłoka Bash zatrzymuje się i oczekuje na zakończenie poprzednich poleceń.

Patrz także • man 1 vncserver

8.20. Ustawianie rozmiaru zdalnego pulpitu VNC Problem Spersonalizowany pulpit VNC działa doskonale, ale jest nieco za duży. W jaki sposób można to zmienić?

Rozwiązanie Domyślny rozmiar zdalnego pulpitu to 1024×768 punktów. Można to zmienić z poziomu wiersza poleceń w momencie uruchamiania serwera: $ tightvncserver -geometry 800x600

Należy pamiętać o korzystaniu wyłącznie ze standardowych wartości. W przeciwnym przypadku aplikacja będzie wyglądała źle lub w ogóle nie będzie działać. Dostępne są następujące standardowe wartości: 1600x1200 1280x1024 1024x768 800x600 640x480

Rozmiar pulpitu można zmienić w pliku konfiguracyjnym. Można to zrobić na poziomie systemu — w pliku /etc/vnc.conf lub na poziomie użytkownika — w pliku ~/.vncrc. Opcje na poziomie użytkownika przesłaniają ustawienia globalne, a opcje ustawiane w wierszu poleceń przesłaniają i jedne, i drugie. Na przykład w celu ustawienia domyślnego rozmiaru pulpitu na wartość 800×600 należy skorzystać z wiersza następującej postaci: geometry = "800x600";

8.20. Ustawianie rozmiaru zdalnego pulpitu VNC

|

281

W domyślnym pliku /etc/vnc.conf można znaleźć wiele opcji przykładowych i zapoznać się z prawidłową składnią poleceń.

Dyskusja Jest tak wiele sposobów ustawiania rozmiaru pulpitu z poziomu systemu Linux oraz Windows (za pośrednictwem biblioteki Cygwin), że mogą one przyprawić Czytelnika o ból głowy. Na przykład można zalogować się na serwerze VNC za pośrednictwem SSH i uruchomić serwer VNC z wykorzystaniem spersonalizowanych opcji. Można również zmodyfikować pliki konfiguracyjne i zrestartować serwer. Niewłaściwe użycie opcji może spowodować uzyskanie zniekształconego ekranu rodem z sali luster.

Patrz także • man 1 vncserver • man 5 vnc.conf

8.21. Nawiązywanie połączenia VNC z istniejącą sesją X Problem Chcemy się zdalnie połączyć z linuksową stacją roboczą i dołączyć się do istniejącej sesji X zamiast inicjowania nowej niezależnej sesji. Chcemy mieć możliwość zmieniania miejsca i logowania z różnych lokalizacji, rozpoczynając pracę w momencie, w którym ją zakończyliśmy. Mechanizm ten można wykorzystać jako narzędzie świadczenia pomocy technicznej użytkownikom. Dzięki niemu można zdalnie przejąć kontrolę nad linuksowym komputerem PC i samodzielnie rozwiązać problemy, zamiast tracić czas na rozmowy z użytkownikiem przez telefon.

Rozwiązanie W przypadku zastosowania programu x11vnc to zadanie to bułka z masłem. Do tego celu będziemy potrzebowali programu x11vnc na zdalnym serwerze oraz przeglądarki VNC na lokalnej linuksowej stacji roboczej. Po zainstalowaniu x11vnc należy utworzyć hasło logowania. W tym przykładzie jest ono zapisane w pliku /home/carla/x11vnc/passwd. Należy zadbać o to, aby użytkownik miał do niego prawo tylko do odczytu: carla@windbag:~/x11vnc$ x11vnc -storepasswd 'password' passwd stored passwd in file passwd carla@windbag:~/x11vnc$ chmod 0600 passwd

Teraz utworzymy plik ~/.x11vncrc. Jest to plik konfiguracyjny specyficzny dla użytkownika, którego będzie automatycznie poszukiwał program x11vnc. Należy umieścić wiersz w tym pliku, który wskazuje na plik z hasłem: rfbauth /home/carla/x11vnc/passwd

282

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

Następnie można uruchomić x11vnc: $ x11vnc 07/01/2007 21:25:12 passing arg to libvncserver: -rfbauth 07/01/2007 21:25:12 passing arg to libvncserver: /home/carla/x11vnc/passwd [...] Using X display :0 Read initial data from X display into framebuffer. 07/01/2007 07/01/2007 07/01/2007 07/01/2007 07/01/2007 PORT=5900

18:51:01 18:51:01 18:51:01 18:51:01 18:51:01

Using X display with 16bpp depth=16 true color Autoprobing TCP port Autoprobing selected port 5900 screen setup finished. The VNC desktop is stinkpad:0

Teraz można uruchomić przeglądarkę VNC na innym komputerze PC w następujący sposób: $ vncviewer stinkpad:0

Aby się zalogować, wystarczy wprowadzić hasło na ekranie logowania. Po pojedynczym zalogowaniu program x11vnc automatycznie kończy pracę. W związku z tym nie będzie możliwości ponownego zalogowania bez zrestartowania tego programu. Aby program nie kończył swojego działania, tylko pracował w nieskończoność, należy użyć opcji -forever oraz -bg: $ x11vnc -forever -bg

Opcja -bg powoduje przesłanie programu „na drugi plan”.

Dyskusja Wiele osób chciałoby, żeby program x11vnc działał w trybie usługi — tak aby mógł przetrwać ładowanie systemu. Jest to trudne i w mojej opinii niebezpieczne, ponieważ jego uwierzytelnianie jest słabo zabezpieczone, dane są przesyłane zwykłym tekstem, a dodatkowo wymaga to skonfigurowania systemu X Window, co jest równie niebezpieczne. Osobiście zalecam uruchamianie tego programu tylko wtedy, kiedy chcemy z niego skorzystać. Bezpieczniejszą metodą jest najpierw zalogować się do zdalnego komputera PC za pomocą OpenSSH, a dopiero potem uruchomić x11vnc. Jeszcze lepszy efekt daje tunelowanie x11vnc w łączu SSH. Informacje o tym, jak należy to zrobić, można znaleźć w następnej recepturze.

Patrz także • program x11vnc ma dziesiątki opcji; aby je wyświetlić, należy uruchomić następujące po-

lecenie: $ x11vnc -opts

• poniższe polecenie wyświetla obszerne opisy dla poszczególnych opcji: $ x11vnc -help

• strona macierzysta programu x11vnc: http://www.karlrunge.com/x11vnc

8.21. Nawiązywanie połączenia VNC z istniejącą sesją X

| 283

8.22. Bezpieczne tunelowanie x11vnc w połączeniu SSH Problem x11vnc to doskonałe narzędzie do zdalnej pomocy technicznej oraz dla użytkowników często zmieniających miejsce, ale przesyłanie wszystkich danych zwykłym tekstem nam nie odpowiada. Chcemy tunelować x11vnc w łączu SSH, tak by komunikacja była bezpiecznie zaszyfrowana. W jaki sposób można to zrobić?

Rozwiązanie W tym przykładzie pokazano, w jaki sposób można tunelować x11vnc w łączu SSH, przy czym ustanowienie tunelu i uruchomienie programu x11vnc odbywają się za pomocą jednego polecenia. W ogólne nie jest potrzebna interwencja zdalnego użytkownika, pod warunkiem, że na jego komputerze PC działa demon sshd. Tutaj windbag jest komputerem lokalnym, natomiast stinkpad to maszyna zdalna: carla@windbag:~$ ssh -L 5900:windbag:5900 stinkpad 'x11vnc -localhost -display :0'

Po wykonaniu tego polecenia należy otworzyć drugą powłokę poleceń w komputerze lokalnym i nawiązać połączenie za pomocą następującego polecenia: carla@windbag:~$ vncviewer localhost:0

Podobnie jak w przypadku VNC, można uruchomić dowolną liczbę sesji x11vnc. Sesje są numerowane sekwencyjnie. Jeśli nie chcemy, aby hasło było przechowywane w pliku konfiguracyjnym, i wolelibyśmy wprowadzać je w wierszu poleceń, możemy skorzystać z flagi -passwd: $ x11vnc -passwd [hasło] -bg

Połączenie x11vnc nie obsługuje stanów, zatem nie ma możliwości, aby się zalogować, zmienić lokalizację i zalogować ponownie, wznawiając sesję w momencie, w którym została przerwana. Program x11vnc ma dziesiątki opcji; aby je wyświetlić, należy uruchomić następujące polecenie: $ x11vnc -opts

Poniższe polecenie wyświetla obszerne opisy dla poszczególnych opcji: $ x11vnc -help

Dyskusja Zaprezentowana receptura powinna działać dla dowolnej wersji VNC.

Patrz także • strona macierzysta programu x11vnc: http://www.karlrunge.com/x11vnc

284 |

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

8.23. Tunelowanie połączenia TightVNC pomiędzy systemami Linux i Windows Problem Nie podoba nam się brak szyfrowania danych i słabe uwierzytelnianie systemu VNC. Chcemy się dowiedzieć, w jaki sposób można dodać silne zabezpieczenia, zwłaszcza dla ruchu w niezaufanych sieciach. Chcemy również takiego rozwiązania, które działa międzyplatformowo (na przykład pozwala zarządzać windowsowymi komputerami PC z poziomu linuksowej stacji roboczej).

Rozwiązanie Można zastosować tunelowanie VNC przez SSH. Na potrzeby niniejszej receptury przyjmiemy następujące założenia: • mamy komputer z systemem Windows 2000 lub nowszym, zdolny do uruchomienia pa-

kietu Cygwin i programu TightVNC; • mamy komputer linuksowy z zainstalowanym programem vncviewer; • komputer windowsowy ma nazwę cygwin, natomiast linuksowy — linux.

Aby zainstalować Cygwin i OpenSSH w systemie Windows, wystarczy wejść do serwisu Cygwin.com (http://cygwin.com) i kliknąć Install Cygwin Now. Spowoduje to pobranie niewielkiego programu setup.exe. Na skutek dwukrotnego kliknięcia tego pliku wyświetli się menu instalacji środowiska Cygwin. Instalacja domyślna wystarczy dla naszych potrzeb. Trzeba jedynie dodać OpenSSH. Odpowiednią opcję znajdziemy w podmenu Net. Można też dorzucić program ping; zaoszczędzi to nam kłopotów z otwieraniem okna DOS po to, by uruchomić polecenie ping w czasie, gdy działa Cygwin. Po instalacji otwieramy powłokę bash środowiska Cygwin (z menu należy wybrać polecenie Cygwin Bash Shell). Następnie uruchamiamy poniższe polecenie: $ ssh-host-config

Spowoduje to wygenerowanie nowych kluczy SSH i plików konfiguracyjnych. Należy odpowiedzieć yes na następujące pytania: • Privilege separation; • Create a local user "sshd"; • Install sshd as a service.

Następnie dodajemy zmienne środowiskowe CYGWIN=ntsec tty. Teraz można uruchomić demona ssh. $ net start sshd The CYGWIN sshd service is starting. The CYGWIN sshd service was started successfully.

8.23. Tunelowanie połączenia TightVNC pomiędzy systemami Linux i Windows

| 285

Pobieramy system TightVNC z serwisu tightvnc.com (http://www.tightvnc.com/download.html), instalujemy na komputerze Win32 i przeładowujemy system. Dostęp do właściwości bieżącego użytkownika (Current User Properties) można uzyskać poprzez dwukrotne kliknięcie ikony VNC w zasobniku systemowym. Robimy to w celu ustawienia hasła. Następnie klikamy przycisk Advanced. W następnym menu należy zaznaczyć opcję Allow Loopback Connections. Za pomocą hasła określonego w poprzednim kroku testujemy, czy jest możliwe nawiązanie połączenia z maszyny linuksowej z serwerem VNC. W tym celu uruchamiamy polecenie vncviewer cygwin z komputera linuksowego lub polecenie vncviewer [adres-IP-windowsa]. Następnie generujemy klucz DSA bez hasła na linuksowym komputerze PC. Akceptujemy domyślne odpowiedzi na wszystkie pytania poprzez wciśnięcie klawisza Enter w odpowiedzi na każde z nich: carla@Linux :~ $ ssh-keygen -t dsa Generating public/private dsa key pair. Enter file in which to save the key (/home/carla/.ssh/id_dsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/carla/.ssh/id_rsa. Your public key has been saved in /home/carla/.ssh/id_dsa.pub. The key fingerprint is: 2b:cb:9a:df:f8:34:2d:2f:0c:29:76:5c:c6:52:43:92

Następnie w wierszu poleceń Cygwin na maszynie windowsowej kopiujemy klucz z komputera linuksowego: $ scp carla@Linux :.ssh/id_dsa.pub .$ cat id_dsa.pub >> .ssh/authorized_keys

Na koniec testujemy, czy klucz pozwala na zalogowanie się w systemie Windows bez hasła: carla@Linux :~$ ssh user@cygwin Last login: Sun Sep 24 15:42:48 2006 from 192.168.1.15

Tak więc możemy utworzyć tunel SSH z hosta linuksowego do windowsowego za pomocą poniższego polecenia: carla@Linux :~$ ssh -L 5900:localhost:5900 user@cygwin Last login: Sun Jun 3 20:59:54 2007 from 192.168.1.15 Carla@cygwin ~ $

Teraz, kiedy jesteśmy zalogowani, otwieramy drugi terminal na komputerze linuksowym i uruchamiamy VNC: carla@Linux :~$ vncviewer localhost

Powinno się wyświetlić pytanie o hasło do serwera VNC. Po wpisaniu klient nawiąże połączenie. Teraz, tak jak w kiepskim filmie, możemy wykrzyknąć „Udało się!”. Kolejne operacje logowania nie będą trudne — wystarczy utworzyć tunel, a następnie uruchomić VNC.

Dyskusja Przetestowanie, czy sesja VNC działa przez tunel SSH, nie jest trudne. Wystarczy się wylogować z sesji SSH, a połączenie VNC zniknie. Tunelowanie SSH działa w dowolnym systemie operacyjnym, w którym można uruchomić SSH. Działa doskonale w sesjach Linux-Linux i jest niezbędne do połączeń przez internet. SSH działa wydajnie, zatem nie powinniśmy zaobserwować spowolnionego działania. 286

|

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

W programie VNC nie trzeba wykonywać żadnych dodatkowych operacji — wystarczy go skonfigurować i normalnie używać. Po ustanowieniu tunelu można korzystać ze wszystkich standardowych poleceń VNC. Przyjrzyjmy się poleceniu, za pomocą którego utworzono tunel: ssh -L 5900:windbag:5900 user@cygwin

Opcja -L to polecenie dla SSH do przekazywania wszystkich danych przesyłanych z określonego portu lokalnego do wskazanego zdalnego adresu i portu. W związku z tym przekazywane będą wszystkie dane przesłane do portu TCP 5900, a nie tylko komunikacja VNC (port VNC definiuje się w ramach konfiguracji serwera VNC). Zamiast nazw hostów można oczywiście użyć adresów IP. W przypadku tunelowania przez internet należy pamiętać o używaniu pełnych kwalifikowanych nazw domen: $ ssh -L 5900:homepc.pinball.net:5900 cygwin.work.com

Drugie polecenie: vncviewer windbag

musi zostać skierowane do maszyny lokalnej zamiast zdalnej, ponieważ wejście do tunelu znajduje się na lokalnym komputerze PC. Zmienna środowiskowa CYGWIN=ntsec tworzy dodatkowe uprawnienia do plików w stylu Unix w windowsowych systemach plików NTFS. Zmienna środowiskowa CYGWIN=tty umożliwia zarządzanie zadaniami powłoki Bash. Zmienne środowiska Cygwin są ustawione w pliku C:\cygwin.bat. Aby dostosować je do potrzeb indywidualnego systemu, można go odpowiednio zmodyfikować.

Patrz także • rozdział 7. • rozdział 2. „Setting Up Cygwin” w podręczniku użytkownika środowiska Cygwin:

http://www.cygwin.com/cygwin-ug-net/cygwin-ug-net.html

8.23. Tunelowanie połączenia TightVNC pomiędzy systemami Linux i Windows

|

287

288 |

Rozdział 8. Wykorzystanie międzyplatformowych zdalnych pulpitów graficznych

ROZDZIAŁ 9.

Tworzenie bezpiecznych międzyplatformowych wirtualnych sieci prywatnych z wykorzystaniem OpenVPN

9.0. Wprowadzenie Zapewnienie bezpiecznego, kontrolowanego dostępu do sieci firmowej pracownikom będącym w podróżach służbowych, pracującym zdalnie oraz oddziałom firmy nie jest trudne, jeśli wykorzysta się OpenVPN. OpenVPN to doskonała, bazująca na SSL implementacja wirtualnej sieci prywatnej (SSL VPN). Program jest darmowy, o otwartym kodzie, łatwy w administracji i bezpieczny. OpenVPN zaprojektowano w taki sposób, aby był jak najbardziej uniwersalny. W związku z tym system działa na platformach Linux, Solaris, Windows, Mac OS X oraz kilku innych platformach. Działa jako klient lub serwer z tej samej instalacji, zatem konfiguracja klienta przebiega błyskawicznie. Nie ma problemów ze zgodnością dostawców czy też znalezieniem najlepszego klienta, tak jak w przypadku innych produktów VPN. W niniejszym rozdziale będziemy korzystali z OpenVPN w wersji 2.0.7. (aby sprawdzić wersję zainstalowanego produktu, można skorzystać z polecenia openvpn --version). Nie polecam używania starszych wersji. Program jest dostępny za darmo, a jego instalacja i aktualizacja nie sprawiają żadnych problemów, zatem nie ma sensu używanie przestarzałych wersji. Czytelnikom, którzy nie są doświadczeni w posługiwaniu się OpenVPN, polecam studiowanie receptur po kolei lub przynajmniej uruchomienie pierwszych dwóch receptur przed wypróbowaniem pozostałych. Dzięki temu zrozumienie działania OpenVPN będzie łatwiejsze. Obszar sieci VPN jest pełen wprowadzających w błąd haseł marketingowych oraz nieprawidłowych informacji dotyczących produktów SSL VPN i IPSec VPN. Występują rozbieżności między tym, do czego programy te są faktycznie zdolne, a tym, o czym mówią hasła handlowe. W związku z tym najpierw omówimy podstawy. Na początek zdefiniujemy VPN — to zaszyfrowany wirtualny tunel pomiędzy sieciami łączący zaufane punkty końcowe. Zarówno serwer VPN, jak i klient musi przeprowadzać wzajemne uwierzytelnianie. Sieć VPN to bezpieczne rozszerzenie sieci, która udostępnia zdalnym 289

pracownikom, na przykład pracownikom wykonującym swoje obowiązki w domu oraz przebywającym w podróżach służbowych, te same usługi, jakie mają lokalni użytkownicy. Sieć VPN można porównać do bezpiecznego kabla ethernetowego, który rozszerza naszą sieć i prowadzi przez wrogie terytorium. VPN łączy dwie sieci, na przykład zdalne biura, lub pojedynczych użytkowników z biurem. Zabezpieczenia produktów SSL VPN bazują na protokołach SSL (TLS). Protokół SSL (Secure Sockets Layer) jest poprzednikiem protokołu TLS (Transport Layer Security). Terminów można używać wymiennie. Są do siebie bardzo podobne. Oba są protokołami kryptograficznymi służącymi do zabezpieczania transmisji w niezaufanych sieciach. Ich celem jest zapobieżenie możliwości podsłuchiwania, penetracjom, fałszowaniu wiadomości oraz zapewnienie mechanizmu uwierzytelniania. Coraz większa liczba komercyjnych produktów SSL VPN traktuje sieć klienta jako witrynę odgrywającą rolę sklepu internetowego: mówiąc inaczej, wszyscy klienci są zaufani. Taka formuła nadaje się do robienia zakupów w internecie, ale może mieć katastrofalne skutki dla zdalnego dostępu do sieci LAN. Takie produkty nie są rzeczywistymi sieciami VPN, ale raczej portalami aplikacji. Rozwiązania VPN są silne dzięki zaufanym punktom końcowym. Nie chcemy, aby użytkownicy logowali się z dowolnych maszyn, zwłaszcza z kafejek internetowych lub innych terminali dostępnych publicznie. Brak obowiązku instalacji i konfiguracji oprogramowania klienckiego oraz kopiowania kluczy szyfrowania jest oczywiście wygodny. Jest to jednak rozwiązanie krótkowzroczne — ostatnią rzeczą, jakiej chcielibyśmy, jest gorące powitanie w sieci LAN po zalogowaniu się z losowych pecetów zainfekowanych rejestratorami klawiatury (ang. keyloggers) i programami spyware. Prewencja jest wygodniejsza od usuwania skutków włamania. Do każdego produktu SSL VPN, którego producent obiecuje „łatwą, bezkliencką konfigurację”, należy podchodzić z ogromną dozą sceptycyzmu. Prawdziwa sieć VPN nie jest przeglądarką internetową z obsługą SSL i ładnymi ikonami. Prawdziwe rozwiązanie VPN nie potrzebuje przeglądarki internetowej. Nie wolno powierzać swojego bezpieczeństwa upiększonym przeglądarkom internetowym.

A co z IPSec? Aby jeszcze bardziej skomplikować zagadnienie, niektórzy producenci oferujący rozwiązania IPSec twierdzą, że nie warto stosować produktów SSL VPN, ponieważ rozwiązania IPSec mają nad nimi przewagę. Z produktami IPSec, zwłaszcza w sieciach IPv4, wiąże się wiele problemów. Są to rozwiązania złożone i trudne w administracji, a to nie są dobre cechy produktów zabezpieczeń. Są ściśle powiązane z jądrem, co oznacza, że ich awaria może spowodować awarię całego systemu, a luka w zabezpieczeniach może otworzyć intruzowi drogę do uzyskania uprawnień użytkownika root. Czytelnikom, którzy chcą koniecznie używać produktu IPSec VPN, zalecam wypróbowanie systemu OpenBSD. System ten ma doskonałą, wbudowaną implementację IPSec, łatwą w instalacji i konfiguracji. Jedynym mankamentem jest strona kliencka — użytkownik sam musi zadbać o zdobycie klientów IPSec. Po zaimplementowaniu IPv6 użytkowanie IPSec być może będzie łatwiejsze, ponieważ rozwiązanie IPSec jest zintegrowane z IPv6, a nie dołączone do niego, tak jak w przypadku IPv4.

OpenVPN OpenVPN jest w mojej opinii najlepszym z dostępnych produktów VPN. OpenVPN pozwala na stworzenie prawdziwego rozwiązania VPN — zaszyfrowanego rozszerzenia sieci, które 290

|

Rozdział 9. Tworzenie bezpiecznych międzyplatformowych wirtualnych sieci prywatnych

wymaga zdobycia wzajemnego zaufania pomiędzy serwerem a klientem. Pierwszym krokiem na drodze do jego instalacji jest stworzenie własnej infrastruktury klucza publicznego (Public Key Infrastructure — PKI). Oznacza to skorzystanie z OpenSSL w celu stworzenia własnego urzędu certyfikatów (Certificate Authority — CA), a także kluczy serwera i klienta oraz certyfikatów. Posiadanie własnego urzędu CA znacznie upraszcza zarządzanie certyfikatami. Serwer nie musi wiedzieć niczego na temat certyfikatów poszczególnych klientów, ponieważ uwierzytelnia je urząd CA. W przypadku naruszenia zabezpieczeń klienta jego certyfikat można odwołać z serwera. OpenVPN jest wyposażony w pakiet skryptów zapewniających łatwe zarządzanie infrastrukturą PKI. Proces szyfrowania w OpenVPN jest złożony. Najpierw w wyniku uzgadniania (ang. handshake) następuje uwierzytelnianie obu punktów końcowych, a następnie generowane są cztery różne nowe klucze: klucze HMAC (Hashed Message Authentication Code) dla wysyłania i odbierania informacji, klucz szyfrowania (odszyfrowywania) wysyłanych informacji oraz klucz szyfrowania (odszyfrowywania) odbieranych informacji. Wszystko to jest niezwykle skomplikowane i wykonuje się błyskawicznie. W rezultacie napastnik ma olbrzymie trudności, żeby dostać się do jakichkolwiek danych. Szczegółowe informacje na ten temat można znaleźć w doskonałym artykule Charliego Hosnera OpenVPN and the SSL Revolution (http://www.sans.org/reading_room/ whitepapers/vpns/1459.php?portal=c7da694586dcdad815fd41098461e495). Konfiguracja klienta w OpenVPN jest najłatwiejsza spośród wszystkich rozwiązań VPN. OpenVPN działa jako klient bądź serwer w systemach Linux, Solaris, OpenBSD, Mac OS X, FreeBSD, NetBSD i Windows 2000. Nie trzeba zatem zdobywać oprogramowania klienckiego lub tracić czasu na testowanie programów klienckich kiepskiej jakości. Pliki konfiguracyjne są do siebie bardzo zbliżone na wszystkich platformach. Należy jedynie pamiętać o zastosowaniu w systemie Windows ukośników skierowanych w przeciwną stronę. OpenVPN działa jako demon w przestrzeni użytkownika. Do zarządzania dostępem do sieci wykorzystuje sterowniki TAP/TUN. Sterowniki TAP/TUN są standardowe w większości systemów operacyjnych. Zapewniają aplikacjom przestrzeni użytkownika dostęp do interfejsów sieciowych bez konieczności posiadania uprawnień użytkownika root. Sterownik TAP zapewnia niskopoziomową obsługę dla tunelowania ruchu IP na poziomie jądra, natomiast sterownik TUN zapewnia niskopoziomową obsługę tunelowania ruchu Ethernet na poziomie jądra. W systemach linuksowych i uniksowych są one dostępne jako urządzenia znakowe /dev/tapX oraz /dev/tunX. W programie ifconfig urządzenia te występują jako tunX i tapX. W przypadku wykorzystania routingu dla tunelu VPN należy użyć sterownika TUN, natomiast w przypadku zastosowania mostkowania należy skorzystać ze sterownika TAP. Parametry te konfiguruje się w pliku openvpn.conf. W idealnym świecie zdalni użytkownicy logują się tylko z tych komputerów PC, które zostały dokładnie „prześwietlone” przez najlepszych specjalistów od zabezpieczeń, użytkownicy są rozsądni i ostrożni i nie pozwalają innym osobom korzystać ze swoich komputerów. W świecie rzeczywistym jest oczywiście trochę gorzej. Użycie OpenVPN jest jednak silnym zabezpieczeniem, które zapobiega wielu problemom. OpenVPN jest standardowym pakietem w większości dystrybucji zapór firewall bazujących na Linuksie, takich jak Shorewall, IPCop, Pyramid, Open WRT, Bering uClibc oraz DD-WRT. W innych dystrybucjach wystarczy skorzystać z polecenia yum install openvpn lub apt-get install openvpn. Można też, jeśli ktoś woli, skompilować OpenVPN z kodu źródłowego.

9.0. Wprowadzenie

|

291

9.1. Konfiguracja bezpiecznego laboratorium testowego dla OpenVPN Problem Nie chcemy testować OpenVPN przez internet. Potrzebujemy bezpiecznego, kontrolowanego środowiska testowania systemu OpenVPN, jeszcze przed jego wdrożeniem.

Rozwiązanie Nie ma problemu. Wystarczy stworzyć niewielkie laboratorium testowe złożone z trzech komputerów. Jeden działa jako zdalny komputer PC, drugi jako serwer i router OpenVPN, natomiast trzeci reprezentuje sieć LAN. Komputer PC spełniający rolę serwera i routera OpenVPN musi być wyposażony w dwa interfejsy Ethernet. W takim środowisku można bezpiecznie i w realistycznych warunkach testować konfigurację OpenVPN i reguły firewall. Komputery powinny być fizycznie zlokalizowane blisko siebie, ponieważ w przypadku manipulowania parametrami sieci może dojść do utraty połączenia. Należy wykorzystać kable Ethernet i przełącznik. Jeśli nie chcemy dodatkowych problemów, nie powinniśmy stosować łączy bezprzewodowych. Przed wykonaniem jakichkolwiek innych zadań instalujemy OpenVPN na zdalnym komputerze PC oraz maszynie, która będzie odgrywać rolę serwera OpenVPN. W tej recepturze na wszystkich trzech komputerach działa system Linux (klientami dla innych systemów operacyjnych zajmiemy się w dalszej części niniejszego rozdziału). OpenVPN jest dołączony do większości dystrybucji Linuksa. Aby go zainstalować, wystarczy skorzystać z poleceń yum install openvpn lub aptitude install openvpn. Konfiguracja tras jest dość zagmatwana, szczególnie jeśli do obliczania podsieci korzysta się ze ściągawek — ang. cheat sheet — (ja tak robię) i jeśli ktoś musi rysować diagramy sieciowe nawet dla prostych układów (to także muszę robić). W związku z tym lepiej się nie spieszyć i postępować dokładnie według wskazówek. Zawsze można później zmienić adresy i trasy. Testowa sieć powinna mieć postać pokazaną na rysunku 9.1.

Rysunek 9.1. Testowa sieć dla systemu OpenVPN

292

|

Rozdział 9. Tworzenie bezpiecznych międzyplatformowych wirtualnych sieci prywatnych

Zdalne komputery należy bezpośrednio podłączyć do serwera za pomocą kabla z przeplotem. W tej recepturze dla serwera OpenVPN użyję nazwy Xena. Host Stinkpad będzie odgrywał rolę zdalnego klienta, natomiast komputer Uberpc będzie reprezentował pozostałą część sieci LAN. Komputery Xena i Stinkpad powinny się znaleźć w różnych podsieciach, a zatem adresacja w sieci ma następującą postać: Stinkpad eth0 adres: 192.168.2.100 maska podsieci: 255.255.255.0 adres rozgłoszeniowy: 192.168.2.255 Xena eth0 — interfejs LAN adres: 192.168.1.10 maska podsieci: 255.255.255.0 adres rozgłoszeniowy: 192.168.1.255 eth1 — interfejs „internetowy” adres: 192.168.3.10 maska podsieci: 255.255.255.0 adres rozgłoszeniowy: 192.168.3.255 Uberpc eth0 adres 192.168.1.76 maska podsieci: 255.255.255.0 adres rozgłoszeniowy: 192.168.1.255 domyślna brama: 192.168.1.10 Nie ma znaczenia, jaką konfigurację sieci mają nasze komputery PC, ponieważ skonfigurujemy je czasowo na potrzeby testowania. W związku z tym nie musimy modyfikować żadnych plików konfiguracyjnych. Adresy IP komputerów ustawiamy za pomocą poniższych poleceń: root@stinkpad:~# ifconfig eth0 192.168.2.100 netmask 255.255.255.0 up root@xena:~# ifconfig eth0 192.168.1.10 netmask 255.255.255.0 up root@xena:~# ifconfig eth1 192.168.3.11 netmask 255.255.255.0 up root@uberpc:~# ifconfig eth1 192.168.1.76 netmask 255.255.255.0 up

Następnie tworzymy kilka statycznych tras i włączamy przekazywanie na komputerze Xena, tak by bity mogły swobodnie przepływać: root@stinkpad:~# route del default root@stinkpad:~# route add -net 192.168.3.0/24 gw 192.168.2.100 eth0 root@xena:~# route del default root@xena:~# route add -net 192.168.2.0/24 gw 192.168.3.10 eth1 root@xena:~# echo 1 > /proc/sys/net/ipv4/ip_forward root@uberpc:~# route del default root@uberpc:~# route add default gw 192.168.1.10 eth0

Trasy można przeglądać za pomocą polecenia route. W przypadku popełnienia błędu można usunąć trasy w sposób pokazany poniżej. Oczywiście trzeba wstawić właściwy adres sieciowy: # route del -net 192.168.3.0/24

9.1. Konfiguracja bezpiecznego laboratorium testowego dla OpenVPN

|

293

W tym momencie komputery Stinkpad i Uberpc powinny być dla siebie osiągalne za pomocą polecenia ping. Kiedy zadziała polecenie ping, można przejść do następnej receptury w celu przetestowania OpenVPN.

Dyskusja W przypadku gdy ktoś się kompletnie pogubi, wystarczy, jeśli ponownie załaduje system i zacznie od początku. Zaprojektowana sieć testowa ma symulować internet. W rzeczywistym połączeniu internetowym pomiędzy hostami Stinkpad i Xena znajdowałby się router. W związku z tym w celu emulacji takiego układu Stinkpad musi być dla samego siebie i routerem, i bramą. Dla hosta Stinkpad trzeba zdefiniować trasę tylko do serwera Xena; routing do sieci LAN za serwerem Xena będzie realizowany przez serwer OpenVPN. Powrócimy do niego w dalszej części tego rozdziału. Do środowiska testowego można dodać więcej komputerów — należy jedynie pamiętać, aby umieścić je w tej samej sieci LAN, w jakiej znajduje się host Stinkpad (192.168.1.0/24), oraz ustawić w nich domyślną bramę na adres IP interfejsu LAN komputera Stinkpad. W przypadku ustawienia w komputerze dwóch domyślnych bram można wybrać tę, która ma być usunięta za pomocą następującego polecenia: # route del default gw 192.168.1.25

Może być tylko jedna brama domyślna. Definiowanie domyślnych bram podczas testowania nie jest konieczne. Obowiązkowo trzeba jednak to zrobić w komputerach produkcyjnych. W przypadku gdy wszystko zostanie poprawnie skonfigurowane, można zdefiniować wiele tras i zachować standardowe połączenie z internetem. Nie ma przeszkód, aby wykazać się wiedzą w dziedzinie routingu. Osobiście preferuję jednak jak najprostsze rozwiązania, ponieważ ułatwiają one debugowanie. Dlatego właśnie usuwa się domyślne trasy — po to, by nie przeszkadzały i nie wprowadzały zamieszania. Jeśli zdefiniowaliśmy inne trasy, które nie mają związku z testowaniem programu OpenVPN, również powinniśmy się ich pozbyć. Stinkpad (zdalny PC) musi być podłączony bezpośrednio do routera Xena, ponieważ dla różnych domen rozgłoszeniowych trzeba zdefiniować routing (można też skonfigurować mostkowanie — powrócimy do tego później).

Patrz także • man 8 route • man 8 ifconfig

9.2. Uruchamianie i testowanie OpenVPN Problem Postąpiliśmy zgodnie z poprzednią recepturą i nasze niewielkie laboratorium testowe działa. Jesteśmy gotowi na uruchomienie OpenVPN? Co teraz?

294 |

Rozdział 9. Tworzenie bezpiecznych międzyplatformowych wirtualnych sieci prywatnych

Rozwiązanie Najpierw sprawdzamy na obu komputerach OpenVPN, czy program OpenVPN działa: $ ps ax | grep vpn

Jeśli tak, zatrzymujemy go: # killall openvpn

Następnie otwieramy stworzony naprędce niezabezpieczony tunel pomiędzy zdalnym PC a serwerem OpenVPN za pomocą następujących poleceń: root@xena:~# openvpn --remote 192.168.2.100 --dev tun0 \ --ifconfig 10.0.0.1 10.0.0.2 root@stinkpad:~# openvpn --remote 192.168.3.10 \ --dev tun0 --ifconfig 10.0.0.2 10.0.0.1

Powyższy komunikat wskazuje na sukces. Powinien wyświetlić się po obu stronach połączenia: Wed Feb 14 12:53:45 2007 Initialization Sequence Completed

Można teraz otworzyć kilka nowych terminali i próbować komunikacji z nowymi wirtualnymi adresami IP za pomocą polecenia ping: carla@xena:~$ ping 10.0.0.2 PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.421 64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.314 carla@stinkpad:~$ ping 10.0.0.1 PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data. 64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.360 64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.317

ms ms ms ms

W poleceniu ping można również określić interfejs do wykorzystania: carla@xena:~$ ping -I tun0 10.0.0.2 carla@stinkpad:~$ ping -I tun0 10.0.0.1

Teraz możemy przetestować stworzone tunele i spróbować otworzyć sesje SSH w poszczególnych częściach środowiska: carla@xena:~$ ssh 10.0.0.2 carla@stinkpad:~$ ssh 10.0.0.1

Teraz możemy wyjść z sesji SSH i wcisnąć Ctrl+C, aby zakończyć pracę OpenVPN i zamknąć tunele.

Dyskusja W zaprezentowanym przykładzie utworzyliśmy niezaszyfrowany tunel pomiędzy zdalnym PC, hostem Stinkpad i serwerem Xena odgrywającym rolę routera brzegowego. Hosty Stinkpad i Xena mogą wymieniać między sobą ruch TCP i UDP, ale sieć LAN za hostem Xena nie jest jeszcze dostępna dla hosta Stinkpad. Ponieważ są to połączenia wykorzystujące routing, ruch rozgłoszeniowy, na przykład Samba, nie będzie w stanie przejść przez router. Jeśli zobaczymy komunikat UDPv4 [ECONNREFUSED]: Connection refused (code=111), będzie to oznaczało, że utworzono tylko jeden punkt końcowy tunelu, w dalszym ciągu zatem pozostanie do utworzenia drugi koniec. Komunikat TCP/UDP Socket bind failed on local address [ip-address]:1194:Address already in use oznacza, że program OpenVPN już działa.

9.2. Uruchamianie i testowanie OpenVPN

|

295

Opcja --ifconfig najpierw ustawia adres lokalnego punktu końcowego tunelu, a następnie zdalnego punktu końcowego tunelu. Mogą to być dowolne adresy, pod warunkiem, że są różne od innych podsieci (podsieć i domena rozgłoszeniowa są synonimami). Nie ma potrzeby używania całkowicie różnych klas adresów. Można poprzestać na używaniu adresów IPv4 klasy C, czyli adresów z zakresu 192.168.0.0 – 192.168.255.255. Aby zobaczyć nowy interfejs tun0, można skorzystać z programu ifconfig: $ /sbin/ifconfig -i tun0 tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 inet addr:10.0.0.2 P-t-P:10.0.0.1 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

Aby obejrzeć nowe trasy, można skorzystać z polecenia route: carla@xena:~$ /sbin/route Kernel IP routing table Destination Gateway 10.0.0.2 * 192.168.3.0 * 192.168.2.0 192.168.3.10 192.168.1.0 * carla@stinkpad:~$ /sbin/route Kernel IP routing table Destination Gateway 10.0.0.2 * 192.168.3.0 192.168.2.100 192.168.2.0 * default 192.168.2.100

Genmask 255.255.255.255 255.255.255.0 255.255.255.0 255.255.255.0

Flags UH U UG U

Metric 0 0 0 0

Ref 0 0 0 0

Use 0 0 0 0

Iface tun0 eth1 eth1 eth0

Genmask 255.255.255.255 255.255.255.0 255.255.255.0 0.0.0.0

Flags UH UG U UG

Metric 0 0 0 0

Ref 0 0 0 0

Use 0 0 0 0

Iface tun0 eth0 eth0 eth0

Patrz także • man 8 route • man 8 ifconfig • man 8 openvpn • dokument How-to programu OpenVPN: http://openvpn.net/howto.html

9.3. Testowanie szyfrowania z wykorzystaniem statycznych kluczy Problem Teraz chcemy przetestować używanie kluczy szyfrowania z systemem OpenVPN. Chcemy znaleźć najprostszą możliwą metodę testowania.

Rozwiązanie Można skorzystać ze współdzielonych kluczy statycznych. Jest to rozwiązanie mniej bezpieczne od tworzenia prawidłowej infrastruktury klucza publicznego (PKI), ale łatwiejsze do skonfigurowania dla celów testowych. Wykonaj następujące czynności: 296

|

Rozdział 9. Tworzenie bezpiecznych międzyplatformowych wirtualnych sieci prywatnych

1. Wykonaj poprzednie receptury. 2. Wygeneruj specjalny statyczny klucz szyfrowania i skopiuj ten statyczny klucz na serwer i klienta.

3. Utwórz proste pliki konfiguracyjne na obu testowych komputerach PC. 4. Uruchom OpenVPN z wiersza polecenia w celu przetestowania. W tej recepturze rolę serwera OpenVPN w dalszym ciągu odgrywa host Xena — pod adresem IP 192.168.3.10, natomiast klientem jest Stinkpad — pod adresem 192.168.2.100. Najpierw utworzymy współdzielony statyczny klucz na serwerze OpenVPN za pomocą poniższego polecenia: root@xena:~# openvpn --genkey --secret static.key

Następnie skopiujemy go do klienckiego komputera PC: root@xena:~# scp static.key 192.168.2.100:/etc/openvpn/keys/

Następnie utworzymy plik konfiguracyjny serwera. Osobiście nazwałam go /etc/openvpn/server1. conf. Nie ma przeszkód, aby wybrać dla niego dowolną nazwę. Należy użyć adresów IP znajdujących się w innej podsieci niż nasz serwer. Xena znajduje się pod adresem 192.168.3.10, zatem ustawimy adres punktu końcowego tunelu hosta Xena jako 10.0.0.1: ## openvpn server1.conf dev tun ifconfig 10.0.0.1 10.0.0.2 secret /etc/openvpn/keys/static.key local 192.168.3.10

Następnie tworzymy plik konfiguracyjny klienta na hoście Stinkpad. Adres punktu końcowego tunelu hosta Stinkpad to 10.0.0.2: ## openvpn client1.conf remote 192.168.3.10 dev tun ifconfig 10.0.0.2 10.0.0.1 secret /etc/openvpn/keys/static.key

Upewniamy się, czy OpenVPN nie działał wcześniej na kliencie lub serwerze. Następnie uruchamiamy go ponownie na obu tych komputerach za pomocą następujących poleceń: root@xena:~# openvpn /etc/openvpn/server1.conf root@stinkpad:~# openvpn /etc/openvpn/client1.conf

Tak jak w poprzedniej recepturze, po ustanowieniu tunelu wyświetli się komunikat Initialization Sequence Completed i oba komputery będą dla siebie osiągalne za pomocą polecenia ping: carla@xena:~$ ping 10.0.0.2 terry@stinkpad:~$ ping 10.0.0.1

Aby zamknąć tunel, należy wcisnąć Ctrl+C w obu punktach końcowych tunelu.

Dyskusja Podczas konfigurowania tuneli należy obserwować komunikaty wyświetlane przez system. W przypadku skonfigurowania niezaszyfrowanego tunelu wyświetlał się komunikat: ******* WARNING *******: all encryption and authentication features disabled -- all data will be tunnelled as cleartext

Teraz powinien zniknąć.

9.3. Testowanie szyfrowania z wykorzystaniem statycznych kluczy

|

297

Nie jest to wystarczająco dobre rozwiązanie do zastosowania w komputerach produkcyjnych. W następnej recepturze można zapoznać się z konfiguracją, która lepiej pasuje do rzeczywistego świata. Problem z używaniem kluczy statycznych polega na tym, że tracimy poufność doskonałą (ang. Perfect Forward Secrecy), ponieważ klucz statyczny nigdy się nie zmienia. Jeśli napastnikowi uda się podsłuchać i przechwycić ruch sieciowy, a następnie przechwycić i złamać nasz klucz szyfrowania, będzie mógł odszyfrować wszystko, co przesyłaliśmy w sieci — zarówno w przeszłości, jak i przyszłości. OpenVPN obsługuje infrastrukturę PKI, która jest bardziej złożona w konfiguracji, ale zapewnia własność poufności doskonałej. W infrastrukturze PKI systemu OpenVPN wykorzystano złożony proces, w którym generowane są cztery różne klucze szyfrowania. Wykorzystywane są osobne klucze szyfrowania (odszyfrowania) wysyłanych danych oraz klucze szyfrowania (odszyfrowywania) odbieranych danych. Klucze te zmieniają się co godzinę. W związku z tym napastnik, któremu powiedzie się atak, będzie mógł w danym momencie odszyfrować ruch co najwyżej sprzed godziny, a potem będzie musiał zaczynać od początku. Więcej informacji na temat działania infrastruktury PKI systemu VPN można znaleźć w doskonałym artykule Charliego Hosnera OpenVPN and the SSL Revolution (http:// www.sans.org/reading_room/whitepapers/vpns/1459.php?portal=c7da694586dcdad815fd41098461e495).

Patrz także • man 8 openvpn; • Dokument How-to programu OpenVPN: http://openvpn.net/howto.html

9.4. Połączenie zdalnego klienta linuksowego z wykorzystaniem kluczy statycznych Problem Postąpiliśmy zgodnie z poprzednimi recepturami i wszystko działa. Co teraz zrobić, aby skonfigurować produkcyjny serwer VPN? Chcemy skonfigurować go w taki sposób, aby można było połączyć się z siecią w miejscu pracy z domowego linuksowego komputera PC. Internetowe konto w miejscu pracy ma statyczny, rutowalny adres IP. Adres domowego PC nie nakłada się na adresy w sieci w miejscu pracy ani na adresy wykorzystane w programie OpenVPN. Serwer OpenVPN działa na routerze brzegowym.

Rozwiązanie Tak jak poprzednio, należy pamiętać, że używanie statycznego klucza jest mniej bezpieczne niż wykorzystanie prawidłowej infrastruktury PKI. W celu wygenerowania i dystrybucji współdzielonego klucza statycznego będziemy postępować zgodnie z poprzednią recepturą. Następnie wprowadzimy dodatkowe opcje w plikach konfiguracyjnych oraz skonfigurujemy zaporę firewall w sposób umożliwiający przesyłanie ruchu VPN. Konfiguracja powinna przypominać tę, którą pokazano na rysunku 9.2. 298

|

Rozdział 9. Tworzenie bezpiecznych międzyplatformowych wirtualnych sieci prywatnych

Rysunek 9.2. Zdalny użytkownik logujący się z domu przez VPN

Następnie skopiujemy konfiguracje klienta i serwera, wykorzystując własne adresy IP i nazwy domen. Lokalne adresy IP muszą być adresami w sieci WAN. Pliki te mają różne nazwy od tych, które zastosowano w poprzedniej recepturze. To przyspiesza testowanie, o czym wkrótce się przekonamy: ## openvpn server2.conf dev tun proto udp ifconfig 10.0.0.1 10.0.0.2 local 208.201.239.37 secret /etc/openvpn/keys/static.key keepalive 10 60 comp-lzo daemon

Następnie tworzymy plik konfiguracji klienta: ## openvpn client2.conf remote router.alrac.net dev tun ifconfig 10.0.0.2 10.0.0.1 route 192.168.1.0 255.255.255.0 secret /etc/openvpn/keys/static.key keepalive 10 60 comp-lzo

Następnie trzeba zezwolić na ruch VPN przez zaporę firewall w miejscu pracy poprzez port UDP 1194. W przypadku zastosowania zapory firewall iptables należy użyć poniższych reguł: iptables -A INPUT -p udp --dport 1194 -j ACCEPT iptables -A INPUT -i tun+ -j ACCEPT iptables -A FORWARD -i tun+ -j ACCEPT

Można teraz ręcznie uruchomić OpenVPN i przetestować tak jak w poprzednich recepturach: root@xena:~# openvpn /etc/openvpn/server2.conf root@stinkpad:~# openvpn /etc/openvpn/client2.conf

Dyskusja Jest to ciekawa i prosta konfiguracja, w której kontrolujemy sieci w pracy i w domu. Nie należy robić tego dla innych — wyłącznie dla siebie. Co zrobić, jeśli w sieci w miejscu pracy nie ma statycznego adresu IP, tylko adres przypisany dynamicznie? Można skorzystać z darmowej usługi dynamicznego DNS (DDNS) w serwisie DynDns.com (http://www.dyndns.com/) w celu uzyskania stałego adresu. Opcja route w pliku client2.conf umożliwia zdalnym klientom dostęp do całej sieci LAN.

9.4. Połączenie zdalnego klienta linuksowego z wykorzystaniem kluczy statycznych

|

299

Opcja keepalive 10 60 utrzymuje aktywne połączenie dzięki wysyłaniu polecenia ping co 10 sekund. Jeśli nie ma odpowiedzi w ciągu 60 sekund, program OpenVPN zakłada, że połączenie jest przerwane. Polecenie comp-lzo powoduje kompresję ruchu. Opcja musi znajdować się w plikach konfiguracyjnych zarówno na serwerze, jak i kliencie. Opcja daemon uruchamia OpenVPN w trybie nasłuchiwania. Po uruchomieniu polecenia openvpn /etc/openvpn/server2.conf przechodzi ono na drugi plan i zwraca sterowanie do wiersza poleceń. Znak plus w regułach iptables jest symbolem wieloznacznym, zatem tun+ oznacza „wszystkie urządzenia tun”. Użycie właściwej infrastruktury PKI to tylko trochę więcej pracy w porównaniu z użyciem kluczy statycznych, a uzyskane rozwiązanie jest znacznie bezpieczniejsze. Sposób konfiguracji infrastruktury PKI opisano w następnej recepturze.

Patrz także • man 8 openvpn • dokument How-to programu OpenVPN: http://openvpn.net/howto.html • rozdział 3.

9.5. Tworzenie własnej infrastruktury PKI na potrzeby programu OpenVPN Problem Chcemy uruchomić OpenVPN w sposób jak najbardziej bezpieczny. W związku z tym jesteśmy gotowi do skonfigurowania prawidłowej infrastruktury PKI.

Rozwiązanie To wcale nie jest trudne, a w większości przypadków znacznie bezpieczniejsze od używania statycznych kluczy. Wykonaj następujące czynności:

1. Utwórz własny certyfikat urzędu certyfikacji (CA). 2. Utwórz certyfikat serwera OpenVPN. 3. Wygeneruj certyfikaty klienckie. OpenVPN jest wyposażony w pakiet skryptów zapewniających łatwe wykonywanie tych czynności. Najpierw należy odszukać katalog easy-rsa/2.0 i skopiować do katalogu /etc/openvpn: # cp /usr/share/doc/openvpn/examples/easy-rsa/2.0 /etc/openvpn/easy-rsa/2.0

Zmieniamy katalog na 2.0: # cd /etc/openvpn/easy-rsa/2.0

300 |

Rozdział 9. Tworzenie bezpiecznych międzyplatformowych wirtualnych sieci prywatnych

Otwieramy plik vars i określamy własne wartości w poniższych wierszach. Nigdzie nie należy pozostawiać pustych pól. Aby nie przypisywać własnej wartości, należy użyć wartości NA: export export export export export export

KEY_SIZE=2048 KEY_COUNTRY=PL KEY_PROVINCE=NA KEY_CITY=Linuxville KEY_ORG="Alrac.net-test" KEY_EMAIL="[email protected]"

Następnie należy uruchomić poniższe polecenia w sposób, w jaki się wyświetlają, i postępować zgodnie z ich komunikatami. Za wiodącą kropką w poleceniu . ./vars jest spacja. # . ./vars # ./clean-all # ./build-ca

Na pytanie o wspólną nazwę (ang. common name) należy wpisać opisowy tekst — na przykład vpn-ca. Następnie uruchamiamy poniższe polecenie, aby utworzyć certyfikat serwera, nadając mu nazwę naszego własnego serwera: # ./build-key-server xena

W polu Common Name należy umieścić pełną kwalifikowaną nazwę domeny, na przykład xena.alrac.net. Odpowiadamy yes na pytanie Sign the certificate? [y/n] oraz 1 out of 1 certificate requests certified, commit? [y/n]. Następnie tworzymy unikatowe klucze dla wszystkich naszych klientów. Poniższe polecenie generuje parę kluczy bez hasła dla laptopa o nazwie Stinkpad: # ./build-key stinkpad

Można również zabezpieczyć klucz klienta hasłem. W takim przypadku należy użyć poniższego polecenia: # ./build-key-pass stinkpad

Za każdym razem, kiedy użytkownik zainicjuje połączenie, wyświetli się pytanie o hasło. W polu Common Name należy użyć nazwy hosta. Następnie generujemy parametry Diffiego-Hellmana: # ./build-dh

Na koniec tworzymy klucz TLS-AUTH. Kopia tego klucza musi się znaleźć na serwerze i wszystkich klientach: # cd keys/ # openvpn --genkey --secret ta.key

Katalog keys powinien teraz mieć następującą zawartość: 01.pem 02.pem ca.crt ca.key dh2048.pem index.txt index.txt.attr index.txt.attr.old index.txt.old serial serial.old stinkpad.crt stinkpad.csr stinkpad.key

9.5. Tworzenie własnej infrastruktury PKI na potrzeby programu OpenVPN

|

301

ta.key xena.crt xena.csr xena.key

Dla własnego zdrowia psychicznego należy wyodrębnić katalog, w którym są tworzone certyfikaty. Można go nawet umieścić na osobnym komputerze PC. Należy utworzyć nowy katalog z kluczami i skopiować do niego nowe klucze i certyfikaty serwera. Wszystkie poniższe polecenia należy uruchomić z katalogu /etc/openvpn/easy-rsa/2.0: # mkdir -m 0700 /etc/openvpn/keys # cp ca.crt ../../keys # mv dh2048.pem ta.key xena.crt xena.key ../../keys

Pliki stinkpad.key, stinkpad.crt oraz kopie plików ta.key i ca.crt należy przenieść do odpowiedniego katalogu na komputerze Stinkpad. Dla każdego dodatkowego klienta należy stworzyć unikatową parę kluczy. Więcej informacji o sposobie konfiguracji serwera i klientów w celu używania nowej infrastruktury PKI można znaleźć w następnej recepturze.

Dyskusja Certyfikaty X509 można odczytać za pomocą następującego polecenia: $ openssl x509 -in [nazwa_certyfikatu] -text

Wszystkie pliki kończące się na .key zawierają klucze prywatne. Należy je ostrożnie przechowywać i nigdy nie wolno udostępniać ich osobom postronnym. Pliki .crt zawierają certyfikaty publiczne i mogą być współdzielone. Plik ca.key zawiera prywatny główny klucz urzędu certyfikacji. Najwięksi paranoicy wykonują wszystkie te czynności w komputerze, który nigdy nie jest podłączony do żadnej sieci, a do przesłania ich do odpowiednich hostów jest wykorzystywana pamięć podręczna Flash USB lub bezpośrednie połączenie za pośrednictwem kabla z przeplotem. Można także skorzystać z bezpiecznego kopiowania w sieci LAN, pod warunkiem, że w naszych komputerach zainstalowano SSH: # scp stinkpad.crt stinkpad:/etc/openvpn/keys/

Wygenerowanie pary certyfikat-klucz dla każdego klienta wymaga trochę pracy, ale są to działania, dzięki którym nasz tunel OpenVPN staje się bezpieczny. Jeśli ktoś kiedykolwiek tworzył pary kluczy od podstaw, wykorzystując OpenSSL zamiast doskonałych skryptów dołączonych do programu OpenVPN, doceni to, jak bardzo programiści systemu OpenVPN uprościli ten proces. Należy zastanowić się nad zastosowaniem certyfikatów klienckich chronionych hasłem we wszystkich laptopach. Wszystkie klienckie pecety zlokalizowane poza biurem, zwłaszcza laptopy, stwarzają ryzyko kradzieży i niewłaściwego wykorzystywania. Należy użyć pola Common Name do utworzenia unikatowej nazwy każdej pary kluczy. Osobiście preferuję stosowanie konwencji nazw vpnserver oraz vpnclient, ponieważ są to różne typy kluczy, o czym można się przekonać, czytając skrypty build-key. Używanie nazwy hosta w roli nazwy klucza to szybki sposób sprawdzenia, jakie klucze należą do jakiego hosta. Łatwo się pogubić w przypadku konieczności posługiwania się wieloma kluczami. Odpowiednia strategia nazewnictwa pozwoli na zachowanie kontroli.

302

|

Rozdział 9. Tworzenie bezpiecznych międzyplatformowych wirtualnych sieci prywatnych

Parametr Diffiego-Hellmana to mechanizm szyfrowania pozwalający na tworzenie i współdzielenie tajnego klucza przez dwa hosty. Po przeprowadzeniu uwierzytelniania przez klienta i serwer OpenVPN generowane są dodatkowe klucze wysyłania i odbierania danych w celu zaszyfrowania sesji.

Patrz także • więcej informacji na temat infrastruktury PKI można znaleźć w doskonałym artykule Charlie-

go Hosnera OpenVPN and the SSL Revolution: http://www.sans.org/reading_room/whitepapers/ vpns/1459.php?portal=c7da694586dcdad815fd41098461e495 • man 8 openvpn • dokument How-to programu OpenVPN: http://openvpn.net/howto.html

9.6. Konfiguracja serwera OpenVPN dla wielu klientów Problem Skonfigurowaliśmy infrastrukturę klucza publicznego (PKI) i skopiowaliśmy klucze klienckie na komputery klienckie. W jaki sposób należy teraz skonfigurować serwer i klienty?

Rozwiązanie Można zastosować konfigurację zaprezentowaną w poniższych przykładach: ## server3.conf local 192.168.3.10 port 1194 proto udp dev tun daemon server 10.0.0.0 255.255.255.0 push "route 192.168.1.0 255.255.255.0" push "dhcp-option DNS 192.168.1.50" max-clients 25 ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/xena.crt key /etc/openvpn/keys/xena.key dh /etc/openvpn/keys/dh1024.pem tls-auth /etc/openvpn/keys/ta.key 0 cipher BF-CBC comp-lzo keepalive 10 120 log-append /var/log/openvpn.log status /var/log/openvpn-status.log ifconfig-pool-persist /etc/openvpn/ipp.txt mute 20 verb 4 ## client3.conf client pull dev tun

9.6. Konfiguracja serwera OpenVPN dla wielu klientów

| 303

proto udp remote 192.168.3.10 1194 ca /etc/openvpn/keys/ca.crt cert /etc/openvpn/keys/xena.crt key /etc/openvpn/keys/xena.key tls-auth /etc/openvpn/keys/ta.key 1 cipher BF-CBC comp-lzo verb 4 mute 20 ns-cert-type server

Uruchamiamy OpenVPN w zwykły sposób: root@xena:~# openvpn /etc/openvpn/server3.conf root@stinkpad:~# openvpn /etc/openvpn/client3.conf

Plik konfiguracji klienta kopiujemy do tylu klientów linuksowych, do ilu chcemy, a następnie próbujemy nawiązać połączenie. Serwer OpenVPN powinien w każdym przypadku wyświetlić powitanie.

Dyskusja Mamy teraz doskonałą, silną, prawdziwą wirtualną sieć prywatną — skonfigurowaną i działającą. Teraz można korzystać z sieci z poziomu zdalnych klientów niemal tak samo jak z lokalnych. Jest jednak kilka ograniczeń: zdalne klienty nie widzą się wzajemnie, a ruch rozgłoszeniowy, którego jednym z bardziej znanych przykładów jest Samba, nie może przekroczyć routera. Jestem zwolenniczką utrzymywania różnych wersji plików konfiguracyjnych, takich jak server2.conf oraz server3.conf. Umożliwiają one szybkie i łatwe testowanie różnych konfiguracji. Plikom konfiguracyjnym można nadawać dowolne nazwy. Spróbujmy przyjrzeć się pokrótce opcjom konfiguracji. Dokładny opis można znaleźć na stronach podręcznika man, zatem tu omówimy tylko najważniejsze punkty. Wiersz z opcją server informuje OpenVPN, aby uruchomił się w trybie serwera, oraz powoduje automatyczną konfigurację routingu i adresacji na kliencie. Składnia polecenia to server sieć maska_podsieci. Serwer przypisuje sobie adres .1 jako koniec tunelu, automatycznie rezerwuje pulę adresów klienckich oraz wybiera prawidłową trasę VPN do klientów. Można to zobaczyć poprzez uruchomienie polecenia route na komputerach klienckich. Opcja push "route" wysyła prawidłową trasę, dzięki czemu klienty VPN mogą uzyskać dostęp do sieci LAN za serwerem OpenVPN. Opcja push "dhcp-option DNS" informuje zdalne klienty o tym, gdzie znajduje się serwer DNS. Jest to dla nich bardzo przydatna informacja. Opcja ns-cert-type server w plikach konfiguracji klientów zapobiega połączeniu z serwerem, w którym nie ma oznaczenia nsCertType=server w obrębie certyfikatu. Ustawienie tej opcji to zadanie skryptu build-key-server. Jest to dodatkowe zabezpieczenie, które poprawia ochronę przed atakami man-in-the-middle. W celu dodania jeszcze jednej warstwy weryfikacji można skorzystać z opcji tls-remote w klienckich plikach konfiguracyjnych. Opcja ta pobiera wartość Common Name z certyfikatu serwera. Ustawia się ją w następujący sposób: 304 |

Rozdział 9. Tworzenie bezpiecznych międzyplatformowych wirtualnych sieci prywatnych

tls-remote xena.alrac.net

Jeśli klient nie widzi poprawnej wartości Common Name, nawiązanie połączenia nie jest możliwe.

Patrz także • man 8 openvpn • dokument How-to programu OpenVPN: http://openvpn.net/howto.html

9.7. Uruchamianie OpenVPN przy rozruchu systemu Problem Nie chcemy uruchamiać serwera OpenVPN ręcznie. Chcemy, aby uruchamiał się przy starcie systemu tak jak inne usługi.

Rozwiązanie Najpierw należy zmodyfikować plik /etc/init.d/openvpn i upewnić się, że poniższy wiersz wskazuje na katalog z konfiguracją: CONFIG_DIR=/etc/openvpn

Następnie należy sprawdzić, czy jest tam tylko jeden plik konfiguracyjny. Skrypt startowy wyszukuje pliki z rozszerzeniem .conf i próbuje je po kolei uruchamiać. Najnowsze wersje OpenVPN obsługują wiele tuneli. Na razie jednak uruchomimy tylko jeden. W dystrybucji Debian skrypty startowe są uruchamiane automatycznie, zatem użytkownicy Debiana mogą przejść do następnej receptury. W dystrybucji Fedora w celu uruchomienia skryptów startowych należy uruchomić polecenie chkconfig --add openvpn.

W dystrybucjach Debian i Fedora serwerem OpenVPN można zarządzać za pomocą standardowych poleceń /etc/init.d/openvpn start|stop|restart. Większości klientów raczej nie konfiguruje się w taki sposób. Dla linuksowych użytkowników OpenVPN będących w podróżach służbowych do uruchomienia tunelu OpenVPN należy utworzyć alias w wierszu poleceń lub ikonę na pulpicie. Polecenie-alias tworzy się w następujący sposób: $ alias opensesame='openvpn /etc/openvpn/client3.conf'

Aby otworzyć sesję VPN, wystarczy teraz wpisać polecenie opensesame. Aby zobaczyć aliasy, można skorzystać z polecenia alias -p. Poszczególne aliasy usuwa się za pomocą polecenia unalias nazwa_aliasu. Sposób tworzenia ikon na pulpicie zależy od wykorzystywanego środowiska pulpitu lub menedżera okien. W środowisku KDE należy kliknąć prawym przyciskiem myszy ikonę menu K, a następnie otworzyć edytor menu. Teraz należy wkleić całe polecenie. Nie powinno się używać aliasów. W środowisku Gnome można skorzystać z nowego edytora menu Alacarte.

9.7. Uruchamianie OpenVPN przy rozruchu systemu

| 305

Dyskusja Z zaprezentowanym rozwiązaniem wiążą się pewne problemy bezpieczeństwa, ponieważ każdy, kto ma dostęp do zdalnego komputera, ma również dostęp do naszej sieci. Kradzieże laptopów są na porządku dziennym. Ze służbowych komputerów domowych nagminnie korzystają członkowie rodzin. Istnieje wiele możliwych metod, których celem jest niedopuszczenie do logowania się do sieci przez nieodpowiednie osoby. Użycie skryptu build-key-pass do stworzenia kluczy chronionych hasłem pozwala na wprowadzenie przydatnej dodatkowej warstwy zabezpieczeń. Warto zastanowić się nad wymaganiem, aby we wszystkich laptopach była stosowana pewna forma szyfrowania dysku. OpenVPN daje użytkownikowi solidne narzędzie zabezpieczenia przed zdarzeniami losowymi — wykorzystanie PKI daje możliwość odwoływania certyfikatów, co całkowicie uniemożliwia użytkownikowi zalogowanie się. Sposób odwoływania certyfikatów opisano w następnej recepturze.

Patrz także • man 8 openvpn • dokument How-to programu OpenVPN: http://openvpn.net/howto.html • man 1 bash

9.8. Odwoływanie certyfikatów Problem Nasz system OpenVPN działa doskonale i wszyscy są zadowoleni. Właśnie otrzymaliśmy wiadomość, że pracownik opuścił firmę lub jeden z pracowników będących w podróży służbowej stracił laptop. Tak czy owak, za wszelką cenę trzeba zablokować użytkownikowi dostęp do sieci. W jaki sposób można to zrobić?

Rozwiązanie Należy przejść do katalogu /etc/openvpn/easy-rsa/ na serwerze i uruchomić poniższe dwa polecenia, wykorzystując nazwę certyfikatu klienta, który ma być odwołany: # . ./vars # ./revoke-full stinkpad Using configuration from /etc/openvpn/easy-rsa/openssl.cnf DEBUG[load_index]: unique_subject = "yes" Revoking Certificate 01. Data Base Updated Using configuration from /etc/openvpn/easy-rsa/openssl.cnf DEBUG[load_index]: unique_subject = "yes" stinkpad.crt: /C=US/ST=NA/O=Alrac.net-test/CN=openvpnclient-stinkpad/ [email protected] error 23 at 0 depth lookup:certificate revoked

Komunikat error 23 oznacza, że odwołanie certyfikatu powiodło się. Po wykonaniu operacji pojawi się nowy plik — /etc/openvpn/easy-rsa/keys/crl.pem, który zawiera kontrolną listę odwołań.

306

|

Rozdział 9. Tworzenie bezpiecznych międzyplatformowych wirtualnych sieci prywatnych

Następnie należy dodać poniższy wiersz do pliku konfiguracyjnego serwera: crl-verify /etc/openvpn/easy-rsa/crl.pem

Restartujemy serwer OpenVPN: # /etc/init.d/openvpn restart

Zrobione. Użytkownik został zablokowany. Przy kolejnych odwołaniach certyfikatów nie trzeba restartować serwera. Jeśli użytkownik jest połączony, OpenVPN rozłączy go i tak w przeciągu godziny przy okazji negocjacji nowych kluczy wysyłania i odbierania informacji. Można też wysłać sygnał SIGHUP i rozłączyć użytkowników natychmiast: # /etc/init.d/openvpn reload

Powoduje to przeładowanie wszystkich klientów, ale użytkownicy nie powinni odczuć żadnych problemów. Oczywiście poza tym, który zostanie rozłączony.

Dyskusja Kiedy użytkownik zapomni hasło, można odwołać jego certyfikat, a następnie utworzyć nowy, używając tej samej wartości pola Common Name. Należy sprawdzić, czy do pliku crl.pem mają uprawnienia odczytu wszyscy użytkownicy. Należy również dodać poniższe wiersze do konfiguracji serwera: ping-timer-rem persist-tun

Opcja ping-timer-rem powoduje, że polecenie ping nie zlicza przekroczeń limitu czasu do momentu, gdy klienty faktycznie nawiążą połączenie. Opcja persist-tun powoduje, że tunel pozostanie otwarty nawet wtedy, gdy nastąpi restart za pomocą sygnału SIGHUP lub ping.

Patrz także • man 8 openvpn • dokument How-to programu OpenVPN: http://openvpn.net/howto.html • man 7 signal

9.9. Konfiguracja serwera OpenVPN w trybie mostkowania Problem Ponieważ nie obsługujemy zbyt wielu użytkowników, chcemy, aby serwer OpenVPN działał w trybie mostkowania. Godzimy się na niższą wydajność ethernetowego mostu w zamian za łatwą administrację. Upewniliśmy się, że nie ma konfliktów adresów pomiędzy klientami VPN a klientami sieci LAN.

9.9. Konfiguracja serwera OpenVPN w trybie mostkowania

|

307

Rozwiązanie Po pierwsze, należy się upewnić, czy zainstalowano pakiet bridge-utils. Następnie należy pobrać przykładowy skrypt bridge-start. Jeśli jakaś dystrybucja nie zawiera tego skryptu, można go znaleźć w archiwum tarball systemu OpenVPN z kodami źródłowymi lub w internecie, w serwisie OpenVPN.net (http://openvpn.net/bridge.html#linuxscript). Należy zmodyfikować pierwszą część pliku, wprowadzając własny adres mostu, adres interfejsu TAP oraz własny adres IP: # Definicja interfejsu mostu br="br0" # Definicja listy interfejsów TAP, które mają być zmostkowane, # na przykład tap="tap0 tap1 tap2". tap="tap0" # Definicja fizycznych interfejsów internetowych, które mają być zmostkowane # z interfejsami TAP wymienionymi powyżej. eth="eth0" eth_ip="192.168.1.10" eth_netmask="255.255.255.0" eth_broadcast="192.168.1.255"

Następnie kopiujemy tę konfigurację do katalogu /usr/sbin/openvpn razem ze skryptem bridge-stop, w którym nie trzeba wprowadzać zmian. Następnie należy zmodyfikować dwie linijki w pliku konfiguracji serwera. W naszym przypadku jest to plik /etc/openvpn/server-bridge.conf. Modyfikujemy zapis dev tun na dev tap0, a następnie ujmujemy w komentarz wiersze z opcją server i push i zastępujemy je następującym wierszem: server-bridge 192.168.1.10 255.255.255.0 192.168.1.128 192.168.1.254

Powoduje to skonfigurowanie mostu server-bridge — określenie bramy, maski podsieci, początku zakresu adresów IP klientów oraz końca zakresu adresu IP klientów. W konfiguracji klientów VPN również należy zmodyfikować opcję dev tun na dev tap0. W celu ręcznego przetestowania konfiguracji należy uruchomić poniższe polecenia: # bridge-start # openvpn /etc/openvpn/server-bridge.conf

Testujemy połączenia. Powinniśmy mieć dostęp do udziałów Samby i innych zasobów sieci. Po zakończeniu testowania należy wcisnąć klawisze Ctrl+C w celu zatrzymania systemu OpenVPN, a następnie uruchomić skrypt bridge-stop w celu zniszczenia mostu. Aby most uruchamiał się i zatrzymywał automatycznie, należy dodać poniższe wiersze w pliku server-bridge.conf: up /usr/sbin/openvpn/bridge-start down /usr/sbin/openvpn/bridge-stop

Dyskusja Użytkownicy zapory firewall iptables powinni skorzystać z poniższych reguł w celu przesyłania ruchu VPN przez most: $ipt -A INPUT -i tap0 -j ACCEPT $ipt -A INPUT -i br0 -j ACCEPT $ipt -A FORWARD -i br0 -j ACCEPT

308 |

Rozdział 9. Tworzenie bezpiecznych międzyplatformowych wirtualnych sieci prywatnych

Zastosowanie mostów w sieci Ethernet jest w pewnym sensie prostsze od routingu. Trzeba jednak pogodzić się z obniżoną wydajnością, ponieważ ruch rozgłoszeniowy przechodzi przez most z obu stron. Zastosowanie mostkowania dobrze sprawdza się w mniejszych sieciach, gdzie pozwala na zaoszczędzenie wielu problemów związanych z routingiem.

Patrz także • man 8 openvpn • dokument How-to programu OpenVPN: http://openvpn.net/howto.html

9.10. Uruchamianie OpenVPN z wykorzystaniem konta nieuprzywilejowanego użytkownika Problem W wielu dystrybucjach Linuksa występują użytkownik i grupa nobody. Aby skonfigurować OpenVPN do działania z uprawnieniami nieuprzywilejowanego użytkownika nobody, należy dodać opcje user nobody oraz group nobody do pliku konfiguracji serwera. W niektórych dystrybucjach Linuksa występuje zarówno unikatowy użytkownik, jak i grupa OpenVPN. Jednak w Debianie nie ma użytkownika i grupy nobody. Podczas instalacji nie jest też tworzone unikatowe konto ani grupa OpenVPN. Co należy zrobić?

Rozwiązanie Nie ma żadnego problemu. Wystarczy stworzyć użytkownika i grupę openvpn i skorzystać z nich: # groupadd openvpn # useradd -d /dev/null -g test -s /bin/false openvpn

Następnie należy dodać poniższe wiersze do plików konfiguracyjnych serwera OpenVPN: user openvpn group openvpn persist-key

Należy to zrobić zarówno dla serwerów, jak i klientów.

Dyskusja Użytkownik nobody jest zazwyczaj intensywnie wykorzystywany. W związku z tym należy raczej utworzyć unikatowego użytkownika i konto na potrzeby systemu OpenVPN i nie korzystać z konta nobody. Zastosowanie opcji persist-key powoduje, że połączenie OpenVPN jest utrzymywane nawet wtedy, gdy zostało zainicjowane przez nieuprzywilejowanego użytkownika openvpn, który nie ma uprawnień do odczytu prywatnych kluczy czy też innych plików dostępnych do czytania tylko dla użytkownika root.

9.10. Uruchamianie OpenVPN z wykorzystaniem konta nieuprzywilejowanego użytkownika

| 309

Patrz także • man 8 openvpn • dokument How-to programu OpenVPN: http://openvpn.net/howto.html • man 8 useradd

9.11. Nawiązywanie połączeń przez klienty Windows Problem Chcemy wyposażyć zdalnych użytkowników Windowsa w możliwość łączenia się za pośrednictwem OpenVPN. W jaki sposób można skonfigurować klienta OpenVPN w systemie Windows?

Rozwiązanie Przede wszystkim potrzebujemy systemu Windows w wersji 2000, 2003 lub XP. Starsze wersje systemu Windows nie nadają się do tego celu. Konfiguracja klientów OpenVPN w systemie Windows nie różni się zbytnio od konfiguracji w systemie Linux. Najpierw należy pobrać i zainstalować windowsową wersję programu OpenVPN. Do tego celu potrzebne są uprawnienia administratora. Następnie należy utworzyć katalog \Program Files\OpenVPN\keys i skopiować do niego klucz klienta. Następnie należy otworzyć plik \Program Files\OpenVPN\sample-config\client.ovpn i zmodyfikować go w sposób identyczny jak dla klientów linuksowych (patrz receptury 9.4 i 9.5). Konfigurację zapisujemy w pliku \Program Files\OpenVPN\config\client.ovpn. Następnie wystarczy kliknąć ikonę pliku prawym przyciskiem myszy i wybrać polecenie Start OpenVPN on this config file. Można następnie przeciągnąć ją na pulpit lub dla wygody użytkowników skopiować go do ich katalogów Pulpit.

Dyskusja W systemie Windows nie ma użytkownika ani grupy nobody, zatem należy pominąć te opcje w pliku client.ovpn. Systemem OpenVPN można zarządzać tak jak pozostałymi usługami — za pomocą apletu Usługi w Panelu sterowania. Zazwyczaj jednak chcemy, aby użytkownicy posługiwali się tunelem OpenVPN wtedy, gdy go potrzebują, a nie po to, aby był uruchomiony przez cały czas.

Patrz także • man 8 openvpn • dokument How-to programu OpenVPN: http://openvpn.net/howto.html

310

|

Rozdział 9. Tworzenie bezpiecznych międzyplatformowych wirtualnych sieci prywatnych

ROZDZIAŁ 10.

Tworzenie linuksowego serwera VPN PPTP

10.0. Wprowadzenie W sieciach windowsowych do tworzenia wirtualnych sieci prywatnych często wykorzystywany jest protokół tunelowania PPTP (Point-to-Point Tunneling Protocol). Konfiguracja windowsowego serwera PPTP oznacza wyrzucanie pieniędzy na licencje serwera Windows. Jeśli ktoś już ma serwer Windows, to ma wbudowane własności VPN dzięki wbudowanemu serwerowi RRAS (Routing and Remote Access Server), który również można wykorzystać w tej roli. Jeśli jednak się na to nie zdecydujemy, możemy stworzyć fajny serwer VPN bazujący na protokole PPTP, ponosząc jedynie koszty sprzętu. W tym celu należy skorzystać z Linuksa oraz serwera Poptop. Komputer wykorzystany do tej roli będzie potrzebował co najmniej dwóch interfejsów sieciowych, ponieważ będzie odgrywał rolę routera oraz urządzenia przekazującego ruch sieciowy. W jakim miejscu sieci należy umieścić serwer VPN? Znaną praktyką jest umieszczanie bramy VPN na routerach brzegowych. Jeśli dysponujemy routerem brzegowym bazującym na Linuksie, jest to bardzo łatwe. W innych przypadkach potrzebna będzie samodzielna brama VPN skonfigurowana za routerem brzegowym podobna do tej, którą pokazano na rysunku 10.1.

Rysunek 10.1. Samodzielny serwer VPN

Protokół PPTP stworzono w czasach dominacji połączeń modemowych, zatem w dalszym ciągu można znaleźć wiele odwołań do modemów w dokumentacji protokołu oraz klientów windowsowych. Protokół ten można jednak wykorzystywać w sieci z połączeniami dowolnego typu: modemowymi, Ethernet, ISDN, internetowymi itp.

311

Rozwiązanie VPN bazujące na protokole PPTP jest słabe pod względem bezpieczeństwa. Jest to protokół punkt-punkt (PPP) w tunelu GRE (Generic Routing Encapsulation). Żaden z tych protokołów nie został zaprojektowany z myślą o bezpieczeństwie. W protokole PPTP obowiązuje uwierzytelnianie jednoskładnikowe, w którym nazwa użytkownika i hasło są wymagane tylko od klienta. W implementacji firmy Microsoft wykorzystano do uwierzytelniania protokół MS-CHAP V2 (Microsoft Challenge Handshake Authentication), a do szyfrowania protokołów MPPR (Microsoft Point-to-Point Encryption). W protokole MPPE wykorzystywany jest algorytm RC4 w celu wygenerowania 128-bitowych kluczy szyfrowania i odszyfrowywania. Klucze te są pochodnymi haseł użytkowników mających postać zwykłego tekstu. Po obu stronach tunelu wykorzystywany jest ten sam klucz. Sam tunel jest zaufany od początku i nie wymaga uwierzytelniania. Napastnik musi jedynie przechwycić fragment strumienia danych, a następnie zdobyć hasło metodą siłową w wolnym czasie. Kiedy napastnikowi uda się złamać hasło, może uzyskać dostęp do wszystkiego. Porównajmy to z konfiguracją OpenVPN, w której wykorzystuje się infrastrukturę klucza publicznego (PKI) oraz kilka poziomów szyfrowania (patrz rozdział 9.). Po co zatem używać sieci VPN bazującej na protokole PPTP, skoro system OpenVPN jest darmowy, międzyplatformowy i znacznie silniejszy. Ponieważ czasami nie ma wyboru, ponieważ instalacja PPTP jest łatwa i przebiega bez problemów, ponieważ we wszystkich wersjach Windowsa istnieją wbudowane klienty (w pewnej postaci), ponieważ w sieci jest wiele przestarzałego sprzętu sieciowego, który nie obsługuje windowsowej implementacji IPSec i PPTP zapewnia jedyną możliwość skonfigurowania VPN. Wykorzystując trzy komputery PC, można bez trudu skonfigurować dobre środowisko testowe. Wystarczy zmontować zestaw podobny do tego, który pokazano w recepturze 9.1.

Konieczne aktualizacje klientów windowsowych W systemach Windows 9x i ME konieczna jest aktualizacja MSDun. W systemie Windows 2000 konieczne jest zainstalowanie dodatku Windows 2000 High Encryption Pack. Zapewnia on możliwość wykorzystania 128-bitowego szyfrowania. Potrzebne aktualizacje można pobrać za darmo w witrynie http://microsoft.com.

Bezpieczeństwo protokołu PPTP Najlepszą obroną jest wymuszenie strategii bardzo silnych haseł. Maksymalna długość hasła wynosi 20 znaków, zatem dlaczegóż by nie wykorzystać ich wszystkich? Nie należy stosować słów lub nazwisk, ale losowe znaki takie jak 9/'wx1$)E6^bB-L3%=sP. Użytkownicy i tak z pewnością zaznaczą pole wyboru Zapamiętaj hasło w swoich klientach, zatem nie trzeba się starać, aby hasło było łatwe do zapamiętania. Hasła należy okresowo zmieniać. Pamiętacie, jak OpenVPN ogranicza możliwości szkód wynikających z pomyślnego włamania dzięki cogodzinnym zmianom kluczy szyfrowania (odszyfrowywania)? Klucze PPTP zmieniają się tylko wtedy, gdy zmieniamy hasła. Aby uzyskać pomoc w generowaniu haseł, można skorzystać z licznych programowych generatorów haseł oraz witryn internetowych.

312

|

Rozdział 10. Tworzenie linuksowego serwera VPN PPTP

VPN bazujący na IPSec System Windows obsługuje również rozwiązania VPN bazujące na protokołach L2TP/IPsec. Rozwiązania VPN bazujące na L2TP/IPsec wymagają infrastruktury PKI, co oznacza więcej pracy podczas konfiguracji, ale są to rozwiązania znacznie silniejsze. L2TP to protokół tunelowania warstwy drugiej (Layer 2 Tunneling Protocol). Jest on kombinacją najlepszych własności oryginalnej implementacji PPP firmy Microsoft oraz protokołu L2F (Layer 2 Forwarding) firmy Cisco. IPSec to protokół zabezpieczeń internetowych (Internet Protocol Security). Jest to zestaw protokołów służący do szyfrowania i uwierzytelniania ruchu sieciowego. Firma Microsoft z powodów, które z pewnością są dla niej korzystne, niemal zawsze łączy protokoły L2TP i IPSec. To znacznie komplikuje obsługę kliencką na platformach niewindowsowych oraz powoduje problemy zgodności z innymi rozwiązaniami VPN. Sam protokół IPSec działa bez zarzutu i jest powszechnie obsługiwany. W rozszerzonej rodzinie systemów Windows obsługa wymienionych trzech protokołów jest zróżnicowana: Bazujący na PPTP protokół RAS (Remote Access Server) Windows NT4 Server Protokół RRAS — PPTP i L2TP/IPsec (Routing and Remote Access Server) Windows 2000 Server oraz Windows 2003 Server Protokół RAS dla pojedynczych połączeń — PPTP i L2TP/IPsec Windows 2000 Professional, XP Professional i Vista Klient PPTP i L2TP/IPsec Windows 98, ME, NT4, 2000, 2003, XP i Vista Protokół RAS dla pojedynczego połączenia służy do otwarcia zdalnego tunelu VPN z komputerem PC. Konfiguruje się go w obszarze Połączenia przychodzące folderu Połączenia sieciowe. System Windows 95 obsługuje wyłącznie klienta PPTP. Systemy Windows 98 i ME nie mają wbudowanych klientów PPTP. Można je zdobyć w wyniku rutynowych aktualizacji razem z obsługą klienta L2TP/IPsec. W komputerach z tymi systemami należy zainstalować aktualizację MSdun1.4. Połączenia L2TP/IPSec pomiędzy routerami są możliwe jedynie w przypadku zastosowania: • serwera Windows z obsługą protokołu RRAS; • zewnętrznego routera VPN obsługującego protokoły L2TP/IPSec.

System Windows NT4 Server nie obsługuje protokołów L2TP/IPSec. Na marginesie, jako dość zabawną ciekawostkę, warto dodać, że firma Microsoft pracuje nad protokołem SSTP (Secure Socket Tunneling Protocol), który — podobnie jak rozwiązania VPN firm Cisco, Juniper, Nortel i inne — bazuje na HTTP w łączu SSL. Firma Microsoft zapowiedziała jego obsługę w wersji serwera Longhorn. Informacje o tym, co jest rzeczywistą implementacją VPN, a co nią nie jest, można znaleźć w doskonałym artykule Charliego Hosnera OpenVPN and the VPN Revolution (http://www.sans.org/reading_room/whitepapers/vpns/).

10.0. Wprowadzenie

|

313

Wymagania dla systemu Linux Łatwym sposobem konfiguracji maszyny linuksowej jest wykorzystanie dystrybucji systemu Linux z wersją jądra nowszą niż 2.6.15-rc1 oraz sprawdzenie, czy dysponujemy właściwą wersją protokołu ppp. W przypadku demona pptpd Poptop w wersjach 1.3.0 do 1.3.4 jest to ppp w wersji 2.4.3. W momencie powstawania tej książki większość dystrybucji Linuksa zawierała protokół ppp w wersji 2.4.4. Użytkownicy Debiana nie muszą niczego robić — działa poprawnie bez żadnych modyfikacji. Użytkownicy Fedory powinni pobrać pakiet RPM z odpowiednią wersją ppp oraz pakiet RPM z demonem pptpd ze strony pobierania systemu Poptop. Użytkownicy dystrybucji Ubuntu mogą mieć pewne trudności, o których będzie mowa w recepturze 10.10. Starsze wersje jąder wymagają instalacji łatek. Więcej informacji na temat tego, w jaki sposób uzyskać obsługę MPPE, można znaleźć w serwisie Poptop (http://www.poptop.org/).

Czy zastosowanie protokołu PPTP jest naprawdę łatwiejsze? Moim zdaniem można by nad tym dyskutować. Głównym argumentem, który przemawia za PPTP zamiast za silniejszymi rozwiązaniami VPN, jest łatwość instalacji. Wynika ona z braku konieczności instalowania oprogramowania klienckiego. Jest to jednak tylko w części prawda — Windows 2000 wymaga aktualizacji w celu uzyskania obsługi 128-bitowego szyfrowania, a starsze wersje Windowsa wymagają uaktualnień w celu uzyskania klientów PPTPD oraz obsługi szyfrowania 128-bitowego. W dobrej sytuacji są ci użytkownicy, którzy regularnie aktualizują swoje systemy. Jeśli ktoś jest zmuszony do instalacji oprogramowania klienckiego, powinien rozważyć zastosowanie OpenVPN. Przy tym samym nakładzie pracy uzyskuje się znacznie silniej zabezpieczony system.

Patrz także • informacje o bezpieczeństwie protokołu PPTP:

http://pptpclient.sourceforge.net/protocol-security.phtml

10.1. Instalacja serwera Poptop w dystrybucji Debian Problem Mamy w sieci LAN stado klientów windowsowych, ale nie mamy dostępnych serwerów Windows lub skonfigurowanych bram VPN. W związku z tym w celu umożliwienia zdalnego dostępu do naszej sieci LAN jesteśmy zmuszeni do skonfigurowania linuksowego serwera VPN Poptop bazującego na Debianie.

Rozwiązanie W dystrybucji Debian jest to niezwykle proste. Najpierw trzeba sprawdzić, czy dysponujemy wersją protokołu ppp-2.4.3 lub nowszą oraz wersją jądra nowszą niż 2.6.15-rc1: $ apt-show-versions ppp ppp/etch uptodate 2.4.4

314

|

Rozdział 10. Tworzenie linuksowego serwera VPN PPTP

$ uname -r 2.6.17-10

Następnie sprawdzamy, czy jądro zawiera konieczną obsługę protokołu MPPE (Microsoft Point-to-Point Encryption): # modprobe ppp-compress-18 && echo success success

Teraz można zainstalować demona pptpd w standardowy sposób: # aptitude install pptpd

Demon pptpd uruchomi się automatycznie razem z systemem. Jest zarządzany w standardowy sposób za pomocą polecenia /etc/init.d/pptpd [start|stop|restart]. Należy zwrócić uwagę na pewną osobliwość opcji restart, która nie powoduje zamknięcia istniejących sesji. W związku z tym kompletne zrestartowanie serwera wymaga użycia opcji stop, a następnie start. W tym momencie jesteśmy gotowi do przystąpienia do konfigurowania serwera.

Dyskusja Jeśli załadowanie modułu ppp-compress-18 się nie powiedzie, wyświetli się następujący komunikat: FATAL: Module ppp-compress-18 not found

Jest jednak bardzo mało prawdopodobne, że wystąpią takie problemy w przypadku posiadania właściwej wersji jądra lub starszej wersji jądra z zainstalowanymi odpowiednimi łatkami.

Patrz także • man 8 aptitude • man 8 modprobe

10.2. Instalacja łatek jądra Debiana w celu zapewnienia obsługi protokołu MPPE Problem Ups... W systemie Debian mamy starsze jądro (sprzed 2.6.15-rc1), w związku z tym jesteśmy zmuszeni do skompilowania modułu jądra MPPE. W jaki sposób można to zrobić?

Rozwiązanie Wykonaj następujące czynności: Najpierw należy pobrać niezbędne narzędzia, źródła jądra i łatki z obsługą MPPE: # apt-get install gcc bin86 libc6-dev bzip2 kernel-package kernel-patch-mppe

Następnie odczytujemy wersję jądra: # uname -r 2.6.8

10.2. Instalacja łatek jądra Debiana w celu zapewnienia obsługi protokołu MPPE

|

315

Następnie pobieramy, rozpakowujemy i przygotowujemy pakiet z kodem źródłowym jądra: # # # # #

apt-get install kernel-source-2.6.8 cd /usr/src tar xfj kernel-source-2.6.8.tar.bz2 cd kernel-source-2.6.8 make-kpkg clean

Kopiujemy istniejący plik konfiguracji jądra w celu kompilacji nowego jądra: # cp /boot/config-2.6.8 ./.config-2.6.8

Na koniec kompilujemy nowy pakiet jądra: # cd /usr/src/kernel-source-2.6.8 # make-kpkg \ --added-patches mppe \ --append-to-version -mppe \ --config oldconfig \ --initrd \ kernel_image

Podczas konfiguracji nowego jądra należy pamiętać o włączeniu pakietu CONFIG_PPP_MPPE jako modułu: PPP MPPE compression (encryption) (PPP_MPPE) [N/m/?] (NEW) m

Po zakończeniu konfiguracji, kiedy jądro zacznie się kompilować, można spokojnie pójść na spacer, ponieważ operacja ta zajmie kilka minut. Czasami może to być nawet kilkanaście lub kilkadziesiąt minut, w zależności od komputera, na którym wykonuje się kompilację. Po zakończeniu kompilacji należy zainstalować nowe jądro: # dpkg --install /usr/src/kernel-image-2.6.8-mppe_10.00.Custom_all.deb

Uruchamiamy ponownie system w celu załadowania nowego jądra, a następnie możemy przetestować, czy obsługa protokołu MPPE jest włączona: # modprobe ppp-compress-18 && echo success success

Hurra! Wszystko się udało. Można teraz przystąpić do konfigurowania serwera Poptop.

Dyskusja Środowisko kompilacji wymaga trochę miejsca — należy zarezerwować kilka gigabajtów. Można skonfigurować PC jako maszynę kompilacji, a następnie skopiować nowy obraz jądra do lokalizacji docelowej. Trzeba uważnie skonfigurować je stosownie do wymogów sprzętu, na którym ma ono działać. Debian oferuje ograniczoną liczbę oficjalnych wersji jądra: • kernel-source-2.4.27; • kernel-source-2.6.8; • linux-source-2.6.18; • linux-source-2.60,20.

Więcej wersji jądra można znaleźć w serwisie Snapshot Debiana (http://snapshot.debian.net/), ale — tak jak napisano w ostrzeżeniu zamieszczonym w serwisie — mogą wystąpić problemy ze zarchiwizowanymi tam pakietami. Po wydaniu dystrybucji Debian Etch przyjęto dla Debiana nową konwencję nazewnictwa pakietów jądra. Stara konwencja dla pakietów z kodem źródłowym to kernel-source-[wersja], nato316

|

Rozdział 10. Tworzenie linuksowego serwera VPN PPTP

miast pakiety binarne miały nazwy kernel-image-[wersja]. Przewidując, że pewnego dnia będą dostępne pakiety dla innych wydań, na przykład Hurd, przyjęto nową konwencję nazewnictwa: linux-source-[wersja] oraz linux-image-[wersja].

Patrz także • dokument HOWTO dotyczący instalacji w Debianie łatki z obsługą protokołu MPPE:

http://pptpclient.sourceforge.net/howto-debian-build.phtml

10.3. Instalacja serwera Poptop w dystrybucji Fedora Problem Mamy w sieci LAN stado klientów windowsowych, ale nie mamy dostępnych serwerów Windows lub skonfigurowanych routerów VPN. W związku z tym w celu umożliwienia zdalnego dostępu do naszej sieci LAN jesteśmy zmuszeni do skonfigurowania linuksowego serwera VPN Poptop bazującego na dystrybucji Fedora.

Rozwiązanie Łatwym sposobem jest wykorzystanie dystrybucji Fedora w wersji 5. lub nowszej. W tych wydaniach jest dostępna obsługa protokołu MPPE, zatem można zająć się instalacją i uruchomieniem serwera Poptop. Najpierw trzeba sprawdzić, czy jądro zawiera obsługę protokołu MPPE: # modprobe ppp-compress-18 && echo success success

Następnie należy sprawdzić wersję protokołu ppp: $ rpm -q ppp ppp-2.4.4-1.fc6

Ups! Ta wersja nie będzie działać, należy ją zastąpić wersją 2.4.3. Usuwamy ją: # yum remove ppp

Następnie pobieramy i instalujemy właściwe pakiety RPM ze strony pobierania serwera Poptop, w serwisie Sourceforge.net (http://sourceforge.net/project/showfiles.php?group_id=44827). Najnowsze wersje to obecnie ppp-2.4.3-5 oraz pptpd-1.3.4. Następnie konfigurujemy demona pptpd, tak aby uruchamiał się przy starcie systemu. Można to zrobić standardowo, za pomocą polecenia chkconfig: # chkconfig pptpd on

Zwróćmy uwagę, że demonem pptpd można sterować za pomocą standardowych poleceń /etc/init.d/pptpd [start|stop|restart|status|condrestart]. Należy zwrócić uwagę, że jedynie użycie opcji stop powoduje całkowite zamknięcie serwera wraz ze wszystkimi sesjami. W związku z tym, aby całkowicie zrestartować serwer, należy skorzystać z opcji stop, a następnie start. W tym momencie możemy przystąpić do konfigurowania serwera.

10.3. Instalacja serwera Poptop w dystrybucji Fedora

|

317

Dyskusja Do prawidłowego działania serwera pptp jest potrzebna odpowiednia wersja protokołu ppp. W czasie powstawania tej książki w dokumentacji były pewne nieścisłości na ten temat. W niektórych dystrybucjach systemu Linux nie uwzględniano zależności pakietu pptp od właściwej wersji protokołu ppp. Więcej informacji na ten temat można znaleźć w recepturze 10.10.

Patrz także • Poptop, serwer PPTP dla Linuksa: http://www.poptop.org/

10.4. Instalacja łatek jądra Fedory w celu zapewnienia obsługi protokołu MPPE Problem Ups! Mamy starszą wersję jądra w dystrybucjach Fedora, Red Hat, CentOS lub innej podobnej do Red Hata (wcześniejszą niż 2.6.15-rc1). Nie chcemy jej aktualizować, zatem musimy skompilować moduł jądra MPPE. W jaki sposób można to zrobić?

Rozwiązanie Opiekunowie (ang. maintainers) oprogramowania Poptop wykorzystują dynamiczną obsługę modułów jądra (Dynamic Kernel Module Support — DKMS) do wygenerowania modułu jądra MPPE. kernel module. Jest to sposób znacznie łatwiejszy od tradycyjnego. Najpierw sprawdzamy obecność obsługi MPPE: # modprobe ppp-compress-18 && echo ok FATAL: Module ppp-compress-18 not found.

Następnie trzeba skompilować nowy moduł jądra. Należy wykonać poniższe czynności. Najpierw odczytujemy wersję jądra: # uname -r 2.6.11-1.1369.fc6

Następnie pobieramy właściwy pakiet kernel-devel. Zaczynamy od wyświetlenia dostępnych wersji: # yum search kernel-devel [...] kernel-devel.i586 2.6.11-1.1369.fc6 core Matched from: kernel-devel [...]

Jeśli jest więcej niż jedna, instalujemy tę, która odpowiada wersji jądra: # yum install kernel-devel-2.6.11-1.1369_fc4.i586

Jeśli jest tylko jedna, jest trochę mniej pisania: # yum install kernel-devel

Następnie instalujemy pakiet DKMS — doskonałe narzędzie upraszczające tworzenie nowych modułów jądra: 318

|

Rozdział 10. Tworzenie linuksowego serwera VPN PPTP

# yum install dkms

Na koniec pobieramy z witryny pobierania Sourceforge serwera Poptop (http://sourceforge.net/ project/showfiles.php?group_id=44827) pakiet RPM do stworzenia modułu MPPE (obecnie dkms-2.0.10-1) i instalujemy go. Ponownie uruchamiamy system, a następnie próbujemy załadować moduł MPPE: # modprobe ppp-compress-18 && echo success success

Doskonale! Teraz możemy zainstalować i uruchomić serwer pptpd.

Dyskusja Innym sposobem instalacji pakietu kernel-devel jest znalezienie i pobranie właściwego pakietu RPM, a następnie użycie programu Yum w celu jego zainstalowania. Można to zrobić w następujący sposób: # yum localinstall kernel-devel-2.6.11-1.1369_FC4.i686.rpm

Sposób ten można wykorzystać w przypadku, gdy zastosowanie programu Yum do znalezienia pakietu kernel-devel odpowiadającego zainstalowanemu jądru nie daje rezultatu. Wersje muszą być zgodne. W innym przypadku moduł jądra może nie działać.

Patrz także • man 8 yum • man 8 modprobe

10.5. Konfiguracja samodzielnego serwera VPN PPTP Problem Mamy w sieci LAN niewielką liczbę klientów windowsowych, ale nie mamy dostępnych serwerów Windows. W związku z tym w celu umożliwienia zdalnego dostępu do naszej sieci LAN chcemy zainstalować linuksowy serwer VPN Poptop. Wcześniej zainstalowaliśmy oprogramowanie Poptop w wybranej dystrybucji Linuksa na komputerze z co najmniej dwoma interfejsami sieciowymi. Sieć jest skonfigurowana i gotowa do użycia.

Rozwiązanie W klientach Windows powinny być zainstalowane wszystkie niezbędne aktualizacje (więcej informacji na ten temat można uzyskać w podrozdziale „Wprowadzenie”). Następnie należy zmodyfikować trzy pliki: /etc/pptpd.conf; /etc/ ppp/options.pptpd (Fedora); /etc ppp/pptpd-options (Debian); /etc//ppp/chap-secrets. Oto kompletne przykłady wszystkich trzech plików: 10.5. Konfiguracja samodzielnego serwera VPN PPTP

|

319

##/etc/pptpd.conf option /etc/ppp/pptpd-options logwtmp localip 192.168.0.10 remoteip 192.168.0.100-254 ##/etc/ppp/pptpd-options/- /etc/ppp/options.pptpd name pptpd refuse-pap refuse-chap refuse-mschap require-mschap-v2 require-mppe-128 proxyarp nodefaultroute debug dump lock nobsdcomp novj novjccomp nologfd ##/etc/ppp/chap-secret # pojedynczy klient do testowania # klient serwer hasło adresy IP foober pptpd password

*

Kopiujemy tę zawartość z wyjątkiem następujących wierszy: /etc/pptpd.conf Dla argumentów localip i remoteip należy użyć własnego schematu adresacji. Wartości te są dowolne. Adresy muszą się jednak znajdować w innych sieciach niż nasza sieć LAN. /etc/ppp/chap-secrets W tym pliku są zapisane nazwy użytkowników i hasła. Nazwa serwera pochodzi z wiersza z argumentem name w pliku /etc/ppp/pptpd-options. Można teraz uruchomić serwer pptpd: # /etc/init.d/pptpd stop # /etc/init.d/pptpd start

Aby potwierdzić, czy działa, można skorzystać z poleceń netstat lub ps: # netstat -untap | grep pptpd tcp 0 0 0.0.0.0:1723 0.0.0.0:* $ ps ax | grep pptpd 4167 ? Ss 0:00 /usr/sbin/pptpd

LISTEN

4167

142680

22085/cupsd

Aby włączyć przekazywanie IP, dodajemy poniższy wiersz do pliku /etc/sysctl.conf: net.ipv4.ip_forward = 1

Następnie, w celu załadowania nowych ustawień, uruchamiamy poniższe polecenie: # sysctl -p

Należy się upewnić, czy porty TCP 47 i TCP 1723 nie są zablokowane. Jeśli nie, to serwer jest gotowy do przyjmowania połączeń klientów.

Dyskusja Aby można było połączyć się z serwerem pptpd, w klientach windowsowych należy skonfigurować poniższe zmienne: • client, server i password z pliku /etc/ppp/chap-secret; 320

|

Rozdział 10. Tworzenie linuksowego serwera VPN PPTP

• „rzeczywisty” adres IP serwera pptpd (nie wartość zmiennej localip); • odpowiedni typ szyfrowania: MS-Chapv2, wyłącznie 128-bitowy.

Restart demona pptpd nie zamyka istniejących tuneli, zatem w celu wykonania całkowitego restartu należy zatrzymać serwer, a następnie go uruchomić. Poniżej zamieszczono opis kilku opcji konfiguracji: logwtmp

Ustawienie tej opcji umożliwia śledzenie połączeń klienckich. Dzięki temu można skorzystać z poleceń who i last do sprawdzenia, kto jest zalogowany, oraz historię logowania klientów.

localip

Jako wartości tej opcji można użyć pojedynczego adresu IP albo zakresu adresów. Jej ustawienie powoduje przypisanie adresu do końca tunelu, na którym znajduje się serwer. Jako wartości tej opcji można użyć pojedynczego adresu IP albo zakresu adresów. W przypadku zdefiniowania zakresu adresów każdemu klientowi będzie przypisany inny adres IP serwera. Żadna z metod nie jest ani lepsza, ani gorsza, dlatego należy zastosować tę, która bardziej nam odpowiada. Wartość opcji localip jest dowolna i nie ma związku z rzeczywistym adresem IP serwera.

remoteip

Adresy klientów są przypisywane z zakresu zdefiniowanego za pomocą tej opcji.

name

Dowolna nazwa serwera PPTPD. Podobnie jak w przypadku zmiennej localip, nie ma związku z rzeczywistą nazwą hosta serwera.

refuse-pap, refuse-chap, refuse-mschap, require-mschap-v2, require-mppe-128

Włączenie algorytmów najsilniejszego szyfrowania.

proxyarp

Dodaje punkty końcowe tunelu pptpd do lokalnej tabeli ARP. Dzięki temu sprawiają one wrażenie, że wszystkie występują w lokalnej sieci.

nodefaultroute

Włączenie tej opcji powoduje, że domyślna trasa systemu lokalnego nie jest modyfikowana.

debug, dump

Opcje te należy włączać podczas testowania oraz zawsze w przypadku wystąpienia problemów. Opcję debug należy ustawić w pliku /var/log/debug, opcję dump ustawia się w pliku /var/log/messages.

novj, novjccomp

Wyłączenie kompresji Van Jacobsona. Czasami pomaga to rozwiązać problemy z połączeniami klientów pracujących pod kontrolą systemu Windows 2000. Włączenie tych opcji zwykle nie powoduje problemów. Więcej informacji na ten temat można znaleźć w poniższym wątku na liście mailingowej grupy The Aims Group (http://marc.theaimsgroup.com/?t= 111343175400006&r=1&w=2).

Patrz także • Poptop, serwer PPTP dla Linuksa: http://www.poptop.org/ • man 5 pptpd.conf • man 8 pptpd 10.5. Konfiguracja samodzielnego serwera VPN PPTP

|

321

10.6. Dodawanie serwera Poptop do usługi Active Directory Problem Zarządzamy domeną Active Directory. Chcemy, aby jej członkiem stał się linuksowy serwer pptp, zatem chcemy nim zarządzać w taki sam sposób jak innymi obiektami AD. Serwer DNS działa bez zarzutu. W systemie jest też skonfigurowane centrum dystrybucji kluczy Kerberos (Kerberos Key Distribution Center — KDC).

Rozwiązanie Aby linuksowy serwer Poptop stał się pełnoprawnym członkiem Active Directory, należy zainstalować na nim pakiety Samba, Winbind i Kerberos. Aby się dowiedzieć, jak należy to zrobić, można sięgnąć do receptury 11.6. Następnie należy skonfigurować serwer Poptop zgodnie ze wskazówkami zamieszczonymi w poprzednich recepturach i dodać poniższe wiersze do pliku /etc/ppp/options.pptpd: ##/etc/ppp/options.pptpd [...] #w przypadku użycia MS-DNS należy wprowadzić adres IP serwera ms-dns 1.2.3.5 #w przypadku użycia serwera WINS należy wprowadzić adres IP ms-wins 1.2.3.4 plugin winbind.so ntlm_auth-helper "/usr/bin/ntlm_auth --helper-protocol=ntlm-server-1"

Uruchamiamy serwer i sprawdzamy, czy działa, za pomocą poleceń netstat lub ps: # /etc/init.d/pptpd stop # /etc/init.d/pptpd start # netstat -untap | grep pptpd tcp 0 0 0.0.0.0:1723 0.0.0.0:* $ ps ax | grep pptpd 4167 ? Ss 0:00 /usr/sbin/pptpd

LISTEN

4167/pptpd

Teraz można spróbować podłączyć kilka klientów windowsowych. Wszystko powinno działać bez problemów. Klienty z systemem Windows 2000 i nowszymi mogą skorzystać z mechanizmu uwierzytelniania usługi Active Directory. Dla nich nie trzeba wprowadzać zapisów w pliku /etc/ ppp/chap-secrets.

Dyskusja Wtyczki należy umieścić na końcu pliku /etc/ppp/options.pptpd. Pozwala to uniknąć możliwych konfliktów. Plik /usr/bin/ntlm_auth jest częścią pakietu Winbind.

Patrz także • Poptop, serwer PPTP dla Linuksa: http://www.poptop.org/ • klient PPTP: http://pptpclient.sourceforge.net/ 322

|

Rozdział 10. Tworzenie linuksowego serwera VPN PPTP

10.7. Połączenia klientów linuksowych z serwerem PPTP Problem Chcemy nawiązać połączenie z linuksowych komputerów PC z serwerem Windows lub linuksowym serwerem PPTP.

Rozwiązanie Nie ma problemu, wystarczy zainstalować klienta pptp. W dystrybucji Debian należy skorzystać z następującego polecenia: # aptitude install pptp-linux

W dystrybucji Fedora: # yum install pptp

W pliku /etc/ppp/options.pptp należy umieścić następujące opcje: ##/etc/ppp/options.pptp lock noauth refuse-eap refuse-chap refuse-mschap nobsdcomp nodeflate require-mppe-128

Następnie wprowadzamy hasło i nazwę użytkownika w pliku /etc/ppp/chap-secrets: ##/etc/ppp/chap-secrets # klient serwer hasło adresy IP foober server1 tuffpassword

*

W przypadku uwierzytelniania do windowsowego serwera RAS należy wprowadzić nazwę domeny: alrac.net\\foober server1 tuffpassword *

Następnie tworzymy plik /etc/ppp/peers/$TUNNEL. W tym przykładzie tunelowi nadano nazwę server1. ##/etc/ppp/peers/server1 pty "pptp rasserver --nolaunchpppd" name alrac.net\\foober remotename server1 require-mppe-128 file /etc/ppp/options.pptp ipparam server1

Tunel uruchamiamy i zatrzymujemy ręcznie za pomocą starych poczciwych poleceń pon/poff: $ pon server1 $ poff server1

Wykorzystanie polecenia pon z opcjami takimi jak poniżej powoduje uruchomienie serwera w tle: $ pon provider updetach && pon server1 updetach

10.7. Połączenia klientów linuksowych z serwerem PPTP

|

323

Aby zaoszczędzić trochę pisania, można zdefiniować aliasy: $ alias vpn1on='pon provider updetach && pon server1 updetach' $ alias vpn1off='poff server1'

Teraz wpisanie polecenia vpn1 spowoduje nawiązanie połączenia, natomiast polecenie vpn1off spowoduje jego zamknięcie.

Dyskusja Wszystkie linuksowe menedżery okien i pulpity graficzne zapewniają sposoby dołączania niestandardowych poleceń do ikony menu. Dzięki temu połączenie VPN można uruchomić i zatrzymać za pomocą kliknięcia myszy. Można również pobrać graficznego klienta pptpconfig z witryny PPTP Client (http://pptpclient. sourceforge.net). Innym dobrym rozwiązaniem jest KVpnc (http://home.gna.org/kvpnc/en/) — klient KDE dla wszystkich rozwiązań VPN.

Patrz także • klient PPTP: http://pptpclient.sourceforge.net • KVpnc: http://home.gna.org/kvpnc/en/

10.8. Połączenia z serwerem PPTP poprzez zaporę firewall iptables Problem W jaki sposób skonfigurować zaporę firewall iptables, aby umożliwić ruch VPN serwera Poptop?

Rozwiązanie To zależy od tego, czy serwer pptp Poptop działa na brzegowej zaporze firewall, czy też na oddzielnym serwerze umieszczonym za nią. Jeśli jest zainstalowany na zaporze firewall, należy skorzystać z poniższych reguł, zgodnych z konwencjami wykorzystywanymi w rozdziale 3.: $ipt -A INPUT -p tcp -dport 1723 -j ACCEPT $ipt -A INPUT -p 47 -j ACCEPT

W przypadku stosowania restrykcyjnej strategii dla pakietów wychodzących, należy dodać poniższe reguły. Umożliwiają one przesyłanie pakietów wychodzących: $ipt -A OUTPUT -p tcp -sport 1723 -j ACCEPT $ipt -A OUTPUT -p 47 -j ACCEPT

Poniższe reguły zapory iptables z funkcją NAT należy zastosować w celu przekazywania ruchu do osobnego serwera pptp. Należy wstawić w nich własne nazwy interfejsów i adresy sieci. W tym przykładzie 172.16.1.10 oznacza adres serwera pptp, natomiast 2.3.4.5 jest adresem w sieci WAN: $ipt -t nat -A PREROUTING -p tcp -i $WAN_IFACE --dport 1723 -j \ --to-destination 172.16.1.10 $ipt -t nat -A PREROUTING -i $WAN_IFACE -p gre -d 2.3.4.5 -j DNAT \

324

|

Rozdział 10. Tworzenie linuksowego serwera VPN PPTP

--to-destination 172.16.1.10 $ipt -A FORWARD -i $WAN_IFACE -o $LAN_IFACE -p tcp --dport 1723 -d 172.16.1.10 -m \ state --state NEW,ESTABLISHED,RELATED -j ACCEPT $ipt -A FORWARD -i $WAN_IFACE -o $LAN_IFACE -p gre -d 172.16.1.10 -m state \ --state NEW,ESTABLISHED,RELATED -j ACCEPT

W przypadku stosowania restrykcyjnej strategii dla pakietów FORWARD należy wykorzystać poniższe reguły, które zezwalają na przekazywanie pakietów VPN: $ipt -A FORWARD -i $LAN_IFACE -o $WAN_IFACE -p tcp -s 172.16.1.10 --sport 1723 \ -m state --state ESTABLISHED,RELATED -j ACCEPT $ipt -A FORWARD -i $LAN_IFACE -o $WAN_IFACE -p gre -s 172.16.1.10 -m state \ --state ESTABLISHED,RELATED -j ACCEPT

Dyskusja Krótką listę protokołów IP można znaleźć w pliku /etc/protocols. W pakiecie Nmap jest dostępna znacznie bardziej obszerna lista. Protokołowi gre odpowiada wartość 47. Wartości numeryczne są przypisane do wszystkich protokołów.

Patrz także • rozdział 3.

10.9. Monitorowanie serwera PPTP Problem W jaki sposób można monitorować, kto jest zalogowany na serwerze Poptop?

Rozwiązanie To łatwe: można skorzystać z poleceń who i last. Polecenie who wyświetla listę zalogowanych użytkowników, natomiast polecenie last pokazuje historię logowania: $ who [...] carla :0 2007-05-03 08:02 foober ppp0 2007-05-03 10:09 (1.2.3.4) arlene ppp0 2007-05-03 10:17 (2.3.4.5) $ last foober ppp0 1.2.3.4 Thu May 3 10:09 still logged in arlene ppp0 2.3.4.5 Thu May 3 10:17 still logged in carla :0 Thu May 3 08:02 still logged in reboot system boot 2.6.17-10-generi Thu May 3 08:02 - 10:10 (02:08) wtmp begins Tue May 1 22:31:38 2007

Dyskusja Nie należy zapominać o poleceniu grep stosowanym w celu pozbycia się niepotrzebnych zapisów: $ last |grep ppp foober ppp0 arlene ppp0

1.2.3.4 2.3.4.5

Thu May Thu May

3 10:09 3 10:17

still logged in still logged in

10.9. Monitorowanie serwera PPTP

|

325

Patrz także • man 1 who • man 1 last

10.10. Rozwiązywanie problemów z serwerem PPTP Problem Mamy problem z nawiązaniem połączenia z klienta pracującego pod kontrolą systemu Windows z linuksowym serwerem Poptop. Co należy zrobić?

Rozwiązanie Najpierw trzeba się upewnić, że serwer pptp działa. W tym celu należy skorzystać z polecenia netstat: # netstat -untap | grep pptp tcp 0 0 0.0.0.0:1723 0.0.0.0:*

LISTEN

12893/pptpd

Następnie należy skorzystać ze starego poczciwego polecenia ping w celu przetestowania łączności. Po wykonaniu tych czynności trzeba przeanalizować komunikaty o błędach wyświetlane przez windowsowego klienta. Na rysunku 10.2 pokazano ekran, jaki wyświetla się w systemie Windows XP w przypadku, gdy serwer jest nieosiągalny.

Rysunek 10.2. Windows XP nie może odnaleźć serwera PPTP 326

|

Rozdział 10. Tworzenie linuksowego serwera VPN PPTP

Informacje na temat poszczególnych błędów można znaleźć w internecie, posługując się numerem błędu. Jest to możliwe dzięki temu, że w systemie Windows stosowane są standardowe kody błędów serwera RAS (Remote Access Server). Następnie należy sprawdzić, czy zapora firewall nie blokuje tunelu VPN. Łatwym, ale ryzykownym sposobem jest jej wyłączenie. Innym sposobem wykonania tej operacji w przypadku zapory firewall iptables jest uruchomienie skryptu fw_status (patrz rozdział 3.) i odszukanie następujących wierszy: Chain PREROUTING (policy ACCEPT 74530 packets, 7108K bytes) num pkts bytes target prot opt in out source destination 1 0 0 DNAT tcp -- eth1 any anywhere foo.net tcp dpt:1723 to:192.168.1.10 2 0 0 DNAT gre -- eth1 any anywhere foo.net to:192.168.1.10 7 0 0 ACCEPT tcp -- eth1 eth0 anywhere xena.alrac.net tcp dpt:1723 state NEW,RELATED,ESTABLISHED 8 0 0 ACCEPT gre -- eth1 eth0 anywhere xena.alrac.net state NEW,RELATED,ESTABLISHED

Można sprawdzić adres docelowy, zgodność stanów, nazwy interfejsów oraz zgodność protokołów. Włączenie opcji dump i debug w pliku /etc/pptpd.conf generuje mnóstwo przydatnych informacji w plikach /var/log/debug i /var/log/messages. Niżej zaprezentowany komunikat o błędzie często dotyka użytkowników dystrybucji Ubuntu Edgy Eft, a także użytkowników innych dystrybucji Linuksa będących pochodnymi Debiana. April 17 08:19:31 router3 pptpd[6762]: CTRL: GRE) April 17 08:19:31 router3 pppd[6763]: Plugin pppd version 2.4.3, this is 2.4.4 April 17 08:19:31 router3 pptpd[46762]: GRE: PTY failed: status = -1 error = Input/output termination of pppd, check option syntax and

Starting call (launching pppd, opening /usr/lib/pptpd/pptpd-logwtmp.so is for read(fd=6,buffer=6808440,len=8196) from error, usually caused by unexpected pppd logs

Klienty nie będą w stanie nawiązać połączeń i zazwyczaj będą się na nich wyświetlały różne, niezbyt wiele mówiące komunikaty o błędach. Problem wynika z rozbieżności między wersjami ppp i logwtmp. Aby szybko poprawić ten błąd, wystarczy ująć w komentarz wiersz w pliku /etc/pptpd.conf: #logwtmp

Wtedy jednak nie będzie możliwe monitorowanie serwera pptp za pomocą poleceń who i last. Aby to poprawić, należy pobrać kod źródłowy demona pptpd, zmodyfikować plik nagłówkowy, a następnie zainstalować i skompilować jego nową, binarną wersję. Nie jest to trudne, wystarczy się zalogować z uprawnieniami użytkownika root i postępować zgodnie z poniższymi wskazówkami: # # # #

cd apt-get install libwrap0-dev debhelper apt-get source pptpd cd pptpd-1.3.0/plugins

Następnie należy otworzyć plik patchlevel.h za pomocą wybranego edytora tekstu i zmodyfikować wiersz: #define VERSION "2.4.3"

na: #define VERSION "2.4.4"

10.10. Rozwiązywanie problemów z serwerem PPTP

|

327

Po wprowadzeniu zmiany należy zapisać plik i go zamknąć. Następnie należy uruchomić następujące polecenia: # # # #

cd ../.. apt-get -b source pptpd dpkg -i pptpd_1.3.0-1ubuntu1_i386.deb dpkg -i bcrelay_1.3.0-1ubuntu1_i386.deb

To wszystko! Jeszcze raz sprawdzamy konfigurację. Wszystko powinno działać bez problemów.

Dyskusja Mam nadzieję, że do czasu, kiedy czytelnicy będą mieli tę książkę w rękach, rozbieżności między wersjami ppp i logwtmp znikną. Oto kilka innych problemów, na które należy zwrócić uwagę: • zapory firewall na hostach z systemem Windows; • hasła o długości przekraczającej 20 znaków; • nieprawidłowa nazwa lub adres serwera; • nieprawidłowe hasło; • klienty Windows bez obsługi szyfrowania 128-bitowego; należy pamiętać, że klienty z wer-

sjami Windows 9x wymagają aktualizacji MSDun 1.4; klienty z systemem Windows 2000 wymagają pakietu High Encryption.

Patrz także • lista mailingowa w serwisie Poptop: http://www.poptop.org/

328

|

Rozdział 10. Tworzenie linuksowego serwera VPN PPTP

ROZDZIAŁ 11.

Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

11.0. Wprowadzenie Chociaż byłoby doskonale, żeby mieć taką pracę, w której ma się do czynienia wyłącznie z niezawodnymi komputerami linuksowymi, w rzeczywistości częściej zdarzają się sieci mieszane. Realia wymagają od administratorów znajomości integracji wielu różnych platform, głównie pracujących pod kontrolą systemów Windows, Linux i Unix, ale czasami także Mac OS X oraz Classic Mac. W tym rozdziale opisano sposób integracji komputerów linuksowych i windowsowych, ponieważ są to platformy spotykane najczęściej. Systemy Unix i Mac OS X są na tyle podobne do Linuksa, że osoby znające Linuksa powinny bez trudu poradzić sobie z ich obsługą. Czytelnicy potrzebujący pomocy w pracy z innymi platformami lub z uruchomieniem domeny Windows mogą sięgnąć do dodatku A, gdzie można znaleźć listę dobrych materiałów referencyjnych. Na problem integracji Windowsa z Linuksem spojrzymy z dwóch punktów widzenia: mamy windowsową domenę Active Directory, do której chcemy dodać kilka hostów linuksowych, lub mamy sieć linuksową, do której chcemy dodać kilka hostów pracujących w systemie Windows. Samba może spełniać kilka możliwych funkcji: • serwera logowania/kontrolera domeny; • serwera plików; • serwera drukarek; • klienta domeny zarówno dla stacji roboczych, jak i serwerów.

Maszyny linuksowe można włączyć niemal do każdej sieci, a dzięki pakietom Samba i Winbind mogą się one nawet stać pełnowartościowymi obiektami Active Directory. Kluczowym elementem umożliwiającym integrację jest Samba — musi być zainstalowana na wszystkich hostach linuksowych.

329

Zastąpienie kontrolera domeny NT4 Czytelnicy, którzy korzystają z kontrolera domeny Windows NT4 i myślą o aktualizacji, powinni rozważyć zastąpienie go serwerem Samba. Samba doskonale się sprawdza w roli zastępczego systemu kontrolera domeny NT. Serwery linuksowe z Sambą są w stanie obsłużyć większe obciążenia, a jednocześnie są bardziej stabilne i bezpieczne. Samba nie może zastąpić serwera Windows 2000/2003 z usługą Active Directory, ponieważ Active Directory zawiera narzędzia zarządzania użytkownikami i zasobami, które w Sambie nie są dostępne. Jednak w roli klasycznego kontrolera domeny typu NT4 Samba sprawdza się wyśmienicie. Ma następujące zalety: • łatwa integracja hostów linuksowych w sieci LAN; • nie wymaga zakupu drogich schematów licencyjnych, a w związku z tym nie trzeba oba-

wiać się kontroli policji licencyjnych; • większa stabilność, niezawodność i lepsza wydajność; • większe możliwości wyboru dla warstwy backend bazy danych; • wsparcie społeczności oraz dostęp do płatnej pomocy technicznej; • bezpieczna zdalna administracja za pośrednictwem SSH; • niezawodna, wydajna synchronizacja z rezerwowymi serwerami Samby za pomocą rsync.

W przypadku zastosowania Samby w roli kontrolera domeny nie ma problemu z późniejszą adaptacją systemu do środowiska Active Directory. Integracja Samby 3 z Active Directory wymaga zaledwie kilku drobnych zmian w konfiguracji. Pod tym względem jest to znacznie prostsza zmiana w porównaniu z systemem NT4, który w celu zmiany roli z kontrolera domeny na członka domeny wymaga ponownej instalacji systemu. Samba jest doskonałym serwerem plików i drukarek dla mieszanych sieci LAN Windows-Linux, dzięki czemu po zapoznaniu się z dowolną częścią Samby można na tej bazie rozszerzać swoją wiedzę. W przypadku Linuksa nie ma sztucznych rozgraniczeń pomiędzy wersją serwerową a wersją stacji roboczej. Każdą instalację Linuksa można dostosować do dowolnej roli — nie trzeba się męczyć z ograniczonymi wersjami, których jedynym celem jest wydobycie od klienta dodatkowych pieniędzy.

Wymagania sprzętowe Określanie potrzebnej mocy obliczeniowej i objętości pamięci masowej jest trudne do ścisłego sprecyzowania. Spróbujemy jednak przedstawić kilka wskazówek. Dla sieci złożonej z 50 lub mniejszej liczby użytkowników wystarczy stary komputer z procesorem Pentium II, co najmniej 128 MB pamięci RAM oraz odpowiednią ilością miejsca na dysku. W przypadku pracy z systemem X Window lepiej zainstalować 256 MB RAM. Oczywiście wiele zależy od tego, jak bardzo użytkownicy eksploatują serwer, ilu mamy użytkowników, ile miejsca na dysku jest na serwerze oraz jak wiele programów na nim działa. W miarę rozrastania się bazy użytkowników można obliczyć wymagania ilości pamięci zgodnie z poniższą prostą ilustracją ilości zasobów dla 100 użytkowników:

330

|

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

Nazwa aplikacji

Ilość pamięci na użytkownika (MB)

Razem dla wszystkich użytkowników

Samba (nmbd)

16.0

16

Samba (winbind)

16.0

16

Samba (smbd)

4.0

400

Podstawowy OS

128

128

Razem

167.5

560

Samba inicjuje proces dla każdego użytkownika. Wraz z rozrastaniem się bazy użytkowników większa ilość pamięci i szybki podsystem dyskowy poprawiają wydajność znacznie bardziej od szybkiego procesora. Oprócz plików wspólnych użytkownicy mają na serwerze prywatne katalogi domowe. W celu zapewnienia kontroli nad pamięcią masową można ustawiać limity miejsca na dysku dla użytkowników. Robi się to standardowo — za pomocą polecenia quota (więcej informacji na ten temat można znaleźć w podrozdziale 8.22 „Limity dyskowe” w książce Carli Schroder Linux. Receptury — Helion, 2005).

Poszukiwanie sensu Poszukiwanie sensu w sieciach Windows jest sporym wyzwaniem. System Windows XP Home nie może być członkiem żadnej domeny — ani kontrolowanej przez serwer Windows, ani przez Sambę. Systemy Windows NT3.x, Windows 95 poprzedzający wersję OSR2 oraz Windows NT4 poprzedzający wydanie Service Pack 3 nie obsługują szyfrowanych haseł. Samba domyślnie je obsługuje, zatem klienty pracujące pod kontrolą wymienionych systemów nie mogą dołączyć do normalnej domeny Samby. Aby włączyć szyfrowane hasła w Windows 95, można pobrać aktualizację Vrdrupd.exe. Archiwum wraz z instrukcją instalacji można znaleźć w bazie wiedzy Microsoft (należy szukać artykułu kb 165403). Systemy Windows 9x/ME tworzą potencjalną lukę w zabezpieczeniach, ponieważ nie obsługują bardziej bezpiecznego systemu plików NTFS. Najlepiej w roli klientów domeny sprawdzają się systemy Windows NT, 2000, 2003 oraz XP Pro wykorzystujące system plików NTFS. Z Sambą może działać także Windows Vista. W przypadku tej wersji występują pewne problemy z uwierzytelnianiem, które omówimy w recepturze poświęconej systemowi Vista.

11.1. Sprawdzanie, czy wszystkie części są na miejscu Problem Jesteśmy gotowi do integracji kilku hostów linuksowych i windowsowych. Chcemy stworzyć pojedynczy, centralny mechanizm uwierzytelniania dla wszystkich użytkowników. Wybraliśmy Sambę, ponieważ nie jesteśmy gotowi na migrację do backendu LDAP lub dlatego, że jest ona stosunkowo łatwa do zaimplementowania i ponieważ już ją dobrze znamy. Chcemy się dowiedzieć, jakie oprogramowanie trzeba zainstalować.

11.1. Sprawdzanie, czy wszystkie części są na miejscu

|

331

Rozwiązanie Należy zainstalować wszystkie lub niektóre spośród poniższych programów. W każdej recepturze zamieszczonej w niniejszym rozdziale znajduje się lista potrzebnych komponentów programowych: • Samba w wersji 3.0.20 lub nowszej; • MIT Kerberos w wersji 1.4 lub nowszej; • OpenLDAP; • Winbind w wersji 3.0.20 lub nowszej (jest częścią Samby, ale może także występować jako

oddzielny pakiet). Poza tym należy wkompilować do serwera Samba obsługę następujących usług: • Kerberos; • LDAP; • Winbind; • Active Directory.

Pakiety binarne dla Debiana i Fedory są dosyć aktualne i zawierają potrzebne wkompilowane opcje, zatem instalacja Samby wymaga jedynie skorzystania z menedżera pakietów Aptitude lub Yum.

Dyskusja W Debianie programy są zazwyczaj rozdzielone na wiele niewielkich pakietów. W związku z tym znalezienie wszystkich potrzebnych fragmentów czasami może być kłopotliwe. Zainstalowanie Samby wymaga następujących pakietów: samba, samba-common, samba-doc, smbclient oraz winbind. Użytkownicy Fedory muszą zainstalować pakiety samba, samba-client oraz samba-common. Informacje o zainstalowanej wersji Samby można uzyskać za pomocą poniższych poleceń: $ /usr/sbin/smbd --version Version 3.0.23-Debian $ /usr/sbin/winbindd --version Version 3.0.23-Debian

W dystrybucji Debian można sprawdzić zainstalowaną wersję pakietu Kerberos za pomocą polecenia dpkg: $ dpkg -l | grep krb5 ii libkrb53 1.4.4-etch

MIT Kerberos runtime libraries

W dystrybucji Fedora należy skorzystać z polecenia rpm: $ rpm -q krb5-workstation krb5-workstation-1.5-21

Pakiet Samba jest wyposażony w niewielkie doskonałe narzędzie, które wyświetla wszystkie jego wkompilowane opcje: $ /usr/sbin/smbd -b

Jego wykonanie powoduje jednak wygenerowanie wielostronicowego wyniku, należy zatem zawęzić kryteria wyszukiwania za pomocą polecenia grep: 332

|

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

$ smbd -b | grep -i ldap HAVE_LDAP_H HAVE_LDAP HAVE_LDAP_DOMAIN2HOSTLIST ... $ smbd -b | grep -i krb5 HAVE_KRB5_H HAVE_ADDRTYPE_IN_KRB5_ADDRESS HAVE_KRB5 ... $ smbd -b | grep -i ads WITH_ADS WITH_ADS $ smbd -b | grep -i winbind WITH_WINBIND WITH_WINBIND

Wykonanie tego polecenia spowoduje wyświetlenie bardziej obszernego wyniku niż ten, który wydrukowano w tej książce. Z tego, co tu pokazano, widać, że możemy przystąpić do studiowania pozostałych receptur w tym rozdziale. Pusty wiersz oznacza, że obsługa wybranej pozycji nie jest wkompilowana w pakiet Samby. Oznacza to, że trzeba wkompilować ją samodzielnie. Aby się dowiedzieć, jak należy to zrobić, można sięgnąć do receptury 11.2. Zamiast pakietu Kerberos można zastosować implementację Heimdal Kerberos. Niektórzy administratorzy wolą tę wersję, ponieważ nie podlega ona kontroli eksportu według prawa Stanów Zjednoczonych. W przykładach zaprezentowanych w tym rozdziale wykorzystamy implementację MIT Kerberos. Użytkownicy dystrybucji Fedora potrzebują pakietu krb5-workstation zawierającego narzędzia klienckie oraz pakietu krb5-libs do zainstalowania na serwerze. W Debianie ten sam zakres własności rozdzielono na kilka mniejszych pakietów, o czym można się przekonać, przeszukując listę dostępnych pakietów Debiana (http://www.us.debian.org/distrib/packages) lub własną lokalną listę pakietów: $ apt-cache search krb5 libpam-krb5 - PAM module for MIT Kerberos krb5-admin-server - MIT Kerberos master server (kadmind) krb5-clients - Secure replacements for ftp, telnet and rsh using MIT Kerberos krb5-config - Configuration files for Kerberos Version 5 krb5-doc - Documentation for krb5 krb5-ftpd - Secure FTP server supporting MIT Kerberos krb5-kdc - MIT Kerberos key server (KDC) krb5-user - Basic programs to authenticate using MIT Kerberos libkrb53 - MIT Kerberos runtime libraries ssh-krb5 - Secure rlogin/rsh/rcp replacement (OpenSSH with Kerberos)

Na potrzeby niniejszego rozdziału niezbędne będą pakiety krb5-config, krb5-doc, krb5-admin-server, krb5-kdc oraz krb5-user. Użytkownicy Fedory potrzebują poniższych pakietów do uruchomienia OpenLDAP: openldap, openldap-servers oraz openldap-clients. Użytkownicy Debiana będą potrzebowali pakietów ldap-utils, ldapscripts, libldap2 oraz slapd.

Patrz także • man 8 rpm • man 8 dpkg 11.1. Sprawdzanie, czy wszystkie części są na miejscu

|

333

• w rozdziałach 2., 3. i 4. książki Carli Schroder Linux. Receptury (Helion, 2005) szczegółowo

opisano sposób instalacji, aktualizacji i usuwania oprogramowania w systemie Linux.

11.2. Kompilacja Samby z kodu źródłowego Problem W dystrybucji Linuksa, której używamy, nie ma wkompilowanej obsługi wszystkich opcji potrzebnych do uruchomienia serwera Samba (patrz poprzednia receptura). W związku z tym trzeba skompilować go od podstaw, tak by uzyskać pewność, że instalacja zawiera wszystkie potrzebne komponenty. A może należysz do grupy tych użytkowników, którzy wolą instalację na podstawie kodu źródłowego?

Rozwiązanie Należy wykonać poniższe czynności. Najpierw trzeba się upewnić, że w systemie zainstalowano wszystkie niezbędne narzędzia programistyczne. Użytkownicy Debiana potrzebują następujących pakietów: • build-essential; • autoconf; • autogen; • libkrb5-dev; • krb5-user; • gnugpg.

Użytkownicy Fedory powinni zainstalować następujące pakiety: • autoconf; • autogen; • krb5-workstation; • krb5-libs; • krb5-devel; • gnugpg.

Wszystkie potrzebne podstawowe narzędzia programistyczne potrzebne do kompilacji programów z kodu źródłowego w dystrybucji Fedora można zainstalować za pomocą polecenia yum groupinstall 'Development Tools'. Należy pobrać archiwum tarball z kodem źródłowym Samby z serwisu samba.org, a także plik z sygnaturą oraz klucz GPG. Przed pobieraniem sprawdzamy nazwy plików, aby uzyskać pewność, że dysponujemy najnowszymi stabilnymi wersjami: $ wget http://us1.samba.org/samba/ftp/samba-3.0.25a.tar.asc $ wget http://us1.samba.org/samba/ftp/samba-pubkey.asc $ wget http://us1.samba.org/samba/ftp/samba-3.0.25a.tar.gz

334 |

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

Dekompresujemy archiwum tarball w katalogu, w którym mamy uprawnienia zapisu — na przykład we własnym katalogu domowym: $ gunzip -d samba-3.0.25a.tar.gz

Importujemy klucz GPG do pierścienia kluczy (ang. keyring) GPG: $ gpg --import samba-pubkey.asc gpg: key F17F9772: public key "Samba Distribution Verification Key " imported gpg: Total number processed: 1 gpg: imported: 1

Następnie weryfikujemy archiwum tarball po zdekompresowaniu: $ gpg --verify samba-3.0.25a.tar.asc gpg: Signature made Wed Oct 12 19:20:25 2005 PDT using DSA key ID F17F9772 gpg: Good signature from "Samba Distribution Verification Key " Primary key fingerprint: 2FD9 BC31 99F3 AEB0 8D30 2233 A037 FC69 F17F 9772

Można teraz rozpakować archiwum tarball: $ tar xvf samba-3.0.25a.tar

Następnie w drzewie źródłowym Samby wchodzimy do katalogu zawierającego skrypt autogen.sh i uruchamiamy go: $ cd samba-3.0.25b/source $ ./autogen.sh ./autogen.sh: running script/mkversion.sh ./script/mkversion.sh: 'include/version.h' created for Samba("3.0.25a") ./autogen.sh: running autoheader ./autogen.sh: running autoconf

Aby wyświetlić kompletną listę opcji kompilacji, należy skorzystać z polecenia: $ ./configure --help

W celu zapewnienia obsługi usług Active Directory, Kerberos, Winbind i LDAP należy użyć poniższych opcji: $ ./configure --with-ldap --with-ads --with-krb5=/usr --with-winbind

Należy się upewnić, że ścieżka podana w opcji --with-krb5 wskazuje na katalog zawierający biblioteki Kerberos. Ponadto przydatne mogą być również poniższe opcje kompilacji: --with-automount -with-smbmount --with-pam --with-pam_smbpass \ --with-ldapsam --with-syslog --with-quotas --with-sys-quotas

Następnie za pomocą polecenia su uzyskujemy uprawnienie użytkownika root w celu skompilowania i zainstalowania Samby: $ su # make # make install

Pozostało jeszcze skonfigurować Sambę w taki sposób, aby uruchamiała się automatycznie w momencie rozruchu systemu. Zagadnienie to opisano w recepturze 11.3.

Dyskusja Wynik polecenia ./configure—help pokazuje, że dostępnych jest bardzo wiele opcji kompilacji. Za ich pomocą można zarządzać katalogami instalacji, dostrajać szczegółowość informacji diagnostycznych oraz wprowadzać modyfikacje zgodnie ze specyfiką wybranej platformy.

11.2. Kompilacja Samby z kodu źródłowego

|

335

Domyślny katalog instalacji to /usr/local/samba/. Dzięki tej lokalizacji można bez trudu usunąć niedziałającą instalację i zacząć wszystko od początku. Archiwum tarball Samby zawiera pliki i instrukcje dotyczące kompilacji pakietów dla dystrybucji Debian, Red Hat, Solaris i wielu innych. Informacje te można znaleźć w katalogu packaging/ w archiwum tarball Samby. Do kompilacji programów z kodu źródłowego potrzebne jest środowisko programistyczne. Niezbędne narzędzia są standardowo dostępne we wszystkich dystrybucjach Linuksa, jednak w zależności od typu wybranej instalacji mogą być niedostępne: • GNU coreutils; • GNU binutils; • gcc; • gunzip; • bunzip2; • GNU tar; • make.

Patrz także • rozdział 4. „Instalacja programów z kodu źródłowego” z książki Carli Schroder Linux.

Receptury (Helion, 2005)

11.3. Uruchamianie i zamykanie Samby Problem Chcemy się dowiedzieć, w jaki sposób tak skonfigurować Sambę, aby automatycznie uruchamiała się przy starcie systemu, oraz chcemy poznać polecenia potrzebne do ręcznego uruchamiania, zatrzymywania i restartowania Samby.

Rozwiązanie Samba zawiera dwa demony: smbd i nmbd. Jeśli Sambę zainstalowano z pakietów (RPM lub deb), to skrypty startowe zostały utworzone w pliku /etc/init.d. W dystrybucji Debian skrypty te uruchamiają się automatycznie. W dystrybucji Fedora należy uruchomić polecenie chkconfig. # chkconfig --add samba

W dystrybucji Fedora do ręcznego zatrzymywania i uruchamiania Samby służą następujące polecenia: # /etc/init.d/smb {stop|start|restart|reload|condrestart}

W Debianie należy skorzystać z następujących poleceń: # /etc/init.d/samba {stop|start|restart|reload|force-reload}

Aby sprawdzić, czy Samba działa, należy skorzystać z następującego polecenia:

336

|

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

$ ps ax | grep mbd 5781 ? Ss 5783 ? Ss

0:00 /usr/sbin/nmbd -D 0:00 /usr/sbin/smbd -D

Jeśli Sambę zainstalowano z kodu źródłowego, skrypty inicjalizacyjne dla różnych dystrybucji będzie można znaleźć w katalogu packaging w archiwum tarball z kodem źródłowym.

Dyskusja Opcja condrestart umożliwia warunkowy restart — Samba zrestartuje się tylko wtedy, jeśli w momencie wydawania polecenia będzie uruchomiona. Opcja reload powoduje ponowne odczytanie pliku smb.conf zamiast zrestartowania demonów smbd i nmbd. Samba okresowo odczytuje plik smb.conf, zatem nie ma bezwzględnej konieczności restartowania lub przeładowywania serwera przy każdej modyfikacji konfiguracji.

Patrz także • man 8 chkconfig • man 8 update-rc.d • w rozdziale 7. „Uruchamianie i zamykanie systemu Linux” książki Carli Schroder Linux.

Receptury (Helion, 2005) można znaleźć receptury dotyczące zarządzania poziomami startu i usługami

11.4. Wykorzystanie Samby w roli Podstawowego Kontrolera Domeny Problem W sieci potrzebny jest centralny serwer logowania i uwierzytelniania. Są w niej hosty windowsowe lub jest to mieszana sieć LAN złożona z hostów pracujących w systemach Windows i Linux. Chcemy również, aby serwer ten zapewniał dostęp do zasobów sieciowych, takich jak udziały plików i drukarek. Nie mamy windowsowego kontrolera domeny lub działającego serwera haseł. Sieć jest kombinacją konfiguracji typu peer-to-peer i sneakernet lub służy wyłącznie do współdzielenia łącza internetowego, musimy zatem zacząć od początku.

Rozwiązanie Stworzenie kontrolera domeny bazującego na Sambie składa się z siedmiu kroków:

1. Zainstalowanie Samby. 2. Zdefiniowanie konfiguracji w pliku /etc/samba/smb.conf. 3. Utworzenie użytkownika root Samby. 4. Utworzenie grupy dla kont komputerów.

11.4. Wykorzystanie Samby w roli Podstawowego Kontrolera Domeny

|

337

5. Dołączenie wszystkich komputerów pracujących pod kontrolą systemów Windows NT/ 200x/XP/Vista do domeny zarządzanej przez serwer Samba.

6. Utworzenie kont użytkowników zarówno w systemie Linux, jak i na serwerze Samba. 7. Uruchomienie serwera i połączenia klientów w celach testowania. Poniżej zamieszczono kompletny prosty plik /etc/samba/smb.conf dla nowego kontrolera domeny. Należy w nim wstawić własną nazwę grupy roboczej (która jest równocześnie nazwą podstawowej domeny), nazwę NetBIOS, opisową nazwę serwera i adres IP sieci: [global] workgroup = niebieskadomena netbios name = samba1 server string = PDC Samba domain master = yes os level = 64 preferred master = yes domain logons = yes add machine script = /usr/sbin/useradd -s /bin/false -d /dev/null -g machines '%u' passdb backend = tdbsam security = user encrypt passwords = yes log file = /var/log/samba/log log level = 2 max log size = 50 hosts allow = 192.168.1. wins support = yes [netlogon] comment = Sieciowa usługa logowania path = /var/lib/samba/netlogon/ browseable = No writable = No [homes] comment = Katalogi domowe valid users = %S browseable = No writable = Yes

Tworzymy katalog /var/lib/samba/netlogon/, jeśli nie został utworzony wcześniej: # mkdir -m 0755 /var/lib/samba/netlogon/

Tworzymy skrypt netlogon.bat zawierający poniższą zawartość. Skrypt ten służy do automatycznego montowania udziałów na windowsowych pecetach użytkowników. Należy go umieścić w katalogu /var/lib/samba/netlogon/ i nadać tryb 0644. Do tego celu można wykorzystać dowolną literę dysku, pod warunkiem, że nie ma konfliktu z istniejącymi napędami użytkowników: ## netlogon.bat REM NETLOGON.BAT net use z: \\linux\samba /yes

Zapisujemy i zamykamy plik smb.conf, a następnie uruchamiamy polecenie testparm w celu sprawdzenia poprawności syntaktycznej: # testparm Load smb config files from /etc/samba/smb.conf Loaded services file OK. Server role: ROLE_DOMAIN_PDC Server role: ROLE_DOMAIN_PDC is the line you want to see.

338

|

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

Poprawiamy błędy składniowe, jeśli takie są, a następnie restartujemy Sambę (informacje o sposobie uruchamiania i zatrzymywania Samby można znaleźć w recepturze 11.3). Następnie za pomocą polecenia smbpasswd tworzymy konto użytkownika root serwera Samba. Dla tego użytkownika nie należy wykorzystywać takiego samego hasła, jakie zostało przypisane użytkownikowi root systemu Linux: # smbpasswd -a New SMB password: Retype new SMB password: Added user root.

Następnie tworzymy grupę machines: # groupadd -g machines

W tym momencie trzeba po raz pierwszy zalogować się do domeny z komputerów Windows NT/200x/XP/Vista jako użytkownik root serwera Samba. Nie wolno o tym zapomnieć, ponieważ w takim przypadku użytkownicy systemów Windows NT/200x/XP/ Vista nie będą w stanie zalogować się do domeny. Należy zalogować się tak szybko, jak to możliwe, w celu synchronizowania z serwerem oraz po to, by uniemożliwić przejęcie konta ewentualnemu intruzowi. Na koniec należy utworzyć w komputerze z Sambą konta linuksowe dla wszystkich użytkowników w domenie. W tym przykładzie zablokowano możliwość logowania do Linuksa, zatem użytkownicy mogą uzyskać dostęp do swoich katalogów domowych na serwerze tylko za pośrednictwem Samby: # useradd -m -s /bin/false foober

Następnie można skorzystać z polecenia Samby smbpasswd w celu utworzenia kont użytkowników Samby: # smbpasswd -a foober New SMB password: Retype new SMB password: Added user foober.

Należy pamiętać, aby przekazać użytkownikowi foober jego nowe hasło. To żmudny proces (w punkcie „Patrz także” zamieszczono wskazówki dotyczące ułatwienia tego procesu). Na koniec należy uruchomić lub zrestartować Sambę.

Dyskusja Opcja wins support = yes oznacza, że Samba jest serwerem WINS. Nie trzeba robić niczego poza dodaniem tego wiersza w pliku smb.conf, aby serwer Samba automatycznie utrzymywał listę wszystkich zarejestrowanych nazw NetBIOS, pełniąc funkcję serwera DNS dla nazw NetBIOS. Wiersz ten należy usunąć w przypadku, gdy w sieci działa inny serwer WINS. W razie występowania w sieci dwóch serwerów WINS mogą wystąpić problemy. Użytkownicy będą mieli dwa katalogi domowe: jeden na swoich lokalnych komputerach PC i drugi na serwerze Samba. Limit miejsca na dysku na serwerze Samba można ograniczyć użytkownikom w standardowy sposób — za pomocą polecenia quota. Można się całkowicie obyć bez katalogów domowych na serwerze, ale wówczas niektóre opcje mogą nie działać prawidłowo. Problemy są związane między innymi z działaniem uwierzytelniania Kerberos — jeśli kiedykolwiek będziemy chcieli z niego skorzystać — oraz z dołączaniem Samby do domeny Active Directory. 11.4. Wykorzystanie Samby w roli Podstawowego Kontrolera Domeny

|

339

Konto zaufania komputera (ang. Machine Trust Account) — to konto użytkownika, którego właścicielem jest pojedyńczy komputer. Hasło konta zaufania komputera spełnia funkcję wspólnego klucza umożliwiającego bezpieczną komunikację z kontrolerem domeny. Dzięki temu nieuprawniony komputer nie ma możliwości sfałszowania nazwy NetBIOS i uzyskania dostępu. Dla hostów pracujących pod kontrolą systemów Windows 9x/ME nie ma możliwości utworzenia kont zaufania, co stwarza potencjalną lukę w zabezpieczeniach domeny (obok wielu innych luk w zabezpieczeniach, na przykład tego, że w komputerach z systemami Windows 9x/ME użytkownicy mają swobodny dostęp do plików innych użytkowników oraz że w systemie Windows 9x/ME są domyślnie buforowane hasła). Dyrektywa skryptu add machine upraszcza proces tworzenia kont zaufania komputerów. Ręczne utworzenie konta komputera wymaga skorzystania z polecenia podobnego do tego, które pokazano poniżej. Oto przykład stworzenia konta dla hosta tinbox: # useradd -g machines -d /dev/null -s /bin/false tinbox$ # smbpasswd -a -m tinbox

Zwróćmy uwagę, że konto komputera tworzy się bez powłoki logowania i z zablokowanym hasłem. W związku z tym nie ma możliwości zalogowania się do systemu Linux z wykorzystaniem konta komputera. Jest to bardzo istotne zabezpieczenie. Bez problemu można dodawać udziały plików i drukarek, tak jak w przypadku standardowego serwera Samba. Oto dyrektywy, które informują o tym, że Samba jest podstawowym kontrolerem domeny: domain master = yes os level = 64 preferred master = yes domain logons = yes

Dyrektywa passdb backend = tdbsam powoduje, że informacje o kontach użytkowników będą zapisywane w bazie danych tdbsam zamiast w domyślnym pliku smbpasswd. Zespół pracujący nad Sambą zaleca używanie bazy danych tdbsam zamiast smbpasswd, bowiem opcja ta będzie wycofywana z kolejnych wersji. Nie należy mylić bazy danych smbpasswd z poleceniem smbpasswd — polecenie smbpasswd służy do zarządzania kontami użytkowników zapisywanych w bazie danych tdbsam oraz innych obsługiwanych bazach danych. Każdy użytkownik, którego dodajemy do systemu za pomocą polecenia smbpasswd, musi mieć wcześniej konto systemowe na serwerze Samba. Jeśli w pliku /etc/passwd nie zdefiniowano tych kont, wyświetli się następujący komunikat o błędzie: Failed to initialise SAM_ACCOUNT for user foo Failed to modify password entry for user foo

Należy pamiętać, że w domenie może być tylko jeden podstawowy kontroler domeny (Primary Domain Controller — PDC). Jeśli spróbujemy utworzyć dwa podstawowe kontrolery w tej samej domenie, nic nie będzie działać prawidłowo. W domenie może być wiele serwerów Samby, ale tylko jeden PDC.

Patrz także • man 8 useradd • man 1 passwd • strona podręcznika man 5 smb.conf zawiera szczegółowe informacje i jest przystępnie

napisana — należy pamiętać, by mieć ją w pobliżu serwera Samba i szukać na niej informacji dotyczących szczegółów konfiguracji 340 |

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

• w recepturach 8.17, 8.18 i 8.19 z książki Carli Schroder Linux. Receptury (Helion, 2005) opisa-

no sposób automatyzacji operacji dodawania systemowych użytkowników Linuksa; należy pamiętać o możliwości skorzystania z doskonałych skryptów mass_useradd i mass_passwd • rozdział 23. „Udostępnianie plików i drukarek oraz uwierzytelnianie w domenach za po-

mocą Samby” w książce Carli Schroder Linux. Receptury (Helion, 2005)

• rozdział 4. „Domain Control” w podręczniku Official Samba-3 HOWTO and Reference Guide

(http://www.samba.org/samba/docs/man/Samba-HOWTO-Collection/)

11.5. Migracja do kontrolera PDC na bazie Samby z NT4 Problem Firma Microsoft zaprzestała rozwijania systemu Windows NT4 31 grudnia 2004 roku. Mamy jeden lub kilka kontrolerów domeny NT4 i zastanawiamy się, co z nimi zrobić. Czy warto je zatrzymać? Aktualizacja do systemu Windows 2003 z Active Directory nie tylko jest droga, ale wymaga edukacji użytkowników i prawdopodobnie oznacza również konieczność zakupu nowych komputerów. Czy warto szukać całkowicie nowego rozwiązania?

Rozwiązanie Warto poszukać czegoś zupełnie nowego — komputer z Linuksem i Sambą w wersji 3. jest w stanie doskonale zastąpić podstawowy kontroler domeny pracujący w systemie NT4. Użytkownicy nawet się nie zorientują, że nastąpiła zamiana (jedyną odczuwalną zmianą będzie lepsza wydajność). Wykonaj następujące czynności:

1. Najpierw wykonaj pewne czynności porządkowe — pozbądź się nieużywanych lub zdublowanych kont na kontrolerze domeny pracującym w systemie NT4.

2. Za pomocą narzędzia NT Server Manager utwórz konto dla zapasowego kontrolera domeny (Backup Domain Controller — BDC), którego rolę ma odgrywać komputer z Sambą.

3. Skonfiguruj Sambę. 4. Dołącz zapasowy kontroler domeny do domeny NT4. 5. Przeprowadź migrację kont użytkowników i komputerów. 6. Zamknij kontroler domeny NT4. 7. Wypromuj komputer z Sambą do roli podstawowego kontrolera domeny. Poniżej zamieszczono prosty plik konfiguracyjny /etc/samba/smb.conf przeznaczony specjalnie na potrzeby migracji z platformy NT4. Opcja workgroup określa nazwę istniejącej domeny — nie należy jej zmieniać! Nazwa netbios może być dowolna. Trzeba również pamiętać o konieczności używania rzeczywistego adresu IP serwera WINS: [global] workgroup = czerwonadomena netbios name = samba11 passdb backend = tdbsam security = user domain master = No

11.5. Migracja do kontrolera PDC na bazie Samby z NT4

|

341

domain logons = Yes os level = 33 add user script = /usr/sbin/useradd -m '%u' delete user script = /usr/sbin/userdel -r '%u' add group script = /usr/sbin/groupadd '%g' delete group script = /usr/sbin/groupdel '%g' add user to group script = /usr/sbin/usermod -G '%g' '%u' add machine script = /usr/sbin/useradd -s /bin/false -d /dev/null '%u' wins server = 192.168.1.30

Uruchamiamy polecenie testparm w celu sprawdzenia składni: $ testparm Load smb config files from /etc/samba/smb.conf Loaded services file OK. Server role: ROLE_DOMAIN_BDC Press enter to see a dump of your service definitions

Startujemy lub restartujemy Sambę, a następnie dołączamy ją do domeny, wykorzystując adres IP lub nazwę NetBIOS podstawowego kontrolera domeny pracującego w systemie NT4 oraz konto Administrator w systemie NT4 lub dowolne inne konto z uprawnieniami administratora: # net rpc join -S ntpdc -U Administrator%haslo Joined domain CZERWONADOMENA.

W tym momencie nadszedł czas na najbardziej interesującą część pracy — wykorzystanie narzędzia vampire w celu przekształcenia kont NT4 na Samba: # net rpc vampire -S ntpdc -W czerwonadomena -U Administrator%haslo Fetching CZERWONADOMENA database SAM_DELTA_CZERWONADOMENA_INFO not handled Creating unix group: 'Domain Admins' Creating unix group: 'Domain Users' Creating unix group: 'Domain Guests' Creating unix group: 'Web_team' Creating unix group: 'Sysadmins' ... Creating account: Administrator Creating account: Guest Creating account: NTSERVER$ Creating account: 'carla' Creating account: 'foober' ...

Sprawdzamy, czy konta użytkowników zostały przeniesione poprzez uruchomienie polecenia pbdedit w celu wyświetlenia listy kont poddanych migracji: # pdbedit -L powerpc-w2k$:1010:POWERPC-W2K$ stinkpad$:1012:STINKPAD$ alrac:1013: root:0:root foober5:1007: ...

Na koniec promujemy komputer z Sambą do roli podstawowego kontrolera domeny poprzez zmodyfikowanie pliku /etc/samba/smb.conf w taki sposób, aby przyjął postać zaprezentowaną w recepturze 11.4. Restartujemy Sambę. Od tego momentu użytkownicy powinni mieć możliwość logowania się do domeny bez żadnych problemów. Zamykamy stary kontroler domeny NT4. Dla komputera pełniącego tę funkcję możemy znaleźć nowe zadanie — na przykład skonfigurować Sambę i wykorzystać w roli serwera plików lub drukarek. 342 |

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

Dyskusja W przypadku zmiany nazwy domeny trzeba zacząć wszystko od początku. Między innymi trzeba ręcznie wprowadzić wszystkie konta użytkowników. Z tego powodu nie warto tego robić.

Patrz także • man 8 pdbedit • man 5 smb.conf • rozdział 8. „Zarządzanie użytkownikami i grupami” w książce Carli Schroder Linux. Recep-

tury (Helion, 2005)

• rozdział 23. „Udostępnianie plików i drukarek oraz uwierzytelnianie w domenach za po-

mocą Samby” w książce Carli Schroder Linux. Receptury (Helion, 2005)

11.6. Dołączanie komputera linuksowego do domeny Active Directory Problem Korzystamy z sieci Windows zarządzanej przez domenę Active Directory. Wiemy, że komputery linuksowe można podłączyć do sieci w taki sposób, aby stały się dostępne dla hostów Windowsa, ale chcemy, aby stały się one pełnoprawnymi członkami domeny Active Directory. Dzięki temu będzie można nimi zarządzać tak jak innymi obiektami AD. Użytkownicy będą mieli jednolitą nazwę logowania dla wszystkich hostów, a użytkownikami Linuksa będzie można zarządzać z poziomu domeny Active Directory. Serwer DNS działa bez zarzutu. W systemie jest też skonfigurowane centrum dystrybucji kluczy Kerberos (Kerberos Key Distribution Center — KDC).

Rozwiązanie Należy zainstalować pakiety Samba, Winbind oraz klienta Kerberos i wkompilować do Samby obsługę pakietów Kerberos, LDAP, Active Directory i Winbind. Listę potrzebnych komponentów zamieszczono w recepturze 11.1. Potrzebne są również konta dla użytkowników i komputerów linuksowych, które już są obecne w domenie Active Directory. Oto lista czynności do wykonania:

1. Upewnij się, że dla sieci LAN istnieje wiarygodny serwer NTP (Network Time Protocol) oraz że wszystkie hosty mają zsynchronizowane zegary.

2. Usuń wszystkie pliki .tdb, aby pozbyć się przestarzałych danych: /etc/samba/secrets.tdb (ten plik może być niedostępny) oraz plików z katalogu /var/lib/samba. Można zachować kopie zapasowe, choć najprawdopodobniej nie będą potrzebne.

3. Zatrzymaj demony Samba i Winbind. 11.6. Dołączanie komputera linuksowego do domeny Active Directory

| 343

4. Utwórz w systemie Linux grupę dla kont komputerów. 5. Skonfiguruj plik /etc/hosts. 6. Skonfiguruj plik /etc/resolv.conf. 7. Skonfiguruj Sambę. 8. Skonfiguruj NSS. 9. Skonfiguruj mechanizm PAM. 10. Zrestartuj wszystkie demony i przetestuj ich działanie. Po wykonaniu pierwszych dwóch kroków należy zatrzymać demony Samba i Winbind. W dystrybucji Fedora wykonaj następujące polecenia: # /etc/init.d/smb stop # /etc/init.d/winbind stop

W Debianie należy skorzystać z następujących poleceń: # /etc/init.d/samba stop # /etc/init.d/winbind stop

Następnie należy utworzyć w systemie Linux grupę dla kont zaufania komputerów: # groupadd machines

Następnie dodajemy ważne hosty do pliku /etc/hosts, który będzie pełnił funkcję rozwiązania awaryjnego: ## /etc/hosts 192.168.1.25 192.168.1.20

samba1.niebieskadomena.com windows1.niebieskadomena.com

samba1 windows1

Trzeba także sprawdzić, czy w pliku /etc/resolv.conf właściwie ustawiono serwer DNS: nameserver 192.168.1.21

W tym momencie możemy przetestować połączenie z KDC. Powinno się udać bez problemów: # kinit [email protected] Password for [email protected]:

Modyfikujemy plik /etc/samba/smb.conf w celu włączenia uwierzytelniania w domenie Active Directory. Podajemy własną nazwę domeny, nazwę NetBIOS, opis serwera oraz domenę Kerberos (ang. Kerberos realm). Oto kompletna zawartość przykładowego pliku: [global] workgroup = niebieskadomena netbios name = samba1 realm = NIEBIESKADOMENA.COM server string = Serwer Samby numer jeden security = ADS encrypt passwords = yes idmap uid = 10000-20000 idmap gid = 10000-20000 winbind use default domain = yes winbind enum users = Yes winbind enum groups = Yes winbind separator = + log file = /var/log/samba/log log level = 2 max log size = 50 hosts allow = 192.168.1.

344 |

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

[homes] comment = Katalogi domowe valid users = %S read only = No browseable = No

Teraz należy zmodyfikować plik /etc/nsswitch.conf, tak by znalazły się w nim następujące opcje: passwd: group: shadow:

files winbind files winbind files

Uruchamiamy usługi Samba i Winbind. Dołączamy linuksowy komputer PC do domeny Active Directory i konfigurujemy konto zaufania komputera, wykorzystując konto Administrator na serwerze AD lub dowolne inne konto z uprawnieniami administratora: # net ads join -U Administrator%haslo Using short domain name -- NIEBIESKADOMENA Joined 'SAMBA1' to realm 'NIEBIESKADOMENA.COM.'

W tym momencie na liście obiektów Active Directory w folderze Komputery apletu Użytkownicy i komputery powinno się znaleźć nowe konto komputera z nazwą NetBIOS maszyny linuksowej (samba1). Na koniec należy skonfigurować dołączalne moduły uwierzytelniania (Pluggable Authentication Modules — PAM), które pozwalają na uwierzytelnianie za pośrednictwem Winbind. Najpierw należy utworzyć kopię zapasową: # cp /etc/pam.d/login /etc/pam.d/login-old

Modyfikujemy plik /etc/pam.d/login w celu uwzględnienia modułów Winbind oraz modułu pam_mkhomedir.so: auth auth auth auth auth

requisite requisite required sufficient required

pam_securetty.so pam_nologin.so pam_env.so pam_winbind.so pam_unix.so nullok use_first_pass

account account account

requisite pam_time.so sufficient pam_winbind.so required pam_unix.so

session session session session session

required optional optional optional required

pam_unix.so pam_lastlog.so pam_motd.so pam_mail.so standard noenv pam_mkhomedir.so skel=/etc/skel umask=0027

Faktyczna zawartość pliku /etc/pam.d/login może się znacznie różnić od tej, którą pokazano w tym miejscu. Więcej informacji na ten temat oraz przykłady konfiguracji można znaleźć w punkcie „Dyskusja”. Teraz można wszystko przetestować. Uruchamiamy ponownie komputer linuksowy i próbujemy się logować do domeny. Jeśli wszystko działa poprawnie, to na tym koniec.

Dyskusja Pozornie może się wydawać, że to dużo pracy, ale nie wolno dać się zwieść — złożoność wynika ze struktury systemu Windows, która utrudnia współpracę z innymi platformami. Na szczęście bohaterscy programiści Linuksa — na przykład członkowie zespołu pracującego nad

11.6. Dołączanie komputera linuksowego do domeny Active Directory

| 345

Sambą — stworzyli odpowiednie mechanizmy współpracy i dzięki nim tworzenie sieci mieszanych stało się możliwe. Dyrektywa pam_mkhomedir.so tworzy katalogi domowe użytkowników „w locie”, podczas ich pierwszego logowania. W bardziej złożonej sieci można określić wybraną domenę Kerberos, do której chcemy dołączyć: # kinit [email protected] # net ads join "Komputery\WydzTech\StacjeRobocze" \ -U Administrator%haslo

Ponieważ konta użytkowników są zarządzane na serwerze Active Directory i są udostępnione dla Linuksa za pośrednictwem mechanizmów Winbind i PAM, nie ma potrzeby tworzenia zdublowanych kont użytkowników na linuksowym komputerze PC. Można jednak bez przeszkód tworzyć lokalne konta na maszynie linuksowej. Są one niewidoczne dla domeny Active Directory i pozwalają użytkownikom z uprawnieniami administratora na swobodny dostęp do serwera — w trybie lokalnym lub zdalnie za pośrednictwem SSH. Konieczne jest również przynajmniej jedno lokalne konto root — nie należy polegać we wszystkim na zdalnym serwerze logowania, ponieważ w niektórych sytuacjach może to doprowadzić do zablokowania możliwości korzystania ze stacji roboczej. W wielu dokumentach można spotkać porady dotyczące modyfikacji pliku /etc/krb5.conf w celu wskazania serwera KDC. Nie jest to konieczne, jeśli domena Active Directory i serwer DNS firmy Microsoft są poprawnie skonfigurowane, ponieważ usługa AD automatycznie tworzy rekordy SRV w strefie DNS kerberos._tcp.NAZWA.DOMENY dla każdego centrum KDC w domenie Kerberos. Zarówno w implementacji MIT, jak i Heimdal Kerberos rekordy SRV są wyszukiwane automatycznie, dzięki czemu mogą one znaleźć wszystkie dostępne centra KDC. W pliku /etc/krb5.conf można określić tylko pojedyncze centrum KDC. Nie ma możliwości automatycznego wyboru pierwszego dostępnego centrum KDC. W przypadku wykorzystywania serwera DNS firmy Microsoft te rekordy DNS trzeba wprowadzić ręcznie. Jeśli z jakiegokolwiek powodu Kerberos nie będzie mógł znaleźć centrów KDC za pośrednictwem DNS, można skorzystać z poniższego przykładowego pliku konfiguracyjnego /etc/krb5.conf, który sprawdza się dla większości konfiguracji. Trzeba oczywiście pamiętać o wprowadzeniu własnych nazw domen: [libdefaults] default_realm = NIEBIESKADOMENA.COM [realms] NIEBIESKADOMENA.COM = { kdc = windows1.niebieskadomena.com } [domain_realms] .carla.com = NIEBIESKADOMENA.COM

Po usunięciu błędów w konfiguracji Samby i jej uruchomieniu wystarczy powielić ją dla dowolnego hosta linuksowego, który ma się stać członkiem domeny Active Directory.

Patrz także • man 5 smb.conf

346 |

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

11.7. Podłączanie komputerów z systemami Windows 95/98/ME do domeny zarządzanej przez Sambę Problem Skonfigurowaliśmy nowy podstawowy kontroler domeny (PDC) na bazie Samby zgodnie z recepturą 11.4. Wcześniej nie mieliśmy w sieci kontrolera domeny, zatem klienty nie są skonfigurowane do logowanie się do domeny. W jaki sposób można się zalogować z poziomu klienta Windows 95/98/ME?

Rozwiązanie Najpierw trzeba sprawdzić, czy prawidłowo skonfigurowano sieć Windows: musi być zainstalowany protokół TCP/IP oraz Klient sieci Microsoft Networks. Można to sprawdzić za pomocą apletu Sieć w Panelu sterowania. Następnie należy wybrać polecenie Panel sterowania/Sieć/Klient sieci Microsoft Networks/Właściwości. Zaznacz opcję Zaloguj się do domeny NT. Wprowadź nazwę domeny. Zaznacz opcję Zaloguj i odtwórz połączenia sieci. Kliknij OK. System może poprosić o płytę instalacyjną systemu Windows. Następnie należy zrestartować system, aby uaktywnić wprowadzone zmiany. Po ponownym uruchomieniu systemu można się zalogować do domeny. Wyświetli się ekran logowania z nazwą domeny. Aby uruchomić system Windows bez logowania się do domeny, należy kliknąć przycisk Anuluj.

Dyskusja Pomimo tego, że w systemach Windows 95/98/ME można skonfigurować konta dla wielu użytkowników, w rzeczywistości w systemach tych nie ma rozdziału zasobów pomiędzy użytkownikami ani właściwych zabezpieczeń. Każdy użytkownik ma dostęp do plików wszystkich pozostałych użytkowników. Wszystkie aplikacje są skonfigurowane globalnie, a jedynymi własnościami unikatowymi dla użytkownika są dekoracje pulpitu.

Patrz także • w recepturze 23.4 „Włączanie udostępniania plików w komputerach Windows” w książce

Carli Schroder Linux. Receptury (Helion, 2005) można znaleźć więcej informacji na temat konfigurowania sieci Windows • rozdział 3. „Configuring Windows Clients” z książki Jaya Ts, Roberta Ecksteina, Davida

Colliera-Browna Using Samba (O’Reilly, 2007)

11.7. Podłączanie komputerów z systemami Windows 95/98/ME do domeny zarządzanej przez Sambę

|

347

11.8. Podłączanie komputerów z systemem Windows NT4 do domeny zarządzanej przez Sambę Problem Skonfigurowaliśmy nowy podstawowy kontroler domeny (PDC) na bazie Samby zgodnie z recepturą 11.4. Wcześniej nie mieliśmy w sieci kontrolera domeny, zatem klienty nie są skonfigurowane do logowania się do domeny. W jaki sposób można się zalogować do domeny z klienta pracującego w systemie Windows NT4?

Rozwiązanie Najpierw trzeba sprawdzić, czy prawidłowo skonfigurowano sieć Windows: musi być zainstalowany protokół TCP/IP oraz komponent Klient sieci Microsoft Networks. Trzeba również zdefiniować odpowiednie ustawienia sieci. Można je znaleźć z menu Start/Ustawienia sieci oraz Połączenia Dial-up. Następnie należy wejść do menu Panel sterowania/Sieć/Identyfikacja/Zmień. Kilknąć przycisk Domena i wprowadzić nazwę domeny. Musi to być nazwa zgodna z nazwą grupy roboczej zdefiniowanej w pliku smb.conf. Po wprowadzeniu tych modyfikacji należy ponownie uruchomić system i można się zalogować do domeny.

Dyskusja Aby zainicjować operację logowania, należy wcisnąć kombinację klawiszy Ctrl+Alt+Del. Należy zwrócić uwagę na to, że można się zalogować do domeny albo — bez logowania się do domeny — do komputera lokalnego. W celu skorzystania z tej drugiej możliwości należy kliknąć przycisk Opcje, co spowoduje wyświetlenie menu w postaci rozwijanej listy opcji logowania.

Patrz także • w recepturze 23.4 „Włączanie udostępniania plików w komputerach Windows” w książce

Carli Schroder Linux. Receptury (Helion, 2005) można znaleźć więcej informacji na temat konfigurowania sieci Windows • rozdział 3. „Configuring Windows Clients” z książki Jaya Ts, Roberta Ecksteina, Davida

Colliera-Browna Using Samba (O’Reilly, 2007)

348 |

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

11.9. Podłączanie komputerów z systemem Windows NT/2000 do domeny zarządzanej przez Sambę Problem Skonfigurowaliśmy nowy podstawowy kontroler domeny (PDC) na bazie Samby zgodnie z recepturą 11.4. Wcześniej nie mieliśmy w sieci kontrolera domeny, zatem klienty nie są skonfigurowane do logowania się do domeny. W jaki sposób można się zalogować do domeny z klienta pracującego w systemie Windows 2000?

Rozwiązanie Najpierw trzeba sprawdzić, czy prawidłowo skonfigurowano sieć Windows: musi być zainstalowany protokół TCP/IP oraz komponent Klient sieci Microsoft Networks. Trzeba również zdefiniować odpowiednie ustawienia sieci. Można je znaleźć z menu Start/Ustawienia sieci oraz Połączenia Dial-up. Następnie należy kliknąć prawym przyciskiem myszy ikonę Mój komputer, kliknąć Właściwości, wybrać zakładkę Identyfikacja sieci, a następnie kliknąć przycisk Identyfikator sieci. Spowoduje to uruchomienie Kreatora identyfikacji sieciowej, który przeprowadzi użytkownika przez konieczne czynności instalacyjne.

Dyskusja Aby zainicjować operację logowania, należy wcisnąć kombinację klawiszy Ctrl+Alt+Del. Należy zwrócić uwagę na to, że można się zalogować do domeny albo — bez logowania się do domeny — do komputera lokalnego. W celu skorzystania z tej drugiej możliwości należy kliknąć przycisk Opcje, co spowoduje wyświetlenie menu w postaci rozwijanej listy opcji logowania.

Patrz także • w recepturze 23.4 „Włączanie udostępniania plików w komputerach Windows” w książce

Carli Schroder Linux. Receptury (Helion, 2005) można znaleźć więcej informacji na temat konfigurowania sieci Windows • rozdział 3. „Configuring Windows Clients” z książki Jaya Ts, Roberta Ecksteina, Davida

Colliera-Browna Using Samba (O’Reilly, 2007)

11.9. Podłączanie komputerów z systemem Windows NT/2000 do domeny zarządzanej przez Sambę

| 349

11.10. Podłączanie komputerów z systemem Windows XP do domeny zarządzanej przez Sambę Problem Skonfigurowaliśmy nowy podstawowy kontroler domeny (PDC) na bazie Samby zgodnie z recepturą 11.4. Wcześniej nie mieliśmy w sieci kontrolera domeny, zatem klienty nie są skonfigurowane do logowania się do domeny. W jaki sposób można zalogować się do domeny z klienta pracującego w systemie Windows XP?

Rozwiązanie Najpierw trzeba sprawdzić, czy prawidłowo skonfigurowano sieć Windows: musi być zainstalowany protokół TCP/IP oraz komponent Klient sieci Microsoft Networks. Trzeba również zdefiniować odpowiednie ustawienia sieci. Można je znaleźć w menu Start/Ustawienia sieci/ Połączenia sieciowe. Następnie należy kliknąć prawym przyciskiem myszy ikonę Mój komputer, kliknąć Właściwości, wybrać zakładkę Nazwa komputera, a następnie kliknąć przycisk Identyfikator sieciowy. Spowoduje to uruchomienie Kreatora identyfikacji sieciowej, który przeprowadzi użytkownika przez konieczne czynności instalacyjne.

Dyskusja Aby zainicjować operację logowania, należy wcisnąć kombinację klawiszy Ctrl+Alt+Del. Należy zwrócić uwagę na to, że można się zalogować do domeny albo — bez logowania się do domeny — do komputera lokalnego. W celu skorzystania z tej drugiej mozliwości należy kliknąć przycisk Opcje, co spowoduje wyświetlenie menu w postaci rozwijanej listy opcji logowania.

Patrz także • w recepturze 23.4 „Włączanie udostępniania plików w komputerach Windows” w książce

Carli Schroder Linux. Receptury (Helion, 2005) można znaleźć więcej informacji na temat konfigurowania sieci Windows • rozdział 3. „Configuring Windows Clients” z książki Jaya Ts, Roberta Ecksteina, Davida

Colliera-Browna Using Samba (O’Reilly, 2007)

350

|

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

11.11. Podłączanie klientów linuksowych do domeny zarządzanej przez Sambę z wykorzystaniem programów wiersza poleceń 11.11. Podłączanie klientów linuksowych do domeny z wykorzystaniem programów wiersza poleceń

Problem Nasz nowiutki i błyszczący kontroler domeny zarządzany przez Sambę jest sprawny i gotowy do działania. Klienty windowsowe z powodzeniem mogą się logować i znajdują dostępne udziały tak jak powinny. W jaki sposób, posługując się narzędziami wiersza poleceń, dołączyć komputery linuksowe?

Rozwiązanie Poniższe narzędzia wiersza poleceń służą do przeglądania, logowania się i montowania udziałów Samby: smbtree

Służy do przeglądania sieci. Wyświetla wszystkie domeny, serwery i udziały w postaci struktury drzewa. Plik ten należy do zestawu narzędzi pakietu Samba.

smbclient

Narzędzie do przeglądania sieci i menedżer plików. Polecenie smbclient wyświetla domeny, serwery i udziały oraz wykorzystuje polecenia typu FTP do przesyłania plików. Nie ma potrzeby montowania udziałów w celu uzyskania dostępu do plików. Program ten również należy do zestawu narzędzi pakietu Samba. smbmount/smbumount

Polecenia służące do montowania i odmontowywania udziałów Samby. Należą do pakietu smbfs.

Dyskusja W Linuksie domeny nie są widoczne w taki sam sposób jak w Windowsie, czemu nie należy się dziwić, ponieważ struktura domen to konwencja systemu Windows. Linux widzi systemy plików i albo ma do nich uprawnienia dostępu, albo ich nie ma. W odróżnieniu od Windowsa, gdzie można się zalogować do domeny lub lokalnie, ale nie można się zalogować jednocześnie na dwa sposoby, użytkownicy Linuksa najpierw logują się do swoich lokalnych systemów plików w standardowy sposób, a następnie mogą się zalogować do udziałów domeny. Dla udziałów domeny, podobnie jak dla innych systemów plików, można skonfigurować w pliku /etc/fstab opcję automatycznego montowania. Aby wyświetlić wszystkie domeny, serwery i udziały w sieci, można skorzystać z polecenia smbtree z opcją -N (bez hasła). W wyniku polecenia będą pominięte te udziały, których przeglądanie jest niedozwolone.

11.11. Podłączanie klientów linuksowych do domeny z wykorzystaniem programów wiersza poleceń

|

351

$ smbtree -N CZERWONADOMENA \\STINKPAD \\SAMBA11 \\SAMBA11\HP6L \\SAMBA11\ADMIN$ \\SAMBA11\IPC$ \\SAMBA11\share1

thinkpad r32 PDC Samba HP6L - monochromatyczna drukarka laserowa Usługa IPC (PDC Samba) Usługa IPC (PDC Samba) pliki testowe

Można również przeglądać udziały według nazwy hosta, adresu IP lub nazwy NetBIOS. W tym przykładzie windbag to nazwa hosta, a samba11 jest nazwą NetBIOS określoną w pliku smb.conf: $ smbtree -N windbag $ smbtree -N samba11

Nie można jednak do tego celu wykorzystać nazwy domeny, ponieważ nazwy domen są nierozwiązywalne. Podając nazwę użytkownika i hasło, można wyświetlić udziały, które są dla nas dostępne, ale nie została włączona możliwość ich przeglądania: $ smbtree -U foober Password: CZERWONADOMENA \\STINKPAD \\STINKPAD\C$ \\STINKPAD\ADMIN$ \\STINKPAD\F$ \\STINKPAD\print$ \\STINKPAD\SharedDocs \\STINKPAD\IPC$ \\SAMBA11 \\SAMBA11\foober \\SAMBA11\HP6L \\SAMBA11\ADMIN$ \\SAMBA11\IPC$ \\SAMBA11\share1

thinkpad r32 Domyślny udział Zdalny administrator Domyślny udział Sterowniki drukarek Zdalny IPC PDC Samba Katalogi domowe HP6L Usługa IPC (PDC Samba) Usługa IPC (PDC Samba) pliki testowe

Kiedy udział, który nas interesuje, jest widoczny, można go zamontować w systemie za pomocą polecenia smbmount, wykorzystując katalog stworzony do tego celu. Należy pamiętać o ukośnikach stosowanych w lokalnym systemie. W poniższym przykładzie użytkownik foober montuje swój katalog domowy Samby w lokalnym katalogu samba: $ mkdir samba $ smbmount //samba11/foober samba password:

Polecenie smbumount umożliwia odmontowanie udziału: $ smbumount samba

Za pomocą polecenia smbclient można uzyskać dostęp do udziałów plikowych bez konieczności ich montowania. Polecenie smbclient do transferu plików wykorzystuje polecenia w stylu FTP. Poniżej zaprezentowano polecenie umożliwiające przeglądanie sieci. Należy w nim podać nazwę hosta lub nazwę NetBIOS. W tym przypadku zastosowano nazwę hosta: $ smbclient -N -L windbag Anonymous login successful Domain=[CZERWONADOMENA] OS=[Unix] Server=[Samba 3.0.10-Debian] Sharename --------share1 IPC$

352

|

Type ---Disk IPC

Comment ------pliki testowe Usługa IPC (PDC Samba)

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

ADMIN$ IPC Usługa IPC (PDC Samba) HP6L Drukarka HP6L Anonymous login successful Domain=[CZERWONADOMENA] OS=[Unix] Server=[Samba 3.0.10-Debian] Server --------SAMBA11

Comment ------PDC Samba

Workgroup --------CZERWONADOMENA

Master ------SAMBA11

Katalog domowy można znaleźć dzięki przeglądaniu z użyciem nazwy logowania: $ smbclient -L samba11 -U carla Password: Domain=[CZERWONADOMENA] OS=[Unix] Server=[Samba 3.0.10-Debian] Sharename --------share1 IPC$ ADMIN$ HP6L carla

Type ---Disk IPC IPC Drukarka Disk

Comment ------pliki testowe Usługa IPC (PDC Samba) Usługa IPC (PDC Samba) HP6L Katalogi domowe

...

Aby nawiązać połączenie z własnym katalogiem domowym, można skorzystać z poniższego polecenia: $ smbclient -U carla //samba11/carla Password: Domain=[CZERWONADOMENA] OS=[Unix] Server=[Samba 3.0.10-Debian] smb: \>

Wpisanie polecenia ? w wierszu poleceń smb:\> spowoduje wyświetlenie listy poleceń: smb: \> ? ? case_sensitive dir help ...

altname cd du history

archive chmod exit lcd

blocksize chown get link

cancel del hardlink lowercase

Widzicie? Stare, znajome polecenia Linuksa. Poniższe polecenie wyświetla listę plików, a następnie przesyła katalog foo z serwera do lokalnego katalogu roboczego i zmienia jego nazwę na foo-kopia: smb: \> ls smb: \> get foo foo-kopia getting file \foo of size 2131 as foo-kopia (1040.5 kb/s) (average 1040.5 kb/s) smb: \>

W celu zapisania plików w obrębie udziałów Samby można skorzystać ze znajomego polecenia put: smb: \> put foo-kopia putting file foo-kopia as \foo-kopia (0.0 kb/s) (average 0.0 kb/s)

Aby zamknąć połączenie z udziałem, można skorzystać z następującego polecenia: smb: \> quit

Polecenia smbmount i smbumount wywołują polecenie smbmnt. W przypadku problemów z uprawnieniami, na przykład sygnalizowanymi komunikatem o błędzie smbmnt must be installed suid

11.11. Podłączanie klientów linuksowych do domeny z wykorzystaniem programów wiersza poleceń

|

353

root for direct user mounts, należy ustawić bit SUID dla polecenia smbmnt za pomocą polecenia chmod: # chmod +s /usr/bin/smbmnt

Osoby, które obawiają się ustawiania bitu SUID, mogą skonfigurować polecenie sudo dla uprawnionych użytkowników smbmnt.

Patrz także • z rozdziału 8. „Zarządzanie użytkownikami i grupami” z książki Carli Schroder Linux. Re-

ceptury (Helion, 2005) można się dowiedzieć, w jaki sposób konfiguruje się program sudo • man 8 smbmount • man 8 smbumount • man 1 smbtree • man 1 smbclient

11.12. Podłączanie klientów linuksowych do domeny zarządzanej przez Sambę z wykorzystaniem programów graficznych 11.12. Podłączanie klientów linuksowych do domeny z wykorzystaniem programów graficznych

Problem Do nawiązywania połączenia z udziałami Samby użytkownicy wolą używać estetycznego, graficznego interfejsu. Chcemy się dowiedzieć, jakie narzędzia są dostępne dla środowisk Gnome i KDE oraz czy istnieją samodzielne programy do wykorzystania w dowolnym środowisku X Window.

Rozwiązanie Oto lista czterech najlepszych narzędzi graficznych służących do przeglądania sieci i nawiązywania połączeń z udziałami Samby: • menedżer plików Konqueror w środowisku KDE; • menedżer plików Nautilus w środowisku Gnome; • Smb4k — interesujący dodatek do menedżera Konqueror; • LinNeighborhood — samodzielny program działający w dowolnym środowisku X Window.

Dyskusja Każdy program ma swoją specyfikę. Przyjrzyjmy się, w jaki sposób korzystać z każdego z nich:

Konqueror Aby przeglądać sieć, należy wpisać smb:/ w pasku Location.

354 |

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

Aby przeglądać określone hosty, należy wpisać smb://[nazwa_netbios lub nazwa_hosta]. Dokumenty można otwierać i modyfikować bezpośrednio, a następnie zapisywać do udziału.

Nautilus Aby przeglądać sieć, należy wpisać smb: na pasku Location. Aby bezpośrednio przejść do udziału, należy wpisać smb://nazwa_serwera/nazwa_udziału, na przykład smb://samba11/carla. Nautilus umożliwia jedynie przeglądanie. Nie pozwala na montowanie udziałów ani na bezpośrednią modyfikację plików. Aby wprowadzić zmiany w pliku, należy go otworzyć, zapisać na dysku lokalnym, zmodyfikować, a następnie przeciągnąć kopię z powrotem do udziału Samby.

Smb4k Smb4k jest najłatwiejszy w obsłudze i ma najlepszy zestaw własności. Po uruchomieniu automatycznie skanuje sieć i wyświetla wszystkie udziały oraz pokazuje dostępne miejsce w obrębie udziałów w ciekawym, graficznym formacie. Kliknięcie udziału powoduje jego automatyczne zamontowanie w katalogu /home/smb4k/. Własność tę, podobnie jak wiele innych przydatnych funkcji, można dostosować do własnych potrzeb. Na przykład można ustawić automatyczne logowanie, wybór określonego serwera w celu odczytania listy przeglądania. Można też skonfigurować listę hostów i udziałów wykorzystujących różne nazwy logowania.

LinNeighborhood LinNeighborhood to interesujący samodzielny program do przeglądania sieci LAN, który może działać w dowolnym linuksowym środowisku graficznym. Program LinNeighborhood zwykle wymaga pewnych zabiegów konfiguracyjnych. Należy wybrać polecenie Edit/Preferences. Następnie, w obrębie zakładki Scan, należy wprowadzić nazwę hosta lub nazwę NetBIOS głównego serwera przeglądania (ang. master browser). W niniejszym rozdziale rolę tę odgrywają hosty windbag lub samba11. Inicjujemy nową operację skanowania sieci za pomocą polecenia Options/Browse Entire Network. W zakładce Miscellaneous można wprowadzić domyślną nazwę użytkownika i wybrać domyślny katalog montowania. Powinien to być plik, który został wcześniej utworzony w katalogu domowym, na przykład /home/carla/samba. W zakładce Post Mount należy skonfigurować domyślny menedżer plików. Należy pamiętać o wciśnięciu przycisku Save na każdej z zakładek. Po zamknięciu menu Preferences należy kliknąć Edit/Save Preferences. Aby wyświetlić menu pozwalające na zalogowanie się z uprawnieniami różnych użytkowników dla różnych udziałów, wystarczy kliknąć udział, do którego chcemy się zalogować.

Patrz także • rozdział 8. „Zarządzanie użytkownikami i grupami” z książki Carli Schroder Linux. Recep-

tury (Helion, 2005) • Smb4K — przeglądarka udziałów SMB dla środowiska KDE: http://smb4k.berlios.de/

11.12. Podłączanie klientów linuksowych do domeny z wykorzystaniem programów graficznych

|

355

• LinNeighborhood: http://www.bnro.de/~schmidjo/ • Konqueror: http://www.konqueror.org/ • Nautilus: http://www.gnome.org/projects/nautilus/

356

|

Rozdział 11. Pojedyncze logowanie z wykorzystaniem Samby w mieszanych sieciach Linux-Windows

ROZDZIAŁ 12.

Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

12.0. Wprowadzenie Uważam, że umiejętność administracji katalogiem LDAP (Lightweight Directory Access Protocol) stała się jedną z kluczowych umiejętności administratorów sieci. Katalog LDAP jest kluczem do prostych rozwiązań w sieci. To uniwersalny katalog zawierający wszystkie platformy i aplikacje, obsługujący uproszczone uwierzytelnianie sieciowe oraz scentralizowany magazyn danych przedsiębiorstwa. Protokół LDAP jest międzyplatformowy, przystosowany do pracy w sieci i bazuje na standardach. Istnieje bardzo wiele implementacji LDAP. W tym rozdziale wykorzystamy doskonałe darmowe oprogramowanie OpenLDAP. Protokół LDAP jest powszechnie obsługiwany przez aplikacje. Na przykład w klienty LDAP jest wyposażonych większość klientów pocztowych. Ponadto z serwerem LDAP mogą się komunikować różne bazy danych, systemy zarządzania zawartością (Content Management Systems — CMS), serwery groupware i komunikatorów, serwer uwierzytelniania, aplikacje zarządzania klientami oraz serwery aplikacji. Niektórzy spierają się na temat tego, czy LDAP jest bazą danych. Ściśle rzecz biorąc, to jest protokół, a nie baza danych. LDAP korzysta z bazy danych specjalnego typu, zoptymalizowanej pod kątem bardzo szybkich operacji odczytu. Można z niego korzystać do zapisywania stosunkowo statycznych informacji, takich jak katalogi firmowe, dane użytkowników, dane klientów, hasła, klucze zabezpieczeń, a także do śledzenia zasobów. Program OpenLDAP wykorzystuje bazę danych Sleepycat Berkeley DB. Dlaczego nie jest wykorzystywana standardowa relacyjna baza danych, taka jak PostgreSQL, Oracle czy MySQL? Można korzystać z tego typu baz danych, ale w takim przypadku traci się następujące zalety protokołu LDAP: • bardzo szybki odczyt danych; • uniwersalne typy danych; • niemal uniwersalna obsługa aplikacji; • szczegółowa kontrola nad dostępem do danych; 357

• rozproszona pamięć masowa i replikacja; • brak zapotrzebowania na elitarnych administratorów baz danych; • brak konieczności stosowania niestandardowego interfejsu API.

System OpenLDAP nie nadaje się do stosowania na przykład w roli warstwy backend dla sklepu internetowego lub witryny WWW ani żadnej aplikacji wymagającej szybkich i częstych modyfikacji. W tych zastosowaniach lepiej sprawdzają się systemy zarządzania relacyjnymi bazami danych (Relational Database Management System — RDBMS). Struktura bazy danych Sleepycat BDB różni się od relacyjnej bazy danych. Informacje nie są zapisane w kolumnach i wierszach oraz nie stosuje się w niej obszernego zbioru indeksów i pól. Zamiast tego dane są przechowywane w postaci par atrybut-typ/atrybut-wartość. Taka struktura zapewnia niezwykłą elastyczność projektowania rekordów. Na przykład można dodać nowe typy danych do rekordu określonego użytkownika bez konieczności ponownego projektowania całej bazy danych. Baza danych umożliwia zapis danych tekstowych lub binarnych dowolnego typu. Ponieważ baza danych ma prostą strukturę przypominającą dużą kartotekę, dodawanie nowych zapisów jest bardzo łatwe. Program OpenLDAP obsługuje architekturę rozproszoną, replikację i szyfrowanie.

Struktura katalogów LDAP Spróbujmy pokrótce omówić podstawowe pojęcia i strukturę katalogu LDAP. Jest to ważniejsze od posiadania encyklopedycznej wiedzy na temat opcji konfiguracji, ponieważ jeśli nie ma się czytelnego obrazu tego, jakie komponenty są potrzebne i jaką odgrywają rolę w całości, LDAP pozostanie tajemniczym zlepkiem chaotycznych informacji. W rzeczywistości jednak LDAP nie jest tak bardzo tajemniczy, jakby się mogło wydawać. Kiedy poznamy podstawy, będziemy w doskonałej sytuacji. Tak jak zwykle mawiają trenerzy: najpierw trzeba się nauczyć podstaw. Katalog LDAP można zobrazować w postaci standardowej struktury drzewiastej góra-dół, gdzie korzeń znajduje się na górze, a gałęzie prowadzą ku dołowi. Na rysunku 12.1 zaprezentowano hierarchiczną przestrzeń nazw. Nazywa się ją również drzewem informacji o katalogach (Directory Information Tree — DIT). Korzeniem w tym przykładzie jest pozycja zawierająca dane kraju (c=pl). Następny węzeł to zapis dla województwa (s=pom). Dalej są jednostki organizacyjne (Organizational Units — OU). Pierwsza zawiera nazwę firmy. Jednostka ta rozdziela się na wiele gałęzi, które również są określane jako jednostki organizacyjne. Lewa gałąź kończy się na identyfikatorze użytkownika (User ID — UID). W jednostce organizacyjnej Kontrola Jakości (KJ) może pracować znacznie więcej pracowników niż jeden — tak jak pokazano w przykładzie. Teraz bardzo ważna informacja: Janowi Kowalskiemu odpowiada nazwa wyróżniająca (ang. distinguished name — DN), która składa się ze względnej nazwy wyróżniającej (Relative Distinguished Name — RDN) — w tym przykładzie jest to identyfikator UID wraz ze wszystkimi wpisami nadrzędnymi: uid=jankowalski, ou=kj, ou=firma krzak, ou=pom, c=pl. Rolę nazwy RDN może odgrywać dowolny atrybut. Musi on być unikatowy w obrębie poziomu, do którego należy wpis. Identyfikator UID zazwyczaj jest unikatowy. Zwykle do tego celu wykorzystuje się nazwę logowania użytkownika, choć równie dobrze można wykorzystać dowolny inny atrybut. Oczywiście trzeba zastosować zasady zdroworozsądkowe. Na przykład istnieje wiele osób o tym samym nazwisku, zatem wykorzystanie atrybutu SN (surname) mogłoby sprawić problemy. Najczęściej rolę nazwy RDN w odniesieniu do osób pełni identyfikator UID lub pole Common Name (CN). 358

|

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

Rysunek 12.1. Przykład hierarchicznej struktury LDAP

Podstawową jednostką katalogu jest wpis (ang. entry). Wpis określa się również nazwą rekord lub obiekt katalogu. Wpis dotyczący Jana Kowalskiego zawiera wiele atrybutów takich jak nazwisko, numer telefonu, adres e-mail itp. Atrybutów nie można sobie dowolnie wymyślać. Muszą być one zdefiniowane w systemie OpenLDAP. Łatwym sposobem przeglądania dostępnych atrybutów jest skorzystanie z klienta LDAP GQ (http://sourceforge.net/projects/gqclient/). Można je również zobaczyć w plikach /etc/ldap/schema (w dystrybucji Fedora, /etc/openldap/ schema) zawierających definicje klas objectClass. Użytkownik może tworzyć własne definicje objectClass oraz typy atrybutów. Osobiście tego nie zalecam, chyba że koniecznie potrzebujemy atrybutu, który standardowo jest niedostępny. Domyślny schemat jest bardzo obszerny. Dołożono wszelkich starań, aby był uniwersalny. W związku z tym nie ma potrzeby „wynajdywania koła” na nowo. Z drugiej strony (zawsze jest przecież jakaś druga strona) dzięki możliwości tworzenia własnego schematu program OpenLDAP jest elastyczny i rozszerzalny, a własny schemat można łatwo współdzielić z innymi. Każdy atrybut składa się z typu oraz wartości. Atrybuty mogą mieć wiele wartości. Na przykład wpis dla Jana Kowalskiego może mieć następującą postać: uid=jankowalski cn=Jan Kowalski gn=Jan sn=Kowalski telephoneNumber=123-456-7890 telephoneNumber=123-456-7891 [email protected]

12.0. Wprowadzenie

|

359

Jak widać, atrybuty mogą być zdublowane. Można wykorzystać tyle atrybutów, ile się chce. Powszechnym zastosowaniem zdublowanych atrybutów jest zdefiniowanie różnych zapisów nazwiska, na przykład: cn=Jan Kowalski cn=J. Kowalski cn=Jan "smok" Kowalski cn=Smok

W efekcie sukces przyniesie wyszukiwanie według dowolnego spośród podanych atrybutów, zatem Jan Kowalski nigdzie się nie ukryje. Na szczycie hierarchii LDAP znajduje się przyrostek, czyli inaczej kontekst nazwy. W naszym przykładzie przyrostek ma postać c=pl. Standardowo stosowanym podejściem jest wykorzystanie nazwy domeny firmy, na przykład dc=krzak, dc=net. Atrybut DC to skrót od domain component (komponent domeny).

Schematy, klasy obiektów i atrybuty Kiedy stworzymy wpis w drzewie DIT, jego dane będą zapisane wewnątrz atrybutów. Atrybuty należą do klas obiektów (objectClass). Schemat można porównać do torby wypełnionej zorganizowanymi klasami obiektów. Jeśli zatem usłyszymy, że ktoś mówi o schematach OpenLDAP, będziemy wiedzieli, że ma na myśli pliki, które definiują organizację i typy danych wchodzące w skład katalogu OpenLDAP. W systemie OpenLDAP niektóre schematy są zakodowane „na sztywno” w obrębie demona slapd. Klasa obiektów objectClass jest częścią hierarchii klas. Klasa dziedziczy wszystkie właściwości swoich klas nadrzędnych. Na przykład często wykorzystywaną klasą objectClass jest inetOrgPerson. W pliku /etc/ldap/schema/inetorgperson.schema można znaleźć następującą definicję: objectclass ( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL

Z powyższego fragmentu wynika, że długi numer klasy objectClass to oficjalny identyfikator obiektu (Object ID — OID) number. Wszystkie identyfikatory OID usługi LDAP są globalne i unikatowe. Nie można ich sobie po prostu wymyślić. Ma to znaczenie tylko wtedy, gdy tworzymy własny schemat i potrzebujemy nowych identyfikatorów OID. Trzeba wówczas znaleźć organ rejestracyjny i poprosić o przypisanie kilku indentyfikatorów OID. Jednym z takich organów jest organizacja IANA (Internet Assigned Numbers Authority). Wiersz SUP (superior — nadrzędny) organizationalPerson oznacza, że nadrzędną klasą objectClass jest organizationalPerson, która jest potomkiem klasy obiektów najwyższego poziomu — person. Klasa obiektów definiuje wymagane i opcjonalne atrybuty wszystkich jej potomków. Informacje te można odczytać za pomocą dowolnej przeglądarki LDAP. Atrybut STRUCTURAL oznacza, że tę klasę obiektów można wykorzystać do tworzenia wpisów w drzewie DIT. Można również spotkać klasy obiektów z atrybutem AUXILARY. Nie mogą one istnieć samodzielnie, ale muszą być wykorzystywane razem z obiektami klas z atrybutem STRUCTURAL. Klasa objectClass jest jednocześnie atrybutem. Nie należy się przejmować, jeśli na razie nie widzimy w tym zbyt wiele sensu. Po utworzeniu prostego katalogu będzie można zauważyć, jak poszczególne części do siebie pasują. 360

|

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

Tajemniczy RootDSE Jedna dodatkowa rzecz, o której warto wiedzieć: rootDSE. Jest to jedna z nazw specjalistycznych odwołująca się do samej siebie. DSE to skrót od DSA Specific Entry (wpis specyficzny dla DSA), z kolei DSA oznacza Directory System Agent (systemowy agent katalogu). Jest to niewidoczny wpis najwyższego poziomu w hierarchii LDAP — wbudowane atrybuty serwera LDAP. Aby je zobaczyć, należy uruchomić poniższe dwa polecenia na serwerze LDAP: $ # # # # # # #

ldapsearch -x -s base -b "" + extended LDIF LDAPv3 base with scope baseObject filter: (objectclass=*) requesting: +

# dn: structuralObjectClass: OpenLDAProotDSE configContext: cn=config namingContexts: dc=krzak,dc=net supportedControl: 2.16.840.1.113730.3.4.18 supportedControl: 2.16.840.1.113730.3.4.2 [...] supportedFeatures: 1.3.6.1.4.1.4203.1.5.4 supportedFeatures: 1.3.6.1.4.1.4203.1.5.5 supportedLDAPVersion: 3 supportedSASLMechanisms: DIGEST-MD5 supportedSASLMechanisms: CRAM-MD5 supportedSASLMechanisms: NTLM entryDN: subschemaSubentry: cn=Subschema # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1

Wszystkie te liczby są oficjalnymi identyfikatorami obiektów (OID). Więcej informacji na ich temat warto przeczytać pod adresem http://www.alvestrand.no/objectid/. W witrynie znajduje się baza danych z możliwością przeszukiwania, dzięki czemu można sprawdzić, co oznacza określony identyfikator OID. Poniższe polecenie wyświetla podobny wynik, a do tego wiele dodatkowych informacji na temat nazwy subschema: $ ldapsearch -x -s base -b "cn=subschema" objectclasses [...] # Subschema dn: cn=Subschema objectClasses: ( 2.5.6.0 NAME 'top' DESC 'top of the superclass chain' ABSTRAC T MUST objectClass ) objectClasses: ( 1.3.6.1.4.1.1466.101.120.111 NAME 'extensibleObject' DESC 'RF C2252:extensible object' SUP top AUXILIARY ) objectClasses: ( 2.5.6.1 NAME 'alias' DESC 'RFC2256: an alias' SUP top STRUCTU RAL MUST aliasedObjectName ) objectClasses: ( 2.16.840.1.113730.3.2.6 NAME 'referral' DESC 'namedref: named subordinate referral' SUP top STRUCTURAL MUST ref )

12.0. Wprowadzenie

|

361

objectClasses: ( 1.3.6.1.4.1.4203.1.4.1 NAME ( 'OpenLDAProotDSE' 'LDAProotDSE' ) DESC 'OpenLDAP Root DSE object' SUP top STRUCTURAL MAY cn ) objectClasses: ( 2.5.17.0 NAME 'subentry' SUP top STRUCTURAL MUST ( cn $ subtr eeSpecification ) ) [...]

Są to te same informacje, które można znaleźć w pliku /etc/ldap/schema. Z obiektem rootDSE nie trzeba nic robić. Mówimy o nim tylko po to, by pokazać, że istnieje, oraz jaką ma postać. Obiekt rootDSE jest czasami mylony z atrybutem DN root, ale to nie jest to samo. Obiekt rootDSE to czysty serwer OpenLDAP, tzn. schemat i obsługiwane protokoły. Atrybut DN root w wielu dokumentach jest wymieniany jako nazwa przyrostka, czyli bazowa nazwa hierarchii danych. Osobiście unikam pojęcia root DN — jest zbyt mylące. Aha, i jeszcze jest atrybut rootdn. Oznacza on superużytkownika katalogu. Atrybuty rootdn i rootpw definiuje się w pliku slapd.conf. To prawda, trochę to mylące. Atrybut rootdn daje wiele możliwości. Duża grupa administratorów decyduje się na całkowitą rezygnację z atrybutu rootdn. Zamiast tego tworzą swego rodzaju konto użytkownika-administratora, którego definiuje się wewnątrz samego katalogu.

Decydowanie o głębokości katalogu Próbujemy przewidywać przyszłość. Chcemy tak inteligentnie zaprojektować drzewo DIT, aby można było je bezproblemowo rozszerzać w miarę rozwoju organizacji. Jest to oczywiście bardzo szlachetny cel. W związku z tym zastanawiamy się, czy jego struktura powinna być szeroka i płaska, czy też węższa i głęboka. Jest to problem, z którym spotykają się wszyscy administratorzy LDAP. Jak zwykle, odpowiedź brzmi „to zależy”. Osobiście preferuję płytszą strukturę katalogu, ponieważ jest łatwiejsza w utrzymaniu, ponadto mechanizm LDAP jest zoptymalizowany do wyszukiwania w poziomie, a nie w dół hierarchii. Drzewo DIT z trzema jednostkami OU pokazano na rysunku 12.2.

Rysunek 12.2. Zaczątek gałęzi drzewa DIT

Trzeba przyznać, że wygląda to interesująco i sprawia wrażenie dobrej organizacji, prawda? Trzy oddzielne wydziały, każdy w ramach swojej własnej jednostki organizacyjnej. Tak jak w uporządkowanej szafce z dokumentami. Spróbujmy się jednak zastanowić, co się stanie, kiedy Janina z działu Piętro przejdzie do działu Parter. Będzie trzeba usunąć jej wpis w dziale Piętro i stworzyć nowy w dziale Parter. To wymaga wykonania kilku czynności, niezależnie od tego, jak jesteśmy wydajni.

362

|

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

Spójrzmy teraz na rysunek 12.3.

Rysunek 12.3. Okrojona wersja drzewa DIT

Wszyscy użytkownicy zostali umieszczeni w jednostce organizacyjnej Ludzie. Skąd będziemy wiedzieć, do jakich wydziałów należą? Wystarczy nadać im dodatkowy atrybut OU w następujący sposób: dn: cn=Janina Taneczna,ou=ludzie,dc=foo,dc=com objectClass: inetOrgPerson cn: Janina Taneczna ou=pietro [...]

Janina chce przejść do działu Parter? Bułka z masłem. Wystarczy uruchomić polecenie ldapmodify lub graficzną przeglądarkę LDAP, aby zmienić zapis ou=Piętro na ou=Parter oraz wszystkie inne atrybuty, które zostały zmienione (na przykład numer telefonu i stanowisko). To mniej niż połowa pracy w porównaniu z przeniesieniem wpisu do nowej jednostki OU. Taka czynność wymagałaby czterech operacji: • wyeksportowania istniejącego wpisu do pliku LDIF za pomocą polecenia ldapsearch; • usunięcia rekordu za pomocą polecenia ldapdelete; • edycji pliku LDIF; • dodania rekordu do nowej jednostki OU za pomocą polecenia ldapadd.

Można również rozpatrywać problem struktury pod kątem delegowania zadań dla młodszych administratorów lub zabezpieczeń wrażliwych danych. Może się to wiązać z przechowywaniem danych w osobnych poddrzewach lub oddzielnych bazach danych. W związku z tym administracja staje się nieco bardziej złożona, ale uzyskujemy kontrolę nad tym, kto ma uprawnienia odczytu i zapisu. To nigdy nie jest łatwe. Jeśli spróbujemy zapytać o opinię na ten temat pięciu różnych administratorów LDAP, uzyskamy osiem różnych odpowiedzi. Podczas opracowywania topologii katalogów szczególnie przydatna może się okazać książka Geralda Cartera LDAP System Administration (O’Reilly, 2003).

12.0. Wprowadzenie

|

363

12.1. Instalacja systemu OpenLDAP w dystrybucji Debian Problem Jesteśmy gotowi, aby zabrać się do pracy i uruchomić serwer OpenLDAP. Jaki jest najlepszy sposób instalacji tego programu w dystrybucji Debian?

Rozwiązanie Wystarczy uruchomić menedżera Aptitude i zainstalować następujące pakiety: #aptitude install slapd ldap-utils gq db4.3-doc db4.2-util

System wyświetli pytanie o stworzenie hasła administratora LDAP. W Debianie utworzy się użytkownik LDAP admin, a w roli przyrostka (czy też kontekstu nazw) zostanie użyta nasza nazwa domeny. Następnie wystarczy uruchomić poniższą prostą operację wyszukiwania, aby się upewnić, czy serwer działa i odpowiada na żądania: # ldapsearch -xb '' -s base '(objectclass=*)' namingContexts [...] dn: namingContexts: dc=krzak,dc=net [...]

Aby wyświetlić dane użytkownika admin, można skorzystać z następującego polecenia: $ ldapsearch -xb 'dc=krzak,dc=net' [...] # admin, krzak.net dn: cn=admin,dc=krzak,dc=net objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin description: Administrator LDAP [...]

Doskonale! Udało się! Możemy teraz przejść do dalszych czynności.

Dyskusja W Debianie tworzy się podstawowa konfiguracja, konto użytkownika openldap, które można zobaczyć w pliku /etc/passwd, tworzą się pliki startowe, a system uruchamia się podczas startu systemu. Ponadto plikom są nadawane odpowiednie uprawnienia dostępu oraz właściciele. Tworzy się również użytkownik OpenLDAP admin, który nie jest użytkownikiem systemowym, tak jak openldap, ale użytkownikiem w katalogu OpenLDAP. Większość czytelników z pewnością zapoznała się z dokumentami HOWTO dotyczącymi systemu OpenLDAP, w których pokazano utworzenie atrybutów rootdn i rootpw w pliku slapd.conf. Atrybut rootdn zawiera nazwę konta superużytkownika bazy danych (w naszym przypadku jej funkcję pełni użytkownik admin), natomiast atrybut rootpw zawiera hasło użytkownika rootdn. Jest to niezbędne do wstępnego utworzenia katalogu. Niektórzy administratorzy preferują tworzenie superużytkownika bazy danych w taki właśnie sposób. Użytkow364 |

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

nik rootdn ma automatycznie nieograniczony dostęp do wszystkiego i nie potrzebuje takich uprawnień dostępu, jakich wymaga użytkownik admin. Niektórzy administratorzy ze względu na bezpieczeństwo nie chcą definiować atrybutu rootpw w pliku slapd.conf. Są również administratorzy, którzy ze względu na bezpieczeństwo rezygnują z konta superużytkownika (takiego jak nasze konto admin) w katalogu. Jeśli ktoś zdecyduje się na pozostawienie atrybutu rootpw w pliku slapd.conf, powinien trzy razy się upewnić, że plik jest zabezpieczony. Należy nadać w nim uprawnienia odczytu wyłącznie właścicielowi i grupie oraz włączyć prawo do zapisu tylko wtedy, gdy zachodzi konieczność wprowadzania modyfikacji. W roli bazy danych warstwy backend system OpenLDAP wykorzystuje bazę Sleepycat Berkeley DB. Pakiet Aptitude powinien zainstalować jej odpowiednią wersję. Pakiet db4.2-util zawiera niezbędne narzędzia zarządzania bazą BDB. Pakiet db4.3-doc zawiera kompletny podręcznik bazy danych Sleepycat BDB. Jest on przeznaczony dla programistów, ale zawiera również wiele cennych informacji dla administratorów serwerów (pakiet db4.2-doc nie istnieje, ale niezgodność wersji pakietów nie ma znaczenia). Należy pobrać wersję pakietu db4.*-util odpowiadającą wersji bazy danych Berkeley DB. Jeśli nie wiadomo, jakiej nazwy pakietu należy szukać, można skorzystać z polecenia dpkg, które wyświetla pakiety zainstalowane w systemie: $ dpkg -l | grep ii libdb4.2 ii libdb4.3 ii libdb4.4

db4 4.2.52+dfsg-2 Berkeley v4.2 Database Libraries [runtime] 4.3.29-8 Berkeley v4.3 Database Libraries [runtime] 4.4.20-8 Berkeley v4.4 Database Libraries [runtime]

Często się zdarza, że w systemie jest zainstalowanych wiele wersji, ponieważ wiele aplikacji korzysta z bazy danych Berkeley DB w roli warstwy backend. Za pomocą polecenia apt-cache można znaleźć właściwą wersję odpowiadającą wersji demona slapd: $ apt-cache depends slapd | grep db4 Depends: libdb4.2

Przyrostek LDAP pełniący funkcję bazowej nazwy katalogu można odczytać z pliku /etc/ldap/ slapd.conf: # Baza katalogu w bazie danych #1 suffix "dc=krzak,dc=net"

Oto opis opcji polecenia ldapsearch: -x

Powiązanie z katalogiem z wykorzystaniem uwierzytelniania w postaci zwykłego tekstu.

-b

Rozpoczęcie wyszukiwania od wskazanej lokalizacji. -s

Opcja pozwala na zdefiniowanie zasięgu wyszukiwania. Można skorzystać z opcji base, one lub sub. Opcja base oznacza przeszukiwanie obiektu bazowego. Opcja one powoduje przeszukiwanie bezpośrednich potomków wpisu i nie obejmuje samego wpisu, z kolei opcja sub oznacza przeszukiwanie całego poddrzewa włącznie z wpisem. Domyślną wartością jest sub. System OpenLDAP można zainstalować z kodów źródłowych, jeśli komuś to odpowiada. Instrukcje dotyczące tego sposobu instalacji można znaleźć w witrynie OpenLDAP.org (http:// www.openldap.org/). 12.1. Instalacja systemu OpenLDAP w dystrybucji Debian

|

365

Patrz także • man ldapsearch • OpenLDAP.org: http://www.openldap.org • książka Briana Arkillsa LDAP Directories Explained: An Introduction and Analysis (Addison-

-Wesley, 2003)

12.2. Instalacja systemu OpenLDAP w dystrybucji Fedora Problem Jesteśmy gotowi, aby się zabrać do pracy i uruchomić serwer OpenLDAP. Jaki jest najlepszy sposób instalacji tego programu w dystrybucji Fedora?

Rozwiązanie Wystarczy uruchomić menedżera Yum i zainstalować następujące pakiety: # yum install openldap openldap-servers openldap-clients db4-utils gq

Dyskusja Implementacja OpenLDAP w dystrybucji Fedora wymaga ręcznego wprowadzenia pewnych zmian. Program należy skonfigurować od podstaw. Trzeba poprawić ustawienia właścicieli plików oraz utworzyć plik konfiguracyjny bazy danych. Tymi problemami zajmiemy się w następnej recepturze. Podczas instalacji tworzą się pliki startowe oraz użytkownik systemowy ldap. Zależności rozwiązuje menedżer pakietów Yum. System OpenLDAP można zainstalować z kodów źródłowych, jeśli komuś to odpowiada. Instrukcje dotyczące tego sposobu instalacji można znaleźć w witrynie OpenLDAP.org (http:// www.openldap.org/).

Patrz także • OpenLDAP.org: http://www.openldap.org • książka Briana Arkillsa LDAP Directories Explained: An Introduction and Analysis (Addison-

-Wesley, 2003)

12.3. Konfiguracja i testowanie serwera OpenLDAP Problem Instalacja serwera OpenLDAP przebiegła pomyślnie. Co należy teraz zrobić, aby rozpocząć jego testowanie? 366

|

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

Rozwiązanie Użytkownicy Debiana nie muszą korzystać z tej receptury, ponieważ instalator Debiana wykonuje wszystkie potrzebne operacje. Pomimo tego warto jednak prześledzić, czy wszystko jest w porządku. Użytkownicy Fedora powinni skopiować poniższy, przykładowy plik konfiguracyjny: /etc/openldap/slapd.conf. Trzeba oczywiście wprowadzić własną nazwę domeny (może być dowolna, na przykład przyklad.com) w nawiasach kwadratowych oraz własną zawartość atrybutu rootpw: ####################################################################### # Dyrektywy globalne: # Definicje schematu i klas objectClass include /etc/ldap/schema/core.schema include /etc/ldap/schema/cosine.schema include /etc/ldap/schema/nis.schema include /etc/ldap/schema/inetorgperson.schema pidfile argsfile

/var/run/slapd/slapd.pid /var/run/slapd/slapd.args

# Dozwolone wartości można odczytać w podręczniku man slapd.conf(5) loglevel -1 # Lokalizacja modułów ładowanych dynamicznie modulepath /usr/lib/ldap moduleload back_bdb # Maksymalna liczba wpisów zwracanych w operacji wyszukiwania sizelimit 500 # Parametr tool-threads ustawia rzeczywistą liczbę procesorów CPU wykorzystywanych # do indeksowania. tool-threads 1 ####################################################################### # Specyficzne dyrektywy Backend dla bazy danych bdb: # Dyrektywy backend mają zastosowanie do warstwy backend do momentu wystąpienia # innej dyrektywy 'backend' backend bdb checkpoint 512 30 ####################################################################### # Specyficzne dyrektywy dla bazy danych #1 database bdb suffix "dc=[krzak],dc=[net]" rootdn "cn=admin,dc=[krzak],dc=[net]" rootpw [haslo] # Fizyczna lokalizacja plików bazy danych #1 directory "/var/lib/ldap" # Opcje indeksowania dla bazy danych #1 index objectClass eq # Zapisywanie czasu modyfikacji wpisu dla bazy danych #1 lastmod on # Użytkownik admin może czytać/zapisywać wszystkie hasła. # Użytkownicy mogą zmieniać własne hasła. access to attrs=userPassword,shadowLastChange by dn="cn=admin,dc=krzak,dc=net" write

12.3. Konfiguracja i testowanie serwera OpenLDAP

|

367

by anonymous auth by self write by * none # Wiele aplikacji wymaga uprawnień dostępu do czytania atrybutu rootDSE, # szczególnie do czytania obsługiwanych mechanizmów SASL; # Poniższa opcja ogranicza ich uprawnienia wyłącznie do czytania atrybutu rootDSE; nie mogą czytać informacji # poza tym poziomem. access to dn.base="" by * read # Użytkownik admin ma nieograniczone uprawnienia odczytu/zapisu w bazie danych, # pozostali użytkownicy mają dostęp tylko do odczytu. access to * by dn="cn=admin,dc=alrac,dc=net" write by * read #######################################################################

Następnie należy zapewnić, aby właścicielem plików w katalogu /var/lib/ldap stał się użytkownik ldap: # chown -R ldap:ldap /var/lib/ldap

Jeśli nie istnieje plik /var/lib/ldap/DB_CONFIG, należy utworzyć pusty plik o tej nazwie: # touch /var/lib/ldap/DB_CONFIG

Następnie należy uruchomić polecenie slaptest w celu sprawdzenia pliku /etc/ldap/slapd.conf: # slaptest config file testing succeeded

Teraz można uruchomić serwer: # /etc/init.d/ldap start Checking configuration files for slapd: config file testing succeeded [ OK ] Started slapd: [ OK ]

Następnie spróbujemy uruchomić poniższą prostą operację wyszukiwania, aby się upewnić, czy serwer działa i odpowiada na żądania: # ldapsearch -x -b '' -s base '(objectclass=*)' namingContexts [...] dn: namingContexts: dc=krzak,dc=net [...]

Udało się! Wszystko przebiegło pomyślnie! Można teraz przejść do kolejnych czynności.

Dyskusja Użytkownicy Debiana nie muszą definiować atrybutów rootpw lub rootdn, ale nie warto się nimi przejmować, ponieważ i tak zrezygnujemy z nich w następnej recepturze. Opcja loglevel -1 oznacza rejestrowanie wszystkiego. Jej pozostawienie może spowodować dodanie wielu megabajtów zrzucanych do mechanizmu syslog. Więcej informacji można znaleźć w recepturze 12.12. Opcje polecenia ldapsearch opisano w recepturze 12.1. Po uruchomieniu polecenia slaptest mogą się wyświetlić ostrzeżenia. Demon slapd powinien się uruchomić pomimo to, ale zawsze jednak trzeba pamiętać o usunięciu przyczyny ostrzeżeń. W dystrybucji Fedora często występują błędy spowodowane następującymi przyczynami:

368 |

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

• niewłaściwe uprawnienia lub prawa własności do pliku; • brakujący plik /var/lib/ldap/DB_CONFIG.

Wykonywanie wszystkich czynności w sposób zaprezentowany w tej recepturze powinno zapobiec występowaniu jakichkolwiek błędów. Na przykład, jeśli właścicielem plików w katalogu /var/lib/ldap nie jest użytkownik ldap, wystąpi błąd braku uprawnień (permission denied). Jeśli brakuje pliku DB_CONFIG, wyświetli się ostrzeżenie, ale demon slapd pomimo to się uruchomi. Plik DB_CONFIG zawiera opcje umożliwiające dostrojenie bazy danych Berkeley DB. Sposób jej konfiguracji opisano w recepturze 12.11. Konfiguracja zaprezentowana w tej recepturze jest bardzo uproszczona. Może służyć do testowania podstawowych własności. Definiowanie atrybutu rootpw w pliku slapd.conf z punktu widzenia zabezpieczeń nie jest najlepsze. Dotychczas nie utworzyliśmy jeszcze prawdziwego katalogu. Wkrótce jednak się tym zajmiemy.

Patrz także • man ldapsearch • OpenLDAP.org: http://www.openldap.org/ • książka Briana Arkillsa LDAP Directories Explained: An Introduction and Analysis (Addison-

-Wesley, 2003)

12.4. Tworzenie nowej bazy danych w dystrybucji Fedora Problem Instalacja OpenLDAP w dystrybucji Fedora nie zawiera jeszcze administratora ani żadnych innych użytkowników. Trzeba stworzyć konto użytkownika admin do zarządzania katalogiem. Trzeba również zdefiniować przyrostek.

Rozwiązanie Są trzy kroki do rozwiązania tego problemu:

1. utworzenie pliku LDIF z nowymi informacjami; 2. dodanie nowych wpisów do bazy danych Berkeley DB za pomocą polecenia ldapadd; 3. skonfigurowanie uprawnień do odczytu i zapisu w pliku slapd.conf. Najpierw należy utworzyć plik LDIF (LDAP Data Interchange Format), któremu w tym przykładzie nadamy nazwę pierwszy.ldif. Oczywiście należy wprowadzić własną nazwę domeny, firmy, a także opis i hasło. Należy usunąć wszystkie wiodące i końcowe spacje. Wpisy są oddzielone od siebie pustymi wierszami; komentarze muszą się znajdować w osobnych wierszach, a za każdym dwukropkiem musi być pojedyncza spacja: ## pierwszy.ldif # wpis dn dla użytkownika root dn: dc=krzak,dc=net

12.4. Tworzenie nowej bazy danych w dystrybucji Fedora

| 369

objectclass: dcObject objectclass: organization o: Firma Krzak - Piwo i Ciastka dc: krzak # administrator katalogu dn: cn=admin,dc=krzak,dc=net objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin userPassword: wielkisekret description: Administrator LDAP

Następnie należy uruchomić polecenie ldapadd. System wyświetli pytanie o hasło rootpw, które wprowadziliśmy w pliku slapd.conf: # ldapadd -x -D "cn=admin,dc=krzak,dc=net" -W -f pierwszy.ldif Enter LDAP Password: adding new entry "dc=krzak,dc=net" adding new entry "cn=admin,dc=krzak,dc=net"

Możemy teraz podziwiać nowe wpisy w wynikach wyszukiwania: $ ldapsearch -x -b 'dc=krzak,dc=net' [...] # krzak.net dn: dc=krzak,dc=net objectClass: dcObject objectClass: organization o: Firma Krzak - Piwo i Ciastka dc: krzak # admin, krzak.net dn: cn=admin,dc=krzak,dc=net objectClass: simpleSecurityObject objectClass: organizationalRole cn: admin userPassword: fji8Hu11hs description: Administrator LDAP [...]

Ujmujemy w komentarz wpisy rootpw i rootdn z pliku slapd.conf. Następnie restartujemy program OpenLDAP i jeszcze raz przeglądamy wpisy w katalogu: # /etc/init.d/ldap restart $ ldapsearch -x -b 'dc=krzak,dc=net'

W tym momencie użytkownik admin ma pełną kontrolę nad bazą danych.

Dyskusja Należy pamiętać o spacjach w plikach LDIF. Każdy wpis jest oddzielony od następnego pustym wierszem. Pojedyncza wiodąca spacja w wierszu oznacza, że jest on kontynuacją wiersza poprzedniego. Poszczególne pary nazwa-wartość są od siebie oddzielone przecinkami. Przecinki, które mają występować literalnie, muszą być poprzedzone ukośnikiem, tak jak pokazano w poniższym przykładzie: dn: uid=twieloryb,ou=ludzie,ou=fabryka,ou=biuro, o=gadzety\, sp.z.o.o.,c=pl,dc=gadzety,dc=pl

Użytkownik pełniący funkcję administratora może mieć dowolną nazwę, na przykład db-admin, ldapgoddess lub inną. W wielu dokumentach poświęconych LDAP można spotkać nazwę Manager. Odgrywa on identyczną rolę co nasz użytkownik admin. 370

|

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

Plik pierwszy.ldif zawiera dwa osobne wpisy. Pierwszy z nich definiuje nasz przyrostek. Jest to korzeń (atrybut rootx) naszego drzewa katalogu. Drugi wpis definiuje użytkownika admin, któremu w pliku slapd.conf udzielono uprawnień do odczytu i zapisu w obrębie całej bazy danych. Wszyscy pozostali użytkownicy mają dostęp tylko do odczytu. Mogą oni jedynie zmieniać własne hasła i nie mogą zobaczyć haseł innych użytkowników. Każdemu wpisowi trzeba przypisać unikatowy atrybut DN. Należy pamiętać, że tworzy się go poprzez połączenie względnych nazw wyróżniających (Relative Distinguished Name — RDN) jego wszystkich przodków (więcej informacji na ten temat można znaleźć we „Wprowadzeniu” do niniejszego rozdziału). Dla plików LDIF nie trzeba używać rozszerzeń .ldif. Lepiej jednak, w celu poprawienia czytelności, zachować to rozszerzenie. Dlaczego należy usunąć atrybuty rootdn i rootpw z pliku slapd.conf? Atrybut rootdn zawiera nazwę superużytkownika bazy danych (rolę tę odgrywa nasz użytkownik admin), natomiast atrybut rootdn zawiera jego hasło. Są one niezbędne do utworzenia katalogu po raz pierwszy. Niektóre osoby preferują konfigurowanie superużytkownika bazy danych w taki sposób. Niektórzy administratorzy ze względu na bezpieczeństwo nie chcą definiować atrybutu rootdn w pliku slapd.conf. Są również administratorzy, którzy ze względu na bezpieczeństwo rezygnują z konta superużytkownika (takiego jak nasze konto admin) w katalogu. Jeśli ktoś zdecyduje się na pozostawienie atrybutu rootpw w pliku slapd.conf, powinien się trzy razy upewnić, że plik jest zabezpieczony. Należy nadać w nim uprawnienia do odczytu wyłącznie właścicielowi i grupie oraz włączyć prawo do zapisu tylko wtedy, gdy zachodzi konieczność wprowadzania modyfikacji. Listy kontroli dostępu użytkownika admin, które utworzyliśmy w poprzedniej recepturze w pliku slapd.conf, nie są konieczne, jeśli zdecydujemy się na pozostawienie atrybutu rootdn w pliku slapd.conf. Dla atrybutu rootdn nie trzeba jawnie definiować reguł dostępu.

Klasy ObjectClass i ich atrybuty Aby wyświetlić listę dostępnych atrybutów dla każdej klasy obiektów objectClass, można skorzystać z graficznej przeglądarki LDAP, na przykład gq. Jest to łatwy sposób wyświetlenia atrybutów, które mamy do wyboru. Można również zajrzeć do plików schematu w katalogu /etc/ldap/schema/ (/etc/openldap w dystrybucji Fedora). Bardzo często wykorzystywaną klasą objectClass jest inetOrgPerson. W pliku /etc/ldap/schema/inetorgperson.schema zdefiniowano te atrybuty, które są obowiązkowe, a także atrybuty opcjonalne: # inetOrgPerson # Klasa inetOrgPerson reprezentuje osoby powiązane w pewien sposób # z organizacją. Jest to klasa strukturalna będąca klasą potomną klasy # organizationalPerson zdefiniowanej w protokole X.521 [X521]. objectclass ( 2.16.840.1.113730.3.2.2 NAME 'inetOrgPerson' DESC 'RFC2798: Internet Organizational Person' SUP organizationalPerson STRUCTURAL MAY ( audio $ businessCategory $ carLicense $ departmentNumber $ displayName $ employeeNumber $ employeeType $ givenName $ homePhone $ homePostalAddress $ initials $ jpegPhoto $ labeledURI $ mail $ manager $ mobile $ o $ pager $ photo $ roomNumber $ secretary $ uid $ userCertificate $ x500uniqueIdentifier $ preferredLanguage $ userSMIMECertificate $ userPKCS12 ) )

12.4. Tworzenie nowej bazy danych w dystrybucji Fedora

|

371

Jak można się przekonać na podstawie tego dokumentu, wszystkie argumenty są opcjonalne. Klasa simpleSecurityObject jest mniej złożona — ma tylko jeden obowiązkowy atrybut: objectclass ( 0.9.2342.19200300.100.4.19 NAME 'simpleSecurityObject' DESC 'RFC1274: simple security object' SUP top AUXILIARY MUST userPassword )

Patrz także • man 1 ldapsearch • OpenLDAP.org: http://www.openldap.org • książka Briana Arkillsa LDAP Directories Explained: An Introduction and Analysis (Addison-

-Wesley, 2003) • książka Geralda Cartera LDAP System Administration (O’Reilly, 2003)

12.5. Wprowadzanie dodatkowych użytkowników do katalogu Problem Jesteśmy gotowi do wprowadzania dodatkowych użytkowników do katalogu OpenLDAP. W jaki sposób można to zrobić?

Rozwiązanie Najpierw trzeba się upewnić, czy serwer OpenLDAP działa. Następnie należy utworzyć plik LDIF zawierający nowe wpisy użytkowników. Po wykonaniu tych czynności można wykorzystać polecenie ldapadd w celu wyeksportowania ich do naszego katalogu OpenLDAP. Postaramy się rozszerzyć naszą strukturę katalogu. Na razie jest to bowiem dobrze znany, prosty katalog jednopoziomowy. Chcemy, aby informacje były zorganizowane, a nie żeby wszystkie były usytuowane na najwyższym poziomie. W związku z tym dodamy jednostkę organizacyjną (Organizational Unit — OU) ludzie. Katalog ma teraz postać pokazaną na rysunku 12.4. Jak można zauważyć, użytkownik admin występuje samotnie na najwyższym poziomie. Pokazany przykładowy plik uzytkownicy.ldif powoduje dodanie nowej jednostki OU oraz dwóch użytkowników. Należy zwrócić uwagę na odstępy! Komentarze muszą się znaleźć w osobnych wierszach, po każdym dwukropku powinna być spacja, a poszczególne wpisy muszą być od siebie oddzielone pustym wierszem: ##/etc/ldap/ldif/uzytkownicy.ldif dn: ou=ludzie,dc=krzak,dc=net ou: ludzie description: Wszyscy ludzie w organizacji objectClass: organizationalUnit dn: uid=cschroder,ou=ludzie,dc=krzak,dc=net objectClass: inetOrgPerson cn: Carla Schroder

372

|

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

Rysunek 12.4. Dodanie do katalogu OpenLDAP jednej nowej jednostki organizacyjnej OU w celu wprowadzenia użytkowników sn: Schroder uid: cschroder userPassword: hasło telephoneNumber: 444-222-3333 homePhone: 555-111-2222 mail: [email protected] mail: [email protected] description: nie do opisania dn: uid=tnowakowski,ou=ludzie,dc=krzak,dc=net objectClass: inetOrgPerson cn: Tomasz Nowakowski sn: Nowakowski uid: tnowakowski userPassword: hasło telephoneNumber: 222-333-4455 homePhone: 112-334-5678 mail: [email protected] mail: [email protected] description: całkowicie wymyślona postać

Teraz można dodać nowe wpisy do bazy danych: # ldapadd -x -D "cn=admin,dc=krzak,dc=net" -W -f users.ldif Enter LDAP Password: adding new entry "ou=ludzie,dc=krzak,dc=net" adding new entry "uid=cschroder,ou=ludzie,dc=krzak,dc=net" adding new entry "uid=tnowakowski,ou=ludzie,dc=krzak,dc=net"

Następnie, tak jak zwykle, uruchamiamy polecenie ldapsearch w celu weryfikacji wpisów: $ ldapsearch -x -b 'dc=krzak,dc=net'

Aby zdefiniować dodatkowych użytkowników, należy stworzyć nowy plik .ldif lub nadpisać stary. Nie możemy po prostu dodawać nowych wpisów w istniejącym pliku, ponieważ kiedy program ldapadd napotka istniejący wpis, zatrzyma się i nie będzie czytał reszty pliku.

12.5. Wprowadzanie dodatkowych użytkowników do katalogu

|

373

Dyskusja Z polecenia ldapadd można korzystać tylko w przypadku, gdy działa serwer. Polecenie nie zadziała, jeśli demon slapd nie jest uruchomiony. Wszystkie polecenia rozpoczynające się od ldap do poprawnego działania wymagają uruchomionego serwera. Polecenia zaczynające się na slap, na przykład slapcat i slapadd, nie wymagają uruchomienia demona slapd. Informacje na temat tworzenia plików LDIF można znaleźć w punkcie „Dyskusja”, w poprzedniej recepturze.

Patrz także • man 1 ldapsearch • OpenLDAP.org: http://www.openldap.org • książka Briana Arkillsa LDAP Directories Explained: An Introduction and Analysis (Addison-

-Wesley, 2003)

• książka Geralda Cartera LDAP System Administration (O’Reilly, 2003)

12.6. Poprawianie wpisów w katalogu Problem Zmieniły się dane użytkownika lub zdarzyło się nam popełnić błąd i chcemy zmodyfikować istniejący wpis w katalogu. W jaki sposób można to zrobić?

Rozwiązanie Jednym ze sposobów jest skorzystanie z polecenia ldapmodify. Należy utworzyć nowy plik LDIF o specjalnym formacie. W tym przykładzie pokazano sposób dodania stanowiska, zmiany adresu e-mail i dodania fotografii: ##/etc/ldap/modyfikacje.ldif dn: uid=tnowakowski,ou=ludzie,dc=krzak,dc=net changetype:modify add:title title:Inspektor PPOZ replace:mail mail:[email protected] add : jpegphoto jpegphoto:< file:///nazwa_pliku.jpg

Następnie można skorzystać z pliku LDIF w następujący sposób: # ldapmodify -x -D "cn=admin,dc=krzak,dc=net" -W -f modyfikacje.ldif Enter LDAP Password: modifying entry "cn=Tomasz Nowakowski,ou=ludzie,dc=krzak,dc=net"

Następnie można zweryfikować wprowadzone zmiany za pomocą polecenia ldapsearch: $ ldapsearch -xtb 'dc=krzak,dc=net' 'cn=tomasz nowakowski' [...] # tnowakowski, ludzie, krzak.net

374

|

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

dn: uid=tnowakowski,ou=ludzie,dc=krzak,dc=net objectClass: inetOrgPerson cn: Tomasz Nowakowski sn: Nowakowski uid: tnowakowski telephoneNumber: 222-333-4455 homePhone: 112-334-5678 description: calkowicie wymyslona postac title: Inspektor PPOZ mail: [email protected] jpegphoto:< file:///tmp/ldapsearch-jpegPhoto-G0DVlZ [...]

Dyskusja Z reguły szybszym i lepszym rozwiązaniem umożliwiającym modyfikację niewielkiej liczby wpisów jest graficzna przeglądarka LDAP (patrz receptura 12.10). Zastosowanie plików LDIF jest szybszym rozwiązaniem umożliwiającym wprowadzanie masowych zmian oraz korzystniejszym sposobem pracy dla ekspertów w dziedzinie tworzenia skryptów. Zwróćmy uwagę na nową opcję -t polecenia ldapsearch. Opcja ta informuje polecenie ldapsearch, aby fotografie, pliki audio lub inne dane nietekstowe były zapisywane w plikach tymczasowych. Jeśli nie skorzystamy z tej opcji, uzyskamy mnóstwo danych w następującej postaci: fdtvWuJG2BwGFzjms1d7eTubLmBp5EFktAAPZfvNUzNVthoyz6sMbkgtSAd6dj3mqudjOCW6QxUAItBmSbQw 638J7W+NQArNTIZ4wNQbkdXh3sATNVnpSns2yveXHeYU5+1o46yelp6pu02LGcYBKimkNyRuq/j+/QUGJBp 3mdwf3q2PTbca2gFkCkkKVRixIltTMw4m3+91vTmZYaGy5Ktbxnq0

W przypadku dodawania fotografii JPEG musi być dostępny plik, który ona zawiera. Jeśli plik będzie niedostępny, polecenie ldapmodify zwróci komunikat ldapmodify: invalid format. Trochę trudno na tej podstawie wywnioskować, że system miał na myśli „nie mogę odnaleźć pliku”, ale komunikat ten ma dokładnie właśnie takie znaczenie. Pliki JPEG są importowane do bazy danych z wykorzystaniem kodowania MIME base-64. W przypadku dołączania zdjęć osób potrzebnych do umieszczenia na identyfikatorach należy pamiętać, aby miały fizycznie małe rozmiary oraz aby rozmiar plików, w których są zapisane, również nie był duży. W przeciwnym przypadku będą wyglądały dziwnie w klientach LDAP. W programie OpenLDAP olbrzymie znaczenie mają format i składnia pliku ze zmianami. Musi się on rozpoczynać od atrybutu DN, który identyfikuje wpis, dalej musi występować słowo kluczowe changetype i, na koniec, typ stosowanej modyfikacji: add, modify, modrdn lub delete. Usunięcie wpisu wymaga wprowadzenie tylko dwóch wierszy: dn: cn=Tomasz nowakowski,ou=ludzie,dc=krzak,dc=net changetype:delete

Trzeba zwrócić uwagę na dokładny zapis składni atrybutów jpegPhoto i audio: jpegphoto:< file:///nazwa_pliku.jpg

Przed symbolem :< nie może być spacji, natomiast za nim musi być jedna spacja. W słowie kluczowym file:// są dwa ukośniki, dalej należy podać nazwę pliku. W celu modyfikacji istniejącego wpisu można skorzystać ze słów kluczowych add, replace lub delete. Słowo kluczowe replace działa w trybie wszystko albo nic. Na przykład, jeśli wpis zawiera trzy adresy e-mail, a w pliku LDIF jest następujący zapis: replace: mail mail: [email protected]

zostaną usunięte trzy stare adresy, a następnie dodany jeden nowy. 12.6. Poprawianie wpisów w katalogu

|

375

Słowo delete może działać w trybie wszystko albo nic, albo selektywnie. Jeśli wpis zawiera trzy atrybuty homePhone i użyjemy opcji: delete: homephone

to usunięte będą wszystkie trzy. Aby usunąć pojedynczy atrybut, należy skorzystać z następującego polecenia: delete: homephone homePhone: 222-333-5555

Patrz także • OpenLDAP.org: http://www.openldap.org/ • książka Briana Arkillsa LDAP Directories Explained: An Introduction and Analysis (Addison-

-Wesley, 2003) • książka Geralda Cartera LDAP System Administration (O’Reilly, 2003)

12.7. Nawiązywanie połączenia ze zdalnym serwerem OpenLDAP Problem Nie zawsze chcemy być obecni fizycznie przy serwerze lub chcemy, aby działał bezobsługowo, dlatego musimy się dowiedzieć, w jaki sposób można zdalnie administrować serwerem OpenLDAP.

Rozwiązanie We wszystkich poleceniach OpenLDAP wykorzystuje się tę samą opcję -H w celu nawiązania połączenia ze zdalnym serwerem. Oto przykład dla sieci lokalnej, w którym wykorzystano nazwę hosta serwera: # ldapsearch -H ldap://xena -xtb 'dc=krzak,dc=net'

Można również użyć w pełni kwalifikowanej nazwy domeny: # ldapsearch -H ldap://xena.krzak.net -xtb 'dc=krzak,dc=net'

Można również określić port. Nie trzeba tego robić, chyba że wykorzystujemy port niestandardowy: # ldapsearch -H ldap://xena.krzak.net:389 -xtb 'dc=krzak,dc=net'

Dyskusja W wielu dokumentach w dalszym ciągu są odwołania do opcji w postaci małej litery -h. Jest to jednak przestarzały i niezalecany sposób, który w pewnym momencie przestanie być używany całkowicie. Nie trzeba ograniczać się wyłącznie do korzystania z opcji w przykładowych poleceniach. Można zdalnie uruchomić dowolne polecenia OpenLDAP (na przykład operacje wyszukiwania, wprowadzanie zmian itp.). 376

|

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

Patrz także • man 1 ldapsearch • man 1 ldapmodify • OpenLDAP.org: http://www.openldap.org/ • książka Briana Arkillsa LDAP Directories Explained: An Introduction and Analysis (Addison-

-Wesley, 2003) • książka Geralda Cartera LDAP System Administration (O’Reilly, 2003)

12.8. Wyszukiwanie informacji w katalogu OpenLDAP Problem Katalog coraz bardziej się rozrasta. Chcemy się dowiedzieć, w jaki sposób dostroić operacje wyszukiwania, aby uzyskać tylko te informacje, które nas interesują, i nie być zmuszonym do przebijania się przez mnóstwo nieistotnych danych.

Rozwiązanie Polecenie ldapsearch zawiera wiele opcji wyszukiwania według dowolnych atrybutów. Poniższe polecenie wyszukuje wybranego użytkownika według nazwiska (atrybutu CN): $ ldapsearch -xtb 'dc=krzak,dc=net' 'cn=carla'

Jeśli nie jesteśmy do końca pewni, czego szukamy, możemy użyć symboli wieloznacznych. Oto funkcja wyszukiwania identyfikatorów UID kończących się na schroder: $ ldapsearch -xtb 'dc=krzak,dc=net' 'uid=*schroder'

Z kolei wszystkie wpisy zawierające określony prefiks telefoniczny można wyszukać za pomocą następującego polecenia: $ ldapsearch -xtb 'ou=ludzie,dc=krzak,dc=net' '(telephoneNumber=333*)'

Można również wyszukać listę samych atrybutów, bez wartości: $ ldapsearch -xtb 'dc=krzak,dc=net' 'cn=carla' -A

Wyszukiwanie można rozpocząć od wskazanego poziomu drzewa DIT: $ ldapsearch -xtb 'ou=ludzie,dc=krzak,dc=net' 'cn=carla'

Można ograniczyć rozmiar wyszukiwania. Oto przykład wyszukiwania wpisów ze zdjęciami z ograniczeniem liczby wyświetlanych wyników do 10: $ ldapsearch -xtb 'ou=ludzie,dc=krzak,dc=net' '(telephoneNumber=333*)'

Poniższe polecenie tworzy listę klas objectClass wykorzystywanych w katalogu: $ ldapsearch -xb 'dc=krzak,dc=net' '(objectclass=*)' dcObject

Można również wyszukiwać wpisy o określonej wartości objectClass: $ ldapsearch -xb 'dc=krzak,dc=net' '(objectclass=simpleSecurityObject)'

Aby zawęzić wyszukiwanie, można wykorzystać kilka atrybutów. Na przykład można wyszukiwać użytkowników o podanym prefiksie numeru telefonu oraz określonej domenie pocztowej: 12.8. Wyszukiwanie informacji w katalogu OpenLDAP

|

377

$ ldapsearch -xtb 'dc=krzak,dc=net' '(&(mail=*domena.com)(telephoneNumber=333*))'

Można też wyświetlić użytkowników z podanej domeny pocztowej, oprócz tych z określonym prefiksem telefonicznym (należy pamiętać o nawiasach): $ ldapsearch -xtb 'dc=krzak,dc=net' '(&(mail=*domena.com)(!(telephoneNumber=333*)))'

Dyskusja Jeśli ktoś myśli sobie: „Szkoda czasu. Lepiej skorzystać z jednego z fajnych, graficznych klientów LDAP”, nie do końca ma rację. Te przyjemne narzędzia z estetycznymi interfejsami graficznymi w dalszym ciągu wymagają wiedzy na temat poleceń LDAP. Oto kilka przykładów składni różnych operacji wyszukiwania: Dopasowanie do wskazanej wartości: (atrybut=wartość) (objectclass=nazwa)

Przybliżone dopasowanie do wartości; użycie tej operacji wymaga zdefiniowania indeksu aproksymacji; więcej informacji można znaleźć w recepturze 12.9 (atrybut~=wartość)

Dopasowanie do wszystkich wymienionych wartości (&(wyr1)(wyr2)(wyr3))

Dopasowanie do dowolnej wartości; wyr1 OR wyr2 OR wyr3 (|(wyr1)(wyr2)(wyr3))

Wyłączenie podanej wartości (!(wyr1))

Wyłączenie obu podanych wartości (&(!(wyr1))(!(wyr2)))

Wyłączenie dowolnej spośród podanych wartości |(!(wyr1))(!(wyr2)))

Dostępnych jest kilka innych typów wyszukiwania, ale w mojej opinii nie są one zbyt użyteczne, ponieważ zależą od atrybutów, dla których zdefiniowano regułę sortowania. Dla większości atrybutów takie reguły są niedostępne: Dopasowanie do wartości większych od wartości podanej (atrybut>=wartość)

Dopasowanie do wartości mniejszych od wartości podanej (atrybut${FILENAME}.new.gz mv -f ${FILENAME}.new.gz ${FILENAME}.gz /etc/init.d/slapd start # usunięcie przestarzałych kopii po 30 dniach OLD=$(find $BACKUPDIR/ -ctime +$ROTATION -and -name 'ldap.backup.*') [ -n "$OLD" ] && rm -f $OLD

Zadanie można zaplanować w pliku /etc/crontab. Oto opcje powodujące uruchamianie skryptu codziennie o godzinie pierwszej po północy: # m h dom mon dow user command 00 1 * * * root /usr/local/bin/ldap-backup.sh

Dyskusja Istnieje wiele potencjalnych problemów z automatyzacją programu slapcat. Trzeba zamknąć katalog, a czas, jaki zajmie wykonanie tej operacji, jest trudny do przewidzenia. Restartowanie demonów czasami zawodzi nawet w przypadku najlepszych skryptów. Warto zatem rozważyć zastosowanie powyższego skryptu jako punktu wyjścia do zdefiniowania własnej obsługi błędów i usprawnień. Istnieje kilka zalet stosowania plików LDIF zamiast binarnych plików bazy danych. Mają format zwykłego tekstu, są niezależne od wersji i platformy. Dzięki temu można je zaimportować niemal do każdego katalogu LDAP. Pliki w formacie zwykłego tekstu można łatwo modyfikować. Dzięki temu można je uporządkować lub skopiować wybrane fragmenty. Można też manipulować nimi, stosując standardowe narzędzia uniksowe, takie jak grep, sed oraz awk. Niezależnie od tego, czy kopie bazy danych są wykonywane ręcznie, czy automatycznie, zawsze należy przechowywać bieżące zrzuty katalogu OpenLDAP.

Patrz także • man 8 slapcat • man 8 slapadd • OpenLDAP.org: http://www.openldap.org/ • książka Briana Arkillsa LDAP Directories Explained: An Introduction and Analysis (Addison-

-Wesley, 2003) • książka Geralda Cartera LDAP System Administration (O’Reilly, 2003)

12.14. Dostrajanie ustawień kontroli dostępu Problem W tym momencie wszyscy użytkownicy katalogu mają do niego dostęp tylko do odczytu, natomiast użytkownik admin ma dostęp zarówno do czytania, jak i zapisywania w nim danych. Czy istnieje sposób zastosowania bardziej szczegółowej kontroli dostępu?

390

|

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

Rozwiązanie Oczywiście, że istnieje. Punktem wyjścia niech będzie nasz prosty przykład drzewa DIT z przyrostkiem dc=krzak, dc=net oraz pojedynczą jednostką drugiego poziomu ou=ludzie: dc=krzak, dc=net | ou=ludzie

Załóżmy, że w obrębie jednostki organizacyjnej ludzie zdefiniowano kilku użytkowników z wykorzystaniem następujących atrybutów: objectClass: cn: sn: uid: title: jpegPhoto: telephoneNumber: homePhone: homePostalAddress: mail: description:

Byłoby dobrze, gdyby użytkownicy mogli zarządzać własnymi danymi, takimi jak hasła, adresy e-mail oraz numery telefonu. Użytkownicy nie powinni mieć jednak prawa do modyfikowania niektórych danych: identyfikatory UID, stanowiska (title), nazwy (CN) itp. powinny być zabezpieczone przed dostępem niezdyscyplinowanych użytkowników. Spróbujmy zmodyfikować system kontroli dostępu z receptury 12.4. Nowe wpisy są pogrubione, a opcje kontroli dostępu są ponumerowane, dzięki temu można je będzie łatwiej śledzić: #ACL 1 access by by by by

to attrs=userPassword,shadowLastChange dn="cn=admin,dc=krzak,dc=net" write anonymous auth self write * none

#ACL 2 access by by by

to attrs=homePostalAddress,homePhone,telephoneNumber,mail dn="cn=admin,dc=krzak,dc=net" write self write * none

#ACL 3 access to dn.base="" by * read #ACL 3 access to * by dn="cn=admin,dc=krzak,dc=net" write by * read

Zapisujemy zmiany, uruchamiamy polecenie slaptest i restartujemy demona slapd. Następnie można uruchomić klienta LDAP i sprawdzić, czy użytkownicy mogą wprowadzać dozwolone modyfikacje: $ ldapmodify -xD "uid=cschroder,ou=ludzie,dc=krzak,dc=net" -W Enter LDAP Password: dn: uid=cschroder,ou=ludzie,dc=krzak,dc=net changetype: modify replace:mail mail: [email protected] modifying entry "uid=cschroder,ou=ludzie,dc=krzak,dc=net"

12.14. Dostrajanie ustawień kontroli dostępu

|

391

Wciskamy dwukrotnie klawisz Return w celu zapisania zmian oraz Ctrl+D w celu wyjścia z klienta LDAP. Teraz nieco trudniejsze zadanie. Załóżmy, że chcemy wskazać osoby, które będą miały prawo zapisu rekordów dotyczących innych osób (na przykład pracownicy działu kadr). Można to zrobić dzięki zdefiniowaniu jednostki organizacyjnej grupy. Dla uprawnionych osób utworzymy nową jednostkę OU, tak jak pokazano na rysunku 12.8.

Rysunek 12.8. Nowe grupy i jednostki organizacyjne działu Kadry

Tworzymy nowy plik LDIF w celu dodania nowych wpisów w katalogu: ##groups.ldif dn: ou=grupy,dc=krzak,dc=net objectclass:organizationalUnit ou: grupy description: grupy ze specjalnymi uprawnieniami administracyjnymi dn: ou=kadry,ou=grupy,dc=krzak,dc=net objectclass: groupOfNames ou: kadry cn: Kadry description: Pracownicy działu kadr member: uid=tnowakowski,ou=ludzie,dc=krzak,dc=net member: uid=ajankowski,ou=ludzie,dc=krzak,dc=net

Do katalogu dodajemy następujące nowe wpisy: # ldapadd -xD "cn=admin,dc=krzak,dc=net" -W -f grupy.ldif

Następnie dodajemy do pliku slapd.conf następującą regułę kontroli dostępu ACL #3: # ACL 3 access by by by by

to dn.one="ou=ludzie,dc=krzak,dc=net" dn="cn=admin,dc=krzak,dc=net" write group.exact="ou=kadry,ou=grupy,dc=krzak,dc=net" write users read * none

Dodajmy jeszcze jedną regułę kontroli dostępu. Pozwala ona pracownikom kadr na modyfikowanie wszystkich swoich danych: # ACL 4 access to * by dn="cn=admin,dc=krzak,dc=net" write by self write

392

|

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

by group.exact="ou=kadry,ou=grupy,dc=krzak,dc=net" write by users read by * none

Dyskusja Kolejność jest istotna. Kiedy zostanie znaleziony pasujący wpis, reguła jest wykonywana. Obowiązuje generalna zasada, zgodnie z którą bardziej szczegółowe reguły występują w pierwszej kolejności, a za nimi reguły bardziej ogólne. Reguły kontroli dostępu to naprawdę silne narzędzia, które pozwalają na definiowanie różnych uprawnień. Warto przestudiować stronę podręcznika systemowego man 5 slapd.access. Nie jest to fascynująca lektura, ale zawiera bardzo szczegółowy opis istotnych informacji. Oto najczęściej stosowane wartości w odniesieniu do użytkowników: *

Każdy podłączony użytkownik, włącznie z anonimowymi.

self

Bieżący użytkownik, któremu udało się pomyślnie przejść przez uwierzytelnianie. Użycie atrybutu self pokazano w przykładzie wykorzystania polecenia ldapmodify w tej recepturze.

anonymous

Połączenia nieuwierzytelnionych użytkowników.

uzytkownicy

Połączenia uwierzytelnionych użytkowników.

Można skorzystać z następujących poziomów dostępu: write

Możliwość wykonywania wszystkich operacji wyszukiwania i wprowadzania modyfikacji.

read

Prawo do wyszukiwania i czytania całych wpisów.

search

Prawo do wyszukiwania i czytania atrybutów zgodnie z posiadanymi uprawnieniami.

compare

Prawo do porównywania atrybutów, ale nie do ich wyszukiwania.

auth

Prawo do uwierzytelniania. Oznacza to, że anonimowi użytkownicy muszą podać atrybut DN i hasło lub inne dane identyfikacyjne.

none

Brak uprawnień dostępu — słyszę, że pukasz, ale nie możesz wejść.

Patrz także • man 5 slapd.access • OpenLDAP.org: http://www.openldap.org/ • książka Briana Arkillsa LDAP Directories Explained: An Introduction and Analysis (Addison-

-Wesley, 2003)

• książka Geralda Cartera LDAP System Administration (O’Reilly, 2003) 12.14. Dostrajanie ustawień kontroli dostępu

|

393

12.15. Zmiana haseł Problem W jaki sposób można zmienić własne hasło?

Rozwiązanie Można skorzystać z polecenia ldappassw i podać własną wartość atrybutu DN: $ ldappasswd -xD "uid=cschroder,ou=ludzie,dc=krzak,dc=net" -WS New password: Re-enter new password: Enter LDAP Password: Result: Success (0)

W przypadku pominięcia flagi -S zostanie utworzone nowe hasło: $ ldappasswd -xD "uid=cschroder,ou=ludzie,dc=krzak,dc=net" -W Enter LDAP Password: New password: MzJiHq8n Result: Success (0)

Polecenie ldapwhoami jest doskonałym narzędziem do testowania danych użytkowników: $ ldapwhoami -x -D "uid=cschroder,ou=ludzie,dc=krzak,dc=net" -W Enter LDAP Password: dn:uid=cschroder,ou=ludzie,dc=krzak,dc=net Result: Success (0)

Dyskusja Oczywiście zmiana haseł z wykorzystaniem graficznych klientów LDAP zazwyczaj jest łatwiejsza i szybsza. Pomimo to warto się zapoznać z poleceniami ldappasswd i ldapwhoami, które mogą się przydać do rozwiązywania problemów. Użycie graficznych klientów LDAP w dalszym ciągu wymaga znajomości poleceń systemu OpenLDAP. Domyślnie polecenie ldappasswd tworzy skróty haseł z wykorzystaniem algorytmu SSHA. Za pomocą flagi -Y można określić inny mechanizm szyfrowania: SHA, SMD5, MD5, CRYPT lub CLEARTEXT. Można również ustawić inne wartości domyślne w pliku slapd.conf w następujący sposób: password-hash {MD5}

Patrz także • man 1 ldappasswd • man 1 slapd.conf • man 1 ldapwhoami • OpenLDAP.org: http://www.openldap.org/ • książka Briana Arkillsa LDAP Directories Explained: An Introduction and Analysis (Addison-

-Wesley, 2003) • książka Geralda Cartera LDAP System Administration (O’Reilly, 2003)

394 |

Rozdział 12. Scentralizowane sieciowe usługi katalogowe z wykorzystaniem OpenLDAP

ROZDZIAŁ 13.

Monitorowanie sieci z wykorzystaniem systemu Nagios

13.0. Wprowadzenie W tym rozdziale zapoznamy się ze sposobem instalacji i konfiguracji programu Nagios umożliwiającego monitorowanie usług sieciowych, procesów hosta i sprzętu. Program Nagios jest tak elastyczny, że szczegółowy opis jego wszystkich możliwości zająłby kilka książek. W związku z tym skoncentrujemy się na najbardziej popularnych funkcjach. Pozwolą one nam na stworzenie solidnych podstaw, na bazie których można będzie rozbudowywać konfigurację Nagios wraz z rozwojem sieci. W tym rozdziale nauczymy się wykonywania następujących operacji: • monitorowania usług takich jak HTTP, SSH, usług nazw oraz usług pocztowych; • monitorowania procesów systemowych i wykorzystywania sprzętu; • odbierania ostrzeżeń w przypadku wystąpienia problemów.

Dlaczego akurat Nagios, skoro wśród systemów darmowego oprogramowania z dostępem do kodu źródłowego można znaleźć mnóstwo dobrych monitorów sieci? Wydaje się, że wybór narzędzia do monitorowania sieci można by oprzeć na rzucie monetą. Pomimo takiego wyboru są szanse, że bylibyśmy z niego zadowoleni. Mocną stroną programu Nagios jest jego modułowa budowa, gwarantująca największą elastyczność oraz możliwości rozwoju. Zasadnicze moduły programu zostały zrealizowane w formie wtyczek. Można użytkować lub modyfikować oficjalne wtyczki programu Nagios, próbować wielu wtyczek dostawców zewnętrznych, a także pisać własne wtyczki. Dzięki wtyczkom Nagios jest odporny na zmiany, które mogą być wprowadzone w przyszłości. Na przykład, kiedy pojawi się więcej urządzeń obsługujących protokół SNMP, będzie można zainstalować lub napisać wtyczki obsługujące ten protokół. Jedna uwaga na temat wtyczek: Nagios to darmowe oprogramowanie na licencji GPL2. Wtyczki zewnętrznych producentów są dostępne na różnych licencjach. Należy zatem zachować ostrożność — nie wolno zakładać, że ich licencja to także GPL. Nagios widzi sieć w postaci hostów i usług. Testy hostów to zwykłe polecenia ping. Testy usług obejmują standardowe usługi, takie jak HTTP, DNS, SSH, a także procesy — na przykład liczba użytkowników, obciążenie procesora, miejsce na dysku i pliki dzienników. Testy 395

hostów są wykonywane tylko wtedy, gdy są konieczne — Nagios „wie”, że o ile działają jego usługi, hosty są w porządku, zatem testy hostów są wykonywane tylko w przypadku awarii usług. System Nagios zainstalujemy z kodu źródłowego, ponieważ pakiety programu Nagios dla większości dystrybucji Linuksa są przestarzałe (zwykle o kilka wersji). Jeśli ktoś woli instalację pakietów za pomocą takich menedżerów, jak Aptitude lub Yum, w dalszym ciągu będzie mógł korzystać z receptur. Trzeba jednak pamiętać, że pliki mogą się znajdować w innych lokalizacjach. W przypadku instalacji gotowego pakietu nie trzeba ręcznie tworzyć użytkownika i grupy Nagios ani też dostosowywać ustawień dotyczących właścicieli plików i uprawnień dostępu.

Patrz także • Nagios.org: http://www.nagios.org/ • serwis Nagios Exchange (http://www.nagiosexchange.org/) to centralne repozytorium wty-

czek oraz wymiany doświadczeń

13.1. Instalacja programu Nagios z kodu źródłowego Problem Preferujemy kompilację programu Nagios z kodu źródłowego. Dzięki temu można zarządzać opcjami fazy kompilacji. Chcemy również zainstalować najnowszą wersję, ponieważ pakiety przeznaczone dla naszej dystrybucji Linuksa są o kilka wersji starsze. Jakie dodatkowe biblioteki będą potrzebne?

Rozwiązanie Potrzebny będzie serwer HTTP, na przykład Apache lub Lighttpd, standardowe środowisko kompilacji Linuksa oraz biblioteki obsługujące mapę statusu, trendy i histogramy. Program Nagios intensywnie wykorzystuje skrypty CGI (Common Gateway Interface) — są to skrypty używane przez serwery WWW do generowania stron. W związku z tym będą potrzebne biblioteki GD i biblioteki od nich zależne. W dystrybucji Fedora należy zainstalować następujące pakiety: • grupę pakietów Development Tools (yum install 'Development Tools'); • libgd; • libgd-devel; • libpng; • libpng-devel; • libjpeg; • libjpeg-devel; • zlib; • zlib-devel.

396

|

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

W dystrybucji Debian potrzebne będą następujące pakiety: • build-essential; • libgd2; • libgd2-dev; • libpng12-0; • libgd2-dev; • libjpeg62; • libjpeg62-dev; • zlib1g; • zlib1g-dev.

Do zainstalowania programu Nagios trzeba pobrać cztery archiwa tarball. W czasie powstawania niniejszej książki poniższe pakiety zawierały najnowsze wersje kodów źródłowych: • nagios-2.9.tar.gz; • nagios-plugins-1.4.8.tar.gz; • nrpe-2.8.1.tar.gz; • nsca-2.7.1.tar.gz.

Pierwsze dwa pakiety zawierają zasadniczy szkielet programu Nagios oraz wtyczki. Dzięki zainstalowaniu tych pakietów można wykonywać testy hostów i usług bez konieczności instalacji dodatkowego oprogramowania klienckiego. Kolejne dwa pakiety wymagają zainstalowania i skonfigurowania programu Nagios na komputerach klienckich. Zainstalowanie pakietu nrpe pozwala na wykonywanie dodatkowych testów, na przykład sprawdzenia statusu procesora oraz innych testów sprzętowych. Pakiet ncsa dostarcza dodatkowe zabezpieczenia oraz funkcje szyfrowania. Narzędzia te mogą się okazać przydatne do monitorowania ważnych serwerów systemów Linux bądź Unix. W tym rozdziale skoncentrujemy się wyłącznie na skonfigurowaniu serwera Nagios oraz testów usług i hostów, które nie wymagają instalacji oprogramowania klienckiego. Instalacja programu Nagios z kodu źródłowego jest bardziej skomplikowana niż w przypadku większości aplikacji. W związku z tym, aby pomyślnie przebrnąć przez proces instalacji programu Nagios, należy postępować zgodnie z poniższymi wskazówkami. Najpierw należy pobrać dwa archiwa tarball zawierające stabilne wersje pakietów nagios i nagios-plugins z serwisu Nagios.org (http://www.nagios.org/download) do wybranego katalogu. Należy pamiętać o porównaniu sum kontrolnych md5 opublikowanych na stronie pobierania: $ md5sum nagios-2.9.tar.gz bb8f0106dc7f282c239f54db1f308445 nagios-2.9.tar.gz

Następnie należy je rozpakować: $ tar zxvf nagios-2.9.tar.gz $ tar zxvf nagios-plugins-1.4.8.tar.gz

Kolejne kroki to utworzenie grupy i użytkownika nagios, utworzenie katalogu /usr/local/nagios i wskazanie go jako ich katalogu domowego: # groupadd nagios # useradd -g nagios -md /usr/local/nagios nagios

13.1. Instalacja programu Nagios z kodu źródłowego

|

397

Teraz można utworzyć zewnętrzną grupę poleceń. Najpierw trzeba się dowiedzieć, z uprawnieniami jakiego użytkownika działa serwer Apache. W dystrybucji Fedora należy skorzystać z następującego polecenia: $ grep 'User ' /etc/httpd/conf/httpd.conf User apache

W Debianie należy skorzystać z następującego polecenia: $ grep 'User ' /etc/apache2/apache2.conf User www-data

Pozostałe czynności są takie same w obu dystrybucjach. Tworzymy grupę nagioscmd i dodajemy do niej użytkownika serwera Apache oraz użytkownika nagios: # groupadd nagioscmd # usermod -G nagioscmd [użytkownik serwera Apache] # usermod -G nagioscmd nagios

Następnie należy wejść do katalogu nagios-2.9 i uruchomić skrypt configure, wykorzystując opcje zaprezentowane poniżej. Następnie należy zainstalować program Nagios i narzędzia pomocnicze: $ cd nagios-2.9 $ ./configure --with-cgiurl=/nagios/cgi-bin --with-htmurl=/nagios \ --with-nagios-user=nagios --with-nagios-group=nagios \ --with-command-group=nagioscmd $ make all # make install # make install-init # make install-commandmode # make install-config

Następnie przechodzimy do katalogu nagios-plugins-1.4.8 i instalujemy wtyczki: # # # #

cd ../nagios-plugins-1.4.8 ./configure make make install

Wtyczki zostaną zainstalowane w katalogu /usr/local/nagios/libexec. Nagios nie uruchomi się do momentu utworzenia podstawowej konfiguracji roboczej. W tym momencie można przeglądać dokumentację HTML programu Nagios umieszczoną w katalogu /usr/local/nagios/share/index.html (rysunek 13.1). Pliki pomocy są dostępne do czytania nawet wtedy, gdy program Nagios nie jest uruchomiony. W następnej recepturze zaprezentowano sposób konfiguracji serwera Apache w celu serwowania stron programu Nagios. W przypadku konieczności ponownej kompilacji programu Nagios należy pamiętać o uruchomieniu polecenia make devclean w celu usunięcia pozostałych plików obiektowych i zainicjowania „świeżej” kompilacji.

Dyskusja W niewielkich sieciach można ograniczyć się do wykorzystania zainstalowanego serwera HTTP oraz kilku innych usług w celu uruchomienia programu Nagios, ale lepiej jest wykorzystać do tego celu dedykowany serwer HTTP i instalację Nagios.

398 |

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

Rysunek 13.1. Świeża instalacja programu Nagios

Wykonanie operacji zaprezentowanych w tej recepturze powoduje zainstalowanie podstawowego szkieletu programu Nagios. W przypadku instalacji z kodów źródłowych wszystkie komponenty aplikacji są umieszczane w katalogu /usr/local/nagios. Można oczywiście dostosować lokalizację plików do własnych potrzeb za pomocą opcji skryptu configure. Aby wyświetlić wszystkie dostępne opcje, należy uruchomić polecenie configure--help. Opcje instalacji programu Nagios w wersji 2.9 w większości nie wymagają wyjaśnień, z wyjątkiem poniższych dwóch: --with-cgiurl=

Definiuje katalog na serwerze WWW, gdzie będą umieszczone skrypty CGI programu Nagios CGI. --with-htmurl=

Definiuje adres URL aplikacji udostępniającej interfejs WWW programu Nagios. A oto objaśnienie opcji docelowych skryptu Makefile: make all; make install

Kompilacja i instalacja programu Nagios. make install-init

Instalacja skryptu startowego.

13.1. Instalacja programu Nagios z kodu źródłowego

| 399

make install-commandmode

Ustawienie odpowiednich uprawnień do plików. make install-config

Instalacja przykładowych plików konfiguracyjnych. Warto przejrzeć pliki INSTALLING i README w archiwum tarball programu Nagios oraz pliki INSTALL i REQUIREMENTS w archiwum nagios-plugins. Można tam znaleźć bieżące opcje i wymagania. Dokumentację w formacie HTML można znaleźć w pliku /usr/local/nagios/share.

Patrz także • Nagios.org: http://www.nagios.org/ • rozdział 8. „Zarządzanie użytkownikami i grupami” z książki Carli Schroder Linux. Recep-

tury (Helion, 2005) • rozdział 4. „Instalacja programów z kodu źródłowego” z książki Carli Schroder Linux. Re-

ceptury (Helion, 2005)

13.2. Konfigurowanie serwera Apache w celu wykorzystania go z programem Nagios Problem Dokumentację HTML programu Nagios można odczytać w lokalnej przeglądarce WWW lub w przeglądarce plików z obsługą HTML, na przykład Konqueror. Jednak serwer Apache nie widzi systemu Nagios. Do wykorzystania wszystkich funkcji programu Nagios oraz wyświetlenia wszystkich stron statusowych i poleceń jest potrzebna obsługa serwera Apache. W jaki sposób można skonfigurować serwer Apache?

Rozwiązanie Należy skorzystać z mechanizmów kontroli dostępu serwera Apache. Najpierw należy utworzyć hasło Apache dla użytkownika nagios: # cd /usr/local/nagios/etc/ # htpasswd -c htpasswd.users nagios New password: Re-type new password: Adding password for user nagios

Następnie należy w taki sposób skonfigurować właściciela i uprawnienia dostępu, aby prawo odczytu i zapisu pliku haseł miał tylko użytkownik HTTP: # chown użytkownik HTTP htpasswd.users # chmod 0600 htpasswd.users

W dystrybucji Fedora należy dodać poniższą dyrektywę do pliku /etc/httpd/conf/httpd.conf: Include /etc/httpd/conf.d

400 |

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

Następnie należy utworzyć plik /etc/httpd/conf.d/nagios. W dystrybucji Debian należy utworzyć plik /etc/apache2/conf.d/nagios. Do pliku należy dodać poniższe dyrektywy. W wierszu z opcją Allow from 192.168.1 należy wprowadzić adres podsieci odpowiedni do obowiązujących ustawień: ## conf.d/nagios ScriptAlias /nagios/cgi-bin /usr/local/nagios/sbin

Options ExecCGI AllowOverride None Order allow,deny HostnameLookups On Allow from localhost Allow from 127.0.0.1 Allow from 192.168.1. AuthName "Nagios Access" AuthType Basic AuthUserFile /usr/local/nagios/etc/htpasswd.users Require valid-user

Alias /nagios /usr/local/nagios/share

Options None AllowOverride None Order allow,deny HostnameLookups On Allow from localhost Allow from 127.0.0.1 Allow from 192.168.1. AuthName "Nagios Access" AuthType Basic AuthUserFile /usr/local/nagios/etc/htpasswd.users Require valid-user

Restartujemy serwer Apache. W dystrybucji Fedora w tym celu należy skorzystać z następującego polecenia: # /etc/init.d/httpd restart

Poniższe polecenie restartuje serwer Apache w dystrybucji Debian: # /etc/init.d/apache2 restart

W tym momencie w przeglądarce WWW na serwerze Nagios wystarczy wprowadzić poniższy adres: http://localhost/nagios

Powinno się wyświetlić okno logowania. Logujemy się z wykorzystaniem konta użytkownika nagios oraz hasła, które zdefiniowaliśmy przed chwilą. Wyświetli się strona z interfejsem programu Nagios podobna do tej, którą pokazano na rysunku 13.1 w poprzedniej recepturze. Równie dobrze można wpisać adres http://127.0.0.1/nagios oraz posłużyć się adresem IP i nazwą hosta serwera. Warto podjąć próbę logowania z sąsiedniego komputera PC, z wykorzystaniem adresu IP i nazwy hosta serwera Nagios. W tym momencie pomyślnie skonfigurowaliśmy korzystanie z programu Nagios w sieci LAN i zablokowaliśmy tę możliwość dla świata zewnętrznego.

13.2. Konfigurowanie serwera Apache w celu wykorzystania go z programem Nagios

|

401

Dyskusja Do działania programu nagios nie jest konieczny serwer Apache, wystarczy dowolny serwer HTTP. Należy rozważyć użycie serwera HTTP dedykowanego wyłącznie dla programu Nagios, bez innych usług. Dzięki temu uzyskamy lepszą wydajność, a zarządzanie systemem będzie łatwiejsze. Aby znaleźć nazwę użytkownika HTTP, można przeszukać główny plik konfiguracyjny serwera Apache. W dystrybucji Fedora należy skorzystać z poniższego polecenia: $ grep 'User ' /etc/httpd/conf/httpd.conf User apache

W Debianie należy skorzystać z następującego polecenia: $ grep 'User ' /etc/apache2/apache2.conf User www-data

Plikowi z hasłami (w naszej recepturze htpasswd.users) można nadać dowolną nazwę. Aby zdefiniować dodatkowych administratorów programu Nagios, można skorzystać z polecenia htpasswd bez opcji -c, ponieważ opcja -c oznacza „stwórz nowy plik”: # htpasswd /usr/local/nagios/etc/htpasswd.users admin-user2

W tym momencie serwer Nagios jeszcze nie działa. Można jedynie czytać podręcznik użytkownika. Kliknięcie łączy spowoduje wyświetlenie ekscytującego komunikatu o błędzie: „Whoops! Error: Could not open CGI config file '/usr/local/nagios/etc/cgi.cfg' for reading!” (Błąd, nie można otworzyć do odczytu pliku konfiguracyjnego CGI '/usr/local/nagios/etc/cgi.cfg'). W tym momencie nie został jeszcze skonfigurowany szkielet konfiguracji, a bez niego system Nagios nie będzie działał. Mechanizm prostego uwierzytelniania serwera Apache nie jest szczególnie silny. Hasła są zapisane w postaci zaszyfrowanej w pliku o formacie zwykłego tekstu, a cały ruch, razem z szyfrowanymi hasłami, jest przesyłany w postaci niezaszyfrowanej. Każdy użytkownik sieci LAN może podsłuchać zaszyfrowane hasło i próbować je złamać lub po prostu śledzić ruch danych. Z całą pewnością nie powinniśmy dopuścić do działania niezaszyfrowanych sesji programu Nagios w internecie. Prostym sposobem na dodanie szyfrowania jest tunelowanie sesji serwera Nagios z wykorzystaniem SSH. Sposób ten opisano w recepturze 13.14. Można również dodać obsługę SSL. W odróżnieniu od SSH nie wymaga to logowania się na serwerze Nagios. Aby się dowiedzieć, jak należy to zrobić, można sięgnąć do receptury 13.15.

Patrz także • podrozdział Setting up the web interface w lokalnej dokumentacji Nagios:

http://localhost/nagios • Nagios.org: http://www.nagios.org/ • rozdział 22. „Serwer WWW Apache” z książki Carli Schroder Linux. Receptury (Helion,

2005)

402 |

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

13.3. Organizacja plików konfiguracyjnych Nagios Problem Patrząc na przykładowe pliki konfiguracyjne w katalogu /usr/local/nagios/etc i studiując dokumentację, łatwo zauważyć, że posługiwanie się programem Nagios wymaga zarządzania wieloma wzajemnie zależnymi od siebie plikami. W jaki sposób można sensownie nimi zarządzać?

Rozwiązanie Najprostszym sposobem na sensowne zarządzanie plikami jest skorzystanie z pojedynczego katalogu do zapisania wszystkich plików konfiguracyjnych (z trzema wyjątkami, o których powiemy za chwilę). Następnie, w celu ich włączenia, należy skorzystać z opcji cfg_dir w pliku nagios.cfg zamiast opcji cfg_file. Użycie opcji cfg_dir oznacza „wykorzystaj wszystkie pliki z katalogu”. Dzięki temu można łatwo kontrolować pliki wykorzystywane przez system Nagios. Wystarczy je dodawać bądź usuwać. Jest to znacznie łatwiejszy sposób w porównaniu z wykorzystywaniem wielu indywidualnych opcji cfg_file. Oto domyślna zawartość katalogu /usr/local/nagios/etc po wykonaniu poprzednich receptur: $ cd /usr/local/nagios/ $ tree etc etc |-- cgi.cfg-sample |-- commands.cfg-sample |-- htpasswd.users |-- localhost.cfg-sample |-- nagios.cfg-sample '-- resource.cfg-sample |-|-|-|-|-|-'--

bigger.cfg-sample cgi.cfg-sample commands.cfg-sample minimal.cfg-sample misccommands.cfg-sample nagios.cfg-sample resource.cfg-sample

Oto zastosowany przeze mnie sposób organizacji tych plików: $ tree --dirsfirst etc etc |-- lan_objects | |-- commands.cfg | |-- contacts.cfg | |-- hosts.cfg | |-- commands.cfg | |-- services.cfg | '-- timeperiods.cfg |-- sample |-- |cgi.cfg-sample | |-- commands.cfg-sample | |-- localhost.cfg-sample | |-- nagios.cfg-sample | '-- resource.cfg-sample |-- cgi.cfg

13.3. Organizacja plików konfiguracyjnych Nagios

| 403

|-- htpasswd.users |-- nagios.cfg '-- resource.cfg

W jaki sposób stworzyć taką organizację? Najpierw należy przenieść wszystkie pliki przykładowe do katalogu sample/. Następnie należy wejść do katalogu sample/ i skopiować poniższe pliki do katalogów etc/ i lan_objects/: $ # # # # # # #

cd etc mkdir lan_objects mkdir sample mv *sample sample cd sample cp cgi.cfg-sample ../cgi.cfg cp resource.cfg-sample ../resource.cfg cp commands.cfg-sample ../lan_objects/commands.cfg

Pozostałe elementy konfiguracji utworzymy w miarę potrzeb w kilku kolejnych recepturach. W następnej recepturze pokazano, w jaki sposób uwzględnić nową organizację katalogów w konfiguracji Nagios oraz w jaki sposób zacząć monitorowanie lokalnego systemu.

Dyskusja Wszystkie pliki konfiguracyjne programu Nagios muszą mieć rozszerzenie .cfg. Do rozmieszczenia plików w podkatalogach można z powodzeniem użyć graficznego menedżera plików. Jest to sposób łatwiejszy i szybszy. Pliki cgi.cfg, nagios.cfg oraz resource.cfg są podstawowymi plikami konfiguracyjnymi systemu Nagios, dlatego nie należy umieszczać ich razem ze wszystkimi. Plik htpasswd.users musi być zapisany w tym samym katalogu co plik nagios.cfg. Pliki umieszczone w katalogu lan_object/ to tzw. pliki obiektowe. Obiekt Nagios reprezentuje jednostkę — na przykład hosta — a także polecenie, usługę, kontakt oraz grupy, do których one należą. Obiekty mogą być dziedziczone i wykorzystywane wielokrotnie, co upraszcza administrację.

Patrz także • man 1 tree • man 1 cp

13.4. Konfiguracja programu Nagios w celu monitorowania hosta localhost Problem Pomyślnie zainstalowaliśmy program Nagios, skonfigurowaliśmy serwer Apache i uporządkowaliśmy pliki konfiguracyjne w sposób opisany w poprzedniej recepturze. Czytanie lokalnej dokumentacji systemu Nagios umieszczonej w katalogu http://localhost/nagios jest miłe, ale teraz chcielibyśmy skonfigurować system Nagios, tak by zacząć monitorować sieć za jego pomocą. Jaki następny krok należy teraz wykonać? 404 |

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

Rozwiązanie Program Nagios najłatwiej konfiguruje się małymi krokami, dlatego rozpoczniemy od monitorowania pięciu podstawowych funkcji na serwerze Nagios: sygnałów ping, wykorzystania miejsca na dysku, lokalnych użytkowników, całkowitej liczby procesów oraz obciążenia procesora. Niniejsza receptura jest długa, ale kiedy z niej skorzystamy, będziemy dysponowali podstawowym szkieletem systemu Nagios. Pięć poniższych plików konfiguracyjnych należy skopiować dokładnie w takiej postaci, w jakiej pokazano je poniżej, poza miejscami, w których jawnie polecono użycie własnych danych oraz umieszczenie plików we wskazanych lokalizacjach, tak jak opisano to w poprzedniej recepturze: • /usr/local/nagios/etc/nagios.cfg; • /usr/local/nagios/etc/lan_objects/timeperiods.cfg; • /usr/local/nagios/etc/lan_objects/contacts.cfg; • /usr/local/nagios/etc/lan_objects/hosts.cfg; • /usr/local/nagios/etc/lan_objects/services.cfg.

Oczywiście przepisywanie poniższych plików konfiguracyjnych to dobry sposób na to, by oszaleć. W związku z tym pliki można pobrać pod adresem http://www.oreilly.com/catalog/ 9780596102487. Najpierw utworzymy plik nagios.cfg: ################ # nagios.cfg # główny plik konfiguracyjny programu Nagios ################ log_file=/usr/local/nagios/var/nagios.log cfg_dir=/usr/local/nagios/etc/lan_objects object_cache_file=/usr/local/nagios/var/objects.cache resource_file=/usr/local/nagios/etc/resource.cfg status_file=/usr/local/nagios/var/status.dat nagios_user=nagios nagios_group=nagios check_external_commands=1 command_check_interval=-1 command_file=/usr/local/nagios/var/rw/nagios.cmd comment_file=/usr/local/nagios/var/comments.dat downtime_file=/usr/local/nagios/var/downtime.dat lock_file=/usr/local/nagios/var/nagios.lock temp_file=/usr/local/nagios/var/nagios.tmp event_broker_options=-1 log_rotation_method=d log_archive_path=/usr/local/nagios/var/archives use_syslog=1 log_notifications=1 log_service_retries=1 log_host_retries=1 log_event_handlers=1 log_initial_states=0 log_external_commands=1 log_passive_checks=1

13.4. Konfiguracja programu Nagios w celu monitorowania hosta localhost

| 405

service_inter_check_delay_method=s max_service_check_spread=30 service_interleave_factor=s host_inter_check_delay_method=s max_host_check_spread=30 max_concurrent_checks=0 service_reaper_frequency=10 auto_reschedule_checks=0 auto_rescheduling_interval=30 auto_rescheduling_window=180 sleep_time=0.25 service_check_timeout=60 host_check_timeout=30 event_handler_timeout=30 notification_timeout=30 ocsp_timeout=5 perfdata_timeout=5 retain_state_information=1 state_retention_file=/usr/local/nagios/var/retention.dat retention_update_interval=60 use_retained_program_state=1 use_retained_scheduling_info=0 interval_length=60 use_aggressive_host_checking=0 execute_service_checks=1 accept_passive_service_checks=1 execute_host_checks=1 accept_passive_host_checks=1 enable_notifications=1 enable_event_handlers=1 process_performance_data=0 obsess_over_services=0 check_for_orphaned_services=0 check_service_freshness=1 service_freshness_check_interval=60 check_host_freshness=0 host_freshness_check_interval=60 aggregate_status_updates=1 status_update_interval=15 enable_flap_detection=0 low_service_flap_threshold=5.0 high_service_flap_threshold=20.0 low_host_flap_threshold=5.0 high_host_flap_threshold=20.0 date_format=us p1_file=/usr/local/nagios/bin/p1.pl illegal_object_name_chars='~!$%^&*|'"?,()= illegal_macro_output_chars='~$&|'" use_regexp_matching=0 use_true_regexp_matching=0 admin_email=nagios admin_pager=pagenagios daemon_dumps_core=0

406 |

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

Następnie utworzymy plik timeperiods.cfg: # Przedziały czasowe # Wszystkie czasy mają zastosowanie do # wszystkich testów i powiadomień. define timeperiod{ timeperiod_name alias sunday monday tuesday wednesday thursday friday saturday }

24x7 24 Hours A Day, 7 Days A Week 00:00-24:00 00:00-24:00 00:00-24:00 00:00-24:00 00:00-24:00 00:00-24:00 00:00-24:00

W dalszej kolejności utworzymy plik contacts.cfg. Atrybut contact_name musi określać użytkownika Nagios wraz z hasłem zdefiniowanym w pliku htpasswd.users oraz kontem e-mail: ################ # Kontakty — użytkownicy indywidualni i grupy ################ define contact{ contact_name alias service_notification_period host_notification_period service_notification_options host_notification_options service_notification_commands host_notification_commands email }

nagios Administrator Nagios 24x7 24x7 w,u,c,r d,r notify-by-email host-notify-by-email [email protected]

# Grupy kontaktów # Nagios komunikuje się wyłącznie z grupami kontaktów, a nie z użytkownikami indywidualnymi. # Ich członkowie muszą być użytkownikami serwera Nagios. Wartości atrybutów alias i contact_group # mogą być dowolne. define contactgroup{ contactgroup_name alias members }

administratorzy Administratorzy Nagios nagios

Następnie utworzymy plik hosts.cfg: ################ # Plik definicji hostów — indywidualne hosty i grupy hostów ################ # Ogólny szablon definicji hosta. To NIE jest rzeczywisty host, tylko szablon! define host{ name generic-host notifications_enabled 1 event_handler_enabled 1 flap_detection_enabled 1 failure_prediction_enabled 1 process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 ; NIE NALEŻY REJESTROWAĆ TEJ DEFINICJI. TO NIE JEST RZECZYWISTY HOST, A JEDYNIE SZABLON! register 0 }

13.4. Konfiguracja programu Nagios w celu monitorowania hosta localhost

|

407

# Definicja hosta lokalnego define host{ use generic-host host_name localhost alias Serwer Nagios address 127.0.0.1 check_command check-host-alive max_check_attempts 10 check_period 24x7 notification_interval 120 notification_period 24x7 notification_options d,r contact_groups administratorzy } ############## # Grupy hostów ############## # Każdy host musi należeć do grupy hostów. define hostgroup{ hostgroup_name alias members }

test Serwery testowe localhost

Na koniec utworzymy plik services.cfg: ################ # Usługi ################ # Ogólny szablon definicji usługi. To NIE jest rzeczywista usługa, tylko szablon! define service{ name generic-service active_checks_enabled 1 passive_checks_enabled 1 parallelize_check 1 obsess_over_service 1 check_freshness 0 notifications_enabled 1 event_handler_enabled 1 flap_detection_enabled 1 failure_prediction_enabled 1 process_perf_data 1 retain_status_information 1 retain_nonstatus_information 1 ; NIE NALEŻY REJESTROWAĆ TEJ DEFINICJI. TO NIE JEST RZECZYWISTA USŁUGA, A JEDYNIE SZABLON! register 0 } # Definicja usługi do wysyłania sygnału "ping" do lokalnej maszyny define service{ use host_name service_description is_volatile check_period max_check_attempts normal_check_interval retry_check_interval contact_groups

408 |

generic-service localhost PING 0 24x7 4 5 1 administratorzy

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

notification_options notification_interval notification_period check_command }

w,u,c,r 960 24x7 check_ping!100.0,20%!500.0,60%

# Definicja usługi, która sprawdza ilość dostępnego miejsca na dysku, na głównej partycji # komputera lokalnego. Ostrzeżenie w przypadku, gdy ilość wolnego miejsca < 20%, ostrzeżenie krytyczne, jeśli # ilość wolnego miejsca na partycji < 10% . define service{ use host_name service_description is_volatile check_period max_check_attempts normal_check_interval retry_check_interval contact_groups notification_options notification_interval notification_period check_command }

generic-service localhost Główna partycja 0 24x7 4 5 1 administratorzy w,u,c,r 960 24x7 check_local_disk!20%!10%!/

# Definicja usługi do sprawdzania liczby zalogowanych użytkowników na # lokalnym komputerze. Ostrzeżenie w przypadku, gdy liczba zalogowanych użytkowników > 20. Błąd krytyczny, jeśli # liczba zalogowanych użytkowników > 50. define service{ use host_name service_description is_volatile check_period max_check_attempts normal_check_interval retry_check_interval contact_groups notification_options notification_interval notification_period check_command }

generic-service localhost Zalogowani użytkownicy 0 24x7 4 5 1 administratorzy w,u,c,r 960 24x7 check_local_users!20!50

# Definicja usługi do sprawdzania liczby uruchomionych procesów na # komputerze lokalnym. Ostrzeżenie w przypadku, gdy liczba uruchomionych procesów > 250. Błąd krytyczny, jeśli # liczba uruchomionych procesów > 400. define service{ use generic-service host_name localhost service_description Całkowita liczba procesów is_volatile 0 check_period 24x7 max_check_attempts 4 normal_check_interval 5 retry_check_interval 1 contact_groups administratorzy notification_options w,u,c,r notification_interval 960 notification_period 24x7 check_command check_local_procs!250!400 }

13.4. Konfiguracja programu Nagios w celu monitorowania hosta localhost

| 409

# Definicja usługi sprawdzającej obciążenie komputera lokalnego. define service{ use host_name service_description is_volatile check_period max_check_attempts normal_check_interva retry_check_interval contact_groups notification_options notification_interval notification_period check_command }

generic-service localhost Bieżące obciążenie 0 24x7 4 5 1 administratorzy w,u,c,r 960 24x7 check_local_load!5.0,4.0,3.0!10.0,6.0,4.0

OK. Prawie skończyliśmy! Wskazujemy użytkownika nagios jako właściciela wszystkich plików w katalogu lan_objects/ i nadajemy mu do nich uprawnienia zapisu: # chown nagios:nagios /usr/local/nagios/etc/lan_objects/* # chmod 0644 /usr/local/nagios/etc/lan_objects/*

Dostosowujemy ustawienia własności plików i tryby w sposób pokazany poniżej: # # # # # #

chown chmod chown chmod chown chmod

nagios:nagios /usr/local/nagios/etc/nagios.cfg 0644 /usr/local/nagios/etc/nagios.cfg nagios:nagios /usr/local/nagios/etc/resource.cfg 0600 /usr/local/nagios/etc/resource.cfg nagios:nagios /usr/local/nagios/etc/cgi.cfg 0644 /usr/local/nagios/etc/cgi.cfg

Teraz można uruchomić mechanizm sprawdzania składni systemu Nagios. Do tego celu potrzebne są uprawnienia użytkownika root: # /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg

Wyświetli się szereg komunikatów, zakończonych następującymi wierszami: Total Warnings: 0 Total Errors: 0 Things look okay - No serious problems were detected during the pre-flight check

W przypadku wystąpienia błędów komunikaty o błędach będą zawierały instrukcje dotyczące tego, co należy poprawić. Jeśli nie będzie błędów, można uruchomić demona Nagios: # /etc/init.d/nagios start

Można się teraz zalogować do interfejsu Nagios w przeglądarce WWW pod adresem http:// localhost/nagios oraz zacząć klikać różne łącza na lewym pasku nawigacji. Strona Service Detail powinna mieć postać pokazaną na rysunku 13.2. Oznacza to, że udało się nam prawidłowo skonfigurować system Nagios do monitorowania hosta localhost. Gratulacje!

Dyskusja Pliki konfiguracyjne programu Nagios mogą mieć dowolne pliki, pod warunkiem, że będą miały rozszerzenie .cfg — to jest obowiązkowe.

410

|

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

Rysunek 13.2. Strona Service Detail w świeżej instalacji systemu Nagios

W tym momencie nie mamy jeszcze dostępu do wszystkich stron, do których prowadzą łącza w obrębie interfejsu WWW systemu Nagios. W przypadku niektórych wyświetli się komunikat It appears as though you do not have permission to view the information you requested…1. Przyczyną jest brak ustawień prawidłowych uprawnień CGI. Sposób ich ustawienia opisano w następnej recepturze. Przy pierwszej próbie uruchomienia system Nagios w moim komputerze nie był w stanie przeprowadzić testu całkowitej liczby uruchomionych procesów. Komunikat o błędzie miał następującą postać: check_procs: Unknown argument—(null). Oznacza to, że nieprawidłowa była jedna z opcji w definicji poleceń (commands.cfg) albo definicja usług (services.cfg). Skorzystałam z plików domyślnych, zatem istnieje prawdopodobieństwo, że czytelnicy, którzy dokładnie wykonywali wszystkie polecenia, napotkają na taki sam błąd. W wyniku krótkiej analizy zawartości obu plików odkryłam w nich niezgodność: # commands.cfg # definicja polecenia 'check_local_procs' define command{ command_name check_local_procs command_line $USER1$/check_procs -w $ARG1$ -c $ARG2$ -s $ARG3$ }

1

Wydaje się, że nie masz uprawnień do przeglądania informacji, których zażądałeś — przyp. tłum. 13.4. Konfiguracja programu Nagios w celu monitorowania hosta localhost

|

411

# services.cfg define service{ use host_name service_description

check_command }

generic-service localhost Całkowita liczba procesów check_local_procs!250!400!

Porównajmy ustawienia atrybutów command_line oraz check_command. Polecenie check_local_procs oczekuje trzech argumentów, natomiast w definicji usługi check_local_procs!250! 400! zdefiniowano tylko dwa. Ponieważ chcę jedynie śledzić całkowitą liczbę uruchomionych procesów, pierwsze dwa argumenty wystarczą. Usunięcie opcji -s $ARG3$ i zrestartowanie systemu Nagios naprawiło problem. Kiedy całkowita liczba uruchomionych procesów osiągnie 250, Nagios wysyła ostrzeżenie. W przypadku gdy liczba ta osiągnie wartość 400, generowany jest błąd krytyczny. Znaki wykrzykników wykorzystano do oddzielenia od siebie dwóch wartości progowych. Nie mają one żadnego szczególnego znaczenia.

Patrz także • lokalna dokumentacja systemu Nagios: http://localhost/nagios • definicje opcji w plikach definicji obiektów — są to wszystkie pliki umieszczone w kata-

logu lan_objects/ — można znaleźć w rozdziale „Template-Based Object Configuration”: http://localhost/nagios/docs/xodtemplate.html • definicje opcji z plików nagios.cfg i resources.cfg opisano w rozdziale „Main Configuration

File Options”: http://localhost/nagios/docs/configmain.html • opcje z pliku cgi.cfg opisano w rozdziałach „CGI Configuration File Options” (http://localhost/

nagios/docs/configcgi.html) oraz „Authentication And Authorization In The CGIs” (http:// localhost/nagios/docs/cgiauth.html) • Nagios.org: http://www.nagios.org/

13.5. Konfiguracja uprawnień CGI w celu uzyskania pełnego dostępu do własności systemu Nagios za pośrednictwem interfejsu w przeglądarce 13.5. Konfiguracja uprawnień CGI w celu uzyskania pełnego dostępu do własności systemu Nagios

Problem Wykonaliśmy wszystkie czynności opisane we wcześniejszych recepturach, ale po zalogowaniu do interfejsu WWW systemu Nagios nie możemy uzyskać dostępu do wszystkich stron. Zamiast dostępu do funkcji wyświetla się następujący komunikat o błędzie: It appears as though you do not have permission to view information you requested…. Jeśli wydaje nam się, że to błąd, powinniśmy sprawdzić wymagania uwierzytelniania serwera HTTP dotyczące dostępu do tego skryptu CGI i sprawdzić opcje autoryzacji w pliku konfiguracyjnym CGI. W jaki sposób można poradzić sobie z tą sytuacją?

412

|

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

Rozwiązanie Należy usunąć komentarz z poniższych wierszy w pliku /usr/local/nagios/etc/cgi.cfg. Trzeba się również upewnić, czy w opcjach wprowadzono właściwą nazwę użytkownika Nagios — w przykładzie zaprezentowanym w tym rozdziale jest to użytkownik nagios: authorized_for_all_services=nagios authorized_for_all_hosts=nagios authorized_for_system_commands=nagios authorized_for_configuration_information=nagios authorized_for_all_service_commands=nagios authorized_for_all_host_commands=nagios

Należy się upewnić, że usunięto komentarz w wierszu zamieszczonym poniżej oraz że dla tego argumentu ustawiono wartość 1: use_authentication=1

Przy tym ustawieniu uwierzytelnianie trzeba stosować dla wszystkich skryptów CGI. Wyłączenie tej opcji otwiera olbrzymią lukę w zabezpieczeniach. Na przykład każda osoba mająca dostęp do naszej sieci LAN będzie mogła zapisywać dowolne informacje w pliku poleceń. Zapisujemy zmiany i próbujemy jeszcze raz. W tym momencie użytkownik nagios powinien mieć pełny dostęp do wszystkich stron dostępnych za pośrednictwem interfejsu WWW systemu Nagios, a także uprawnienia do uruchamiania poleceń.

Dyskusja Na końcu pliku konfiguracyjnego można uaktywnić ostrzeżenia dźwiękowe, jeśli zachodzi taka potrzeba. Systemem Nagios lepiej administrować z wykorzystaniem konta nieuprzywilejowanego użytkownika. Nie należy do tego celu używać konta root. Można zdefiniować dodatkowych uprawnionych użytkowników. W tym celu należy umieścić ich nazwy na liście i oddzielić od siebie przecinkami. Zaprezentowane własności kontroli dostępu nie są zbyt szczegółowe, ale wprowadzają nieco więcej uniwersalności. Każdego użytkownika systemu Nagios trzeba dodać do pliku htpasswd.users. Sposób wykonania tej operacji opisano w następnej recepturze. Oto kompletny przykładowy plik cgi.cfg: # Przykładowy plik cgi.cfg, który nadaje pełne uprawnienia administracyjne # użytkownikowi 'nagios'. main_config_file=/usr/local/nagios/etc/nagios.cfg physical_html_path=/usr/local/nagios/share url_html_path=/nagios show_context_help=0 use_authentication=1 authorized_for_system_information=nagios authorized_for_configuration_information=nagios authorized_for_system_commands=nagios authorized_for_all_services=nagios authorized_for_all_hosts=nagios authorized_for_all_service_commands=nagios authorized_for_all_host_commands=nagios default_statusmap_layout=5 default_statuswrl_layout=4 ping_syntax=/bin/ping -n -U -c 5 $HOSTADDRESS$ refresh_rate=90

13.5. Konfiguracja uprawnień CGI w celu uzyskania pełnego dostępu do własności systemu Nagios

|

413

Patrz także • dokumentacja lokalna; rozdziały„Configuring authorization for the CGIs” (http://localhost/

nagios/docs/cgiauth.html) oraz „CGI Configuration File Options” (http://localhost/nagios/docs/ configcgi.html) • Nagios.org: http://www.nagios.org/

13.6. Uruchamianie systemu Nagios przy starcie systemu Problem Podczas instalacji systemu Nagios zostały utworzone skrypty do uruchamiania i zatrzymywania systemu w katalogu /etc/init.d. System Nagios nie uruchamia się jednak automatycznie w momencie rozruchu systemu, tak jakbyśmy sobie tego życzyli.

Rozwiązanie Własność tę trzeba skonfigurować samodzielnie. W dystrybucji Fedora należy skorzystać z polecenia chkconfig: # chkconfig --level 2345 nagios on # chkconfig --level 016 nagios off

Aby potwierdzić, czy ustawienie działa, należy skorzystać z następującego polecenia: # chkconfig --list nagios nagios 0:off 1:off 2:on 3:on 4: on 5: on 6:off

W dystrybucji Debian należy skorzystać ze skryptu update-rc.d: # update-rc.d nagios start 99 2 3 4 5 . stop 01 0 1 6 .

Dyskusja Oba te polecenia powodują uruchomienie systemu Nagios na poziomach startu 2., 3., 4. i 5. oraz jego zatrzymanie na poziomach startu 0., 1. i 6. Priorytet uruchomienia dla Debiana wynosi 99, natomiast priorytet zatrzymania ma wartość 01. A zatem system ma niski priorytet startu i wysoki zatrzymania. Nagios jest ważną usługą systemową, dlatego użyte priorytety są właściwe. Oczywiście można je dostosować do własnych potrzeb.

Patrz także • rozdział 7. „Uruchamianie i zamykanie systemu Linux” z książki Carli Schroder Linux.

Receptury (Helion, 2005)

414

|

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

13.7. Definiowanie dodatkowych użytkowników systemu Nagios Problem Nie chcemy wyłącznie sami zajmować się administracją systemu Nagios. Chcemy zdefiniować kilka kont dla młodszych administratorów, którzy pomogą nam wykonywać te zadania.

Rozwiązanie Nowi administratorzy muszą mieć konta systemowe na serwerze Nagios oraz zdefiniowane hasła w pliku htpasswd.users: # useradd -m -G nagioscmd admin2 # passwd admin2 # htpasswd /usr/local/nagios/etc/htpasswd.users admin2

Następnie w pliku cgi.cfg należy skonfigurować dostęp do wskazanych własności systemu Nagios, wykorzystując listy rozdzielone przecinkami, tak jak pokazano w poniższym przykładzie: authorized_for_all_services=nagios,admin2 authorized_for_all_hosts=nagios,admin2

Restartujemy system Nagios w celu uaktywnienia zmian: # /etc/init.d/nagios restart

Dyskusja W grupie nagios nie powinno być żadnych innych użytkowników poza użytkownikiem nagios. Poniższe opcje kontroli dostępu nie są zbyt szczegółowe, ale pozwalają na ograniczenie uprawnień naszych podwładnych: authorized_for_system_information

Prawo do przeglądania informacji dotyczących procesów Nagios. authorized_for_configuration_information

Przeglądanie wszystkich informacji konfiguracyjnych — zarówno dla hostów, jak i poleceń. authorized_for_system_commands

Zamykanie, restartowanie i przełączanie systemu Nagios w stan czuwania. authorized_for_all_services, authorized_for_all_hosts

Przeglądanie informacji dla wszystkich hostów i usług. Domyślnie użytkownicy systemu Nagios mogą tylko przeglądać hosty lub usługi, dla których wymieniono ich jako osoby kontaktowe. authorized_for_all_service_commands, authorized_for_all_host_commands

Prawo do wydawania poleceń związanych z usługami bądź hostami. Domyślnie użytkownicy systemu Nagios mogą tylko uruchamiać polecenia dla hostów lub usług, dla których wymieniono ich jako osoby kontaktowe.

13.7. Definiowanie dodatkowych użytkowników systemu Nagios

|

415

Patrz także • rozdział „CGI Configuration File Options”: http://localhost/nagios/docs/configcgi.html • rozdział „Authentication And Authorization In The CGIs”:

http://localhost/nagios/docs/cgiauth.html • Nagios.org: http://www.nagios.org/

13.8. Przyspieszanie systemu Nagios za pomocą polecenia check_icmp Problem Widzieliśmy na jakimś forum lub liście mailingowej dotyczącej systemu Nagios, że należy korzystać z wtyczki check_icmp zamiast check_ping, ponieważ jest szybsza i zapewnia lepszą wydajność. Spróbowaliśmy z niej skorzystać, ale uruchomienie zakończyło się niepowodzeniem. Wyświetlił się następujący komunikat o błędzie: check_icmp: Failed to obtain ICMP socket: Operation not permitted2. To nie wygląda na poprawienie działania systemu — co należy teraz zrobić?

Rozwiązanie Wtyczka check_icmp do działania wymaga uprawnień użytkownika root. W związku z tym należy ustawić dla tego narzędzia bit SUID, aby można było je uruchomić z poziomu nieuprzywilejowanego użytkownika, po podaniu hasła do konta root. Najpierw w plikach konfiguracyjnych należy zastąpić wszystkie wystąpienia polecenia check_ ping poleceniem check_icmp. Do ich wyszukania można skorzystać z polecenia grep: # grep -r check_ping /usr/local/nagios/etc/

Następnie należy ustawić bit SUID dla polecenia check_icmp i dodać je do grupy nagios: # cd /usr/local/nagios/libexec # chown root:nagios check_icmp # chmod 4711 check_icmp

Teraz polecenie powinno działać bez zarzutu.

Dyskusja Polecenie check_ping wywołuje zewnętrzny program /bin/ping, natomiast check_icmp to wewnętrzne polecenie systemu Nagios. System Nagios intensywnie wykorzystuje żądania i odpowiedzi echo ICMP, dlatego zamiana ta przyczyni się do znacznej poprawy wydajności.

2

Próba dostępu do gniazda ICMP nie powiodła się. Operacja niedozwolona — przyp. tłum.

416

|

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

Patrz także • lista często zadawanych pytań (FAQ) w drzewie źródłowym nagios-plugins oraz pliki

README i REQUIREMENTS • rozdział 8. „Zarządzanie użytkownikami i grupami” z książki Carli Schroder Linux. Recep-

tury (Helion, 2005)

13.9. Monitorowanie SSHD Problem Wykorzystujemy demona SSH na wszystkich serwerach do bezpiecznej, zdalnej administracji. W związku z tym chcemy wykorzystać system Nagios do monitorowania SSH i generowania ostrzeżeń w przypadku, gdy przestanie być dostępny. Chcemy mieć również możliwość łatwego dodawania nowych serwerów w celach monitorowania.

Rozwiązanie Rozpoczniemy od skonfigurowania monitorowania dla jednego serwera. Utworzymy definicje polecenia, hosta i usługi poprzez modyfikację plików commands.cfg, hosts.cfg i services.cfg. Następnie będziemy mogli dodawać nowe serwery poprzez tworzenie nowych definicji hosta oraz dodawanie nazw serwerów do definicji usługi. Domyślny plik commands.cfg nie zawiera definicji polecenia dla SSH. W związku z tym dodamy poniższe definicje do pliku commands.cfg: # Definicja polecenia 'check_ssh' define command{ command_name check_ssh command_line $USER1$/check_ssh -H $HOSTADDRESS$ }

Następnie dodamy definicję hosta do pliku hosts.cfg, posługując się własną nazwą hosta i adresem IP: # Serwery SSH define host{ use host_name alias address check_command max_check_attempts check_period notification_interval notification_period notification_options contact_groups }

generic-host serwer1 serwer rezerwowy 192.168.1.25 check-host-alive 10 24x7 120 24x7 d,r administratorzy

Dodajemy nowy serwer do istniejącej grupy lub tworzymy dla niego nową grupę, tak jak pokazano w przykładzie:

13.9. Monitorowanie SSHD

|

417

define hostgroup{ hostgroup_name alias members }

inne_serwery Serwery serwer1

Teraz można zdefiniować usługę SSH w pliku services.cfg: # Definicja usługi do monitorowania SSH define service{ use host_name service_description is_volatile check_period max_check_attempts normal_check_interval retry_check_interval contact_groups notification_options notification_interval notification_period check_command }

generic-service serwer1 SSH 0 24x7 4 5 1 administratorzy w,u,c,r 960 24x7 check_ssh

Uruchamiamy narzędzie do sprawdzania składni, a następnie restartujemy system Nagios: # /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg # /etc/init.d/nagios restart

Wystarczy odświeżyć stronę z interfejsem systemu Nagios w przeglądarce, aby zobaczyć status nowego wpisu wyświetlony jako PENDING. W ciągu kilku minut Nagios uruchomi nowy test usługi. Zamiast statusu PENDING będą się wyświetlały informacje na temat stanu usługi. Jeśli ktoś nie chce czekać, może wybrać polecenie Service Detail/SSH/Reschedule Next Service Check i natychmiast uruchomić test.

Dyskusja Jeśli korzystamy z innego portu niż 22, powinniśmy skorzystać z opcji -p w celu wskazania właściwego portu. Niniejszą recepturę można wykorzystać jako szablon typu wytnij-i-wklej dla większości usług. Informacje o dostępnych wtyczkach można znaleźć w pliku /usr/lib/nagios/libexec. Aby wyświetlić dostępne opcje, należy uruchomić polecenie [nazwa_wtyczki]--help. W definicjach hostów i usług jest kilka obowiązkowych pól. Więcej informacji na ich temat można znaleźć w rozdziale Template-Based Object Configuration (http://localhost/nagios/docs/ xodtemplate.html) w lokalnej dokumentacji systemu Nagios.

Definicje poleceń W definicji polecenia check_ssh zaprezentowano najprostszą postać definicji polecenia systemu Nagios. W definicjach wszystkich poleceń systemu Nagios trzeba umieścić nazwę_polecenia oraz wiersz_polecenia. Argument nazwa_polecenia może być dowolnym ciągiem znaków. Argument wiersz_polecenia musi określać nazwę wtyczki razem z opcjami. $USER1$ to specjalne makro zdefiniowane w pliku resource.cfg. Jest to skrót ścieżki do wtyczki. Można zdefiniować do 32 makr $USERx$. Nagios automatycznie rozwija makro przed uru418

|

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

chomieniem polecenia. W makrach $USERx$ można również zapisywać hasła i nazwy użytkowników. Jest to interesujący skrót w przypadku, gdy zarządzamy złożonymi grupami plików konfiguracyjnych. Opcja -H oznacza nazwę hosta lub adres, z kolei $HOSTADDRESS$ to wbudowane makro, które pobiera adres IP z definicji hosta. Razem z makrem $HOSTNAME$ można używać nazw hostów, ale wyszukiwanie DNS w operacjach monitorowania może spowolnić ten proces, a ponadto stwarza okazję do powstania awarii. Aby uzyskać pomoc i wyświetlić dostępne opcje, można uruchomić wtyczkę z wiersza poleceń: root@xena:/usr/local/nagios/libexec# ./check_ssh -h

Większość wtyczek zawiera opcje -h lub --help. Najlepiej jest korzystać z ogólnych definicji poleceń z wykorzystaniem makr oraz używać jawnych wartości w definicjach usług.

Definicje hostów Dla każdego hosta należy stworzyć definicję. Definicje hostów informują system Nagios o tym, gdzie można znaleźć serwery, oraz definiują podstawowe działania związane z monitorowaniem i ostrzeganiem. Polecenie check_command check-host-alive to specjalne polecenie ping. Jest wykorzystywane tylko wtedy, gdy inne usługi na hoście nie odpowiadają. System Nagios wie, że jeśli usługi są uruchomione, to nie ma potrzeby wysyłania polecenia ping do hosta w celu sprawdzenia, czy odpowiada. Opcja notification_options d,r oznacza polecenia wysłania powiadomienia w przypadku, gdy host jest wyłączony lub został odtworzony ze stanu wyłączenia i teraz działa poprawnie. Oto inne opcje, które można wykorzystać: u

Wysyłanie powiadomień na temat stanu nieosiągalności. f

Wysyłanie powiadomień w przypadku, gdy host zaczyna trzepotanie — tzn. gwałtowne zmiany stanu. n

Wyłączenie wysyłania powiadomień.

Definicje usług Są podobne do definicji hostów z jedną istotną różnicą: usługi można wykorzystywać wielokrotnie. Po utworzeniu definicji usługi można dodawać do niej nowe hosty. Nie trzeba tworzyć nowej definicji usługi za każdym razem, kiedy występuje potrzeba dodania nowej maszyny. Wystarczy dodać więcej serwerów w wierszu host_name na liście rozdzielanej przecinkami: host_name

stinkpad,uberpc,xena

Można również skorzystać z innej możliwości — utworzyć grupę hostów dla serwerów, a następnie skorzystać z dyrektywy hostgroup_name: hostgroup_name

serwery_rezerwowe

Wartości atrybutu notification_options (opcje powiadomień) są nieco inne:

13.9. Monitorowanie SSHD

|

419

w

Wysyłanie powiadomień na temat stanu ostrzeżenia. u

Wysyłanie powiadomień na temat nieznanego stanu. c

Wysyłanie powiadomień na temat stanu krytycznego. r

Wysyłanie powiadomień na temat odtwarzania. f

Wysyłanie powiadomień, kiedy serwer zacznie lub przestanie trzepotać.

Patrz także • w rozdziale „Using Macros In Commands” (http://localhost/nagios/docs/macros.html) w lo-

kalnej dokumentacji systemu Nagios można znaleźć listę wbudowanych makr • definicje opcji w plikach definicji obiektów — są to wszystkie pliki umieszczone w kata-

logu lan_objects/ — można znaleźć w rozdziale „Template-Based Object Configuration”: http://localhost/nagios/docs/xodtemplate.html • definicje opcji z plików nagios.cfg i resources.cfg opisano w rozdziale „Main Configuration

File Options”: http://localhost/nagios/docs/configmain.html • rozdział „Flapping”: http://localhost/nagios/docs/flapping.html • Nagios.org: http://www.nagios.org/

13.10. Monitorowanie serwera WWW Problem Mamy serwer WWW i chcielibyśmy wykorzystać system Nagios do jego monitorowania. Chcemy mieć pewność, że serwer funkcjonuje oraz że działają protokoły HTTP i SSH. Jeśli jedna z usług zatrzyma się lub serwer przestanie działać, chcemy uzyskać powiadomienie.

Rozwiązanie Należy utworzyć nową definicję hosta dla serwera oraz definicję usługi HTTP. Następnie należy dodać nowy serwer do istniejącej definicji usługi SSH (patrz poprzednia procedura). Po wykonaniu tych czynności wystarczy zrestartować Nagios. Poniżej zamieszczono przykładową definicję hosta w pliku hosts.cfg. Wykorzystano w niej hosta o nazwie apache1 i adresie IP 192.168.1.26. Oczywiście należy wprowadzić własną nazwę hosta i adres IP: # Serwery HTTP define host{ use host_name alias

420 |

generic-host apache1 Serwer WWW Apache

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

address check_command max_check_attempts check_period notification_interval notification_period notification_options contact_groups }

192.168.1.26 check-host-alive 10 24x7 120 24x7 d,r administratorzy

Dodajemy nowy serwer do istniejącej grupy i tworzymy dla niego nową grupę, tak jak pokazano w przykładzie: define hostgroup{ hostgroup_name alias members }

serwery_apache Serwery WWW apache1

Następnie definiujemy usługę HTTP w pliku services.cfg: # Definicja usługi do monitorowania HTTP define service{ use host_name service_description is_volatile check_period max_check_attempts normal_check_interval retry_check_interval contact_groups notification_options notification_interval notification_period check_command }

generic-service apache1 HTTP 0 24x7 4 5 1 administratorzy w,u,c,r 960 24x7 check_http

Dodajemy nową usługę do definicji usługi SSH: # Definicja usługi do monitorowania SSH define service{ use host_name service_description is_volatile check_period max_check_attempts normal_check_interval retry_check_interval contact_groups notification_options notification_interval notification_period check_command }

generic-service serwer1,apache1 SSH 0 24x7 4 5 1 administratorzy w,u,c,r 960 24x7 check_ssh

Uruchamiamy narzędzie do sprawdzania składni, a następnie restartujemy system Nagios: # /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg # /etc/init.d/nagios restart

Odświeżamy aplikację sterującą systemem Nagios w przeglądarce WWW. Wyświetlą się nowe pozycje o statusie PENDING, tak jak pokazano na rysunku 13.3.

13.10. Monitorowanie serwera WWW

|

421

Rysunek 13.3. Nowe testy oczekujących usług

W ciągu kilku minut Nagios uruchomi nowy test usługi. Zamiast statusu PENDING będą się wyświetlały informacje na temat stanu usługi.

Dyskusja Do polecenia check_http można przekazać wiele opcji. Polecenie sprawdza zwykłe połączenia (HTTP) i bezpieczne (HTTPS) oraz informuje, czy certyfikaty SSL są aktualne. Można je najpierw przetestować w wierszu polecenia. To polecenie wyświetla dostępne opcje: root@xena:/usr/local/nagios/libexec# ./check_http -h

Aby uzyskać 30-dniowe powiadomienie o utracie ważności certyfikatów SSL, można skorzystać z polecenia o następującej postaci: # ./check_http www.twojadomena.com -C 30

Opcja -p pozwala na podanie numeru portu w przypadku, gdy korzystamy z portu o niestandardowym numerze: # ./check_http www.yourdomain.com -p 8080

Za pomocą opcji -w oraz -c można testować czas odpowiedzi w sekundach: # ./check_http -w 5 -c 10

Poniższe polecenie generuje ostrzeżenie przy braku odpowiedzi po 5 sekundach oraz błąd krytyczny po 10 sekundach. Aby nawiązać połączenie z serwerami obsługującymi protokół SSL, można skorzystać z opcji -ssl: # ./check_http --ssl www.twojadomena.com

Po wstępnym skonfigurowaniu szkieletu Nagios dodawanie nowych serwerów i usług jest dość proste. Wystarczy skopiować i wkleić istniejące wpisy i zmodyfikować je na potrzeby nowych hostów i usług. Za pomocą opcji hostgroups można w prosty sposób zarządzać grupami powiązanych ze sobą serwerów. W pliku services.cfg należy skorzystać z opcji hostgroup_name zamiast host_ name i dodać lub usunąć serwery z grupy hostów hostgroup. 422

|

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

Patrz także • w rozdziale „Using Macros In Commands” (http://localhost/nagios/docs/macros.html) w lo-

kalnej dokumentacji systemu Nagios można znaleźć listę wbudowanych makr • definicje opcji w plikach definicji obiektów — są to wszystkie pliki umieszczone w kata-

logu lan_objects/ — można znaleźć w rozdziale „Template-Based Object Configuration”: http://localhost/nagios/docs/xodtemplate.html • definicje opcji z plików nagios.cfg i resources.cfg opisano w rozdziale „Main Configuration

File Options”: http://localhost/nagios/docs/configmain.html • rozdział „Flapping”: http://localhost/nagios/docs/flapping.html • Nagios.org: http://www.nagios.org/

13.11. Monitorowanie serwera pocztowego Problem Chcemy się dowiedzieć, w jaki sposób skonfigurować system Nagios w celu monitorowania serwera pocztowego. Chcemy, aby były monitorowane usługi SMTP, POP, SSH i IMAP.

Rozwiązanie Należy dodać nowe definicje hostów i usług do plików hosts.cfg i services.cfg. Mogą się również przydać niektóre nowe definicje poleceń w pliku commands.cfg. Najpierw trzeba zapewnić, aby w pliku commands.cfg znalazły się poniższe wpisy: # definicja polecenia 'check_pop' define command{ command_name check_pop command_line $USER1$/check_pop -H $HOSTADDRESS$ } # definicja polecenia 'check_smtp' define command{ command_name check_smtp command_line $USER1$/check_smtp -H $HOSTADDRESS$ } # definicja polecenia 'check_imap' define command{ command_name check_imap command_line $USER1$/check_imap -H $HOSTADDRESS$ } # definicja polecenia 'check_ssh' define command{ command_name check_ssh command_line $USER1$/check_ssh -H $HOSTADDRESS$ }

Następnie należy utworzyć definicję hosta dla serwera:

13.11. Monitorowanie serwera pocztowego

| 423

# definicja hosta dla serwera pocztowego define host{ use host_name alias address check_command max_check_attempts check_period notification_interval notification_period notification_options contact_groups }

generic-host postfix1 serwer pocztowy nr 1 192.168.1.27 check-host-alive 10 24x7 120 24x7 d,r administratorzy

Dodajemy nowy serwer do istniejącej grupy lub tworzymy dla niego nową grupę, tak jak pokazano w przykładzie: define hostgroup{ hostgroup_name alias members }

serwery_pocztowe Serwery pocztowe postfix1

Następnie w pliku services.cfg definiujemy cztery usługi (POP, IMAP, SMTP i SSH). Każda usługa wymaga oddzielnej definicji. Łatwy sposób wykonania tej czynności polega na skopiowaniu i wklejeniu poniższego przykładu. Należy jedynie zastąpić wartości atrybutów hostname, service_description oraz check_command: # Definicja usługi do monitorowania protokołów POP/SMTP/IMAP/SSH define service{ use generic-service host_name postfix1 service_description POP is_volatile 0 check_period 24x7 max_check_attempts 4 normal_check_interval 5 retry_check_interval 1 contact_groups administratorzy notification_options w,u,c,r notification_interval 960 notification_period 24x7 check_command check_pop }

Jeśli dowolna z tych usług była zdefiniowana wcześniej, to jedyną czynnością, jaka pozostaje do wykonania, jest dodanie nazw hostów lub grup hostów do istniejącej definicji usługi: host_name

postfix1,postfix2,exim1

lub: hostgroup_name

serwery_pocztowe

Uruchamiamy narzędzie do sprawdzania składni, a następnie restartujemy system Nagios: # /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg # /etc/init.d/nagios restart

Odświeżamy stronę z interfejsem systemu Nagios w przeglądarce. Wyświetlą się nowe pozycje o statusie PENDING. W ciągu kilku minut Nagios uruchomi nowe testy usług. Zamiast statusu PENDING będą się wyświetlały informacje na temat stanu tych usług.

424 |

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

Dyskusja Wielokrotne wykorzystywanie fragmentów konfiguracji jest kluczem do sensownego posługiwania się tym programem. Należy pamiętać, że: Plik commands.cfg zawiera definicje poleceń. Każdą definicję polecenia można utworzyć tylko raz. Każdy nowy host wymaga własnej definicji w pliku hosts.cfg. Definicje usług tworzy się raz dla każdej usługi w pliku services.cfg. Później wystarczy dodać nowe pozycje host_name lub hostgroup_name. Wykorzystanie grup hostów to jeden ze sposobów organizowania powiązanych ze sobą serwerów. Innym sposobem jest wykorzystanie grup usług. Grupy usług pozwalają na grupowanie powiązanych ze sobą usług w środowisku interfejsu WWW systemu Nagios. Sposób korzystania z tej własności opisano w następnej recepturze.

Patrz także • w rozdziale „Using Macros In Commands” (http://localhost/nagios/docs/macros.html) w lo-

kalnej dokumentacji systemu Nagios można znaleźć listę wbudowanych makr • definicje opcji w plikach definicji obiektów — są to wszystkie pliki umieszczone w kata-

logu lan_objects/ — można znaleźć w rozdziale „Template-Based Object Configuration”: http://localhost/nagios/docs/xodtemplate.html • definicje opcji z plików nagios.cfg i resources.cfg opisano w rozdziale „Main Configuration

File Options”: http://localhost/nagios/docs/configmain.html

• rozdział „Flapping”: http://localhost/nagios/docs/flapping.html • Nagios.org: http://www.nagios.org/

13.12. Wykorzystanie grup usług do grupowania usług powiązanych ze sobą Problem Na niektórych serwerach działa wiele usług. Chcemy, aby w środowisku interfejsu WWW systemu Nagios powiązane ze sobą usługi wyświetlały się razem (na przykład SSH, FTP, HTTP oraz dowolne inne działające na wielu serwerach).

Rozwiązanie Można utworzyć grupy usług. W ten sposób można grupować ze sobą dowolne kombinacje hostów lub usług. Oto przykład grupy usług (servicegroup) dla SSH: # grupa usług ssh define servicegroup{ servicegroup_name alias members }

ssh wszystkie serwery ssh uberpc,SSH,stinkpad,SSH

13.12. Wykorzystanie grup usług do grupowania usług powiązanych ze sobą

| 425

Usługi należące do grupy usług muszą być wcześniej zdefiniowane w pliku services.cfg. Można grupować ze sobą dowolne kombinacje par host-usługa. Po zdefiniowaniu grupy usług należy uruchomić narzędzie do sprawdzania składni i zrestartować system Nagios: # /usr/local/nagios/bin/nagios -v /usr/local/nagios/etc/nagios.cfg # /etc/init.d/nagios restart

Następnie, aby zobaczyć grupy usług w środowisku interfejsu WWW programu Nagios, wystarczy kliknąć dowolne z łączy zawierających ciąg Servicegroup.

Dyskusja Usługi nie muszą być do siebie podobne. Można grupować ze sobą dowolne usługi. W definicjach usług składowych ma znaczenie wielkość liter, dlatego należy się upewnić, czy nazwy są zgodne z tymi, jakich użyto w definicjach hostów i usług.

Patrz także • rozdział „Template-Based Object Configuration” (http://localhost/nagios/docs/xodtemplate.

html) w lokalnej dokumentacji systemu Nagios • Nagios.org: http://www.nagios.org/

13.13. Monitorowanie usług rozwiązywania nazw Problem Chcemy użyć systemu Nagios do monitorowania serwerów DNS i DHCP.

Rozwiązanie Należy dodać definicje poleceń DNS i DHCP do pliku commands.cfg (jeśli nie zdefiniowano ich wcześniej), a następnie utworzyć nowe definicje hosta i usługi, identycznie jak robiliśmy to w recepturach 13.9, 13.10, 13.11 i 13.12. Dla usługi DNS wykorzystywana jest zwykła definicja polecenia: # commands.cfg # definicja polecenia 'check_dns' define command{ command_name check_dns command_line $USER1$/check_dns -H $ARG1$ }

Następnie zdefiniujemy parametry zapytania DNS wewnątrz definicji usługi, podając domenę lub nazwę hosta do wykorzystania w celu testowania serwera: check_command

check_dns!host.domena.com

Konfiguracja dla usługi DHCP jest nieco bardziej pracochłonna, ponieważ pełny dostęp do interfejsu sieciowego w przypadku wtyczki check_dhcp wymaga uprawnień użytkownika root. Należy ustawić dla niej bit SUID i właściciela root oraz grupę nagios: 426 |

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

# chown root:nagios check_dhcp # chmod 4750 check_dhcp

Aby monitorować funkcje DHCP w sieci, nie trzeba wprowadzać żadnych opcji: # definicja polecenia 'check_dhcp' define command{ command_name check_dhcp command_line $USER1$/check_dhcp }

Aby wskazać serwer, który ma być sprawdzony, należy dodać opcję -s: $USER1$/check_dns -s $ARG1$

Następnie należy wskazać serwer w definicji usługi: check_command

check_dhcp!12.34.56.78

Dyskusja Polecenie check_dns wymaga podania nazwy hosta do sprawdzenia. Może to być host lokalny lub zdalny, dla którego można z dużym prawdopodobieństwem założyć, że jest włączony — na przykład Google, Yahoo lub host naszego dostawcy usług internetowych. Zachowajmy elegancję — nie bombardujmy serwerów innych osób. Domyślnie polecenie check_dns odpytuje serwery z pliku /etc/resolv.conf. Aby podać konkretny serwer nazw, należy skorzystać z opcji –s, tak jak pokazano w przykładzie: $USER1$/check_dns -H $ARG1$ -s $ARG2$

Następnie w definicji usługi należy określić nazwę hosta do rozwiązania oraz serwer nazw: check_command

check_dns!host.domena.com!ns1.domena.net

Można pójść o jeden krok dalej i określić adres IP, na który powinna być przekształcona nazwa hosta: $USER1$/check_dns -H $ARG1$ -s $ARG2$ -a $ARG3$ check_command check_dns!host.domena.com!ns1.domena.net!12.34.56.78

Działanie polecenia check_dhcp bazuje na wysłaniu standardowego żądania rozgłoszeniowego DHCP-DISCOVER za pośrednictwem portu UDP 67. Kiedy serwer odpowie DHCPOFFER, polecenie check_dhcp „mówi” dziękuję i już więcej nie denerwuje serwera.

Patrz także • w rozdziale „Using Macros In Commands” (http://localhost/nagios/docs/macros.html) w lo-

kalnej dokumentacji systemu Nagios można znaleźć listę wbudowanych makr • definicje opcji w plikach definicji obiektów — są to wszystkie pliki umieszczone w kata-

logu lan_objects/ — można znaleźć w rozdziale „Template-Based Object Configuration”: http://localhost/nagios/docs/xodtemplate.html • Nagios.org: http://www.nagios.org/

13.13. Monitorowanie usług rozwiązywania nazw

|

427

13.14. Konfiguracja bezpiecznego, zdalnego mechanizmu administracji systemem Nagios z wykorzystaniem OpenSSH 13.14. Konfiguracja mechanizmu administracji systemem Nagios z wykorzystaniem OpenSSH

Problem Nie chcemy uruchamiać zdalnych sesji Nagios przez HTTP, ponieważ cały ruch jest przesyłany zwykłym tekstem. Moglibyśmy skonfigurować SSL, ale wiązałby się z tym pewien kłopot — trzeba by stworzyć certyfikat oraz skonfigurować serwer Apache do wykorzystywania SSL. Dlaczegóż by zatem nie skonfigurować prostego, bezpiecznego tunelu SSH?

Rozwiązanie Nic nie stoi na przeszkodzie. OpenSSH to nadzwyczaj elastyczny i przydatny program. Konfigurowanie tunelu w sieci LAN jest proste. Nasze dwa przykładowe hosty to nagiospc i neighborpc. Na obydwu hostach potrzebne są konta systemowe. W celu ustawienia tunelu do serwera Nagios uruchamiamy polecenie zamieszczone poniżej z komputera neighborpc: user@neighborpc:~$ ssh user@nagiospc -L 8080:nagiospc:80

Następnie uruchamiamy przeglądarkę WWW w komputerze neighborpc i otwieramy stronę http://localhost:8080/nagios. Cała sesja będzie bezpiecznie ukryta w tunelu SSH — niedostępna dla podsłuchiwaczy. Informacje o tym, jak należy skonfigurować sesję Nagios w połączeniu internetowym, można znaleźć w rozdziale 7., gdzie opisano sposoby konfiguracji tuneli SSH przechodzących przez naszą zaporę firewall NAT.

Dyskusja Podczas logowania się w połączeniu SSH nie należy korzystać z konta użytkownika nagios, ponieważ użytkownik ten domyślnie nie ma hasła i nie może się zalogować. Zamiast tego należy wykorzystać konto innego nieuprzywilejowanego użytkownika, a następnie przeprowadzić uwierzytelnianie w zwykły sposób, korzystając z interfejsu systemu Nagios w przeglądarce WWW. Składnia polecenia może być nieco myląca, dlatego spróbujemy rozdzielić ją na fragmenty łatwiejsze do zinterpretowania. Pierwsza część jest taka sama jak w przypadku dowolnej innej operacji logowania przez SSH: użytkownik@zdalny_host. Flaga -L oznacza „utwórz tunel”. 8080 lub inny wybrany numer oznacza numer wychodzącego portu na lokalnym komputerze PC. Należy pamiętać, żeby wybrać nieużywany port o wysokim numerze (powyżej 1024). nagiospc:80 to zdalny serwer wraz z portem. Trzeba zawsze wiedzieć, w jakim porcie działa

usługa, dla której chcemy skonfigurować tunel.

428 |

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

Patrz także • rozdział 7. • rozdział 17. „Dostęp zdalny” z książki Carli Schroder Linux. Receptury (Helion, 2005)

13.15. Konfiguracja bezpiecznego, zdalnego mechanizmu administracji systemem Nagios z wykorzystaniem OpenSSL 13.15. Konfiguracja mechanizmu administracji systemem Nagios z wykorzystaniem OpenSSL

Problem Zdalne logowanie do systemu Nagios przez SSH jest OK, ale chcielibyśmy, żeby było jeszcze łatwiejsze. Gdyby można było po prostu uruchomić przeglądarkę WWW i zalogować się do systemu Nagios. Wiemy, że można to zrobić za pomocą OpenSSL. W jaki sposób stworzyć taką konfigurację?

Rozwiązanie W dystrybucji Fedora jest to niezwykle proste. Wystarczy zainstalować moduł SSL serwera Apache za pomocą poniższego polecenia: # yum -y install mod_ssl

Aby ograniczyć dostęp w taki sposób, by dozwolony był tylko ruch HTTPS, należy się upewnić, że w pliku httpd.conf są następujące wiersze: #Listen 80 Listen 443

W Debianie trzeba wykonać kilka dodatkowych czynności. Najpierw należy uruchomić następujące polecenia: # # # #

apt-get install apache2.2-common a2enmod ssl cp /etc/apache2/sites-available/default /etc/apache2/sites-available/ssl ln -s /etc/apache2/sites-available/ssl /etc/apache2/sites-enabled/ssl

Następnie za pomocą skryptu apache2-ssl-certificate wchodzącego w skład pakietu apache2-common trzeba utworzyć podpisany certyfikat SSL: # /usr/sbin/apache2-ssl-certificate -days 365

Następnie modyfikujemy plik /etc/apache2/sites-enabled/ssl. Należy zastąpić pierwsze trzy wiersze tymi, które zamieszczono poniżej. Trzeba jedynie wykorzystać własną nazwę serwera lub adres IP: NameVirtualHost *:443

ServerName windbag.krzak.net SSLEngine On SSLCertificateFile /etc/apache2/ssl/apache.pem

13.15. Konfiguracja mechanizmu administracji systemem Nagios z wykorzystaniem OpenSSL

| 429

W pliku /etc/apache2/ports.conf należy umieścić poniższe wiersze: #Listen 80 Listen 443

Następnie restartujemy serwer Apache z wykorzystaniem opcji force-reload: # /etc/init.d/apache2 force-reload * Forcing reload of apache 2.0 web server...

[ ok ]

Można teraz uruchomić przeglądarkę WWW i spróbować przejść pod adres http://localhost/ nagios oraz https://localhost/nagios. Wszystko powinno działać bez problemu. Przy pierwszym połączeniu przeglądarka wyświetli pytania, czy chcemy zaakceptować certyfikat. Można go przejrzeć, aby zyskać pewność, że jest właściwy.

Dyskusja Zarządzanie SSL dla serwera Apache znacznie się różni pomiędzy wersjami Apache 1.3 i Apache 2. Należy pamiętać, że dla Apache w wersji 2. jest potrzebny moduł mod_ssl, a nie apache_ssl. Skrypt apache2-ssl-certificate dostępny w Debianie to niewielkie opakowanie dla standardowych poleceń tworzenia certyfikatów OpenSSL. Domyślnie termin ważności certyfikatu wygenerowany przez to narzędzie wynosi 30 dni, co w większości przypadków jest zbyt krótkim okresem.

Patrz także • dokumentacja serwera HTTP Apache: http://httpd.apache.org/docs/

430 |

Rozdział 13. Monitorowanie sieci z wykorzystaniem systemu Nagios

ROZDZIAŁ 14.

Monitorowanie sieci z wykorzystaniem systemu MRTG

14.0. Wprowadzenie MRTG (Multi-Router Traffic Graph) pierwotnie zaprojektowano jako narzędzie zbierania statystyk SNMP na temat routerów, rejestrowania danych i przekształcania ich na wykresy. Wykresy te można osadzać na stronach WWW i odczytywać za pomocą dowolnej przeglądarki internetowej. Ponieważ narzędzie MRTG bazuje na SNMP, można je wykorzystać do tworzenia wykresów na temat praktycznie każdego urządzenia bądź usługi obsługującej protokół SNMP. Oznacza to również, że należy zwracać uwagę na działanie protokołu SNMP. Jeśli protokół SNMP nie będzie działać, program MRTG również nie będzie mógł działać. MRTG tworzy wykresy dzienne, tygodniowe, miesięczne i roczne. Jest zatem doskonałym narzędziem pozwalającym na natychmiastową obserwację trendów. Stwierdzenie, że „rysunek jest wart więcej niż tysiąc słów”, jest szczególnie prawdziwe w przypadku dużego ruchu w sieci. Narzędzie MRTG tylko zbiera dane i tworzy wykresy — nie przesyła ostrzeżeń. MRTG zapisuje swoje dane we własnych plikach dzienników i sam nimi zarządza. MRTG automatycznie konsoliduje swoje dzienniki, dzięki czemu nie trzeba się martwić o to, że rozrosną się ponad miarę. Dane są przechowywane przez dwa lata. Program MRTG również zależy od serwera HTTP. W tym rozdziale wykorzystamy serwer Lighttpd, ponieważ jest to szybki, lekki serwer HTTP, dobrze przystosowany do współpracy z programem MRTG. Oczywiście można wykorzystać dowolny inny serwer. Dostępne są trzy wersje protokołu SNMP: SNMPv1, SNMPv2 i SNMPv3. SNMPv1 jest najbardziej rozpowszechniony i prawdopodobnie tak będzie jeszcze przez pewien czas. Główną wadą wersji v1 jest brak zabezpieczeń. Wszystkie komunikaty są przesyłane w formacie zwykłego tekstu. Wersję v2 opracowano z myślą o wprowadzeniu nowych zabezpieczeń, ale wydaje się, że prace nad tą wersją wymknęły się nieco spod kontroli i powstały cztery wersje: • SNMPv2p; • SNMPv2c; • SNMPv2u; • SNMPv2 „gwiazdka”, czyli SNMPv2*.

431

Tylko pierwsze trzy wersje są udokumentowane za pomocą RFC, tak jak powinno być w przypadku przyjętych standardów. Jednak w odniesieniu do SNMP posiadanie dokumentu RFC niekoniecznie zdałoby się na cokolwiek, ponieważ protokół ten uwzględnia mnóstwo elementów. Wersja v2 obejmuje również pewne nowe własności i funkcje, które zwiększają złożoność, zatem jest nieco myląca. Wersja v2 jest zgodna wstecz z wersją v1. Protokół SNMPv3 ma przywrócić porządek i „zdrowie psychiczne”. Jest to ciekawa implementacja, w której wprowadzono prawdziwe zabezpieczenia, dlatego z czasem może ona zastąpić wersje v1 i v2. W tym rozdziale będziemy posługiwali się wersjami v1 i v2c, ponieważ są najpowszechniej stosowane i najprostsze do wykorzystania. W protokole SNMPv3 cały ruch jest szyfrowany, a wszystkie hosty muszą przejść przez uwierzytelnianie. W związku z tym jego konfiguracja i utrzymanie wymagają więcej pracy, a wiele urządzeń w dalszym ciągu go nie obsługuje. Ponieważ program MRTG tylko czyta dane, w tym rozdziale utworzymy prostą konfigurację SNMP tylko do odczytu. Nikomu nie będą potrzebne uprawnienia do zapisywania. Jeśli kogoś interesują szczegóły dotyczące szyfrowania i uwierzytelniania, może poszukać tych informacji w książce Douglasa Mauro i Kevina Schmidta Essential SNMP, Second Edition (O’Reilly, 2005), gdzie zamieszczono rozdział na temat wykorzystania SNMPv3.

14.1. Instalacja MRTG Problem Jesteśmy gotowi do skonfigurowania programu MRTG i przygotowania go do pracy. Jaki jest najlepszy sposób jego instalacji — z kodu źródłowego czy z wykorzystaniem przyjemnych menedżerów pakietów rozwiązujących zależności takie jak Aptitude czy Yum?

Rozwiązanie Instalacja z kodu źródłowego nie daje zbyt wielu korzyści. Jedyne, co się zyskuje, to kontrola nad lokalizacją plików i opcjami kompilacji. W związku z tym nie ma niczego złego w wyborze łatwego sposobu. Do instalacji potrzebny jest pakiet snmp, a także serwer HTTP i program MTRG. W Debianie instaluje się go w następujący sposób: # aptitude install snmp snmpd mrtg lighttpd

W dystrybucji Fedora należy skorzystać z poniższego polecenia: # yum install net-snmp-utils net-snmp mrtg lighttpd

To wszystko! Sposób korzystania z programu MRTG opisano w następnych procedurach.

Dyskusja Nawet w dzisiejszych czasach zaawansowanych menedżerów wyposażonych w funkcje rozwiązywania zależności, takich jak Aptitude czy Yum, w dalszym ciągu jesteśmy zdani na łaskę opiekunów naszych dystrybucji, jeśli chodzi o aktualność pakietów binarnych oraz kompilację z wykorzystaniem przydatnych opcji. W związku z tym kompilacja z kodów źródłowych jest czasami lepsza, pomimo że oznacza trudniejsze aktualizacje i instalacje łatek. Na szczęście pakiet MRTG jest popularny i dobrze utrzymywany w większości dystrybucji Linuksa.

432 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

Pakiety dla Debiana i Fedory bazują na pakiecie net-snmp, w którego skład wchodzą: agent SNMP, narzędzia zarządzania działające w wierszu poleceń oraz przeglądarka bazy MIB (Management Information Base). Program MRTG zależy od protokołu SNMP i wymaga do działania serwera HTTP. Osobiście jestem zwolenniczką serwera Lighttpd, ponieważ jest to interesujący, lekki serwer HTTP, który doskonale nadaje się do takich zadań w sytuacji, gdy nie są nam potrzebne wszystkie funkcje serwera Apache. Oczywiście można wykorzystać dowolny serwer HTTP.

Patrz także • Net-SNMP: http://net-snmp.sourceforge.net/ • MRTG Tobiego Oetikera: http://oss.oetiker.ch/mrtg/ • Lighttpd: http://www.lighttpd.net/

14.2. Konfiguracja protokołu SNMP w Debianie Problem Przed przystąpieniem do konfiguracji programu MRTG trzeba sprawdzić, czy poprawnie działa protokół SNMP. Jakie czynności powinna obejmować podstawowa konfiguracja i w jaki sposób można ją przetestować?

Rozwiązanie Najpierw trzeba się upewnić, czy działa demon snmpd. Program instalacyjny powinien uruchomić go automatycznie. Działanie demona snmpd można sprawdzić za pomocą poniższego polecenia: $ snmpwalk -v 2c -c public localhost system SNMPv2-MIB::sysDescr.0 = STRING: Linux radek-linux 2.6.20-16-generic #2 SMP Thu Jun 7 20:19: 32 UTC 2007 i686 SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (359297) 0:59:52.97 SNMPv2-MIB::sysContact.0 = STRING: Root (configure /etc/snmp/snmpd. local.conf) SNMPv2-MIB::sysName.0 = STRING: radek-linux [...]

Teraz możemy się pozbyć domyślnego pliku snmpd.conf i zastąpić go własną wersją: # # # # #

cd /etc/snmp mv snmpd.conf snmpd.conf-old touch snmpd.conf chmod 0600 snmpd.conf chmod 0666 snmpd.conf-old

Ostatnie polecenie jest opcjonalne. Dzięki niemu domyślny plik będzie dostępny dla zwykłych użytkowników do studiowania oraz jako materiał referencyjny. Nasz nowy plik snmpd.conf składa się zaledwie z kilku wierszy. Słowo haslo należy zastąpić własnym, wybranym przez siebie hasłem. Nie należy używać w roli haseł słów public lub private, ponieważ są to domyślne hasła snmp: 14.2. Konfiguracja protokołu SNMP w Debianie

| 433

###/etc/snmp/snmpd.conf ## sec.name ## ======== com2sec local com2sec lan ## ## group group group group

Access.group.name ================= ROGroup_1 ROGroup_1 ROGroup_1 ROGroup_1

## MIB.view.name ## ============== view all-mibs ## ## ## access access

source ====== localhost 192.168.1.0/24 sec.model ========= v1 v1 v2c v2c

community ========= haslo haslo sec.name ======== local lan local lan

incl/excl MIB.subtree mask ========= =========== ==== included .1 80

MIB group.name context sec.model sec.level prefix read ========== ======= ========= ========= ====== ==== ROGroup_1 "" v1 noauth exact all-mibs ROGroup_1 "" v2c noauth exact all-mibs

write ===== none none

notif ===== none none

Należy się upewnić, że właścicielem tego pliku jest root i że tylko on ma w nim prawo czytania. Następnie należy zrestartować protokół snmpd: # /etc/init.d/snmpd restart

Można teraz jeszcze raz skorzystać z polecenia snmpwalk: $ snmpwalk -v 2c -c public localhost system Timeout: No Response from localhost

Spróbujmy teraz użyć tego polecenia z nowym hasłem, dla którego w żargonie związanym z protokołem SNMP stosuje się określenie ciąg społeczności (ang. community string): $ snmpwalk -v 2c -c haslo localhost system SNMPv2-MIB::sysDescr.0 = STRING: Linux radek-linux 2.6.20-16-generic #2 SMP Thu Jun 7 20:19: 32 UTC 2007 i686 SNMPv2-MIB::sysObjectID.0 = OID: NET-SNMP-MIB::netSnmpAgentOIDs.10 DISMAN-EVENT-MIB::sysUpTimeInstance = Timeticks: (105655) 0:17:36.55 SNMPv2-MIB::sysContact.0 = STRING: root SNMPv2-MIB::sysName.0 = STRING: radek-linux [...]

Zatem wszystko jest w porządku! Program MRTG działa. Demonem snmpd można zarządzać za pomocą standardowych poleceń Debiana init: # /etc/init.d/snmpd {start|stop|restart|reload|force-reload}

Dyskusja Przyjrzyjmy się temu, co zrobiliśmy. Są cztery słowa kluczowe, z których korzystamy podczas konfigurowania ustawień kontroli dostępu: com2sec, view, group oraz access. com2sec com2sec (community-to-security) definiuje nazwę zabezpieczenia (sec.name), która jest kom-

binacją ciągu społeczności i źródłowego adresu IP.

434 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

view

Definiuje części drzew MIB dostępne do przeglądania. W tym przykładzie zezwolono na dostęp do całego drzewa. group

Opcja tworzy grupy identyfikowane przez nazwy i przyporządkowuje je do nazw zabezpieczeń. access

Opcja określa, kto ma dostęp do poszczególnych fragmentów drzewa MIB. W zaprezentowanym przykładzie wszyscy użytkownicy z grupy tylko do odczytu (ROGroup_1) mogą czytać wszystkie drzewa MIB z wykorzystaniem SNMP v1 lub v2c. Nazwa grupy (w tym przykładzie ROGroup_1) może być dowolna. Istnieje prostszy sposób wykonania tej samej operacji: rocommunity haslo

Ta jedna linijka zastępuje cały pokazany przykładowy plik. Jeśli ktoś woli, może z powodzeniem korzystać z tego sposobu — jest prostszy i sprawia, że debugowanie staje się łatwiejsze. Wykorzystanie i zrozumienie bardziej obszernego pliku pomoże nam później — kiedy będziemy tworzyli bardziej złożone konfiguracje pliku snmpd.conf. Składnia polecenia snmpwalk jest stosunkowo prosta: snmpwalk [opcje] hasło nazwa_hosta [OID]

Oto opis dostępnych opcji: -v

Wybiera wykorzystywany protokół SNMP. Do wyboru są wersje v1, v2c i v3 (opcja domyślna). -c

Ustawienie ciągu społeczności — odpowiednika hasła. Domyślny plik snmp.conf tworzy dwa domyślne ciągi społeczności: public i private. Ponieważ wszyscy na świecie je znają, powinniśmy się ich pozbyć. localhost

Określa urządzenie, do którego kierujemy zapytanie. system

Opcja system to skrót odpowiadający wszystkim identyfikatorom OID w obrębie hierarchii 1.3.6.1.2.1.1. Polecenie snmpwalk -v1 –c haslo localhost .1.3.6.1.2.1.1 zwraca te same wyniki. W zaprezentowanych przykładach użyliśmy opcji system w celu ograniczenia objętości generowanego wyniku. Pominięcie tej opcji spowoduje wyświetlenie znacznie większej ilości informacji.

Patrz także • serwis informacyjny ASN.1: http://asn1.elibel.tm.fr/en/index.htm • Net-SNMP: http://net-snmp.sourceforge.net • man snmpd.conf

14.2. Konfiguracja protokołu SNMP w Debianie

| 435

14.3. Konfiguracja protokołu SNMP w Fedorze Problem Przed przystąpieniem do konfiguracji programu MRTG trzeba sprawdzić, czy poprawnie działa protokół SNMP. Jakie czynności powinna obejmować podstawowa konfiguracja i w jaki sposób można ją przetestować?

Rozwiązanie Demona snmpd można uruchomić ręcznie za pomocą następującego polecenia: # /etc/init.d/snmpd start

Aby uruchomić go automatycznie przy starcie systemu, należy skorzystać z polecenia chkconfig: # chkconfig snmpd on # chkconfig --list snmpd snmpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Demonem snmpd można zarządzać za pomocą standardowych skryptów startowych: /etc/init.d/snmpd {start|stop|status|restart|condrestart|reload}

Możemy teraz wrócić do poprzedniej receptury i wykonać opisane tam czynności.

Dyskusja Zaprezentowana konfiguracja SNMP jest podstawową konfiguracją zapewniającą działanie programu MRTG jak najmniejszym nakładem sił oraz przy jak najmniejszej ilości potencjalnych komplikacji. Informacje na temat opcji konfiguracji można znaleźć w punkcie „Dyskusja” w recepturze 14.2.

Patrz także • Net-SNMP: http://net-snmp.sourceforge.net • man snmpd.conf

14.4. Konfiguracja usługi HTTP do działania z programem MRTG Problem Zainstalowaliśmy serwer Lighttpd po to, by serwował strony MRTG. Co trzeba zrobić, aby przygotować serwer do tej roli?

436 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

Rozwiązanie W zasadzie prawie nic, ponieważ w pakiecie programu MRTG jest dostępny skrypt, który tworzy własny główny katalog WWW. Tak więc nasze zadanie sprowadza się do skonfigurowania plików startowych Lighttpd. Instalator Debiana tworzy pliki startowe i uruchamia demona HTTP. W dystrybucji Fedora należy zrobić to samodzielnie: # /etc/init.d/lighttpd start

Aby uruchomić go automatycznie przy starcie systemu, należy skorzystać z polecenia chkconfig, a następnie sprawdzić, czy konfiguracja się powiodła: # chkconfig lighttpd on # chkconfig --list lighttpd lighttpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off

Następnie można przetestować działanie serwera poprzez otwarcie w przeglądarce adresu http://localhost/. Powinna się wyświetlić domyślna strona serwera HTTP podobna do tej, którą pokazano na rysunku 14.1.

Rysunek 14.1. Domyślna strona serwera Lighttpd

W dystrybucji Fedora serwerem lighttpd można zarządzać za pomocą standardowych skryptów startowych: # /etc/init.d/lighttpd {start|stop|status|restart|condrestart|reload}

W Debianie jest nieco inaczej: # /etc/init.d/lighttpd {start|stop|restart|reload|force-reload}

14.4. Konfiguracja usługi HTTP do działania z programem MRTG

|

437

Dyskusja Zaprezentowana receptura działa dla każdego serwera HTTP. Wystarczy jedynie wprowadzić prawidłową nazwę w poleceniach.

Patrz także • Lighttpd: http://www.lighttpd.net/

14.5. Konfiguracja i uruchamianie programu MRTG w Debianie Problem OK. Dość przygotowań. Demony SNMP i HTTP są zainstalowane i działają. Chcemy teraz uruchomić program MRTG i zacząć tworzenie estetycznych wykresów sieciowych tak jak wszyscy inni. Co teraz należy zrobić?

Rozwiązanie Najpierw wykorzystamy MRTG do monitorowania wszystkich interfejsów sieciowych na serwerze. W celu stworzenia wyjściowego pliku konfiguracyjnego MRTG skorzystamy z poniższego polecenia. Atrybut haslo oznacza ustawiony wcześniej ciąg społeczności SNMP: # cfgmaker --output=/etc/mrtg.cfg \ --global "workdir: /var/www/mrtg" -ifref=ip \ --global 'options[_]: growright,bits' \ haslo@localhost

Następnie ręcznie uruchamiamy program MRTG: # mrtg /etc/mrtg.conf ----------------------------------------------------------------------ERROR: Mrtg will most likely not work properly when the environment variable LANG is set to UTF-8. Please run mrtg in an environment where this is not the case. Try the following command to start: env LANG=C /usr/bin/mrtg /etc/mrtg.cfg -----------------------------------------------------------------------

W związku z tym ustawiamy zmienną środowiskową: # env LANG=C mrtg /etc/mrtg.cfg

Jeśli w systemie domyślnie ustawiono zmienną LANG=C, to powyższy komunikat się nie wyświetli. W przypadku gdy wyświetlą się ostrzeżenia Rateup WARNING, należy ponawiać polecenia tak długo, aż komunikaty te przestaną się wyświetlać. Zazwyczaj trzeba w tym celu wykonać trzy próby. Aby utworzyć plik skorowidza HTML, należy uruchomić poniższe polecenie: # indexmaker --output=/var/www/mrtg/index.html /etc/mrtg.cfg

438 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

W tym momencie możemy wywołać w przeglądarce serwer localhost (http://localhost/mrtg/). Powinien się wyświetlić estetyczny wykres pokazujący stan wszystkich włączonych interfejsów sieciowych, podobny do tego, który pokazano na rysunku 14.2.

Rysunek 14.2. Wykresy MRTG przedstawiające stan dwóch aktywnych interfejsów w lokalnej sieci

Aby obejrzeć szczegółowe statystyki (rysunek 14.3), wystarczy kliknąć dowolny z wykresów. Dzięki temu można się przekonać, że program działa prawidłowo.

Dyskusja Przyjrzyjmy się temu, co zrobiliśmy w powyższym poleceniu: --output=/etc/mrtg.cfg Informuje polecenie cfgmaker o tym, gdzie należy utworzyć plik konfiguracyjny MRTG. --global"workdir :/var/www/mrtg" -ifref=ip

To ustawienie należy umieścić w globalnej sekcji pliku mrtg.cfg. Definiuje ono katalog, w którym będą zapisane pliki HTML. Opcja -ifref=ip jest poleceniem dla programu MRTG, które powoduje śledzenie interfejsów sieciowych według adresu IP. --global'options [_]:growright,bits'

Powyższy zapis oznacza, że wykresy będą się rozwijały w prawą stronę, a ruch sieciowy będzie mierzony w bitach na sekundę. haslo@localhost

Ciąg społeczności (hasło) dla demona snmpd.

14.5. Konfiguracja i uruchamianie programu MRTG w Debianie

| 439

Rysunek 14.3. Szczegółowe statystyki na temat interfejsu

Debian instaluje tabelę programu cron dla systemu MRTG w pliku /etc/cron.d/mrtg. Powoduje ona aktualizację wykresów co pięć minut. Dzięki temu nie musimy robić nic więcej, by wykresy aktualizowały się automatycznie. Uruchomienie polecenia LANG=C mrtg/etc/mrtg.cfg często powoduje wyświetlenie komunikatów o błędach następującej postaci: Rateup WARNING: /usr/bin/rateup could not read the primary log file for localhost_ 192.168.1.10 Rateup WARNING: /usr/bin/rateup The backup log file for localhost_192.168.1.10 was invalid as well Rateup WARNING: /usr/bin/rateup Can't remove localhost_192.168.1.10.old updating log file Rateup WARNING: /usr/bin/rateup Can't rename localhost_192.168.1.10.log to localhost_ 192.168.1.10.old updating log file

Komunikaty te to zwykłe „narzekania” systemu na rutynowe działania. Należy je zignorować i ponawiać polecenia do czasu, kiedy komunikaty o błędach przestaną się pojawiać. Zazwyczaj wystarczy podjęcie trzech prób.

440 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

Patrz także • man 1 cfgmaker • man 1 mrtg-reference • strona macierzysta programu MRTG: http://oss.oetiker.ch/mrtg/

14.6. Konfiguracja i uruchamianie programu MRTG w Fedorze Problem OK. Dość przygotowań. Demony SNMP i HTTP są zainstalowane i działają. Chcemy teraz uruchomić program MRTG i zacząć tworzenie estetycznych wykresów sieciowych tak jak wszyscy inni. Co teraz należy zrobić?

Rozwiązanie Najpierw wykorzystamy MRTG do monitorowania wszystkich interfejsów sieciowych na serwerze. Do stworzenia wyjściowego pliku konfiguracyjnego MRTG skorzystamy z poniższego polecenia. Atrybut haslo oznacza ustawiony wcześniej ciąg społeczności SNMP: # cfgmaker --output=/etc/mrtg/mrtg.cfg \ --global "workdir: /var/www/mrtg" -ifref=ip \ --global 'options[_]: growright,bits' \ haslo@localhost

Następnie ręcznie uruchamiamy program MRTG: # mrtg /etc/mrtg/mrtg.cfg ----------------------------------------------------------------------ERROR: Mrtg will most likely not work properly when the environment variable LANG is set to UTF-8. Please run mrtg in an environment where this is not the case. Try the following command to start: env LANG=C /usr/bin/mrtg /etc/mrtg.cfg -----------------------------------------------------------------------

W związku z tym ustawiamy zmienną środowiskową: # env LANG=C mrtg /etc/mrtg/mrtg.cfg

Jeśli w systemie domyślnie ustawiono zmienną LANG=C, to powyższy komunikat się nie wyświetli. Aby utworzyć plik skorowidza HTML, należy uruchomić poniższe polecenie: # indexmaker --output=/var/www/mrtg/index.html /etc/mrtg/mrtg.cfg

W tym momencie możemy wywołać w przeglądarce serwer localhost (http://localhost/mrtg/). Powinien wyświetlić się estetyczny wykres pokazujący stan wszystkich włączonych interfejsów sieciowych, podobny do tych, które pokazano na rysunkach 14.2 i 14.3 w poprzedniej recepturze. Dzięki temu można się przekonać, że program działa prawidłowo.

14.6. Konfiguracja i uruchamianie programu MRTG w Fedorze

|

441

Dyskusja Fedora instaluje tabelę programu cron dla systemu MRTG w pliku /etc/cron.d/mrtg. Powoduje ona aktualizację wykresów co pięć minut. Dzięki temu nie musimy robić nic więcej, by wykresy aktualizowały się automatycznie. Objaśnienie opcji poleceń można znaleźć w punkcie „Dyskusja” w poprzedniej recepturze.

Patrz także • man 1 cfgmaker • man 1 mrtg-reference • strona macierzysta programu MRTG: http://oss.oetiker.ch/mrtg/

14.7. Monitorowanie aktywnego obciążenia procesora CPU Problem Chcemy wykorzystać program MRTG do obserwowania wydajności procesora CPU. Za pomocą polecenia cfgmaker skonfigurowaliśmy tylko wykresy dla interfejsów sieciowych. Co teraz należy zrobić?

Rozwiązanie Trzeba ręcznie zmodyfikować plik mrtg.cfg. Nie należy teraz używać polecenia cfgmaker, ponieważ spowodowałby nadpisanie wprowadzonych zmian. W tej recepturze pokazano monitorowanie obciążenia CPU przez system, użytkowników i procesy o priorytecie nice1. Wspólnie tworzą one obraz całkowitego obciążenia CPU. W sekcji globalnych opcji konfiguracji (ang. Global config options) należy dodać poniższe wiersze: # Globalne opcje konfiguracji LoadMIBs: /usr/share/snmp/mibs/UCD-SNMP-MIB.txt,/usr/share/snmp/mibs/TCP-MIB.txt

Następnie na końcu pliku należy dodać poniższy fragment: # Monitorowanie obciążenia CPU # Target[radek-linux.cpu]: ssCpuRawUser.0&ssCpuRawUser.0:password@localhost + ssCpuRawSystem.0&ssCpuRawSystem.0:password@localhost + ssCpuRawNice.0&ssCpuRawNice.0:haslo@localhost Title[radek-linux.cpu]: Obciążenie CPU w systemie Radek-linux RouterUptime[radek-linux.cpu]: [email protected] PageTop[radek-linux.cpu]: Radek-linux - obciążenie CPU przez system, użytkowników i procesy nice MaxBytes[radek-linux.cpu]: 100 ShortLegend[radek-linux.cpu]: % YLegend[radek-linux.cpu]: Wykorz. CPU 1

Programy uruchomione z priorytetem nice w przypadku braku zasobów zwalniają czas procesora programom uruchomionym z wyższym priorytetem — przyp. tłum.

442 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

Legend1[radek-linux.cpu]: Bieżące obciążenie CPU w procentach LegendI[radek-linux.cpu]: Wykorzystano LegendO[radek-linux.cpu]: Options[radek-linux.cpu]: growright,nopercent Unscaled[radek-linux.cpu]: ymwd

Skoro już modyfikujemy plik mrtg.conf, możemy przy okazji usunąć wpis dotyczący urządzenia pętli zwrotnej, ponieważ nie będziemy już z niego korzystać. Następnie trzykrotnie ręcznie uruchamiamy program mrtg lub robimy to do czasu, kiedy przestanie generować komunikaty o błędach. Należy pamiętać o wstawieniu własnych ścieżek do plików: # env LANG=C mrtg /etc/mrtg.cfg

Następnie generujemy nową stronę index.html: # indexmaker --output=/var/www/mrtg/index.html /etc/mrtg.cfg

W tym momencie powinniśmy uzyskać efekt podobny do tego, który pokazano na rysunkach 14.4 i 14.5.

Rysunek 14.4. Nowa strona startowa wyświetlająca wykres obciążenia CPU

Dyskusja Zaprezentowane wykresy nie są zbyt ekscytujące, ponieważ wykonano je w systemie testowym, w którym jest niska aktywność. Można się jednak na tej podstawie przekonać, jaki wpływ na wykresy mają zapisy w pliku konfiguracyjnym mrtg.cfg. Spróbujmy przyjrzeć się konfiguracji: LoadMIBs

Należy poinformować program MRTG, jakie pliki MIB z katalogu /usr/share/snmp/ mają być załadowane. Są one zbuforowane w pliku /var/www/mrtg/oid-mib-cache.txt. Zastosowanie opcji LoadMIBs pozwala na korzystanie z nazw symbolicznych obiektów OID zamiast używania ich numerów. 14.7. Monitorowanie aktywnego obciążenia procesora CPU

| 443

Rysunek 14.5. Strona szczegółów dla wykresu obciążenia CPU Target[radek-linux.cpu]:ssCpuRawUser.0&ssCpuRawUser.0:haslo@localhost… Składnia tego wiersza to Słowo_kluczowe[nazwa_wykresu]: wartość. Słowo kluczowe Target definiuje parametry, które chcemy monitorować. Argument wartość oznacza listę par OID połączonych znakiem ampersand (&). Atrybut nazwa_wykresu to dowolna nazwa,

która musi być unikatowa. Program MRTG wie jedynie, w jaki sposób mierzy się pary wartości, zatem w przypadku wykreślania pojedynczej wartości należy powtórzyć definicję celu (za pomocą opcji Target). Każda definicja celu musi być oddzielona od poprzedniej spacją. W tym przykładzie zdefiniowano trzy cele, które są połączone ze sobą za pomocą znaku plus. Znak plus oznacza polecenie „zsumuj te wartości”. Title

Tytuł strony HTML zawierającej szczegółowe informacje.

RouterUptime

Opcję tę można wykorzystać do wyświetlenia czasu aktywności systemu na stronie z informacjami szczegółowymi. PageTop

Nagłówek strony ze szczegółami. MaxBytes

Wartość wyświetlana w bajtach lub procentowo. ShortLegend

Tekstowe opisy jednostek dla wartości maksymalnej (Max), średniej (Average) i bieżącej (Current). Wartość domyślna to b/s (bitów na sekundę). 444 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

YLegend

Oś Y (pionowa) opisująca etykietę wykresu. Jeśli będzie zbyt długa, program MRTG zignoruje ją bez wyświetlania jakichkolwiek informacji. Legend1 (oraz 2, 3, i 4)

Opisy legend kolorowych. LegendI (oraz O)

Wejście i wyjście. Ponieważ na tym wykresie są dodawane do siebie dwie wartości, które tworzą sumę, a każda para OID to w rzeczywistości dwie te same wartości OID, a nie dwie różne, wykorzystaliśmy tylko opcję LegendI. Options

Opcja growright oznacza rozwinięcie wykresu w prawą stronę, natomiast nopercent oznacza brak drukowania wartości procentowych. W przypadku wykresów obciążenia CPU, które tworzymy, wyświetlanie wartości procentowych byłoby redundantne, ponieważ wcześniej już wyświetlaliśmy procenty. Bez opcji nopercent legendy wykresu miałyby następującą postać: Wykorzystano 65.0 % (65.0%) 35.0 % (35.0%) 6.0 % (6.0%). Unscaled

Opcją domyślną jest scaled. Oznacza ona, że program MRTG dostosuje wykresy w taki sposób, aby dane o małych rozmiarach były lepiej widoczne. Zastosowanie opcji unscaled powoduje utworzenie wykresu o stałych rozmiarach. Wartość ymwd reprezentuje rok, miesiąc, tydzień i dzień.

Podstawowym źródłem informacji na temat opcji konfiguracji jest strona podręcznika systemowego man 1 mrtg-reference.

Patrz także • man 1 mrtg-reference • strona macierzysta programu MRTG: http://oss.oetiker.ch/mrtg/

14.8. Monitorowanie wykorzystania CPU przez użytkowników oraz czasu bezczynności Problem W poprzedniej recepturze pokazaliśmy, w jaki sposób utworzyć przydatną migawkę aktywności CPU w czasie. Interesują nas jednak bardziej wartości pojedyncze niż zagregowane. Na przykład chcemy uzyskać wykres czasu bezczynności i procesów użytkowników lub procesów systemu i użytkowników, albo każdą z tych wartości z osobna.

Rozwiązanie Dodajmy poniższe wiersze do pliku mrtg.cfg: # monitorowanie obciążenia CPU przez użytkowników oraz czasu bezczynności # Target[radek-linux2.cpu]: ssCpuRawUser.0&ssCpuRawIdle.0:haslo@localhost \

14.8. Monitorowanie wykorzystania CPU przez użytkowników oraz czasu bezczynności

| 445

RouterUptime[radek-linux2.cpu]: haslo@localhost MaxBytes[radek-linux2.cpu]: 100 Title[radek-linux2.cpu]: Radek-linux - Obciążenie CPU przez użytkowników i czas bezczynności PageTop[radek-linux2.cpu]: Radek-linux - Obciążenie CPU przez użytkowników i czas bezczynności ShortLegend[radek-linux2.cpu]: % YLegend[radek-linux2.cpu]: Wykorz. CPU Legend1[radek-linux2.cpu]: Wykorzystanie CPU przez użytkowników w % (Obciążenie) Legend2[radek-linux2.cpu]: Czas bezczynności CPU w % (Bezczynność) LegendI[radek-linux2.cpu]: Użytkownicy LegendO[radek-linux2.cpu]: Bezczynność Options[radek-linux2.cpu]: growright,nopercent Unscaled[radek-linux2.cpu]: ymwd

Należy się upewnić, że w sekcji opcji globalnych jest opcja LoadMIBs: /usr/local/share/snmp/ mibs/UCD-SNMP-MIB.txt. Aby załadować wprowadzone zmiany, należy uruchomić poniższe polecenia: # env LANG=C mrtg /etc/mrtg.cfg # indexmaker --output=/var/www/mrtg/index.html /etc/mrtg.cfg

Należy zwrócić uwagę na ścieżki dostępu do plików, ponieważ pod tym względem dystrybucje Linuksa bardzo się różnią między sobą. Należy również pamiętać o uruchamianiu pierwszego polecenia do czasu, kiedy przestaną być generowane komunikaty o błędach. Nie powinno to być więcej niż trzy próby. Teraz wystarczy wywołać w przeglądarce hosta localhost (http://localhost/mrtg) i podziwiać nowe wykresy. Wykresy te śledzą teraz dwie wartości: Max Average Użytkownicy 9.0 % 8.0 % Bezczynność 92.0 % 79.0 %

Current 6.0 % 93.0 %

Dyskusja W tym przykładzie wprowadzono dwie istotne zmiany w porównaniu z poprzednią recepturą. Po pierwsze, zmodyfikowano opcję Target — zwróćmy uwagę, że teraz w parze występują dwa różne identyfikatory OID. Druga zmiana to nazwa wykresu. Każdemu wykresowi trzeba nadać unikatową nazwę. Opcję Target można modyfikować na różne sposoby. Oto cztery główne zmienne obiektowe do tworzenia wykresów dotyczących CPU: ssCpuRawUser

Śledzenie wykorzystania CPU przez nieuprzywilejowane aplikacje. ssCpuRawNice

Śledzenie wykorzystania CPU przez aplikacje o niskim priorytecie. ssCpuRawSystem

Śledzenie wykorzystania CPU przez uprzywilejowane aplikacje. ssCpuRawIdle

Pomiar czasu bezczynności. Powyższe zmienne można wykorzystywać pojedynczo lub tworzyć ich kombinacje. W przypadku śledzenia pojedynczych wartości należy pamiętać o konieczności podania pary identyfikatorów OID. W związku z tym należy dwukrotnie podać tę samą wartość identyfikatora OID: 446 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

Target[radek-linux2.cpu]:ssCpuRawIdle.0&ssCpuRawIdle.0:haslo@localhost

Należy również pamiętać o tym, aby odpowiednio zmodyfikować opisy legendy i tytuły stron. Więcej informacji na temat opcji konfiguracji można znaleźć w punkcie „Dyskusja” w recepturze 14.7. Szczegółowe informacje na ten temat można znaleźć na stronie podręcznika systemowego man 1 mrtg-reference.

Patrz także • man 1 mrtg-reference • strona macierzysta programu MRTG: http://oss.oetiker.ch/mrtg/

14.9. Monitorowanie wykorzystania fizycznej pamięci Problem Chcemy obserwować wykorzystanie fizycznej pamięci, tak aby wiedzieć, ile jest wolnej pamięci w systemie. W jaki sposób można to zrobić za pomocą programu MRTG?

Rozwiązanie W pliku mrtg.cfg należy wprowadzić następujące opcje: # Monitorowanie wykorzystania fizycznej pamięci # Target[radek-linux.mem]: memAvailReal.0&memAvailReal.0:haslo@localhost Title[radek-linux.cpu]: Radek-linux - Wolna pamięć w bajtach PageTop[radek-linux.mem]: Radek-linux - Wolna pamięć w bajtach MaxBytes[radek-linux.mem]: 512000 YLegend[radek-linux.mem]: Wolna pamięć w bajtach ShortLegend[radek-linux.mem]: bajtów LegendI[radek-linux.mem]: Wolna pamięć LegendO[radek-linux.mem]: Legend1[radek-linux.mem]: Wolna pamięć, bez pliku wymiany, w bajtach options[radek-linux.mem]: growright,gauge,nopercent Unscaled[radek-linux.mem]: ymwd

Należy pamiętać, aby wprowadzić całkowitą objętość pamięci systemowej jako wartość opcji MaxBytes. Trzeba pamiętać o sprawdzeniu, czy w sekcji opcji globalnych jest opcja LoadMIBs: /usr/local/ share/snmp/mibs/UCD-SNMP-MIB.txt. Aby załadować wprowadzone zmiany, należy uruchomić poniższe polecenia: # env LANG=C mrtg /etc/mrtg.cfg # indexmaker --output=/var/www/mrtg/index.html /etc/mrtg.cfg

Należy zwrócić uwagę na ścieżki dostępu do plików, ponieważ pod tym względem dystrybucje Linuksa bardzo się różnią między sobą. Należy również pamiętać o uruchamianiu pierwszego polecenia do czasu, kiedy przestaną być generowane komunikaty o błędach. Nie powinno to być więcej niż trzy próby.

14.9. Monitorowanie wykorzystania fizycznej pamięci

|

447

Dyskusja Aby się dowiedzieć, ile pamięci RAM zainstalowano w systemie, można skorzystać z polecenia free. Wartość argumentu MaxBytes nie musi być dokładnie równa tej wartości, ponieważ argument ten ustawia jedynie górny limit wyświetlany na wykresie. W związku z tym wartość tę można nieco zaokrąglić w górę. Czasami korzystniejsze jest wyświetlenie wartości procentowych zamiast wartości w bajtach. Można to zrobić poprzez modyfikację atrybutu Target oraz dostosowanie legend: Target[radek-linux2.mem]: ( memAvailReal.0&memAvailReal.0:password@localhost ) * 100 / (memTotalReal.0&memTotalReal.0:haslo@localhost ) RouterUptime[radek-linux2.mem]: haslo@localhost Title[radek-linux2.mem]: Radek-linux - Wolna pamięć w procentach PageTop[radek-linux2.mem]: Radek-linux - Wolna pamięć w procentach MaxBytes[radek-linux2.mem]: 512000 YLegend[radek-linux2.mem]: Pamięć % ShortLegend[radek-linux2.mem]: Procent LegendI[radek-linux2.mem]: Wolna LegendO[radek-linux2.mem]: Legend1[radek-linux2.mem]: % wolnej pamięci options[radek-linux2.mem]: growright,gauge,nopercent

Należy pamiętać, że każda definicja celu musi być oddzielona od poprzedniej spacją. W tym przykładzie nie wykorzystano opcji unscaled, ponieważ wartość wolnej pamięci w moim systemie testowym była tak mała, że trudno ją było odczytać. Domyślnie w systemie MRTG wykorzystuje się wykresy skalowane, czyli takie, w których rozmiar wykresu jest dobierany w taki sposób, aby dane były bardziej widoczne. Jeśli chcemy, aby MRTG w taki sposób wyświetlał wykresy, wystarczy, że pominiemy opcję unscaled.

Patrz także • man 1 mrtg-reference • strona macierzysta programu MRTG: http://oss.oetiker.ch/mrtg/

14.10. Monitorowanie dostępnego miejsca w pliku wymiany razem z pamięcią fizyczną Problem Chcemy, aby program MRTG tworzył wykres dotyczący pamięci fizycznej i pliku wymiany, tak aby można było obejrzeć całkowite wykorzystanie pamięci.

Rozwiązanie W pliku mrtg.cfg należy wprowadzić następujące ustawienia: # Monitorowanie dostępnego miejsca w pliku wymiany razem z pamięcią fizyczną Target[radek-linux.memswap]:memAvailReal.0&memAvailSwap.0:haslo@localhost RouterUptime[radek-linux.memswap]: haslo@localhost Title[radek-linux.memswap]: Radek-linux - Wolna pamięć razem z plikiem wymiany PageTop[radek-linux.memswap]: Radek-linux - Wolna pamięć wraz z plikiem wymiany MaxBytes[radek-linux.mem]: 650624

448 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

YLegend[radek-linux.memswap]: wolna pamięć łącznie ShortLegend[radek-linux.memswap]: bajtów LegendI[radek-linux.memswap]: Wolna pamięć LegendO[radek-linux.memswap]: Wolne miejsce w pliku wymiany Legend1[radek-linux.memswap]: Wolna pamięć fizyczna w bajtach Legend2[radek-linux.memswap]: Wolne miejsce w pliku wymiany w bajtach options[radek-linux.memswap]: growright,gauge,nopercent Unscaled[radek-linux.memswap]: ymwd

Dla argumentu MaxBytes należy wprowadzić większą z wartości — rozmiar pliku wymiany lub pamięci RAM. Trzeba pamiętać o sprawdzeniu, czy w sekcji opcji globalnych jest opcja LoadMIBs: /usr/local/ share/snmp/mibs/UCD-SNMP-MIB.txt. Aby załadować wprowadzone zmiany, należy uruchomić poniższe polecenia: # env LANG=C mrtg /etc/mrtg.cfg # indexmaker --output=/var/www/mrtg/index.html /etc/mrtg.cfg

Należy zwrócić uwagę na ścieżki dostępu do plików, ponieważ pod tym względem dystrybucje Linuksa bardzo się różnią między sobą. Należy również pamiętać o uruchamianiu pierwszego polecenia do czasu, kiedy przestaną być generowane komunikaty o błędach. Nie powinno to być więcej niż trzy próby.

Dyskusja Aby się dowiedzieć, ile pamięci RAM i miejsca w pliku wymiany jest w naszym systemie, można skorzystać z polecenia free. Wartość argumentu MaxBytes nie musi być dokładnie równa tej wartości, ponieważ argument ten ustawia jedynie górny limit wyświetlany na wykresie. W związku z tym wartość tę można nieco zaokrąglić w górę. Jest to przydatny wykres do tego, by obserwować przez dłuższy czas zużycie pamięci i pliku wymiany. Dzięki niemu można się przekonać, czy ilość zainstalowanej pamięci RAM jest odpowiednia.

Patrz także • man 1 mrtg-reference • strona macierzysta programu MRTG: http://oss.oetiker.ch/mrtg/

14.11. Monitorowanie wykorzystania miejsca na dysku Problem Chcemy obserwować niektóre partycje dyskowe, aby się dowiedzieć, jaki jest stan ich zapełnienia.

Rozwiązanie Najpierw trzeba zmodyfikować plik snmpd.conf i dodać partycje, które chcemy monitorować: ## /etc/snmp/snmpd.conf disk /var disk /home

14.11. Monitorowanie wykorzystania miejsca na dysku

| 449

Następnie należy zrestartować demona snmpd: # /etc/init.d/snmpd restart

W pliku mrtg.cfg należy wprowadzić następujące ustawienia: # Monitorowanie zapełnienia dysku dla partycji /var i /home # Target[server.disk]: dskPercent.1&dskPercent.2:haslo@localhost Title[server.disk]: Zapełnienie partycji dyskowych PageTop[server.disk]: Zapełnienie partycji dyskowych /var i /home MaxBytes[server.disk]: 100 ShortLegend[server.disk]: % Y Legend[server.disk]: % zapełnienia LegendI[server.disk]: /var LegendO[server.disk]: /home Options[server.disk]: gauge,growright,nopercent Unscaled[server.disk]: ymwd

Trzeba pamiętać o sprawdzeniu, czy w sekcji opcji globalnych jest opcja LoadMIBs: /usr/local/ share/snmp/mibs/UCD-SNMP-MIB.txt. Aby załadować wprowadzone zmiany, należy uruchomić poniższe polecenia: # env LANG=C mrtg /etc/mrtg.cfg # indexmaker --output=/var/www/mrtg/index.html /etc/mrtg.cfg

Należy zwrócić uwagę na ścieżki dostępu do plików, ponieważ pod tym względem dystrybucje Linuksa bardzo się różnią między sobą. Należy również pamiętać o uruchamianiu pierwszego polecenia do czasu, kiedy przestaną być generowane komunikaty o błędach. Nie powinno to być więcej niż trzy próby.

Dyskusja Zaprezentowany sposób działa wyłącznie w odniesieniu do partycji dyskowych — nie można wykorzystać go w odniesieniu do dowolnych katalogów. Dajmy programowi MRTG popracować przez mniej więcej godzinę. Po tym czasie można sprawdzić wyniki za pomocą polecenia df-h: $ df -h Filesystem /dev/hda1 /dev/hda3 /dev/sda1 /dev/hda2

Size 14G 5G 31G 4.5G

Used Avail Use% Mounted on 2.3G 11G 17% / 1.8G 3.2G 36% /usr 6.5G 24G 22% /home 603M 3.7G 14% /var

Wyniki generowane przez program MRTG powinny być zgodne z poleceniem df. Jeśli tak nie jest, konfiguracja programu MRTG jest nieprawidłowa. Wybór identyfikatorów OID dla opcji dskPercent jest dość złożony. Identyfikatory występują w kolejności, w której są wymienione w pliku snmpd.conf. Załóżmy, że mamy cztery partycje dyskowe wymienione w następujący sposób: disk disk disk disk

/ /usr /var /home

W takim przypadku dla partycji /var i /home trzeba wykorzystać odpowiednio wartości dskPercent.3 i dskPercent.4. W świecie komputerów często komplikujemy sobie życie poprzez numerowanie niektórych rzeczy od zera, a innych od 1. Partycje dyskowe w Linuksie są numerowane od 1. 450 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

Patrz także • man 1 mrtg-reference • man 1 df • strona macierzysta programu MRTG: http://oss.oetiker.ch/mrtg/

14.12. Monitorowanie połączeń TCP Problem W naszym systemie działa dosyć mocno obciążony serwer WWW. W związku z tym chcielibyśmy obserwować liczbę nowych połączeń nawiązywanych z serwerem.

Rozwiązanie Pokazany przykład mierzy liczbę nowych połączeń TCP na minutę: LoadMIBS: /usr/share/snmp/mibs/TCP-MIB.txt # # Liczba nowych połączeń TCP na minutę # Target[server.http]: tcpPassiveOpens.0&tcpActiveOpens.0:haslo@serwerWWW1 RouterUptime[radek-linux1.swap]: haslo@localhost Title[server.http]: SerwerWWW1 - Liczba nowych połączeń TCP PageTop[server.http]: SerwerWWW1 - Liczba nowych połączeń TCP na minutę MaxBytes[server.http]: 1000000000 ShortLegend[server.http]: p/m YLegend[server.http]: Połączeń/Min LegendI[server.http]: Wchodzące LegendO[server.http]: Wychodzące Legend1[server.http]: Nowych połączeń wchodzących Legend2[server.http]: Nowych połączeń wychodzących Options[server.http]: growright,nopercent,perminute

Aby załadować wprowadzone zmiany, należy uruchomić poniższe polecenia: # env LANG=C mrtg /etc/mrtg.cfg # indexmaker --output=/var/www/mrtg/index.html /etc/mrtg.cfg

Należy zwrócić uwagę na ścieżki dostępu do plików, ponieważ pod tym względem dystrybucje Linuksa bardzo się różnią między sobą. Należy również pamiętać o uruchamianiu pierwszego polecenia do czasu, kiedy przestaną być generowane komunikaty o błędach. Nie powinno to być więcej niż trzy próby.

Dyskusja W niniejszej recepturze zaprezentowano interesujący wykres pozwalający na obserwację tego, jak intensywnie jest eksploatowany nasz serwer WWW przez odwiedzających. Opcja tcpPassiveOpens.0 zlicza połączenia wchodzące, natomiast opcja tcpActiveOpens.0 mierzy liczbę połączeń zainicjowanych przez serwer. Takie same dane można wyświetlić za pomocą polecenia netstat, ale nie w postaci takiego estetycznego wykresu: $ netstat -s | egrep '(passive|active)' 211 active connections openings 230581 passive connection openings

14.12. Monitorowanie połączeń TCP

|

451

Patrz także • man 1 mrtg-reference • man 8 netstat • strona macierzysta programu MRTG: http://oss.oetiker.ch/mrtg/

14.13. Wyszukanie i testowanie identyfikatorów MIB i OID Problem Identyfikatory MIB i OID są trochę tajemnicze. Jak można je znaleźć? W jaki sposób należy z nich korzystać? Jak sprawdzić, czy użyliśmy prawidłowych wartości?

Rozwiązanie Kiedy podczas uruchamiania programu MRTG wyświetli się poniższy komunikat o błędzie: # env LANG=C mrtg /etc/mrtg.cfg SNMP Error: Received SNMP response with error code error status: noSuchName index 2 (OID: 1.3.6.1.4.1.2021.9.1.9.3) [...]

oznacza to, że albo identyfikator OID nie istnieje, albo w pliku mrtg.cfg nie wprowadziliśmy prawidłowego pliku dla opcji LoadMIBs. W takiej sytuacji przede wszystkim należy sprawdzić numeryczne wartości identyfikatorów OID: $ snmpwalk -v 1 -c haslo localhost 1.3.6.1.4.1.2021.9.1.9.3 UCD-SNMP-MIB::dskPercent.3 = INTEGER: 22

Wynik tego polecenia oznacza, że wykorzystaliśmy prawidłowy identyfikator OID. W związku z tym trzeba poprawić wpis dotyczący opcji LoadMIBs. Prawidłowy plik MIB można odczytać za pomocą polecenia snmpwalk. Jeśli nie znamy katalogu, w którym są zapisane pliki MIB, możemy skorzystać z polecenia locate: $ locate UCD-SNMP-MIB /usr/share/snmp/mibs/UCD-SNMP-MIB.txt

A zatem opcja LoadMIBs powinna mieć następującą postać: LoadMIBs: /usr/share/snmp/mibs/UCD-SNMP-MIB.txt

Teraz wystarczy ponownie uruchomić polecenie mrtg. Poniższe polecenie wyświetla wszystkie identyfikatory OID w systemie: $ snmpwalk -v 1 -c haslo localhost

Są ich tysiące: $ snmpwalk -v 1 -c haslo localhost | wc -l 1824

452 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

system to w rzeczywistości nazwa symboliczna; rzeczywista nazwa OID jest liczbą, którą można wyświetlić za pomocą opcji -On: $ snmpwalk -On -v 1 -c haslo localhost system .1.3.6.1.2.1.1.1.0 = STRING: Linux radek-linux 2.6.20-16-generic #2 SMP Thu Jun 7 20:19:32 UTC 2007 i686 .1.3.6.1.2.1.1.2.0 = OID: .1.3.6.1.4.1.8072.3.2.10 [...]

Tak więc zapis .1.3.6.1.2.1.1 odpowiada nazwie system, która określa hierarchię identyfikatorów OID. Poniższe dwa polecenia działają identycznie: $ snmpwalk -v 1 -c haslo localhost system $ snmpwalk -v 1 -c haslo localhost .1.3.6.1.2.1.1

W routerach komercyjnych w konfiguracji MRTG częściej wykorzystywane są numeryczne wartości identyfikatorów OID. Ich producenci rzadziej decydują się na luksus posługiwania się nazwami symbolicznymi.

Dyskusja W jaki sposób można się dowiedzieć, jakie identyfikatory OID nas interesują? To jest bardziej skomplikowane. Informacje o identyfikatorach OID można wyszukiwać metodą prób i błędów za pomocą standardowych narzędzi wyszukiwania dla systemu Linux: $ grep -ir tcp /usr/share/snmp/mibs/ /usr/share/snmp/mibs/TCP-MIB.txt:TCP-MIB DEFINITIONS ::= BEGIN /usr/share/snmp/mibs/TCP-MIB.txt:tcpMIB MODULE-IDENTITY /usr/share/snmp/mibs/TCP-MIB.txt: "The MIB module for managing TCP implementations. /usr/share/snmp/mibs/TCP-MIB.txt:-- the TCP base variables group [...]

Lepiej jednak zajrzeć do dokumentacji specyficznej dla urządzeń i usług, które chcielibyśmy monitorować. W szczególności dotyczy to routerów komercyjnych takich firm, jak Cisco, Juniper, NetGear itp. W idealnym świecie wszyscy producenci udostępniają wszystkie informacje, a wielu jest tak wspaniałomyślnych, że dba o aktualność informacji i przydatnej dokumentacji w obrębie swoich serwisów. Jeśli nie możemy uzyskać interesujących nas informacji od producenta, możemy ich poszukać w następujących serwisach: Alvestrand (http://www.alvestrand.no/objectid/) W tym serwisie można znaleźć wszystkie informacje dotyczące baz MIB i identyfikatorów OID, jakie kiedykolwiek mogą być nam potrzebne. MIB Depot (http://www.mibdepot.com/index.shtml) Ten serwis to dobre źródło informacji specyficznych dla producentów.

Patrz także • Net-SNMP: http://net-snmp.sourceforge.net • man snmpd.conf • książka Douglasa Mauro i Kevina Schmidta Essential SNMP, wydanie II (O’Reilly, 2005)

14.13. Wyszukanie i testowanie identyfikatorów MIB i OID

| 453

14.14. Testowanie zdalnych zapytań SNMP Problem Chcemy, aby nasz serwer MRTG monitorował pewne zdalne urządzenia, na przykład inne serwery lub routery. Jakie testy należy przeprowadzić, aby uzyskać pewność, że protokół SNMP działa prawidłowo? Trzeba o tym pamiętać, ponieważ jeśli nie powiedzie się wykonanie zapytań SNMP, to program MRTG także nie będzie działał.

Rozwiązanie Działanie SNMP można przetestować za pomocą polecenia snmpwalk — w identyczny sposób, jak w przypadku hosta localhost. Wystarczy tylko wstawić właściwą nazwę hosta lub adres IP oraz wykorzystać identyfikator OID, który nas interesuje, lub wcale nie podawać identyfikatora OID: $ snmpwalk -v 2c -c haslo uberpc interfaces

Co zrobić, kiedy wyświetli się częsty i irytujący komunikat o błędzie: Timeout: No Response from uberpc2? Jest to standardowa reakcja systemu na wiele nieprawidłowości, takich jak: • nieprawidłowe hasło (ciąg społeczności); • zapora firewall blokuje port UDP 631; • program tcpwrappers blokuje port UDP 631; • demon snmpd nasłuchuje na innym porcie; • demon snmpd nie akceptuje zapytań spoza hosta localhost.

Port UDP 631 musi być otwarty na wszystkich hostach SNMP, a demon snmpd powinien nasłuchiwać adresu 0.0.0.0:161. Można się o tym przekonać, uruchamiając polecenie netstat -untap. W dystrybucji Debian możliwość uruchomienia demona snmpd jest domyślnie ograniczona do hosta localhost. Można się o tym przekonać za pomocą poleceń netstat i ps: $ netstat -untap udp 0 0 127.0.0.1:161 0.0.0.0:* $ ps ax|grep snmpd 9630 ? S 0:01 /usr/sbin/snmpd -Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/ snmpd.pid 127.0.0.1

Własność ta jest zarządzana w pliku /etc/default/snmpd za pomocą poniższego wiersza: SNMPDOPTS='-Lsd -Lf /dev/null -u snmp -I -smux -p /var/run/snmpd.pid 127.0.0.1'

Wystarczy usunąć 127.0.0.1, zrestartować demona snmpd i wszystko powinno zacząć działać prawidłowo. W naszym przypadku do kontroli dostępu wykorzystaliśmy plik snmpd.conf, zatem nie jest to konieczne. Poniższa reguła zapory iptables zezwala na przechodzenie ruchu do portu UDP 631: $ipt -A INPUT -p udp --dport 631 -j ACCEPT

2

Przekroczenie limitu czasu. Brak odpowiedzi z hosta uberpc. — przyp. tłum.

454 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

Dyskusja Na listach mailingowych i forach najczęściej spotykaną sugerowaną reakcją na komunikat o błędzie Timeout: No Response jest sprawdzenie, czy programy tcpwrappers nie blokują zapytań SNMP. Jest to raczej mało przydatna rada, ponieważ w nowoczesnych dystrybucjach Linuksa programy tcpwrappers nie są wykorzystywane zbyt często. W dalszym ciągu instaluje się je w większości popularnych dystrybucji. Łatwo też można sprawdzić, czy programy te są zainstalowane. Wystarczy sprawdzić, czy w systemie istnieją pliki /etc/hosts.allow lub /etc/ hosts.deny. Jeśli tak, to trzeba sprawdzić, czy nie blokują zapytań SNMP. Czasami jednak tych plików w ogóle nie będzie w systemie. Najczęstszą przyczyną tego błędu jest błędna konfiguracja reguł kontroli dostępu protokołu SNMP. Więcej informacji na temat reguł kontroli dostępu SNMP można znaleźć w recepturach 14.2 i 14.3.

Patrz także • rozdział 3. • Net-SNMP: http://net-snmp.sourceforge.net • man 1 snmpd.conf • man 1 snmpwalk.conf

14.15. Monitorowanie zdalnych hostów Problem Monitorowanie systemów lokalnych działa bez zarzutu. Naprawdę jednak chcemy skonfigurować serwer MRTG do monitorowania zdalnych serwerów i routerów. W jaki sposób można to zrobić?

Rozwiązanie Na hostach, które chcemy monitorować, powinny być wbudowane agenty SNMP albo trzeba na nich zainstalować pakiet Net-snmp. Wbudowane agenty SNMP są dostępne niemal we wszystkich nowoczesnych urządzeniach sieciowych. Użytkownicy systemów Linux i Unix muszą zainstalować pakiet Net-snmp. Sposób konfiguracji hostów linuksowych opisano w recepturach 14.2, 14.3 i 14.4. Następnie w pliku mrtg.cfg należy zmodyfikować opcję Target, tak by wskazywała na zdalny host. Należy to zrobić w następujący sposób: Target[uberpc.disk]: dskPercent.2&dskPercent.3:haslo@uberpc

Oczywiście trzeba jeszcze dostosować legendy i tytuły stron, tak by było wiadomo, który wykres należy do czego.

14.15. Monitorowanie zdalnych hostów

| 455

Dyskusja Należy przeanalizować receptury dotyczące protokołu SNMP, aby dowiedzieć się, w jaki sposób należy testować i rozwiązywać problemy z zapytaniami SNMP programu MRTG. Trzeba to zrobić, ponieważ jeśli nie działa SNMP, to nie funkcjonuje również program MRTG. Na zdalnych hostach trzeba jedynie zainstalować agenty SNMP. Nie trzeba na nich instalować serwerów HTTP ani programu MRTG.

Patrz także • Net-SNMP: http://net-snmp.sourceforge.net • man 1 snmpd.conf • man 1 snmpwalk.conf • man 1 mrtg-reference • strona macierzysta programu MRTG: http://oss.oetiker.ch/mrtg/

14.16. Tworzenie wielu stron skorowidza programu MRTG Problem Nasz serwer MRTG sprawnie działa, ale jest pewien kłopot — strona index.html rozrosła się do takich rozmiarów, że trudno ją kontrolować. W jaki sposób można lepiej zorganizować stronę skorowidza MRTG?

Rozwiązanie Można utworzyć wiele takich stron. Możliwe jest zorganizowanie ich według hostów, usług lub w inny dowolny sposób. W tej recepturze utworzymy oddzielną stronę skorowidza MRTG dla linuksowego serwera Uberpc. Aby to zrobić, należy wykonać poniższe czynności: Najpierw trzeba utworzyć plik mrtg-uberpc.cfg i zdefiniować w nim odpowiednie monitory. Jesteśmy już po wstępnym szkoleniu, zatem nie będziemy zajmować się programem cfgmaker, ale utworzymy plik konfiguracyjny od podstaw. Należy pamiętać o określeniu prawidłowej wartości atrybutu workdir: workdir: /var/www/mrtg/uberpc

Następnie należy utworzyć katalog /var/www/mrtg/uberpc oraz katalog na pliki dzienników: # mkdir /var/www/mrtg/uberpc # mkdir /var/log/mrtg/mrtg-uberpc.log

Następnie należy uruchomić dwa polecenia —do utworzenia wykresu i strony skorowidza: # env LANG=C mrtg /etc/mrtg-uberpc.cfg # indexmaker --output=/var/www/mrtg/uberpc/index.html /etc/mrtg-uberpc.cfg

Polecenie env LANG=C mrtg/etc/mrtg-uberpc.cfg należy uruchomić trzy razy — tak długo, aż przestanie generować komunikaty o błędach. 456 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

Na koniec należy dodać nowe zadanie cron dla stworzonej konfiguracji w pliku /etc/cron.d/mrtg. W tym przykładzie skopiowano domyślną konfigurację cron programu MRTG z dystrybucji Debian: ### radek-linux */5 * * * * root if [ -d /var/lock/mrtg ]; then if [ -x /usr/bin/mrtg ] && [ r /etc/mrtg.cfg ]; then env LANG=C /usr/bin/mrtg /etc/mrtg.cfg >> /var/log/mrtg/mrtg. log 2>&1; fi else mkdir /var/lock/mrtg; fi #### uberpc */5 * * * * root if [ -d /var/lock/mrtg ]; then if [ -x /usr/bin/mrtg ] && [ r /etc/mrtg-uberpc.cfg ]; then env LANG=C /usr/bin/mrtg /etc/mrtg-uberpc.cfg >> /var/ log/mrtg/mrtg-uberpc.log 2>&1; fi else mkdir /var/lock/mrtg; fi

Na koniec wystarczy wskazać na serwer localhost w przeglądarce WWW (http://localhost/mrtg/ uberpc/) i podziwiać nowe strony programu MRTG.

Dyskusja Niezależnie od tego, jak mocny jest nasz serwer MRTG, uruchamianie tych wszystkich zadań cron w końcu go zablokuje. Uruchomienie programu MRTG jako demona jest bardziej wydajne. Więcej informacji na ten temat można uzyskać w recepturze 14.17.

Patrz także • man 1 mrtg-reference • strona macierzysta programu MRTG: http://oss.oetiker.ch/mrtg/

14.17. Uruchomienie programu MRTG w postaci demona Problem Wiemy, że uruchamianie MRTG z wykorzystaniem mechanizmu cron zużywa wiele zasobów systemowych, ponieważ ładuje i przetwarza plik lub pliki konfiguracyjne za każdym razem, gdy się uruchomi. A zatem chcemy go uruchomić w postaci demona. W jaki sposób można to zrobić?

Rozwiązanie Jest z tym trochę pracy. Nie pozostaje zatem nic innego, jak zakasać rękawy: Tworzymy użytkownika i grupę na potrzeby uruchamiania MRTG: # groupadd mrtg # useradd -d /dev/null -g mrtg -s /bin/false mrtg

Wyszukujemy wszystkie pliki, do których użytkownik mrtg musi mieć uprawnienia dostępu, i modyfikujemy je: # chown -R mrtg:mrtg /var/www/mrtg # chown -R mrtg:mrtg /var/log/mrtg/

14.17. Uruchomienie programu MRTG w postaci demona

|

457

W sekcji opcji globalnych pliku mrtg.cfg dodajemy następujące opcje: RunAsDaemon: Yes Interval: 5

Usuwamy wszystkie zdefiniowane zadania cron lub po prostu przenosimy je w inne miejsce, jeśli zamierzamy je jeszcze wykorzystywać w przyszłości: # mv /etc/cron.d/mrtg ../mrtg

Tworzymy plik blokady i uruchamiamy program MRTG z wiersza poleceń: # mkdir /var/lock/mrtg/ # chown -R mrtg:mrtg /var/lock/mrtg/ # env LANG=C mrtg --daemon --user=mrtg --group=mrtg /etc/mrtg.cfg Daemonizing MRTG ...

W przypadku gdy posługujemy się więcej niż jednym plikiem konfiguracyjnym, należy wymienić je wszystkie: # env LANG=C mrtg --daemon --user=mrtg --group=mrtg /etc/mrtg.cfg /etc/mrtg-uberpc. cfg

Sprawdzamy uruchomione procesy za pomocą polecenia ps: $ ps ax|grep mrtg 26324 ? Ss 0:00 /usr/bin/perl -w /usr/bin/mrtg --daemon --user=mrtg --group=mrtg / etc/mrtg.cfg

Wynik tego polecenia oznacza, że uruchomienie MRTG jako demona powiodło się! Aby uruchomić go automatycznie w momencie startu systemu, potrzebny jest plik w katalogu /etc/init.d oraz łącza startowe na poziomach startu, które chcemy wykorzystać. Plik init może być bardzo prosty, na przykład o następującej zawartości: #!/bin/sh ## /etc/init.d/mrtg # chkconfig 2345 90 30 # mkdir /var/lock/mrtg/ chown -R mrtg:mrtg /var/lock/mrtg/ # Poniższe polecenie musi się znaleźć w jednym wierszu. env LANG=C mrtg --daemon --user=mrtg --group=mrtg /etc/mrtg.cfg \ /etc/mrtg-uberpc.cfg

Tworzymy ze skryptu plik wykonywalny: # chmod +x /etc/init.d/mrtg

Następnie tworzymy łącza startowe. W Debianie należy skorzystać z polecenia update-rc.d: # update-rc.d mrtg start 90 2 3 4 5 . stop 30 0 1 6

W Fedorze wykorzystywane jest polecenie chkconfig: # chkconfig --add mrtg

Dyskusja W praktyce potrzebny jest lepszy plik init niż ten pokazany w przykładzie. Użytkownicy Debiana mogą wykorzystać plik /etc/init.d/skeleton jako model do tworzenia nowych plików startowych. Jest to prosty plik startowy, który powinien działać w każdym środowisku:

458 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

#! /bin/sh ## /etc/init.d/foo # # Większość aplikacji wymaga pliku blokady. touch /var/lock/foo # uruchomienie skryptu case "$1" in start) echo "Uruchamianie skryptu foo " echo "Tutaj powinny się znaleźć inne opcjonalne komunikaty" ;; stop) echo "Zatrzymywanie skryptu foo " echo "Tutaj powinny się znaleźć inne opcjonalne komunikaty" ;; *) echo "Sposób użycia: /etc/init.d/foo {start|stop}" exit 1 ;; esac exit 0

Patrz także • man 1 mrtg-reference • strona macierzysta programu MRTG: http://oss.oetiker.ch/mrtg/

14.17. Uruchomienie programu MRTG w postaci demona

| 459

460 |

Rozdział 14. Monitorowanie sieci z wykorzystaniem systemu MRTG

ROZDZIAŁ 15.

Wprowadzenie w tematykę protokołu IPv6

15.0. Wprowadzenie Jest znacznie więcej powodów do zarekomendowania IPv6 niż tylko ten, że zastosowanie tego standardu dostarcza znacznie bardziej rozbudowanej puli adresów IP. Oto podręczna lista własności tego standardu: • automatyczna konfiguracja sieci (żegnaj DHCP); • brak kolizji adresów prywatnych; • lepszy routing w trybie multicast; • nowy mechanizm routingu w trybie anycast; • mechanizm translacji adresów sieciowych (NAT) jest opcją, a nie koniecznością; • uproszczony, wydajniejszy routing i mniejsze tabele routingu; • zapewnienie jakości usług (Quality of Service — QoS); • dobra jakość dostarczania mediów strumieniowych.

Krótko mówiąc, należy przewidywać, że wprowadzenie IPv6 znacznie ułatwi życie administratorom sieci oraz spowoduje, że cała nowa generacja wysokiej jakości usług strumieniowych audio i wideo stanie się rzeczywistością. W niniejszym rozdziale czytelnicy nauczą się podstaw korzystania z IPv6: adresacji w sieci, automatycznej konfiguracji, konfiguracji interfejsów sieciowych, zapoznają się z sieciami LAN IPv6 w trybie ad hoc oraz dowiedzą się, w jaki sposób obliczać adresy IPv6 bez konieczności posiadania stu palców. Standard IPv6 jest przyjmowany bardzo wolno, ale jego nadejście jest nieuniknione. Wdrożenie IPv6 nie wiąże się z żadnymi innymi kosztami jak tylko zapoznanie się z nowym standardem w laboratorium. W Linuksie standard IPv6 jest obsługiwany począwszy od wyższych numerów jądra 2.1.x. Obecnie większość najważniejszych narzędzi sieciowych w Linuksie obsługuje standard IPv6. Większość potrzebnych elementów jest do dyspozycji: współczesny sprzęt sieciowy (tzn. przełączniki, interfejsy, routery) w większości obsługuje IPv6. Obsługują go również kamery, telefony komórkowe, komputery PDA oraz wiele innych urządzeń. Coraz więcej dostawców 461

usług internetowych oferuje standard IPv6. Istnieje możliwość skonfigurowania tunelu IPv6 w sieci IPv4, który będzie działał w istniejących sieciach. To doskonały sposób na ćwiczenia i testowanie. W większości gotowe są również potrzebne standardy i protokoły. Potrzebne są jeszcze dwa elementy — obsługa w aplikacjach (aplikacje sieciowe muszą jawnie obsługiwać IPv6) oraz dostawcy usług muszą dokonać migracji do IPv6. Niektórzy inżynierowie sieci przewidują, że większość dostawców usług internetowych nie weźmie na poważnie standardu IPv6 do dnia, w którym zadzwonią do RIR (Regional Internet Registry) w celu uzyskania dodatkowych adresów IPv4 i uzyskają informację, że niestety już nie ma wolnych adresów.

Przeszkody w akceptacji IPv6 Przeszkody w szybszej akceptacji IPv6 są łatwe do zidentyfikowania: koszty, inercja oraz brak wiedzy. Niedostatki adresów IPv4 powodują, że stają się one intratnymi generatorami dochodów. Większość dostawców usług internetowych pobiera dodatkowe opłaty za statyczne, rutowalne adresy IP. Sytuacja ta zmieni się wraz z przejściem na IPv6. Niech liczby powiedzą same za siebie. Teoretycznie dostępnych jest 4 294 967 296 adresów IPv4, ponieważ w tym standardzie wykorzystywana jest 32-bitowa przestrzeń adresowa. Dla porównania, teoretycznie może być 340 282 366 920 938 463 463 374 607 431 768 211 456 adresów IPv6, ponieważ w tym przypadku przestrzeń adresowa ma 128 bitów. W praktyce, ze względu na występowanie adresów zarezerwowanych oraz z powodu sposobów przydzielania bloków adresów IPv4, użyteczna pula adresów IPv4 wynosi 3 706 650 000, co stanowi około trzech czwartych puli teoretycznej. Niemal 60 procent z tej puli wykorzystują Stany Zjednoczone (szczegółowy raport na ten temat jest dostępny w artykule BGP Expert 2006 IPv4 Address Use Report pod adresem http://www.bgpexpert.com/addrspace2006.php). Rzeczywista liczba dostępnych adresów IPv6 jest nieco niższa od teoretycznej, ale nie na tyle, aby mogło mieć to znaczenie tutaj, na planecie Ziemia. Jeśli kiedykolwiek nastąpi międzygalaktyczna ekspansja internetu, wówczas będzie potrzeba większej liczby adresów, ale barierę tę pokonamy wtedy, kiedy do niej dojdziemy. Interesujące jest to, że chociaż Stany Zjednoczone zajmują większą część przestrzeni adresowej IPv4, to są znacznie opóźnione w porównaniu z innymi krajami, jeśli chodzi o migrację do IPv6 oraz tanie i szybkie łącza szerokopasmowe. Wielu amerykańskich dostawców internetu dominuje w jednej dziedzinie: oferują nieatrakcyjne warunki świadczenia usług, które zabraniają uruchamiania serwerów, współdzielenia połączenia internetowego lub obsługi innych systemów operacyjnych niż Microsoft Windows. Wiemy, że to jest śmieszne — faworyzowanie najbardziej wadliwego systemu operacyjnego z wszystkimi jego wadami zabezpieczeń oraz dziesiątkami tysięcy botów zapychających połączenia internetowe jest strategią wprost z planety Dziwadło. Próba kontrolowania tego, ilu użytkowników współdzieli pojedyncze połączenie z internetem, można porównać do naliczania opłat za wodę proporcjonalnie do liczby kurków. A zatem lepsza motywacja do wprowadzenia IPv6 występuje w krajach poza Stanami Zjednoczonymi. W migracji do IPv6 oraz we wprowadzaniu zaawansowanych usług szerokopasmowych i bezprzewodowych wiodą prym takie kraje, jak Japonia i państwa Unii Europejskiej.

462 |

Rozdział 15. Wprowadzenie w tematykę protokołu IPv6

Standard IPv6 nie jest zgodny wstecz z IPv4. Przez jakiś czas będziemy wykorzystywali standard IPv4 razem ze standardem IPv6 i będziemy zmuszeni do zaakceptowania związanej z tym dodatkowej złożoności i kosztów. Ostatecznie jednak standard IPv4 nieuchronnie zginie.

Anatomia adresów IPv6 Adresy IPv6 składają się z ośmiu czwórek oddzielonych od siebie dwukropkami, co w sumie stanowi 128 bitów. Oto przykład globalnego adresu unicast: 2001:0db8:3c4d:0015:0000:0000:abcd:ef12

Globalny adres unicast IPv6 można porównać do statycznego, publicznie rutowalnego adresu unicast IPv4, na przykład 208.201.239.36 (jeden z adresów domeny oreilly.com). Są to globalnie unikatowe adresy kontrolowane przez centralny organ rejestracyjny (z listą regionalnych organów rejestracyjnych można się zapoznać w serwisie ICANN.org, pod adresem http://aso.icann.org/rirs/index.html). W świecie IPv4 prefiks dostawcy może zajmować nawet pierwsze trzy ćwiartki. Wynik polecenia whois pokazuje, że prefiks dostawcy zajmuje aż do trzech czwartych adresu oreilly.com: $ whois 208.201.239.36 [...] SONIC.NET, INC. UU-208-201-224 (NET-208-201-224-0-1) 208.201.224.0 - 208.201.255.255

Jeśli firma O’Reilly będzie chciała uzyskać więcej adresów, będzie musiała zwrócić się z tym do nadrzędnego dostawcy usług. Adresy IPv4 są rozdzielane w sposób niezbyt uporządkowany. Zdarza się, że mała firma otrzyma pięć adresów, natomiast większa, przy odrobinie szczęścia, nieco większą pulę. Jest bardzo mało prawdopodobne, że dowolna z tych firm otrzyma wystarczająco dużo adresów, by zabezpieczyć potrzeby całej firmy. Każda będzie musiała korzystać z nierutowalnych adresów za mechanizmem NAT. Jednak niezależnie od hojności dostawcy usług nie ma najmniejszych możliwości, by zbliżyć się do typowego przydziału w sieci IPv6, który wynosi 264 aktywnych hostów na podsieć. Mówiąc inaczej, liczba ta wynosi: 18 446 744 073 709 551 616

To jest pula globalnie unikatowych, rutowalnych adresów, które otrzymujemy wyłącznie dla siebie. Pomnóżmy tę wartość przez liczbę podsieci, których może być maksymalnie 65 536. To powinno wystarczyć, by sprostać naszym wymaganiom. Spróbujmy przeanalizować nasz przykładowy globalny adres unicast w standardzie IPv6: 2001:0db8:3c4d:0015:0000:0000:abcd:ef12 ______________|____|___________________ glob. prefiks podsieci ID interfejsu

Każda czwórka ma rozmiar 16 bitów. Globalny prefiks jest przypisywany przez dostawcę usług internetowych do swoich klientów. Zazwyczaj jest to /48 bitów (co pokazano w przykładzie), ale wartość ta może być różna. Duża firma może uzyskać maskę /32, a mała /56. Tej części nie można dowolnie modyfikować, ponieważ jest ona przydzielana przez dostawcę usług internetowych. A zatem część adresu identyfikująca sieć to pierwsze 64 bity, natomiast pozostałe 64 bity identyfikują hosta. Pomimo tego, że są to duże liczby, prościej je zapamiętać niż poznać różnorodne klasy adresów IPv4 oraz opanować wiele sposobów tworzenia podsieci. Kolejna ćwiartka służy do własnego wykorzystania w celu tworzenia podsieci. Przy 16 bitach do dyspozycji można stworzyć do 65 536 podsieci — wszystko do własnej dyspozycji.

15.0. Wprowadzenie

| 463

Ostatnie 64 bity to identyfikator interfejsu, czyli adres interfejsu sieciowego. Często adres ten jest tworzony na podstawie 48-bitowego adresu MAC karty interfejsu sieciowego, ale nie jest to obowiązkowe. Podobnie jak w przypadku części dotyczącej podsieci, można go wykorzystywać w dowolny sposób. A zatem po przejściu na standard IPv6 przestaniemy być żebrakami, a staniemy się prawdziwymi panami własnej domeny.

Typy i zakresy adresów IPv6 Poniżej wymieniono zakresy adresów, które będą nas interesowały najbardziej. Przydziałem adresów zajmuje się organizacja IANA (Internet Assigned Numbers Authority) — http://www. iana.org/assignments/ipv6-address-space. Wszystkie inne adresy są zarezerwowane: IPv6 Prefiks Przydział -------------------------------0000::/8 Zarezerwowane przez IETF 2000::/3 Globalne adresy unicast FC00::/7 Unikatowe lokalne adresy unicast FE80::/10 Adresy unicast lokalnych łączy FF00::/8 Adresy multicast

Poniższe bloki są zarezerwowane na potrzeby przykładów i dokumentacji: -------------------------------3fff:ffff::/32 2001:0DB8::/32 EXAMPLENET-WF

Adres pętli zwrotnej oraz adresy IPv6 z osadzonymi adresami IPv4 pochodzą z bloku adresów 0000::/8. W dystrybucjach Linuksa wielu czytelników z pewnością jest włączona obsługa adresacji IPv6: $ ifconfig eth0 Link encap:Ethernet HWaddr 00:03:6D:00:83:CF inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::203:6dff:fe00:83cf/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 [...] lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 [...]

Scope:Link, czyli Lokalny adres unicast łącza dla interfejsu eth0 oznacza, że jest to prywat-

ny, nierutowalny adres IPv6, który obowiązuje tylko w pojedynczej podsieci. Adresy lokalnego łącza są przeznaczone do łatwego tworzenia sieci na przykład na potrzeby konferencji lub spotkań. W większości dystrybucji Linuksa są tworzone automatycznie. Scope:Host dla interfejsu lo to adres pętli zwrotnej — co oznacza, że pakiety pochodzące spod

tego adresu nigdy nie opuszczają hosta. Unikatowe lokalne adresy unicast są podobne do adresów unicast lokalnych łączy. Adresy te powinny być rutowalne lokalnie, ale nie w sieci internet. Adresy lokalnego łącza nie zawsze mogą być unikatowe, zatem zachodzi ryzyko kolizji adresów. Unikatowe lokalne adresy unicast mają globalny, unikatowy prefiks oraz są niezależne od dostawcy usług, dlatego dają nam unikatową prywatną klasę adresów do wewnętrznego wykorzystania. Adresy multicast w standardzie IPv6 są podobne do adresów rozgłoszeniowych w IPv4, ale różnią się od nich w pewien sposób. Pakiet przesłany do adresu multicast jest dostarczany do każdego interfejsu w zdefiniowanej grupie. A zatem jest on ukierunkowany — pakiety multicast odbierają tylko te hosty, które należą do grupy multicast. Routery nie przekazują pakie464 |

Rozdział 15. Wprowadzenie w tematykę protokołu IPv6

tów multicast, o ile nie istnieją członkowie grup multicast, do których mają być one przekazywane. Inaczej mówiąc, oznacza to koniec ataków typu „burza rozgłoszeniowa” (ang. broadcast storm). Adresy tego typu zawsze zaczynają się na ff. Gdzie definiuje się te grupy multicast? Ich kompletną listę można znaleźć w artykule IPv6 multicast addresses pod adresem http://www.iana.org/assignments/ipv6-multicast-addresses. Dowolny adres anycast to pojedynczy adres przypisany do wielu węzłów. Pakiet przesłany pod adres anycast jest dostarczany do pierwszego dostępnego węzła. Jest to doskonały sposób na zaimplementowanie zarówno mechanizmu równoważenia obciążenia, jak i automatycznego działania w warunkach awarii (ang. failover). Kilka serwerów DNS domeny głównej wykorzystuje bazującą na routerach implementację anycast. Adresy anycast mogą być wykorzystywane wyłącznie jako adresy docelowe. Nie mogą być wykorzystywane w roli adresów źródłowych. Adresy anycast pochodzą z przestrzeni adresowej unicast, dlatego nie można stwierdzić na podstawie prefiksu, że są to adresy anycast. Zapewne wielu czytelników spotkało się z adresami 3FFE::/16 w różnorodnych dokumentach How-to. Były to adresy dla sieci testowej 6Bone, która została zamknięta w czerwcu 2006 roku. W związku z tym adresy te już nie działają.

Liczenie w systemie szesnastkowym Adresy IPv6 nie są dziesiętne, tak jak adresy IPv4, ale są przedstawiane w postaci liczb szesnastkowych. W systemie szesnastkowym liczymy w następujący sposób: 0 1 2 3 4 5 6 7 8 9 A B C D E F 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 20 21 22 23 24 25 26 27 28 29 2A 2B 2C 2D 2E 2F

Kiedy lewa cyfra dojdzie do 9, przechodzimy na litery i liczymy dalej: 90 91 92 93 94 95 96 97 98 99 9A 9B 9C 9D 9E 9F A0 A1 A2 A3 A4 A5 A6 A7 A8 A9 AA AB AC AD AE AF B0 B1 B2 B3 B4 B5 B6 B7 B8 B9 BA BB BC BD BE BF

Adresy IP w rzeczywistości są liczbami binarnymi. Notację szesnastkową wykorzystujemy dla wygody. Nie trzeba się przejmować operacjami wykonywanymi na tych obszernych adresach. Wszystkie obliczenia można wykonać za pomocą polecenia ipv6calc.

Obsługa IPv6 w systemach Mac OS i Windows System Mac OS X ma doskonałą obsługę IPv6, która powinna działać „bezpośrednio po wyjęciu z pudełka”. Obsługa IPv6 w systemie Microsoft Windows jest zróżnicowana. Systemy Windows Vista, Windows Server 2008, Windows Server 2003, Windows XP z dodatkiem Service Pack 2, Windows XP z dodatkiem Service Pack 1, Windows XP Embedded SP1 oraz Windows CE .NET mają wbudowaną obsługę IPv6. Administratorzy systemów Windows 2000 mogą wykorzystać dodatek MS Tech Preview IPv6 stack. Nie jest on przeznaczony do wykorzystania w systemach produkcyjnych, ale na potrzeby testowania: • tpipv6-001205-SP2-IE6.zip, SP2; • tpipv6-001205-SP3-IE6.zip, SP3; • tpipv6-001205-SP4-IE6.zip, SP4. 15.0. Wprowadzenie

| 465

Odpowiednie instrukcje można znaleźć pod adresem http://msdn.microsoft.com/downloads/sdks/ platform/tpipv6/start.asp. Administratorzy systemów Windows 95/98/ME i NT mogą zainstalować dodatek Trumpet Winsock v5.0. W celu zaoszczędzenia sobie kłopotów oraz aby stracić mniej włosów, lepiej zaopatrzyć się w nowszą wersję Windowsa z wbudowaną obsługą iPv6.

15.1. Testowanie instalacji systemu Linux pod kątem obsługi IPv6 Problem W jaki sposób można się przekonać, czy nasza instalacja systemu Linux obsługuje standard IPv6 i jest gotowa do jego wykorzystania?

Rozwiązanie Dostępnych jest kilka podstawowych testów, których uruchomienie pozwala się zorientować, czy system jest gotowy na wykorzystanie standardu IPv6. Najpierw należy sprawdzić obsługę standardu w jądrze: $ cat /proc/net/if_inet6 00000000000000000000000000000001 01 80 10 80 fe8000000000000002036dfffe0083cf 02 40 20 80

lo eth0

Plik /proc/net/if_inet6 musi być obecny w systemie. W tym przykładzie pokazano dwa aktywne interfejsy z adresami IPv6. Można również sprawdzić, czy załadowano moduł jądra odpowiedzialny za obsługę IPv6: $ lsmod | grep -w 'ipv6' ipv6 268960 12

Teraz wyślemy sygnał ping6 do hosta localhost: $ ping6 -c4 ::1 PING ::1(::1) 56 data bytes 64 bytes from ::1: icmp_seq=1 64 bytes from ::1: icmp_seq=2 64 bytes from ::1: icmp_seq=3 64 bytes from ::1: icmp_seq=4

ttl=64 ttl=64 ttl=64 ttl=64

time=0.040 time=0.049 time=0.049 time=0.049

ms ms ms ms

--- ::1 ping statistics -4 packets transmitted, 4 received, 0% packet loss, time 3000ms rtt min/avg/max/mdev = 0.047/0.048/0.049/0.007 ms All systems are go for IPv6.

Jak widać z wyniku tego polecenia, jesteśmy gotowi do korzystania z IPv6.

Dyskusja Wszystkie dystrybucje Linuksa wydane w bieżącym stuleciu powinny obsługiwać standard IPv6 bez konieczności wykonywania dodatkowej konfiguracji. Jeśli jednak zdarzy się, że na466 |

Rozdział 15. Wprowadzenie w tematykę protokołu IPv6

sza dystrybucja nie obsługuje IPv6, co jest bardzo mało prawdopodobne, można posłużyć się dokumentacją dystrybucji i spróbować się dowiedzieć, na czym polega problem. Warto również sięgnąć do dokumentu HOWTO Petera Bieringera Linux IPv6 HOWTO (http://tldp.org/ HOWTO/Linux+IPv6-HOWTO/index.html).

Patrz także • dokument autorstwa Petera Bieringera Linux IPv6 HOWTO:

http://tldp.org/HOWTO/Linux+IPv6-HOWTO/index.html

15.2. Wysyłanie sygnałów ping do lokalnych hostów IPv6 Problem Chcemy rozpocząć od podstaw — od testowania połączeń IPv6 za pomocą polecenia ping. Czy w ogóle można to zrobić?

Rozwiązanie Oczywiście, że można. Służy do tego polecenie ping6, które powinno być dostępne we wszystkich nowoczesnych dystrybucjach Linuksa. Oto jak można wysłać sygnał ping6 do hosta localhost oraz pod adres lokalnego łącza: $ ping6 -c2 ::1 PING ::1(::1) 56 data bytes 64 bytes from ::1: icmp_seq=1 ttl=64 time=0.045 ms 64 bytes from ::1: icmp_seq=2 ttl=64 time=0.048 ms --- ::1 ping statistics -2 packets transmitted, 2 received, 0% packet loss, time 1002ms rtt min/avg/max/mdev = 0.045/0.046/0.048/0.007 ms $ ping6 -c2 -I eth0 fe80::203:6dff:fe00:83cf PING fe80::203:6dff:fe00:83cf(fe80::203:6dff:fe00:83cf) from fe80::203:6dff:fe00:83cf eth0: 56 data bytes 64 bytes from fe80::203:6dff:fe00:83cf: icmp_seq=1 ttl=64 time=0.046 ms 64 bytes from fe80::203:6dff:fe00:83cf: icmp_seq=2 ttl=64 time=0.051 ms --- fe80::203:6dff:fe00:83cf ping statistics -2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.046/0.048/0.051/0.007 ms

W przypadku wysyłania sygnału ping6 pod adres lokalnego łącza trzeba określić interfejs sieciowy za pomocą przełącznika -I nawet wtedy, gdy w systemie mamy tylko jeden interfejs. Jeśli się tego nie zrobi, wyświetli się komunikat o błędzie connect: Invalid argument1. A w jaki sposób można wysyłać sygnały ping do innych hostów w sieci LAN? Najpierw trzeba je rozpoznać poprzez wysyłanie sygnału ping pod adres multicast lokalnego łącza:

1

Połączenie: Nieprawidłowy argument — przyp. tłum. 15.2. Wysyłanie sygnałów ping do lokalnych hostów IPv6

|

467

$ ping6 -I eth1 ff02::1 PING ff02::1(ff02::1) from fe80::203:6dff:fe00:83cf eth0: 64 bytes from fe80::203:6dff:fe00:83cf: icmp_seq=1 ttl=64 64 bytes from fe80::214:2aff:fe54:67d6: icmp_seq=1 ttl=64 64 bytes from fe80::20d:b9ff:fe05:25b4: icmp_seq=1 ttl=64 [...]

56 data bytes time=0.049 ms time=2.45 ms (DUP!) time=9.68 ms (DUP!)

Należy pozwolić na kontynuowanie wysyłania sygnałów do momentu, kiedy zaczną się powtarzać te same adresy. Polecenie ping6 ułatwia ich identyfikację, wyświetlając (DUP!). Możemy teraz wysłać do nich sygnał ping6: $ ping6 -I eth0 fe80::214:2aff:fe54:67d6

Teraz mamy pewność, że adresy lokalnego łącza IPv6 działają.

Dyskusja Skąd można się dowiedzieć, jaka jest wartość adresu lokalnego łącza? Wystarczy uruchomić polecenie ifconfig: $ /sbin/ifconfig eth0 Link encap:Ethernet HWaddr 00:03:6D:00:83:CF inet addr:192.168.1.10 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80::203:6dff:fe00:83cf/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 [...]

Patrz także • man 8 ping

15.3. Ustawianie unikatowych lokalnych adresów interfejsów Problem Nie chcemy ograniczać się do wykorzystywania wyłącznie adresów lokalnego łącza. Chcielibyśmy również wiedzieć, w jaki sposób dodaje się i usuwa własne adresy IPv6. Chcemy również poeksperymentować z unikatowymi lokalnymi adresami unicast, tak by można było przetestować routing.

Rozwiązanie W celu wykonania tego zadania można skorzystać z polecenia ip. Aby ustawić unikatowe lokalne adresy unicast dla dwóch połączonych komputerów PC, można skorzystać z poniższych poleceń: root@linux-radek:~# ip -6 addr add FC01::1/64 dev eth0 root@stinkpad:~# ip -6 addr add FC01::2/64 dev eth0

Komputery te mogą teraz wysyłać do siebie wzajemnie sygnał ping6: root@linux-radek:~# ping6 FC01::2 PING FC01::2(fc01::2) 56 data bytes 64 bytes from fc01::2: icmp_seq=1 ttl=64 time=7.33 ms

468 |

Rozdział 15. Wprowadzenie w tematykę protokołu IPv6

root@stinkpad:~# ping6 FC01::1 $ ping6 FC01::1 PING FC01::3(fc01::1) 56 data bytes 64 bytes from fc01::1: icmp_seq=1 ttl=64 time=6.06 ms

Każdy host może również wysłać sygnał ping6 pod swój własny adres. Podczas wysyłania sygnałów ping pod unikatowe adresy lokalnych unicast nie trzeba wskazywać interfejsu, tak jak w przypadku adresów lokalnego łącza. Adresy te są usuwane po ponownym uruchomieniu systemu. Do usunięcia adresów można również wykorzystać polecenie ip: # ip -6 addr del FC01::1/64 dev eth0

Dyskusja W tej recepturze zaprezentowano wyłącznie techniczne ćwiczenie, zupełnie nieprzydatne w systemach produkcyjnych. Unikatowe lokalne adresy unicast powinny być unikatowe w skali globalnej. W jaki sposób można to osiągnąć bez centralnego rejestru? W dokumencie RFC 4193 Unique Local IPv6 Unicast Addresses zamieszczono kilka sugestii dotyczących metod generowania unikatowych adresów. Są one jednak przeznaczone dla programistów tworzących narzędzia do generowania adresów, a nie dla administratorów sieci. Jedyne co można zrobić, to inkrementowanie części adresu spełniającej funkcję identyfikatora interfejsu podczas przypisywania unikatowych lokalnych adresów unicast dodatkowym hostom. Takie adresy można wykorzystać do testowania routingu, usług rozwiązywania nazw oraz innych podstawowych funkcji sieciowych. Po co się tym przejmować, kiedy możemy uzyskać więcej globalnych adresów unicast od dostawcy usług, niż kiedykolwiek będzie to nam potrzebne? Ponieważ: • są to adresy niezależne od jakiegokolwiek dostawcy usług, co zapewnia nam pełną swobodę; • adresy te mają dobrze znany prefiks, co pozwala na łatwe filtrowanie na poziomie route-

rów brzegowych; • jeśli zdarzy się, że pakiety spod tych adresów przypadkowo znajdą się poza siecią, nie

powinny kolidować z żadnymi innymi adresami.

Proste przykłady w tej recepturze pokazują kilka skrótów do wyrażania adresów IPv6. FC01::1 to skrót adresu FC01:0000:0000:0000:0000:0000:0000:0001. Adres powinien mieć następującą strukturę: | 7 bitów|1| 40 bitów | 16 bitów | 64 bity | +--------+-+------------+-----------+----------------------------+ | Prefiks|L| Globalny ID|ID Podsieci| ID Interfejsu | +--------+-+------------+-----------+----------------------------+

Standard IPv6 pozwala na pomijanie czwórek zawierających same zera. Adres FC01::1 można równie dobrze zapisać jako FC01:0:0:0:0:0:0:1. Więcej informacji na ten temat można znaleźć w recepturze 15.7.

Patrz także • man 8 ping • dokument RFC 4193 Unique Local IPv6 Unicast Addresses

15.3. Ustawianie unikatowych lokalnych adresów interfejsów

| 469

15.4. Wykorzystanie SSH z adresami IPv6 Problem W jaki sposób w sieci IPv6 skorzystać ze zdalnej administracji za pośrednictwem SSH?

Rozwiązanie Oczywiście jest to możliwe. Można skorzystać z następującego polecenia: $ ssh fe80::214:2aff:fe54:67d6%eth0 carla@fe80::214:2aff:fe54:67d6%eth0's password: Linux uberpc 2.6.20-15-generic #2 SMP Sun Apr 15 07:36:31 UTC 2007 i686 Last login: Wed Jun 6 18:51:46 2007 from xena.alrac.net carla@uberpc:~$

Zwróćmy uwagę, że dla adresów lokalnego łącza trzeba określić interfejs sieciowy i poprzedzić go znakiem procenta. Można się zalogować z wykorzystaniem konta innego użytkownika w następujący sposób: $ ssh user@fe80::214:2aff:fe54:67d6%eth0

W przypadku gdy wykorzystywane są adresy unicast, nie trzeba określać interfejsu: $ ssh user@FC01::1

Kopiowanie plików za pomocą polecenia scp jest kłopotliwe, ponieważ trzeba ująć adres w nawiasy kwadratowe, a następnie poprzedzić nawiasy ukośnikiem: $ scp filename.txt \[FC01::2\]: carla@fc01::2's password: filename.txt

Dyskusja Adresami IPv6 przy połączeniach SSH rzadko będziemy się posługiwać w praktyce. Zazwyczaj bowiem korzystamy z usług DNS. Adresy IPv6 przydają się jednak do testowania i rozwiązywania problemów. W przypadku gdy dla serwera SSH skonfigurowano reguły kontroli dostępu, umożliwienie logowania za pośrednictwem IPv6 wymaga zmiany niektórych opcji: AddressFamily

Domyślną wartością jest any. Można również użyć wartości inet dla adresacji IPv4 lub inet6 (IPv6). ListenAddress

Domyślną wartością jest any. W przypadku wprowadzenia ograniczeń dostępu według adresów IP trzeba wprowadzić lokalne adresy IPv6.

Patrz także • man 1 ssh • man 5 sshd_config • man 1 scp

470

|

Rozdział 15. Wprowadzenie w tematykę protokołu IPv6

15.5. Kopiowanie plików w sieci IPv6 z wykorzystaniem scp Problem SSH działa poprawnie i umożliwia logowanie się do zdalnych komputerów PC z wykorzystaniem adresów IPv6. Jednak próba kopiowania plików za pomocą narzędzia scp nie działa. Przy takiej próbie wyświetla się mało przydatny komunikat: ssh: fe80: Name or service not known lost connection

Co należy zrobić?

Rozwiązanie Wykorzystanie scp wymaga zastosowania pewnej dziwnej składni. Trzeba wprowadzić polecenie dokładnie tak, jak pokazano w poniższym przykładzie: $ scp filename carla@\[fe80::203:6dff:fe00:83cf%eth0\]:

Adres IPv6 musi być ujęty w nawiasy kwadratowe, a te muszą być poprzedzone ukośnikami. W przypadku logowania z wykorzystaniem konta innego użytkownika nazwę użytkownika należy umieścić poza nawiasem. Dla adresów lokalnego łącza trzeba również określić lokalny interfejs poprzedzony znakiem procenta, identycznie jak w przypadku OpenSSH.

Dyskusja W czasie powstawania tej książki strony podręcznika systemowego man dla polecenia scp oraz dla OpenSSH nie opisywały specjalnej składni dla sieci IPv6. W związku z tym musimy zadowolić się tym, co napisano o niej w tej recepturze.

Patrz także • man 1 ssh • man 1 scp

15.6. Automatyczna konfiguracja z wykorzystaniem IPv6 Problem Wiele słyszeliśmy na temat wspaniałych możliwości automatycznej konfiguracji w sieciach IPv6. W jaki sposób można skorzystać z tej własności?

15.6. Automatyczna konfiguracja z wykorzystaniem IPv6

|

471

Rozwiązanie Można ułatwić sobie życie i skorzystać z radvd — demona rozgłaszającego routera. W poniższym prostym przykładzie /etc/radvd.conf wykorzystano adresację z receptury 15.3: ##/etc/radvd.conf interface eth0 { AdvSendAdvert on; MinRtrAdvInterval 3; MaxRtrAdvInterval 10; prefix FC00:0:0:1::/64 { AdvOnLink on; AdvAutonomous on; AdvRouterAddr on; }; };

Zapisujemy zmiany i restartujemy program radvd: # /etc/init.d/radvd restart Restarting radvd: radvd.

Program radvd ogłosi o swoim istnieniu, a klienty automatycznie pobiorą nowe adresy. Można to sprawdzić za pomocą polecenia ip: $ ip -6 addr show eth0 2: eth0: mtu 1500 qlen 1000 inet6 fc00::1:214:2aff:fe54:67d6/64 scope global dynamic

Dyskusja Program radvd z założenia ma być prosty, a zatem nie trzeba robić nic ponad to, co pokazano w tej recepturze. Podczas wykonywania ćwiczeń w sieci testowej można wykorzystać dowolny zakres adresów IPv6 (więcej informacji na ten temat można znaleźć w punkcie „Wprowadzenie”). Należy jedynie pamiętać, że prefiks to pierwsze 64 bity, czyli pierwsze cztery czwórki, natomiast część dotycząca hosta to kolejne 64 bity. W adresach umieszczonych w pliku radvd.conf należy pozostawić pustą część dotyczącą hosta, ponieważ ta część będzie przypisana przez demona.

Patrz także • man 8 radvd • man 5 radvd.conf

15.7. Obliczanie adresów IPv6 Problem Już obliczanie adresów IPv4 było dostatecznie zabawne, a teraz trzeba posługiwać się tymi gigantycznymi adresami IPv6. Czy istnieje narzędzie podobne do ipcalc, dzięki któremu można by uzyskać pewność, że przypisane adresy są prawidłowe?

472

|

Rozdział 15. Wprowadzenie w tematykę protokołu IPv6

Rozwiązanie Owszem, jest takie narzędzie — ipv6calc. Posługiwanie się nim jest proste, o czym można się przekonać na podstawie poniższego przykładu. Poniższe polecenie analizuje dowolny przekazany do niego adres — zarówno IPv4, jak i IPv6: $ ipv6calc --showinfo -m FC00:0:0:1:: No input type specified, try autodetection...found type: ipv6addr No output type specified, try autodetection...found type: ipv6addr IPV6=fc00:0000:0000:0001:0000:0000:0000:0000 TYPE=unicast,unique-local-unicast SLA=0001 IPV6_REGISTRY=reserved IID=0000:0000:0000:0000 EUI64_SCOPE=local

Oto przykład kompresji adresów IPv6: $ ipv6calc --addr_to_compressed fc00:0000:0000:0001:0000:0000:0000:0000 fc00:0:0:1::

Poniższe polecenie częściowo dekompresuje adres IPv6: $ ipv6calc --addr_to_uncompressed fc00:0:0:1:: fc00:0:0:1:0:0:0:0

Poniższe polecenie wyświetla adres w pełnej postaci: $ ipv6calc --addr_to_fulluncompressed fc00:0:0:1:: fc00:0000:0000:0001:0000:0000:0000:0000

Program ipv6calc wyznaczy rekordy DNS PTR. Dzięki temu można skopiować go i wkleić do plików strefy BIND: $ ipv6calc --out revnibbles.arpa fc00:0:0:1:: No input type specified, try autodetection...found type: ipv6addr 0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.1.0.0.0.0.0.0.0.0.0.0.0.0.0.c.f.ip6.arpa.

Prefiksy IPv6 można przekształcić na IPv4 oraz w drugą stronę: $ ipv6calc -q --action conv6to4 --in ipv4 192.168.1.10 --out ipv6 2002:c0a8:10a:: $ ipv6calc -q --action conv6to4 --in ipv6 2002:c0a8:aeb:: --out ipv4 192.168.10.235

Dyskusja Obliczanie podsieci w standardzie IPv6 jest łatwiejsze, ponieważ wymaga ustawienia tylko jednego pola w adresie, a chociaż istnieje wiele różnych zakresów adresów (tabelę zakresów adresów i ich typów można znaleźć w punkcie „Wprowadzenie”), to struktura adresów w każdym przypadku jest taka sama. Pierwsze 64 bity — cztery czwórki — zawsze określają prefiks sieci i podsieć. Ostatnie 64 bity to zawsze adres interfejsu. Aby przetestować używanie IPv6 w internecie, należy zarejestrować się u sprzedawcy tunelu 6to4. Są to dostawcy usług, którzy zapewniają specjalne usługi routingu pozwalające na transmisję ruchu IPv6 w sieciach IPv4. Adres IPv4 jest przekształcany na format szesnastkowy i osadzany w prefiksie tunelu IPv6. Adresy 6to4 zawsze zaczynają się od 2002: 2002:nnnn:nnnn::1

15.7. Obliczanie adresów IPv6

|

473

Patrz także • man 8 ipv6calc

15.8. Wykorzystywanie iPv6 w internecie Problem Cała ta zabawa w sieci LAN jest OK, ale interesuje nas przeprowadzenie poważnych testów w internecie. Czy potrzebujemy do tego celu specjalnego dostawcy usług internetowych, czy też możemy to zrobić samodzielnie?

Rozwiązanie Potrzebny jest specjalny dostawca. Są dwie możliwości: dostawca usług internetowych, który oferuje klasyczną sieć IPv6 (to byłoby doskonałe), czy też sprzedawca usług dający dostęp do tunelu 6to4, wykorzystujący specjalny sposób routingu, który hermetyzuje ruch IPv6 wewnątrz sieci IPv4. Dostawcy usług (sprzedawcy) przydzielają nam blok adresów IPv6, tak jak dostawcy klasycznych sieci IPv6, a także oferują usługi DNS. Do sieci można podłączyć pojedynczy host lub skonfigurować bramę dla sieci LAN. Tunelowanie 6to4 to usługi dostępne przejściowo, które w końcu znikną i zostaną zastąpione klasycznymi sieciami IPv6. Oto lista sprzedawców tunelu 6to4. Bez wątpienia w internecie można znaleźć dodatkowych: • Hexago.com (http://www.hexago.com); • SixXs.net (https://noc.sixxs.net/); • Hurricane Electric (http://www.tunnelbroker.net/); • BT Exact (https://tb.ipv6.btexact.com/start.html); • AARNet IPv6 Migration Broker (http://broker.aarnet.net.au/).

Dyskusja Każdy dostawca oferuje inne narzędzia do zarządzania usługą, zatem w celu nawiązania połączenia trzeba postępować zgodnie ze wskazówkami. Większość z dostawców oferuje swoje usługi za darmo. Skorzystanie z nich jest świetnym sposobem na zdobycie doświadczenia w zarządzaniu siecią IPv6.

Patrz także • Deepspace6 (http://www.deepspace6.net/) to dobre źródło wiedzy dla administratorów sieci

IPv6 w systemie Linux

474

|

Rozdział 15. Wprowadzenie w tematykę protokołu IPv6

ROZDZIAŁ 16.

Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

16.0. Wprowadzenie Tworzenie nowych instalacji systemu Linux w sieci na podstawie obrazu istniejących jest łatwe, o ile mamy dostęp do odpowiednich serwerów oraz skonfigurowaliśmy klienty w taki sposób, aby był możliwy ich rozruch przez sieć. W przypadku sprzętu klasy x86 jest to trochę skomplikowane, ponieważ pierwotnie nie został on zaprojektowany z myślą o rozruchu przez sieć. W związku z tym nawet współcześnie uruchamianie klientów x86 przez sieć może sprawiać pewne trudności. Na szczęście Linux umożliwia rozruch systemu na wiele sposobów, zatem tak czy inaczej można uruchomić pożądaną konfigurację: • ładowanie systemu z płyty CD-ROM; • ładowanie systemu z napędu USB flash; • wykorzystanie mechanizmu PXE boot.

Dla dystrybucji Debian i Fedora są dostępne obrazy zapewniające ładowanie systemu przez sieć dla płyt CD-ROM i urządzeń USB. Dystrybucje te obsługują również ładowanie systemu z wykorzystaniem środowiska PXE (Preboot Execution Environment), co oznacza, że nie będzie potrzebny napęd CD-ROM lub USB — wystarczy interfejs sieciowy, BIOS komputera PC obsługujący ładowanie systemu przez PXE oraz serwer rozruchowy PXE. Jeśli nasz BIOS lub karta sieciowa nie obsługują rozruchu systemu za pośrednictwem środowiska PXE, można pobrać odpowiednie narzędzia z serwisu WWW projektu Etherboot (http://www.etherboot.org). Należy pobrać obraz dyskietki startowej, skopiować ją na dyskietkę i skonfigurować komputer w taki sposób, aby był możliwy rozruch z dyskietki.

475

Rozruch systemu za pomocą środowiska PXE W przypadku starszego sprzętu sieciowego mogą wystąpić problemy z obsługą rozruchu systemu w środowisku PXE, jednak bez większych kłopotów można go odpowiednio zaktualizować. Przede wszystkim należy sprawdzić, czy BIOS komputera obsługuje rozruch przez PXE. Wszystkie komputery sprzed 2000 roku raczej nie będą obsługiwały ładowania systemu przez PXE. Można jednak spróbować uaktualnić BIOS i w ten sposób uzyskać obsługę ładowania systemu przez PXE oraz dostęp do innych nowoczesnych funkcji. Po usprawnieniu BIOS-u należy sprawdzić możliwości interfejsu sieciowego. Niektóre karty sieciowe obsługują rozruch w środowisku PXE „z pudełka”. Posiadanie takiego sprzętu jest najlepszym i najłatwiejszym rozwiązaniem. W niektórych jest puste gniazdo przeznaczone na zainstalowanie dodatkowego układu ROM. Niektóre po prostu wcale nie obsługują rozruchu systemu za pośrednictwem środowiska PXE. Zaprogramowane układy ROM można kupić za mniej więcej 50 zł. Można również kupić pustą pamięć ROM i umieścić na niej własny kod ładowania systemu. Jest z tym dość dużo pracy, ale jeśli właśnie o to nam chodzi, możemy skorzystać z projektu Etherboot (http://www. etherboot.org). Można też uniknąć konieczności wykonywania wszystkiego samodzielnie i skorzystać z dyskietki Etherboot.

Rozruch systemu przez USB Rozruch systemu z napędu USB, niezależnie od tego, czy jest to obszerny dysk twardy, czy też niewielki pendrive, również może nastręczać pewnych trudności. Nowsze maszyny powinny obsługiwać tę własność. Trzeba jednak zwrócić uwagę na kilka elementów. Przed włączeniem zasilania komputera napęd USB musi być podłączony. Następnie trzeba sprawdzić ustawienia BIOS-u, aby uzyskać pewność, że wszystkie dostępne opcje obsługi USB są włączone. Następnie należy sprawdzić, czy BIOS zawiera opcję rozruchu z alternatywnego urządzenia — na przykład w nowszych wersjach Phoenix BIOS menu alternatywnych urządzeń rozruchu jest dostępne po wciśnięciu klawisza F11. W ten sposób można zaoszczędzić sobie kłopotów związanych z ustawianiem kolejności urządzeń rozruchu w ustawieniach BIOS-u. Jeśli nie ma opcji rozruchu z napędu flash USB, można spróbować wszystkich dostępnych urządzeń USB, na przykład USB-Zip lub USB-HDD.

Instalacja Po tym, kiedy system kliencki jest uruchomiony i znajduje się w sieci, pozostała część procesu instalacji przebiega identycznie, jak w przypadku korzystania ze standardowych płyt CD lub DVD. Co więcej, można skonfigurować niestandardowe, automatyczne instalacje, dzięki czemu po załadowaniu instalatora i podłączeniu klienta do serwera instalacji, nie trzeba nawet ruszyć palcem.

476

|

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

16.1. Tworzenie nośnika startowego do sieciowej instalacji dystrybucji Fedora Linux Problem Dystrybucja Fedora Linux bardzo się rozrosła! Pobranie obrazów ISO wymaga pięciu płyt CD lub jednej płyty DVD. Niezależnie od tego, czy korzystamy z BitTorrent, czy nie, jest to sporo danych do ściągnięcia i nawet najbardziej kompaktowa instalacja wymaga pakietów z wielu dysków. Czy nie można zainstalować minimalnego obrazu rozruchowego z płyty CD lub napędu USB, a następnie wykorzystać program instalacyjny, aby pobrał resztę z serwera lustrzanego dystrybucji Fedora?

Rozwiązanie Oczywiście, że można i w rzeczywistości zawsze było można, jednak nie zostało to zbyt dobrze udokumentowane, dlatego niewielu użytkowników o tym wie. Można skopiować minimalny obraz rozruchowy na płytę CD lub napęd USB flash, załadować system, wybrać serwer lustrzany dystrybucji Fedora, a następnie przeprowadzić instalację w całości przez internet. Najpierw należy pobrać obraz startowej płyty CD lub dysku Flash USB. Jak pokazano w poniższym przykładzie, można je znaleźć w katalogu os/ wybranego serwera lustrzanego dystrybucji Fedora (nie ma ich w katalogu iso/): ftp://mirrors.kernel.org/fedora/releases/7/Fedora/i386/os/images Obraz startowej płyty CD jest zapisany w pliku boot.iso, natomiast obraz dysku USB znajduje się w pliku diskboot.img. Do utworzenia startowej płyty CD na podstawie obrazu .iso należy wykorzystać dowolny program do nagrywania płyt CD — na przykład K3b. Do skopiowania obrazu diskboot.img na dysk USB można skorzystać z polecenia dd. Ostrzeżenie: operacja powoduje nadpisanie poprzedniej zawartości nośnika. Najpierw trzeba sprawdzić, czy nośnik USB jest odmontowany, a następnie przesłać obraz dysku startowego za pomocą poniższego polecenia, wykorzystując nazwę /dev urządzenia w naszym systemie: # dd if=diskboot.img of=/dev/sdb 24576+0 records in 24576+0 records out 12582912 bytes (13 MB) copied, 3.99045 seconds, 3.2 MB/s

Następnie montujemy dysk USB, aby sprawdzić, czy pliki zostały prawidłowo skopiowane. Nośnik USB powinien mieć następującą zawartość: $ ls /media/disk boot.msg initrd.img ldlinux.sys general.msg isolinux.bin options.msg

param.msg rescue.msg

splash.jpg vesamenu.c32 syslinux.cfg vmlinuz

Rozruch systemu z wymiennego nośnika jest zarządzany przez BIOS naszego komputera. Podczas próby załadowania systemu z pliku CD lub dysku USB należy zwrócić uwagę na opcję postaci Press this key to select an alternate boot device1. Jeśli w określonym systemie nie ma tej opcji, trzeba zmodyfikować opcje rozruchu w ustawieniach BIOS. 1

Wciśnij klawisz, aby wybrać alternatywne urządzenie rozruchu — przyp. tłum. 16.1. Tworzenie nośnika startowego do sieciowej instalacji dystrybucji Fedora Linux

|

477

Dyskusja Listę serwerów lustrzanych dystrybucji Fedora można znaleźć pod adresem http://fedora.redhat. com/download/mirrors.html. Rozruch systemu z nośników USB jest stosunkowo nową własnością. Nie należy zatem się dziwić, jeśli niektóre z naszych komputerów jej nie obsługują. Własność ta nie działa nawet w takich systemach, których producenci obiecują możliwość rozruchu systemu z urządzeń USB. Nie należy zatem tracić głowy — jeśli funkcja ma działać, to będzie działać. W jaki sposób odczytać nazwę /dev urządzenia USB? Można spróbować wykorzystać polecenie ls: $ ls -l /dev/disk/by-id/ [...] lrwxrwxrwx 1 root root 9 2007-07-17 12:25 usb-LEXAR_JD_FIREFLY_106A64051428310606060:0 -> ../../sdb

Urządzenie /dev można również zidentyfikować za pomocą polecenia lsscsi. Czytelnikom, którzy zastanawiają się nad możliwością użycia dyskietki startowej 3.5" jako opcji rozruchu, odpowiadam, że nie ma takiej możliwości. Dla dystrybucji Fedora nie są dostępne obrazy dyskietek instalacyjnych, ponieważ nośniki te mają zbyt małą objętość.

Patrz także • man 1 dd • podręcznik instalacji dla wybranej wersji Fedory z serwisu Fedoraproject.org:

http://fedoraproject.org/ • przed rozpoczęciem instalacji zawsze należy czytać plik z uwagami o wersji (ang. release

notes)

16.2. Instalacja dystrybucji Fedora z wykorzystaniem sieciowego nośnika startowego Problem Utworzyliśmy startowy dysk CD lub nośnik USB z dystrybucją Fedora i jesteśmy gotowi do rozpoczęcia instalacji. Co dalej?

Rozwiązanie Przed uruchomieniem komputera, z którego będzie przeprowadzana instalacja, należy przygotować drugi komputer podłączony do internetu. Wcześniej warto odwiedzić stronę z listą serwerów lustrzanych dystrybucji Fedora, którą można znaleźć pod adresem http://fedora.redhat. com/download/mirrors.html. Potrzebna nam będzie pełna ścieżka dostępu do katalogu instalacji, na przykład: ftp://mirrors.kernel.org/fedora/releases/7/Fedora/i386/os

478

|

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

Następnie podłączamy nośnik startowy i uruchamiamy system. Pierwsza opcja do wyboru to uruchomienie instalatora w trybie graficznym bądź tekstowym. Główna różnica polega na tym, że w trybie tekstowym nie można się posługiwać myszą. Graficzny instalator można uruchomić w systemach zawierających co najmniej 192 MB pamięci RAM. Przechodzimy przez wstępne ekrany. Nie ma w tym nic ekscytującego — zwykła konfiguracja klawiatury, języka i sieci. Zabawa zaczyna się, kiedy dojdziemy do ekranu Metoda instalacji. Należy wybrać opcję FTP lub HTTP. Na rysunku 16.1 pokazano ten ekran z wybraną opcją FTP.

Rysunek 16.1. Wybór lustrzanego serwera FTP instalacji

Zarówno dla opcji FTP, jak i HTTP trzeba bezpośrednio wprowadzić prawidłową nazwę serwisu z dystrybucją Fedora. W polu z nazwą serwisu należy wpisać nazwę domeny głównej, na przykład ftp://mirrors.kernel.org. W polu Fedora Core directory należy wpisać ścieżkę dostępu do dystrybucji, na przykład /fedora/releases/7/Fedora/i386/os, a następnie wcisnąć OK. Jeśli wszystkie opcje zostały ustawione prawidłowo, to na następnym ekranie wyświetli się komunikat Retrieving images/minstg2.img…. Archiwum ma objętość 34 MB, o czym można się przekonać samodzielnie, przeglądając zawartość wybranego serwera lustrzanego. Dalsza instalacja przebiega tak jak każda instalacja dystrybucji Fedora — należy podzielić dysk na partycje, wybrać pakiety i wykonywać standardowe zadania instalacyjne.

Dyskusja W celu zaktualizowania systemu natychmiast po instalacji należy uruchomić polecenie yum update.

Jest to interesująca metoda instalacji dystrybucji Fedora na pojedynczym komputerze PC pozwalająca na pobranie i przetestowanie nowej wersji. Metoda nie nadaje się do masowych niestandardowych instalacji, ale tym tematem zajmiemy się w kilku kolejnych recepturach.

16.2. Instalacja dystrybucji Fedora z wykorzystaniem sieciowego nośnika startowego

|

479

Nie ma znaczenia, czy wybierzemy metodę komunikacji przez FTP, czy HTTP. Obie działają bez zarzutu. W przypadku popełnienia błędu w ścieżce dostępu do plików program instalacyjny Anaconda z dystrybucji Fedora umożliwi nam wprowadzenie tylu poprawek, ile trzeba — aż do czasu podania prawidłowej ścieżki. Obraz instalatora musi się zmieścić w pamięci RAM, dlatego z graficznego programu instalacyjnego można skorzystać tylko w przypadku systemów zawierających co najmniej 192 MB pamięci RAM. W systemach z mniejszą ilością pamięci RAM automatycznie uruchomi się instalator w trybie tekstowym. Dystrybucja Fedora jest wyposażona w mechanizm pozwalający na sprawdzenie integralności instalacyjnych płyt CD. Czasami mechanizm ten wyświetla informację, że płyta CD zawiera uszkodzenia. Aby mechanizm działał prawidłowo, należy uruchomić program instalacyjny z opcją linux ide=nodma. Jeśli przed ukończeniem instalacji wystąpi błąd, należy spróbować rozruchu z opcją linux acpi=off.

Patrz także • przed rozpoczęciem instalacji zawsze należy czytać plik z uwagami o wersji (ang. release

notes) • strona zawierająca listę serwerów lustrzanych z dystrybucją Fedora:

http://fedora.redhat.com/download/mirrors.html • podręcznik instalacji dla wybranej wersji Fedory z serwisu Fedoraproject.org:

http://fedoraproject.org/

16.3. Konfiguracja serwera instalacji dystrybucji Fedora bazującego na HTTP Problem Chcemy skonfigurować własny lokalny serwer instalacji, aby można było podłączać i konfigurować nowe systemy najmniejszym możliwym nakładem sił. Preferujemy uruchomienie serwera HTTP.

Rozwiązanie Najpierw należy pobrać obraz ISO płyty DVD z dystrybucją Fedora. Informację o lokalizacji, w której jest dostępny ten obraz, można znaleźć w serwisie fedoraproject.org (http://fedoraproject. org/get-fedora.html). Jeśli korzystamy z BitTorrent, integralność pliku będzie sprawdzona automatycznie. W przeciwnym przypadku po zakończeniu pobierania należy pamiętać o tym, aby ręcznie porównać sumę kontrolną: $ sha1sum F-7-i386-DVD.iso 96b13dbbc9f3bc569ddad9745f64b9cdb43ea9ae

F-7-i386-DVD.iso

Prawidłową sumę kontrolną można znaleźć w tym samym katalogu pobierania, w którym znajduje się obraz płyty. 480 |

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

Obraz płyty można zapisać na płytę DVD jako kopię rezerwową, ale do działania serwera instalacji nie będzie potrzebny napęd DVD — wystarczy sam obraz ISO. Instalujemy serwer HTTP Lighttpd, który będzie „silnikiem” naszego serwera instalacji. W dystrybucji Debian można go zainstalować za pomocą poniższego polecenia: # aptitude install lighttpd lighttpd-doc

W dystrybucji Fedora należy uruchomić następujące polecenia: # yum install lighttpd

Obraz ISO dystrybucji Fedora można zapisać w dowolnym miejscu na serwerze, ale trzeba go zamontować w katalogu serwera WWW, na przykład /var/www/fedora. Do jego zamontowania można skorzystać z urządzenia pętli zwrotnej, na przykład: # mount -o loop F-7-i386-DVD.iso /var/www/fedora

Po zamontowaniu zamiast jednego gigantycznego pliku w katalogu powinno być widocznych wiele plików: $ ls /var/www/fedora Fedora isolinux RPM-GPG-KEY fedora.css README-BURNING-ISOS-en_US.txt GPL RELEASE-NOTES-en_US.html images repodata

RPM-GPG-KEY-fedora-test RPM-GPG-KEY-beta RPM-GPG-KEY-rawhide RPM-GPG-KEY-fedora stylesheet-images RPM-GPG-KEY-fedora-rawhide TRANS.TBL

Możemy teraz skorzystać ze startowego nośnika instalacji, który utworzyliśmy w poprzedniej recepturze, i zacząć instalację nowych systemów z własnego lokalnego serwera instalacji dystrybucji Fedora.

Dyskusja W niniejszej recepturze zaprezentowano szybki sposób udostępnienia w sieci pojedynczej kopii dystrybucji Fedora Linux. Instalacja z tej kopii powinna przebiegać znacznie szybciej w porównaniu z instalacją przez internet i o wiele przyjemniej w porównaniu z oficjalnymi serwerami lustrzanymi. Należy zadbać o to, aby w katalogu z dystrybucją Fedora mieli prawo czytania wszyscy użytkownicy, a prawo zapisu tylko właściciel. Właścicielem tego katalogu nie musi być użytkownik root, zatem można w tej roli ustawić właściciela serwera HTTP. W celu zaktualizowania systemu natychmiast po jego instalacji w systemach klienckich należy uruchomić polecenie yum update.

Patrz także • przed rozpoczęciem instalacji zawsze należy czytać plik z uwagami o wersji (ang. release

notes) • Lighttpd: http://www.lighttpd.net/ • strona zawierająca listę serwerów lustrzanych z dystrybucją Fedora

http://fedora.redhat.com/download/mirrors.html • podręcznik instalacji dla wybranej wersji Fedory z serwisu Fedoraproject.org:

http://fedoraproject.org/

16.3. Konfiguracja serwera instalacji dystrybucji Fedora bazującego na HTTP

|

481

16.4. Konfiguracja serwera instalacji dystrybucji Fedora bazującego na FTP Problem Chcemy skonfigurować własny lokalny serwer instalacji, aby można było podłączać i konfigurować nowe systemy najmniejszym możliwym nakładem sił. Preferujemy uruchomienie serwera FTP.

Rozwiązanie Najpierw należy pobrać obraz ISO płyty DVD z dystrybucją Fedora. Informację o lokalizacji, w której jest dostępny ten obraz, można znaleźć w serwisie Fedoraproject.org (http://fedoraproject.org/get-fedora.html). Jeśli korzystamy z BitTorrent, integralność pliku będzie sprawdzona automatycznie. W przeciwnym przypadku po zakończeniu pobierania należy pamiętać o tym, aby ręcznie porównać sumę kontrolną: $ sha1sum F-7-i386-DVD.iso 96b13dbbc9f3bc569ddad9745f64b9cdb43ea9ae

F-7-i386-DVD.iso

Prawidłową sumę kontrolną można znaleźć w tym samym katalogu pobierania, w którym znajduje się obraz płyty. Obraz płyty można zapisać na płytę DVD jako kopię rezerwową, ale do działania serwera instalacji nie będzie potrzebny napęd DVD — wystarczy sam obraz ISO. Instalujemy vsftpd — bezpieczny serwer FTP, który będzie „silnikiem” naszego serwera instalacji. W dystrybucji Debian można go zainstalować za pomocą poniższego polecenia: # aptitude install vsftpd

W dystrybucji Fedora należy uruchomić następujące polecenia: # yum install vsftpd # chkconfig vsftpd on

W Debianie wykorzystywany jest plik /etc/vsftpd.conf, natomiast w Fedorze /etc/vsftpd/vsftpd. conf. Poniższy plik konfiguracyjny umożliwia prosty, anonimowy dostęp tylko do odczytu. Użytkownicy mogą pobierać pliki, ale nie mogą wgrywać ich na serwer: ##vsftpd.conf listen=YES anonymous_enable=YES ftpd_banner=Witamy na przyjaznym serwerze instalacji dystrybucji Fedora # Katalog domyślny użytkowników Debiana anon_root=/home/ftp/fedora # Katalog domyślny użytkowników Fedory anon_root=/var/ftp/fedora

Użytkownicy Debiana muszą utworzyć katalog przeznaczony na drzewo instalacyjne Fedory: # mkdir /home/ftp/fedora

Użytkownicy Fedory powinni uruchomić następujące polecenie: # mkdir /var/ftp/fedora

482 |

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

Obraz ISO z dystrybucją Fedora można zapisać w dowolnym miejscu na serwerze, ale trzeba go zamontować w katalogu anon_root. Jest to katalog domyślny, który użytkownicy zobaczą po nawiązaniu połączenia z serwerem. Do jego zamontowania można skorzystać z urządzenia pętli zwrotnej, na przykład: # mount -o loop F-7-i386-DVD.iso /var/ftp/fedora

Po zamontowaniu zamiast jednego gigantycznego pliku z obrazem ISO w katalogu powinno być widocznych wiele plików: $ ls /var/ftp/fedora Fedora isolinux RPM-GPG-KEY fedora.css README-BURNING-ISOS-en_US.txt GPL RELEASE-NOTES-en_US.html images repodata

RPM-GPG-KEY-fedora-test RPM-GPG-KEY-beta RPM-GPG-KEY-rawhide RPM-GPG-KEY-fedora stylesheet-images RPM-GPG-KEY-fedora-rawhide TRANS.TBL

Następnie restartujemy serwer. Zarówno w dystrybucji Debian, jak i Fedora służy do tego takie samo polecenie: # /etc/init.d/vsftpd restart

Nawiązujemy połączenie z serwerem za pomocą ulubionego klienta FTP i to wszystko! Możemy teraz skorzystać ze startowego nośnika instalacji, który utworzyliśmy w poprzedniej recepturze, i zacząć instalację nowych systemów z własnego lokalnego serwera instalacji dystrybucji Fedora.

Dyskusja Działanie serwera można przetestować za pomocą telnetu: $ telnet stinkpad 21 Trying 192.168.2.74... Connected to stinkpad.alrac.net. Escape character is '^]'. Witamy na przyjaznym serwerze instalacji dystrybucji Fedora

listen=YES

Uruchomienie serwera vsftpd w trybie demona. anonymous_enable=YES

Zezwolenie na anonimowe logowanie. Operacje logowania z wykorzystaniem kont ftp i anonymous są rozpoznawane jako połączenia użytkowników anonimowych.

ftpd_banner=

Za pomocą tej opcji można określić własny komunikat powitalny. anon_root=

Domyślny katalog danych FTP, którego zawartość wyświetli się po nawiązaniu połączenia. Może to być dowolny katalog na serwerze FTP. W niniejszej recepturze zaprezentowano szybki sposób udostępnienia w sieci pojedynczej kopii dystrybucji Fedora Linux. Instalacja z tej kopii powinna przebiegać znacznie szybciej w porównaniu z instalacją przez internet i o wiele przyjemniej w porównaniu z oficjalnymi serwerami lustrzanymi. W celu zaktualizowania systemu natychmiast po jego instalacji należy uruchomić w systemach klienckich polecenie yum update.

16.4. Konfiguracja serwera instalacji dystrybucji Fedora bazującego na FTP

| 483

Patrz także • przed rozpoczęciem instalacji zawsze należy czytać plik z uwagami o wersji (ang. release

notes) • man 5 vsftpd.conf • strona zawierająca listę serwerów lustrzanych z dystrybucją Fedora:

http://fedora.redhat.com/download/mirrors.html • podręcznik instalacji dla wybranej wersji Fedory z serwisu Fedoraproject.org:

http://fedoraproject.org/

16.5. Tworzenie instalacji dystrybucji Fedora Linux dostosowanej do własnych potrzeb Problem Chcemy utworzyć spersonalizowaną wersję dystrybucji Fedora Linux w celu przeprowadzenia wielu lokalnych instalacji. Chcemy wybrać standardowy zbiór pakietów, a następnie znaleźć łatwy sposób, by zainstalować go dla nowych użytkowników.

Rozwiązanie Wystarczy skorzystać z programu Kickstart (program personalizacyjny dystrybucji Fedora) oraz własnego lokalnego serwera instalacji. Plik konfiguracyjny systemu Kickstart jest tworzony automatycznie w czasie instalacji, zatem w każdym systemie Fedora można go znaleźć pod adresem /root/anaconda-ks.cfg. W tym pliku są odpowiedzi na wszystkie pytania zadawane przez program instalacyjny. Wystarczy zatem wskazać instalatorowi plik konfiguracji Kickstart i pozwolić mu zająć się resztą. Jednym ze sposobów utworzenia pliku konfiguracyjnego programu Kickstart jest przeprowadzenie niestandardowej instalacji: należy wybrać tylko te pakiety, które są nam potrzebne, skonfigurować partycjonowanie i systemy plików, a następnie wykorzystać automatycznie wygenerowany plik Kickstart dla nowych instalacji. Jest to również doskonały sposób utworzenia przykładowego pliku, który może służyć jako materiał referencyjny. Innym sposobem utworzenia tego pliku jest zainstalowanie programu konfiguracyjnego program Kickstart: # yum install system-config-kickstart

Zainstalowanie tego narzędzia daje użytkownikom dostęp do interesującego, łatwego w użytkowaniu, graficznego programu konfiguracyjnego (rysunek 16.2). Wystarczy po kolei wypełnić poszczególne zakładki. Po zakończeniu tych operacji otrzymamy plik ks.cfg. Można go wykorzystać bez modyfikacji lub ręcznie zmodyfikować w celu dostrojenia konfiguracji.

484 |

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

Rysunek 16.2. Narzędzie konfiguracji pliku Kickstart

Dyskusja Narzędzie konfiguracji Kickstart ma pewne ograniczenia. Pozwala na wybór tylko grup pakietów — nie da się wybierać pakietów indywidualnie. Za jego pomocą nie można skonfigurować usługi woluminów logicznych LVM (Linux Volume Manager). Ponieważ jednak jest to plik w formacie zwykłego tekstu, można z łatwością modyfikować go i dodawać brakujące fragmenty. Plik składa się z czterech sekcji: sekcja command i sekcja %packages są obowiązkowe i muszą występować w tej kolejności, natomiast sekcje %pre i %post nie są obowiązkowe i nie muszą występować w żadnym konkretnym porządku. Poszczególne pakiety są wymienione w sekcji %packages pliku ks.cfg w następujący sposób: %packages @gnome-desktop @graphical-internet gimp firefox openoffice.org-writer

Grupy pakietów są poprzedzone znakiem ampersand (&); nazwy indywidualnych pakietów nie są nim poprzedzone. Opcje %post występują częściej niż opcje %pre. Obie umożliwiają uruchamianie dowolnych skryptów lub poleceń. Po instalacji zwykle wyłączam niektóre usługi oraz uruchamiam polecenie yum update w celu zaktualizowania systemu: %post chkconfig isdn off

16.5. Tworzenie instalacji dystrybucji Fedora Linux dostosowanej do własnych potrzeb

| 485

chkconfig pcmcia off chkconfig bluetooth off chkconfig portmap off chkconfig apmd off yum update

Czytelnicy, którzy kiedykolwiek instalowali dystrybucję Fedora, z pewnością znają narzędzie konfiguracyjne Kickstart. Są jednak pewne obszary, które mogą sprawiać kłopoty: • Na ekranie Informacje o partycji jest opcja do wprowadzania typu napędu: sda lub hda. Opcja

ta może się przydać w systemach, w których występują oba te typy urządzeń. Weźmy inny przykład. Jeśli w systemie występują urządzenia sda i sdb, to można umieścić główny system plików na jednym urządzeniu oraz /home na drugim. Jeśli nie wskaże się określonego dysku lub partycji, to program instalacyjny wybierze pierwszy napęd w takim porządku, w jakim występują w systemie BIOS. • Po instalacji może wystąpić potrzeba dostrojenia konfiguracji wideo. Trzeba bowiem wy-

brać głębokość kolorów i rozdzielczość — na przykład 16×1024×768. Instalator jednak sonduje kartę graficzną oraz monitor i instaluje sterowniki automatycznie. • Wielu błyskotliwych administratorów próbowało dociec, w jaki sposób skorzystać z pro-

gramu Kickstart w celu zdefiniowania kont zwykłych użytkowników. Moim zdaniem, najłatwiejszym sposobem jest dodanie ich ręcznie — po zainstalowaniu. Kompletny opis opcji konfiguracyjnych programu Kickstart można znaleźć w podręczniku Red Hat Enterprise Linux Installation Manual.

Patrz także • dokumentacja systemu Red Hat Enterprise Linux:

https://www.redhat.com/docs/manuals/enterprise/

16.6. Wykorzystanie pliku Kickstart do automatycznej instalacji dystrybucji Fedora systemu Linux Problem Utworzyliśmy doskonały plik ks.cfg i chcielibyśmy go wykorzystać do zarządzania nowymi instalacjami dystrybucji Fedora Linux.

Rozwiązanie Jest kilka możliwości rozwiązania tego problemu: • zapisanie pliku na serwerze instalacji; • zapisanie pliku na dyskietce 3.5"; • zapisanie pliku na nośniku USB; • zapisanie pliku na płycie CD.

486 |

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

Serwer instalacji Jest to najłatwiejszy sposób. Następnie należy uruchomić komputer z nośnikiem startowym dystrybucji Fedora, na przykład płytą CD lub napędem USB, z wykorzystaniem następującego polecenia rozruchu: linux ks=http://server/directory/ks.cfg

W ten sposób można zapisać kilka różnych plików Kickstart, a następnie wskazać ten, który ma być używany: linux ks=http://server.name.net/directory/devstation-ks.cfg linux ks=http://server.name.net/directory/fileserver-ks.cfg

Dyskietka 3.5" Plik musi być zapisany w katalogu głównym i musi mieć nazwę ks.cfg. Następnie należy uruchomić komputer PC z nośnikiem rozruchowym dystrybucji Fedora, wykorzystując następujące polecenie rozruchu: linux ks=floppy

Jeśli chcemy skorzystać z kilku różnych plików Kickstart, na przykład stacji roboczej, serwera WWW, serwera plików itp., możemy wprowadzić różne nazwy plików: linux ks=floppy:/apache-ks.cfg linux ks=floppy:/workstation-ks.cfg

Fedora nie obsługuje rozruchu z dyskietki. Dyskietki można wykorzystywać do przechowywania plików Kickstart. Napęd USB System plików musi być typu vfat lub ext2. Osobiście polecam zastosowanie systemu plików vfat, ponieważ jest z nim mniej problemów. Uruchamiamy komputer PC z nośnikiem startowym Fedory za pomocą poniższego polecenia, podając własną nazwę urządzenia /dev oraz ścieżkę dostępu do pliku: linux ks=hd:sda1:/websrv-ks.cfg

Na startowym nośniku USB stick z dystrybucją Fedora można umieścić plik Kickstart. W tym celu najpierw należy skopiować obraz dysku startowego, a następnie skopiować plik Kickstart na urządzenie. Należy wykorzystać takie samo polecenie startowe jak to, które pokazano powyżej. CD-ROM Pliki Kickstart umieszczone na płycie CD-ROM ładuje się za pomocą poniższego polecenia: linux ks=cdrom:/directory/ks.cfg

Dyskusja Wielu błyskotliwych administratorów próbowało dociec, w jaki sposób skorzystać z programu Kickstart w celu zdefiniowania kont zwykłych użytkowników. Moim zdaniem, najłatwiejszym sposobem jest dodanie ich ręcznie — po zainstalowaniu. Operację przypisania nazw hostów można zautomatyzować poprzez skonfigurowanie serwera DHCP w celu przypisywania nazw hostów według adresów MAC. W konfiguracji programu Dnsmasq należy wprowadzić następujący wiersz: dhcp-host=11:22:33:44:55:66,arnold

Jeśli używamy serwera DHCP ISC, należy dodać poniższe wiersze do pliku dhcpd.conf:

16.6. Wykorzystanie pliku Kickstart do automatycznej instalacji dystrybucji Fedora systemu Linux

|

487

host mrhaney { hardware ethernet 08:00:07:26:c0:a5; }

Dobre receptury dotyczące konfiguracji serwera DHCP/DNS Dnsmasq można znaleźć w rozdziale 4.

Patrz także • dokumentacja systemu Red Hat Enterprise Linux:

https://www.redhat.com/docs/manuals/enterprise/ • rozdział 24. „Rozwiązywanie nazw” z książki Carli Schroder Linux. Receptury (Helion,

2005)

16.7. Sieciowa instalacja dystrybucji Fedora z wykorzystaniem środowiska PXE Problem Chcemy, aby zamiast fizycznych nośników startowych był wykorzystywany rozruch przez sieć. Nasze komputery PC są wyposażone w interfejsy sieciowe obsługujące rozruch przez sieć lub w dyskietki Etherboot. Skonfigurowaliśmy też odpowiednie ustawienia w systemie BIOS, zatem klienty są przygotowane. Mamy do dyspozycji serwer HTTP lub FTP bazujący na Fedorze z drzewem instalacyjnym dystrybucji Fedora. Co jeszcze trzeba zrobić?

Rozwiązanie Potrzebny jest serwer DHCP i TFTP. W tej recepturze oba te mechanizmy umieścimy na serwerze instalacyjnym. Na serwerze instalacyjnym bazującym na Fedorze należy zainstalować poniższe pakiety: # yum install tftp-server syslinux dhcp

Można skorzystać z poniższego przykładowego pliku dhcpd.conf, pamiętając o podaniu własnych adresów w sieci. Opcja next-server określa adres serwera TFTP: ##dhcpd.conf allow booting; allow bootp; subnet 192.168.1.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0; option broadcast-address 192.168.1.255; range dynamic-bootp 192.168.1.175 192.168.1.240; next-server 192.168.1.40; filename "pxelinux.0"; }

Następnie należy skopiować pliki rozruchowe pxelinux.0, vmlinuz i initrd.img do katalogu tftpboot. Jeśli postępowaliśmy zgodnie z recepturą 16.3, pliki vmlinuz i initrd.img powinny się znajdować w katalogu /var/www/fedora:

488 |

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

# cp /usr/lib/syslinux/pxelinux.0 /tftpboot # cp /var/www/fedora/isolinux/vmlinuz /tftpboot # cp /var/www/fedora/isolinux/initrd.img /tftpboot

Jeśli skonfigurowaliśmy serwer instalacji bazujący na FTP zgodnie z recepturą 16.4, nasze pliki startowe powinny być zapisane w katalogu /var/ftp/fedora. Tworzymy plik tftpboot/pxelinux.cfg o minimalnej zawartości: DEFAULT pxeboot TIMEOUT 50 LABEL pxeboot KERNEL vmlinuz APPEND initrd=initrd.img ONERROR LOCALBOOT 0

Teraz należy wszystko uruchomić. Przechodzimy do pliku /etc/xinetd.d./tftp i zmieniamy opcję: disable = yes

na: disable = no

Następnie należy uruchomić następujące polecenia: # chkconfig xinetd on # /etc/init.d/xinetd start # chkconfig tftp on

Teraz można przetestować konfigurację. Instalujemy klienta tftp na sąsiednim komputerze PC i próbujemy nawiązać połączenie z serwerem TFTP: $ tftp stinkpad tftp> status Connected to stinkpad.krzak.net. Mode: netascii Verbose: off Tracing: off Rexmt-interval: 5 seconds, Max-timeout: 25 seconds

Aby wyświetlić listę poleceń, należy wpisać pytajnik (?). Wynik powyższego polecenia potwierdza, że serwer działa i jest gotowy do wykorzystania. Włączamy klienta ze skonfigurowaną opcją rozruchu przez PXE. Automatycznie zostaną rozgłoszone pakiety DHCPDISCOVER rozszerzone o opcje specyficzne dla PXE do portu UDP o numerze 67. W ciągu kilku sekund wyświetli się znajomy ekran instalacyjny systemu Fedora.

Dyskusja W roli „silnika” serwera instalacji można wykorzystać dowolną dystrybucję Linuksa. Różne dystrybucje różnią się lokalizacją plików i nazwami pakietów, ale zawartość plików konfiguracyjnych jest taka sama. Przykładowy plik dhcpd.conf zawiera tylko te opcje, które są konieczne do obsługi klientów PXE. Można dodać je do istniejącej konfiguracji serwera DHCP. Opcja ONERROR LOCALBOOT 0 w pliku pxelinux.cfg oznacza „uruchom system z napędu lokalnego w przypadku, gdy rozruch sieciowy nie powiedzie się”. Jeśli ktoś woli interfejs graficzny, może do konfiguracji rozruchu przez sieć użyć programu system-config-netboot. Program tworzy podkatalogi w katalogu /tftpboot, zatem lokalizacje plików będą trochę inne.

16.7. Sieciowa instalacja dystrybucji Fedora z wykorzystaniem środowiska PXE

| 489

Patrz także • Syslinux i PXELinux: http//syslinux.zytor.com/pxe.php • man 5 dhcpd.conf • man 8 tftpd

16.8. Sieciowa instalacja dystrybucji Debian Problem Debian jest największą z istniejących dystrybucji Linuksa. Obsługuje więcej aplikacji i platform sprzętowych niż jakakolwiek inna dystrybucja Linuksa. Obecnie kompletne archiwum wymaga 21 płyt CD lub 3 płyt DVD. Oczywiście te wszystkie dyski nie są potrzebne do przeprowadzenia podstawowej instalacji, ale i tak dystrybucja jest bardzo rozbudowana. Wolelibyśmy, żeby zamiast pobierania wielu gigabajtów obrazów płyt CD można było uruchomić system za pomocą niewielkiego obrazu instalacyjnego, a następnie przeprowadzić pozostałe czynności instalacyjne przez sieć. W jaki sposób można to zrobić?

Rozwiązanie Debian od dawna umożliwia instalację przez sieć. Obrazy nośników rozruchowych są dostępne dla płyt CD oraz napędów USB Flash. Debian obsługuje również rozruch przez sieć w środowisku PXE, czym zajmiemy się w następnej recepturze. Obrazy instalacyjnych płyt CD umożliwiających sieciową instalację systemu można pobrać w serwisie Debian.org (http://www.us. debian.org/distrib/netinst). Potrzebne jest połączenie modemowe, kablowe połączenie Ethernet lub połączenie bezprzewodowe z macierzystą obsługą w systemie Linux. Nie warto zaprzątać sobie głowy interfejsem bezprzewodowym, który do działania w Linuksie wymaga programu ndiswrapper — taki interfejs nie zadziała na potrzeby instalatora. Obraz netinst zawiera podstawową instalację Debiana i ma objętość około 160 MB. Obraz businesscard ma rozmiar około 32 MB i zawiera tylko te elementy, które są niezbędne do rozpoczęcia instalacji. Oficjalne sumy kontrolne do weryfikacji integralności plików są dostępne na stronie pobierania. Przed skorzystaniem z pobranego archiwum zawsze należy potwierdzić sumę kontrolną. $ sha1sum debian-40r0-i386-businesscard.iso 641e67f6968ca08217f52f6fbe7dda1a8e6072ec debian-40r0-i386-businesscard.iso

Do zapisania obrazów instalacyjnych na płycie CD należy skorzystać z wybranego oprogramowania do zapisywania płyt CD, na przykład K3b. Utworzenie startowego napędu USB wymaga nośnika o objętości co najmniej 256 MB. Jeśli nim dysponujemy, powinniśmy pobrać plik hd-media/boot.img.gz z wybranego serwera lustrzanego dystrybucji Debian. Należy sprawdzić, czy napęd jest odmontowany, i skopiować plik na nośnik za pomocą poniższego polecenia: # zcat boot.img.gz > /dev/sda

490 |

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

W jaki sposób odczytać nazwę /dev urządzenia USB? Można skorzystać z polecenia ls: $ ls -l /dev/disk/by-id/

Można również użyć polecenia lsscsi: $ lsscsi [2:0:0:0]

disk

LEXAR

JUMPDRIVE

1.10

/dev/sdb

Aby rozpocząć instalację, należy uruchomić system z wybranego nośnika. Na początku należy standardowo wprowadzić ustawienia klawiatury, języka i sieci. Następnie wyświetli się rozwijana lista serwerów lustrzanych Debiana do wyboru. Dalej procedura przebiega standardowo — należy wybrać pakiety do zainstalowania i zająć się czymś innym w czasie, kiedy system operacyjny się instaluje.

Dyskusja Sposób zaprezentowany w niniejszej procedurze jest dobry w przypadku instalacji na pojedynczym komputerze, ale nie jest zalecany w przypadku, gdy trzeba zainstalować system na kilku maszynach. Do tego celu trzeba skonfigurować lokalny serwer instalacji. Zagadnieniem tym zajmiemy się w następnej recepturze.

Patrz także • jak zdobyć Debiana: http://www.debian.org/distrib/ • edycje Debiana: http://www.debian.org/releases/

16.9. Tworzenie pełnego serwera lustrzanego Debiana za pomocą narzędzia apt-mirror Problem Chcemy instalować Debiana przez sieć z lokalnego serwera i chcemy skonfigurować kompletny serwer lustrzany. W jaki sposób można to zrobić?

Rozwiązanie Do tego celu potrzebny jest serwer HTTP bazujący na Debianie. W Debianie dostępne są dwie aplikacje umożliwiające utworzenie lokalnego serwera lustrzanego: apt-mirror, który tworzy pełny serwer lustrzany, oraz apt-proxy, tworzący serwer częściowy. W tej recepturze przekonamy się, jak utworzyć pełny serwer lustrzany z wykorzystaniem aplikacji apt-mirror. Do tego celu potrzebne jest 40 – 120 GB miejsca na dysku, w zależności od tego, jakie wersje nas interesują oraz dla jakich architektur procesorów. Najpierw należy zainstalować program apt-mirror w sposób standardowy dla Debiana oraz zainstalować serwer Lighttpd: # aptitude install apt-mirror lighttpd

Następnie należy zmodyfikować plik /etc/apt/mirror.list w taki sposób, by uwzględnić wybrane repozytoria. Należy skorzystać z serwerów lustrzanych Debiana, zlokalizowanych blisko 16.9. Tworzenie pełnego serwera lustrzanego Debiana za pomocą narzędzia apt-mirror

|

491

miejsca, w którym się znajdujemy. Listę serwerów lustrzanych można znaleźć w serwisie internetowym Debiana, pod adresem http://www.debian.org/mirror/list. Niektóre serwery lustrzane nie znajdują się geograficznie blisko. Należy jednak wybrać te, które odpowiadają nam najlepiej. Aby to sprawdzić, można skorzystać z poleceń ping i tcptraceroute. W poniższym przykładzie wykorzystano serwer lustrzany pod adresem http://linux.csua.berkeley.edu/debian: ## /etc/apt/mirror.list ############# config ################## # # set base_path /var/spool/apt-mirror # set mirror_path $base_path/mirror # set skel_path $base_path/skel # set var_path $base_path/var # set cleanscript $var_path/clean.sh # set defaultarch # set nthreads 20 set tilde 0 # ############# end config ############## # debian Etch (stable) deb http://linux.csua.berkeley.edu/debian etch main contrib non-free deb-src http://linux.csua.berkeley.edu/debian etch main contrib non-free deb http://linux.csua.berkeley.edu/debian etch main/debian-installer #debian Lenny (testing) deb http://linux.csua.berkeley.edu/debian lenny main contrib non-free deb-src http://linux.csua.berkeley.edu/debian lenny main contrib non-free deb http://linux.csua.berkeley.edu/debian lenny main/debian-installer #debian Sid (unstable) deb http://linux.csua.berkeley.edu/debian sid main contrib non-free deb-src http://linux.csua.berkeley.edu/debian sid main contrib non-free deb http://linux.csua.berkeley.edu/debian sid main/debian-installer

Następnie uruchamiamy poniższe polecenia w celu rozpoczęcia pobierania plików: # apt-mirror /etc/apt/mirror.list Downloading 66 index files using 20 threads... Begin time: Sun Jul 22 22:43:46 2007 [20]... [19]... [18]... [17]... [16]... [15]... 14]... [13]... [12]... [11]... [10].. . [9]... [8]... [7]... [6]... [5]... [4]... [3]... [2]... [1]... [0]... End time: Sun Jul 15 22:57:52 2007 Proceed indexes: [SSSSPPPPPPP] 52.7 GiB will be downloaded into archive. Downloading 81257 archive files using 20 threads... Begin time: Sun Jul 15 22:58:37 2007

Pakiety są pobierane do katalogu /var/spool/apt-mirror/mirror/ i z pewnością ściąganie ich z internetu zajmie sporo czasu. W związku z tym możemy spokojnie zająć się czymś innym. Na przykład możemy przystąpić do konfigurowania serwera Lighttpd. Najpierw utworzymy podkatalog w głównym katalogu dokumentów serwera HTTP: # mkdir /var/www/debian

Następnie tworzymy dowiązanie symboliczne serwera lustrzanego pakietów do tego katalogu: # ln -s /var/spool/apt-mirror/mirror/linux.csua.berkeley.edu/debian \ /var/www/debian

492 |

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

Można również skonfigurować zadanie cron w celu aktualizacji serwera co noc. Program apt-mirror instaluje plik /etc/cron.d/apt-mirror, zatem jedyne, co trzeba zrobić, to usunięcie komentarza z następującego wiersza poleceń: 0 1 log

* * *

apt-mirror

/usr/bin/apt-mirror > /var/spool/apt-mirror/var/cron.

Zaplanowane zadanie będzie się uruchamiać co noc o pierwszej po północy.

Dyskusja Posiadanie własnego serwera lustrzanego Debiana ma tę zaletę, że jest on zawsze aktualny. Po pobraniu archiwum po raz pierwszy kolejne paczki do pobrania nie będą miały dużej objętości. Nie zaszkodzi, w celu zachowania dokładności, aby po wstępnym pobraniu plików uruchomić kilkakrotnie polecenie apt-mirror /etc/apt/mirror.list. Zgodnie z tą recepturą nie są buforowane na serwerze aktualizacje zabezpieczeń, ale można je wykonywać, jeśli ktoś sobie tego życzy. Niektórzy administratorzy preferują konfigurowanie każdego klienta w celu bezpośredniego pobierania aktualizacji. Dzięki temu zyskują pewność otrzymania świeżych aktualizacji bezpieczeństwa. Można również uruchomić program apt-mirror w innej dystrybucji Linuksa, na przykład Fedora, Slackware lub dowolnej innej. Należy pobrać pakiet i zainstalować z archiwum tarball z kodem źródłowym. Następnie należy stworzyć katalog, jego strukturę oraz samodzielnie skonfigurować mechanizm cron.

Patrz także • serwis programu apt-mirror w witrynie SourceForge: http://apt-mirror.sourceforge.net/ • edycje Debiana: http://www.debian.org/releases/

16.10. Tworzenie częściowego serwera lustrzanego Debiana za pomocą narzędzia apt-proxy Problem O ile utrzymywanie lokalnego serwera lustrzanego Debiana z wykorzystaniem programu apt-mirror nie brzmi najgorzej, w rzeczywistości nie są nam potrzebne wszystkie pakiety. Czy nie można po prostu zbuforować i udostępnić pakietów, które są wykorzystywane w systemach lokalnych?

Rozwiązanie Można. Do tego celu należy skorzystać z polecenia apt-proxy. Należy zainstalować go na serwerze zawierającym co najmniej 30 GB wolnego miejsca na dysku. # aptitude install apt-proxy

16.10. Tworzenie częściowego serwera lustrzanego Debiana za pomocą narzędzia apt-proxy

| 493

Następnie należy skonfigurować plik /etc/apt-proxy/apt-proxy-v2.conf i wskazać trzy różne serwery lustrzane Debiana: address = 192.168.1.101 port = 9999 min_refresh_delay = 1s debug = all:4 db:0 timeout = 15 cache_dir = /var/cache/apt-proxy cleanup_freq = 1d max_age = 120d max_versions = 3 ;; Serwery backend backends = http://us.debian.org/debian http://linux.csua.berkeley.edu/debian http://mirrors.geeks.org/debian http://debian.uchicago.edu/debian

Teraz skonfigurujemy kliencki komputer PC, aby wskazywał na serwer apt-proxy: ## /etc/apt/sources.list # debian Etch (stable) deb http://192.168.1.75/debian etch main contrib non-free deb-src http://192.168.1.75/debian etch main contrib non-free deb http://security.debian.org/ etch/updates main contrib non-free deb-src http://security.debian.org/debian-security etch/updates main \ contrib non-free

Uruchamiamy polecenie aptitude update w systemie klienckim w celu zainicjowania serwera. Jeśli na serwerze już jest bufor pakietów o odpowiednim rozmiarze, można go zaimportować na serwer apt-proxy za pomocą następującego polecenia: # apt-proxy-import /var/cache/apt/archives

Teraz za każdym razem, gdy w komputerze klienckim jest instalowane nowe oprogramowanie, program apt-proxy zbuforuje je będzie serwował dodatkowe żądania z bufora. Jedyną czynnością pielęgnacyjną, którą należy wykonywać, jest kontrola ilości miejsca na dysku, jaką wykorzystuje serwer apt-proxy.

Dyskusja System apt-proxy replikuje strukturę serwera lustrzanego Debiana i automatycznie usuwa stare pakiety, w miarę jak pojawiają się ich nowsze wersje. Wykorzystanie trzech różnych serwerów lustrzanych Debiana w warstwie backend tworzy system niezawodnościowy. Jeśli jeden z serwerów jest niedostępny, jego rolę natychmiast przejmuje następny. Listę dostępnych serwerów lustrzanych Debiana położonych geograficznie blisko naszej lokalizacji można znaleźć pod adresem http://www.debian.org/mirror/list.

Patrz także • man 8 apt-proxy • man 5 apt-proxy.conf • man 8 apt-proxy-import; • serwis programu apt-proxy w witrynie SourceForge: http://apt-proxy.sourceforge.net/ • edycje Debiana: http://www.debian.org/releases/ 494 |

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

16.11. Konfigurowanie klienckich komputerów PC w celu wykorzystywania lokalnego serwera lustrzanego Debiana 16.11. Konfigurowanie klienckich komputerów PC w celu wykorzystywania lokalnego serwera

Problem Stworzyliśmy lokalny serwer lustrzany Debiana, wykorzystując programy apt-mirror lub apt-proxy. Teraz chcemy się dowiedzieć, jak skonfigurować lokalne klienty Debiana, aby z niego korzystały.

Rozwiązanie Należy zmodyfikować plik /etc/apt/sources.list w komputerach klienckich, tak by wskazywały na adresy lub nazwę hosta naszego serwera: ## /etc/apt/sources.list # debian Etch (stable) deb http://192.168.1.75/debian etch main contrib non-free deb-src http://192.168.1.75/debian etch main contrib non-free deb http://security.debian.org/debian-security etch/updates main contrib non-free deb-src http://security.debian.org/debian-security etch/updates main contrib non-free

Pokazany przykład dotyczy komputera PC z systemem Debian Etch. Oczywiście można skonfigurować komputer PC w taki sposób, by była wykorzystywana dowolna, preferowana wersja Debiana. Wystarczy uruchomić polecenie aptitude update w komputerach klienckich, aby zaktualizować lokalne listy pakietów, i na tym zadanie się kończy.

Dyskusja W zaprezentowanym przykładzie klienty pobierają aktualizacje bezpieczeństwa bezpośrednio z witryny Debian.org, a nie z lokalnego bufora serwera. Jeśli ktoś woli, może zbuforować aktualizacje bezpieczeństwa na serwerze. Niektórzy administratorzy uważają za bezpieczniejszą i lepszą taką konfigurację, podczas której klienty bezpośrednio pobierają swoje aktualizacje bezpieczeństwa. Dla aktualizacji bezpieczeństwa Debiana nie są dostępne serwery lustrzane. Można je pobrać wyłącznie z witryny security. debian.org.

Patrz także • man 5 sources.list • edycje Debiana: http://www.debian.org/releases/

16.11. Konfigurowanie klienckich komputerów PC w celu wykorzystywania lokalnego serwera

| 495

16.12. Konfiguracja serwera rozruchu przez sieć PXE na bazie Debiana Problem Chcemy skonfigurować serwer rozruchowy Debiana w taki sposób, aby można było przeprowadzać instalacje przez sieć, bez korzystania z instalacyjnych płyt CD lub napędu USB flash. Nasze komputery PC są wyposażone w interfejsy sieciowe obsługujące rozruch przez sieć lub w dyskietki Etherboot. Skonfigurowaliśmy też odpowiednie ustawienia w systemie BIOS, zatem klienty są przygotowane do działania. Skonfigurowaliśmy również lokalny serwer lustrzany Debiana, który jest gotowy do wykorzystania. Co jeszcze trzeba zrobić?

Rozwiązanie Na serwerze lustrzanym Debiana należy włączyć możliwość rozruchu przez sieć z wykorzystaniem środowiska PXE. Potrzebne są następujące pakiety: # aptitude install tftpd-hpa dhcp3-server

Następnie należy pobrać plik netboot/netboot.tar.gz z ulubionego serwera lustrzanego Debiana do katalogu /var/lib/tftpboot i tam go rozpakować: # wget http://debian.uchicago.edu/debian/dists/etch/main/installer-\ i386/current/images/netboot/netboot.tar.gz # tar zxvf netboot.tar.gz

Należy zmodyfikować plik /etc/default/tftpd-hpa, tak by znalazła się w nim następująca opcja: RUN_DAEMON="yes"

Trzeba również zdefiniować prostą konfigurację w pliku /etc/dhcp3/dhcpd.conf: ##dhcpd.conf allow booting; allow bootp; subnet 192.168.1.0 netmask 255.255.255.0 { option subnet-mask 255.255.255.0; option broadcast-address 192.168.1.255; range dynamic-bootp 192.168.1.175 192.168.1.240; next-server 192.168.1.40; filename "pxelinux.0"; }

Uruchamiamy nowe serwery w następujący sposób: # /etc/init.d/dhcp3-server start # /etc/init.d/tftpd-hpa start

Następnie włączamy klienta, w którym uruchomiono opcję rozruchu przez sieć. Za chwilę powinno się wyświetlić menu instalacyjne Debiana: - Boot Menu ============= etch_i386_install etch_i386_linux etch_i386_expert etch_i386_rescue

496 |

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

Dyskusja Jeśli wykorzystujemy program Dnsmasq zamiast dhcpd, to w celu włączenia możliwości rozruchu przez sieć należy dodać tylko jedną linijkę do pliku dnsmasq.conf: dhcp-boot=pxelinux.0,cracker,192.168.1.40

Następnie należy zrestartować program Dnsmasq: # /etc/init.d/dnsmasq restart

W przypadku gdy korzystamy z innego wydania Debiana niż Etch, należy wykorzystać plik netboot.tar.gz specyficzny dla tego wydania.

Patrz także • edycje Debiana: http://www.debian.org/releases/

16.13. Instalacja nowych systemów z lokalnego serwera lustrzanego Debiana Problem Serwer lustrzany Debiana został skonfigurowany i jest gotowy do pracy. Przygotowane są również klienty. Mamy również do dyspozycji nośnik instalacyjny na płycie CD-ROM lub dysku USB Flash (patrz receptura 16.8). W jaki sposób spowodować, aby do instalacji nowych systemów był wykorzystywany lokalny serwer lustrzany Debiana?

Rozwiązanie Należy uruchomić systemy z instalacyjnym nośnikiem rozruchowym, wypełnić standardowe ekrany z ustawieniami klawiatury, języka i konfiguracji sieci. Na ekranie Mirror Country (rysunek 16.3) należy wybrać opcję enter information manually. Następnie należy wprowadzić nazwę hosta serwera, na przykład cracker.krzak.net, a na kolejnym ekranie wpisać katalog archiwum — w tym przypadku /debian/. Dalszą instalację należy przeprowadzić w standardowy sposób.

Dyskusja Pokazany sposób instalacji nowych systemów jest przyjemny i nietrudny do skonfigurowania. Chcemy jednak dowiedzieć się, w jaki sposób zautomatyzować instalacje Debiana. Z następnej receptury dowiemy się, jak można to zrobić za pomocą pliku preseed.

Patrz także • edycje Debiana: http://www.debian.org/releases/

16.13. Instalacja nowych systemów z lokalnego serwera lustrzanego Debiana

|

497

Rysunek 16.3. Wybór lustrzanego serwera FTP instalacji

16.14. Automatyzacja instalacji Debiana za pomocą plików wstępnej konfiguracji Problem Chcemy znaleźć prosty sposób automatyzacji sieciowych instalacji Debiana na nowych komputera PC oraz stworzyć spersonalizowane instalacje dla różnych ról, takich jak serwery WWW, stacje robocze, serwery plików itp.

Rozwiązanie Należy stworzyć plik wstępnej konfiguracji (preseed), w którym znajdą się odpowiedzi na pytania instalatora oraz który wybierze właściwe pakiety. Przede wszystkim należy przestudiować przykładowe pliki wstępnej konfiguracji dostępne pod adresem http://d-i.alioth.debian. org/manual/example-preseed.txt. Następnie należy utworzyć taki plik dla naszego egzemplarza systemu Debian poprzez uruchomienie poniższych dwóch poleceń: # debconf-get-selections --installer > preseed.txt # debconf-get-selections >> file preseed.txt

Plik preseed.txt w naszym systemie powinien wyglądać inaczej niż plik example-preseed.txt. Jest znacznie mniej uporządkowany i zawiera o wiele więcej wpisów. Nie można wykorzystywać własnego pliku preseed.txt w postaci „jaka jest”. Można jednak zobaczyć, co dokładnie zostało zrobione w systemie, oraz można skopiować wszystko, co chcemy zdublować, do pliku example-preseed.txt. 498 |

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

Polecenie tasksel wybiera grupy pakietów. Za pomocą poniższego polecenia można wyświetlić ich listę: $ tasksel --list-tasks u desktop Desktop environment i web-server Web server u print-server Print server u dns-server DNS server [...]

Litera u oznacza uninstalled (odinstalowany), natomiast litera i oznacza installed (zainstalowany). Indywidualne pakiety można wyświetlić za pomocą następującego polecenia: $ tasksel --task-packages desktop twm gimp-print xresprobe openoffice.org [...]

Aby wybrać grupy pakietów w pliku wstępnej konfiguracji, można wykorzystać polecenie tasksel w następujący sposób: #tasksel tasksel/desktop multiselect kde-desktop, xfce-desktop #tasksel tasksel/first multiselect standard, kde-desktop

Oznacza to, że w przypadku wybrania zadania pulpitu zamiast domyślnych pakietów będą zainstalowane pakiety kde-desktop i xfce-desktop. Indywidualne pakiety wybiera się za pomocą polecenia pkgsel w następujący sposób: d-i pkgsel/include string openvpn tftpd-hpa dnsmasq

Osobiście lubię automatyzować tworzenie konta root i wyłączać tworzenie konta zwykłego użytkownika (ponieważ mogę zrobić to później ręcznie): passwd passwd/root-password password $1$AiJg3$GHlS8/vqkSgBj9/1EKPUv0 passwd passwd/root-password-again password $1$AiJg3$GHlS8/vqkSgBj9/1EKPUv0 passwd passwd/make-user boolean false

Utrzymywanie haseł w postaci zwykłego tekstu jest złym pomysłem. W związku z tym lepiej je wcześniej zaszyfrować za pomocą następującego polecenia: $ grub-md5-crypt Password: Retype password: $1$AiJg3$GHlS8/vqkSgBj9/1EKPUv0

Za pomocą tego polecenia można sprawdzić format pliku wstępnej konfiguracji, aby uzyskać pewność, że jest prawidłowy: $ debconf-set-selections -c preseed.txt

W jaki sposób wykorzystać plik wstępnej konfiguracji po jego dostrojeniu i potwierdzeniu za pomocą polecenia debconf-set-selections? W przypadku klientów skonfigurowanych do rozruchu przez sieć w środowisku PXE należy skopiować plik wstępnej konfiguracji do pliku /var/lib/tftpboot. Następnie należy zmodyfikować szablon automatycznego startu w pliku /var/ lib/tftpboot/pxelinux.cfg/default w taki sposób, by wskazywał ten plik: LABEL auto kernel debian-installer/i386/linux append auto=true priority=critical vga=normal \ preseed/url=http://host/path/to/preseed.cfg \ initrd=debian-installer/i386/initrd.gz --

16.14. Automatyzacja instalacji Debiana za pomocą plików wstępnej konfiguracji

| 499

Plik wstępnej konfiguracji można skopiować do głównego katalogu napędu USB Flash, a następnie skorzystać z następującego polecenia rozruchu: linux preseed/file=/dev/sdb/preseed.cfg debconf/priority=critical

Można również umieścić plik wstępnej konfiguracji na serwerze sieciowym, a następnie wprowadzić adres URL (zarówno dla płyty CD, jak i nośnika USB): linux preseed/url=http://nazwa_serwera/nazwa_pliku

Dyskusja Pliki wstępnej konfiguracji Debiana nie są tak proste jak pliki Kickstart dystrybucji Fedora. Jest to jednak jedna z najprostszych metod tworzenia spersonalizowanych automatycznych instalacji Debiana. Szczegółowy opis opcji pliku wstępnej konfiguracji oraz opcji startowych można znaleźć w przewodniku instalacji systemu Debian-Gnu (http://d-i.alioth.debian.org/manual/ en.i386/index.html).

Patrz także • edycje Debiana: http://www.debian.org/releases/

500 |

Rozdział 16. Konfiguracja bezobsługowego mechanizmu sieciowej instalacji nowych systemów

ROZDZIAŁ 17.

Administrowanie serwerem linuksowym z wykorzystaniem konsoli podłączanej przez port szeregowy

17.0. Wprowadzenie W dzisiejszych czasach ciężko pracujący administrator musi czasami cofnąć się do starych czasów i skorzystać z egzotycznych metod komunikacji z serwerami: przez Ethernet, USB, FireWire, sieć bezprzewodową, podczerwień, przełączniki KVM oraz, w przyszłości, bezpośrednie implanty neuronowe. Istnieje również stara metoda, która w dalszym ciągu odgrywa istotną rolę w zestawie narzędzi administratora sieci: konsola szeregowa. Jest prosta i tania — nie wymaga instalacji sterowników ani kart rozszerzeń. Bez przeszkód można z niej korzystać. Jest to sposób komunikacji z serwerem na najniższym możliwym poziomie. Wystarczy skonfigurować serwery w taki sposób, by akceptowały logowanie przez port szeregowy, skonfigurować laptop do roli przenośnej konsoli — i mamy natychmiastowe, tanie urządzenie, które można wykorzystać jako ostatnią deskę ratunku w sytuacji, kiedy wszystkie inne metody komunikacji zawiodą. Przenośna konsola szeregowa spełni swoje zadanie również wtedy, gdy będzie potrzeba skonfigurowania routerów i przełączników. W przypadku rozwiązywania problemów z systemami typu headless zastosowanie konsoli szeregowej pozwala uniknąć konieczności podłączania klawiatury i monitora. Można przechwycić komunikaty jądra i informacje z dzienników systemowych, które w przeciwnym przypadku zostałyby utracone, ponownie uruchomić system i uzyskać menu startowe. Można również zmodyfikować ustawienia sieci, zatrzymać i uruchomić sieć, zrestartować lub dostroić SSH oraz zmodyfikować ustawienia karty sieciowej. Nie polecam konsoli szeregowej jako jedynego środka administracji serwerów — komunikacja przez Ethernet jest znacznie szybsza. Kiedy jednak wszystkie inne metody zawiodą, konsola szeregowa może się okazać naszym jedynym ratunkiem. Jest wiele sposobów nawiązywania fizycznego połączenia pomiędzy komputerami. Można podłączyć modem sprzętowy — jedno z urządzeń znanych ze starych czasów, które dumnie 501

są nazywane rzeczywistymi modemami — i wykonać zadania zdalnej administracji z wykorzystaniem połączenia dial-up. Nie można zrobić tego prościej, wystarczy połączyć się bezpośrednio. Jest to doskonały i tani rezerwowy sposób komunikacji, który można wykorzystać w przypadku awarii sieci Ethernet. Można też skorzystać z kabla zerowego modemu i podłączyć go do laptopa lub stacji roboczej jako połączoną bezpośrednio konsolę szeregową (w recepturze 19.1 można dowiedzieć się, jak przekształcić laptop w przenośne sieciowe narzędzie diagnozowania i wykonywania napraw). W dobrą konsolę szeregową można przekształcić każdy, nawet najsłabszy, stary komputer PC. Użytkownicy platformy x86 — sprzętu stanowiącego większość w świecie systemu Linux — muszą poradzić sobie z ograniczeniami systemu PC BIOS platformy x86. W odróżnieniu od rzeczywistego sprzętu uniksowego platforma x86 nie została zaprojektowana do obsługi konsoli szeregowej. Oznacza to, że nie można wykorzystać portu szeregowego do skomunikowania się z systemem BIOS po to, by wprowadzić modyfikacje lub sprawdzić ustawienia. Nie można również zobaczyć komunikatów testu komputera bezpośrednio po włączeniu zasilania (Power On Self-Test — POST). BIOS oraz systemy rozruchowe platform uniksowych są wyposażone w wiele interesujących własności, które nie są dostępne na platformie x86. Systemy te pozwalają na bezdyskowe ładowanie systemu z sieci, twardy reset, przeładowanie, zawieszenie, a następnie wznowienie procesu rozruchu, wykonywanie procesu rozruchu krok po kroku oraz zmianę konfiguracji systemu BIOS — wszystkie te operacje można wykonywać zdalnie. W tym przypadku posiadanie konsoli szeregowej można porównać do niewielkiego komputera do uruchamiania i zarządzania większym komputerem. Istnieją pewne sposoby obejścia tych ograniczeń. Jednym z nich jest zakupienie serwera x86 z zaawansowanym systemem BIOS. Na przykład serwery montowane na półkach oraz moduły blade zazwyczaj są przygotowane do administracji przez port szeregowy. Są one wyposażone w zaawansowane funkcje zarządzające, podobne do tych, które są dostępne w rzeczywistych platformach uniksowych. Innym sposobem jest zakup karty rozszerzeń, na przykład PC Weasel. PC Weasel jest kartą rozszerzeń z interfejsem PCI lub ISA, która emuluje podłączony monitor oraz klawiaturę i udostępnia port szeregowy do administracji. Biorąc pod uwagę cenę tego urządzenia (600 – 1000 zł), nie jest to opcja tania. Czasami jednak jest ona mniej kłopotliwa niż wymiana płyty głównej. Wtedy warto się o nią pokusić po to, by uzyskać dostęp do doskonałego zestawu funkcji. W wielu ośrodkach obliczeniowych wykorzystywane są komercyjne konsole szeregowe, na przykład firm Cyclades, Lantronix i Digi. Urządzenia te pozwalają na łatwy montaż na półce, mają do 48 portów, są wyposażone w oprogramowanie zarządzające, gwarantują możliwość zdalnego logowania, przechwytywanie komunikatów jądra oraz funkcje zabezpieczeń (nie należy błędnie interpretować portów RJ-45 — są to najprawdziwsze porty szeregowe RS-232, dla których zastosowano wygodne złącza RJ-45). Można również stworzyć własną konsolę szeregową, wykorzystując wieloportowe karty rozszerzeń takich producentów, jak Comtrol, Moxa i Axxon. Można nawet zainstalować na nich oprogramowanie zarządzające — system Conserver (http://www.conserver.com) jest dobrym darmowym serwerem konsoli z otwartym dostępem do kodu źródłowego. Oprogramowanie zapewnia doskonałe funkcje rejestrowania, integrację z SSL, uwierzytelnianie użytkowników, rozgłaszanie komunikatów, tryb szpiegowski oraz monitorowanie systemu. W niniejszym rozdziale opisano sposób skonfigurowania zwykłego komputera PC x86 jako serwera typu oraz skonfigurowania zwykłego komputera PC x86 jako konsoli szeregowej. Można powiedzieć, że jest to tani sposób wykorzystania konsoli szeregowych dla systemu Linux.

502

|

Rozdział 17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli przez port szeregowy

17.1. Przygotowanie serwera do administrowania za pośrednictwem konsoli szeregowej Problem Mamy standardowy serwer x86 i chcemy, aby działał w trybie headless, z włączoną możliwością administrowania przez konsolę szeregową. Chcemy sprawdzić, czy wszystkie elementy — zarówno sprzętowe, jak i programowe — są na miejscu. Konsola szeregowa może być, lecz nie musi, podstawową metodą administrowania serwerem. Pomimo to chcemy mieć pewność, że istnieje możliwość nawiązania połączenia z jej wykorzystaniem.

Rozwiązanie Najpierw należy sprawdzić BIOS serwera, aby się przekonać, czy ma on wbudowaną obsługę konsoli szeregowej. Najprawdopodobniej nie mają jej tanie komputery klasy PC, ale jest wysoce prawdopodobne, że mają ją komputery z wyższej półki i większość serwerów. W przypadku gdy serwer ma wbudowaną obsługę konsoli szeregowej, należy postępować zgodnie ze wskazówkami jej konfigurowania dla wybranego modelu i zignorować resztę niniejszej receptury. Jeśli nie, potrzebne będą następujące elementy: • klawiatura i monitor podłączone do serwera do czasu przetestowania i skonfigurowania

połączenia szeregowego; • złącze szeregowe DB9; jeśli płyta główna nie jest wyposażona we wbudowany port sze-

regowy, można zakupić niedrogą kartę portów szeregowych ze złączem PCI; • narzędzia agetty lub mgetty; • BIOS, który umożliwia załadowanie systemu w komputerze bez podłączonej klawiatury; • kabel zerowego modemu do bezpośredniego połączenia z innym komputerem PC; • jądro z wbudowaną obsługą konsoli — nie powinna to być obsługa w postaci modułu; • modem sprzętowy w sytuacji, kiedy chcemy administrować serwerem poprzez łącze tele-

foniczne;

• startowy dysk ratunkowy (zawsze trzeba mieć taki pod ręką!).

Dyskusja Port szeregowy to jeden z terminów, który ma bardzo szerokie znaczenie. Oznacza on fizyczne złącze, które w większości komputerów klasy PC ma postać męskiego złącza DB9. Jest ono podłączone do układu UART (Universal Asynchronous Receiver-Transmitter — uniwersalny asynchroniczny nadajniko-odbiornik) na płycie głównej. Port szeregowy to także urządzenie logiczne — /dev/ttyS*. $ setserial /dev/ttyS0, /dev/ttyS1: /dev/ttyS2, /dev/ttyS3,

-g /dev/ttyS[0123] UART: 16550A, Port: 0x03f8, IRQ: 4 No such device UART: unknown, Port: 0x03e8, IRQ: 4 UART: unknown, Port: 0x02e8, IRQ: 3

17.1. Przygotowanie serwera do administrowania za pośrednictwem konsoli szeregowej

| 503

Wynik powyższego polecenia oznacza, że w tym systemie jest tylko jeden port szeregowy — /dev/ttyS0. Jest to jedyne urządzenie, dla którego zostały wyświetlone parametry układu UART. Więcej informacji na temat tego portu można uzyskać za pomocą flagi -a: $ setserial -a /dev/ttyS0 /dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4 Baud_base: 115200, close_delay: 50, divisor: 0 closing_wait: 3000 Flags: spd_normal skip_test

Jak widać, jest to nowoczesny port szeregowy, który pozwala na transmisję danych z szybkością do 115 200 bodów (należy pamiętać, że jest to szybkość transmisji pomiędzy komputerem PC a układem UART — szybkość transmisji do urządzeń poza komputerem PC jest ograniczona przez okablowanie, ruch sieciowy oraz inne czynniki). Prawdopodobnie dla pewnej części czytelników bardziej znajomo wyglądają oznaczenia COM1, COM2, COM3 i COM4 niż /dev/ttyS1, dev/ttyS2 itd. Adresy portów i numery przerwań są takie same, niezależnie od tego, jak się je nazywa: 0x03f8 0x02f8 0x03f8 0x02e8

IRQ4 IRQ3 IRQ4 IRQ3

COM1 COM2 COM1 COM4

/dev/ttyS0 /dev/ttyS1 /dev/ttyS0 /dev/ttyS3

Narzędzie getty (pozostałość z czasów dalekopisów) to program zarządzający logowaniem poprzez połączenia szeregowe. Program ten otwiera urządzenie szeregowe — na przykład modem lub konsolę wirtualną — i oczekuje na połączenie. getty wyświetla komunikat logowania, a następnie, kiedy użytkownik wprowadzi swoją nazwę i hasło, przekazuje je do programu logowania i kończy pracę bez wyświetlania komunikatu. Jest wiele odmian programu getty. mingetty i fgetty obsługują wyłącznie konsole wirtualne i nie obsługują komunikacji szeregowej, dlatego nie należy z nich korzystać. Dobrze, jeśli programy te są już zainstalowane w systemie, ponieważ można wtedy wykorzystać plik /etc/inittab do wskazania tego programu, który ma być użyty do logowania za pośrednictwem konsoli szeregowej. mgetty to doskonała odmiana narzędzia getty, która dodatkowo obsługuje faksowanie i pocztę głosową. Do obsługi konsol szeregowych doskonale nadają się programy agetty, uugetty oraz stare, dobre narzędzie getty. Większość, choć nie wszystkie, systemy BIOS komputerów PC pozwalają na załadowanie systemu operacyjnego bez podłączonej klawiatury. Jeśli BIOS naszego komputera nie pozwala na taką operację, a aktualizacja systemu BIOS nie niweluje problemu, trzeba zainstalować kartę typu PC Weasel (więcej informacji na temat opcji sprzętowych można znaleźć we „Wprowadzeniu” do niniejszego rozdziału). Aby się dowiedzieć, jakie opcje zostały wkompilowane w jądrze, można zajrzeć do pliku /boot/ config-*. Na przykład w moim systemie Debian jest to plik /boot/config-2.6.20-16. Nie jest to plik przeznaczony do edycji. Jest to zapis, który informuje, w jaki sposób skompilowano jądro. Opcje występujące w tym pliku to =y — obsługa wbudowana, =m — skompilowano w postaci ładowalnego modułu lub nie uwzględniono obsługi (opis w postaci komentarza). Oto przykład: 2.6.20-16 CONFIG_X86=y CONFIG_X86_CPUID=m # CONFIG_EMBEDDED is not set

Aby sprawdzić, czy włączono obsługę konsoli, należy poszukać wierszy pokazanych poniżej. Trzeba pamiętać, że interesują nas wbudowane opcje, a nie moduły ładowalne: # # Serial drivers

504 |

Rozdział 17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli przez port szeregowy

# CONFIG_SERIAL_8250=y CONFIG_SERIAL_8250_CONSOLE=y

Jeśli znajdziemy zapis CONFIG_SERIAL_8250=m lub CONFIG_SERIAL_8250 is not set, wówczas będziemy zmuszeni do ponownego skompilowania jądra. Właściwych ustawień należy szukać w programie menuconfig w opcjach menu Device Drivers/Character devices/Serial drivers. Oto opcje konfiguracji związane z obsługą konsoli szeregowych, na które należy zwrócić uwagę: CONFIG_VT=y CONFIG_VT_CONSOLE=y CONFIG_HW_CONSOLE=y CONFIG_SERIAL_NONSTANDARD=y

Istnieje duże prawdopodobieństwo, że ich obsługa została włączona w jądrze systemu.

Modemy Tak, wiem, że modemy sprzętowe kosztują więcej niż modemy programowe lub modemy Winmodem. Proszę mi zaufać, na serwerze potrzebny jest dobrej jakości modem sprzętowy. Jeśli nie możemy sobie pozwolić na nowy, możemy poszukać na aukcji eBay lub innej giełdzie ze sprzętem z drugiej ręki. Jest wiele zalet zastosowania modemu sprzętowego: nie trzeba się przejmować sterownikami. Modem po prostu działa. Cały problem z dostępem do systemu za pośrednictwem linii szeregowej sprowadza się do skorzystania z dostępu na maksymalnie niskim poziomie. Nie można tego osiągnąć, jeśli trzeba się przejmować sterownikami. Modem zewnętrzny jest wyposażony w interesujące migające diody, które pomagają w rozwiązywaniu problemów, i jest przenośny. Modemy wewnętrzne pozwalają na oszczędność miejsca. Ważną funkcją, której należy poszukiwać, jest opcja zachowania ustawień po zaniku zasilania. Najczęściej ustawienia są przechowywane w nieulotnej pamięci RAM (NVRAM). Tanie modemy tracą swoje ustawienia po wyłączeniu zasilania, zatem przy próbie nawiązania połączenia modem nie odpowiada. Osobiście preferuję modemy firmy U.S. Robotics. Ich ceny kształtują się od 150 do 700 zł1. Niżej wymienione modele (oraz ich wszystkie odmiany) doskonale pracują z systemem Linux: • USR5686 zewnętrzny faksmodem 56 K z obsługą protokołu V.92; • wysokowydajny modem USR5610B 56 K V.92; • USR3453 Courier — modem 56 K klasy „biznes” z obsługą wszystkich protokołów V.x,

w tym również V.92; • USR5630 zewnętrzny faksmodem 56 K z obsługą protokołu V.92; • USR5631 zewnętrzny faksmodem 56 K z obsługą protokołu V.92; • USR0839 Sportster — zewnętrzny faksmodem 33.6 K.

Na potrzeby administrowania systemem Linux poprzez konsolę szeregową wystarczą tanie modemy, ponieważ wykorzystujemy najprostsze funkcje modemowe: odpowiedź na wywołanie, podtrzymanie przepływu danych oraz rozłączanie połączenia. Modele wyższej klasy, na przykład USR Courier, dają dostęp do przydatnych własności zabezpieczeń, takich jak oddzwanianie, identyfikacja linii dzwoniącego oraz listy uprawnionych dzwoniących. Własności te przydają się do uniemożliwienia napastnikom przejścia poza komunikat logowania. 1

Na giełdach Allegro i eBay można kupić używane modemy sprzętowe w cenie znacznie poniżej 100 zł — przyp. tłum. 17.1. Przygotowanie serwera do administrowania za pośrednictwem konsoli szeregowej

| 505

Patrz także • dokumentacja płyty głównej • strona podręcznika man programu getty • man 8 setserial • man 1 tty • man 4 tty • dokument HOWTO dotyczący zdalnych konsoli szeregowych:

http://www.tldp.org/HOWTO/Remote-Serial-Console-HOWTO/ • rozdział 10. „Łatanie, modyfikacje i aktualizacje jądra” z książki Carli Schroder Linux. Re-

ceptury (Helion, 2005)

17.2. Konfiguracja serwera w trybie headless z wykorzystaniem LILO Problem Nasz serwer, który wkrótce ma zacząć działać w trybie headless, zawiera teraz wszystkie niezbędne fragmenty do działania w tym trybie. Teraz chcemy się dowiedzieć, w jaki sposób można go skonfigurować, tak by akceptował logowanie z bezpośrednio podłączonej konsoli szeregowej. Chcemy też, aby w momencie ponownego rozruchu systemu z konsoli wyświetliło się menu startowe. W roli programu rozruchowego wykorzystywany jest LILO.

Rozwiązanie Najpierw należy zmodyfikować plik /etc/inittab w celu ustawienia domyślnego poziomu startu. Dzięki temu system uruchomi się w trybie tekstowym. Jeśli na serwerze nie zainstalowano systemu X Window, należy pominąć ten krok: # Domyślny poziom startu. id:3:initdefault:

Następnie otwieramy port szeregowy w taki sposób, by akceptował logowanie. To również wymaga modyfikacji pliku /etc/inittab: # Przykład uruchomienia programu getty dla łącza szeregowego (do podłączenia terminala) # T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100 #T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

Należy usunąć komentarz dla tej linii, dla której chcemy nawiązać połączenie (w tej recepturze wykorzystamy port ttyS0). W systemie powinna być włączona emulacja terminalu vt100 lub vt102. Jeśli tak nie jest, należy to zmienić. Zapisujemy zmiany i restartujemy program init: # init q

Użytkownicy dystrybucji Fedora Linux muszą wykonać dwa dodatkowe kroki. Najpierw powinni zmodyfikować plik /etc/sysconfig/init w celu wyłączenia obsługi kolorów ANSI. Należy również wyłączyć rozruch interaktywny za pomocą poniższych wierszy: BOOTUP=serial PROMPT=no

506

|

Rozdział 17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli przez port szeregowy

Wyłączamy demona Kudzu, ponieważ program ten zresetuje port szeregowy przy każdym uruchomieniu, co powoduje przerwanie połączenia z serwerem. Modyfikujemy plik /etc/sysconfig/kudzu: SAFE=yes

Następnie modyfikujemy program rozruchowy na serwerze — wydajemy polecenie dla jądra, by port ttyS0 (lub inny wykorzystywany port) stał się domyślnym portem konsoli szeregowej. W roli modelu można wykorzystać poniższy przykład. Trzeba oczywiście wstawić własne ścieżki dostępu, pliki z obrazami jądra oraz etykiety: ## /etc/lilo.conf # sekcja globalna boot=/dev/hda map=/boot/map install=menu prompt timeout=100 serial=0,9600n8 menu-title=" Serwer WWW 1 " default="CentOS 5 - konsola szeregowa" #opcje rozruchu image=/boot/vmlinuz-2.6.18.ELsmp label="CentOS 5" initrd=/boot/initrd-2.6.18.ELsmp.img read-only root=LABEL=/ image=/boot/vmlinuz-2.6.18.EL label="CentOS 5 - konsola szeregowa" initrd=/boot/initrd-vmlinuz-2.6.18.ELsmp.img read-only root=LABEL=/ append="console=ttyS0,9600n8"

Należy zablokować wszystkie ekrany startowe (ang. splash image) poprzez usunięcie wierszy, które się do nich odwołują. Nie należy włączać komunikatów startowych, ponieważ nie będą działać. Następnie należy zapisać zmiany w głównym rekordzie rozruchowym (MBR): # /sbin/lilo -v

W celu przetestowania konfiguracji należy kilkakrotnie uruchomić system. Nie należy od razu rozłączać monitora i klawiatury — trzeba odczekać do momentu, kiedy uda się pomyślnie nawiązać połączenie ze zdalnej konsoli szeregowej.

Dyskusja W pliku /etc/sysconfig/init w dystrybucji Fedora wykorzystywane są sekwencje specjalne do ustawiania kolorów. Mogą one spowodować problemy z działaniem konsoli szeregowej, dlatego najlepiej całkowicie wyłączyć kolory. Wiersz serial=0,9600n8 jest poleceniem dla serwera, aby był gotowy do sterowania z łącza szeregowego ttyS0. Oprócz tego wiersz ten inicjuje port szeregowy do szybkości 9600 bodów, 8 bitów danych i bez bitu parzystości. 17.2. Konfiguracja serwera w trybie headless z wykorzystaniem LILO

|

507

Opcja append="console=ttyS0,9600n8" informuje jądro o tym, który port szeregowy należy wykorzystać. Skąd wiadomo, który z portów to ttyS0, a który ttyS1, jeśli w systemie jest więcej niż jeden port szeregowy? Jeśli w dokumentacji płyty głównej nie ma takiej informacji, to jedynym sposobem jest skorzystanie z metody prób i błędów. Aby na podłączonym monitorze i zdalnej konsoli szeregowej wyświetlały się komunikaty startowe, należy użyć następującego ustawienia: append="console=tty0 console=ttyS0,9600n8"

Na podłączonym monitorze będzie widoczne tylko menu startowe, następnie zawartość ekranu nie będzie się zmieniała do czasu wyświetlenia komunikatu logowania. Zdalna konsola szeregowa będzie otrzymywała wszystkie komunikaty startowe, włącznie z wyjściem z systemu init oraz komunikatami dziennika systemowego. Należy pamiętać, że limity czasu są mierzone w dziesiątych częściach sekundy. Opcja install zmieniła się, począwszy od wydania LILO w wersji 22.3. We wcześniejszych wersjach interfejs użytkownika był odczytywany z pliku w katalogu /boot. W bieżącej wersji interfejs użytkownika jest dodatkową opcją menu. Do wyboru są wartości text, menu i bmp. Opcja text powoduje wykorzystanie wyłącznie wiersza poleceń. Opcja menu powoduje wyświetlenie tekstowego menu startowego oraz opcji wiersza poleceń. Wybranie opcji bmp powoduje wyświetlanie obszernego ekranu graficznego, który ewidentnie nie nadaje się do przesyłania przez łącze szeregowe. Uruchomienie systemu w trybie tekstowym nie wyklucza możliwości późniejszego uruchomienia systemu X Window. Aby to zrobić, wystarczy uruchomić polecenie startx na serwerze. Sesja ze środowiskiem X Window nie będzie widoczna na konsoli szeregowej. Jej użycie ma sens tylko wtedy, kiedy chcemy wyświetlić sesję X na monitorze podłączonym do serwera lub jeśli uruchamiamy zdalne klienty X z serwera.

Patrz także • na stronie podręcznika systemowego man 5 lilo.conf można znaleźć opis wszystkich

opcji z pliku /etc/lilo.conf • man 5 inittab • man 1 startx • dokument HOWTO dotyczący zdalnych konsoli szeregowych:

http://www.tldp.org/HOWTO/Remote-Serial-Console-HOWTO/ • więcej informacji na temat zarządzania poziomami startu można znaleźć w rozdziale 7.

„Uruchamianie i zamykanie systemu Linux” książki autorstwa Carli Schroder Linux. Receptury (Helion, 2005) • rozdział 12. „Zarządzanie programem rozruchowym i start wielosystemowy” z książki

Carli Schroder Linux. Receptury (Helion, 2005) • podrozdział 15.2 „Jednoczesne korzystanie z X Window i konsoli” z książki Carli Schroder

Linux. Receptury (Helion, 2005)

508 |

Rozdział 17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli przez port szeregowy

17.3. Konfiguracja serwera w trybie headless z wykorzystaniem programu GRUB Problem Nasz serwer, który wkrótce ma zacząć działać w trybie headless, zawiera teraz wszystkie niezbędne fragmenty do działania w tym trybie. Teraz chcemy się dowiedzieć, w jaki sposób można go skonfigurować, tak by akceptował logowanie z bezpośrednio podłączonej konsoli szeregowej. Chcemy też, aby w momencie ponownego rozruchu systemu z konsoli wyświetliło się menu startowe. W roli programu rozruchowego wykorzystywany jest GRUB.

Rozwiązanie Najpierw należy zmodyfikować plik /etc/inittab w celu ustawienia domyślnego poziomu startu, tak aby system uruchamiał się w trybie tekstowym (użytkownicy Debiana mogą znaleźć dodatkowe informacje w podrozdziale 17.4): # Domyślny poziom startu id:3:initdefault:

Następnie otwieramy port szeregowy w taki sposób, by akceptował logowanie: # Przykład uruchomienia programu getty dla łącza szeregowego (do podłączenia terminalu) # T0:23:respawn:/sbin/getty -L ttyS0 9600 vt100 #T1:23:respawn:/sbin/getty -L ttyS1 9600 vt100

Należy usunąć komentarz dla tej linii, dla której chcemy nawiązać połączenie (w tej recepturze wykorzystamy port ttyS0). W systemie powinna być włączona emulacja terminalu vt100 lub vt102. Jeśli tak nie jest, należy to zmienić. Zapisujemy zmiany i restartujemy program init: # init q

Użytkownicy dystrybucji Fedora Linux muszą wykonać dwa dodatkowe kroki. Najpierw powinni zmodyfikować plik /etc/sysconfig/init w celu wyłączenia obsługi kolorów ANSI. Należy również wyłączyć rozruch interaktywny za pomocą poniższych wierszy: BOOTUP=serial PROMPT=no

Wyłączamy demona Kudzu, ponieważ program ten zresetuje port szeregowy przy każdym uruchomieniu, co spowoduje przerwanie połączenia z serwerem. Modyfikujemy plik /etc/sysconfig/kudzu: SAFE=yes

Następnie modyfikujemy plik /boot/grub/grub.conf — wydajemy polecenie dla jądra, by port ttyS0 (lub inny wykorzystywany port) stał się domyślnym portem konsoli szeregowej. W roli modelu można wykorzystać poniższy przykład. Trzeba oczywiście wstawić własne ścieżki dostępu, pliki z obrazami jądra oraz etykiety: #/boot/grub/grub.conf # sekcja globalna default 1 timeout 10

17.3. Konfiguracja serwera w trybie headless z wykorzystaniem programu GRUB

| 509

serial --unit=0 --speed=9600 --word=8 --parity=no --stop=1 terminal --timeout=10 serial #opcje rozruchu title Debian-Sarge root (hd0,0) kernel /boot/vmlinuz-2.6.20-16 root=/dev/hda2 ro initrd /boot/initrd.img-2.6.20-16 title root kernel initrd

Debian-Sarge, serial (hd0,0) /boot/vmlinuz-2.6.20-16 root=/dev/hda2 ro console=ttyS0,9600n8 /boot/initrd.img-2.6.20-16

Należy zablokować wszystkie ekrany startowe poprzez usunięcie wierszy, które się do nich odwołują. W celu przetestowania konfiguracji należy kilkakrotnie uruchomić system. Nie wolno od razu rozłączać monitora i klawiatury — należy odczekać do momentu, kiedy uda się pomyślnie nawiązać połączenie ze zdalnej konsoli szeregowej.

Dyskusja W programie GRUB opcje są zliczane od zera, zatem ustawienie default=1 powoduje, że domyślna staje się druga grupa opcji startowych. Ustawienie serial=0, 9600n8 jest poleceniem dla serwera gotowości do akceptowania sterowania z łącza szeregowego. Opcja ta ustawia również port szeregowy. Ustawienie console=ttyS0, 9600n8 w wierszu z opcją kernel to informacja dla jądra dotycząca wykorzystywanego portu szeregowego. Argument --timeout=10 informuje system GRUB o tym, aby po 10 sekundach domyślnie wybierał pierwsze urządzenie wymienione w wierszu z opcją terminal. Skąd wiadomo, który z portów to ttyS0, a który ttyS1, jeśli w systemie jest więcej niż jeden port szeregowy? Jeśli w dokumentacji płyty głównej nie ma takiej informacji, to jedynym sposobem jest skorzystanie z metody prób i błędów. Aby komunikaty startowe wyświetlały się zarówno na podłączonym monitorze, jak i zdalnej konsoli szeregowej, należy dodać opcję console w następujący sposób: # sekcja globalna ... terminal --timeout=10 serial console #opcje rozruchu ... kernel /boot/vmlinuz-2.6.11-ln.std root=/dev/hda2 ro console=tty0 console=ttyS0,9600n8

Jeśli do systemu jest podłączona klawiatura i monitor, a jednocześnie zdalna konsola szeregowa, można wcisnąć klawisz na dowolnym z tych urządzeń, aby stało się ono domyślne. Jeśli nie wybierzemy żadnego, domyślnie zostanie wybrane pierwsze urządzenie wymienione w wierszu z opcją terminal. Uruchomienie systemu w trybie tekstowym nie wyklucza możliwości późniejszego uruchomienia systemu X Window. Aby to zrobić, wystarczy uruchomić polecenie startx na serwerze. Sesja ze środowiskiem X Window nie będzie widoczna na konsoli szeregowej. Jej użycie ma sens tylko wtedy, kiedy chcemy wyświetlić sesję X na monitorze podłączonym do serwera lub jeśli uruchamiamy zdalne klienty X z serwera.

510

|

Rozdział 17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli przez port szeregowy

Patrz także • man 8 grub • man 1 startx • dokument HOWTO dotyczący zdalnych konsoli szeregowych:

http://www.tldp.org/HOWTO/Remote-Serial-Console-HOWTO/ • więcej informacji na temat zarządzania poziomami startu można znaleźć w rozdziale 7.

„Uruchamianie i zamykanie systemu Linux” książki autorstwa Carli Schroder Linux. Receptury (Helion, 2005) • rozdział 12. „Zarządzanie programem rozruchowym i start wielosystemowy” z ksiązki

Carli Schroder Linux. Receptury (Helion, 2005) • podrozdział 15.2 „Jednoczesne korzystanie z X Window i konsoli” z książki Carli Schroder

Linux. Receptury (Helion, 2005)

17.4. Ładowanie systemu w trybie tekstowym w Debianie Problem System Debian uruchamia automatycznie sesję X Window. Najprawdopodobniej wykorzystywane jest środowisko Gnome Display Manager (GDM), K Display Manager (KDM) lub X Display Manager (XDM). W odróżnieniu od Red Hata w Debianie bezpośrednio po instalacji nie są jednak automatycznie skonfigurowane zarówno tekstowe, jak i graficzne poziomy startu. Domyślnie poziomy startu od 2 – 5 są identyczne. Ponieważ podczas instalacji wybraliśmy logowanie graficzne, dla poziomów startu 2 – 5 następuje uruchomienie systemu w trybie graficznym. W jaki sposób skonfigurować system, tak aby można było uruchomić system wyłącznie w trybie tekstowym?

Rozwiązanie Przede wszystkim trzeba się dowiedzieć, jaki menedżer ekranu jest wykorzystywany w systemie. Następnie należy usunąć go z właściwych poziomów startu. Aby się dowiedzieć, jaki menedżer jest uruchomiony, można skorzystać z następującego polecenia: $ ps ax | grep dm 537 | S 544 | S< lib/gdm/A:0-PbCLdj

0:00 /usr/bin/gdm 0:10 /usr/X11R6/bin/X :0 -dpi 100 -nolisten tcp vt7 -auth /var/

Powyższy wynik pokazuje, że w systemie działa menedżer GDM (Gnome Display Manager). Najpierw usuwamy go ze wszystkich poziomów startu: # update-rc.d -f gdm remove update-rc.d: /etc/init.d/gdm exists during rc.d purge (continuing) Removing any system startup links for /etc/init.d/gdm ... /etc/rc0.d/K01gdm /etc/rc1.d/K01gdm /etc/rc2.d/S99gdm /etc/rc3.d/S99gdm

17.4. Ładowanie systemu w trybie tekstowym w Debianie

|

511

/etc/rc4.d/S99gdm /etc/rc5.d/S99gdm /etc/rc6.d/K01gdm

Następnie konfigurujemy uruchomienie menedżera GDM na 5. poziomie startu i zatrzymujemy go we wszystkich pozostałych; # update-rc.d gdm start 99 5 . stop 01 0 1 2 3 4 6 . Adding system startup for /etc/init.d/gdm ... /etc/rc0.d/K01gdm -> ../init.d/gdm /etc/rc1.d/K01gdm -> ../init.d/gdm /etc/rc2.d/K01gdm -> ../init.d/gdm /etc/rc3.d/K01gdm -> ../init.d/gdm /etc/rc4.d/K01gdm -> ../init.d/gdm /etc/rc6.d/K01gdm -> ../init.d/gdm /etc/rc5.d/S99gdm -> ../init.d/gdm

Teraz należy zmodyfikować plik /etc/inittab w celu ustawienia domyślnego poziomu startu. Dzięki temu system uruchomi się w trybie tekstowym. Domyślny poziom startu dla Debiana to poziom 2., zatem pozostaniemy wierni tradycji: # Domyślny poziom startu. id:2:initdefault:

Teraz należy dokończyć konfigurację serwera, postępując zgodnie z recepturami 17.2 i 17.3.

Dyskusja Uruchomienie systemu w trybie tekstowym nie wyklucza możliwości późniejszego uruchomienia systemu X Window. Aby to zrobić, wystarczy uruchomić polecenie startx na serwerze. Sesja ze środowiskiem X Window nie będzie widoczna na konsoli szeregowej. Jej użycie ma sens tylko wtedy, kiedy chcemy wyświetlić sesję X na monitorze podłączonym do serwera lub jeśli uruchamiamy zdalne klienty X z serwera. W dystrybucji Debian polecenie update-rc.d służy do modyfikowania poziomów startu. Flaga -f oznacza „wymuszaj usuwanie dowiązań symbolicznych nawet wtedy, gdy plik /etc/init.d/

w dalszym ciągu istnieje”. Poziomy startu to nic innego, jak obszerne zbiory dowiązań symbolicznych, które można znaleźć w katalogach /etc/rc*.d. Zastosowanie dowiązań symbolicznych chroni skrypty startowe w katalogu /etc/init.d, których z całą pewnością nie chcemy usuwać. Jeśli ktoś czuje zdenerwowanie, może uruchomić najpierw polecenie update-rc. d-f-n w celu wykonania próby „na sucho”. Przełącznik -n oznacza „nie wykonuj aktualizacji”.

Patrz także • man 8 update-rc.d • man 1 startx • dokument HOWTO dotyczący zdalnych konsoli szeregowych:

http://www.tldp.org/HOWTO/Remote-Serial-Console-HOWTO/ • więcej informacji na temat zarządzania poziomami startu można znaleźć w rozdziale 7.

„Uruchamianie i zamykanie systemu Linux” książki autorstwa Carli Schroder Linux. Receptury (Helion, 2005) • podrozdział 15.2 „Jednoczesne korzystanie z X Window i konsoli” z książki Carli Schroder

Linux. Receptury (Helion, 2005)

512

|

Rozdział 17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli przez port szeregowy

17.5. Konfiguracja konsoli szeregowej Problem Mamy laptop z systemem Linux lub stację roboczą przygotowane do wykorzystania w roli konsoli szeregowej. Trzeba jeszcze wiedzieć, jak je skonfigurować oraz jak korzystać z oprogramowania komunikacyjnego. Chcemy nawiązać bezpośrednie połączenie z serwerem działającym w trybie headless.

Rozwiązanie Przede wszystkim potrzebne są następujące elementy: • port szeregowy DB9; wiele laptopów nie ma żadnego portu szeregowego; alternatywą

jest skorzystanie z przejściówki USB-port szeregowy; • kabel zerowego modemu; • minicom, program do komunikacji przez port szeregowy.

Następnie wystarczy skonfigurować program minicom, podłączyć dwa systemy i to wszystko. Uruchamiamy program minicom z opcją -s (od setup — konfiguracja): # minicom -s ------[configuration]-----| Filenames and paths | File transfer protocols | Serial port setup | Modem and dialing | Screen and keyboard | Save setup as dfl | Save setup as.. | Exit | Exit from Minicom ----------------------------

Wybieramy polecenie Serial port setup. Z poniższego menu należy wybrać literę opcji, którą chcemy zmienić, a następnie wcisnąć Return, aby powrócić do ekranu Change which setting?: -----------------------------------------| A Serial Device : /dev/ttyS0 | B - Lockfile Location : /var/lock | C Callin Program : | D - Callout Program : | E Bps/Par/Bits : 9600 8N1 | F - Hardware Flow Control : Yes | G - Software Flow Control : No | | Change which setting? -------------------------------------------

Z tego miejsca należy ponownie wcisnąć Return, aby powrócić do głównego menu. Następnie należy wybrać opcję Modem and dialing i upewnić się, że ustawienia Init string oraz Reset string są puste. Na koniec należy wybrać opcję Save setup as dfl, aby ta konfiguracja stała się domyślna, a następnie opcję Exit from Minicom. Bierzemy kabel modemu zerowego i łączymy dwie maszyny. Następnie uruchamiamy minicom:

17.5. Konfiguracja konsoli szeregowej

|

513

# minicom Welcome to minicom 2.1 OPTIONS: History Buffer, F-key Macros, Search History Buffer, I18n Compiled on Nov 12 2003, 19:21:57 Press CTRL-A Z for help on special keys headless login:

Logujemy się do serwera i to wszystko. Aby zakończyć sesję, należy wcisnąć Ctrl+A, X.

Dyskusja Co teraz można zrobić? Wszystko, co jest dostępne z poziomu dowolnej powłoki systemu Linux. Teraz można odłączyć klawiaturę i monitor od serwera. Przed podłączeniem lub rozłączeniem klawiatury bądź myszy PS/2 należy pamiętać o wyłączeniu zasilania. Wiem, że niektórzy twierdzą, że nie ma potrzeby wyłączania zasilania przed odłączeniem klawiatury i myszy PS/2. Ja uważam, że jest to tanie zabezpieczenie przed możliwością uszkodzenia systemu. Dla portu PS/2 nie przewidziano możliwości podłączania „na gorąco”. Domyślna wartość ilości bitów na sekundę dla opcji E - Bps/Par/Bits w konfiguracji Minicom może mieć dowolną wartość od 9600 do 115 200, w zależności od dystrybucji Linuksa. Ustawienie ilości bitów na sekundę w przypadku połączenia kablem modemu zerowego musi być takie samo we wszystkich plikach konfiguracyjnych — programie rozruchowym, pliku /etc/inittab oraz w konfiguracji minicom. Wartość 9600 jest najbezpieczniejsza. Można również poeksperymentować z większymi szybkościami. 38 400 to standardowa szybkość konsoli w systemie Linux. W przypadku problemów z pracą przy tej szybkości można spróbować szybkości 19 200. Szybkość układu UART można odczytać za pomocą polecenia setserial: $ setserial -g /dev/ttyS0 /dev/ttyS0, UART: 16550A, Port: 0x03f8, IRQ: 4

Istnieje jednak niewielkie prawdopodobieństwo, że uda nam się uzyskać szybkość większą niż 38 400. Oto wszystkie możliwe szybkości łącz szeregowych: 110 bps 300 bps 1200 bps 2400 bps 4800 bps 9600 bps 19 200 bps 38 400 bps 57 600 bps 115 200 bps

Uprawnienie do plików Uprawnienia do plików mogą przyprawić nas o ból głowy. Jeśli serwer nie zezwala na zalogowanie się z uprawnieniami użytkownika root, to trzeba wprowadzić zapis do pliku /etc/ securetty na serwerze: # /etc/securetty: lista terminali, na których może się logować użytkownik root. # Informacje o użytkownikach konsoli szeregowych # można uzyskać na stronach podręcznika systemowego securetty(5) oraz login(1).console. ttyS0

514

|

Rozdział 17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli przez port szeregowy

Jeśli nie można nawiązać połączenia z wykorzystaniem konta nieuprzywilejowanego użytkownika, oznacza to, że urządzenie /dev/ttyS0 jest przeznaczone wyłącznie dla użytkownika root. Najpierw należy sprawdzić uprawnienia oraz ustawienia własności: $ ls -al /dev/ttyS0 crw-rw---- 1 root dialout 4, 64 Sep 7 22:22 /dev/ttyS0

Urządzenie /dev/ttyS0 należy do grupy dialout, trzeba zatem jedyne dodać do tej grupy uprawnionych użytkowników. W niektórych dokumentach HOWTO można znaleźć informacje o tym, aby dla urządzenia /dev/ttyS0 ustawić tryb 777. Ze względu na bezpieczeństwo nie jest to dobry pomysł. Dodawanie użytkowników do grup nie jest trudne, a jest rozwiązaniem znacznie bezpieczniejszym.

Patrz także • man 5 securetty • man 1 minicom • dokument HOWTO dotyczący zdalnych konsoli szeregowych:

http://www.tldp.org/HOWTO/Remote-Serial-Console-HOWTO/ • rozdział 8. „Zarządzanie użytkownikami i grupami” z książki Carli Schroder Linux. Recep-

tury (Helion, 2005)

17.6. Konfiguracja serwera do administracji za pośrednictwem połączenia wdzwanianego Problem Chcemy mieć możliwość dzwonienia z domu bądź z innej lokalizacji poza siecią i wykonywać zdalną administrację na serwerze z wykorzystaniem konsoli szeregowej. W związku z tym trzeba skonfigurować serwer do administracji przez łącze wdzwaniane. Mamy odpowiedni zewnętrzny lub wewnętrzny modem sprzętowy zainstalowany i gotowy do pracy. Włączyliśmy możliwość administracji serwerem przez port szeregowy. Teraz pozostało tylko skonfigurowanie modemu podłączonego do serwera w taki sposób, by odpowiadał na wywołania.

Rozwiązanie Aby skonfigurować modem w taki sposób, by odpowiadał na połączenia, należy skorzystać z programu minicom. W czasie wpisywania poleceń modem musi być podłączony. W tej recepturze wykorzystano zestaw poleceń AT Hayesa obsługiwany przez większość modemów. Aby się upewnić, czy nasz modem je obsługuje, można przejrzeć dokumentację modemu. Najpierw należy skonfigurować podstawowe ustawienia modemu, a następnie wprowadzić polecenia modemowe: # minicom -s --------[configuration]----| Filenames and paths | | File transfer protocols |

17.6. Konfiguracja serwera do administracji za pośrednictwem połączenia wdzwanianego

|

515

| | | | | | |

Serial port setup Modem and dialing Screen and keyboard Save setup as dfl Save setup as.. Exit Exit from Minicom

| | | | | |

Wybieramy opcję Serial port setup i wprowadzamy ustawienia w sposób pokazany poniżej (poza urządzeniem odpowiadającym portowi szeregowemu, które musi być dobrane właściwie dla naszego systemu): | | | | | | | | |

A B C D E F G

Serial Device - Lockfile Location Callin Program - Callout Program Bps/Par/Bits - Hardware Flow Control - Software Flow Control

: /dev/ttyS0 : /var/lock : : :115200 8N1 : Yes : No

Change which setting?

Po wprowadzeniu zmian należy powrócić do głównego menu, wybrać polecenie Save setup as dfl, a następnie Exit. Wyświetlą się następujące komunikaty: Welcome to minicom 2.1 OPTIONS: History Buffer, F-key Macros, Search History Buffer, I18n Compiled on Jan 1 2005, 19:46:57. Press CTRL-A Z for help on special keys

Następnie należy wprowadzić poniższe polecenia: AT OK AT OK AT OK AT

&F Z &C1 &D2 &K3 S0=2 M0 E0 Q1 S2=255 &W

Teraz wciskamy klawisze Ctrl+A, Q. Wyświetli się ostatni komunikat: -----------------------| Leave without reset| | | Yes No | ------------------------

Możemy teraz bezpośrednio dzwonić do serwera. Modem odpowie po drugim dzwonku. Powinien się wyświetlić taki sam komunikat logowania jak w przypadku połączenia bezpośredniego, za pomocą kabla zerowego modemu.

Dyskusja Możemy wykorzystać tanie modemy w komputerach, z których dzwonimy, jednak w przypadku serwera opłaca się wydać pieniądze na lepszy modem. Nie należy się zbytnio przejmować ustawieniami szybkości połączenia. Nowoczesne modemy same wykorzystują automatyczną negocjację szybkości połączenia. W przypadku problemów z nawiązaniem niezawodnego połączenia można spróbować wolniejszych połączeń.

516

|

Rozdział 17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli przez port szeregowy

W jaki sposób sprawdzić numer portu szeregowego? Z wyniku poniższego polecenia widać, że w tym systemie jest tylko jeden port szeregowy — /dev/ttyS0. Można to stwierdzić, ponieważ tylko dla tego urządzenia jest informacja o układzie 16550A UART: $ setserial /dev/ttyS0, /dev/ttyS1: /dev/ttyS2, /dev/ttyS3,

-g /dev/ttyS[0123] UART: 16550A, Port: 0x03f8, IRQ: 4 No such device UART: unknown, Port: 0x03e8, IRQ: 4 UART: unknown, Port: 0x02e8, IRQ: 3

Polecenia konfiguracji modemu zostały skopiowane z rozdziału 13. dokumentu HOWTO dotyczącego obsługi komunikacji szeregowej. Kompletną listę poleceń AT standardu Hayes można znaleźć w wielu źródłach w internecie. Warto mieć pod ręką drukowaną kopię lub zadbać o to, aby w pobliżu była dokumentacja modemu: minicom -o -s

Uruchomienie programu minicom bez wysyłania ciągu inicjującego modem i otwarcie menu konfiguracyjnego programu minicom. AT

Uwaga modemie! Mam dla Ciebie nowe polecenia! &F

Przywrócenie konfiguracji fabrycznej. Z

Reset do profilu nr 1. &C1

Linia DCD (Data Carrier Detect) jest włączona; należy się przygotować na odbiór danych od wywołującego modemu. &D2

Linia DTR (Data Terminal Ready); rozłączenie po zakończeniu transmisji przez modem wywołujący. &K3

Uzgadnianie CTS/RTS w celu zapobieżenia utraty znaków w komunikacie logowania. S0=2

Odpowiedź na przychodzące wywołania po dwóch dzwonkach. M0

Wyłączenie głośnika modemu. E0

Wyłączenie echa poleceń modemu na ekran w celu zapobieżenia wyświetlaniu mylących informacji na konsoli.

Q1

Wyłączenie wyświetlania odpowiedzi modemu na ekranie. S2=255

Wyłączenie trybu poleceń modemu. &W

Zapisanie zmian do nieulotnej pamięci (NVRAM). Kompletna lista poleceń powinna być dostępna w dokumentacji modemu. W większości modemów wykorzystuje się zbiór poleceń AT Hayes. Z łatwością można je znaleźć w internecie.

17.6. Konfiguracja serwera do administracji za pośrednictwem połączenia wdzwanianego

|

517

Aby były słyszalne dźwięki wydawane przez modem, należy zmienić wartość opcji M0 na M1. Opcja ta włącza głośnik tylko na czas uzgadniania. Po włączeniu opcji M1 można skorzystać z opcji L1, L2 lub L3 do ustawienia głośności. Opcja L1 to najbardziej ciche ustawienie modemu, opcja L3 — najgłośniejsze.

Patrz także • man 8 setserial • man 1 minicom • dokument HOWTO dotyczący zdalnych konsoli szeregowych:

http://www.tldp.org/HOWTO/Remote-Serial-Console-HOWTO/ • w dokumencie HOWTO dotyczącym transmisji szeregowej bardzo szczegółowo opisano

sposób działania portu szeregowego: http://www.tldp.org/HOWTO/Serial-HOWTO.html

17.7. Dzwonienie do serwera Problem Nasz serwer jest skonfigurowany do zdalnej administracji przez łącza modemowe. W jaki sposób można do niego zadzwonić i zabrać się do pracy?

Rozwiązanie Można wykorzystać naszego dobrego znajomego — programu minicom — wszechstronnego narzędzia do obsługi transmisji szeregowej. Aby zainicjować połączenie ze zdalnej maszyny odgrywającej rolę konsoli szeregowej, należy wprowadzić numer telefonu w książce telefonicznej programu minicom, a następnie skorzystać z polecenia Dial: $ minicom Initializing modem Welcome to minicom 2.1 OPTIONS: History Buffer, F-key Macros, Search History Buffer, I18n Compiled on Jan 1 2005, 19:46:57. Press CTRL-A Z for help on special keys AT S7=45 S0=0 L3 V1 X4 &c1 E1 Q0 OK Ctrl-A, D ____________________[Dialing Directory]___________________ | Name Number Last on Times Script | |1 fileserver1 9322744 0 | | | | | | | | | | |

518

|

Rozdział 17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli przez port szeregowy

| ( Escape to exit, Space to tag ) | |________________________________________________________| Dial Find Add Edit Remove moVe Manual ________________[Autodial]________________ | | | Dialing : fileserver1 | | At : 9322744 | | | | Time : 39 Attempt #1 | | | | | | Escape to cancel, space to retry | |________________________________________ | Connected. Press any key to continue

CONNECT 115200/V34/LAPM/V42BIS/33600:TX/33600:RX fileserver1.carla.com ttyS0 login: carla Password: ******** [carla@fileserver1:~]$

I jesteśmy w zdalnym systemie. Aby zakończyć zdalną sesję, można skorzystać z następującego polecenia: [carla@fileserver1:~]$ logout

Dyskusja Połączenie modemowe jest doskonałym rezerwowym środkiem komunikacji, z którego można skorzystać, jeśli nastąpi awaria łącza internetowego, sieci Ethernet lub jeśli zachodzi potrzeba ponownego załadowania systemu na serwerze. Nie należy się zbytnio przejmować ustawieniami szybkości połączenia. Nowoczesne modemy same automatycznie negocjują szybkość połączenia. W przypadku problemów z nawiązaniem niezawodnego połączenia można spróbować wolniejszych połączeń. Aby wypróbować połączenia o innych szybkościach, można skorzystać z polecenia Edit z menu.

Patrz także • man 1 minicom • dokument HOWTO dotyczący zdalnych konsoli szeregowych:

http://www.tldp.org/HOWTO/Remote-Serial-Console-HOWTO/ • w dokumencie HOWTO dotyczącym transmisji szeregowej bardzo szczegółowo opisano

sposób działania portu szeregowego: http://www.tldp.org/HOWTO/Serial-HOWTO.html

17.8. Zabezpieczenia łączy szeregowych Problem Ponieważ łącze szeregowe jest bezpośrednią linią do jądra, która omija zapory firewall i systemy wykrywania intruzów, chcemy skonfigurować jakieś bariery przeciwko intruzom, zwłaszcza podejmującym próby zdalnej administracji.

17.8. Zabezpieczenia łączy szeregowych

|

519

Rozwiązanie Jest kilka sposobów poprawy bezpieczeństwa łączy szeregowych: • kierowanie wszystkich żądań logowania do zdalnego serwera logowania; • wykorzystanie modemu lepszej klasy z wbudowanymi zabezpieczeniami, takimi jak au-

tomatyczne wywołania zwrotne, identyfikacja łącza wywołującego oraz zatwierdzone listy dzwoniących;

• nie należy używać linii telefonicznej, do której wszyscy znają numer; • należy wyłączyć klawisz SysRq za pomocą następującego wiersza w pliku /etc/sysctl.conf:

kernel.sysrq=0;

• polecenie AT S2=255 wyłącza tryb poleceń modemu, ale zdalny napastnik może zreseto-

wać je do trybu poleceń, a następnie wprowadzić własne polecenia. Do zapobiegania tego rodzaju atakom doskonale nadają się modemy, w których do włączania i wyłączania trybu poleceń wykorzystuje się przełączniki DIP lub zworki.

Dyskusja Pierwsza linia obrony to utajniony numer telefonu. Bezpieczeństwo poprzez zachowanie poufności ma swoje miejsce w architekturze zabezpieczeń. Nie należy ułatwiać życia niezaawansowanym napastnikom, których jedynym celem jest sprawianie kłopotów innym. Takie zabezpieczenie nie jest jednak skuteczne w przypadku programów typu war-dialer. Jeśli napastnik zdecyduje się na atak war-dialer, wykrycie linii telefonicznych, do których są podłączone modemy, nie zajmie mu zbyt dużo czasu. Po wykryciu numeru telefonu dostęp do systemu wymaga przejścia poza początkowy ekran logowania. Cracker może sprawić nam wiele kłopotu już tylko przez samo wielokrotne wybieranie numeru telefonicznego serwera — ataki denial-of-service są łatwe do przeprowadzenia i trudne do zwalczania. Modemy wysokiej klasy, takie jak U.S. Robotics Courier, mają zabezpieczenia, które są w stanie przeciwstawić się upartym napastnikom, na przykład mechanizm automatycznych wywołań zwrotnych oraz zatwierdzone listy dzwoniących. Nie można zabronić crackerowi wybierania naszego numeru, ale można próbować uniemożliwić mu uzyskanie dostępu do jądra. Klawisz SysRq umożliwia użytkownikowi przesyłanie poleceń bezpośrednio do jądra. Klawisz ten jest wykorzystywany głównie przez programistów jądra. Poza tym nie ma uzasadnionego powodu, aby był on aktywny. Należy sprawdzić, czy jego obsługę wkompilowano w jądro. Odpowiedniej opcji należy szukać w pliku /boot/config-* w katalogu z kodem źródłowym jądra: CONFIG_MAGIC_SYSRQ=y

Obecność tej opcji oznacza, że obsługa klawisza SysRq jest wkompilowana w jądrze. Inna możliwość to ponowna kompilacja jądra i usunięcie obsługi klawisza SysRq. Jeśli nie zajmujemy się usprawnianiem jądra, nie ma zbyt wielu powodów, aby ten klawisz był aktywny.

Patrz także • receptura 19.19 • dokument HOWTO dotyczący zdalnych konsoli szeregowych:

http://www.tldp.org/HOWTO/Remote-Serial-Console-HOWTO/ • w dokumencie HOWTO dotyczącym transmisji szeregowej bardzo szczegółowo opisano

sposób działania portu szeregowego: http://www.tldp.org/HOWTO/Serial-HOWTO.html 520

|

Rozdział 17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli przez port szeregowy

17.9. Konfiguracja rejestrowania informacji Problem Chcemy skierować komunikaty jądra na konsolę szeregową oraz do pliku dziennika. Dzięki temu można je śledzić w czasie rzeczywistym oraz analizować później zawartość pliku dziennika. W jaki sposób można to zrobić?

Rozwiązanie Należy skonfigurować plik /etc/syslog.conf i skierować komunikaty jądra do dowolnej lokalizacji: kern.* -/var/log/kern.log kern.* /dev/console kern.* @xena

Powyższe opcje powodują skierowanie wszystkich komunikatów jądra do trzech różnych lokalizacji. Pierwsza to plik lokalny, druga to konsola szeregowa, natomiast trzecia — zdalny serwer rejestrowania danych Xena. W pliku musi być włączony co najmniej domyślny wpis kern. Należy zatem pamiętać o tym, aby go zmodyfikować lub usunąć, jeśli nie pasuje do naszego sposobu rejestrowania.

Dyskusja Użytkownik może dostroić system rejestrowania informacji do własnych potrzeb. Mechanizm syslog obsługuje osiem różnych poziomów istotności: debug, info, notice, warning, err, crit, alert, emerg

W przypadku wybrania jednego z nich rejestrowane będą również wszystkie komunikaty o wyższym priorytecie. Ustawienie następującej opcji: kern.crit /dev/console

powoduje wysłanie komunikatów poziomów crit, alert i emerg na konsolę szeregową. Po zmodyfikowaniu pliku konfiguracyjnego należy zrestartować demona klogd. W Debianie należy skorzystać z następującego polecenia: # /etc/init.d/klogd restart

W dystrybucji Fedora, należy skorzystać z następującego polecenia: # /etc/init.d/sysklogd restart

W Linuksie systemowy demon rejestrowania informacji w rzeczywistości składa się z dwóch demonów: sysklogd i klogd. klogd to demon rejestrowania informacji dotyczących jądra. W Debianie każdemu demonowi odpowiada własny plik init; w Fedorze oba demony są zarządzane za pomocą tego samego pliku.

Patrz także • man 5 syslog.conf • receptura 19.19

17.9. Konfiguracja rejestrowania informacji

|

521

17.10. Wgrywanie plików na serwer Problem Musimy przesłać kilka plików na serwer — na przykład nowy sterownik karty sieciowej. Być może trzeba zastąpić uszkodzony kontroler dysku lub naprawić chaotyczną konfigurację zapory iptables. To nie jest Ethernet, nie można zatem skorzystać z polecenia scp, jak też nie można przeciągnąć i upuścić plików w menedżerze plików. Co należy zrobić?

Rozwiązanie Pamiętacie stare czasy serwisów BBS (Bulletin Board Services) oraz protokołów transmisji plików Xmodem, Ymodem, Zmodem i Kermit? Ponieważ korzystamy z programu minicom, potrzebujemy właśnie jednego z tych protokołów. Najlepszy spośród nich jest protokół Zmodem, ponieważ zawiera wbudowany mechanizm korekcji błędów i jest najbardziej niezawodny. Najpierw należy zainstalować na serwerze pakiet lrzsz. Pakiet ma taką samą nazwę zarówno w formacie RPM, jak i w formacie pakietu Debian. Następnie należy się zalogować na serwerze ze zdalnej konsoli, wykorzystując program minicom. Na serwerze wpisujemy polecenie zamieszczone poniżej. Jest to polecenie oczekiwania na odebranie pliku: [server@remote:~]$ rz rz waiting to receive.**|B0100000023be50

Następnie wciskamy klawisze Alt-A, Z i dalej S — wyświetli się menu wysyłania plików programu minicom. Najpierw wybieramy protokół Zmodem: --[Upload]--| zmodem | | ymodem | | xmodem | | kermit | | ascii | -------------

Następnie wybieramy plik lub pliki, które mają być przesłane na serwer: ---------[Select one or more files for upload]-----|Directory: /home/carla | | [..] | | [.AbiSuite] | | [.cddb] | | [.cfagent] | | [.config] | | [.fonts] | | ( Escape to exit, Space to tag ) | |||||||||||||||||||||||||||||||||||||||||||||||||||| [Goto] [Prev] [Show] [Tag] [Untag] [Okay]

Nie trzeba nawigować w menu, jeśli nazwa pliku do przesłania jest znana. Nazwy plików można wpisać poprzez wybranie polecenia Okay bez zaznaczania żadnych plików. Spowoduje to wyświetlenie następującego menu: ------------------------------------|No file selected - enter filename: | |> | -------------------------------------

522

|

Rozdział 17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli przez port szeregowy

Aby zakończyć działanie programu rz na serwerze, należy wcisnąć klawisze Ctrl-X. Czasami trzeba podjąć kilka takich prób.

Dyskusja Pliki są przesyłane do bieżącego katalogu roboczego na serwerze, trzeba się zatem upewnić, że jesteśmy w katalogu, do którego mają być przesłane pliki.

Patrz także • man 1 rz • man 1 minicom

17.10. Wgrywanie plików na serwer

|

523

524

|

Rozdział 17. Administrowanie serwerem linuksowym z wykorzystaniem konsoli przez port szeregowy

ROZDZIAŁ 18.

Uruchomienie linuksowego serwera Dial-Up

18.0. Wprowadzenie W dzisiejszych czasach sieci wdzwaniane mogą wydawać się dziwaczne. Ciągle jednak mają swoje miejsce. W wielu miejscach na świecie w dalszym ciągu nie ma dostępu do łączy szerokopasmowych za rozsądną cenę. Serwery Dial-Up to niedrogi sposób uzyskania dostępu do funkcji zdalnej administracji oraz do szybkiego skonfigurowania taniej sieci WAN. Można również współdzielić wdzwaniane konto internetowe. Pomimo że brzmi to jak receptura na frustrację, czasami takie rozwiązania się sprawdzają. Na przykład takie rozwiązanie może się okazać wystarczające dla dwóch, trzech osób, które niezbyt często korzystają z internetu. W celu stworzenia serwera Dial-Up należy skorzystać z dobrej jakości modemu sprzętowego — najlepiej od producenta, który obsługuje system Linux. Marnowanie czasu na próby instalacji na serwerze sterowników tanich modemów to gra niewarta świeczki.

18.1. Konfiguracja pojedynczego konta Dial-Up za pomocą programu WvDial Problem Chcemy skonfigurować wdzwaniane konto internetowe na komputerze z systemem Linux, ale nie wiemy, z jakiego dialera lub narzędzia konfiguracji należy skorzystać. Mogło też się zdarzyć, że słyszeliśmy o KPPP i Gnome-PPP, które są dobrymi narzędziami, ale KPPP wymaga bibliotek KDE, Gnome-PPP wymaga bibliotek Gnome, a obydwa wymagają X Window. Nie chcemy pobierania całego związanego z nimi bagażu. Interesuje nas prosty, samodzielny dialer lub chcemy skorzystać z dialera działającego w wierszu poleceń.

525

Rozwiązanie Program WvDial działa z wiersza poleceń, w dowolnej dystrybucji Linuksa. Oto czynności wymagane do skonfigurowania pojedynczego konta: • upewnij się, czy w systemie zainstalowano program WvDial oraz demona pppd (protokół

punkt-punkt); • przygotuj informacje potrzebne do zalogowania się na konto internetowe.

Następnie należy się upewnić, czy plik /etc/ppp/options zawiera podstawowy zbiór opcji. Można skopiować poniższy przykład: asyncmap 0 crtscts lock hide-password modem proxyarp lcp-echo-interval 30 lcp-echo-failure 4 noipx

Po zalogowaniu się jako użytkownik root uruchamiamy skrypt konfiguracyjny programu WvDial, podając nazwę pliku konfiguracyjnego, tak jak pokazano poniżej: # wvdialconf /etc/wvdial.conf Scanning your serial ports for a modem. ttyS0: ATQ0 V1 E1 -- OK ttyS0: ATQ0 V1 E1 Z -- OK ttyS0: ATQ0 V1 E1 S0=0 -- OK [...] Found a modem on /dev/ttyS0. Modem configuration written to /etc/wvdial.conf. ttyS0: Speed 115200; init "ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0"

Wykonanie tego polecenia powoduje zapisanie domyślnych ustawień modemu do pliku /etc/ wvdial.conf. Należy teraz otworzyć plik /etc/wvdial.conf i wprowadzić w nim dane logowania, wykorzystując własny numer Dial-Up, nazwę logowania i hasło: [Dialer Defaults] Modem = /dev/ttyS0 Baud = 115200 Init1 = ATZ Init2 = ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 ISDN = 0 Modem Type = Analog Modem Phone = 123-4567 Username = krzak Password = haslo

Zapisujemy zmiany i próbujemy dzwonić do serwera poprzez uruchomienie polecenia wvdial: # wvdial --> WvDial: Internet dialer version 1.54.0 --> Initializing modem. --> Sending: ATZ ATZ OK --> Sending: ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0 ATQ0 V1 E1 S0=0 &C1 &D2 +FCLASS=0

526

|

Rozdział 18. Uruchomienie linuksowego serwera Dial-Up

OK --> Modem initialized. --> Sending: ATDT9322744 --> Waiting for carrier. ATDT9322744 CONNECT 115200 --> Carrier detected. Starting PPP immediately. --> Starting pppd at Thu March 13 13:54:09 2007 --> pid of pppd: 7754 --> Using interface ppp0 --> local IP address 68.169.174.170 --> remote IP address 68.169.174.12 --> primary DNS address 68.169.174.2 --> secondary DNS address 68.169.174.3

Testujemy połączenie poprzez próbę surfowania po stronach WWW lub wysyłanie sygnałów ping do znanych hostów: $ ping -C2 yahoo.com PING yahoo.com (216.109.112.135) 56(84) bytes of data. 64 bytes from w2.rc.vip.dcn.yahoo.com (216.109.112.135): icmp_seq=1 ttl=50 time=133 ms 64 bytes from w2.rc.vip.dcn.yahoo.com (216.109.112.135): icmp_seq=2 ttl=50 time=138 ms

To wszystko. Jesteśmy gotowi do surfowania w internecie z pełną szybkością sieci Dial-Up.

Dyskusja Opcja S0=0 informuje modem, aby natychmiast odpowiadał na wywołanie telefoniczne, należy zatem ją usunąć, jeśli nie chcemy zezwolić na dostęp wdzwaniany. Można również zmienić tę wartość na 1, 2, 3 lub 4, tak aby serwer odpowiadał po pierwszym, drugim i kolejnych dzwonkach. W konfiguracji lepiej wykorzystywać urządzenie /dev/ttyS* niż /dev/modem. W niektórych dystrybucjach Linuksa /dev/modem jest dowiązaniem symbolicznym do urządzenia modemu, ale nie zawsze tak jest. O wiele bezpieczniejsze jest jawne podanie nazwy urządzenia. Nowoczesne modemy są wyposażone w doskonałe funkcje automatycznej negocjacji szybkości połączenia. 115 200 jest bezpieczną wartością domyślną. W przypadku problemów z nawiązaniem połączenia można spróbować wolniejszych szybkości: 9 600 bps; 19 200 bps; 38 400 bps; 57 600 bps. Informacje o domyślnych opcjach konfiguracji można znaleźć na stronie man wvdial.conf.

Patrz także • man 1 wvdial • man 5 wvdial.conf • WvDial: http://open.nit.ca/wiki/?page=WvDial

18.1. Konfiguracja pojedynczego konta Dial-Up za pomocą programu WvDial

|

527

18.2. Konfiguracja wielu kont w programie WvDial Problem Mamy kilka kont Dial-Up. W jaki sposób skonfigurować program WvDial, aby je obsłużył?

Rozwiązanie Należy dodać sekcje do pliku /etc/wvdial.conf. W pokazanym przykładzie plik ten został podzielony na sekcję zawierającą domyślne ustawienia globalne oraz trzy różne konta Dial-Up: [Dialer Defaults] Modem = /dev/ttyS3 Baud = 115200 Init1 = ATZ Init2 = ATQ0 V1 E1 &C1 &D2 +FCLASS=0 ISDN = 0 Modem Type = Analog Modem Dial Attempts = 10 [Dialer ISP1] Stupid Mode = on Phone = 1234567 Username = krzak Password = sekretfoo Idle Seconds = 600 [Dialer ISP2] Phone = 2345678 Username = [email protected] Ask Password = yes Idle Seconds = 200 [Dialer ISP2] Stupid Mode = on Phone = 3456789 Username = [email protected] Password = sekretfreda

Po stworzeniu pliku konfiguracyjnego można nawiązać połączenie ze wskazanym kontem poprzez podanie nazwy sekcji Dialer: # wvdial ISP2

Dyskusja Innym sposobem na skonfigurowanie wielu kont jest umieszczenie każdego konta w oddzielnym pliku konfiguracyjnym, a następnie wywołanie pliku za pomocą opcji --config: # wvdial --config /etc/wvdial-isp2

W ten sposób uzyskujemy możliwość skonfigurowania różnych konfiguracji dla różnych użytkowników. Należy jedynie pamiętać, aby nadać im uprawnienia do czytania pliku. Nieuprzywilejowani użytkownicy mogą mieć osobiste konfiguracje WvDial, o ile mają uprawnienia do odpowiednich plików. Sposób realizacji takiej konfiguracji opisano w następnej recepturze.

528

|

Rozdział 18. Uruchomienie linuksowego serwera Dial-Up

Patrz także • man 1 wvdial • man 5 wvdial.conf • WvDial: http://open.nit.ca/wiki/?page=WvDial

18.3. Konfiguracja uprawnień Dial-Up dla nieuprzywilejowanych użytkowników Problem Chcemy, aby użytkownicy mieli możliwość korzystania z usług Dial-Up, jednak do tej pory w niniejszym rozdziale z takich uprawnień może korzystać tylko użytkownik root. W jaki sposób udostępnić usługi Dial-Up dla nieuprzywilejowanych użytkowników?

Rozwiązanie Wymaga to dostosowania uprawnień dla kilku plików: /etc/ppp/chap-secrets /etc/ppp/pap-secrets /dev/ttyS* /usr/sbin/pppd /var/lock W niektórych dystrybucjach Linuksa występuje grupa dialout dla użytkowników uprawnionych do korzystania z usług Dial-Up. W innych są grupy dip lub uucp. Dla plików /etc/ppp/ chap-secrets, /etc/ppp/pap-secrets oraz /dev/ttyS* należy ustawić własność dla grupy dialout (albo dip lub uucp — nie ma to znaczenia, o ile wszyscy użytkownicy, którzy mają być uprawnieni, należą do tej samej grupy): # chown root:dialout /dev/ttyS3 /etc/ppp/chap-secrets \ /etc/ppp/pap-secrets

Następnie należy przypisać uprawnionych użytkowników do grupy, do której należą pliki wymienione powyżej: dialout:x:20:krzak,foobear,fredfoo

Należy zadbać o to, aby uprawnienia do zapisu i odczytu plików /etc/ppp/chap-secrets i /etc/ppp/ pap-secrets mieli tylko właściciel oraz użytkownicy należący do grupy: # chmod 0660 /etc/ppp/chap-secrets /etc/ppp/pap-secrets

Następnie należy sprawdzić katalog /var/lock. Katalog ten powinien być „szeroko otwarty na świat”. Powinien mieć również ustawiony tzw. bit lepkości (ang. sticky bit): $ ls -ld /var/lock drwxrwxrwt 3 root root 4096 14. Okt 07:37 /var/lock

Jeśli tak nie jest, należy ustawić odpowiedni tryb: # chmod 1777 /var/lock

18.3. Konfiguracja uprawnień Dial-Up dla nieuprzywilejowanych użytkowników

|

529

Bit lepkości powinien być również ustawiony dla demona pppd, tak jak pokazano poniżej: $ ls -l /usr/sbin/pppd -rwsr-xr--1 root dip 232536 Dec 30 2004 /usr/sbin/pppd

Jeśli tak nie jest, należy ustawić odpowiedni tryb: # chmod 4754 /usr/sbin/pppd

Dyskusja Jeśli właścicielem grupowym dowolnego pliku jest root, nie należy dodawać użytkowników do grupy root! Należy zmienić właściciela grupowego na dialout (lub inną wybraną grupę). W plikach dzienników pojawiają się ostrzeżenia; „Warning — secret file /etc/ppp/ pap-secrets has world and/or group access1”. Nie należy się nimi przejmować — trzeba się tylko upewnić, że do odczytu wymienionych plików nie mają prawa wszyscy użytkownicy, oraz należy zachować ostrożność podczas dodawania użytkowników do grupy dialout. Litera s w ciągu uprawnień -rwsr-xr-- informuje, że dla pliku /usr/sbin/pppd ustawiono tryb suid root. Oznacza to, że zwykli użytkownicy uruchamiają demona pppd z niezbędnymi uprawnieniami użytkownika root, jakie są potrzebne do działania tego demona. Jeśli podczas korzystania z konta nieuprzywilejowanego użytkownika wyświetli się komunikat o błędzie: „Cannot open device /dev/ttyS0-Device or resource busy2”, to najprawdopodobniej nie ustawiono trybu suid root dla pliku /usr/sbin/pppd lub dla pliku /var/lock ustawiono nieprawidłowe uprawnienia. Ustawienie trybu suid otwiera potencjalną lukę w zabezpieczeniach, dlatego nie należy go stosować bez ograniczeń. Przedstawiony przypadek jest jednym z nielicznych, kiedy wykorzystanie tego trybu jest uzasadnione.

Patrz także • więcej informacji na temat zarządzania uprawnieniami do plików oraz użytkownikami

i grupami można znaleźć w rozdziałach 8. i 9. książki Carli Schroder Linux. Receptury (Helion, 2005) • man 1 wvdial • man 5 wvdial.conf • man 8 pppd • WvDial: http://open.nit.ca/wiki/?page=WvDial

18.4. Tworzenie kont WvDial dla użytkowników innych niż root Problem Chcemy, aby użytkownicy mieli własne, prywatne konta Dial-Up z plikami konfiguracyjnymi zapisanymi w katalogach domowych. 1

Uwaga! Do pliku haseł /etc/ppp/ pap-secrets mają dostęp członkowie grupy i/lub wszyscy — przyp. tłum.

2

Nie można otworzyć urządzenia /dev/ttyS0 lub urządzenie zajęte — przyp. tłum.

530

|

Rozdział 18. Uruchomienie linuksowego serwera Dial-Up

Rozwiązanie Najpierw należy sprawdzić, czy skonfigurowano wszystkie niezbędne uprawnienia i ustawienia własności grupowej zgodnie ze wskazówkami zamieszczonymi w recepturze 18.3. Następnie należy przeprowadzić konfigurację dla poszczególnych użytkowników, tak jak w pierwszych dwóch recepturach w tym rozdziale. Różnica polega na tym, że pliki konfiguracyjne będą zapisane w katalogach domowych użytkowników. Logujemy się na koncie użytkownika i tworzymy nowy plik konfiguracyjny. Za pomocą opcji --config wskazujemy lokalizację osobistego pliku konfiguracyjnego użytkownika: $ wvdialconf --config ~/.wvdialrc

Plik może mieć dowolną nazwę. Jeśli nadamy mu nazwę .wvdialrc, stworzymy konfigurację domyślną. W takim przypadku plik konfiguracyjny będzie wykorzystany, jeśli posłużymy się poleceniem wvdial bez żadnych opcji. Dodatkowe konta tworzy się za pomocą sekcji Dialer. Wywołuje się je w sposób opisany w poprzednich recepturach: $ wvdial ISP2

Jeśli plik ma inną nazwę, w celu jego wywołania trzeba skorzystać z opcji --config: $ wvdial --config ~/dialup

Jeśli w pliku jest kilka sekcji Dialer, można je wywoływać w następujący sposób: $ wvdialconf --config ~/dialup ISP1

Dyskusja Niektórzy użytkownicy zamiast uruchamiania polecenia powłoki wolą mieć ikonę na pulpicie, którą wystarczy kliknąć, aby uruchomić odpowiedni program. Tworzenie ikon nie jest trudne. Dokładnych informacji należy szukać w dokumentacji wybranego środowiska graficznego, ponieważ poszczególne środowiska trochę różnią się pomiędzy sobą. W przypadku prostych indywidualnych kont Dial-Up dobrze sprawdzają się takie narzędzia graficzne, jak KPPP oraz Gnome-PPP. Często jednak trzeba ręcznie modyfikować pliki /etc/ ppp/options lub inne pliki konfiguracyjne protokołu ppp. Często spotykaną modyfikacją jest zamiana opcji auth w pliku /etc/ppp/options na opcję noauth. Opcji tej nie musi być w ogóle, ponieważ prawie żaden z komercyjnych dostawców internetu nie wymaga uwierzytelniania dwukierunkowego two-way. Na szczęście w większości współczesnych dystrybucji Linuksa opcja noauth jest domyślna.

Patrz także • man 1 wvdial • man 5 wvdial.conf • man 8 pppd • WvDial: http://open.nit.ca/wiki/?page=WvDial

18.4. Tworzenie kont WvDial dla użytkowników innych niż root

|

531

18.5. Współdzielenie konta internetowego Dial-Up Problem Mamy pewną liczbę użytkowników, którzy są zmuszeni do współdzielenia jednego konta internetowego. Być może jest to jedyne rozwiązanie, na które możemy sobie pozwolić, lub nasze potrzeby są tak minimalne, że połączenie szerokopasmowe nie jest konieczne. Może to być również diabelsko sprytna metoda zniechęcenia użytkowników do surfowania w sieci. Po stronie klienckiej mogą być różne platformy — Linux, Mac, Windows. Sieć LAN jest skonfigurowana i działa. Chcemy wykorzystać stary sprzęt PC w roli internetowej bramy.

Rozwiązanie Do roli internetowej bramy można wykorzystać stary komputer PC. Konfigurujemy konto Dial-Up na tym komputerze, a następnie konfigurujemy maskaradę IP w celu skierowania wszystkich pakietów internetowych do hostów w sieci LAN. Potrzebne będą następujące elementy: • modem podłączony do serwera Dial-Up; • program do konfigurowania sieci Dial-Up na serwerze — na przykład WvDial, KPPP lub

Gnome-PPP. Najpierw należy podłączyć modem do linii telefonicznej i skonfigurować konto Dial-Up. Na razie nie podłączamy bramy internetowej do sieci LAN. Konfigurujemy konto lub konta Dial-Up. Następnie z wiersza poleceń uruchamiamy następujące reguły iptables: # modprobe iptable_nat # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE # echo "1" > /proc/sys/net/ipv4/ip_forward

Teraz, kiedy komputer odgrywający rolę bramy jest podłączony do sieci LAN, wszyscy użytkownicy mogą współdzielić połączenie. Jest to konfiguracja bez żadnych zabezpieczeń, która nie przetrwa ponownego uruchomienia komputera. W związku z tym należy dodać powyższe reguły do odpowiedniego skryptu zapory firewall iptables. Informacje o tym, w jaki sposób można stworzyć zaporę firewall, można znaleźć w rozdziale 3.

Dyskusja Jest to doskonały moment, żeby wykopać spod sterty kurzu w szafie stary komputer AMD 586 i wykorzystać go w pożytecznym celu. Nie należy do tego celu wykorzystywać komputera jednego z użytkowników, ponieważ może to doprowadzić do frustracji i narzekań. Nie mamy kontroli nad tym, co użytkownik z nim robi w danym momencie, oraz musimy zadbać, aby komputer pełniący funkcję bramy internetowej był przez cały czas włączony. Jednym z powodów tego, że serwery są bardziej niezawodne od biurkowych komputerów PC, jest to, że od serwerów nie wymaga się wykonywania tak wielu zadań — w związku z tym uzyskuje się również lepszą wydajność. Istnieje wiele specjalizowanych minidystrybucji Linuksa przeznaczonych do pełnienia funkcji zapór firewall i internetowych bram. Oto lista kilku z tego typu dystrybucji obsługujących sieci Dial-Up do wypróbowania: 532

|

Rozdział 18. Uruchomienie linuksowego serwera Dial-Up

• IPCop (http://www.ipcop.org/); • FreeSCO (http://www.freesco.org/); • Shorewall (http://www.shorewall.net/).

Patrz także • man 8 iptables • książka Michaela D. Bauera Building Secure Servers with Linux (O’Reilly, 2002)

18.6. Konfiguracja własności dzwonienia na żądanie Problem Nie chcemy przez cały czas opiekować się współdzielonym połączeniem Dial-Up ani też pozostawiać go włączonego przez cały czas. Chcemy, aby połączenie było nawiązywane na żądanie — na przykład, kiedy użytkownik uruchomi przeglądarkę WWW lub spróbuje sprawdzić pocztę. Po pewnym czasie braku aktywności użytkownik powinien zostać rozłączony.

Rozwiązanie Najpierw należy skonfigurować program WvDial i protokół ppp zgodnie ze wskazówkami zawartymi w poprzednich recepturach. Następnie należy utworzyć plik /etc/ppp/peers/demand o treści zaprezentowanej poniżej. Należy podać nazwę własnej sekcji Dialer, portu modemu oraz nazwę logowania użytkownika: noauth name wvdial usepeerdns connect "/usr/bin/wvdial --chat ISP1" /dev/ttyS2 115200 modem crtscts defaultroute noipdefault user [email protected] idle 300 persist demand logfd 6

Możemy teraz uruchomić nasz serwer dzwonienia na żądanie za pomocą polecenia pon, podając nazwę pliku konfiguracyjnego, który utworzyliśmy przed chwilą: # pon demand

Serwer nie wybierze numeru od razu, ale poczeka, aż użytkownik zainicjuje łącze, próbując nawiązać połączenie z internetem. Aby przetestować działanie serwera, można wysłać polecenie ping do serwisów internetowych, otworzyć przeglądarkę WWW lub spróbować sprawdzić pocztę. Aby skontrolować, czy demon pppd się uruchomił, można skorzystać z polecenia ps:

18.6. Konfiguracja własności dzwonienia na żądanie

|

533

$ ps ax | grep pppd 6506 ? Ss

0:00 /usr/sbin/pppd call demand

Łącze można zamknąć za pomocą polecenia poff: # poff

Dyskusja Plikowi /etc/ppp/peers/demand można nadać dowolną nazwę. Nazwa polecenia pon pochodzi od pppd on (włącz pppd), z kolei poff pochodzi od pppd off (wyłącz pppd). Opcja demand przygotowuje łącze pppd. Najpierw konfiguruje interfejs (ppp0), a następnie, w przypadku braku połączenia, zatrzymuje go. Kiedy zacznie się transmisja pakietów, na przykład w czasie sprawdzania poczty, demon pppd wybiera numer i nawiązuje połączenie. Opcja persist utrzymuje otwarte łącze nawet wtedy, gdy pakiety nie są już przesyłane w łączu. Opcja idle300 oznacza, że połączenie zostanie zamknięte po 300 sekundach braku aktywności. Opcję tę można ustawić na dowolną wartość lub, w celu zapewnienia maksymalnej dostępności, całkowicie z niej zrezygnować. Wszystkie te działania można wykonać wyłącznie za pomocą polecenia ppp — bez wykorzystania programu WvDial. Osobiście jestem zwolenniczką programu WvDial, ponieważ jest on łatwy w użyciu. Program WvDial działa zgodnie z założeniem, że większość modemów obsługuje zestaw poleceń Hayes AT. Program ppp tworzono w czasach, kiedy polecenia modemowe nie były standardem, zatem jego struktura i konfiguracja są bardziej złożone.

Patrz także • man 1 wvdial • man 5 wvdial.conf • man 8 pppd • WvDial: http://open.nit.ca/wiki/?page=WvDial

18.7. Planowanie dostępności serwera Dial-Up za pomocą mechanizmu cron Problem Chcemy zablokować możliwość nawiązywania połączeń Dial-Up w ciągu nocy oraz w weekendy, ponieważ nikt nie będzie z nich korzystał. Pasmo modemowe nie jest dostępne za darmo, dlatego nie chcemy, aby przypadkiem było pozostawione w stanie aktywnym przez długi czas tylko dlatego, że ktoś pozostawił otwartą sesję IRC lub uruchomionego klienta pocztowego.

534 |

Rozdział 18. Uruchomienie linuksowego serwera Dial-Up

Rozwiązanie Wystarczy zdefiniować proste zadanie cron. Jeśli korzystamy z własności nawiązywania połączeń wdzwanianych na żądanie, należy — będąc zalogowanym na koncie użytkownika root — utworzyć plik crontab, wykorzystując nazwę własnego pliku /etc/ppp/peers/[foo]: # crontab -e 00 6 * * 1-5 /usr/bin/pon demand 00 20 * * 1-5 /usr/bin/poff

Zapisujemy plik bez zmieniania jego nazwy, a następnie kończymy pracę edytora. Poniższy przykład ukazuje, jak zainicjować serwer dzwonienia na żądanie każdego ranka o 6.00 i zamykać go każdego wieczoru o 20.00. Nowe reguły można zweryfikować za pomocą przełącznika -l (lista): # crontab -l 00 6 * * 1-5 /usr/bin/pon nazwa_pliku 00 20 * * 1-5 /usr/bin/poff

Dyskusja Pliki crontab są specyficzne dla użytkowników, zatem aby stworzyć zadanie cron na poziomie systemu, należy to zrobić, będąc zalogowanym na koncie użytkownika root. Plik crontab otwiera domyślny edytor zgodnie z tym, co określono w pliku ~/.bashrc. Można w tym celu wykorzystać dowolny edytor. W przykładzie pokazanym w punkcie „Rozwiązanie” plik crontab otworzy edytor Vim. Oto postać wpisu w pliku ~/.bashrc, który definiuje domyślny edytor: EDITOR=vim VISUAL=$EDITOR export EDITOR VISUAL

Polecenie crontab -e oznacza „edytuj plik crontab bieżącego użytkownika”. Oto objaśnienie poszczególnych pól w pliku crontab: pole -----minuta godzina dzień miesiąca miesiąc dzień tygodnia

dozwolone wartości -------------0-59 0-23 1-31 1-12 (można też używać nazw) 0-7 (0 lub 7 oznacza niedzielę; można również używać nazw)

W przypadku gdy zastosowaliśmy konfigurację taką jak w pierwszych dwóch recepturach w niniejszym rozdziale i nie używamy serwera dzwonienia na żądanie, możemy skorzystać z poleceń programu WvDial: # crontab -e 00 6 * * 1-5 /usr/bin/wvdial nazwa_pliku 00 20 * * 1-5 kill 'pidof wvdial'

W tej konfiguracji program WvDial uruchomi się o 6.00 i zakończy działanie o 20.00.

Patrz także • man 5 crontab • w recepturze 6.15 „Ustawienie domyślnego edytora” z książki Carli Schroder Linux. Re-

ceptury (Helion, 2005) można się zapoznać z dodatkowymi informacjami na temat dostosowania do własnych potrzeb edytora wykorzystywanego przez mechanizm crontab 18.7. Planowanie dostępności serwera Dial-Up za pomocą mechanizmu cron

|

535

18.8. Wybieranie numeru w warunkach sygnalizacji obecności wiadomości w poczcie głosowej Problem Kiedy w poczcie głosowej jest wiadomość, sygnał zmienia się na przerywany. Modem interpretuje to jako brak sygnału dzwonienia i nie wybiera numeru.

Rozwiązanie Należy dodać lub zmodyfikować poniższy wiersz w pliku /etc/wvdial.conf: Abort on No Dialtone = no

Włączenie tej opcji powoduje, że program WvDial będzie próbował wybierać numer niezależnie od sytuacji — bez sprawdzania sygnału dzwonienia.

Dyskusja Miejmy nadzieję, że nie znajdujemy się w środowisku, w którym kable telefoniczne są notorycznie rozłączane. W takim przypadku użycie powyższej opcji mogłoby być pewnym problemem. W celu zapewnienia kontroli możemy włączyć głośnik modemu, tak aby wybieranie mogło być słyszalne. W tym celu należy wprowadzić poniższe ustawienia w wierszu z opcją Init2 w pliku /etc/wvdial.conf: M1 L3

Opcja M1 włącza głośnik modemu tylko na czas wybierania numeru i uzgadniania. Opcja L1 odpowiada najniższej głośności. Wartości L2, L3 i L4 są progresywnie głośniejsze.

Patrz także • man 1 wvdial • man 5 wvdial.conf • man 8 pppd • WvDial: http://open.nit.ca/wiki/?page=WvDial

18.9. Przesłanianie opcji połączenie oczekujące Problem Nasza linia telefoniczna obsługuje funkcję połączenia oczekującego. W związku z tym za każdym razem, kiedy przychodzi połączenie, gdy jesteśmy online, transmisja jest zakłócana — następuje rozłączenie, dochodzi do zakłócenia w pobieraniu plików lub przerwania pobierania.

Rozwiązanie Należy wyłączyć funkcję połączeń oczekujących w pliku /etc/wvdial.conf. Poniższa opcja globalnie blokuje funkcję połączenia oczekującego: 536

|

Rozdział 18. Uruchomienie linuksowego serwera Dial-Up

Dial Prefix = *70,

Z kolei takie ustawienie blokuje tę funkcję dla podanego numeru telefonu: Phone = *70,1234567

Jeśli jest taka potrzeba, to w ustawieniu można wprowadzić dodatkowy przecinek lub kilka przecinków, aby zyskać więcej czasu przed wybraniem numeru.

Dyskusja Standard modemowy V.92 umożliwia zastosowanie więcej opcji niż tylko zablokowanie połączeń oczekujących: można ignorować, rozłączać lub zawieszać połączenie internetowe w celu wykonania połączenia. Skorzystanie z ostatniej opcji wymaga korzystania z usług takiego dostawcy internetu, który obsługuje taką opcję. Aby można było korzystać ze wspomnianych funkcji, trzeba mieć modem, który umożliwia ich wykorzystanie.

Patrz także • man 1 wvdial • man 5 wvdial.conf • man 8 pppd • WvDial: http://open.nit.ca/wiki/?page=WvDial

18.10. Ustawienia hasła poza plikiem konfiguracyjnym Problem Nie chcemy, aby hasło do konta Dial-Up było pozostawione w pliku konfiguracyjnym programu WvDial, ponieważ jest ono zapisane zwykłym tekstem.

Rozwiązanie Należy dodać opcję AskPassword = yes w pliku konfiguracyjnym programu WvDial w następujący sposób: [Dialer Defaults] Modem = /dev/ttyS3 Baud = 115200 Init1 = ATZ Init2 = ATQ0 V1 E1 &C1 &D2 +FCLASS=0 ISDN = 0 Modem Type = Analog Modem Dial Attempts = 10 [Dialer ISP1] Stupid Mode = on Phone = 1234567 Username = krzak Ask Password = yes Idle Seconds = 600

Po wprowadzeniu tej opcji system wyświetli pytanie o hasło podczas logowania. 18.10. Ustawienia hasła poza plikiem konfiguracyjnym

|

537

Dyskusja Prezentowane ustawienie nie nadaje się do wykorzystania dla serwera Dial-Up, chyba że podoba nam się perspektywa pędzenia do serwera i podawania hasła za każdym razem, kiedy chcemy nawiązać połączenie. Jest to jakieś zabezpieczenie dla tych użytkowników, którzy nie mają kontroli nad tym, kto używa ich komputerów.

Patrz także • man 1 wvdial • man 5 wvdial.conf • man 8 pppd • WvDial: http://open.nit.ca/wiki/?page=WvDial

18.11. Tworzenie osobnego pliku dziennika pppd Problem Wszystkie komunikaty pppd są zrzucane do pliku /var/log/messages. Tworzy się przez to bałagan. Wolelibyśmy, aby komunikaty te trafiały raczej do osobnego pliku.

Rozwiązanie Należy utworzyć plik dziennika: # touch /var/log/ppp

Następnie ustawiamy opcję logfile w pliku /etc/ppp/options: logfile /var/log/ppp

Usuwamy wszystkie odwołania do opcji logfd, ponieważ te dwie opcje wzajemnie się wykluczają.

Dyskusja Nie ma żadnych ukrytych wad wykorzystania osobnych plików dzienników dla usług. Dzięki temu o wiele łatwiej można się zorientować, co się dzieje w systemie. Personalizacja standardowego mechanizmu syslog systemu Linux jest nieco trudniejsza, niż powinna być; informacje o sposobie stworzenia rozbudowanego i łatwo modyfikowalnego mechanizmu logowania za pomocą polecenia syslog-ng można znaleźć w rozdziale 19.

Patrz także • man 8 pppd

538

|

Rozdział 18. Uruchomienie linuksowego serwera Dial-Up

ROZDZIAŁ 19.

Rozwiązywanie problemów z siecią

19.0. Wprowadzenie Linux dostarcza wielu narzędzi programowych służących do rozwiązywania problemów z sieciami. W tym rozdziale omówiono wiele doskonałych narzędzi linuksowych umożliwiających wyszukiwanie problemów oraz obserwację tego, co dzieje się w sieci. Narzędzia te są zaprojektowane tak, aby działały szybko i były łatwe w posługiwaniu się, nie zaś po to, by zapewniały szczegółowe własności monitorowania. Informacje o tym, jak można skonfigurować własności monitorowania i ostrzegania, można znaleźć w rozdziałach 13. i 14. poświęconym systemom Nagios i MRTG. Narzędziami, za pomocą których można wykonać lwią część pracy, są polecenia ping i tcpdump oraz program Wireshark i polecenie ngrep. O ile ping jest ciągle podstawowym narzędziem do sprawdzania łączności, narzędzia tcpdump, Wireshark i ngrep zapewniają różnorodne doskonałe sposoby przechwytywania transmisji oraz obserwacji tego, co dzieje się w łączach sieciowych. Nie można liczyć na to, że aplikacje wygenerują przydatne komunikaty o błędach w przypadku, gdy uruchomienie poleceń zakończy się niepowodzeniem (czasami aplikacje nie generują żadnych komunikatów). Jeśli nie wiemy, czy problem dotyczy sprzętu, czy oprogramowania, należy najpierw skorzystać z tych narzędzi w celu zawężenia możliwości. Problemy programowe są częstsze od sprzętowych, zatem nie należy niszczyć testerów sprzętowych, jeśli wcześniej nie wyeliminujemy problemów z oprogramowaniem. Oczywiście nigdy nie zaszkodzi wykluczenie oczywistych przyczyn, takich jak rozłączone kable lub wyłączone zasilanie. Warto poćwiczyć posługiwanie się narzędziami opisanymi w niniejszym rozdziale tak często, jak się da, na sprawnych systemach. Dzięki temu można się dowiedzieć, jak wygląda sprawny system, oraz zdobyć umiejętności, które przydadzą się w sytuacji, gdy wystąpią problemy. Nie należy zapominać o plikach dzienników. Większość aplikacji zawiera opcję pozwalającą na „podkręcenie” szczegółowości rejestrowania do poziomu debug. Można to wykorzystać w celu zebrania jak najwięcej danych. Następnie nie należy zapominać o przywróceniu właściwego poziomu rejestrowania, tak aby pliki dzienników w rekordowym tempie nie zapełniły dysku.

539

Testowanie i śledzenie okablowania Podczas testowania własnego okablowania można skorzystać z wielu interesujących narzędzi. Przede wszystkim należy się zaopatrzyć w prosty miernik uniwersalny oraz w tester sieci elektrycznej. Są to niedrogie, niewielkie żółte gadżety przypominające wtyczkę z uziemieniem z kolorowymi diodami LED. Wystarczy podłączyć coś takiego do gniazdka elektrycznego, a diody LED powiedzą nam, czy gniazdko jest sprawne, czy nie. Mierniki uniwersalne przydają się do wielu zadań, na przykład do wyszukiwania zwarć i przerw, sprawdzania ciągłości przewodów, tłumienności oraz tego, czy kabel został właściwie zakończony. Doskonale nadają się również do innych zadań — na przykład testowania zasilaczy i płyt głównych. Do testowania zainstalowanych kabli potrzebny jest specjalny tester składający się z dwóch części — każdą z nich podłącza się po innej stronie kabla. Niektóre testery są również wyposażone w generatory sygnału do przedzwaniania kabli. Jeśli sami zarabiamy końcówki w kablach, powinniśmy zainwestować w dobry tester kabli. Śledzenie problemów z okablowaniem zainstalowanym w ścianach oraz ich identyfikowanie wymaga „lisa i psa” — jest to doskonała nazwa dla generatora sygnału i wzmacniacza. Lis podłącza się do kabla i generuje się sygnał, a pies tropi go w celu identyfikacji i testowania kabla. Lis potrafi odczytać sygnał przez izolację kabla, a nawet przez cienką ścianę. Czytelnicy, którzy nie są zainteresowani tym, by samodzielnie stać się ekspertami od okablowania, powinni poszukać profesjonalisty, który ma doświadczenie w dziedzinie okablowania analogowego, cyfrowego i komputerowego. Współcześnie stosowane okablowanie jest bowiem mieszanką wszystkich tych typów. Nawet te osoby, które odgrywają rolę kablowego guru na własny użytek, w dalszym ciągu od czasu do czasu powinny skorzystać z usług elektryka oraz specjalisty w dziedzinie telekomunikacji. Nigdy nie należy próbować wcielać się w rolę domorosłego elektryka — kable, w których płynie prąd, powinni dotykać wyłącznie profesjonaliści.

Części zamienne do testowania Podczas poszukiwań błędów i usterek nie należy zapominać o koncentratorach i przełącznikach. Zwykłe koncentratory i przełączniki są bardzo tanie — warto mieć kilka pod ręką i w przypadku problemów zastąpić podejrzany przełącznik lub koncentrator zamiennikiem. Trzeba również pamiętać o zapasowych kablach ethernet. Wykorzystanie laptopa administratora sieci jako przenośnego urządzenia do testowania to szybki sposób na to, by się przekonać, po której stronie przełącznika występuje problem oraz czy w ogóle dotyczy przełącznika.

19.1. Tworzenie laptopa do diagnozowania sieci i napraw Problem Chcemy skonfigurować stary laptop w roli przenośnej sieciowej stacji diagnostycznej. Jakie oprogramowanie powinniśmy na nim zainstalować?

540 |

Rozdział 19. Rozwiązywanie problemów z siecią

Rozwiązanie Jest to doskonała i niezwykle przydatna rzecz, którą trzeba koniecznie mieć. Nie musi to być supernowoczesny nowiuteńki laptop. Wystarczy dowolny, w miarę nowy laptop, który obsługuje USB 2.0 i system Linux. Laptop powinien być wyposażony w następujące elementy: • dwa przewodowe i jeden bezprzewodowy interfejs Ethernet; • modem; • porty USB 2.0; • port szeregowy; • terminal szeregowy.

W większości współczesnych laptopów nie ma portu szeregowego, zamiast niego zatem można wykorzystać adapter portu szeregowego podłączany przez USB. Innym doskonałym urządzeniem jest adapter PATA/SATA podłączany przez port USB 2.0, który umożliwia naprawę uszkodzonych dysków twardych. Dzięki niemu można podłączyć dyski twarde PATA lub SATA, zarówno 2,5", jak i 3,5", i bezpośrednio skopiować z nich informacje w celu zachowania danych. Do tego celu świetnie nadaje się program na licencji GNU — ddrescue. Jeśli podstawowy dysk twardy nie ma wystarczającej pojemności na to, by pomieścić dane, można podłączyć drugi dysk przez adapter PATA/SATA-USB 2.0 lub skopiować je przez sieć. Dlaczego by nie spróbować kopiowania przez sieć na pierwszym miejscu? Ponieważ uszkodzony dysk może spowodować znaczne spowolnienie sieci i wszystkich działających w niej usług. W laptopie należy zainstalować dowolną dystrybucję Linuksa oraz poniższe aplikacje: OpenSSH Bezpieczna, zdalna administracja. sshfs Bezpieczne montowanie zdalnych systemów plików. telnet Logowanie do serwerów bez zabezpieczeń — przydatne do wykonywania niektórych testów. Nmap Skaner portów i narzędzie do eksplorowania sieci. tcptraceroute; traceroute Wyświetla trasy do innych hostów. tcpdump; Wireshark Sniffery pakietów. Netstat Wyświetla nasłuchujące i podłączone porty. netstat-nat Wyświetla połączenia NAT. ping Wysyła polecenia ICMP ECHO_REQUEST do hostów sieciowych.

19.1. Tworzenie laptopa do diagnozowania sieci i napraw

|

541

fping Wysyła polecenia ICMP ECHO_REQUEST do wielu hostów sieciowych jednocześnie. echoping Sprawdza, czy serwer nasłuchuje. ssmping Testuje połączenia multicast. ngrep Sniffer pakietów, który wykorzystuje własności filtrowania tekstowego oraz z użyciem wyrażeń regularnych zamiast filtrowania hostów, protokołów i flag TCP. etherwake Wysyła pakiety Wake-on-LAN do komputerów, w których włączono obsługę tej własności. iptraf Narzędzie statystyk sieciowych z interfejsem w postaci konsoli. httping Program podobny do polecenia ping dla żądań http. iftop Wyświetla zużycie pasma dla interfejsu. iperf Mierzy wydajność pasma TCP i UDP. host Wyszukuje nazwy hostów lub adresy IP. dig Kieruje zapytania do serwerów nazw. arping Wysyła żądania ARP REQUEST w celu identyfikacji zdublowanych adresów IP oraz w celu upewnienia się, że host jest włączony. GNU ddrescue Doskonały program do kopiowania blokowego podobny do dd, umożliwiający odzyskiwanie danych z uszkodzonych dysków twardych. Autorem GNU ddrescue jest Antonio Diaz. Nie należy mylić tego programu ze starszym narzędziem dd-rescue, którego autorem był Kurt Garloff. Tamten program również był dobrym narzędziem do odzyskiwania danych, ale nowszy program GNU ddrescue jest szybszy i skuteczniejszy. pakiet net-tools; pakiet iproute2 Więcej informacji na temat pakietów net-tools i iproute2 można znaleźć w podrozdziale „Wprowadzenie” do rozdziału 6. Do rozwiązywania problemów z sieciami bezprzewodowymi przydadzą się następujące narzędzia: Kismet Sniffer sieci bezprzewodowych 802.11b. wireless-tools Narzędzia użytkowe do rozszerzeń obsługi sieci bezprzewodowych w Linuksie.

542 |

Rozdział 19. Rozwiązywanie problemów z siecią

madwifi-tools Narzędzie użytkownika dla sterownika sieci bezprzewodowej Atheros. hostapd System uwierzytelniania w sieci bezprzewodowej. aircrack-ng Sprawdzanie i odzyskiwanie haseł WEP/WPA. airsnort Sniffer WLAN. wpasupplicant Negocjacja kluczy z mechanizmem uwierzytelniania WEP/WPA. Bez wątpienia istnieją również inne niezbędne narzędzia. Wystarczy je wgrać do laptopa i wykorzystać do pracy.

Dyskusja Nie należy zapominać o tym, aby zwrócić szczególną uwagę na zabezpieczenia. Trzeba pamiętać, aby wszystkie pakiety były zaktualizowane. Należy zwrócić szczególną uwagę na uaktualnienia zabezpieczeń oraz reguły kontroli dostępu. Zawsze można uruchomić zaporę firewall, ale często przeszkadza to w diagnozowaniu sieci, zatem najlepszą strategią jest skonfigurowanie laptopa w taki sposób, aby zawsze działał bez zapory firewall. W laptopie raczej nie będzie potrzeby uruchamiania żadnych usług, z wyjątkiem sshd, zatem wykorzystanie zapory firewall nie jest bezwzględnie konieczne.

Patrz także • rozdział 4. • rozdział 7. • rozdział 17.

19.2. Testowanie połączeń za pomocą polecenia ping Problem Pewne usługi lub hosty w sieci nie są dostępne lub uległy awariom. Nie wiemy, czy źródłem problemu jest połączenie fizyczne, usługi nazw, ustawienia routingu, czy też jego przyczyna jest zupełnie inna. Od czego należy zacząć?

Rozwiązanie Pierwszym środkiem diagnostycznym, z jakiego powinniśmy skorzystać, jest stare, dobre polecenie ping. Należy wykorzystać przełącznik -c w celu ograniczenia liczby sygnałów ping. W przeciwnym razie polecenie będzie działało tak długo, aż je zatrzymamy za pomocą klawiszy Ctrl+C:

19.2. Testowanie połączeń za pomocą polecenia ping

| 543

$ ping localhost PING xena.krzakc.net (127.0.1.1) 56(84) bytes of data. 64 bytes from xena.krzak.net (127.0.1.1): icmp_seq=1 ttl=64 time=0.034 ms 64 bytes from xena.krzak.net (127.0.1.1): icmp_seq=2 ttl=64 time=0.037 ms --- xena.krzak.net ping statistics --2 packets transmitted, 2 received, 0% packet loss, time 999ms rtt min/avg/max/mdev = 0.034/0.035/0.037/0.006 ms

Wysyłanie sygnału ping do hosta localhost przede wszystkim potwierdza, że interfejs jest włączony i działa. Można również wysyłać sygnały ping, podając nazwę hosta i adres IP, aby dodatkowo potwierdzić, że lokalna sieć działa prawidłowo. Następnie można przetestować inne hosty: $ ping -c10 uberpc PING uberpc.krzak.net (192.168.1.76) 56(84) bytes of data. 64 bytes from uberpc.krzak.net (192.168.1.76): icmp_seq=1 ttl=64 time=5.49 ms [...] --- uberpc.krzak.net ping statistics --10 packets transmitted, 10 received, 0% packet loss, time 9031ms rtt min/avg/max/mdev = 0.097/0.108/0.124/0.007 ms

Wynik tego prostego polecenia dostarcza nam wiele przydatnych informacji, łącznie z potwierdzeniem, że działa mechanizm rozwiązywania nazw oraz że połączenie jest dobre i działa bez zakłóceń. Oto przykład wyniku, który jest sygnałem problemu: $ ping -c10 uberpc ping: unknown host uberpc

Oznacza to, że wprowadziliśmy nieprawidłową nazwę hosta, DNS nie działa, nastąpiła awaria routingu lub zdalny host nie jest podłączony do sieci. Następny krok polega na wysłaniu sygnału ping z podaniem adresu IP: $ ping -c10 192.168.1.76 PING 192.168.1.76 (192.168.1.76) 56(84) bytes of data. From 192.168.1.10 icmp_seq=1 Destination Host Unreachable [...] From 192.168.1.10 icmp_seq=10 Destination Host Unreachable --- 192.168.1.76 ping statistics --10 packets transmitted, 0 received, +9 errors, 100% packet loss, time 9011ms , pipe 3

Z uzyskanego wyniku można wywnioskować, że wprowadziliśmy nieprawidłowy adres IP lub host nie działa, ale w sieci hosta udało się dotrzeć do routera. Wiemy to na podstawie komunikatu Destination Host Unreachable1 wysłanego przez router. Gdyby wysłanie sygnału ping z wykorzystaniem adresu IP powiodło się, oznaczałoby to problemy z DNS. Oto wynik działania polecenia w przypadku, gdy komputer PC nie jest podłączony do sieci: $ ping -c10 192.168.1.76 connect: Network is unreachable

A oto wynik działania polecenia ping w sytuacji, gdy cała zdalna sieć jest nieosiągalna:

1

Docelowy host jest nieosiągalny — przyp. tłum.

544 |

Rozdział 19. Rozwiązywanie problemów z siecią

$ ping -c10 krzak.net PING krzak.net(11.22.33.44) 56(84) bytes of data. --- krzak.net ping statistics --10 packets transmitted, 0 received, 100% packet loss, time 10007ms

W przypadku czasowej awarii można zwiększyć liczbę sygnałów ping do kilkuset. Warto ustanowić limit, ponieważ łatwo można zapomnieć, że polecenie ping zostało uruchomione. Kiedy hosty, do których wysyłamy sygnały ping, są po drugiej stronie routera lub bramy internetowej, należy uruchomić polecenie ping zarówno ze stacji roboczej za routerem, jaki i z samego routera. W przypadku hosta z wieloma interfejsami sieciowymi należy skorzystać z polecenia ping-I w celu wskazania interfejsu, który chcemy wykorzystać.

Dyskusja Nie należy blokować komunikatów echo-request, echo-reply, time-exceeded lub destination-unreachable polecenia ping. Niektórzy administratorzy blokują wszystkie komunikaty ping na poziomie zapór firewall. Jest to błąd, ponieważ wiele funkcji sieciowych do poprawnego działania wymaga, aby co najmniej te cztery komunikaty ping działały prawidłowo. Informacje o tym, jak można prawidłowo skonfigurować zaporę firewall iptables, można znaleźć w rozdziale 3.

Patrz także • man 8 ping • lista parametrów ICMP organizacji IANA: http://www.iana.org/assignments/icmp-parameters

19.3. Profilowanie sieci za pomocą poleceń FPing i Nmap Problem Chcielibyśmy mieć możliwość wykrycia wszystkich hostów w sieci oraz wyznaczenia bazowej wydajności sieci za pomocą polecenia ping, tak by można było porównać wyniki podczas rozwiązywania problemów z wydajnością sieci. Można by to zrobić za pomocą polecenia ping i, na przykład, napisać inteligentny skrypt automatyzujący wysyłanie sygnałów ping do całej podsieci. Ale czy nie ma sposobu, aby ten sam efekt uzyskać za pomocą pojedynczego polecenia?

Rozwiązanie Polecenie fping wysyła sygnały ping po kolei do wszystkich adresów w zakresie. Oto przykład polecenia fping, wysyłającego do podsieci sygnał ping, generującego raport na temat hostów, które odpowiadają na sygnał, wysyłającego zapytania DNS o nazwy hostów i wyświetlającego podsumowanie:

19.3. Profilowanie sieci za pomocą poleceń FPing i Nmap

| 545

$ fping -c1 -sdg 192.168.1.0/24 xena.krzak.net : [0], 84 bytes, 0.04 pyramid.krzak.net : [0], 84 bytes, 0.45 uberpc.krzak.net : [0], 84 bytes, 0.11 ICMP Host Unreachable from 192.168.1.10 ICMP Host Unreachable from 192.168.1.10 ICMP Host Unreachable from 192.168.1.10 [...]

ms (0.04 ms (0.45 ms (0.11 for ICMP for ICMP for ICMP

avg, avg, avg, Echo Echo Echo

0% loss) 0% loss) 0% loss) sent to 192.168.1.2 sent to 192.168.1.3 sent to 192.168.1.4

192.168.1.9 : xmt/rcv/%loss = 1/0/100% xena.krzak.net : xmt/rcv/%loss = 1/1/0%, min/avg/max = 0.04/0.04/0.04 192.168.1.11 : xmt/rcv/%loss = 1/0/100% [...] 128 targets 3 alive 126 unreachable 0 unknown addresses 0 127 3 102

timeouts (waiting for response) ICMP Echos sent ICMP Echo Replies received other ICMP received

0.04 ms (min round trip time) 1.02 ms (avg round trip time) 2.58 ms (max round trip time) 6.753 sec (elapsed real time)

Polecenie wyświetla również listę hostów, które nie odpowiadają, zatem pozwala uzyskać pełny obraz. Z poniższego, przykładowego polecenia można skorzystać w celu zastosowania filtra do wyniku. Dzięki niemu będą się wyświetlały tylko aktywne hosty oraz podsumowanie: $ fping -c1 -sdg 192.168.1.0/25 2>&1 | egrep -v "ICMP|xmt" xena.krzak.net : [0], 84 bytes, 0,06 ms (0,06 avg, 0% loss) pyramid.krzak.net : [0], 84 bytes, 1,03 ms (1,03 avg, 0% loss) uberpc.krzak.net : [0], 84 bytes, 0.11 ms (0.11 avg, 0% loss) 128 3 126 0

targets alive unreachable unknown addresses

0 timeouts (waiting for response) 0,06 ms (min round trip time) 0,40 ms (avg round trip time) 1,03 ms (max round trip time) 6.720 sec (elapsed real time)

A oto polecenie, które dołącza wyniki do pliku tekstowego: $ fping -c1 -sdg 192.168.1.0/24 2>&1 | egrep -v "ICMP|xmt" >> fpingtest

Polecenie to można uruchomić kilkakrotnie o różnych porach dnia w czasie, kiedy nie ma problemów z siecią. Dzięki temu uzyskamy materiał do porównań podczas rozwiązywania problemów. Jeśli interesuje nas tylko wykrycie wszystkich aktywnych hostów w sieci, lepiej skorzystać z polecenia Nmap, które działa znacznie szybciej i generuje wynik o znacznie mniejszej objętości: # nmap -sP 192.168.1.0/24 Starting Nmap 4.20 ( http://insecure.org ) at 2007-06-08 15:53 PDT Host xena.krzak.net (192.168.1.10) appears to be up. Host pyramid.krzak.net (192.168.1.50) appears to be up. MAC Address: 00:0D:B9:05:25:B4 (PC Engines GmbH) Host uberpc.krzak.net (192.168.1.76) appears to be up.

546 |

Rozdział 19. Rozwiązywanie problemów z siecią

MAC Address: 00:14:2A:54:67:D6 (Elitegroup Computer System Co.) Nmap finished: 256 IP addresses (3 hosts up) scanned in 4.879 seconds

W przypadku uruchomienia powyższego polecenia z wykorzystaniem konta innego niż root adresy MAC będą niewidoczne. Aby się dowiedzieć, z jakich systemów operacyjnych korzystają użytkownicy oraz jakie porty mają otwarte, można skorzystać z własności polecenia nmap umożliwiającej badanie „odcisków palców” systemów operacyjnych (ang. fingerprinting): # nmap -sS -O 192.168.1.*

Polecenie nmap bez żadnych opcji skanuje sieć w poszukiwaniu otwartych portów we wszystkich hostach: # nmap 192.168.1.*

Wynik polecenia nmap można również skierować do pliku tekstowego. Należy pamiętać, że użycie operatora > powoduje nadpisanie zawartości pliku, natomiast operator >> powoduje dołączenie informacji na końcu pliku.

Dyskusja Polecenie fping nadaje się do przeprowadzania okazjonalnych, szybkich testów. W celu długoterminowego śledzenia aktywności sieci można skorzystać z polecenia smokeping. Polecenie smokeping wykreśla statystyki ping za pomocą programu RRDTool i generuje estetyczne wykresy HTML. Użycie przełącznika -s polecenia fping powoduje wyświetlenie podsumowania przy wyjściu, opcja -d powoduje wyszukiwanie nazw hostów, natomiast opcja -g pozwala na określenie zakresu adresów do wykorzystania. Za pomocą opcji -c można określić, ile razy ma działać polecenie fping. Polecenie fping wysyła większą część swojego wyniku do urządzenia STDERR. W związku z tym nie można dla niego wykorzystać polecenia grep w standardowy sposób. Dlatego właśnie należy je wcześniej przekierować za pomocą polecenia 2>&1, co oznacza: „Skieruj standardowe urządzenie błędu (deskryptor pliku 2.) do tego samego miejsca, gdzie jest kierowane standardowe wyjście (deskryptor pliku 1.)”.

Patrz także • man 8 fping • man 1 grep • Smokeping: http://oss.oetiker.ch/smokeping/

19.4. Wyszukiwanie zdublowanych adresów IP za pomocą polecenia arping Problem Chcemy się dowiedzieć, w jaki sposób można przetestować adresy IP w sieci LAN, by sprawdzić, czy nie ma w niej duplikatów. 19.4. Wyszukiwanie zdublowanych adresów IP za pomocą polecenia arping

|

547

Rozwiązanie Można skorzystać z polecenia arping w następujący sposób: $ arping -D 192.168.1.76 ARPING 192.168.1.76 from 0.0.0.0 eth0 Unicast reply from 192.168.1.76 [00:14:2A:54:67:D6] for 192.168.1.76 [00:14:2A:54:67: D6] 0.605ms Sent 1 probes (1 broadcast(s)) Received 1 response(s)

Komunikat Received 1 response(s)2 oznacza, że podany adres jest już używany. Polecenie arping zwraca nawet informację o jego adresie MAC. Polecenie to można również przetestować z wykorzystaniem nazwy hosta: $ arping -D uberpc ARPING 192.168.1.76 from 0.0.0.0 eth0 Unicast reply from 192.168.1.76 [00:14:2A:54:67:D6] for 192.168.1.76 [00:14:2A:54:67: D6] 0.590ms Sent 1 probes (1 broadcast(s)) Received 1 response(s)

Należy ustawić limit czasowy lub ilościowy. Jeśli się tego nie zrobi, polecenie arping w przypadku braku odpowiedzi będzie kontynuowało działanie. Oto przykład polecenia, w którym ustawiono limit czasowy na 10 sekund: $ arping -w10 -D 192.168.1.100 ARPING 192.168.1.100 from 0.0.0.0 eth0 Sent 11 probes (11 broadcast(s)) Received 0 response(s)

Aby polecenie arping wykonało pięć prób, należy skorzystać z opcji -c5 zamiast -w10.

Dyskusja Oczywiście można wykorzystać dowolną wartość dla opcji -c i -w. Jest to dobry test przydatny w sytuacji, gdy mamy mobilnych użytkowników ze statycznymi adresami IP, którzy często podłączają się i odłączają od sieci. Można go również wykorzystać przed przypisaniem statycznego adresu do nowego hosta. W przypadku czasowych problemów z łącznością z określonym hostem można skorzystać z polecenia arping w celu sprawdzenia, czy jego adres nie został zdublowany. Polecenie arping może się również przydać do sprawdzenia, czy host jest aktywny, w przypadku gdy polecenie ping zawodzi. Niektórzy administratorzy blokują polecenie ping (czego nie polecam). W związku z tym w przypadku, gdy polecenie ping jest zablokowane, można skorzystać z arping. Protokół ARP (Address Resolution Protocol) jest używany głównie do translacji adresów IP na ethernetowe adresy MAC. W praktyce można zaobserwować jego działanie za pomocą polecenia tcpdump: # tcpdump -pi eth0 arp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 14:58:34.835461 arp who-has xena.krzak.net tell pyramid.krzak.net 14:58:34.839337 arp reply xena.krzak.net is-at 00:03:6d:00:83:cf (oui Unknown)

2

Odebrano 1 odpowiedź — przyp. tłum.

548 |

Rozdział 19. Rozwiązywanie problemów z siecią

define command{ command_name check_httping command_line /usr/bin/httping -N 2 -c 1 -h $HOSTADDRESS$ }

Patrz także • man 1 httping • strona macierzysta programu httping: http://www.vanheusden.com/httping/

19.6. Wykorzystanie poleceń traceroute, tcptraceroute i mtr do wykrywania problemów z siecią Problem Mamy problem z komunikacją z określonym hostem lub siecią. Wykorzystanie polecenia ping potwierdza, że problem istnieje, ale pomiędzy nami a hostem sprawiającym kłopot jest kilka routerów, chcemy zatem jakoś zawęzić pole poszukiwań. W jaki sposób można to zrobić?

Rozwiązanie Można skorzystać z poleceń traceroute, tcptraceroute lub mtr. Polecenie traceroute to stary znajomy, który powinien działać bez zarzutu w sieci lokalnej. Oto wynik działania polecenia traceroute dla dwóch przeskoków w małej sieci LAN zawierającej co najmniej dwie podsieci: $ traceroute serwerpocztowy1 traceroute to mailserver1.krzak.net (192.168.2.76), 30 hops max, 40 byte packets 1 pyramid.krzak.net (192.168.1.45) 3.605 ms 6.902 ms 9.165 ms 2 serwerpocztowy1.krzak.net (192.168.2.76) 3.010 ms 0.070 ms 0.068 ms

Wynik tego polecenia pokazuje, że sygnał przechodzi przez jeden router — pyramid. W przypadku uruchomienia polecenia traceroute w pojedynczej podsieci powinniśmy zobaczyć tylko jeden przeskok, ponieważ w tym przypadku nie jest wykorzystywany routing: $ traceroute uberpc traceroute to uberpc.krzak.net (192.168.1.77), 30 hops max, 40 byte packets 1 uberpc (192.168.1.77) 5.722 ms 0.075 ms 0.068 ms

Polecenie traceroute może nie działać w internecie, ponieważ wiele routerów zaprogramowano w taki sposób, aby ignorowały datagramy UDP. W przypadku gdy wynik pokazuje wiele przekroczeń limitu czasu, można spróbować wykorzystać opcję -I, która powoduje przesyłanie żądań ICMP ECHO. Można również skorzystać z polecenia tcptraceroute, które przesyła pakiety TCP, w związku z czym jego zignorowanie jest znacznie trudniejsze: $ tcptraceroute bratgrrl.com Selected device eth0, address 192.168.1.10, port 49422 for outgoing packets Tracing the path to bratgrrl.com (67.43.0.135) on TCP port 80 (www), 30 hops max 1 192.168.1.50 6.498 ms 0.345 ms 0.334 ms 2 gateway.foo.net (12.169.163.1) 23.381 ms 22.002 ms 23.047 ms 3 router.foo.net (12.169.174.1) 23.285 ms 23.434 ms 22.804 ms

19.6. Wykorzystanie poleceń traceroute, tcptraceroute i mtr do wykrywania problemów z siecią

|

551

4 5 6 7 8 9 10 ms 11 12

12.100.100.201 54.091 ms 48.301 ms * 12.101.6.101 101.154 ms 100.027 ms 110.753 ms tbr2.cgcil.ip.att.net (12.122.10.61) 104.155 ms 101.934 ms 101.387 ms tbr2.dtrmi.ip.att.net (12.122.10.133) 108.611 ms 105.148 ms 108.538 ms gar3.dtrmi.ip.att.net (12.123.139.141) 108.815 ms 116.832 ms 97.934 ms * * * lw-core1-ge2.rtr.liquidweb.com (209.59.157.30) 116.363 ms 115.567 ms 149.428 lw-dc1-dist1-ge1.rtr.liquidweb.com (209.59.157.2) 129.055 ms 137.067 ms * host6.miwebdns6.com (67.43.0.135) [open] 130.926 ms 122.942 ms 125.739 ms

Doskonałym narzędziem, które łączy w sobie cechy poleceń ping i traceroute, jest mtr. Polecenie to można wykorzystać w celu uzyskania statystyk dotyczących opóźnień, utraconych pakietów oraz problemów z routerami. Oto przykład, który uruchamia polecenie mtr 100 razy, organizuje dane w formacie raportu oraz zapisuje je w pliku tekstowym: $ mtr -r -c100 oreilly.com >> mtr.txt

Plik ma następującą postać: HOST: xena 1. pyramid.alrac.net 2. gateway.foo.net 3. router.foo.net 4. 12.222.222.201 5. 12.222.222.50 6. gbr1.st6wa.ip.att.net 7. br1-a350s5.attga.ip.att.net 8. so0-3-0-2488M.scr1.SFO1.gblx 9. sonic-gw.customer.gblx.net 10. 0.ge-0-1-0.gw.sr.sonic.net 11. gig50.dist1-1.sr.sonic.net 12. ora-demarc.customer.sonic.ne 13. www.oreillynet.com

Loss% 0.0% 0.0% 0.0% 1.0% 4.0% 1.0% 3.0% 1.0% 2.0% 2.0% 0.0% 5.0% 4.0%

Snt 100 100 100 100 100 100 100 100 100 100 100 100 100

Last Avg 0.4 0.5 23.5 23.1 23.4 24.4 52.8 57.9 61.9 62.4 61.4 76.2 57.2 60.0 73.9 83.4 72.6 79.9 71.5 78.2 81.1 84.3 69.1 82.9 75.4 81.0

Best 0.3 21.6 21.9 44.5 50.1 46.2 44.4 64.0 69.3 67.6 73.1 69.1 69.8

Wrst 6.8 29.8 78.9 127.3 102.9 307.8 107.1 265.9 119.5 142.2 169.1 144.6 119.1

StDev 0.7 1.0 5.9 10.3 9.8 48.8 11.6 27.6 7.5 9.3 12.1 10.2 7.0

Jest to stosunkowo czysty przebieg, z niewielkim procentem utraconych pakietów i małymi opóźnieniami. W przypadku problemów można utworzyć zadanie cron, które uruchomi polecenie mtr w regularnych odstępach czasu. Do tego celu można skorzystać z polecenia zamieszczonego poniżej (trzeba oczywiście wykorzystać własne nazwy domen i nazwy plików): $ mtr -r -c100 oreillynet.com >> mtr.txt && date >> mtr.txt

W tym przypadku wyniki każdego uruchomienia polecenia mtr będą zapisane w pojedynczym pliku razem z datą i godziną na końcu każdego wpisu. Wyniki polecenia mtr można obserwować w czasie rzeczywistym w następujący sposób: $ mtr -c100 oreillynet.com

Aby wyeliminować wyszukiwanie DNS, należy skorzystać z opcji -n.

Dyskusja Jeśli każde z poleceń omawianych w niniejszej recepturze zawiesi się na tym samym routerze lub jeśli polecenie mtr konsekwentnie pokazuje więcej niż 5 procent utraconych pakietów oraz długie czasy przechodzenia przez określony router, to można bezpiecznie stwierdzić, że w odniesieniu do tego routera wystąpił problem. Jeśli jest to router będący pod naszą kontrolą, to nie pozostaje nic innego, jak go naprawić. Jeśli nie, można skorzystać z polecenia dig lub whois w celu znalezienia właściciela i uprzejmie poinformować go o problemie. Najlepiej zapisać wyniki badań i zaprezentować je osobom zarządzającym wadliwym routerem, tak by mogli je samodzielnie ocenić. 552

|

Rozdział 19. Rozwiązywanie problemów z siecią

Dostępnych jest wiele serwisów internetowych, które pozwalają na uruchamianie ze swoich witryn różnych narzędzi sieciowych, takich jak ping i traceroute. Jest to dobry sposób na to, by uzyskać dodatkowe informacje i wykorzystać je do porównania. Polecenie mtr może generować dość duży ruch w sieci, dlatego nie należy uruchamiać go przez cały czas. Polecenie tcptraceroute przesyła pakiety TCP SYN zamiast pakietów UDP lub pakietów ICMP ECHO. Istnieje większa szansa na to, że pakiety te przejdą przez zapory firewall i nie zostaną zignorowane przez routery. Kiedy host odpowie, polecenie tcptraceroute wysyła pakiet TCP RST w celu zamknięcia połączenia, dlatego trzyetapowe uzgadnianie TCP nigdy nie zostaje ukończone. Jest to odpowiednik półotwartego skanowania za pomocą polecenia nmap (z opcjami -sS).

Patrz także • man 8 traceroute • man 1 tcptraceroute • man 8 mtr

19.7. Wykorzystanie polecenia tcpdump do przechwytywania i analizowania ruchu Problem Chcemy zobaczyć co się dzieje na łączach i wiemy, że tcpdump jest właściwym snifferem pakietów do wykorzystania w tym celu. Nie wiemy jednak, w jaki sposób filtrować ten masowy ruch. Co zrobić, aby polecenie wyświetlało tylko to, co nas interesuje?

Rozwiązanie Polecenie tcpdump umożliwia filtrowanie ruchu na dowolnym poziomie dokładności. Poniżej zamieszczono kilka przykładów często stosowanych filtrów. Należy rutynowo stosować przełącznik -p, aby uniemożliwić interfejsowi przejście do trybu promiscuous, który w sieciach z przełącznikami jest bezużyteczny. Przechwytywanie całego ruchu pojedynczego hosta: # tcpdump -pi eth0 host uberpc

Przechwytywanie całego ruchu więcej niż jednego hosta: # tcpdump -pi eth0 host uberpc and stinkpad and penguina

Przechwytywanie całego ruchu więcej niż jednego hosta z wyjątkiem określonego: # tcpdump -pi eth0 host uberpc and stinkpad and not penguina

Przechwytywanie całego ruchu skierowanego do hosta: # tcpdump -pi eth0 dst host uberpc

19.7. Wykorzystanie polecenia tcpdump do przechwytywania i analizowania ruchu

| 553

Przechwytywanie ruchu wychodzącego z hosta: # tcpdump -pi eth0 src host uberpc

Przechwytywanie ruchu dla pojedynczego protokołu: # tcpdump -pi eth0 tcp

Przechwytywanie ruchu dla więcej niż jednego protokołu: # tcpdump -pi eth0 tcp or udp or icmp

Przechwytywanie określonego portu: # tcpdump -pi eth0 port 110

Przechwytywanie kilku portów: # tcpdump -pi eth0 port 25 or port 80 or port 110

Przechwytywanie zakresu portów: # tcpdump -pi eth0 portrange 3000-4000

Obserwacja ruchu wychodzącego z portu: # tcpdump -pi eth0 src port 110

Obserwacja ruchu wchodzącego do portu: # tcpdump -pi eth0 dst port 110

Wyszukiwanie pakietów mniejszych od określonego rozmiaru: # tcpdump -pi eth0 less 512

Wyszukiwanie pakietów większych od określonego rozmiaru: # tcpdump -pi eth0 greater 512

Obserwacja połączeń SSH z podanych hostów: # tcpdump -pi eth0 src host uberpc or stinkpad and dst port 22

Obserwacja ruchu wychodzącego z jednej sieci i wchodzącego do dwóch innych sieci: # tcpdump -pi eth0 src net 192.168.1.0/16 and dst net 10.0.0.0/8 or 172.16.0.0/16

Opcja -X odczytuje dane przesyłane w pakiecie, ale domyślnie czyta tylko 68 bajtów. Zastosowanie opcji -s0 powoduje wyświetlenie kompletnych danych. Jej użycie pokazano w poniższym przykładzie dotyczącym konwersacji przez IRC: # tcpdump -X -s0 -pi eth0 10:40:14.683350 IP 192.168.1.10.35386 > 12.222.222.107.6667: P 1:65(64) ack 410 win 16022 0x0000: 4500 0074 c43b 4000 4006 8157 c0a8 010a E..t.;@[email protected].... 0x0010: 8cd3 a66b 8a3a 1a0b 420f ddd1 bb15 eb3b ...k.:..B......; 0x0020: 8018 3e96 4309 0000 0101 080a 0012 625e ..>.C.........b^ 0x0030: dcbe 2c65 5052 4956 4d53 4720 236c 696e ..,ePRIVMSG.#lin 0x0040: 7578 6368 6978 203a 746f 2062 6520 6120 uxchix.:to.be.a. 0x0050: 7375 7065 722d 7365 6b72 6974 2073 7079 super-sekrit.spy 0x0060: 2c20 7573 6520 7468 6520 2d73 2073 7769 ,.use.the.-s.swi 0x0070: 7463 680a tch.

Poniższe polecenie: # tcpdump -pXi eth0 -w plikzrzututcpdump -s0 host stinkpad

przechwytuje cały ruch przechodzący przez host Stinkpad (łącznie z danymi) i zapisuje go w pliku plikzrzututcpdump. Utworzony plik można odczytać za pomocą następującego polecenia: 554 |

Rozdział 19. Rozwiązywanie problemów z siecią

# tcpdump -r plikzrzututcpdump

Skierowanie wyniku działania polecenia tcpdump pozwala na studiowanie go w wolnej chwili lub na otwarcie go w programie Wireshark w celu odczytania go w bardziej przyjaznym środowisku. Aby utworzyć plik w formacie, który można odczytać w programie Wireshark, należy skorzystać z opcji -w. Plik wyniku polecenia tcpdump wyświetlony za pomocą programu Wireshark pokazano na rysunku 19.1.

Rysunek 19.1. Analiza wyniku polecenia tcpdump w programie Wireshark

Za pomocą polecenia zamieszczonego poniżej można przechwytywać pakiety na żywo i zapisywać wynik w pliku. Polecenie to nie tworzy pliku możliwego do odczytania za pomocą programu Wireshark, ale tworzy plik tekstowy, który można analizować za pomocą dowolnych narzędzi do przeszukiwania informacji tekstowych: # tcpdump -pXi eth0 -s0 host stinkpad -l | tee tcpdumpfile

To polecenie jest dobrym sposobem na znalezienie zainfekowanych hostów, które przesyłają spam. Wniosek taki można wyciągnąć dlatego, ponieważ nikt poza oficjalnymi serwerami pocztowymi nie powinien przesyłać niczego z portu 25: # tcpdump -pni eth0 dst port 25 and not src host serwerpocztowy1

Zastosowanie przełącznika -n wyłącza rozwiązywanie nazw. Można również skorzystać z przełącznika -c w celu ograniczenia liczby przechwytywanych pakietów: # tcpdump -c 1000 -pXi eth0 -w tcpdumpfile -s0

Jeśli nie zastosujemy tej opcji, polecenie będzie działało do momentu wciśnięcia klawiszy Ctrl+C.

19.7. Wykorzystanie polecenia tcpdump do przechwytywania i analizowania ruchu

| 555

Dyskusja Narzędzie tcpdump powinno być numerem jeden w zbiorze programów do rozwiązywania problemów z siecią, ponieważ dzięki niemu można uzyskać szczegółowe informacje o tym, co dzieje się na łączach. Nie warto zgadywać — lepiej uruchomić tcpdump. Spróbujmy przeanalizować typowy wynik działania polecenia tcpdump, wykorzystując fragment operacji sprawdzania poczty: # tcpdump -pi eth0 14:23:02.983415 IP xena.krzak.net.58154 > host6.foo.com.pop3s: S 3100965180: 3100965180(0) win 5840 (DF)

• 14:23:02.983415 to znacznik czasu w formacie gg:mm:ss:ułamki_sek. • xena.krzak.net.58154 to źródłowy host wraz z portem. • host6.foo.com.pop3s to docelowy host wraz z portem. • S oznacza pierwszą część trzyetapowego uzgadniania TCP (SYN, SYN, ACK). • 3100965180: 3100965180 oznacza sekwencję (zakres) bajtów. Początkowy numer sekwen-

cyjny (Initial Sequence Numer — ISN) jest generowany losowo. Dalej występują numery sekwencyjne pozostałych bajtów, które są inkrementowane o 1, począwszy od ISN. Ponieważ na tym etapie dane jeszcze nie są wymieniane, oba numery są identyczne. • Zapis win 5840 określa rozmiar okna lub liczbę bajtów przestrzeni bufora, dostępnych

na hoście do odbioru danych. • mss 1460 oznacza maksymalny rozmiar segmentu lub maksymalny rozmiar datagramu

IP, który można obsłużyć bez korzystania z fragmentacji. Obie strony połączenia muszą uzgodnić tę wartość. Jeśli są różne, wykorzystywana jest mniejsza z nich. Operację uzgadniania określa się terminem detekcji jednostki MTU (Maximum Transmission Unit — maksymalna jednostka transmisji) ścieżki. Jednostka MTU określa całkowity rozmiar ramki, który obejmuje maksymalny rozmiar segmentu (Maximum Segent Size — MSS) plus nagłówki TCP/IP oraz inne nagłówki wymagane przez protokół przesyłający. 3

• sackOK oznacza selective acknowledgments — możliwość potwierdzania pakietów przez

odbiorcę nie po kolei. Dawniej pakiety mogły być potwierdzane tylko po kolei. W związku z tym w przypadku gdy brakowało trzeciego pakietu spośród stu odebranych, host mógł potwierdzić odebranie tylko dwóch pierwszych pakietów, a host wysyłający musiał ponowić wysyłanie wszystkich pakietów od numeru 3. do 100. Opcja sackOK umożliwia przesyłanie tylko brakujących pakietów. • timestamp 4546985 0 to znacznik czasu transmisji pakietu w obie strony. Są tu dwa pola:

Timestamp Value oraz Timestamp Echo Reply. Przy pierwszej wymianie wartość Echo Reply jest ustawiana na 0. Kiedy drugi host odbierze ten pakiet, przesyła znacznik czasu z pola Timestamp Value starego pakietu do pola Timestamp Echo Reply nowego pakietu. Następnie generuje nową wartość pola Timestamp Value. Tak więc pole Timestamp Value zawiera ostatni znacznik czasu, z kolei pole Timestamp Echo Reply zawiera po-

przedni znacznik czasu.

3

Potwierdzanie selektywne — przyp. tłum.

556

|

Rozdział 19. Rozwiązywanie problemów z siecią

4

• Zapis nop — no operation jest po prostu wypełnieniem. Opcje TCP muszą mieć rozmiar

będący wielokrotnością 4 bajtów, zatem zapis nop jest wykorzystywany do wypełnienia pól o zbyt małych rozmiarach. • wscale 0 to sprytny sposób obejścia pierwotnego ograniczenia rozmiaru okna do 65 535

bajtów. Opcja wscale umożliwia zastosowanie bufora o rozmiarze pełnego gigabajta. Opcję muszą obsługiwać obie strony połączenia, w innym przypadku rozmiar okna się nie zmieni. 5

• (DF) oznacza don’t fragment .

Czasami, aby przechwycić dokładnie te informacje, które nas interesują, trzeba być we właściwej lokalizacji fizycznej. Na przykład, aby przechwycić spam przesyłany przez zainfekowane hosty lub obserwować ruch pomiędzy sieciami, należy uruchomić polecenie tcpdump na routerze. Inny przypadek to podłączenie laptopa administratora pomiędzy routerem a przełącznikiem, jeśli w sieci są wykorzystywane przełączniki z ograniczonymi możliwościami przetwarzania (tzw. głuche — ang. dumb switch). W inteligentnych przełącznikach są dostępne porty monitorowania sieci. Aby się dowiedzieć, jakie pakiety próbują się dostać do naszej sieci bez filtrowania, można podłączyć laptop administratora sieci pomiędzy internetem a zaporą firewall.

Patrz także • man 8 tcpdump

19.8. Przechwytywanie flag TCP za pomocą polecenia tcpdump Problem Składnia filtrów polecenia tcpdump jest stosunkowo łatwa do zrozumienia, poza opcjami filtrowania specyficznych flag TCP — na przykład SYN, ACK, RST itp. Tutaj jest prawdziwy chaos. Skąd można się dowiedzieć, w jaki sposób należy z nich korzystać?

Rozwiązanie Na stronie podręcznika systemowego man na temat polecenia tcpdump pokazano, w jaki sposób oblicza się prawidłowe wartości flag TCP. Warto je przestudiować i dowiedzieć się — od podstaw — w jaki sposób należy je stosować. Można też skorzystać z poniższej ściągawki: Przechwytywanie wszystkich pakietów SYN: # tcpdump 'tcp[13] & 2 != 0'

4

Nic nie rób — przyp. tłum.

5

Bez fragmentacji — przyp. tłum. 19.8. Przechwytywanie flag TCP za pomocą polecenia tcpdump

|

557

Przechwytywanie wszystkich pakietów ACK: # tcpdump 'tcp[13] & 16 != 0'

Przechwytywanie wszystkich pakietów SYN-ACK: # tcpdump 'tcp[13] = 18'

Przechwytywanie wszystkich pakietów FIN: # tcpdump 'tcp[13] & 1 != 0'

Przechwytywanie wszystkich pakietów URG: # tcpdump 'tcp[13] & 32 != 0'

Przechwytywanie wszystkich pakietów PSH: # tcpdump 'tcp[13] & 8 != 0'

Przechwytywanie wszystkich pakietów RST: # tcpdump 'tcp[13] & 4 != 0'

Opcje te można wykorzystywać w połączeniu z innymi opcjami filtrowania, na przykład dotyczącymi portów, hostów i sieci — tak jak pokazano w poprzedniej recepturze.

Dyskusja Jest kilka przypadków, w których warto przeanalizować określone flagi TCP — na przykład podczas badania podejrzanych działań lub w przypadku problemów z wadliwie skonfigurowanymi usługami, które przesyłają nieprawidłowe odpowiedzi. Innym sposobem przeprowadzenia takiego filtrowania jest przechwycenie obszernego fragmentu danych niemal bez filtrowania, a następnie zrzucenie ich do pliku za pomocą opcji -w. Uzyskany plik można analizować za pomocą programu Wireshark. W takim przypadku można filtrować ten sam zbiór danych na kilka różnych sposobów, bez konieczności ponownego przechwytywania danych. Wykorzystanie programu Wireshark do analizy i filtrowania danych przechwytywanych przez polecenie tcpdump to prawdopodobnie najbardziej elastyczna i dająca najwięcej możliwości metoda spośród wszystkich dostępnych metod. Na rysunku 19.2 pokazano zrzut ekranu mojej ulubionej funkcji — Follow TCP Stream. Dzięki niej można wyizolować pojedynczy strumień TCP z całej masy pobranych danych. Program Wireshark obsługuje te same filtry co polecenie tcpdump. Udostępnia wiele interesujących graficznych menu pozwalających na analizę danych w najlepszy z możliwych sposobów. Program Wireshark może całkowicie zastąpić polecenie tcpdump. Jednak w przypadku obsługi serwerów lub stacji działających w trybie headless bądź serwerów bez systemu X Window w dalszym ciągu trzeba wiedzieć, w jaki sposób skorzystać z polecenia tcpdump.

Patrz także • man 8 tcpdump • Wireshark: http://www.wireshark.org/ • strony pomocy programu Wireshark

558

|

Rozdział 19. Rozwiązywanie problemów z siecią

Rysunek 19.2. Program Wireshark umożliwia wyróżnienie pojedynczego strumienia TCP

19.9. Pomiary przepustowości, parametru jitter oraz procentu utraconych pakietów za pomocą polecenia iperf 19.9. Pomiary przepustowości, parametru jitter oraz procentu utraconych pakietów za pomocą polecenia iperf

Problem Chcemy zmierzyć przepustowość niektórych segmentów sieci oraz odczytać statystyki dotyczące parametru jitter oraz utraconych datagramów. Informacje te można zbierać na przykład w ramach okresowych testów wydajności sieci. Mogą być również przydatne w sytuacji, gdy chcemy uruchomić serwer VoIP, na przykład Asterisk, Trixbox lub PBXtra, i w związku z tym w celu zapewnienia dobrej jakości połączeń sieć musi być w doskonałym stanie.

19.9. Pomiary przepustowości, parametru jitter oraz procentu utraconych pakietów za pomocą polecenia iperf

| 559

Rozwiązanie Można skorzystać z polecenia iperf — zgrabnego narzędzia do mierzenia wydajności TCP i UDP pomiędzy dwoma punktami końcowymi. Program musi być zainstalowany po obydwóch stronach mierzonego połączenia. W pokazanym przykładzie są to hosty Xena i Penguina. Host Xena nazwiemy serwerem, z kolei Penguina — klientem. Najpierw należy uruchomić polecenie iperf na hoście Xena w trybie serwera, a następnie uruchomić je na hoście Penguina (łatwy sposób przeprowadzenia testu to wykonanie wszystkich operacji na hoście Xena w dwóch sesjach programu X terminal przez SSH.) carla@xena:~$ iperf -s -----------------------------------------------------------Server listening on TCP port 5001 TCP window size: 85.3 KByte (default) -----------------------------------------------------------terry@penguina:~$ iperf -c xena -----------------------------------------------------------Client connecting to xena, TCP port 5001 TCP window size: 16.0 KByte (default) -----------------------------------------------------------[ 3] local 192.168.1.76 port 49215 connected with 192.168.1.10 port 5001 [ 3] 0.0-10.0 sec 111 MBytes 92.6 Mbits/sec

To wszystko. To było proste uruchomienie bez zakłóceń, a także bardzo szybkie, ponieważ są to hosty w lokalnej sieci Fast Ethernet. Można również przeprowadzić dwukierunkowy test, który działa jednocześnie w dwie strony: terry@penguina:~$ iperf -c xena -d -----------------------------------------------------------Server listening on TCP port 5001 TCP window size: 85.3 KByte (default) ----------------------------------------------------------------------------------------------------------------------Client connecting to xena, TCP port 5001 TCP window size: 56.4 KByte (default) -----------------------------------------------------------[ 5] local 192.168.1.76 port 59823 connected with 192.168.1.10 port 5001 [ 4] local 192.168.1.76 port 5001 connected with 192.168.1.10 port 58665 [ 5] 0.0-10.0 sec 109 MBytes 91.1 Mbits/sec [ 4] 0.0-10.0 sec 96.0 MBytes 80.5 Mbits/sec

Można też testować poszczególne kierunki oddzielnie: $ terry@uberpc:~$ iperf -c xena -r

Warto porównać wyniki z obu przebiegów, aby uzyskać obraz na temat tego, na ile wydajny jest tryb duplex w naszej sieci Ethernet. Rozwiązywanie problemów z pakietami w trybie multicast może spowodować u administratora sieci skłonność do pijaństwa, ale na szczęście polecenie iperf może mu w tym pomóc. Należy uruchomić polecenie iperf w trybie serwera na wszystkich hostach multicast, a następnie przetestować je wszystkie naraz z jednego klienta: dmin@host1:~$ iperf -sB 239.0.0.1 admin@host2:~$ iperf -sB 239.0.0.1 admin@host3:~$ iperf -sB 239.0.0.1 carla@xena:~$ iperf -c 239.0.0.1

Jeśli transmisję multicast wykorzystujemy do przesyłania strumieni audio lub wideo, należy przeprowadzić test z wykorzystaniem protokołu UDP zamiast TCP w następujący sposób: 560

|

Rozdział 19. Rozwiązywanie problemów z siecią

admin@host1:~$ iperf -sBu 239.0.0.1 admin@host2:~$ iperf -sBu 239.0.0.1 admin@host3:~$ iperf -sBu 239.0.0.1 carla@xena:~$ iperf -c 239.0.0.1 -ub 512k

Należy dostosować wartość podawaną za pomocą opcji -b (bitów na sekundę), tak by odpowiadała naszej sieci. Można również użyć opcji -m i podać tę wartość w megabitach na sekundę. Testowanie protokołu UDP pozwala na wygenerowanie wielu przydatnych i interesujących statystyk. Jeśli serwer nadal działa, należy go zatrzymać poprzez wciśnięcie klawiszy Ctrl+C, a następnie uruchomić następujące polecenie: carla@xena:~$ iperf -su ----------------------------------------------------------Server listening on UDP port 5001 Receiving 1470 byte datagrams UDP buffer size: 108 KByte (default) -----------------------------------------------------------

W dalszej kolejności należy uruchomić klienta: terry@penguina:~$ iperf -c xena -ub 100m -----------------------------------------------------------Client connecting to xena, UDP port 5001 Sending 1470 byte datagrams UDP buffer size: 108 KByte (default) -----------------------------------------------------------[ 3] local 192.168.1.76 port 32774 connected with 192.168.1.10 port 5001 [ 3] 0.0-10.0 sec 114 MBytes 95.7 Mbits/sec [ 3] Sent 81444 datagrams [ 3] Server Report: [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 3] 0.0-10.0 sec 113 MBytes 94.9 Mbits/sec 0.242 ms 713/81443 (0.88%) [ 3] 0.0-10.0 sec 1 datagrams received out-of-order

Jitter i liczba utraconych datagramów to dwie istotne charakterystyki dla strumieni multimedialnych. Jitter przekraczający 200 ms można porównać do jazdy po wyboistej drodze, a zatem wartość 0,242 ms uzyskana w naszym teście jest doskonała. Wartość 0.88 procenta utraconych datagramów również jest nieznacząca. W zależności od jakości punktów końcowych usługi VoIP tolerują do 10 procent straconych datagramów, choć idealnie by było, gdyby wartość ta nie przekraczała 3 – 4 procent. Liczba datagramów otrzymanych nie po kolei (out-of-order) ma również znaczenie dla strumieni multimedialnych — oczywiste jest, że zbiór datagramów UDP odbieranych losowo nie wpływa pozytywnie na spójność. Rozmiar datagramów wysłanych od klientów można dostosować w taki sposób, by lepiej odzwierciedlały rzeczywiste warunki. Wartość domyślna wynosi 1 470 bajtów, a transmisja głosowa zazwyczaj odbywa się z szybkością około 100 – 360 bajtów na datagram (o czym można się samodzielnie przekonać za pomocą polecenia tcpdump). Rozmiar można ustawić za pomocą opcji -l polecenia iperf. Wygląda to nieco dziwnie, ponieważ można podawać wartości tylko w kilobajtach bądź megabajtach na sekundę. W związku z tym trzeba podawać wartości ułamkowe: terry@uberpc:~$ iperf -c xena -ub 100m -l .3K -----------------------------------------------------------Client connecting to xena, UDP port 5001 Sending 307 byte datagrams UDP buffer size: 108 KByte (default) -----------------------------------------------------------[ 3] local 192.168.1.76 port 32775 connected with 192.168.1.10 port 5001 [ 3] 0.0-10.0 sec 98,2 MBytes 82,3 Mbits/sec [ 3] Sent 335247 datagrams

19.9. Pomiary przepustowości, parametru jitter oraz procentu utraconych pakietów za pomocą polecenia iperf

|

561

[ 3] Server Report: [ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams [ 3] 0.0-10.0 sec 96.9 MBytes 81.2 Mbits/sec 0.006 ms 4430/335246 (1.3%) [ 3] 0.0-10.0 sec 1 datagrams received out-of-order

Dyskusja Takie same testy można uruchomić przez internet. Polecenie iperf domyślnie wykorzystuje port TCP/UDP o numerze 5001. Numer portu, który ma być wykorzystany, można również określić za pomocą opcji -p. Jakość łącza nabiera większego znaczenia w przypadku, gdy w sieci z przełączaniem pakietów zostanie uruchomionych więcej usług strumieniowych, dostawcy usług starają się sprostać tym nowym wymaganiom. W sprawie tego, co można zrobić, aby poprawić jakość łącza dla usług strumieniowych, należy rozmawiać z dostawcą usług internetowych.

Patrz także • man 1 iperf

19.10. Wykorzystanie polecenia ngrep do zaawansowanego sniffingu pakietów Problem Znamy i lubimy narzędzia tcpdump i Wireshark za to, że pozwalają na łatwe wyszukiwanie informacji, które nas interesują. Czasami jednak w dalszym ciągu nie pozostaje nam nic innego, jak zrzut wyniku do pliku tekstowego i skorzystanie z polecenia grep w celu wyszukiwania ciągu znaków lub wyrażeń regularnych, których nie da się odfiltrować za pomocą narzędzi tcpdump i Wireshark. Gdyby tak znaleźć narzędzie o połączonych własnościach poleceń tcpdump i grep.

Rozwiązanie Jest takie narzędzie: ngrep — czyli sieciowy grep (ang. network grep) — sniffer pakietów o działaniu podobnym do tcpdump z dodatkową możliwością wyszukiwania ciągów tekstowych lub wyrażeń regularnych, podobnie jak za pomocą polecenia grep. Załóżmy, że podsłuchujemy sieć, aby się dowiedzieć, co mówią o nas pracownicy na IRC. Chcemy od razu uzyskać dostęp do sedna sprawy, możemy zatem skorzystać z następującego polecenia: # ngrep -qpd eth0 host ircserver -i carla interface: eth0 (192.168.1.0/255.255.255.0) match: carla ## T 192.168.1.10:33116 -> 140.222.222.107:6667 [AP] PRIVMSG #autorzy :ta carla jest naprawdę wspaniała i każdy ją uwielbia ## T 192.168.1.32:39422 -> 140.222.222.107:6667 [AP] PRIVMSG #autorzy :tak, carla jest świetna, świat bez niej byłby kupą kurzu i popiołu

562

|

Rozdział 19. Rozwiązywanie problemów z siecią

Wygląda to obiecująco. Chcielibyśmy zobaczyć nieco szerszy kontekst, dlatego dodajemy opcję -A5, która powoduje dołączenie pięciu linijek występujących za pasującym ciągiem: # ngrep -qpd eth0 -A5 host ircserver -i carla T 192.168.1.10:33116 -> 140.222.222.107:6667 [AP] PRIVMSG #autorzy :LOL dzięki, nie śmiałem się tak już całe wieki ## T 192.168.1.32:39422 -> 140.222.222.107:6667 [AP] PRIVMSG #autorzy :NP, dobrze, że te małe kretyny z kierownictwa nie mogą nas podsłuchiwać

Polecenie ngrep wykorzystuje te same opcje określania protokołów co tcpdump. Oto przykład polecenia, które pokazuje tylko ruch POP3: # ngrep -qpd eth0 '' tcp port 110

Za pomocą polecenia ngrep można znaleźć różnice pomiędzy windowsowymi a linuksowymi poleceniami ping. W systemie Windows wykorzystuje się litery do wypełniania obszaru danych, natomiast w Linuksie cyfry. Dzięki temu można sformułować zapytanie, które poinformuje nas o tym, z jakiego systemu operacyjnego pochodzi określony sygnał ping: # ngrep -qpd eth0 'abcd' icmp interface: eth0 (192.168.1.0/255.255.255.0) filter: (ip or ip6) and ( icmp ) match: abcd # I 192.168.1.77 -> 192.168.1.10 8:0 ....abcdefghijklmnopqrstuvwabcdefghi # ngrep -qpd eth0 '1234' icmp interface: eth0 (192.168.1.0/255.255.255.0) filter: (ip or ip6) and ( icmp ) match: 1234 # I 192.168.1.76 -> 192.168.1.10 8:0 . .....F!s.... ..................... !"#$%&'()*+,-./01234567

Pokazany przykład demonstruje sposób, w jaki można wykorzystać unikatową informację w danych przesyłanych wraz z pakietem do wykonywania dokładnych operacji wyszukiwania. Domyślnie polecenie ngrep wyświetla cały pakiet. Maksymalny rozmiar pakietu wynosi 65 536 bajtów. Aby przeglądać mniejszą liczbę bajtów, należy zastosować opcję -S. Poniższy przykład pokazuje, jak można przechwytywać same nagłówki HTTP i przeglądać tylko pierwszych 156 bajtów. # ngrep -qpd -S 156 '' tcp port 80 interface: eth0 (192.168.1.0/255.255.255.0) filter: (ip or ip6) and ( tcp port 80 ) T 192.168.1.10:33812 -> 208.201.239.36:80 [AP] GET / HTTP/1.1..User-Agent: Mozilla/5.0 (compatible; Konqueror/3.5; Linux) KHTML/3. 5.6 (like Gecko) (Kubuntu)..Accept: te xt/html, image/jpeg, image/png, tex [...]

A zatem można się szybko dowiedzieć, jakich przeglądarek WWW używają użytkownicy odwiedzający nasz serwis bez konieczności szczegółowej analizy plików dzienników oraz posługiwania się analizatorami HTTP. Jedną z bardziej interesujących własności polecenia ngrep jest dopasowywanie przez inwersję — własność dostępna także w klasycznym programie grep. Opcja -v oznacza „nie uwzględniaj tego wzorca”. Oto przykład wyłączenia z wyniku żądań INVITES protokołu SIP (Session Initiation Protocol) INVITES na serwerze Asterisk: 19.10. Wykorzystanie polecenia ngrep do zaawansowanego sniffingu pakietów

| 563

# ngrep -qpd eth0 -vi invites port 5060 interface: eth0 (192.168.1.0/255.255.255.0) filter: (ip or ip6) and ( port 5060 ) don't match: invites

Protokoły i hosty można wykluczać za pomocą instrukcji not: # ngrep -qpd eth0 \(not port 22\) interface: eth0 (192.168.1.0/255.255.255.0) filter: (ip or ip6) and ( (not port 22) ) # ngrep -qpd eth0 \(not host irc.ircserver1.org\) interface: eth0 (192.168.1.0/255.255.255.0) filter: (ip or ip6) and ( (not host irc.ircserver1.org) )

Nawiasy trzeba poprzedzić ukośnikiem. Jeśli się tego nie zrobi, to powłoka Bash będzie próbowała je interpretować.

Dyskusja q

Opcja oznacza tzw. „ciche” (ang. quiet) wyjście. Powoduje wyświetlanie nagłówków i danych, ale pomija znaczniki # (ang. hash), które oddzielają poszczególne pakiety. p

Wyłączenie trybu promiscuous. Opcję tę należy wyłączać rutynowo, ponieważ i tak nie działa w sieciach z przełączaniem pakietów. d

Opcja służy do określenia urządzenia lub interfejsu sieciowego. W systemach z wieloma interfejsami sieciowymi polecenie ngrep domyślnie wykorzystuje urządzenie o najniższym numerze. i

Wyszukiwanie bez uwzględnienia wielkości liter. S

Określenie liczby wyświetlanych bajtów. v

Wyszukiwanie z wyłączeniem podanego wzorca.

Patrz także • man 8 ngrep

19.11. Wykorzystanie polecenia ntop do kolorowego i szybkiego monitorowania sieci Problem Narzędzia tcpdump i Wireshark są dobre, ale nie zapewniają łatwego czytania wyników i nie dają wizualnego wglądu w operacje wykonywane w sieci. Czy nie ma takiego programu, za pomocą którego można by monitorować i pobierać dane dotyczące ruchu sieci oraz zagrego564 |

Rozdział 19. Rozwiązywanie problemów z siecią

wane statystyki i na tej podstawie tworzyć kolorowe wykresy? W ten sposób wystarczyłby rzut oka na wykres, aby stwierdzić, co się dzieje w sieci. Przydałaby się możliwość wglądu w nawiązane połączenia, wykorzystane protokoły oraz statystyki ruchu. Aha, i jeszcze żeby ten program był łatwy do skonfigurowania.

Rozwiązanie Do tych wymagań idealnie pasuje ntop — hybrydowy analizator pakietów, który monitoruje protokoły sieciowe i na tej podstawie tworzy estetyczne wykresy i grafy w formacie HTML. Użytkownicy Debiana mogą zainstalować ten program w następujący sposób: # aptitude install ntop rrdtool graphviz

Użytkownicy Fedory muszą poszukać odpowiedniego pakietu RPM (warto sprawdzić w witrynie http://rpm.pbone.net/) lub skompilować go z kodu źródłowego. Aby można było korzystać z programu, w systemie musi być zainstalowana biblioteka libpcap i GDBM oraz jakiś serwer HTTP (doskonałym, niewielkim serwerem HTTP jest Lighttpd). Należy również zainstalować następujące programy: • RRDTool; • Graphviz; • OpenSSL; • ZLib; • GDChart; • GDLib; • LibPNG; • Ettercap.

Po zainstalowaniu należy uruchomić serwer ntop za pomocą poniższego polecenia: # /etc/init.d/ntop start

Podczas uruchamiania trzeba podać hasło użytkownika admin. Następnie należy otworzyć przeglądarkę WWW i przejść pod adres http://localhost:3000. Teraz trzeba poczekać kilka minut, aby system zebrał trochę danych. Można w tym czasie sprawdzić pocztę i trochę poszperać w sieci. Strony odświeżają się automatycznie. Wszystkimi własnościami programu zarządza się za pośrednictwem przeglądarki. Najpierw należy wybrać polecenie Admin/Configure/Startup Options, aby skonfigurować parametry, które mają być monitorowane — na przykład tylko lokalny komputer, tylko lokalną podsieć albo też wiele podsieci. Wyłączamy tryb promiscuous. Dostępne są również inne zakładki konfiguracyjne, które pozwalają na skonfigurowanie programu ntop w dowolny sposób. Dzięki rysunkom 19.3 i 19.4 można uzyskać pogląd na działanie programu ntop w rzeczywistej sieci. Wystarczy rzut oka, aby stwierdzić, kto i z kim komunikuje się w sieci.

Dyskusja Program ntop nie ma równie obszernego zbioru funkcji ani możliwości personalizacji jak monitory sieci przeznaczone do mocno obciążonych sieci. Jest to jednak dobre narzędzie, doskonale odgrywające swoją rolę, kiedy chcemy szybko i sprawnie zainstalować program, który 19.11. Wykorzystanie polecenia ntop do kolorowego i szybkiego monitorowania sieci

| 565

Rysunek 19.3. Podsumowanie dla pojedynczego komputera PC

Rysunek 19.4. Sumaryczne zestawienie protokołów wykorzystywanych w podsieci

wygeneruje właściwe informacje na temat operacji wykonywanych w sieci. Szczególnie interesująca jest zakładka IP Local. Umożliwia ona wyszukanie ukrytych bezprzewodowych punktów dostępowych oraz pozwala na natychmiastową odpowiedź na temat tego, jakie porty zostały wykorzystane. Informacje te mogą się bardzo przydać. Na przykład widzimy aktyw566

|

Rozdział 19. Rozwiązywanie problemów z siecią

ność w porcie 110. (POP3) w sytuacji, kiedy spodziewamy się jej tylko w porcie 995. (POP3s). Stąd wyciągamy wniosek, że gdzieś w sieci działa klient niezabezpieczonej poczty. Może się również zdarzyć, że zaobserwujemy ruch w porcie 25. (SMTP) w sytuacji, kiedy w systemie nie uruchamialiśmy serwera pocztowego lub ruch w tym porcie odbywa się nie na tym hoście, na którym jest zainstalowany serwer pocztowy. Może to oznaczać, że intruz włamał się na któryś z komputerów PC w naszej sieci i rozsyła z niego spam. Wystarczy rzut oka, aby stwierdzić, w jakim stopniu jest wykorzystywane pasmo. Dzięki temu można z łatwością znaleźć hosty, które najbardziej intensywnie wykorzystują pasmo. Program daje również wgląd w wiele innych danych.

Patrz także • strona macierzysta programu ntop: http://www.ntop.org/

19.12. Rozwiązywanie problemów z serwerami DNS Problem Uzyskujemy mnóstwo komunikatów o błędach unknown host6, zdarzają się przekroczenia limitu czasu albo zwroty wysłanych wiadomości. Pojawiają się również inne sygnały wadliwie działającego systemu DNS. Można się połączyć, używając adresów IP, ale jest to niemożliwe, jeśli stosujemy nazwy hostów. Co zrobić, aby znaleźć przyczynę tych problemów?

Rozwiązanie Można skorzystać z poleceń dig i host, by zobaczyć, jakie odpowiedzi zwraca nam serwer DNS. Nie należy używać polecenia nslookup, które od dawna nie jest polecane, a poza tym nie zawsze prawidłowo działa. Jedną z częstszych przyczyn problemów są prywatne i publiczne autorytatywne serwery nazw lub, co gorsza, jeden serwer obsługujący obydwa zadania. W szczególności chcielibyśmy mieć pewność, że prywatne żądania rozwiązywania nazw nie przechodzą do internetu. Najpierw uruchomimy polecenie host: $ host uberpc uberpc.krzak.net has address 192.168.1.76 $ host 192.168.1.76 76.1.168.192.in-addr.arpa domain name pointer uberpc.krzak.net.

Na razie wszystko wygląda dobrze, adres jest prawidłowy i odwrotny wskaźnik również jest dobrze skonfigurowany. Teraz uruchomimy polecenie dig, aby sprawdzić, do jakiego serwera zostało skierowane zapytanie: $ dig uberpc ; DiG 9.3.4 uberpc ;; global options: printcmd ;; Got answer: ;; ->>HEADERHEADERHEADER