Mała sieć domowa w oparciu o system Linux

Wpis zamieszczony o 17:57:35, 14 października 2007 - 58 komentarzy


Dzisiaj zajmiemy się tworzeniem małej, dość dobrze zabezpieczonej sieci domowej. Udostępnianie internetu zrealizujemy poprzez komputer-host z zainstalowanym systemem Linux (dowolnym, może być Ubuntu, Debian, Mandriva i inne). Pamiętajcie jednak, że Wasze środowisko może różnić się od środowiska zaprezentowanego w artykule – analizujcie treść a nie tylko przeklejajcie komendy do konsoli! Lecimy!

Załóżmy środowisko:

siec


Dla ułatwienia ustalmy hostname dla komputerów:


Oczywiście w sieci może być więcej komputerów – wystarczy do routera wsadzić większą ilość kart sieciowych. W przykładzie wykorzystałem 3 komputery z zainstalowanym systemem Debian GNU/Linux, nic jednak nie stoi na przeszkodzie aby był to jakikolwiek inny system operacyjny.

Dokładny opis naszej przykładowej sieci domowej:
Komputer1 (orion) ma 4 karty sieciowe na złączu PCI:

[22:00:05] night@orion:~$ lspci | grep -i ether
02:05.0 Ethernet controller: 3Com Corporation 3c940 10/100/1000Base-T [Marvell] (rev 12)
02:0b.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)
02:0c.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8029(AS)
02:0d.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139C+ (rev 10)


W kolejności są to interfejsy od eth0 do eth3, przy czym interfejs eth0 (gigabitowa karta 3com) jest wpięta do sieci internet dostając adres z klasy prywatnej 192.168.0.10.

<22:02:26> root@orion:/home/night# ifconfig eth0
eth0      Link encap:Ethernet  HWaddr 00:0E:2E:90:A7:37
          inet addr:192.168.0.10  Bcast:192.168.0.255  Mask:255.255.255.0
          inet6 addr: fe80::20e:2eff:fe90:a737/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:2274170 errors:0 dropped:0 overruns:0 frame:0
          TX packets:2224882 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:2140325129 (1.9 GiB)  TX bytes:1161463487 (1.0 GiB)
          Interrupt:21 Base address:0xd400

Konfiguracja kart sieciowych


Zaczynamy od konfiguracji pozostałych kart sieciowych. W tym celu wyedytujemy plik /etc/network/interfaces w poniższy sposób:

(...)
auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
address 10.0.0.1
netmask 255.255.255.0

auto eth2
iface eth2 inet static
address 10.0.1.1
netmask 255.255.255.0

auto eth3
iface eth3 inet static
address 10.0.2.1
netmask 255.255.255.0
(...)


I restart sieci:

# /etc/init.d/networking restart


To tyle w kwestii kart sieciowych. Teraz DHCP!

Konfiguracja serwera DHCP


Na początek szybka instalacja:

# apt-get install dhcp3-server


... i konfiguracja:

# rm /etc/dhcp3/dhcpd.conf; nano -w /etc/dhcp3/dhcpd.conf


W pliczku (który będzie pusty) wpisujemy dla każdej podsieci:

subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.3 10.0.0.254;
default-lease-time 6100;
option domain-name „nasza.domena”;
option domain-name-servers pierwszy.dns, drugi.dns;
option routers 10.0.0.1;
option subnet-mask 255.255.255.0;
option broadcast-address 10.0.0.255;

host scorpio { # komputer nr 1
      hardware ethernet adres.mac;
      fixed-address 10.0.0.2;
  }
}


Oczywiście zmieniamy domenę, dns’y na własne a adres.mac wypełniamy adresem MAC komputera nr 1 (scorpio). Pozwoli nam to przypisywać jeden i zawsze ten sam adres IP dla tej maszyny. Dla reszty podsieci deklarujemy podobnie:

subnet 10.0.1.0 netmask 255.255.255.0 {
range 10.0.1.3 10.0.1.254;
default-lease-time 6100;
option domain-name „nasza.domena”;
option domain-name-servers dns,pierwszy, dns.drugi;
option routers 10.0.1.1;
option subnet-mask 255.255.255.0;
option broadcast-address 10.0.1.255;


host scorpio { hardware ethernet adres.mac; fixed-address 10.0.1.2; } }


Analogicznie dla podsieci trzeciej zmiejając odpowiednio ustawienia IP w konfiguracji. Drobna zmiana w skrypcie startowym:

# nano -w /etc/default/dhcp3-server


gdzie definiujemy interfejsy na których działać ma serwer DHCP

