Archiwa tagu: Linux

Firewall w systemd

Wszystkie współczesne dystrybucje Linuksa zrezygnowały z systemu init i przeszły na system daemon, czyli systemd, który jak każda nowość wzbudzał wiele kontrowersji, ale powoli stał się faktem. Ci, którzy mieli swoje własne aplikacje, daemony lub skrypty startowe muszą je przerabiać. Na swoje potrzeby również przerobiłem firewall znany użytkownikom systemu EOS.
Ten firewall opiera się na pliku konfiguracyjnym zawierającym interfejsy sieciowe, zasady routingu i porty, które użytkownik chce otworzyć. Plik jest umieszczony w specjalnie utworzonym katalogu /etc/firewall i nosi nazwę firewall.porty

EXTIF=
INTIF=
SSH=1
WWW=0
HTTPS=0
FTP=0
MAIL=0
IMAP=0
IMAPS=0
IDENT=0
RSYNC=0
NETWORK=0
PROXY=0
FORWARD=0

W tym pliku dopisujemy sieciowy interfejs zewnętrzny (EXTIF) i wewnętrzny (INTIF), jeśli jest oraz ustawiamy NETWORK na wartość 1, jeżeli mamy dwa interfejsy i chcemy, by komputer był routerem. W tym przypadku także możemy na 1 ustawić zmienną PROXY, jeśli zainstalujemy serwer proxy oraz zmienną FORWARD, o ile zamierzamy jakieś porty forwardować do wewnątrz sieci. W pliku domyślnym otwarty jest jedynie port SSH.
Z tej konfiguracji korzysta skrypt startowy, który również jest w /etc/firewall i nazywa się zwyczajnie – firewall.

#!/bin/sh
# Firewall
# plik z konfiguracją otwartych portów
. /etc/firewall/firewall.porty
i=`which iptables`
start() {
echo -n "Uruchamiam Firewall"
if [ -e /proc/sys/net/ipv4/tcp_ecn ];then
echo 0 > /proc/sys/net/ipv4/tcp_ecn
fi
echo 1 > /proc/sys/net/ipv4/ip_forward
if [ -e /proc/sys/net/ipv4/tcp_syncookies ] ; then
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
fi
for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
echo 1 > $f
done
$i -F
$i -F -t nat
$i -P INPUT DROP
$i -P FORWARD DROP
$i -P OUTPUT ACCEPT
# interfejs lo
$i -A INPUT -i lo -j ACCEPT
$i -A FORWARD -o lo -j ACCEPT
# blokada wirusów usługi RPC
$i -A INPUT -p tcp --dst 0/0 -m multiport --dport 135,445 -j DROP
$i -A FORWARD -p tcp --dst 0/0 -m multiport --dport 135,445 -j DROP
# Odrzucamy z komunikatem ICMP Port Unreachable polaczenia
# na IDENT oraz SOCKS (czesto sprawdzane przez serwery IRC)
# Jesli udostepniasz te uslugi zaplotkuj (#) odpowiedne linie
if [ "$IDENT" = "1" ]; then
$i -A INPUT -p tcp -i $EXTIF --dport 113 -j ACCEPT
$i -A INPUT -p tcp -i $EXTIF --dport 1080 -j ACCEPT
else
$i -A INPUT -p tcp --dst 0/0 --dport 113 -j REJECT --reject-with icmp-port-unreachable
fi
$i -A INPUT -p tcp --dst 0/0 --dport 1080 -j REJECT --reject-with icmp-port-unreachable
# reguła HTTP
if [ "$WWW" = "1" ]; then
$i -A INPUT -p tcp -i $EXTIF --dport 80 -j ACCEPT
fi
# reguła HTTPS
if [ "$HTTPS" = "1" ]; then
$i -A INPUT -p tcp -i $EXTIF --dport 443 -j ACCEPT
fi
# reguła FTP
if [ "$FTP" = "1" ]; then
$i -A INPUT -p tcp -i $EXTIF --dport 20 -j ACCEPT
$i -A INPUT -p tcp -i $EXTIF --dport 21 -j ACCEPT
fi
# reguła SMTP POP3
if [ "$MAIL" = "1" ]; then
$i -A INPUT -p tcp -i $EXTIF --dport 25 -j ACCEPT
$i -A INPUT -p tcp -i $EXTIF --dport 110 -j ACCEPT
$i -A INPUT -p tcp -i $EXTIF --dport 465 -j ACCEPT
$i -A INPUT -p tcp -i $EXTIF --dport 995 -j ACCEPT
fi
# reguła SSH (port SSH można zmienić poniżej na niestandardowy, jesli taki jest w sshd_config)
if [ "$SSH" = "1" ]; then
$i -A INPUT -p tcp -i $EXTIF --dport 22 -j ACCEPT
fi
# reguła IMAP
if [ "$IMAP" = "1" ]; then
$i -A INPUT -p tcp -i $EXTIF --dport 143 -j ACCEPT
$i -A INPUT -p udp -i $EXTIF --dport 143 -j ACCEPT
fi
# reguła IMAPS
if [ "$IMAPS" = "1" ]; then
$i -A INPUT -p tcp -i $EXTIF --dport 993 -j ACCEPT
$i -A INPUT -p udp -i $EXTIF --dport 993 -j ACCEPT
fi
# pingi pozwalamy
$i -A INPUT -p icmp --icmp-type echo-request -j ACCEPT -m limit --limit 1/sec
# forwardowanie portów
if [ "$FORWARD" = "1" ]; then
/etc/firewall/forward
fi
# Wszystkie polaczenia z innych interfejsow niz interfejs do internetu pozwalamy.
$i -A INPUT ! -i $EXTIF -j ACCEPT
$i -A FORWARD ! -i $EXTIF -j ACCEPT
# i maskujemy
if [ "$NETWORK" = "1" ]; then
$i -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
fi<>
# przekierowanie zmuszajace wszystkich do transparentnego korzystania z proxy
if [ "$PROXY" = "1" ]; then
$i -t nat -A PREROUTING -i $INTIF -p tcp --dport 80 -j REDIRECT --to-port 8080
fi
# Zezwalamy na wszystko co odbywa sie w ramach juz dozwolonych polaczen
$i -A INPUT -j ACCEPT -m state --state ESTABLISHED,RELATED
$i -A FORWARD -j ACCEPT -m state --state ESTABLISHED,RELATED
}
stop() {
echo -n "Zatrzymuję firewall, wszystko otwarte."
$i -F INPUT
$i -F FORWARD
$i -F OUTPUT
$i -P INPUT ACCEPT
$i -P FORWARD DROP
$i -P OUTPUT ACCEPT
echo 0 > /proc/sys/net/ipv4/ip_forward
}
restart() {
stop
start
# sprawdzanie czy dziala fail2ban
#PIDFAIL2BAN=`ls /var/run/fail2ban |grep pid|wc -l`
#if [ "$PIDFAIL2BAN" = "1" ]; then
#service fail2ban restart
#fi
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
iptables -L
;;
*)
echo "Używaj z argumentem: $0 start|stop|restart|status"
;;
esac

