Koko Software
Oprogramowanie dla prawdziwych profesjonalistów.
RSS
  • Główna
  • O mnie

Adipex without prescription

Wywołanie skryptu przez IPTABLES, czyli automatyczne uruchomienie serwera

openWrt, Sieci komputerowe Dodaj komentarz

Podczas realizacji rozproszonej bramki SMS w ramach projektu na uczelnie uruchamiałem na swoim komputerze serwer. Obsługiwał on modem GSM oraz umożliwiał połączenie za pomocą pulpitu zdalnego. Ponieważ serwer ten nie był nam potrzebny przez cały czas, komputer również nie musiał ciągle pracować. Zdecydowałem się, na jego automatyczne uruchamianie podczas próby nawiązania połączenia z serwerem. Do realizacja zadania postanowiłem wykorzystać mój router pracujący pod kontrolą openWrt.Pierwszym zadaniem, była realizacja uruchamiania komputera za pomocą routera. Ponieważ jest on podłączony do sieci za pomocą kabla Ethernet, wykorzystałem funkcje Wake on Lan. Jej konfiguracja sprowadza się do sprawdzenia odpowiednich ustawień w BIOSie oraz konfiguracji karty sieciowej w systemie operacyjnym. Do wysyłania magicznych pakietów z poziomu routera wykorzystałem program wol autorstwa Thomasa Krennwallnera. Odpowiednia paczka jest dostępna w repozytorium openWrt i można ją zainstalować wykonując poniższe polecenia.

opkg update
opkg install wol

Odpowiedni pakiet wysyłam za pomocą polecenia:

wol MAC -h IP

podając adres MAC mojej karty sieciowej, oraz adres IP. Program nie wymaga podania adresu IP docelowego komputera, a w przypadku jego pominięcia pakiet zostanie wysłany na adres rozgłoszeniowy 255.255.255.255. W praktyce podanie adresu IP okazało się niezbędne, ponieważ router nie wiedział, do którego interfejsu sieciowego go przekazać. Podanie w tym miejscu adresu IP przypisanego karcie sieciowej też nie do końca zadziała. W przypadku gdy komputer wcześniej był odłączony od sieci elektrycznej, karta sieciowa nie zna jeszcze swojego adresu IP. Okazało się, że w takim przypadku moja karta sieciowa ignorowała odebrany pakiet, pomimo zgodności adresów MAC. Rozwiązaniem opisanych problemów jest użycie adresu rozgłoszeniowego podsieci, czyli w moim przypadku 192.168.1.255. Alternatywnie można dodać odpowiednią trasę do tablicy routingu. Polecenie wybudzające komputer umieściłem w malutkim skrypcie /root/wakeup.sh. Przyda nam się on w dalszej części.

#!/bin/sh
wol 00:11:22:33:44:55 -h 192.168.1.255
exit 0

Należy pamiętać o nadaniu skryptowi prawa do wykonania przy użyciu polecenia:

chmod +x /root/wakeup.sh

Kolejnym zadaniem było wykrycie próby nawiązania połączenia TCP/IP z wybraną usługą na moim komputerze. Do realizacji tej czynności wykorzystałem iptables. Niestety program ten nie pozwala na regułą na wykonywanie poleceń. Na szczęście poza prostym przyjmowaniem lub odrzucaniem pakietów, jest możliwość logowania ich wystąpienia. Dodatkowo logowane pakiety można oznaczyć dowolnym prefiksem. Właśnie z tych dwóch możliwości postanowiłem skorzystać. Pakiety TCP/IP zawierające flagę SYN (chęć ustanowienia połączenia) loguje oznaczając je swoim prefiksem, zawierającym mój identyfikator oraz polecenie do wykonania. Ponieważ długość prefiksu jest ograniczona tylko do 29 znaków, to w praktyce wszystkie instrukcje do wykonania należy umieścić w pliku. Przygotowana przeze mnie reguła logująca próbę nawiązania połączenia z serwerem prezentuje się następująco:

iptables -I forwarding_wan_rule -d IP -p tcp –syn –destination-port PORT -j LOG –log-prefix “KokoLogRun: SKRYPT “

