Archiv pro štítek: linux

Linux: Automatický restart kernel panic a notifikace

Linux jako každý komplexní operační systém se může dostat do stavu kdy přestane dělat co je po něm požadováno, v lepším připadě zhavaruje (kernel panic) v horším se dostane do nepredikovaného stavu, kdy něco dělá nevím bohužel co nebo to není možné zjistit, např. vysoký load (zátěž) systému znemožňuje navázení ssh, systém laguje apod.

Vetšina moderních serverů je dnes vybavena systémem KVM(klavesnice-video-myš) pro přístup přes IP síť (bez ohledu na stav operačního systému, umožňuje to tak řešit havarijní stavy), v případě virtualizace je naopak často možné připojit se ke konsoli systému bez ohledu na jeho stav či poslat povel reboot přímo z hypervisoru.

Co dělat v případě, že Váš fyzický server má problém a k dispozici nemáte žadné uvedené možnosti?

Lenivý admin nechodí do serverovny :-).

Pokud máte štěstí a funguje SSH lze leco řešit, může se ovšem stát, že SSH poslouchá, ale už není schoné vytvořit celý proces shellu (např. proto, že jiný proces sežral celou pamět a server divoce swapuje), mužete zkusit tento trik a poslat příkazy k rebootu stroje přímo, pokud to klapne máte stěstí a po rebootu budete zkoumat co se dělo.

ssh root@mojeservery.cz \
'echo 1 > /proc/sys/kernel/sysrq; echo b > /proc/sysrq-trigger'

V druhém terminálu si nejlépe spusťte ping na problémový server, v případě rebootu dojte k výpadku ICMP echo reply odpovědí, počkejte, je možné, že se bude např. provádět kontrola filesystému (fsck), buďte trpělivý.

Druhá variace je odpovědí na havarijní stav, jádro systému zastavilo svůj běh po neopravitelné chybě a skončilo pádem v unix světe pojmenovaném příznačně “kernel panic”, takže server prostě stojí, nic nedělá a čeká, až ho někdo (admin) rebootuje, z tohoto stavu lze ovšem také “vybruslit” a vynutit automatický reboot po kernel panic.

# echo 30 >/proc/sys/kernel/panic

Toto nastavení na běžícím systému způsobí reboot po 30 vteřinách pokud nastane kernel panic (hodnota 0 je vypnutí rebootu, výchozí), nastavení je vhodné uložit do systému pokud je chcete mít implicitně zapnuté.

Vložte řádek kernel.panic = 30 do souboru /etc/sysctl.conf a zavolejte příkaz pro aktualizaci parametrů běžícího jádra.

# sysctl -p

Patrametry ze sysctl.conf budou načteny, i po rebootu bude vše dle nastavení.

Notifikace po rebootu? Byla by více než vhodná, malá třešnička na dortu, démon cron na to má speciální flag @reboot, přidejte do svého crontabu tento řádek (upravte dle svého SMTP serveru a emailu).

@reboot date | mailx -S smtp=smtp://smtp.mojeservery.cz -s "hostname Rebootovan server!" -r server@mojeservery.cz admin@mojeservery.cz

Přejeme hodně vysoký uptime a co nejméně podobných problémů.

František Havel, MOJEservery.cz

Linux: Redhat tahák pro příkaz ip

Nemůžete si stále zapamatovat syntax “nového” nástroje ip pro práci se sítí v Linuxu? (proč “” nástroj ip, byl představen již pro linux jádro 2.2, ale zvyk v podobě ifconfig je železná košile).

Přirozeně můžete dokumentaci najít v manuálových stráchkách, ale při hledání jednoduché referenční příručky jsem narazil na RedHat tahák (cheat sheet), chtěl jsem něco co lze vytisknout, pověsit a mít to stále na očích až se to člověku vryje paměti a našl jsem, tak posílám dále.

PDF pro tisk rh_ip_command_cheatsheet_1214_jcs_print.

Tak trénujte. Díky František Havel

rh_ip_command_cheatsheet_1214_jcs_print-page-001

rh_ip_command_cheatsheet_1214_jcs_print-page-002

Linux: Nové DNS servery pro síť TaNET

Pro našeho zákazníka společnost TaNET West s.r.o. provozující rozsáhlou počítačovou síť a lokálního internetového poskytovatele jsem vytvořili dvojici nových DNS serverů pro jeho klienty.