INTERFACES="eth1 eth2 eth3"


... i restart demona

/etc/init.d/dhcp3-server restart


W tym momencie możemy sprawdzić, czy nasze stacje robocze otrzymały adres sieciowy (należy odświeżyć ustawienia IP na każdym z nich). Jeśli wszystko zrobiliśmy dobrze powinniśmy móc pingować każdy z naszych komputerów. Pozostało nam udostępnienie dla nich internetu.

Udostępnianie sieci


W tym celu stworzymy dodatkowy skrypt startowy:

# nano -w /etc/init.d/firewall


Do którego to wpiszemy następujące regułki iptables:

#linijka potrzebna do włączenia udostępniania internetu
echo 1 > /proc/sys/net/ipv4/ip_forward
#wyczyszczenie starych reguł z pamięci iptables
iptables -F
iptables -X
iptables -t nat -X
iptables -t nat -F
# ustawienie domyślnej polityki (o tym później)
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A FORWARD -o lo -j ACCEPT
# Najważniejsze - udostępnienie sieci dla wybranych podsieci
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.0.2.0/24 -j MASQUERADE


Plik zapisujemy, nadajemy mu prawa wykonywalności:

# chmod +x /etc/init.d/firewall


dopisujemy do standardowych runleveli:

# update-rc.d firewall defaults 90


i odpalamy:

# /etc/init.d/firewall


W tym momencie mamy działający internet na wszystkich 3 komputerach. Voila! Trzy ostatnie linijki w skrypcie powinny stworzyć nam odpowiednią tablicę routingu:

# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.0        0.0.0.0         255.255.255.0   U     0      0        0 eth1
10.0.1.0        0.0.0.0         255.255.255.0   U     0      0        0 eth2
10.0.2.0        0.0.0.0         255.255.255.0   U     0      0        0 eth3
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0


Dzięki tym wpisom komputery w sieci domowej będą „widzieć się wzajemnie”. Możemy to sprawdzić pingując hosta scorpio z hosta omega, lub na odwrót. No i najważniejsze – możemy korzystać z internetu na wszystkich końcówkach podpiętych do sieci domowej :-).

Powiedzmy jednak, że to nas nie satysfakcjonuje. Chcemy mieć możliwość logowania się poprzez ssh do każdego z komputerów w sieci domowej. Musimy zatem zająć się forwardowaniem portów.

Przekierowanie portów


Aby przekierować wybrany port z hosta A na nasz router musimy na końcu naszego skryptu firewall dopisać:

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 800 -j DNAT --to 10.0.0.2:22


Co to robi? Forwarduje każde zapytanie przychodzące na port 800 karty sieciowej eth0 na adres 10.0.0.2, port 22 w sieci lokalnej. Zatem, jeśli odpytamy nasz router z sieci zewnętrznej w ten sposób:

$ ssh <user>@<host> -p 800


Dostaniemy de facto połączenie z komputerem z adresem 10.0.0.2 w sieci lokalnej. W naszym przykładzie będzie to scorpio. Dodajmy resztę hostów:

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 800 -j DNAT --to 10.0.0.2:22
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 801 -j DNAT --to 10.0.1.2:22
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 802 -j DNAT --to 10.0.1.2:22


I w ten sposób mamy możliwość zalogowania się na każdy z naszych komputerów w sieci domowej z zewnątrz.

Jutro opiszę sposób zabezpieczenia naszego routera przed najpopularniejszymi atakami z zewnątrz w przypadku gdy posiadamy publiczny adres IP. Enjoy!
W artykule mogły pojawić się błędy i nieścisłości. Będzie on zaktualizowany w przypadku wykryciu takowych.

Czytaj dalej : 58 komentarzy

„Błąd szyny” – opis problemu

Wpis zamieszczony o 02:36:09, 14 października 2007 - 9 komentarzy


Od pewnego czasu miałem ciągłe problemy z moim komputerem stacjonarnym. Zawieszał się, restartował, wywalały się X’y, rozłączały karty sieciowe czy też nagle tracił całą tablicę routingu dla sieci domowej. Winę za to zwalałem na Debiana Sid z kilkoma paczkami z Experimental. Czasem pomagała reinstalacja pakietu, czasem zmiana wersji, czasem zaś restart komputera. Do dziś...

Włączając rano komputer zaniepokoił mnie komunikat apt’a:

(...)
ldconfig: /usr/lib/libdb-4.6.so - plik jest skrócony
(...)


... i tak kilkukrotnie. Googlowanie niezbyt mi pomogło, musiałem wychodzić do pracy. Zostawiłem włączony sprzęt.