Zawiera ona adres IP oraz PORT komputera do którego próbę połączenia chce zalogować i dotyczy pakietów przekazywanych przez (do i z) strefę WAN firewalla. Przekierowanie portu należy osobno skonfigurować. Po prefiksie KokoLogRun: umieściłem nazwę skryptu do wykonania, w moim przypadku było to /root/wakeup.sh. Koniecznie po niej należy umieścić spację, aby było możliwe rozdzielenie nazwy skryptu od identyfikatora interfejsu źródłowego. Domyślnie nie jest ona umieszczana po prefiksie. Tak przygotowaną regułę umieściłem w pliku /etc/firewall.user , który zawiera reguły firewalla użytkownika. Plik ten jest includowany przez /etc/config/firewall. Warto sprawdzić, czy i jaki plik reguł użytkownika jest przez niego dołączany. W moim przypadku plik ten zawierał następujący fragment:

config include
option path ‘/etc/firewall.user’
option reload ‘1’

Przykładowy log wystąpienia pakietu prezentuje się następująco:

Mar 27 22:24:36 router kern.warn kernel: [ 1380.580000] KokoLogRun: /root/wakeup.sh IN=eth0.2 OUT=eth0.10 MAC=d8:d3:85:34:b8:ae:00:30:48:65:de:ca:08:00:45:00:00:34 SRC=46.113.67.6 DST=192.168.1.10 LEN=52 TOS=0x00 PREC=0x00 TTL=115 ID=30421 DF PROTO=TCP SPT=50343 DPT=80
Mar 27 22:27:02 router kern.warn kernel: [18527.120000] KokoLogRun: /root/wakeup.sh IN=eth0.2 OUT=eth0.10 MAC=d8:d3:85:34:b8:ae:00:30:48:65:de:ca:08:00:45:00:00:34 SRC=178.36.101.75 DST=192.168.1.10 LEN=52 TOS=0x00 PREC=0x00 TTL=118 ID=18892 DF PROTO=TCP SPT=53930 DPT=80

Najbardziej kłopotliwa okazała się ostatnia część. Potrzebowałem narzędzia, które odczytywałoby na bieżąco log systemowy, parsowało go i ewentualnie wykonywało umieszczone w nim polecenie. Log systemowy odczytuje na bieżąco wykorzystując polecenie logread -f. Do parsowania linii i wykonywania skryptu użyłem narzędzia awk. Program ten sprawdza podane wzorce dla każdej linii pliku wejściowego, i przy znalezieniu dopasowania wykonuje zadane instrukcje. Jego ogromną zaletą jest automatyczne dzielenie linii wejściowych na osobne pola. W moim przypadku, jeśli 8 lub 9 pole zawiera ciąg “KokoLogRun:”, to zostaje wykonane polecenie odpowiednio z pola 9 lub 10. Numer pola, w którym znajduje się mój prefiks zależy od czasu działania systemu. Jest on umieszczony w nawiasach kwadratowych i posiada stałą szerokość 12 znaków. Jeśli system jest krótko uruchomiony (do 2h 46m  40s) to w nawiasie znajdzie się spacja. Spowoduje ona zinterpretowanie tego fragmentu jako dwa pola, co przesunie lokalizacje naszego prefiksu. Nie chciałem jednak zaprzęgać do tego zadania kolejnego narzędzia, ani komplikować programu dla awk. Dlatego po prostu dodałem kopie reguły zawierającą zmienioną numerację pól. Całe przygotowane polecenie prezentuje się następująco:

/sbin/logread -f | /usr/bin/awk ‘$8 == “KokoLogRun:” {system($9)} $9 == “KokoLogRun:” {system($10)}’&

Początkowo chciałem utworzyć z tego usługę, uruchamianą za pomocą Init tworząc specjalny skrypt w katalogu /etc/init.d/. Okazało się jednak, że wieloczłonowego polecenia nie da się uruchomić w ten sposób. Próbowałem również uruchomić te dwa programy osobno, łącząc ich wejścia oraz wyjścia za pomocą nazwanego potoku (ang. named pipe) utworzonego za pomocą mkfifo. Niestety program awk nie jest przystosowany do ich obsługi. Nie sprawdza on cyklicznie, czy są dostępne nowe dane. Finalnie porzuciłem swoje eleganckie plany. Dodałem na końcu polecenia & nakazując tym samym wykonanie polecenia w tle i postanowiłem dopisać przygotowaną linie do istniejącego już pliku startowego. Wybór padł na ostatnią linię funkcji start() pliku /etc/init.d/boot.

