LM3.pdf
(
299 KB
)
Pobierz
Layout 1
PROGRAMOWANIE
Python
Python przyjacielem administratora
WĄŻ NA USŁU
GACH
Jedną z największych zalet Pythona jest jego prostota.
Pokażemy, w jaki sposób administratorzy
i programiści mogą wykorzystać ten język w pracy z adresami IP i nazwami domenowymi.
ADNS
Konwersja adresów IP znajdujących się w lo-
gach serwerów na nazwy domenowe jest wy-
konywana automatycznie, najczęściej przez
jeden z typowych skryptów korzystających ze
standardowych bibliotek systemowych. Jest
to jednak rozwiązanie najgorsze z możli-
wych, bowiem
gethostbyname ()
może za jed-
nym razem obsłużyć tylko jedno zapytanie
i cały proces trwa bardzo długo, zwłaszcza je-
śli mamy do przerobienia dziesiątki czy na-
wet setki tysięcy adresów.
Znacznie lepiej w tej roli sprawdza się
biblioteka asynchroniczna GNU ADNS [1].
Ma ona szereg zalet, z których najważniejszą
jest możliwość przetwarzania wielu zapytań
równocześnie ze względu na nieblokujący
sposób działania. Biblioteka ta idealnie
sprawdza się w typowych zastosowaniach, na
przykład przy sprawdzaniu nazw hostów czy
poszczególnych rekordów DNS. Wraz z bi-
blioteką rozpowszechnianych jest kilka pro-
gramów narzędziowych, które pozwalają do-
cenić wydajność ADNS.
Bibliotekę i narzędzia instalujemy w Debia-
nie (i klonach, takich jak Ubuntu) poleceniem:
nshost
, wersja standardowego programu host,
przeznaczona zwłaszcza do wykorzystania
w skryptach. Prosty przykład użycia
adnsres-
filter
znajduje się na Listingu 1.
Z kolei pythonowe dowiązania do biblio-
teki ADNS instalujemy poleceniem:
(0, None, 1225824153,
(’80.237.227.144’,))
Początkowe zero oznacza, że zapytanie
powiodło się.
None
wskazuje, że zapytanie
nie dotyczyło bądź nie zawiera formy kano-
nicznej. Na ostatniej pozycji mamy krotkę
z adresem IP. Z kolei czas odpowiadający
wartości
1225824153
łatwo sprawdzamy za
pomocą poniższej sekwencji:
apt-get install python-adns
Zobaczmy, jak w praktyce wygląda korzy-
stanie z interfejsu do naszej biblioteki; używa-
my w tym celu interpretera Pythona. Najpierw
importujemy moduł i inicjujemy bibliotekę:
import time
time. ctime (1225824153)
import adns
s = adns. init ()
W rezultacie otrzymujemy dokładną datę
i godzinę utraty ważności naszego zapytania.
W ten sposób możemy łatwo skonstru-
ować zapytania dotyczące innych typów re-
kordów, w tym PTR. Aby jednak odwzoro-
wać adresy IP na nazwy domenowe, musimy
pamiętać o odwrotnej notacji z
in-addr. arpa
.
Przykładowo, jeśli chcemy sprawdzić, czy
faktycznie
127.0.0.1
zostanie odwzorowany
jako
localhost
, wydajemy polecenie:
Możemy teraz utworzyć zapytanie. Odpo-
wiedź zawsze otrzymujemy w postaci krotki
(sta-
tus, CNAME, przedawnienie, odpowiedź właściwa)
.
Status
oznacza kod błędu,
CNAME
to nazwa ka-
noniczna (jeśli zapytanie nie odnosi się do niej,
zwracana jest wartość
None
),
przedawnienie
to
czas, kiedy odpowiedź traci wartość, zaś
odpo-
wiedź właściwa
zawiera krotkę z rekordami, któ-
rych format zależy od zapytania.
Weźmy prosty przykład:
s.synchronous(”1.0.0.127.
in-addr.arpa”, adns. rr. PTR)
apt-get install adns-tools
W rezultacie w systemie zainstalowana
zostaje sama biblioteka wraz z przykładami:
adnslogres
, ultraszybka wersja standardowego
logresolve
rozprowadzanego wraz z Apache,
adnsresfilter
, filtr przepisujący wejście z pod-
mianą adresów IP na nazwy domenowe i
ad-
s.synchronous(”linux-magazine.pl”,
adns. rr. A)
W ten sposób możemy łatwo napisać
skrypt sprawdzający nazwy hostów w danej
sieci. Przyjrzyjmy się Listingowi 2. Sprawdza
on po kolei nazwy wszystkich hostów z sieci
213.180.130.* i jeśli znajdzie jakiś adres IP po-
siadający nazwę domenową, wyświetli daną
parę na standardowym wyjściu. Pierwszych
kilka wierszy możemy zobaczyć na Listingu 3.
Oznacza on, że dokonujemy synchro-
nicznego zapytania o rekord DNS A dla do-
meny
linux-magazine. pl
. Oto, co otrzymamy
w rezultacie:
Listing 1: Prosty przykład użycia filtra adnsresfilter
GeoIP
Geolokalizacja umożliwia – do pewnego
stopnia i w przybliżeniu – określenie fizycz-
nego umiejscowienia danego hosta. Bardzo
$ echo Wykryto skanowanie portów z hosta 217.74.65.119 | adnsfilter
Wykryto skanowanie portów z hosta other. interia. pl
72
NUMER 59 STYCZEŃ 2009
WWW.LINUX-MAGAZINE.PL
Python
PROGRAMOWANIE
Listing 2: Prosty skrypt sprawdzający nazwy hostów
w danej sieci
Jednak za pomocą bazy GeoLiteCity
i dowiązań do Pythona uzyskujemy znacznie
więcej informacji niewiele większym wysił-
kiem. Przede wszystkim importujemy odpo-
wiedni moduł:
import adns
s = adns. init ()
for i in range (255):
ip = str (i) + “. 130.180.213. in-addr. arpa”
a = s. synchronous (ip, adns. rr. PTR)
if a[3]:
print (ip + “==>” + a[3][0])
import GeoIP
Następnie podajemy ścieżkę do bazy,
którą pobraliśmy ze strony firmy MaxMind:
Listing 3: Fragment wyniku działania skryptu z Li-
stingu 2
geoip_lib = ‘/usr/local/share/
GeoIP/GeoLiteCity. dat’
Następnie otwieramy bibliotekę:
12.130.180.213. in-addr. arpa ==> spubserv. onet. pl
13.130.180.213. in-addr. arpa ==> z3virt. onet. pl
14.130.180.213. in-addr. arpa ==> ckxvirt. onet. pl
17.130.180.213. in-addr. arpa ==> newsgate1. onet. pl
18.130.180.213. in-addr. arpa ==> newsgate. onet. pl
27.130.180.213. in-addr. arpa ==> rtsp. onet. pl
28.130.180.213. in-addr. arpa ==> smtp4. poczta. onet. pl
29.130.180.213. in-addr. arpa ==> smtp3. poczta. onet. pl
30.130.180.213. in-addr. arpa ==> smtp2. poczta. onet. pl
31.130.180.213. in-addr. arpa ==> smtp1. poczta. onet. pl
32.130.180.213. in-addr. arpa ==> smtp5. poczta. onet. pl
33.130.180.213. in-addr. arpa ==> smtp-marlin. poczta. onet. pl
gi = GeoIP. open (geoip_lib, GeoIP.
GEOIP_STANDARD)
Drugi argument powyżej wskazuje na
sposób przechowywania bazy. Oprócz stan-
dardowego mamy też możliwość przechowy-
wania bazy w pamięci podręcznej (
GEO-
IP_MEMORY_CACHE
), przy czym każdy
kraj zajmuje około 1 MB, jak również w pa-
mięci dzielonej (
GEOIP_MEMORY_SHA-
RED
). Wybór zależy od zastosowań – powin-
niśmy go określić podczas testów na danych,
na których będziemy operować.
Samo zapytanie wykonujemy następująco:
często wykorzystują to firmy reklamujące
swoje produkty i usługi w Internecie dla od-
biorców w różnych krajach: nawet jeśli po-
tencjalny klient odwiedza stronę angielskoję-
zyczną, jego uwagę przyciągnie ogłoszenie
w ojczystym języku.
Administratorzy spotykają się z geoloka-
lizacją choćby poprzez skrypty generujące
statystyki na podstawie logów serwera
WWW. Dane te mogą być bardzo istotne,
zwłaszcza dla firm działających globalnie. Je-
śli okaże się, że dynamicznie rośnie liczba
gości z danego kraju, jest to silny argument
za stworzeniem wersji witryny w tym właśnie
języku. Interesująca może być również anali-
za zmian zachowań klientów z różnych kra-
jów na przestrzeni czasu.
Chcąc efektywnie skorzystać z mechani-
zmów geolokalizacji, potrzebujemy przede
wszystkim dobrego narzędzia. Firma Ma-
xMind publikuje bazy geolokalizacyjne
w wersji darmowej i komercyjnej, jak rów-
nież zestaw narzędzi, bibliotek i dowiązań
dla różnych języków – w tym dla Pythona.
Przede wszystkim powinniśmy pobrać dar-
mowe bazy ze strony [1]. Pliki z bazami rozpa-
kowujemy i umieszczamy w katalogu
/usr/lo-
cal/share/GeoIP/
. Wystarczy nam jedynie plik
GeoLiteCity. dat
– zawiera on bardziej szczegóło-
we dane niż
GeoLiteCountry. dat
. Oczywiście bar-
dzo zależy nam na dużej dokładności, możemy
wykupić dostęp do baz komercyjnych, jednak
różnice wynoszą kilka dziesiątych procenta.
Następnie instalujemy odpowiedni pa-
kiet. W Debianie robimy to na przykład za
pomocą:
gi. record_by_name (“home. pl”)
Rezultat możemy obejrzeć na Listingu 3.
Jak widzimy, możemy uzyskać całkiem sporo
danych, co oczywiście nie oznacza, że zawsze
są one dokładne. Mimo to bardzo często do-
kładność wyników zwracanych przez zapyta-
nia GeoIP może nas zdziwić.
Na koniec
Python oferuje znacznie więcej narzędzi
związanych z obróbką adresów IP i nazwami
domenowymi; przedstawiliśmy tu jedynie
dwa przykłady zastosowań. Mamy nadzieję,
że zainspirowaliśmy do wykorzystania
przedstawionych w artykule mechanizmów
we własnych skryptach.
Listing 3
{‘city’: ‘Szczecin’, ‘region_name’:
‘Zachodniopomorskie’, ‘region’: ‘87’,
‘area_code’: 0, ‘time_zone’: ‘Euro-
pe/Warsaw’, ‘longitude’:
14.58329963684082, ‘country_code3’:
‘POL’, ‘latitude’:
53.416698455810547, ‘postal_code’:
None, ‘dma_code’: 0, ‘country_code’:
‘PL’, ‘country_name’: ‘Poland’}
apt-get install python-geoip geoip-bin
INFO
W ten sposób instalujemy zarówno narzę-
dzia do sprawdzania hostów, jak i dowiązania do
Pythona. Narzędzie
geoiplookup
pozwala spraw-
dzić, w jakim kraju znajduje się dany host:
[1] Strona domowa projektu ADNS:
http://www.gnu.org/software/adns/
[2] Darmowe bazy geolokacyjne krajów
i miast:
http://www.maxmind.com/app/geoli-
tecountry, http://www.ma-
xmind.com/app/geolitecity
$ geoiplookup mon. gov. pl
GeoIP Country Edition: PL, Poland
WWW.LINUX-MAGAZINE.PL
NUMER 59 STYCZEŃ 2009
73
Plik z chomika:
grzegorj
Inne pliki z tego folderu:
.NET + Python = IronPython.pdf
(727 KB)
A Learner's Guide to Programming Using the Python Language (2009).pdf
(17233 KB)
A Primer on Scientific Programming with Python, 2nd Edition (2011).pdf
(5083 KB)
A Primer on Scientific Programming with Python, 3rd Edition.pdf
(5392 KB)
Alex Martelli, David Ascber - Python Cookbook.pdf
(1593 KB)
Inne foldery tego chomika:
Agnieszka Nowak-Brzezińska
Beazley.David-Programowanie.Python.2002-iNTERnet
Flask Tutorial
Google Class Python
Jan Jełowicki
Zgłoś jeśli
naruszono regulamin