Do tego jest jeszcze pomocniczy forward, gdyby ktoś potrzebował forwardować porty do wewnątrz sieci. Musimy utworzyć dwa pliki forward.porty.tcp i forward.porty.udp w /etc/firewall/. W tych plikach umieszczamy adres komputera wewnątrz sieci, port na którym działa jakaś dostępna na nim usługa i port na adresie publicznym, na którym ta usługa ma być widoczna. Przykład: 192.168.1.22 80 82 (komputer w sieci, port serwera www, port na adresie publicznym, na którym ten serwer będzie widoczny). Niektóre usługi wymagają otwarcia portów UDP, np. gry lub torrenty.
Skrypt pod nazwą forward w /etc/firewall wygląda następująco:

#!/bin/bash
# uruchamianie forwardowania portów
. /etc/rc.firewall
i=`which iptables`
CONF=/etc/forward.porty.tcp
CONFudp=/etc/forward.porty.udp
#forwardowanie portow TCP
while read line; do
IP=`echo "$line"`
I1=`echo $IP | awk '{print $1}'`
I2=`echo $IP | awk '{print $2}'`
I3=`echo $IP | awk '{print $3}'`
if [ ! -z "$IP" ]; then
$i -I FORWARD -p tcp -d $I1 --dport $I2 -j ACCEPT
$i -t nat -A PREROUTING -i $EXTIF -p tcp --dport $I3 -j DNAT --to $I1:$I2
fi
done < $CONF

#forwardowanie portow UDP (część jest opcjonalna, można postawić znak # na początku każdej linijki lub tej części nie kopiować)
while read line; do
IP=`echo "$line"`
I1=`echo $IP | awk '{print $1}'`
I2=`echo $IP | awk '{print $2}'`
I3=`echo $IP | awk '{print $3}'`
if [ ! -z "$IP" ]; then
$i -I FORWARD -p udp -d $I1 --dport $I2 -j ACCEPT
$i -t nat -A PREROUTING -i $EXTIF -p udp --dport $I3 -j DNAT --to $I1:$I2
fi
done < $CONFudp