W pracy zauważyłem ciekawą rzecz – padł mi serwer poczty. Szybkie logowanie do domku po ssh, postfix i:

# postconf -e
Błąd szyny


Eeee? Mało tego:

# postfix
Błąd szyny


że co?!

$ iceweasel -no-remote
Błąd szyny


Nie no, to za wiele….

# apt-get install --reinstall iceweasel
segmentation fault
Błąd szyny



Opis błędu


„Błąd szyny” to tak naprawdę SIGBUS wysłany do procesu. Świadczy on o złym przydzieleniu miejsca w pamięci operacyjnej dla procesu, przez co nie może on zostać wykonany. Najczęściej przyczyną „błędu szyny” jest uszkodzenie pamięci RAM.

Analiza błędu


Wykonałem (zdążyłem wykonać) 2 czynności:
# memtester 500MB
Które szło sobie w tle dość szybko, oraz:

# strace postfix


Które pokazało bardzo ciekawą rzecz:

(...)
open("/usr/lib/libdb-4.6.so", O_RDONLY) = 3
read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\260a\1"..., 512) = 512
fstat64(3, {st_mode=S_IFREG|0644, st_size=1336100, ...}) = 0
mmap2(NULL, 1340944, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_DENYWRITE, 3, 0) = 0xb7e79000
mmap2(0xb7fbb000, 12288, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_DENYWRITE, 3, 0x142) = 0xb7fbb000
mmap2(0xb7fbe000, 9744, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0xb7fbe000
****** SIGBUS *******
# 


Odwołanie do pliku /usr/lib/libdb-4.6.so siedzącego w 0xb7fbe000 powodowało SIGBUS. Podejrzenie padło na tą właśnie komórkę pamięci. Przyjrzałem się dokładnie /usr/lib/libdb-4.6.so i co się okazało to już chyba łatwo przewidzieć. Biblioteka ta siedziała sobie na tym adresie pamięci a każde odwołanie do tej komórki kończyło się SIGBUS. Przełączenie konsoli na lecącego w tle memtestera pokazało prawdę – memtester wyrzucił SIGBUS a po kilkunastu sekundach miałem piękny kernel panic… Co oczywiście poskutkowało utraceniem połączenia SSH.

Morał


Jeśli kiedykolwiek napotkacie na SIGBUS w swoim komputerze, na dziwne błędy w stylu „Błąd szyny” bądź też na niestabilną pracę wielu niezależnych programów – przetestujcie swoje komponenty, w szczególności pamięć RAM i nie bagatelizujcie problemu… A teraz modlę się aby sprzęt w domu dało się odratować.

Czytaj dalej : 9 komentarzy

KNetworkManager, KPowerSave i problemy z uprawnieniami

Wpis zamieszczony o 16:43:27, 19 września 2007 - 1 komentarz


Ostatnia aktualizacja Debiana Sid była dość desktrukcyjna dla mojego systemu… Padł GIMP (niezgodność wersji gimp i gimp-data), dodanie nowych X-ów spowodowało błędy ABI o których pisał Hadret i co chyba najgorsze – uruchamianie KPowerSave oraz KNetworkManager powodowało po kilku(nastu) sekundach sprzętowe zwisy komputera… Dodatkowo – KNetworkManager nie widział żadnych interfejsów sieciowych a KPowerSave nie potrafił regulować częstotliwości pracy procesora i podświetlenia matrycy. Uruchomienie tych aplikacji pod kontem roota dawało pozytywne efekty (wszystkie opcje działały), jednak tylko przez kilkanaście sekund – sprzętowy zwis. Słowem – koszmar na kilkadziesiąt minut zabawy…

Dla potomności i samoinformacji (swoisty reminder) zamieszczam rozwiązanie problemu z KPowerSave i KNetworkManager. Cała wina leży po stronie D-BUS a raczej jego najnowszej wersji, która wprowadza zaawansowane profile uprawnień. Zaglądając do:

$ cat /etc/dbus-1/system.d/knetworkmanager.conf


Widzimy „policies„, czyli nasze profile. I co? „Default„ jest na ustawione na „deny„ w każdym przypadku… Hmmm… Patrząc dalej zauważamy sygnowaną grupę, dla której flagi ustawione są na „allow„. No to:

# groupadd night netdev


Bądź też zmieniamy ustawienia „Default„ – wtedy każdy użytkownik będzie miał dostęp do zmiany ustawień sieci poprzez knetworkmanager. Analogicznie postępujemy dla kpowersave i innych programów, które korzystając z D-BUS poprawnie działają pod root‘em a na kontach użytkowników sprawiają problemy..

Voila! Wiem, nie wysiliłem się z wpisem, ale siedziałem troszkę nad tym aby zrozumieć mechanizm działania nowego systemu D-BUS. Boję się KDE4, które całe przejdzie na D-BUS...

Czytaj dalej : 1 komentarz

Touchlib i OpenTouch czyli ekrany wielodotykowe

Wpis zamieszczony o 14:41:34, 18 września 2007 - 21 komentarzy


Pamiętacie film „Raport Mniejszości”? John Anderton korzystał w nim z ekranu dotykowego dużej rozdzielczości do „podglądania” przyszłości. Fikcja? Nie, ta technologia jest już w zasięgu ręki! No, może nie podglądanie przyszłości :-).