DNS (Domain Name System) je hierarchický systém doménových jmen, který je realizován servery DNS a protokolem stejného jména. Jeho hlavním úkolem jsou vzájemné převody doménových jmen a IP adres uzlů sítě, laicky řečeno je to služba pro převod doménového jména (např. www.mojeservery.cz) na IP adresu (46.167.204.50) se kterou pracují počítače, ale pro lidi je obtížně zapamatovatelná.

Z předchozího textu vyplývá důležitost DNS serverů jako jedné z klíčových komponent celého internetu, proto je vhodné provozovat ve větších sítích vlastní DNS a nespoléhat se na cizí služby (pro poskytovatele internetu je v to podstatě nutnost).

Dvojice nových rekurzivních DNS serverů TaNET:
  • 1x fyzický server
  • 1x virtuální server
  • operační systém Linux Debian 8 Stable 64bit
  • DNS server bind9
  • optimalizovaná konfigurace
  • podpora DNSSEC
  • cache
  • ACL (allow-query, allow-recursion, allow-transfer)
  • response-rate-limiting
  • možnost blokování konkrétních domén nebo celých stromů
  • reverzní záznamy (master-slave AXFR transfer)
  • fail2ban, firewall
  • NTP synchronizace času
  • SNMP pro monitoring stavu stroje
  • SMTP exim4 (relayhost, pouze notifikace)
  • WWW rozhraní pro snadnou editaci reverzních zón

Děkujeme za možnost realizace, bylo to fajn, přejeme vysoký uptime a hodně úspěšných resolvů (překladů).

František Havel

Linux: Firewall Iptables v příkladech

Zcela bez komentáře, linux firewall iptables v pár jednoduchých příkladech.

firewall status
# iptables -L -n -v
# iptables -n -L -v --line-numbers
# iptables -L INPUT -n -v
# iptables -L OUTPUT -n -v --line-numbers
Smazání všech pravidel (-F), chainu(-X), výchozí politika chainu(-P)
# iptables -F
# iptables -X
# iptables -t nat -F
# iptables -t nat -X
# iptables -t mangle -F
# iptables -t mangle -X
# iptables -P INPUT ACCEPT
# iptables -P OUTPUT ACCEPT
# iptables -P FORWARD ACCEP