Teraz jeszcze musimy mieć skrypt uruchamiający. Wygląda on następująco:

[Unit]
Description = Firewall
After = syslog.target

[Service]
ExecStart = /etc/firewall/firewall start
RemainAfterExit = yes
ExecStop = /etc/firewall/firewall stop
RuntimeDirectory = etc
Restart = on-failure
KillSignal = SIGTERM
Type = simple

[Install]
WantedBy = multi-user.target

Ten skrypt umieszczamy w /etc/systemd/system/ pod nazwą firewall.service, a następnie wykonujemy dwa polecenia jako root:
systemctl enable firewall.service
systemctl start firewall.service
O ile nie zrobiliśmy żadnych błędów, to od tego momentu polecenie iptables -L pokaże nam zastosowane przez nas reguły. W skrypcie startowym zapewne nie wszystkie wpisy są potrzebne, bo firewall to nie jest daemon, tylko jednorazowo wykonujący się zestaw reguł. Jednak musiałem to zrobić błyskawicznie na działającym systemie i nie miałem czasu sprawdzać.

Jesienne liście

Wersja 32 bitowa systemu EOS to, podobnie jak i inne wersje, system bazujący na PCLinuxOS. Od motywu tapety na pulpicie nazwałem ja roboczo „Jesienne liście”, co nawiasem mówiąc, nie najgorzej łączy się z początkiem roku szkolnego. 😉
Bez wątpienia jest to ostatnia wersja 32 bitowa, ponieważ PCLinuxOS nie będzie rozwijał tej gałęzi oprogramowania. Dziś nawet najtańsze netbooki są 64 bitowe.
guest
Aby wypróbować system trzeba się zalogować jako użytkownik guest z hasłem guest. Gdy system będzie już na dysku będzie można po lewej stronie ekranu logowania zobaczyć utworzonych użytkowników. Na razie jest tam pusto. Żeby zainstalować system, trzeba się zalogować jako root z hasłem root.
install
Instalacja będzie wymagać utworzenia partycji i zapisania ich, przez tę część łatwo przeprowadzi nas program instalacyjny. Dobrze jest utworzyć oddzielną partycję /home, ponieważ dzięki temu w razie konieczności instalacji ponownej zachowamy dane użytkowników.
Bardzo istotną zaletą systemu jest możliwość wykonania własnej kopii systemu i użycie jej do zainstalowania na wielu komputerach.
Jak to zrobić?
Gdy już zainstalujemy system na dysku, z poziomu menedżera pakietów Synaptic należy zainstalować program Draklive-Install, który podczas instalacji na dysku jest usuwany. Oczywiście dopasowujemy też system do swoich wymagań, usuwamy zbędne aplikacje instalujemy te, które nam będą potrzebne. Dodajemy użytkowników i przypisujemy im hasła. A następnie uruchamiamy program wykonujący iso.
mylive
Wcześniej musimy założyć katalog, w którym zapiszemy iso. Ten sam katalog dodajemy do tych, które nie zostaną zapisane. To ważne, aby program nam się nie zapętlił. Na koniec kopiujemy iso na komputer, na którym wypalimy płytę DVD. Wypalamy i możemy powtarzać instalację na kolejnych maszynach.

Pliki do pobrania -> TUTAJ

EOS Desktop wersja 32bit