Ekran wielodotykowy to urządzenie, które pozwala komunikować się z użytkownikiem poprzez wygodny interfejs panelu dotykowego. Co go jednak wyróżnia to możliwość rozpoznawania wielu równoczesnych zdarzeń, np. używania panelu przez kilka osób jednocześnie.

Firma Microsoft zaprojektowała i stworzyła Microsoft Surface. Projektem zainteresowało się wojsko, kasyna w Vegas i największe hotele świata. Możecie sobie tylko wyobrazić jak wiele pieniędzy to może kosztować.
O samym Microsoft Surface możecie poczytać tutaj a prezentację macie poniżej:




Zapytacie pewnie – a jaki ma to związek z Wolnym Oprogramowaniem? Ma i to dość spory. Touchlib i OpenTouch to otwarte biblioteki do obsługi paneli wielodotykowych. Co ciekawe OpenTouch rozwijane jest przez naszego rodaka: Pawła Sołygę!.

No to super. Mamy całkowicie otwarte biblioteki do obsługi panelu wielodotykowego ale… ciągle nie mamy samego ekranu… Więc czemu sobie takowego nie zbudować?

NUI Group to grupa miłośników technologii naturalnych interfejsów komunikacyjnych. Na ich stronie oraz forum możemy znaleźć osoby, które zajmują się tworzeniem na własną rękę ekranów w technologii Frustrated Total Internal Reflection (FTIR). Sam mechanizm takiego panelu działa na zasadzie całkowitego węwnętrznego odbicia w dość grubej warstwie pleksi.



Złożenie ekranu wielodotykowego jest dość drogie i zajmuje troszkę czasu. Mały ekran 12×15cm możemy zbudować za około 600zł, duże panele (ponad metr szerokości) kosztować nas mogą do kilku tysięcy złotych. Po szczegółowe informacje na temat budowy zapraszam na forum NUI Group, a poniżej krótka prezentacja z możliwości własnego panelu wielodotykowego obsługiwanego przez otwarte bilbioteki touchlib:




Prezentację konkretnego zastosowania możecie zobaczyć na tej stronie (polecam).

Jak się to ma do systemu GNU/Linux? Touchlib i OpenTouch można bez problemu uruchomić i oprogramować pod dowolnym systemem Linuksowym. Dodatkowo – istnieje projekt MPX. MPX to modyfikacja Serwera X tak, aby mógł on korzystać z bilbioteki TouchLib. Wyobrażacie sobie na tym Compiza? :-)

I już na koniec: Touchlib jest wieloplatformowy (uruchamia się na praktycznie każdym sprzęcie, od Maców po PC), wydajny (szybkie działanie zapewnia średniej klasy komputer PC), skalowalny i wolny. Cóż więcej chcieć? Chyba zaczynam odkładać pieniążki na MyBox – mały panel wielodotykowy budowany przez NUI Group za cenę około 250zł. Niestety, nie wyświetla on obrazu, pozwala tylko pobawić się samych Touchlib…

Czytaj dalej : 21 komentarzy

Conky 1.4.7 dla Debiana (paczka deb)

Wpis zamieszczony o 13:23:55, 13 września 2007 - 16 komentarzy


Dwa tygodnie temu wydana została najnowsza wersja monitora systemowego Conky. Jak zwykle już – zbudowałem paczkę dla systemu Debian Sid. Paczka powinna zadziałać także w Debianie z gałęzi Testing. W tej wersji programiści dodali:



Aby ściągnąć paczkę kliknij TUTAJ


Jeśli czegoś zabraknie w powyższej paczce proszę o powiadomienie, zbuduje się nową z „dodatkowymi funkcjonalnościami”.

ENJOY!

Czytaj dalej : 16 komentarzy

LinkLift