Aby cała maszyneria zaczęła działać, należy zrestartować router, lub przeładować konfigurację firewalla i ręcznie uruchomić parser logów systemowych:

/etc/init.d/firewall reload
/sbin/logread -f | /usr/bin/awk ‘$8 == “KokoLogRun:” {system($9)} $9 == “KokoLogRun:” {system($10)}’&

Teraz po próbie nawiązania połączenia z internetu do naszego komputera w logach systemowych powinniśmy zobaczyć zapisany pakiet wraz z informacją o wybudzaniu naszego komputera.

Mar 27 22:27:02 router kern.warn kernel: [18527.120000] KokoLogRun: /root/wakeup.sh IN=eth0.2 OUT=eth0.10 MAC=d8:d3:85:34:b8:ae:00:30:48:65:de:ca:08:00:45:00:00:34 SRC=178.36.101.75 DST=192.168.1.10 LEN=52 TOS=0x00 PREC=0x00 TTL=118 ID=18892 DF PROTO=TCP SPT=53930 DPT=80
Waking up 00:50:BA:BC:26:53 with 192.168.1.255:40000...

Wykorzystanie tak przygotowanego systemu jest bajecznie proste. Wystarczy spróbować nawiązać połączenie z naszym serwerem aby go uruchomić. Następnie odczekać parę minut na jego wystartowanie i ponownie się połączyć.


27 marzec 2014  
Tagi: iptables, openwrt, router, run, sieć, wol

Zostaw odpowiedź

Musisz się zalogować aby móc komentować.

  • Kategorie

    • Bez kategorii
    • Gadu-Gadu
    • openWrt
    • Programy
      • C++
      • Delphi
      • PHP
      • Turbo Pascal
    • Reverse engineering
    • Sieci komputerowe
    • Strona
    • Tlen
    • WTW
  • Archiwa

    • maj 2022
    • marzec 2014
    • październik 2012
    • wrzesień 2011
    • lipiec 2010
    • styczeń 2010
    • listopad 2009
    • wrzesień 2009
    • lipiec 2009
    • czerwiec 2009
    • maj 2009
    • kwiecień 2009
    • luty 2009
    • sierpień 2008
    • lipiec 2008
    • czerwiec 2008
    • maj 2008
  • Ostatnie wpisy

    • Windows Notification Facility (WNF) IDs from Windows 10.0.19041.1503
    • Wywołanie skryptu przez IPTABLES, czyli automatyczne uruchomienie serwera
    • Źródła kokoNotifier
    • Szybkie, darmowe i wygodne pobieranie z Wrzuta.pl bez Javy!
    • kokoNotifer – Specjalnie powiadomienia o dostępności wybranych kontaktów
    • (Wielki) powrót Koko
    • TlenRadio – Wrzuta.pl 1.3.2.10
    • GGAvatar 1.1.4.8
    • GG8Proto 1.2.0.16
    • GGAvatar 1.1.3.8
  • Linki

Kategorie
  • Bez kategorii
  • Gadu-Gadu
  • openWrt
  • Programy
    • C++
    • Delphi
    • PHP
    • Turbo Pascal
  • Reverse engineering
  • Sieci komputerowe
  • Strona
  • Tlen
  • WTW
O mnie

Witaj na www.kokosoftware.pl, gdzie znajdziesz zawsze najbardziej aktualne wersję programów komputerowych mojego autorstwa.

Witaj, nazywam się Adrian Warecki i jestem programistą komputerowym, twórcą stron internetowych, wtyczek i konsultantem z zakresu informatyki. Więcej o mnie

Copyright © 2022 Koko Software Wszystkie prawa zastrzeżone XHTML CSS Skórka Wp autorstwa I Software Reviews, tłumaczenie: Skórki WP