Wiele szkół ma stare pracownie, które uaktualniane były własnymi środkami. Jednak Windows XP dziś się nie da używać, Visty nie dało się używać nigdy. Stare komputery nadal w szkołach są i często opiekunowie sprzętu są o krok od przeznaczenia ich na złom. A pieniędzy na nowe nie ma. Mamy na to lekarstwo.
lxqt
System Eos Linux z lekkim pulpitem LXQT powinien nadawać się do instalacji na komputerach ze starymi procesorami typu Pentium 4 (i podobnymi). Wymaga 1GB pamięci RAM i około 20GB miejsca na dysku. Niezbędna jest również karta sieciowa, by system mógł korzystać z internetu.
Jeśli ktoś czuje się zawiedziony to – niestety – trzeba jasno powiedzieć, że choć Linux może pracować na starszym sprzęcie, to komputery ze stareńkim Pentium 2 i 128MB pamięci naprawdę do niczego się już nie nadają. Owszem można zainstalować tam Linuksa do poznawania zasad działania i uruchamiania programów CLI, ale nie nadaje się taki system dla dzieci w szkole. EOS ma nieduże wymagania, zainstalowano na nim wiele programów edukacyjnych, a jeszcze więcej nauczyciel może zainstalować, jeśli będą mu przydatne.
gcompris
Tę wersję skierowano przede wszystkim do nauczania dzieci młodszych. Można tam znaleźć między innymi znany pakiet edukacyjny Gcompris, a także wiele programów i gier z serii Tux. Jest także przeglądarka internetowa i pakiet biurowy Open Office.
italc
Ponadto został zainstalowany także znany nauczycielom program iTALC, który umożliwia monitorowanie komputerów uczniowskich lub udzielanie zdalnej pomocy.
System został przetestowany na maszynach wirtualnych, ale wymaga jeszcze porządnych testów na prawdziwych komputerach. Z tego względu zachęcam nauczycieli, by spróbowali i zostali testerami EOSa.

Przywracanie partycji Windows z poziomu Linuksa

Jest ogromna ilość sposobów na wykonywanie kopii i backupów systemu Windows, najczęściej przy użyciu specjalnych aplikacji, które z reguły są kosztowne.
Jest jednak sposób bardzo prosty…

Podczas Zjazdu Freesco Bartłomiej Czerwiński przedstawił sposób przywracania partycji Windows z poziomu Linuksa.
Wstęp
Poniższy tekst jest opracowaniem wykorzystującym ten właśnie wykład. W przypadku autora wykładu opracowany system służył do zarządzania pracowniami informatycznymi przeznaczonymi do celów edukacyjnych. Ponieważ studenci muszą mieć pełnie uprawnień w celu wykonywania ćwiczeń, więc nie ma mowy o ochronie systemu przez ograniczenie uprawnień użytkownika, co oznacza konieczność częstego przywracania systemu wraz z zainstalowanymi aplikacjami.
Można zresztą taki sposób wykorzystać również w przypadku stacji logujących się do domeny lub pojedynczych stacji roboczych. Warto tu wspomnieć, że nie można tego sposobu uznać za backup systemu, ponieważ w razie awarii dysku niestety stracimy także obraz. Dlatego w celu backupowania należałoby wykonane obrazy skopiować np. na serwer.
Od czego zacząć?
Najpierw instalujemy system Windows wraz ze wszystkimi potrzebnymi aplikacjami. Jeśli to pojedyncza stacja robocza, to warto zrobić osobna partycję na dokumenty i odpowiedni skonfigurować system, aby z niej korzystał. Należy pamiętać, że na Linuksa musimy zostawić tyle wolnego miejsca ile ma partycja systemowa Windows plus oczywiście miejsce potrzebne na zainstalowanie Linuksa.
W instalacji ćwiczeniowej wykorzystałem dysk 40 GB. Partycję systemową Windows założyłem w wielkości 7 GB, 10 przeznaczyłem na partycję z dokumentami użytkownika, zaś pozostałe miejsce zostało przeznaczone na Linuksa. Po zainstalowaniu i skonfigurowaniu Windows, można zacząć instalowanie Linuksa.
Dystrybucja, jaką wybierzemy, jest tu bez większego znaczenia. Jeśli na dysku ma być również system Linux do pracy, to sugeruję np. Mandrivę. Jeśli ma to być system wykorzystywany jedynie jako rescue, to raczej Slackware w minimalnej konfiguracji. Można też wykorzystać NND, ale procedura instalacji jest bardziej skomplikowana. Linuksa instalujemy na jednej dużej partycji (dodając ewentualnie swap, jeśli jest potrzebny).
Po zainstalowaniu Linuksa wykonamy kopię partycji z systemem Windows. Jest to bardzo prosta czynność, która potrwa od 10 do 15 minut. Po zalogowaniu się jako root wpisujemy polecenie:
cat /dev/hda1 > /root/xp.img
W tym przykładzie zrzucamy partycję systemową na dysku IDE do pliku xp.img w katalogu roota. Może to być dowolna inna ścieżka, jednak ważne, by ją zapamiętać.
Jak to się robi?
Jesteśmy zatem w sytuacji. gdy system Windows został zrzucony do pliku będącego obrazem partycji. Obraz ten ma taka wielkość jak partycja systemowa, nie został skompresowany (choć to byłoby możliwe), ponieważ wykonanie obrazu i przywracanie systemu bez kompresowania obrazu jest dużo szybsze.
Teraz już możemy sobie przygotować skrypty, które zautomatyzują czynności. Jest to istotne, ponieważ dzięki temu obecność administratora przy komputerach nie jest potrzebna. W Linuksie do pliku rc.local (może on być w /etc lub w /etc/init.d, lub tez w /etc/rc.d) dopiszemy kilka linijek.
cd /root
wget http://nasz.serwer/pracownia
chmod 755 pracownia
/root/pracownia