# iptables -P INPUT DROP
# iptables -P OUTPUT DROP
# iptables -P FORWARD DROP
Insert a delete pravidel
# iptables -L INPUT -n --line-numbers
# iptables -I INPUT 10 -s 192.168.0.0/16 -j DROP
# iptables -L INPUT -n --line-numbers
# iptables -D INPUT 10
# iptables -D INPUT -s 192.168.0.0/16 -j DROP
Zahodit veškerý příchozí trafik i předávaní mezi rozhraním (forward), povolit pouze odchozí (ze stroje)
# iptables -P INPUT DROP
# iptables -P FORWARD DROP
# iptables -P OUTPUT ACCEPT
# iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
Zahození privátních rozsahů na rozhraní do internetu (eth0)
# iptables -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP
# iptables -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP
# iptables -A INPUT -i eth0 -s 192.16.0.0/16 -j DROP
# iptables -A INPUT -i eth0 -s 224.0.0.0/4 -j DROP
# iptables -A INPUT -i eth0 -s 240.0.0.0/5 -j DROP
# iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
  • 10.0.0.0/8 -j  (A
  • 172.16.0.0/12  (B)
  • 192.168.0.0/16 (C)
  • 224.0.0.0/4 (MULTICAST D)
  • 240.0.0.0/5 (E)
  • 127.0.0.0/8 (LOOPBACK)
Blokovaní příchozí, odchozí adresy, rozsahu, portu
# iptables -A INPUT -s 1.2.3.4 -j DROP
# iptables -A INPUT -s 192.168.0.0/24 -j DROP
# iptables -A INPUT -p tcp --dport 80 -j DROP
# iptables -A INPUT -i eth1 -p tcp --dport 80 -j DROP
# iptables -A OUTPUT -d 1.2.3.4 -j DROP
# iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
# iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP
Logování, burst a drop
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -m limit --limit 5/m --limit-burst 7 -j LOG --log-prefix "IP_SPOOF A: "
# iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP
Zahození podle MAC
# iptables -A INPUT -m mac --mac-source d4:3d:7e:27:79:fc -j DROP
Blokování/povolení ICMP echo request/reply (ping)
# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# iptables -A INPUT -i eth1 -p icmp --icmp-type echo-request -j DROP
# iptables -A INPUT -s 192.168.1.0/24 -p icmp --icmp-type echo-request -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
Otevření skupiny(rozsahu) portů
# iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 7000:7010 -j ACCEPT
Manipulace s rozsahem adres
# iptables -A INPUT -p tcp --destination-port 80 -m iprange --src-range 192.168.1.100-192.168.1.200 -j ACCEPT
Povolení služeb
## ssh tcp port 22 ##
iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
## CUPS (tisk pouze z LAN) ##
iptables -A INPUT -s 192.168.1.0/24 -p udp -m udp --dport 631 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -p tcp -m tcp --dport 631 -j ACCEPT
## NTP ##
iptables -A INPUT -m state --state NEW -p udp --dport 123 -j ACCEPT
## SMTP ##
iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j ACCEPT
# DNS ##
iptables -A INPUT -m state --state NEW -p udp --dport 53 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 53 -j ACCEPT
## http/https (Apache) ##
iptables -A INPUT -m state --state NEW -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp --dport 443 -j ACCEPT
## POP3 ##
iptables -A INPUT -m state --state NEW -p tcp --dport 110 -j ACCEPT
## IMAP ##
iptables -A INPUT -m state --state NEW -p tcp --dport 143 -j ACCEPT
## Samba (pouze z LAN) ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 137 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 138 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 139 -j ACCEPT
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 445 -j ACCEPT
## PROXY (pouze z LAN) ##
iptables -A INPUT -s 192.168.1.0/24 -m state --state NEW -p tcp --dport 3128 -j ACCEPT
## mysql ##
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
Omezení počtu paralelních spojení (SSH 3 spojení z jedné IP adresy, HTTP 80 spojení z adres resp. seskupenou pod /24 IPv4 masku hosta)
# iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 3 -j REJECT
# iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j DROP

 

František Havel

OPENWRT: Realizace levné VPN sítě TP-LINK WR1043ND, Nexx WT3020F

Ukázkové nasazení alternativního firmware OpenWrt v routerech TP-LINK a Nexx s cílem realizace levné firemní VPN (Virtuální privátní sítě) infrastuktury (propojení poboček s centrálou).

Za málo peněz hodně muziky, když potřebujete ze svého routeru vymáčknout něco navíc zkuste alternativní firmware OpenWrt a možná budete překvapeni.

Proč jsme použili OpenWrt? Narazili jsme na potřeby našeho nového klienta, malá firmička s centrální office (zde leží server a data, nějaky přechod do cloudu zatím nehrozí) a tři mikro-pobočky (pro představu mikro = 1-2 lidi = 1-2 stolní PC, 1 tiskárna, připojení přes místní wifi, bez veřejné statické IP, potřeba se připojit specializovaných programem na server do centrály).

Ilustrace dokresluje topologii budoucí VPN sítě.

blog-penwrt-vpn

Situace vcelku jasná, další požadavek byl velmi levně :-(. (nedáte si na wifi linku za 400Kč/měsíčně CISCO VPN za “majlant”, navíc jsme dostali informaci, že jednu z poboček už dvakrát vykradli, to je svět, že).

S OpenWrt a OpenVPN s tím lze něco dělat, železo “zdarma” a placená bude práce, tedy konfigurace, jelikož VPN routery se navíc mají na pobočky pouze zaslat pošlou poštou s připravenou konfigurací a vzdáleně dokonfigurovat.

TP-LINK WR1043ND – centrála ~ cena 1000Kč starší model

  • Atheros AR9132@400MHz
  • 32MB RAM
  • 8MB FLASH
  • 4x LAN, 1x WAN

Otestována rychlost OpenVPN, s AES se lze dostat na ~ 8Mbit, při použití “horšího” šifrování (3DES) lze dostat ~ 12Mbit při cca 40% zátěži CPU. (v přípádě problému dle dohody lze tento prvek vyměnit za rychlejší, ale vzhledem k rychlostem přípojek poboček zatím asi netřeba).

blog-openwrt-1   blog-openwrt-4  blog-openwrt-6 blog-openwrt-7 blog-openwrt-8  blog-openwrt-10

Jako OS použit zmiňovaný OpenWRT, poslední stable verze Barrier Braker, konfigurace služby OpenVPN, routing a firewall.

Nexx WT3020F – pobočky, malý zázrak za 15$

  • model WT3020F
  • MIPS MT7620n, 580MHz
  • 64MB RAM
  • 8MB FLASH
  • 2 x Ethernet 100 Mbps
  • 1x WIFI 2.4 GHz 802.11n
  • 1x USB host (podpora pro 3G GSM moduly)
  • 1x Serial

nexx.wt3020a.top nexx.wt3020a.bottom nexx.wt3020a.top.board

WT3020 je opravdu takový malý zázrak, hned jsme objednali i kousky na sklad, pro případ potřeby, nainstalováno OpenWrt, vytvořen OpenVPN tunel v režimu klienta, na LAN portu připraven DHCP server, dopředu před celou akcí rozmyšlen adresní plán pro rozsahy jednotlivých poboček a centrály.

Lokální přístup k internetu není směrován do VPN tunelu, směruje se aktuálně pouze rozsah pro server a do budoucna je plánováno osazení VoIP telefonů na pobočky a připojení do centrály opět stejným VPN tunelem s možností implementace QoS pro VoIP provoz.

A to je vše, zde je pěkně vidět, že i za málo peněz lze udělat hodně muziky a postavit VPN pobočkou síť nemusí nutně stát velké peníze a drahý hardware, vše záleží na možnostech a potřebách klienta, z toho je potřeba zvolit vhodné rešení.

VPN pro všechny! Máte dotazy k technologii VPN či OpenWrt, chcete pomoci s nasazením podobného řešení pro mále pobočky, pokladny, krámky (realizujeme VPN i přes GSM síť) nebo se jen chcete poradit, napište na kontaky.

Díky za Váš čas. František Havel

Linux: Debian Hyper-v Live(online) Backup (VSS, KVP démon)

Testováno Debian Wheezy/Jessie, podpora pro online backup (live machine backup) do System Center (Data Protection).

http://docs.homelinux.org/downloads/hv_kvp_daemon-master.zip ||

https://github.com/v10networks/hv_kvp_daemon

# apt-get install unzip gcc automake make
# cd /usr/src
# wget http://docs.homelinux.org/downloads/hv_kvp_daemon-master.zip
# unzip hv_kvp_daemon-master.zip
# cd hv_kvp_daemon-master
./bootstrap.sh
./configure
# make
# make install
# cp init/deb/hv_* /etc/init.d/
# update-rc.d -f hv_kvp_daemon defaults
# update-rc.d -f hv_vss_daemon defaults
# /etc/init.d/hv_kvp_daemon start
# /etc/init.d/hv_vss_daemon start

# dmesg | grep hv_utils
hv_utils: VSS daemon registered
hv_utils: KVP: user-mode registering done.

# ps afx | grep hv_
/usr/sbin/hv_vss_daemon
/usr/sbin/hv_kvp_daemon
debian-hyperv-live-backup-datacenter
Data protection manager (system center)

Pokud se VM bude tvářit stále pouze jako offline backup, označne hosta a dejte refresh, online nabídka by se měla zobrazit.

František Havel

Linux: sTrace debug

Jedna z často zmiňovaných předností unix systémů je rozsáhla sada nástroju pro diagnostiku, debug, za to velký, ale opravdu velký dík.

Jedním z těchto nástrojů je také strace. Strace monitoruje systémová volání a signály pomocí speciálního syscallu ptrace, který slouží pro trasování bežícího kódu programu, ptrace je rozsahlá a velmi silná záležitost, dokaže se napojit na proces, krokovat ho, zasahovat do jeho paměti, odchýtávat signály apod, je také výužíváno oblíbeným GNU debugerem gdb.

(Pozn.: ptrace na první pohled vypadá jako pěkná bezpečnostní díra díky možnosti kontroly na jiným procesem, typicky je proto toto volání umožněho pouze potomkům procesu nebo speciálně pro Linux řízení pomocí capabilities SYS_PTRACE, toto ovšem neplatí pro roota)

Pokud netušíte co nebo k čemu jsou systémová volání a signály netrapte se, dejte si pořádný pohár jahodové zmrzliny se šlehačkou a hoďte to za hlavu nebo se můžete podívat např. do knihy Jádro systému Linux od Lukáše Jelínka.

Systémová volání (system call, syscall) představuji v informatice mechanismu komunikace programu s jádrem operačního systému, program po dobu svého životního cyklu buď volá funkce systému nebo si něco počítá.

Příkladem takového volání je např. sys_open pro otevření souboru nebo sys_read resp. sys_write pro čtení resp. zápis do deskriptoru (rozuměj souboru).

Syscallů je značné množství, přesto je snaha udržet jejich počet na rozumném počtu, překotný vývoj a implementace byl pro např. Linux ve verzích 1.x, 2.x, ze své povahy jde o relativně stabilní část jádra.

http://man7.org/linux/man-pages/man2/syscalls.2.html

Velmi pěkný článek o syscall na IBM Developer.
https://www.ibm.com/developerworks/linux/library/l-system-calls/
Signály představují jeden z nástroju meziprocesové komunikace, obecně se celá tato oblast označuje jako IPC(Inter-Process Communication), jde o formu výměny jednoduchých zpráv, pokud je procesu zaslán signál, operační systém přeruší jeho výkonávání (pozn. nechytáme se za slovo, k přeřušení může dojít pouze během NE-atomické operace) a zavolá se obsluha (handler, rutina) signálu, pokud vše "dobře" dopadne systém vrátí zpět řízení a původní proces běží dál.


Strace prakticky malá ukázka, zkusme si představit malý program bez dostupnosti zdrojového kódu, říkejme mu pwd (ano pwd součastí coreutils, ale to není podstatné), pustíme na něj strace.

root@havel-machine:/tmp/strace# strace pwd
execve("/bin/pwd", ["pwd"], [/* 23 vars */]) = 0
brk(0)                                  = 0xb3d000
access("/etc/ld.so.nohwcap", F_OK)      = -1 ENOENT (No such file or directory)
mmap(NULL, 8192, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2b2b01e000
access("/etc/ld.so.preload", R_OK)      = -1 ENOENT (No such file or directory)
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
...
...
...
getcwd("/tmp/strace", 4096)             = 12
fstat(1, {st_mode=S_IFCHR|0600, st_rdev=makedev(136, 11), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f2b2b01d000
write(1, "/tmp/strace\n", 12/tmp/strace
)           = 12
close(1)                                = 0
munmap(0x7f2b2b01d000, 4096)            = 0
close(2)                                = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Výstup jsem zkrátil, ale v jednoduchosti, na levé straně vidíme použitá systémová volání na pravé pak jejich návratové hodnoty (číslo za =), co vidíme na první řádce sámotné spuštění programu pwd (za nás to udělal shell) pomocí syscall execve, následuje volání brk bez parametrů vrací aktuální hodnotu datového segmentu a pak tanečky kolem oprávnění, LD_PRELOAD a dynamického linkeru, až téměr na konci je zavoláno systémové volání getpwd vracející jako návratovou hodnotu aktuální pracovní adresář (ano, na to je také syscall), následuje vypsání této hodnoty na terminál pomocí opět systémového volání write (povšimněte si hodnoty 1 u volání write, jako první argument této funkce je tzv. číslo deskriptoru kam se bude zapisovat, hodnotu 1 reprezentuje v unix světe tzv. stdout [standartní výstup], 0 = stdin [standartní vstup], 2 = [standartní chybový výstup], takže vlastně výpis dat na terminál není nic jiného než zápis do soubor, skvělé že).

Pěkné co to umí dál? Mohou se občas hodit jen statistické údaje.

root@havel-machine:/tmp/strace# strace -c pwd
/tmp/strace
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 24.36    0.000104          12         9           mmap
 14.75    0.000063          21         3         3 access
 11.48    0.000049          12         4           mprotect
 11.24    0.000048          16         3           open
  9.13    0.000039          20         2           munmap
  8.43    0.000036           7         5           close
  6.56    0.000028           7         4           fstat
  5.15    0.000022          22         1           write
  2.34    0.000010           3         3           brk
  2.34    0.000010          10         1           execve
  1.87    0.000008           8         1           read
  1.41    0.000006           6         1           getcwd
  0.94    0.000004           4         1           arch_prctl
------ ----------- ----------- --------- --------- ----------------
100.00    0.000427                    38         3 total

Další užitečnost, filtrování pouze specifických volání nebo skupin (skupiny určíte -e trace=skupiny, např. -e trace=file,network,process, viz man strace)

root@havel-machine:/tmp/strace# strace -e open,write pwd
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/usr/lib/locale/locale-archive", O_RDONLY|O_CLOEXEC) = 3
write(1, "/tmp/strace\n", 12/tmp/strace
) = 12
+++ exited with 0 +++

Napojení se na běžící proces je jedna z dalších užitečných vlastností, v praxi lze narazit na situaci, kdy program buď nedělá co má (čéka na něco) nebo naopak něco dělá a dělá to tak rychle jak dokáže (typicky vytěžuje jedno celé jádro systému), chceme většinou zjistit co se děje.

root@havel-machine:/tmp/strace# strace -c -p 3117
Process 3117 attached
Process 3117 detached
% time seconds usecs/call calls errors syscall
------ ----------- ----------- --------- --------- ----------------
 47.67 0.000143 2 80 78 recvmsg
 47.00 0.000141 4 40 poll
 3.00 0.000009 5 2 writev
 2.33 0.000007 7 1 restart_syscall
------ ----------- ----------- --------- --------- ----------------
100.00 0.000300 123 78 total

Parametrem (-p PID) jsme se připojili k běžícímu procesu, v tomto případě komunikátor pro IM, zajímá nás pouze statistika, vídíme, že proces neustále “polluje” deskriptor (v tomto případě síťový soket, ale opět je chování velmi podobné souboru) a přijímá zprávy ze socketu přes volání recvmsg, opět je možné si detailně zobrazit volání a přidat např. timestamp (-t), čítač instrukcí (-i) nebo filtrovat pomocí (-e) kategorie volání.

Toto chování s napojením na běžící proces je velmi užitečné, v případě zaseknutí procesu např. při otevírání souboru uvidíme jeho snadu o přístup, lze si tedy udělat představu co program očekává a případně mu trochu pomoci.

!!! Pozor !!!
 
Používání strace sebou nese značný výkonový overhead (penalizaci v podobě rychlosti vykonávání trasovaného programu), pro představu v ukázce použitý nástroj pwd se při trasování zpomalil ~ 10x, úplným extrémem trasování nástroje dd při dd if=/dev/zero of=/dev/null došlo k jeho zpolení více než 200x., intenzivní I/O operace jsou penalizovány razantně, dejte na to pozor.

Blížíme se k samotnému závěru, jak bylo v úvodu řečeno, unix (linux) disponuje značným množstvím diagnostických nástroju, je důležité používat spravným nástroj na správnou část jádra, následující obrázek pěkně ilustruje co a kde by mohlo Vám pomoci.

Viditelnost strace je především pro systémová volání.

linux_observability_tools

Zazvonil zvonec a debugu je konec, a tahle funguje strace, díky tomu, že porozumíte jaká systémová volání používá proces jste schopní odhadnout jak a proč se chová.

Až budete zase na něco v terminálu zdlouhavě čekat vzpomeňte si na strace, mimochodem teď už Vás asi nepřekvapí, že volání sleep je také samozdřejme syscall.

Pro fajnšmekry ukázka co se dá realitovat s ptrace volání, program retty od Petra Baudiše, aneb jak se dostat v terminálu programu (mutt) když jsem zapomělo pustit screen, slušný hack, nicméně asi již nefunkční, ale i tak respekt.

Abych nezapoměl man strace je jako vždy dobrý pomocník.

Děkuji za Váš čas. František Havel

Linux: Fail2ban a Mikrotik firewall

Bezpečnost a ochrana skupiny serverů jako celku je velmi efektivní, pojďme si ukázat jak elegantně spojit firewall Mikrotik s řešením Fail2ban a chránit tak skupinu serverů jako jeden celek.

Fail2ban, nástroj dobře znám z unix světa, co dělá, jak funguje, v jednoduchosti scanuje log soubory, hledá chybné pokusy o přihlášení na jejich základě blokuje (ban) IP adresu utočníka po určitou dobu v lokálním firewallu serveru, jednoduché.

Složitěji?

Mějme následující situaci, Mikrotik jako hraniční firewall a router, za routerem skupina fyzických či virtuálních serverů, cílem je propojit fail2ban na serverech, tak aby upravovaly firewall na hraničním routeru, tedy ban bude probíhat na firewallu.

Proč?

Je pravděpodobně, že skupina serverů sdílý společný rozsah veřejných IP adres v případě pokusu o napadení jednoho serveru se automaticky začné chránit celý rozsah a to chceme, chránit celek je většinout(nikoliv vždy) efektivnější.

Obrázek pro dokreslení situace.

linux-fail2ban-mikrotik

Mikrotik firewall router

Základem je mít možnost přístupu na router Mikrotik via ssh, nejlépe pomocí klíčů, vygeneruje si tedy pár veřejný-soukromý klíč, přenést a importovat veřejný klíč na firewall router, nezadávejte při generování passphrase!

root@raspberrypi:~# ssh-keygen -t dsa
 Generating public/private dsa key pair.
 Enter file in which to save the key (/root/.ssh/id_dsa):
 Enter passphrase (empty for no passphrase):
 Enter same passphrase again:
 Your identification has been saved in /root/.ssh/id_dsa.
 Your public key has been saved in /root/.ssh/id_dsa.pub.
 The key fingerprint is:
 ac:6c:02:92:bb:b0:b8:e4:4d:bc:ac:c6:eb:1b:cd:

Vzniklý soubor id_dsa.pub přeneste na Mikrotik router (winbox, ftp, scp …), založte samostatného uživatele a importujte mu klíč, za address dosaďte IP adresu linux serveru s instalovaným fail2ban. (uživatel je omezen na přístup z této IP, nebo nechte volné pokud chcete či chráníte ssh jinak), na Mikrotiku máme vše hotovo.

[admin@ro1.faha.neutron.mojeservery.cz] > user add name=fail2ban address=xx.xx.xx.xx group=full
[admin@ro1.faha.neutron.mojeservery.cz] > /user ssh-keys import public-key-file=id_dsa.pub user=fail2ban

Linux server

Instalace fail2ban démona (Debian součásti reposítářů, pro CentOS použíjte např. tento návod).

root@raspberrypi:~# apt-get install fail2ban

Nyní ta “magie”, vytvořet soubor /usr/local/bin/mikrotik-fail2ban s tímto obsahem, za xx.xx.xx.xx dosaďte IP adresu (nebo dns, v této ukázce) firewall Mikrotik (většinou brána)

#!/bin/bash
ssh -l failban -p22 -i /root/.ssh/id_dsa ro1.faha.neutron.mojeservery.cz "$1"

Naučíme fail2ban používat Mikrotik, vytvořte soubor /etc/fail2ban/action.d/mikrotik.conf s tímto obsahem.

# Mikrotik fail2ban
[Definition]
actionstart =
actionstop =
actioncheck =
actionban = mikrotik-fail2ban ":ip firewall filter add action=drop chain=forward dst-address=<ip> comment=AutoFail2ban-<ip>"
actionunban = mikrotik-fail2ban ":ip firewall filter remove [:ip firewall filter find comment=AutoFail2ban-<ip>]"

Jsme téměr u konce, zapneme služby které mají být kontrolovány službou fail2ban a nastavíme action na mikrotik, v našem případě si ukážeme službu FTP, editujte soubor /etc/fail2ban/jail.conf.

[vsftpd]
enabled  = false
port     = ftp,ftp-data,ftps,ftps-data
filter   = vsftpd
logpath  = /var/log/vsftpd.log
action = mikrotik
sendmail-whois[name=FTP, dest=havel@mojeservery.cz, sender=fail2ban-neutron@mojeservery.cz]
maxretry = 5
bantime = 300

Hotovo!

To bylo snadné, že?! Nyní postup můžete rozšířit na libovolný počet serverů v DMZ, dostanete automaticky ochranu celku při pokusu o napadnutí jednoho stroje.

Tento základní mustr lze zdokonalit, vylepšit, meze fantazii se nekladou, dejte pozor na přílišnou kreativitu.

Děkuji za Váš čas. František Havel

Linux: EoIP tunel proti Mikrotik

EoIP tunel je technologie důvěrně známá ze zařízení společnosti Mikrotik, eoip (ethernet over IP) je tunelovácí nešifrovaný protokol postavený na zapouzdření ethernet rámce do standartního GRE protokolu (Geneneric Routing Encapsulation, IP protokol 47, RFC1701).

Mikrotik samotný podporuje pochopitelně i GRE tunel, ovšem můžete být v situaci, kdy bude vyžadováno použití EoIP, EoIP samotný je stavěn primárně pro tunelování L2 provozu (přenáší navíc proti GRE Ethernet hlavičku a MAC adresy), umí fragmentovat, zachová tedy MTU, má relativně nízký overhead (28bytes), vetší režii právě díky dis/assemblování a tím i nižší propustnost, ale hlavně velmi snadnou konfiguraci, proto je oblíben.

Zpět k našemu problému, na jedné straně máme Mikrotik s RouterOS a na druhé straně Linux router (např. Debian).

linux-eoip-mikrotik

Projekt linux-eoip implementoval proprietární řešení EoIP Mikrotik, autorem je Denys Fedoryshchenko , stáhneme zdrojový kód, přeložíme, nainstalujeme, nastavíme. (https://code.google.com/p/linux-eoip, předpokládejme nainstalovaný překladač GCC)

root@raspberrypi:/usr/src# wget https://linux-eoip.googlecode.com/files/linux-eoip-0.5.tgz
root@raspberrypi:/usr/src# tar -xvzf linux-eoip-0.5.tgz
root@raspberrypi:/usr/src# cd linux-eoip-0.5
root@raspberrypi:/usr/src/linux-eoip-0.5# ./configure
root@raspberrypi:/usr/src/linux-eoip-0.5# make
root@raspberrypi:/usr/src/linux-eoip-0.5# make install

Máme nainstalováno, v /usr/local/bin/eoip je samotný démon, k samotnému spuštění je potřeba ještě konfigurační soubor, ukázka a spuštění démona.

root@raspberrypi:~# cat /etc/eoip.cfg 
[zeoip0]
id=50
dst=x.x.x.x
root@raspberrypi:~# /usr/local/bin/eoip /etc/eoip.cfg

Konfigurační soubor je velmi jednoduchý, id je ekvivalent tunnel-id na Mikrotiku, dst je ekvivalent remote-address, tedy vzdálená adresa protějšího routeru, soubor může obsahovat libovolné množství tunelů, konfigurace na Mikrotik routeru najdete v sekci /interface eoip postačí pouze dodržet shodná tunnel-id a vyplniť korektní adresu protějšku.

Po spuštění bude vytvořeno nové rozhraní s názvem uvedeným v eoip.cfg, v našem případě zeoip0, chová se jako konec tunelu, je možné na něj nasadit spojovací ip adresy, použít ho pro routing či dále bridge-ovat, lze ho zmiňovat v iptables apod.

TIP! Šifrování provozu EoIP tunelem lze dosáhnout např. vytvořením PPTP tunelu mezi dvěma routery a EoIP tunel vystavět v rámci PPTP tunelu, přihlédneme-li k menší bezpečnosti  je to jednoduchý způsob, jak výkonově (CPU) tak konfiguračně, na vše ostatní je IPSec, pokud tedy máme dostatečně výkonný router.

Závěrem, pro zvídavé geeky doporučuji udělat si čas prostudovat si zdrojové kódy projektu linux-eoip, jsou velmi jednoduché, přehledné a dají Vám přehled o tom jak vlastně funguje takové zapouzdření, co na to jádro atd., prostě dobré čtení.

A to je vše, děkuji za Váš čas. František Havel

Linux: Blokujeme čínu,rusko firewallem a ipset

S Čínou i Ruskem jsou potíže, jsou veliké.

Nedávno zde proběhl článek Linux firewall: Blokujeme pomocí IPSET jak blokovat rozsáhlá pravidla v linux firewallu bez výkonové penalizace.

Dnes bych rád na toto téma lehce navázal, ukážeme si jak efektivně zablokovat provoz z konkrétní země, v našem případě jde o Čínu a Rusko, bude to jednoduché a rychlé, slibuji.

Co budeme potřebovat? Nástroj IPset,wget a seznam rozsahů konkrétní země.

Vytvoříme si dvě hash tabulky, následně stáhneme pomocí nástroje wget soubor veřejných rozsahů, aplikujeme v jednoduchém cyklu na ipset a poté pouze nasadíme iptables.

Pojďme na to!

root@havel-machine:~# ipset -N china hash:net
root@havel-machine:~# ipset -N russia hash:net

root@havel-machine:~# wget http://www.ipdeny.com/ipblocks/data/countries/cn.zone
root@havel-machine:~# wget http://www.ipdeny.com/ipblocks/data/countries/ru.zone

root@havel-machine:~# for i in $(cat cn.zone ); do ipset -A china $i; done
root@havel-machine:~# for i in $(cat ru.zone ); do ipset -A russia $i; done

root@havel-machine:~# iptables -A INPUT -p tcp -m set --match-set china src -j DROP
root@havel-machine:~# iptables -A INPUT -p tcp -m set --match-set russia src -j DROP

A to je vše! Dejte si pozor kam umístíte iptables DROP pravidla, musí být povětšinou před zbytkem pravidel, jinak nebudou mít efekt.

Prozkoumejte podrobněji www.ipdeny.com , k dispozici jsou i agregované seznamy rozsahů (v našem případě použit ne-agregovaný seznam, ipset agreguje za nás), pěkný je online generátor pravidel do iptables,ipchain,ipfw.acl. Co mě překvapilo je i seznam IPv6 rozsahů http://www.ipdeny.com/ipv6/ipaddresses/blocks/ , prostě skvělé.

K dokonalosti je vhodné celé řešení zabalit do scriptu, ošetřit možné chyby kolem wget a pravidelně aktualizovat, nechávám za domácí úkol.

Díky za Váš čas. František Havel