W naszym przykładzie skrypt rozpoczynający procedury nazywa się „pracownia”. Ten skrypt należy umieścić na serwerze i poleceniem wget ściągać na komputer. O samym skrypcie później napiszę dokładniej.
Teraz jeszcze na serwerze umieścimy kolejny skrypt, który będzie wykonywał wyznaczoną przez administratora procedurę. Nie popisaliśmy się fantazją i ten ostatni nosi po prostu nazwę „skrypt” Jego podstawowa zawartość służąca do przywrócenia systemu będzie wyglądać tak:
#!/bin/sh
echo „Zaczynam wykonywanie skryptu odzyskiwania systemu”
cat /root/xp.img > /dev/hda1
echo „Zakończono przywracanie systemu Windows”
echo „Zaczekaj na restart komputera”
reboot
Oczywiście w menedżerze startu domyślnym systemem jest Windows, bo w przeciwnym wypadku komputer wpadłby w pętlę.
W przypadku, gdy właśnie zaktualizowaliśmy oprogramowanie na komputerach i chcielibyśmy zrobić nowy obraz Windows, to zmieniamy nasz skrypt na serwerze:
#!/bin/sh
echo „Zaczynam wykonywanie obrazu systemu”
rm -fr /root/xp.img
cat dev/hda1 > /root/xp.img
echo „Zakończono wykonywanie obrazu Windows”
echo „Zaczekaj na restart komputera”
reboot
Oczywiście na wszelki wypadek możemy mieć jeszcze trzecią wersję tego skryptu:
#!/bin/sh
echo „Nie wykonuję, żadnych czynności”
echo „Zaczekaj na restart komputera”
reboot
Wystarczy nam jeden skrypt i w nim niepotrzebne linie zostaną zahaszowane (#). Wówczas tylko wystarczy usunąć znak # sprzed odpowiedniego fragmentu, aby uruchomić odpowiednią czynność.
Podsumowanie
No zakończenie umieszczamy na serwerze skrypt o nazwie pracownia. Należy go zmienić wpisując prawidłowy adres serwera ze skryptem (lub IP) oraz ewentualnie ścieżkę do pliku rc.local. Przedstawiony sposób może służyć do przywracania Windows na wielu różnych komputerach, w tym celu zamiast „skrypt” w pliku „pracownia” umieścimy odwołania do np. „skrypt1″ skrypt2” itd.
Odpowiednie pliki umieścimy też na serwerze. Dzięki temu możemy dokonać przywrócenia dowolnego systemu na dowolnym komputerze nie ruszając się z miejsca, a nawet zdalnie. Ponieważ jedyną czynność jaką w tym celu trzeba wykonać, to uruchomienie komputera, naciśnięcie „strzałki w dół” i potwierdzenia enterem. To potrafi na pewno wykonać nawet przysłowiowa już pani Zosia z sekretariatu.
Dodatkowe uwagi
Zamiast dowolnego Linuksa można w tym celu wykorzystać np. NND. Będzie się to tylko różniło sposobem instalacji. Można po zainstalowaniu Windows i zostawieniu odpowiedniej ilości wolnego miejsca zainstalować NND wg podanego na stronie NND sposobu. Ja podczas pisania tego tekstu wykorzystałem instalację NND w ten sposób, że najpierw wykonałem instalację z dużą partycją /boot, następnie po ponownym uruchomieniu z płyty, przekopiowałem /boot na partycję drugą, zmieniłem wpisy w fstab, dodałem wpisy dotyczące bootowania Windows i po zainstalowaniu systemu Windows jeszcze raz uruchomiłem komputer z płyty, żeby wykonać lilo. Oczywiście nie wolno zapomnieć, że to Windows ma być
systemem uruchamiającym się domyślnie.

Autor: W. Trąmpczyński (Maciek) na podstawie wykładu Bartka Czerwińskiego na VII Zjeździe Freesco w Tuchomiu.