j0llyb0xhttps://www.j0llyb0x.org/2023-06-30T00:00:00+02:00Learn or die tryingambiente di sviluppo per micropython con wsl, vscode e PyMakr2023-06-30T00:00:00+02:002023-06-30T00:00:00+02:00j0llytag:www.j0llyb0x.org,2023-06-30:/2023/ambiente-di-sviluppo-per-micropython-con-wsl-vscode-e-pymakr.html<p>Dato che nessuno vorrebbe sviluppare i propri progetti IoT con <a href="https://micropython.org/">Micropython</a> su Windows, mi sono configurato un ambiente di sviluppo abbastanza funzionale basato su <a href="https://code.visualstudio.com/">vscode</a>, <a href="https://learn.microsoft.com/en-us/windows/wsl/">wsl</a> e l'estensione <a href="https://marketplace.visualstudio.com/items?itemName=pycom.Pymakr">pymakr</a>.</p>
<p><img alt="esp32 dev board" src="https://www.j0llyb0x.org/images/esp32.jpg"></p>
<p>Cominciamo coi pre-requisiti:
- <a href="https://learn.microsoft.com/en-us/windows/wsl/install">installare wsl2</a> con ubuntu (default)
- <a href="https://learn.microsoft.com/en-us/windows/wsl/tutorials/wsl-vscode">installare e configurare vscode</a> con remote wsl extension</p>
<p>A questo punto potete già …</p><p>Dato che nessuno vorrebbe sviluppare i propri progetti IoT con <a href="https://micropython.org/">Micropython</a> su Windows, mi sono configurato un ambiente di sviluppo abbastanza funzionale basato su <a href="https://code.visualstudio.com/">vscode</a>, <a href="https://learn.microsoft.com/en-us/windows/wsl/">wsl</a> e l'estensione <a href="https://marketplace.visualstudio.com/items?itemName=pycom.Pymakr">pymakr</a>.</p>
<p><img alt="esp32 dev board" src="https://www.j0llyb0x.org/images/esp32.jpg"></p>
<p>Cominciamo coi pre-requisiti:
- <a href="https://learn.microsoft.com/en-us/windows/wsl/install">installare wsl2</a> con ubuntu (default)
- <a href="https://learn.microsoft.com/en-us/windows/wsl/tutorials/wsl-vscode">installare e configurare vscode</a> con remote wsl extension</p>
<p>A questo punto potete già sviluppare quello che volete in ambiente linux con vscode da una macchina windows con innumerrevoli vantaggi tra qui una gestione umana delle versioni e paths di python, git out of the box ed altro ancora..</p>
<p><img alt="ambiente di sviluppo linux" src="https://www.j0llyb0x.org/images/devenv.png"></p>
<p>I prossimi passaggi saranno:</p>
<ul>
<li>setup WSL per lo sviluppo remoto</li>
<li>installazione di tools specifici per sviluppo con micropyhton</li>
<li>installare micropython su una devboard e creare il nostro primo progetto</li>
</ul>
<h2>setup WSL</h2>
<p>Per configurare il WSL per un ambiente di sviluppo micropython servono 2 step:</p>
<ul>
<li>installare e configurare python3</li>
<li>configurare la gestione del forwarding delle porte USB da host a guest</li>
</ul>
<p>nel container wsl, se stai usando la release 20.04 (default quando ho installato la distro), la versione di python è davvero vecchia; io uso sempre pyenv per gestire le versioni di python nei miei device e ambienti:</p>
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>apt-get<span class="w"> </span>update
sudo<span class="w"> </span>apt-get<span class="w"> </span>install<span class="w"> </span>-y<span class="w"> </span>make<span class="w"> </span>build-essential<span class="w"> </span>libssl-dev<span class="w"> </span>zlib1g-dev<span class="w"> </span>libbz2-dev<span class="w"> </span>libreadline-dev<span class="w"> </span>libsqlite3-dev<span class="w"> </span>wget<span class="w"> </span>curl<span class="w"> </span>llvm<span class="w"> </span>libncurses5-dev<span class="w"> </span>libncursesw5-dev<span class="w"> </span>xz-utils<span class="w"> </span>tk-dev<span class="w"> </span>libffi-dev<span class="w"> </span>liblzma-dev<span class="w"> </span>python-openssl<span class="w"> </span>git<span class="w"> </span>zlib1g<span class="w"> </span>zlib1g-dev<span class="w"> </span>libssl-dev<span class="w"> </span>libbz2-dev<span class="w"> </span>libsqlite3-dev
curl<span class="w"> </span>https://pyenv.run<span class="w"> </span><span class="p">|</span><span class="w"> </span>bash
<span class="nb">echo</span><span class="w"> </span><span class="s1">'export PYENV_ROOT="$HOME/.pyenv"'</span><span class="w"> </span>>><span class="w"> </span>~/.bashrc
<span class="nb">echo</span><span class="w"> </span><span class="s1">'export PATH="$PYENV_ROOT/bin:$PATH"'</span><span class="w"> </span>>><span class="w"> </span>~/.bashrc
<span class="nb">echo</span><span class="w"> </span><span class="s1">'eval "$(pyenv init -)"'</span><span class="w"> </span>>><span class="w"> </span>~/.bashrc
<span class="nb">source</span><span class="w"> </span>~/.bashrc
pyenv<span class="w"> </span>install<span class="w"> </span><span class="m">3</span>.11
pyenv<span class="w"> </span>global<span class="w"> </span><span class="m">3</span>.11
</code></pre></div>
<p>Per configurare la gestione delle porte USB, per il WSL ubuntu, servono un paio di passaggi; prima di tutto, vogliamo gestire le console con <a href="https://learn.microsoft.com/it-it/windows/wsl/systemd">systemd</a> in modo da avere i permessi corretti "out of the box". Per fare ciò serve modificare il file di configurazione del wsl all'interno del container:</p>
<div class="highlight"><pre><span></span><code><span class="nb">echo</span><span class="w"> </span>-e<span class="w"> </span><span class="s2">"[boot]\nsystemd=true\n"</span><span class="w"> </span><span class="p">|</span><span class="w"> </span>sudo<span class="w"> </span>tee<span class="w"> </span>/etc/wsl.conf
</code></pre></div>
<p>e riavviare il WSL con </p>
<div class="highlight"><pre><span></span><code><span class="n">wsl</span><span class="p">.</span><span class="n">exe</span> <span class="p">-</span><span class="n">-shutdown</span>
</code></pre></div>
<p>successivamente serve abilitare il <a href="https://learn.microsoft.com/it-it/windows/wsl/connect-usb">forwarding</a> dei dispositivi USB al WSL:</p>
<div class="highlight"><pre><span></span><code><span class="n">winget</span> <span class="n">install</span> <span class="p">-</span><span class="n">-interactive</span> <span class="p">-</span><span class="o">-exact</span> <span class="n">dorssel</span><span class="p">.</span><span class="n">usbipd-win</span>
</code></pre></div>
<p>Mentre nel container:</p>
<div class="highlight"><pre><span></span><code>sudo<span class="w"> </span>apt<span class="w"> </span>update<span class="w"> </span><span class="o">&&</span><span class="w"> </span>sudo<span class="w"> </span>apt<span class="w"> </span>install<span class="w"> </span>linux-tools-generic<span class="w"> </span>hwdata
sudo<span class="w"> </span>update-alternatives<span class="w"> </span>--install<span class="w"> </span>/usr/local/bin/usbip<span class="w"> </span>usbip<span class="w"> </span>/usr/lib/linux-tools/*-generic/usbip<span class="w"> </span><span class="m">20</span>
</code></pre></div>
<h2>installare i tools necessari</h2>
<p>Ora installiamo alcuni tools per gestione e sviluppo con micropython:</p>
<ul>
<li><a href="https://github.com/espressif/esptool">esptool</a></li>
<li><a href="https://marketplacevisualstudio.com/items?itemName=pycom.Pymakr">pymakr</a></li>
<li><a href="https://github.com/BradenM/micropy-cli">micropy-cli</a></li>
</ul>
<p>esptool serve per flashare micropython sul microcontroller mentre micropy-cli è un utilissimo tool per aggiungere ai progetti l'auto-completion e poter fare linting con micropython oltre che per fare scaffolding di nuovi progetti micropython.
Per entrambi i tool basta utilizzare pip:</p>
<div class="highlight"><pre><span></span><code>pip<span class="w"> </span>install<span class="w"> </span>esptool<span class="w"> </span>micropy-cli
</code></pre></div>
<p>micropy-cli per funzionare con vscode ha bisogno di un po di setup; serve installare <a href="https://marketplace.visualstudio.com/items?itemName=VisualStudioExptTeam.vscodeintellicode">intellisense</a> nel wsl ed in oltre servono gli "stubs" per l'autocompletion:</p>
<div class="highlight"><pre><span></span><code>micropy<span class="w"> </span>stubs<span class="w"> </span>install<span class="w"> </span>micropython-esp32-stubs
</code></pre></div>
<p>se volete vedere che versione di micropython viene usata nello stub potete usare la funzione search per avere più info:</p>
<div class="highlight"><pre><span></span><code>micropy<span class="w"> </span>stubs<span class="w"> </span>search<span class="w"> </span>esp32
</code></pre></div>
<p>per pymakr, basta installare (nell'stanza remota di vscode) <a href="https://marketplace.visualstudio.com/items?itemName=pycom.pymakr-preview">l'estensione</a>.Ad oggi serve installare le verisone preview perchè c'è qualche problema di compatibilità con vscode. L'estensione è stata fatta per la pyboard ma può essere usata con qualsiasi board su cui giri micropython</p>
<p>per concludere ecco una lista di estensioni che utilizzo sepre per sviluppare (anche in Cpython):</p>
<ul>
<li><a href="https://marketplace.visualstudio.com/items?itemName=ms-python.python">python</a></li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=ms-python.vscode-pylance">pylance</a></li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=ms-python.pylint">pylint</a></li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=ms-python.black-formatter">black</a></li>
<li><a href="https://marketplace.visualstudio.com/items?itemName=donjayamanne.python-environment-manager">python virtualenv manager</a></li>
</ul>
<h2>setup progetto</h2>
<p>siamo ormai pronti per il nostro prossimo progetto embedded ma prima di tutto, serve avere due cose:
una devboard e micropython!</p>
<p>Io, ho parecchie devboard esp32 comprate negli anni su aliexpress come questa:</p>
<p><img alt="lolin lite 32" src="https://www.j0llyb0x.org/images/lolinlite32.png"></p>
<p>per micropython, scaricate la versione direttamente dal <a href="https://micropython.org/download/">sito</a>, specifica per la vostra board nel container:</p>
<div class="highlight"><pre><span></span><code>wget<span class="w"> </span>https://micropython.org/resources/firmware/esp32-20230426-v1.20.0.bin
</code></pre></div>
<p>a questo punto, con la board collegate la board al computer; usate un cavo con il canale dati altrimenti perderete 1 ora come me a cercare di capire cosa non vada... In generale, se sentite il "dling-dlong" di windows quando attaccate la board siete a cavallo.</p>
<p>Ora, date il controllo del bus USB al container (serve farlo ogni volta che connettete il cavo al pc) con una shell <strong>da amministratore</strong>:</p>
<div class="highlight"><pre><span></span><code><span class="n">usbipd</span> <span class="n">wsl</span> <span class="n">list</span>
<span class="n">usbipd</span> <span class="n">wsl</span> <span class="n">attach</span> <span class="p">-</span><span class="n">-busid</span> <span class="p"><</span><span class="n">busid</span><span class="p">></span>
</code></pre></div>
<p>a titolo di esempio, potete vedere quando la board non è connessa e quando lo è, e nella seconda schermata quando la porta USB è gestita dal container WSL.</p>
<p><img alt="usb list" src="https://www.j0llyb0x.org/images/usbipd.png"></p>
<p><img alt="usb attached" src="https://www.j0llyb0x.org/images/usbipd-2.png"></p>
<p>mentre nel container dovreste poter listare il nuovo device:</p>
<div class="highlight"><pre><span></span><code>lsusb
</code></pre></div>
<p><img alt="lsusb" src="https://www.j0llyb0x.org/images/lsusb.png"></p>
<p>ora siamo pronti a flashare l'immagine nel microcontroller (path, parametri e porte dipendono dal vostro controller etc):</p>
<div class="highlight"><pre><span></span><code>esptool.py<span class="w"> </span>--chip<span class="w"> </span>esp32<span class="w"> </span>--port<span class="w"> </span>/dev/ttyUSB0<span class="w"> </span>erase_flash
esptool.py<span class="w"> </span>--chip<span class="w"> </span>esp32<span class="w"> </span>--port<span class="w"> </span>/dev/ttyUSB0<span class="w"> </span>--baud<span class="w"> </span><span class="m">460800</span><span class="w"> </span>write_flash<span class="w"> </span>-z<span class="w"> </span>0x1000<span class="w"> </span>esp32-20230426-v1.20.0.bin
</code></pre></div>
<p><img alt="esptool erase" src="https://www.j0llyb0x.org/images/esp_erase.png"></p>
<p><img alt="esptool flash" src="https://www.j0llyb0x.org/images/esp_flash.png"></p>
<p>Se tutto è andato a buon fine, abbiamo una board pronta per essere programmata in micropython, collegata al nostro WSL!</p>
<p>Ora non resta che create un progetto e conminciare a scrivere codice.</p>
<p>Prima di tutto, creiamo un progetto con micropy-cli e configuriamo la connessione con pymakr:</p>
<div class="highlight"><pre><span></span><code>mkdir<span class="w"> </span>newproject<span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="nb">cd</span><span class="w"> </span>newproject
micropy<span class="w"> </span>init<span class="w"> </span>-n<span class="w"> </span>newproject<span class="w"> </span>-t<span class="w"> </span>vscode<span class="w"> </span>-t<span class="w"> </span>pymakr<span class="w"> </span>-t<span class="w"> </span>pylint<span class="w"> </span>-t<span class="w"> </span>gitignore<span class="w"> </span>-t<span class="w"> </span>bootstrap<span class="w"> </span>-s<span class="w"> </span>micropython-stdlib-stubs<span class="w"> </span>-s<span class="w"> </span>micropython-esp32-stubs
code<span class="w"> </span>.
</code></pre></div>
<p>Io ho direttamente specificato gli stubs che ho installato ma lanciando la cli in maniera interattiva potete selezionare config e stubs in base alla vostra installazione</p>
<div class="highlight"><pre><span></span><code>micropy<span class="w"> </span>init
</code></pre></div>
<p>quando vscode si aprirà, avrete un workspace già configurato e pronto per configurare la connessione al microcontroller.</p>
<p><img alt="vscode pymakr" src="https://www.j0llyb0x.org/images/vscode_pymakr.png"></p>
<p>nel tab in basso avrete la vostra board nei devices associati al progetto; ora potete connettervi e verificare che tutto funzioni aprendo una shell interattiva nel device</p>
<p><img alt="vscode pymakr connect" src="https://www.j0llyb0x.org/images/vscode_pymakr-1.png"></p>
<p>ed ora, proviamo a scrivere del "upython" code con l'aiuto del linter e code hints</p>
<p><img alt="vscode pymakr code hints" src="https://www.j0llyb0x.org/images/vscode_pymakr-2.png"></p>
<p>That's it! possiamo divertirci con micropython e i nostri piccoli device in un ambiente davvero comodo per lo sviluppo e il test delle nostre applicazioni IoT!</p>Mettere in fila i pezzi2023-06-20T00:00:00+02:002023-06-20T00:00:00+02:00j0llytag:www.j0llyb0x.org,2023-06-20:/2023/mettere-in-fila-i-pezzi.html<p>8 anni fa pubblicavo il mio ultimo articolo; ero un giovane ragazzo pieno di entusiasmo. La mia carriera lavorativa (in informatica) era "appena" cominciata. Tutto era nuovo e ricco di mistero.</p>
<p><img alt="lifelong learning" src="https://www.j0llyb0x.org/images/learn.jpg"></p>
<p>L'informatica è qualcosa che devi sentire, non puoi pensare di costruirti una carriera appagante se non hai la passione …</p><p>8 anni fa pubblicavo il mio ultimo articolo; ero un giovane ragazzo pieno di entusiasmo. La mia carriera lavorativa (in informatica) era "appena" cominciata. Tutto era nuovo e ricco di mistero.</p>
<p><img alt="lifelong learning" src="https://www.j0llyb0x.org/images/learn.jpg"></p>
<p>L'informatica è qualcosa che devi sentire, non puoi pensare di costruirti una carriera appagante se non hai la passione. Non basta mettere in fila le notti e le lunghe giornate perchè ad un certo punto scoppi. C'è sempre qualcuno più bravo di te e la pressione o lo stress per le consegne non si possono ignorare all'infinito. Se non hai il piacere intrinseco richiesto per imparare la nuova tecnologia del momento rimani ancorato a quello che sai e ben presto diventi "obsoleto"; una persona bloccata in quelle quattro routines apprese che diventano presto o tardi noiose e poco appaganti.</p>
<p>Ma poi, perchè scrivere? perchè farlo allora e perchè ritrovarmi qui, dopo 8 anni, a digitare altre parole su un foglio metaforicamente ingiallito e consumato? La verità è che non ho mai smesso di voler scrivere, di voler condividere quello che ho imparato ed imparerò. Forse però sono stato troppo focalizzato sulla carriera e la meta rispetto al viaggio, in questi anni, e questo mi ha fatto perdere un pò di contesto su cosa mi piace fare e perchè.</p>
<p>a dovere di cronaca, nel 2015, mi sono trasferito a Dublino per cominciare un percorso incredibile che mi ha, in pochi anni, catapultato al "next level" della mia carriera. credo che l'anno passato a Dublino (in Amazon) sia stato tra i più formativi ed intensi della mia carriera. E' anche vero, però, che negli anni successivi ho vissuto in un turbine di emozioni, vittorie e sconfitte lavorative che mi hanno tenuto lontano dalla scrittura e dalla divulgazione (anche se in ufficio cerco sempre di condividere quello che so).</p>
<p>Ma tornando al qui ed ora (l'unico tempo realmente esistente) quello che sto per fare è dare una piccola spolverata a questa parte abbandonata del mio essere e ritornare a parlare di informatica anche perchè, come dice Seneca “docendo discimus” ed io non ho ancora finito di imparare!</p>from Postach.io to Pelican2015-06-17T00:00:00+02:002015-06-17T00:00:00+02:00j0llytag:www.j0llyb0x.org,2015-06-17:/2015/from-postachio-to-pelican.html<p>Finalmente un nuovo progetto che mi darà soddisfazione: <a href="http://blog.getpelican.com/">Pelican</a>!</p>
<p><img alt="enter image description here" src="https://getpelican.com/theme/img/logo.svg" title="pelican-800px.png"> </p>
<p>Dopo mesi di travagliati problemi, ho trovato qualche giorno per ricominciare ad interessarmi del blog e, soprattuto, ad uscire dal tunnel di postach.io: i simpatici developers hanno deciso di rendere tutto a pagamento (dovevo imamginarmelo non avendo mai letto di …</p><p>Finalmente un nuovo progetto che mi darà soddisfazione: <a href="http://blog.getpelican.com/">Pelican</a>!</p>
<p><img alt="enter image description here" src="https://getpelican.com/theme/img/logo.svg" title="pelican-800px.png"> </p>
<p>Dopo mesi di travagliati problemi, ho trovato qualche giorno per ricominciare ad interessarmi del blog e, soprattuto, ad uscire dal tunnel di postach.io: i simpatici developers hanno deciso di rendere tutto a pagamento (dovevo imamginarmelo non avendo mai letto di alcun contratto di licenza GPL etc).</p>
<p>Comunque, a parte le disavventure, sono finalmente di nuovo in pista e, questa volta, sono tornato sui miei passi decidendo di hostare proprio tutto, dal contenuto, al software di blogging, ma anche l'host: infatti adesso ci sarà una marea di downtime a causa del server che hosta il sito (giù in cantina).</p>
<p>Il vento delle novità questa volta porta <a href="http://blog.getpelican.com/">pelican</a>, un motore per generare siti web statici; per intenderci, un <a href="http://jekyllrb.com/">Jekyll</a> scritto in python!</p>
<p>La <a href="http://docs.getpelican.com">documentazione</a> è abbastanza accurata e, nonostante la fretta che avevo di riportare il blog up, ho messo in piedi il sito in davvero poco tempo.</p>
<p>I punti di forza di questo software sono la possibilità di scrivere le pagine in vari formati, tra cui, il markdown; essendo molto popolare oggi, ho deciso di prendere la palla al balzo e, con Pelican, di cominciare un percorso di apprendimento di alcune tecnologie che avrei voluto fare mie:</p>
<ul>
<li>python</li>
<li>markdown</li>
<li><a href="http://jinja.pocoo.org/docs/dev/">jinja2</a></li>
</ul>
<p>Grazie a Pelican, infatti, potrò cominciare a masticare meglio il pyhton e, soprattutto, il suo motore di templating (per i temi) che è usato anche da molti software davvero fighi; uno tra tutti, <a href="http://saltstack.com/">saltstack</a>.</p>
<p>Come potete mmaginare, il blog è ora scritto utilizzando Pelican; il blog è hostato su <a href="https://github.com/j0lly/blog">github</a>; ho anche fatto qualche test con <a href="https://pages.github.com/">pages di github</a> ed ora il blog è una bomba... beh credo manchi qualche gingillo, ma sono convinto che nelle prossime settimane troverò qualche ora per studiare meglio jinja2 e creare un bel tema ad-hoc.</p>
<p>Speriamo di rivederci presto :P</p>
<p>Stay Tuned</p>OpenResolver.py, open DNS crawler2014-11-23T00:00:00+01:002014-11-23T00:00:00+01:00j0llytag:www.j0llyb0x.org,2014-11-23:/2014/openresolverpy-open-dns-crawler.html<p>Week-end felice: ho trovato voglia e tempo per scrivere un po di (orribile) python!</p>
<p><img alt="odin" src="https://www.j0llyb0x.org/images/odin-1.jpg"></p>
<p>Dato che la tecnica del <a href="http://it.wikipedia.org/wiki/DNS_Amplification_Attack">DNS Amplification Attack</a> è didatticamente molto interessante, ho deciso di fare un po di esercizi di scripting e creare un piccolo programma in python che potesse ricercare i famosi Open Resolver …</p><p>Week-end felice: ho trovato voglia e tempo per scrivere un po di (orribile) python!</p>
<p><img alt="odin" src="https://www.j0llyb0x.org/images/odin-1.jpg"></p>
<p>Dato che la tecnica del <a href="http://it.wikipedia.org/wiki/DNS_Amplification_Attack">DNS Amplification Attack</a> è didatticamente molto interessante, ho deciso di fare un po di esercizi di scripting e creare un piccolo programma in python che potesse ricercare i famosi Open Resolver in giro per la rete.</p>
<p>Si chiama Openresolver.py (che classe :P) ed è hostato sul mio github: https://github.com/j0lly/openresolvers.</p>
<p>Per ora è solo un'accozzaglia di righe di codice, ma il suo sporco lavoro lo fa:</p>
<p>basta passare un ip o un range di ip in formato CIDR e lui comincerà a testare tutti i target per trovare quelli che risolvono query DNS arbitrarie.</p>
<p><img alt="shot" src="https://www.j0llyb0x.org/images/openresolver-1.png"></p>
<p><em>Esempio:</em></p>
<div class="highlight"><pre><span></span><code><span class="k">[root@newsun][~/openresolvers]</span>
<span class="na">16</span><span class="o">:</span><span class="s">42:43</span><span class="w"> </span><span class="c1"># git com./openresolver.py -t 91.98.29.244/24 -c 120 -o resolvers.txt</span>
<span class="na">resolving with 91.98.29.0</span>
<span class="na">resolving with 91.98.29.1</span>
<span class="na">resolving with 91.98.29.2</span>
<span class="k">[..]</span>
<span class="na">resolving with 91.98.29.118</span>
<span class="na">resolving with 91.98.29.119</span>
<span class="na">fd-fp3.wg1.b.yahoo.com.</span>
<span class="na">adding 91.98.29.26 to the list</span>
<span class="na">fd-fp3.wg1.b.yahoo.com.</span>
<span class="na">adding 91.98.29.22 to the list</span>
<span class="na">fd-fp3.wg1.b.yahoo.com.</span>
<span class="na">adding 91.98.29.86 to the list</span>
<span class="na">fd-fp3.wg1.b.yahoo.com.</span>
<span class="na">adding 91.98.29.66 to the list</span>
<span class="na">fd-fp3.wg1.b.yahoo.com.</span>
<span class="na">adding 91.98.29.68 to the list</span>
<span class="na">fd-fp3.wg1.b.yahoo.com.</span>
<span class="na">adding 91.98.29.69 to the list</span>
<span class="na">fd-fp3.wg1.b.yahoo.com.</span>
<span class="na">adding 91.98.29.67 to the list</span>
<span class="na">fd-fp3.wg1.b.yahoo.com.</span>
<span class="na">adding 91.98.29.10 to the list</span>
<span class="na">fd-fp3.wg1.b.yahoo.com.</span>
<span class="na">adding 91.98.29.70 to the list</span>
<span class="na">resolving with 91.98.29.120</span>
<span class="k">[..]</span>
<span class="na">I found 14 resolvers!</span>
<span class="na">dumped list to resolvers.txt</span>
</code></pre></div>
<p>Al momento è molto verboso e non fornisce molte opzioni, ma cercherò di migliorarne il contenuto se avrò tempo; ovviamente se qualcuno volesse contribuire, sarei felicissimo di accettare qualche commit!</p>
<p>Spero che qualcuno trovi lo script interessante, o per lo meno curioso :P</p>
<p>Stay tuned!</p>
<p>J0lly</p>NAT networks in Ovirt2014-11-20T00:00:00+01:002014-11-20T00:00:00+01:00j0llytag:www.j0llyb0x.org,2014-11-20:/2014/nat-networks-in-ovirt.html<p>Questo blog è prima di tutto un luogo dove pubblicare i miei appunti, in modo che servano a me e, all'occorrenza a chiunque si possa trovare nella mia stessa situazione.</p>
<p>Scrivo in italiano perché, nel 90% dei casi, quello di cui tratto è sicuramente già stato scritto da qualcuno, e …</p><p>Questo blog è prima di tutto un luogo dove pubblicare i miei appunti, in modo che servano a me e, all'occorrenza a chiunque si possa trovare nella mia stessa situazione.</p>
<p>Scrivo in italiano perché, nel 90% dei casi, quello di cui tratto è sicuramente già stato scritto da qualcuno, e probabilmente in maniera più chiara della mia :P.</p>
<p>Quindi, Di seguito la rodata procedura per attivare un network virtuale su oVirt 3.5.</p>
<p>Grazie al nuovo Hook per oVirt che gestisce il NAT lato Gui, è decisamente molto più semplice creare una rete Nattata su oVirt; per schematizzare, questi sono i passaggi:</p>
<ul>
<li>installazione dell'Hook;</li>
<li>creazione di una rete NAT virtuale sull'host [tutti gli host del cluster] via libvirt;</li>
<li>aggiunta della periferica virtuale (Vnic) appena creata ad una o più delle VM.</li>
<li>Enjoy :)</li>
</ul>
<p>Qui ricapitolo le specifiche della mia infrastruttura:</p>
<p>Host = Centos 7</p>
<p>Engine = Centos 6 [attualmente non supportato Centos 7 come Engine] Self Hosted</p>
<p>Ovirt = 3.5 Version</p>
<p>vdsm-hook-extnet = 4.16.7-1.gitdb83943.el7.noarch</p>
<p>Installazione dell'Hook</p>
<p>Se come me, avete installato il repository di oVirt 3.5,</p>
<p>Su tutti gli <em>host</em> del cluster, installate semplicemente l'hook:</p>
<div class="highlight"><pre><span></span><code>yum install -y vdsm-hook-extnet
</code></pre></div>
<p>Sull'<em>engine</em>, abilitate l'hook:</p>
<div class="highlight"><pre><span></span><code><span class="nx">engine</span><span class="o">-</span><span class="nx">config</span><span class="w"> </span><span class="o">-</span><span class="nx">s</span><span class="w"> </span><span class="nx">CustomDeviceProperties</span><span class="p">=</span><span class="err">'</span><span class="p">{</span><span class="k">type</span><span class="p">=</span><span class="kd">interface</span><span class="p">;</span><span class="nx">prop</span><span class="p">={</span><span class="nx">extnet</span><span class="p">=</span><span class="o">^</span><span class="p">[</span><span class="nx">a</span><span class="o">-</span><span class="nx">zA</span><span class="o">-</span><span class="nx">Z0</span><span class="o">-</span><span class="mi">9</span><span class="nx">_</span><span class="w"> </span><span class="o">---</span><span class="p">]</span><span class="o">+</span><span class="err">$</span><span class="p">}}</span><span class="err">'</span>
</code></pre></div>
<p>Non ricordo se sia necessario un reboot dell'host, ma non credo..</p>
<p>Creazione di una rete Nat, per ogni Host
Ora è necessario creare una rete NAT direttamente via Virsh, perché oVirt non supporta ancora questo tipo di rete:</p>
<p>Per prima cosa, è necessario, se ancora non ce l'abbiamo, un utente autorizzato ad accedere all'hypervisor:</p>
<div class="highlight"><pre><span></span><code>saslpasswd2 -a libvirt root
</code></pre></div>
<p>digitate la password per due volte, ed abilitate l'accesso a libvirt via SASL [richiesto da ovirt].
Creare una rete Nat classica con ovirt, usate un xml per utilizzare il comando net-define; il mio è molto semplice:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><network></span>
<span class="w"> </span><span class="nt"><name></span>cluster_nat<span class="nt"></name></span>
<span class="w"> </span><span class="nt"><forward</span><span class="w"> </span><span class="na">mode=</span><span class="s">'nat'</span><span class="nt">></span>
<span class="w"> </span><span class="nt"><nat></span>
<span class="w"> </span><span class="nt"><port</span><span class="w"> </span><span class="na">start=</span><span class="s">'1024'</span><span class="w"> </span><span class="na">end=</span><span class="s">'65535'</span><span class="nt">/></span>
<span class="w"> </span><span class="nt"></nat></span>
<span class="w"> </span><span class="nt"></forward></span>
<span class="w"> </span><span class="nt"><bridge</span><span class="w"> </span><span class="na">name=</span><span class="s">'virbr1'</span><span class="w"> </span><span class="na">stp=</span><span class="s">'on'</span><span class="w"> </span><span class="na">delay=</span><span class="s">'0'</span><span class="w"> </span><span class="nt">/></span>
<span class="w"> </span><span class="nt"><ip</span><span class="w"> </span><span class="na">address=</span><span class="s">'172.16.31.1'</span><span class="w"> </span><span class="na">netmask=</span><span class="s">'255.255.255.0'</span><span class="nt">></span>
<span class="w"> </span><span class="nt"></ip></span>
<span class="nt"></network></span>
</code></pre></div>
<p>L'importante è che vi ricordiate il nome che avete dato al network, e di non creare una virtual interface già esistente [virbr1].</p>
<p>NB</p>
<p>Aggiungete il dhcp se non ne avete già uno nella rete Nat che andate a creare, altrimenti dovrete restartare il network e le VM che ci girano dentro se volete aggiungere il DHCP alla configurazione!</p>
<p>Loggatevi in virsh, nel vostro Hypervisor, create la rete, settatela in auto-start e lanciatela (su tutti i nodi del cluster):</p>
<div class="highlight"><pre><span></span><code><span class="nv">virsh</span>
<span class="k">connect</span><span class="w"> </span><span class="nv">qemu</span>:<span class="o">///</span><span class="nv">system</span>
<span class="nv">net</span><span class="o">-</span><span class="nv">define</span><span class="w"> </span><span class="nv">_nome_del_file_xml_</span>
<span class="nv">net</span><span class="o">-</span><span class="nv">autostart</span><span class="w"> </span><span class="nv">_cluster_nat</span><span class="w"> </span><span class="nv">_</span>
<span class="nv">net</span><span class="o">-</span><span class="nv">start</span><span class="w"> </span><span class="nv">_cluster_nat_</span>
</code></pre></div>
<p>Questi passaggi vanno fatti su tutti gli host del cluster che intendete fornire di un NAT.</p>
<p>Assicuratevi che la nuova rete sia un & running e che tra le periferiche sia listata la nuova interfaccia.</p>
<p>NB</p>
<p>Se utilizzate iptables (che viene autogestito dall'engine quando create nuovi virtual network) dovrete creare le regole a mano, perché VDSM non è in grado di gestire questa rete.</p>
<p>aggiunta del profilo vNIC tramite GUI</p>
<p>Non resta che collegarsi alla console di amministrazione di oVirt e creare un profilo ad-hoc per gestire questa rete; l'hook installato aggiunge una _custom property _che permette la gestione del NAT.</p>
<p>Loggatevi e create un nuovo profile in uno dei vostri networks:</p>
<p><img alt="ovirt" src="https://www.j0llyb0x.org/images/ovirt-2.png"></p>
<p>Nel profilo, aggiungete la proprietà extnet, e come valore, inserite il nome che avete dato al network via virsh:</p>
<p><img alt="ovirt" src="https://www.j0llyb0x.org/images/ovirt-1.png"></p>
<p>Perfect! ora potete aggiungere il nic alle vostre VM:</p>
<p><img alt="ovirt" src="https://www.j0llyb0x.org/images/ovirt-3.png"></p>
<p>Et voilà, il NAT network è servito!</p>
<p>Stay Tuned</p>find open proxy2014-08-23T00:00:00+02:002014-08-23T00:00:00+02:00j0llytag:www.j0llyb0x.org,2014-08-23:/2014/find-open-proxy.html<p>Un poco annoiato, ieri ho deciso di annotarmi qualche proxy aperto che potesse servire a vari scopi... :P</p>
<p><img alt="nmap" src="https://www.j0llyb0x.org/images/nmap-1.jpg"></p>
<p>H pensato sarebbe stato un ottimo playground per python e xml (xml.minidom,xml.etree,BeautifulSoup) ma sono rimasto scottato dalle mie risorse; il Vps sul quale sto lavorando è un Lxc …</p><p>Un poco annoiato, ieri ho deciso di annotarmi qualche proxy aperto che potesse servire a vari scopi... :P</p>
<p><img alt="nmap" src="https://www.j0llyb0x.org/images/nmap-1.jpg"></p>
<p>H pensato sarebbe stato un ottimo playground per python e xml (xml.minidom,xml.etree,BeautifulSoup) ma sono rimasto scottato dalle mie risorse; il Vps sul quale sto lavorando è un Lxc (Linux container) openvz con 512Mb di ram.</p>
<p>Dato che le liste di indirizzi sono /16, il file in formato xml è grosso più di 20Mb, python si mangiava tutta la memoria all'atto di importare il file.</p>
<p>Certo, avrei potuto cominciare studiando la maniera di ottimizzare il codice e prende chunk di dati, ma dato che volevo produrre qualcosa di funzionante prima di lasciare un'altra idea a metà, ho rifatto tutto in 3 linee di bash senza nemmeno utilizzare un decimo della memoria che python utilizza, solo a leggere il file...</p>
<p>Con questo non voglio dire nulla, se non che le mie conoscenze di python sono così basse che non mi permettono nemmeno di implementare 3 righe di script senza perdere 3 giorni; pazienza, sarà per la prossima idea (tanto quelle non finiscono mai :P ).</p>
<p>Quindi, passando al topic, ho creato un piccolo script che facesse al caso mio.</p>
<p>Le dipendenze sono:</p>
<ul>
<li>
<p>nmap,</p>
</li>
<li>
<p>nc,</p>
</li>
<li>
<p>grep</p>
</li>
<li>
<p>mailx,</p>
</li>
<li>
<p>uuencode.</p>
</li>
</ul>
<p>Nulla di più.</p>
<p>Il codice lo trovate nel <a href="https://gist.github.com/j0lly/89c82bb5aac9116c5b7e">gist</a> linkato.</p>
<p>Lo script è triviale, ma vale la pena annotare qualche switch e comando utilizzato in modo da risparmiare tempo la prossima volta che ci si trova ad affrontare certi problemi.</p>
<p>Per prima cosa il comando nmap utilizzato:</p>
<p>nmap --script http-open-py.roxnse -Pn -P0 -n --unprivileged -T4 $1.0.0/16 -p 8080 -oX ${1}.0.0</p>
<p>lo script http-open-proxy.nse è utilizzato per testare la porta 8080 (nel codice ho trovato riferimenti a 4 porte, ma non ho avuto tempo di capire se aggiungendo porte allo switch -p vengono scansionate anch'esse) e cercare di scremare i target possibili.</p>
<p>altro switch degno di nota è --unprivileged, dal man page:</p>
<p><code>--unprivileged</code> (Assume that the user lacks raw socket privileges)</p>
<p>This option is the opposite of <code>--privileged</code>. It tells Nmap to treat the user as lacking network raw socket and sniffing privileges. This is useful for testing, debugging, or when the raw network functionality of your operating system is somehow broken. The <code>NMAP_UNPRIVILEGED</code> environment variable may be set as an equivalent alternative to <code>--unprivileged</code>.</p>
<p>Questo flag è stato indispensabile affinché nmap funzionasse a causa di due concorrenti cause:</p>
<ul>
<li>
<p>la macchian è un Ovz container è probabilmente il network ha qualche configurazione particolare nella gestione dei raw sockets;</p>
</li>
<li>
<p>lanciando il comando da root, nmap assume l'utilizzo di yutte quelle capabilities da superutente che sono sì più precise, ma si basano sull'utilizzo di chiamate evidentemente proibite all'interno di un Linux Container.</p>
</li>
</ul>
<p>In ultima analisi, ho creato un output in formato xml; perché, direte? Dato che stavo tentando di parsare con pyhton e lo scan era già a metà, non me la sono sentita di cambiare :P</p>
<p>Magari cambierò il formato in "greppable" con -oG, ma non credo diminirebbe la grandezza del log..</p>
<p>Passando al test del proxy vero e proprio, il protagonista è netcat (il mio tool favorito):</p>
<div class="highlight"><pre><span></span><code>echo -e "GET http://google.com HTTP/1.0\n\host: google.com\n" | nc $i 8080 | grep 'Location: http://www.google.'
</code></pre></div>
<p>questa stringa invia semplicemente due righe all'ip /porta in questione tentando di fare una GET della pagina di google.com.</p>
<p>Se il server è configurato per fare da proxy, instraderà la richiesta passando indietro la pagina di google classica se ci si connette via http:</p>
<div class="highlight"><pre><span></span><code>HTTP/1.1<span class="w"> </span>302<span class="w"> </span>Found
Cache-Control:<span class="w"> </span>private
Content-Type:<span class="w"> </span>text/html;<span class="w"> </span>charset=UTF-8
Location:<span class="w"> </span>http://www.google.it/?gfe_rd=cr<span class="ni">&amp;</span>ei=_5H4U7jVB6rD8gee1oDgCA
Content-Length:<span class="w"> </span>258
Date:<span class="w"> </span>Sat,<span class="w"> </span>23<span class="w"> </span>Aug<span class="w"> </span>2014<span class="w"> </span>13:07:11<span class="w"> </span>GMT
Server:<span class="w"> </span>GFE/2.0
Alternate-Protocol:<span class="w"> </span>80:quic
<span class="nt"><HTML></span>
<span class="w"> </span><span class="nt"><HEAD></span>
<span class="w"> </span><span class="nt"><meta</span><span class="w"> </span><span class="na">http-equiv=</span><span class="s">"content-type"</span><span class="w"> </span><span class="na">content=</span><span class="s">"text/html;charset=utf-8"</span><span class="nt">></span><span class="w"> </span>
<span class="w"> </span><span class="nt"><TITLE></span>302<span class="w"> </span>Moved<span class="nt"></TITLE></span>
<span class="w"> </span><span class="nt"></HEAD></span>
<span class="w"> </span><span class="nt"><BODY></span><span class="w"> </span>
<span class="w"> </span><span class="nt"><H1></span>302<span class="w"> </span>Moved<span class="nt"></H1></span><span class="w"> </span>
<span class="w"> </span>The<span class="w"> </span>document<span class="w"> </span>has<span class="w"> </span>moved<span class="w"> </span><span class="nt"><A</span><span class="w"> </span><span class="na">HREF=</span><span class="s">"http://www.google.it/?gfe_rd=cr&amp;ei=_5H4U7jVB6rD8gee1oDgCA"</span><span class="nt">></span>here<span class="nt"></A></span>.<span class="w"> </span>
<span class="w"> </span><span class="nt"></BODY></span>
<span class="nt"></HTML></span>
</code></pre></div>
<p>Ho messo l'accento sul grep, per considerare (ci ho messo un po a capire) che google rimanda alla homepage del paese di provenienza dell'ip e, dato che stiamo scansionando reti grandi, gli ip potrebbero arrivare da chissà dove, restituendo, come nel caso sopra, l Location a google.it invece che la richiesta (google.com).</p>
<p>Poco altro c'è da dire sullo script, se non che manda una mail all'interessato al termine dello scan, che dura parecchie ore, con in allegato la lista di ip, se almeno un ip è risultato positivo dopo il check incrociato.</p>
<p>Fonti:</p>
<blockquote>
<p><a href="http://it-ovid.blogspot.se/2012/05/nmap-routedstnetlink-cant-find.html">it-ovid</a></p>
<p><a href="http://nmap.org/book/man.html">nmap.org</a></p>
<p><a href="http://www.unix.com/shell-programming-and-scripting/24289-need-attach-txt-file-while-sending-mail.html">unix.com</a></p>
</blockquote>
<p>Happy Hacking & stay TuNeD</p>remote weechat notification via urxvt & tmux2014-08-20T10:20:00+02:002014-08-20T10:20:00+02:00j0llytag:www.j0llyb0x.org,2014-08-20:/2014/remote-weechat-notification-via-urxvt-tmux.html<p>oggi è un grande giorno perché ho finalmente (e nuovamente) le notifiche desktop di weechat, grazie a urxvt.</p>
<p><img alt="weechat" src="https://www.j0llyb0x.org/images/weechat-1.png"></p>
<p>Prerequisiti:</p>
<p>*urxvt sulla macchina guest</p>
<p>*libnorify sulla amchcina guest</p>
<p>*weechat sulla macchina server </p>
<p>Questo metodo è abbastanza hacker, ma su internet ho visto cose veramente più brutte e questa è la più …</p><p>oggi è un grande giorno perché ho finalmente (e nuovamente) le notifiche desktop di weechat, grazie a urxvt.</p>
<p><img alt="weechat" src="https://www.j0llyb0x.org/images/weechat-1.png"></p>
<p>Prerequisiti:</p>
<p>*urxvt sulla macchina guest</p>
<p>*libnorify sulla amchcina guest</p>
<p>*weechat sulla macchina server </p>
<p>Questo metodo è abbastanza hacker, ma su internet ho visto cose veramente più brutte e questa è la più elegante che ho trovato, per ci più mi ha fatto scoprire cose di urxvt che non sapevo e che mi fa capire come mai molti lo utilizzano così massivamente.</p>
<p>per prima cose è necessario aggiungere la gestione delle notifiche urgenti dei programmi via shell aggiungendo la line nel file .Xresources (o .Xdefaults):</p>
<div class="highlight"><pre><span></span><code>urxvt.urgentOnBell: True
xrdb .Xresources
</code></pre></div>
<p>ed ora aprendo una nuova shell, basta lanciare un comando di prova tipo sleep 5 e spostarsi in un altro workspace (o comunque mettendo fuori fuoco la finestra) e dovrebbe illuminarsi all'uscita del comando.</p>
<p>ora che abbiamo i nostri luccichii, passiamo alla gestione delle notifiche vere e proprie e, se si vuole, anche il segnale acustico..</p>
<p>create questo script mettendolo in una directory che preferite (io in .urxvt/notifier):</p>
<p>[gist url="https://gist.github.com/j0lly/f99df5b9676faf2e231b"]</p>
<p>ora modificate ancora il vostro .Xresources in modo da utilizzare il nuovo plugin:</p>
<div class="highlight"><pre><span></span><code><span class="o">!</span><span class="w"> </span><span class="n">beep</span><span class="w"> </span><span class="n">via</span><span class="w"> </span><span class="n">urxvt</span><span class="w"> </span><span class="n">signals</span><span class="w"> </span><span class="o">&</span><span class="n">amp</span><span class="p">;</span><span class="w"> </span><span class="n">perl</span><span class="w"> </span><span class="n">extension</span>
<span class="n">URxvt</span><span class="o">.</span><span class="n">perl</span><span class="o">-</span><span class="n">lib</span><span class="p">:</span><span class="w"> </span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">j0lly</span><span class="o">/.</span><span class="n">urxvt</span><span class="o">/</span>
<span class="n">URxvt</span><span class="o">.</span><span class="n">perl</span><span class="o">-</span><span class="n">ext</span><span class="p">:</span><span class="w"> </span><span class="n">notifier</span>
</code></pre></div>
<p>reload delle funzioni coma sopra e tutto dovrebbe funzionare (controllate di avere aplay e notify-send installati e funzionanti, e scegliete un suono che vi aggrada); non resta che provare:</p>
<div class="highlight"><pre><span></span><code>echo -ne "\033]777;notify;titolo;Ciao Mondo\007\007"
</code></pre></div>
<p>Ho notato che ci sono alcune mancanze, come la possibilità di avere un subject della notifica separato da spazi, ed altre limitazioni, mo ci sarà tempo di affinare.
Ora, spostandoci sul server che ospita la sessione di weechat dentro il multiplexer (tmux o screen), ed aggiungiamo questo script
[gist url="https://gist.github.com/j0lly/8803d4067bb00c05ab23"]</p>
<p>in ~/.weechat/python/osc_notify.py</p>
<p>ed un link per l'autostart:</p>
<div class="highlight"><pre><span></span><code><span class="n">cd</span><span class="w"> </span><span class="o">~/.</span><span class="n">weechat</span><span class="o">/</span><span class="n">pyhton</span><span class="o">/</span><span class="n">autoload</span><span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">ln</span><span class="w"> </span><span class="o">-</span><span class="n">s</span><span class="w"> </span><span class="o">../</span><span class="n">osc_notify</span><span class="o">.</span><span class="n">py</span><span class="w"> </span><span class="n">osc_notify</span><span class="o">.</span><span class="n">py</span>
</code></pre></div>
<p>e su weechat:</p>
<div class="highlight"><pre><span></span><code><span class="o">/</span><span class="n">script</span><span class="w"> </span><span class="nb">load</span><span class="w"> </span><span class="n">osc_notify</span><span class="o">.</span><span class="n">py</span>
</code></pre></div>
<p>perfetto, da ora ogni notifica via weechat verrà instradata come messaggio osc e gestito da urxvt.</p>
<p>Una nota:</p>
<p>Lo script per weechat utilizza una stringa di notifica diversa da quella nello script sul guest; questo perché è necessario un escape del multiplexer, producendo una stringa del tipo:</p>
<div class="highlight"><pre><span></span><code>\033Ptmux;\033\033]777;notify;titolo;messaggio di testo\007\007\033\\\
</code></pre></div>
<p>per la sessione screen, i caratteri di escape dovrebbero essere:</p>
<div class="highlight"><pre><span></span><code>\033P\033]777;notify;titolo;messaggio di testo\007\007\033\\\
</code></pre></div>
<p>ma non ne sono sicuro non avendo provato.</p>
<p>Spero sia servito.</p>
<p>Stay TuNeD</p>
<p>Fonti:</p>
<blockquote>
<p><a href="https://snippet.phyks.me/index.php?tag=Weechat">phyks</a></p>
<p><a href="http://artisan.karma-lab.net/ajouter-notification-a-urxvt">karma-lab</a></p>
<p><a href="http://mlomnicki.com/ruby/linux/2011/02/09/irc-notifications.html">mlomnicki</a></p>
<p><a href="https://bbs.archlinux.org/viewtopic.php?pid=1364337">archlinux</a></p>
<p><a href="http://comments.gmane.org/gmane.comp.terminal-emulators.tmux.user/1322ù">gmane</a></p>
</blockquote>[kvm] pxe installation over console2014-08-19T10:20:00+02:002014-08-19T10:20:00+02:00j0llytag:www.j0llyb0x.org,2014-08-19:/2014/kvm-pxe-installation-over-console.html<p>Questo articolo vuole essere una prima bozza che raccogliesse i passaggi compiuti per arrivare all'automazione di installazioni Centos (a breve debian e qualche opzione supplementare di installazione). </p>
<p><img alt="kvm" src="https://www.j0llyb0x.org/images/kvm-1.jpg"></p>
<p>i prerequisiti, non trattati in questa sede:</p>
<ul>
<li>un hypervisor kvm basato su libvirt</li>
<li>un guest all'interno dello stesso network virtuale nel quale verranno …</li></ul><p>Questo articolo vuole essere una prima bozza che raccogliesse i passaggi compiuti per arrivare all'automazione di installazioni Centos (a breve debian e qualche opzione supplementare di installazione). </p>
<p><img alt="kvm" src="https://www.j0llyb0x.org/images/kvm-1.jpg"></p>
<p>i prerequisiti, non trattati in questa sede:</p>
<ul>
<li>un hypervisor kvm basato su libvirt</li>
<li>un guest all'interno dello stesso network virtuale nel quale verranno creati i nuovi guests:</li>
<li>esso funge da pxe/tftpd server;</li>
<li>repository (facoltativo) per l'installazione dei pacchetti. </li>
</ul>
<p>i principali componenti, trattati in questo articolo sono:</p>
<ul>
<li>modifica del network virtuale di riferimento per gestire il pxe booting;</li>
<li>installazione e configurazione del pxe booting sul guest di riferimento;</li>
<li>installazione e configurazione di un webserver per la gestione dei file kickstart/preseed;</li>
<li>configurazione del webserver come repository di pacchetti (opzionale).</li>
</ul>
<p>Ovviamente sono passato da varie fasi di affinamento ed è per questo che spero di evirare qualche grattacapo a voi.</p>
<p>Per prima cosa, è indispensabile modificare il network utilizzato; io ho utilizzato quello di default perché virt-manager lo utilizza per le nuove installazioni, ma questo non è così importante quindi scegliete voi il network che preferite.</p>
<div class="highlight"><pre><span></span><code><span class="nt"><network></span>
<span class="w"> </span><span class="nt"><name></span>default<span class="nt"></name></span>
<span class="w"> </span><span class="nt"><uuid></span>xxxxxxxxxxxxxxxxxxxxxxxxxxxxx<span class="nt"></uuid></span>
<span class="w"> </span><span class="nt"><forward</span><span class="w"> </span><span class="na">mode=</span><span class="s">'nat'</span><span class="nt">></span>
<span class="w"> </span><span class="nt"><nat></span>
<span class="w"> </span><span class="nt"><port</span><span class="w"> </span><span class="na">start=</span><span class="s">'1024'</span><span class="w"> </span><span class="na">end=</span><span class="s">'65535'</span><span class="nt">/></span>
<span class="w"> </span><span class="nt"></nat></span>
<span class="w"> </span><span class="nt"></forward></span>
<span class="w"> </span><span class="nt"><bridge</span><span class="w"> </span><span class="na">name=</span><span class="s">'virbr0'</span><span class="w"> </span><span class="na">stp=</span><span class="s">'on'</span><span class="w"> </span><span class="na">delay=</span><span class="s">'0'</span><span class="nt">/></span>
<span class="w"> </span><span class="nt"><mac</span><span class="w"> </span><span class="na">address=</span><span class="s">'52:54:00:d1:f9:75'</span><span class="nt">/></span>
<span class="w"> </span><span class="nt"><dns></span>
<span class="w"> </span><span class="nt"><forwarder</span><span class="w"> </span><span class="na">addr=</span><span class="s">'8.8.8.8'</span><span class="nt">/></span>
<span class="w"> </span><span class="nt"><host</span><span class="w"> </span><span class="na">ip=</span><span class="s">'192.168.122.1'</span><span class="nt">></span>
<span class="w"> </span><span class="nt"><hostname></span>meh<span class="nt"></hostname></span>
<span class="w"> </span><span class="nt"></host></span>
<span class="w"> </span><span class="nt"></dns></span>
<span class="w"> </span><span class="nt"><ip</span><span class="w"> </span><span class="na">address=</span><span class="s">'192.168.122.1'</span><span class="w"> </span><span class="na">netmask=</span><span class="s">'255.255.255.0'</span><span class="nt">></span>
<span class="w"> </span><span class="nt"><dhcp></span>
<span class="w"> </span><span class="nt"><range</span><span class="w"> </span><span class="na">start=</span><span class="s">'192.168.122.2'</span><span class="w"> </span><span class="na">end=</span><span class="s">'192.168.122.20'</span><span class="nt">/></span>
<span class="w"> </span><span class="nt"><host</span><span class="w"> </span><span class="na">mac=</span><span class="s">'52:54:00:92:c7:98'</span><span class="w"> </span><span class="na">name=</span><span class="s">'mysql01.cluster.io'</span><span class="w"> </span><span class="na">ip=</span><span class="s">'192.168.122.51'</span><span class="nt">/></span>
<span class="w"> </span><span class="nt"><host</span><span class="w"> </span><span class="na">mac=</span><span class="s">'52:54:00:3e:31:f3'</span><span class="w"> </span><span class="na">name=</span><span class="s">'mysql02.cluster.io'</span><span class="w"> </span><span class="na">ip=</span><span class="s">'192.168.122.52'</span><span class="nt">/></span>
<span class="w"> </span><span class="nt"><host</span><span class="w"> </span><span class="na">mac=</span><span class="s">'52:54:00:d8:40:7d'</span><span class="w"> </span><span class="na">name=</span><span class="s">'mysql03.cluster.io'</span><span class="w"> </span><span class="na">ip=</span><span class="s">'192.168.122.53'</span><span class="nt">/></span>
<span class="w"> </span><span class="nt"><host</span><span class="w"> </span><span class="na">mac=</span><span class="s">'52:54:00:74:d8:b4'</span><span class="w"> </span><span class="na">name=</span><span class="s">'diablo.cluster.io'</span><span class="w"> </span><span class="na">ip=</span><span class="s">'192.168.122.90'</span><span class="nt">/></span>
<span class="w"> </span><span class="nt"><host</span><span class="w"> </span><span class="na">mac=</span><span class="s">'52:54:00:45:72:3c'</span><span class="w"> </span><span class="na">name=</span><span class="s">'booter.cluster.io'</span><span class="w"> </span><span class="na">ip=</span><span class="s">'192.168.122.91'</span><span class="nt">/></span>
<span class="w"> </span><span class="nt"><bootp</span><span class="w"> </span><span class="na">file=</span><span class="s">'pxelinux.0'</span><span class="w"> </span><span class="na">server=</span><span class="s">'192.168.122.91'</span><span class="nt">/></span>
<span class="w"> </span><span class="nt"></dhcp></span>
<span class="w"> </span><span class="nt"></ip></span>
<span class="nt"></network></span>
</code></pre></div>
<p>le parti in rosso sono quelle necessarie per creare un pxe boot server:</p>
<p>In particolare, l'opzione <bootp /> ha come parametro file il nome del bootloader di rete, posizionato sul server 192.168.122.91.</p>
<p>Se non si volesse utilizzare un server tftpd esterno, è possibile (e più rapido) specificare l'host come tftpd server, eliminando l'opzione server= ed aggiungendo <tftp root='/tftpboot'/> come figlio del tag <ip>, allo stesso livello del tag <dhcp>, per intenderci.</p>
<p>dopo aver apportato questa modifica, è necessario riavviare il network; per fare cioò ricordatevi di spegnere tutte le macchine al suo interno perché, al meno con la mia versione, restartando il network con VM accese dentro, quelle stesse macchine non saranno più raggiungibili via network.</p>
<p>Dopo aver fatto ciò, basta stoppare il network e startarlo di nuovo:</p>
<div class="highlight"><pre><span></span><code>virsh net-destroy default
virsh start default
</code></pre></div>
<p>ora possiamo spostarci sulla VM che ospiterà tutto l'essenziale per l'installazione headless.</p>
<p>La mia macchina di riferimento è una Centos 6, con 1G Ram e 1Vcpu; sul repository ufficiale è già presente tutto l'occorrente per il pxe booting.</p>
<div class="highlight"><pre><span></span><code>yum install tftp-server
</code></pre></div>
<p>nella directory /tftpboot sarà ora presente il bootloader pxelinux con i relativi files.</p>
<p>per configurare il nostro booloader in bodo che ci permetta di scegliere che tipo di installazione fare, è necessario creare una directory all'interno del folder:</p>
<div class="highlight"><pre><span></span><code>mkdir -p /tftpboot/pxelinux.cfg/{centos6,debian7}
</code></pre></div>
<p>all'interno della cartella pxelinux.cfg è necessario anche creare il file di configurazione che pxelinux cercherà come default, con il nome, appunto, default:</p>
<div class="highlight"><pre><span></span><code><span class="k">default</span><span class="w"> </span><span class="nx">grml32</span>
<span class="nx">implicit</span><span class="w"> </span><span class="mi">0</span>
<span class="nx">prompt</span><span class="w"> </span><span class="mi">1</span>
<span class="nx">timeout</span><span class="w"> </span><span class="mi">100</span>
<span class="nx">ontimeout</span><span class="w"> </span><span class="nx">localboot</span>
<span class="nx">console</span><span class="w"> </span><span class="mi">0</span>
<span class="nx">serial</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">115200</span><span class="w"> </span><span class="mi">0</span>
<span class="nx">display</span><span class="w"> </span><span class="nx">boot</span><span class="p">.</span><span class="nx">msg</span>
<span class="nx">F1</span><span class="w"> </span><span class="nx">boot</span><span class="p">.</span><span class="nx">msg</span>
<span class="nx">LABEL</span><span class="w"> </span><span class="nx">centos6</span>
<span class="nx">MENU</span><span class="w"> </span><span class="nx">LABEL</span><span class="w"> </span><span class="nx">CENTOS6</span><span class="w"> </span><span class="mi">64</span><span class="w"> </span><span class="nx">bit</span><span class="w"> </span><span class="p">(</span><span class="nx">Minimal</span><span class="w"> </span><span class="nx">Installation</span><span class="p">)</span>
<span class="nx">kernel</span><span class="w"> </span><span class="nx">centos6</span><span class="o">/</span><span class="nx">vmlinuz</span>
<span class="nx">append</span><span class="w"> </span><span class="nx">initrd</span><span class="p">=</span><span class="nx">centos6</span><span class="o">/</span><span class="nx">initrd</span><span class="p">.</span><span class="nx">img</span><span class="w"> </span><span class="nx">ks</span><span class="p">=</span><span class="nx">http</span><span class="p">:</span><span class="c1">//192.168.122.91/ks_centos6.cfg console=ttyS0,115200 earlyprint=serial,ttyS0,115200</span>
<span class="nx">LABEL</span><span class="w"> </span><span class="nx">debian</span>
<span class="nx">MENU</span><span class="w"> </span><span class="nx">LABEL</span><span class="w"> </span><span class="nx">DEBIAN</span><span class="w"> </span><span class="nx">AMD64</span><span class="w"> </span><span class="p">(</span><span class="nx">Debian</span><span class="w"> </span><span class="nx">Testing</span><span class="p">)</span>
<span class="nx">kernel</span><span class="w"> </span><span class="nx">debian7</span><span class="o">/</span><span class="nx">linux</span>
<span class="nx">append</span><span class="w"> </span><span class="nx">url</span><span class="p">=</span><span class="nx">http</span><span class="p">:</span><span class="c1">//192.168.122.91/server-base.cfg priority=critical DEBIAN_FRONTEND=noninteractive install debconf/priority=medium debian-installer/allow_unauthenticated=true vga=true initrd=debian7/initrd.gz -- console=ttyS0,115200 earlyprint=serial,ttyS0,115200</span>
<span class="nx">LABEL</span><span class="w"> </span><span class="nx">localboot</span>
<span class="nx">MENU</span><span class="w"> </span><span class="nx">LABEL</span><span class="w"> </span><span class="nx">LOCALBOOT</span>
<span class="nx">localboot</span><span class="w"> </span><span class="mi">0</span>
</code></pre></div>
<p>La configurazione prevede un file boot.msg in /tftpboot; un semplice file di test che faccia un print a video delle opzioni da poter utilizzare:</p>
<p>!!!!!!PXE BOOT MENU!!!!!!!
centos6 - minimal CentOS 64bit
debian - Debian GNU/Linux Preseed</p>
<p>in questo modo, sarà sempre possibile sapere cosa cercare all'avvio.</p>
<p>è anche impostato un fallback per l'avvio da HD allo scadere del timout o, semplicemente, digitando localboot.</p>
<p>Tra le impostazioni è anche necessario settare una console per la redirezione dell'output, segnate in grassetto. è importante mettere il richiamo al file boot.msg dopo la console, in modo da vederne l'output; alra cosa importante, è quella di settare la stessa velocità di baud tra pxelinux e l'installer kickstart/preseed (non è importante la velocità, dato che stiamo parlando di seriali virtuali :P ).</p>
<p>come avrete notato, all'interno delle definizioni dei due tipi di installazione sono specificati i file locali dovre trovare kernel ed ramdisk (non dimenticate di copiare i binari nelle cartelle suddette, prendendoli direttamente dai siti delle distro), mentre il file di installazione automatico è reperibile via http. altra considerazione è l'aggiunta ai parametri di boot della console virtuale.
Per abilitare il tftpd server, è ora necessario modficare le linee del file /etc/xinetd.d/tftp:</p>
<div class="highlight"><pre><span></span><code><span class="nx">service</span><span class="w"> </span><span class="nx">tftp</span>
<span class="p">{</span>
<span class="nx">socket_type</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">dgram</span>
<span class="nx">protocol</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">udp</span>
<span class="nx">wait</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">yes</span>
<span class="nx">user</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">root</span>
<span class="nx">server</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="o">/</span><span class="nx">usr</span><span class="o">/</span><span class="nx">sbin</span><span class="o">/</span><span class="k">in</span><span class="p">.</span><span class="nx">tftpd</span>
<span class="nx">server_args</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="o">-</span><span class="nx">s</span><span class="w"> </span><span class="o">/</span><span class="nx">tftpboot</span>
<span class="nx">disable</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">no</span>
<span class="nx">per_source</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">11</span>
<span class="nx">cps</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="mi">2</span>
<span class="nx">flags</span><span class="w"> </span><span class="p">=</span><span class="w"> </span><span class="nx">IPv4</span>
<span class="p">}</span>
</code></pre></div>
<p>le modifiche sono solo 2, come sottolineato.</p>
<p>Ora un bel:</p>
<div class="highlight"><pre><span></span><code>kill -HUP $(pidof xinetd)
</code></pre></div>
<p>oppure</p>
<div class="highlight"><pre><span></span><code>service xinetd start
chkconfig xinetd on
</code></pre></div>
<p>ed il nostro tftp server dovrebbe essere in ascolto sulla porta 69 udp:</p>
<div class="highlight"><pre><span></span><code>netstat -nlp | grep xinetd
</code></pre></div>
<p>Per la parte di webserver, ho utilizzato lighttpd, dato che la richiesta di risorse è infima, anche se ho perso qualche minuto per alcune configurazioni di default.</p>
<p>Ovviamente, potete usare qualsiasi webserver, in grado di servire i files kickstart/preseed e, se l'avete configurato, il repository con i pacchetti da installare.</p>
<p>Per prima cosa è necessario scaricare il binario dal repo epel, dato che centos non lo mette a disposizione:</p>
<div class="highlight"><pre><span></span><code>wget http://dl.fedoraproject.org/pub/epel/6/x86_64/lighttpd-1.4.35-1.el6.x86_64.rpm
rpm -i lighttpd-1.4.35-1.el6.x86_64.rpm
</code></pre></div>
<p>ora, è necessario modificare un paconsole=ttyS0,115200 earlyprint=serial,ttyS0,115200io di parametri, per bindare correttamente il server e per la gestione del directory listing.</p>
<div class="highlight"><pre><span></span><code><span class="n">sed</span><span class="w"> </span><span class="o">-</span><span class="n">i</span><span class="w"> </span><span class="o">/</span><span class="n">server</span><span class="o">.</span><span class="n">bind</span><span class="o">/</span><span class="n">s</span><span class="o">/^/</span><span class="c1">#/ /etc/lighttpd/lighttpd.conf</span>
<span class="n">sed</span><span class="w"> </span><span class="o">-</span><span class="n">i</span><span class="w"> </span><span class="o">/</span><span class="n">dir</span><span class="o">-</span><span class="n">listing</span><span class="o">.</span><span class="n">activate</span><span class="o">/</span><span class="n">s</span><span class="o">/</span><span class="n">disable</span><span class="o">/</span><span class="n">enable</span><span class="o">/</span><span class="w"> </span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">lighttpd</span><span class="o">/</span><span class="n">conf</span><span class="o">.</span><span class="n">d</span><span class="o">/</span><span class="n">dirlisting</span><span class="o">.</span><span class="n">conf</span>
<span class="n">mkdir</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="o">/</span><span class="k">var</span><span class="o">/</span><span class="n">www</span><span class="o">/</span><span class="n">lighttpd</span><span class="o">/</span><span class="p">{</span><span class="n">centos6</span><span class="p">,</span><span class="n">debian7</span><span class="p">}</span>
<span class="n">service</span><span class="w"> </span><span class="n">lighttpd</span><span class="w"> </span><span class="n">start</span>
<span class="n">chkconfig</span><span class="w"> </span><span class="n">lighttpd</span><span class="w"> </span><span class="n">on</span>
</code></pre></div>
<p>ora, non resta che creare i files kickstart/preseed (al momento ho solo un kickstart funzionante):</p>
<p>ks_centos6.cfg:</p>
<div class="highlight"><pre><span></span><code><span class="cp">#version=DEVEL</span>
<span class="n">install</span>
<span class="cp">#SYSTEM</span>
<span class="n">url</span><span class="w"> </span><span class="o">--</span><span class="n">url</span><span class="o">=</span><span class="n">http</span><span class="o">:</span><span class="c1">//192.168.122.91/cconsole=ttyS0,115200 earlyprint=serial,ttyS0,115200entos6</span>
<span class="n">lang</span><span class="w"> </span><span class="n">it_IT</span><span class="p">.</span><span class="n">UTF</span><span class="mi">-8</span>
<span class="n">keyboard</span><span class="w"> </span><span class="n">it</span>
<span class="n">network</span><span class="w"> </span><span class="o">--</span><span class="n">onboot</span><span class="w"> </span><span class="n">yes</span><span class="w"> </span><span class="o">--</span><span class="n">device</span><span class="w"> </span><span class="n">eth0</span><span class="w"> </span><span class="o">--</span><span class="n">bootproto</span><span class="w"> </span><span class="n">dhcp</span><span class="w"> </span><span class="o">--</span><span class="n">ipv6</span><span class="w"> </span><span class="k">auto</span>
<span class="n">rootpw</span><span class="w"> </span><span class="o">--</span><span class="n">iscrypted</span><span class="w"> </span><span class="n">xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</span>
<span class="n">firewall</span><span class="w"> </span><span class="o">--</span><span class="n">service</span><span class="o">=</span><span class="n">ssh</span>
<span class="n">authconfig</span><span class="w"> </span><span class="o">--</span><span class="n">enableshadow</span><span class="w"> </span><span class="o">--</span><span class="n">passalgo</span><span class="o">=</span><span class="n">sha512</span>
<span class="n">selinux</span><span class="w"> </span><span class="o">--</span><span class="n">enforcing</span>
<span class="n">timezone</span><span class="w"> </span><span class="o">--</span><span class="n">utc</span><span class="w"> </span><span class="n">Europe</span><span class="o">/</span><span class="n">Rome</span>
<span class="n">bootloader</span><span class="w"> </span><span class="o">--</span><span class="n">location</span><span class="o">=</span><span class="n">mbr</span><span class="w"> </span><span class="o">--</span><span class="n">driveorder</span><span class="o">=</span><span class="n">vda</span><span class="w"> </span><span class="o">--</span><span class="n">append</span><span class="o">=</span><span class="s">"crashkernel=auto console=ttyS0,115200 earlyprint=serial,ttyS0,115200"</span>
<span class="n">skipx</span>
<span class="n">text</span>
<span class="n">reboot</span>
<span class="n">services</span><span class="w"> </span><span class="o">--</span><span class="n">disabled</span><span class="w"> </span><span class="n">ip6tables</span>
<span class="n">services</span><span class="w"> </span><span class="o">--</span><span class="n">enabled</span><span class="w"> </span><span class="n">ntpd</span>
<span class="n">zerombr</span>
<span class="n">clearpart</span><span class="w"> </span><span class="o">--</span><span class="n">initlabel</span><span class="w"> </span><span class="o">--</span><span class="n">all</span>
<span class="n">autopart</span>
<span class="cp">#PKGS</span>
<span class="n">repo</span><span class="w"> </span><span class="o">--</span><span class="n">name</span><span class="o">=</span><span class="s">"CentOS"</span><span class="w"> </span><span class="o">--</span><span class="n">baseurl</span><span class="o">=</span><span class="n">http</span><span class="o">:</span><span class="c1">//192.168.122.91/centos6/ --cost=100</span>
<span class="nf">%packages</span><span class="w"> </span><span class="o">--</span><span class="n">nobase</span>
<span class="err">@</span><span class="n">core</span>
<span class="nf">%end</span>
</code></pre></div>
<p>Le parti sottolineate sono ovviamente le più importanti affinché si possa generare un'installazione completamente automatica secondo i nostri criteri; in particolare, utilizzo un repository locale prodotto da una minimal iso di centos scaricabile dal sito della <a href="http://mirrors.prometeus.net/centos/6.5/isos/x86_64/CentOS-6.5-x86_64-minimal.iso">distro</a> copiando il conttenuto in /var/www/lighttpd/centos6/ (e kernel e initrd in /tftpboot/centos6 ).</p>
<p>Per generare l'hash della passwd di root:</p>
<div class="highlight"><pre><span></span><code>openssl passwd -1 "mypasswd"
</code></pre></div>
<p>anche qui, ho specificato la console con lo stesso baud rate degli altri componenti, in modo che grub passi al kernel la console da utilizzare dopo l'installazione. In questo modo, con una sola linea di codice sarà possibile installare una VM e trovarsi al suo prompt, in meno di 5 minuti!!!!</p>
<p>compiuti questi passaggi siamo pronti per installare la nostra prima vm; torniamo sull'host e installiamo una VM con il seguente comando:</p>
<div class="highlight"><pre><span></span><code><span class="n">virt</span><span class="o">-</span><span class="n">install</span><span class="w"> </span><span class="o">--</span><span class="n">name</span><span class="w"> </span><span class="n">test2</span><span class="w"> </span><span class="o">--</span><span class="n">virt</span><span class="o">-</span><span class="n">type</span><span class="w"> </span><span class="n">kvm</span><span class="w"> </span>\
<span class="o">--</span><span class="n">vcpus</span><span class="o">=</span><span class="mi">1</span><span class="w"> </span><span class="o">--</span><span class="n">ram</span><span class="w"> </span><span class="mi">1072</span><span class="w"> </span><span class="o">--</span><span class="n">network</span><span class="w"> </span><span class="n">network</span><span class="o">=</span><span class="n">default</span><span class="p">,</span><span class="n">model</span><span class="o">=</span><span class="n">virtio</span><span class="w"> </span>\<span class="w"> </span>
<span class="o">--</span><span class="n">disk</span><span class="w"> </span><span class="n">path</span><span class="o">=/</span><span class="n">home</span><span class="o">/</span><span class="n">j0lly</span><span class="o">/</span><span class="n">images</span><span class="o">/</span><span class="n">test02</span><span class="p">,</span><span class="n">size</span><span class="o">=</span><span class="mi">8</span><span class="w"> </span>\
<span class="o">--</span><span class="n">pxe</span><span class="w"> </span><span class="o">--</span><span class="n">nographics</span><span class="w"> </span><span class="o">--</span><span class="n">os</span><span class="o">-</span><span class="n">variant</span><span class="o">=</span><span class="n">rhel6</span><span class="w"> </span><span class="o">--</span><span class="n">os</span><span class="o">-</span><span class="n">type</span><span class="o">=</span><span class="n">linux</span><span class="w"> </span><span class="o">--</span><span class="n">autostart</span><span class="w"> </span><span class="o">--</span><span class="n">debug</span>
</code></pre></div>
<p>la parte magica qui è vestita dallo switch --pxe, che abilita il pxe booting durante l'installazione; da notare anche il network di riferimento, cioè quello utilizzato durante tutta la procedura del post.</p>
<p>Questa Guida è un draft, scritto di fretta per non dimenticare le cose fatte.</p>
<p>Spero di poter amliare, impaginare meglio ed aggiornare qualche conf, per ottimizzare la cosa.</p>
<p>Stay TuNeD</p>
<p>Fonti:</p>
<blockquote>
<p><a href="http://www.stephenwagner.com/?p=336">stephenwagner</a></p>
<p><a href="http://andreasmarschke.wordpress.com/2012/11/04/pxe-setup-with-libvirt-and-kvm/">andreasmarschke</a></p>
<p><a href="http://redmine.lighttpd.net/projects/1/wiki/Docs_ModDirlisting">lighttpd</a></p>
<p><a href="https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Virtualization_Host_Configuration_and_Guest_Installation_Guide/sect-Virtualization_Host_Configuration_and_Guest_Installation_Guide-Guest_Installation-Installing_guests_with_PXE.html">redhat</a></p>
<p><a href="http://www.cyberciti.biz/faq/kvm-install-centos-redhat-using-kickstart-ks-cfg/">cyberciti</a></p>
<p><a href="http://lists.soekris.com/pipermail/soekris-tech/2012-August/018541.html">soekris</a></p>
</blockquote>[howto] from wordpress to postach.io!!!2014-08-07T00:00:00+02:002014-08-07T00:00:00+02:00j0llytag:www.j0llyb0x.org,2014-08-07:/2014/howto-from-wordpress-to-postachio.html<p>Quando installai il mio primo blog personale, la presi come un'operazione didattica:
ho utilizzato uno sgarrupato vps che non stava manco in piedi (30Mb di RAM!!!) per installare tutto il necessario [mysql,php,nginx,wordpress] con relative costumizzazione etc.
Memore della mia performance e grato di aver appreso il necessario …</p><p>Quando installai il mio primo blog personale, la presi come un'operazione didattica:
ho utilizzato uno sgarrupato vps che non stava manco in piedi (30Mb di RAM!!!) per installare tutto il necessario [mysql,php,nginx,wordpress] con relative costumizzazione etc.
Memore della mia performance e grato di aver appreso il necessario sono ora senza molto tempo da dedicare al blog e, soprattuto, alla sua gestione quotidiana.
Ecco perché ho deciso di muovermi verso qualcosa di semplice, che richeidesse poco tempo per la gestione e che mi invogliasse a fare quello per il quale il blog è fatto: scrivere.
ed ecco <a href="http://postach.io/">postach.io</a>, la soluzione davvero comoda per i pigri: i post, come tutta la tecnologia che sta dietro questa piattaforma di blogging, è evernote! dal video è subito chiaro quanto sia facile scrivere un articolo, formattarlo e, senza fronzoli, metterlo subito sul blog; in pratica ora, ogni volta che prenderò degli appunti, il passagio da pezzo di informazione a post utile alla comunità è davvero corto.</p>
<p>Questo è il mio primo post su postach.io e, tra l'altro, parla proprio di come ho fatto a convertire il piei aricoli wordpress in formato leggibile da postach.io ed importarli direttamente in evernote.
Su internet c'è poco, ma fortunatamente qualcuno ha già fatto il 90% del lavoro: <a href="https://github.com/jjg/wp2evernote">https://github.com/jjg/wp2evernote</a> ha creato uno script in python (2.7) per l'importazione massiva dei propri post wordpress in evernote, già formattati per postach.io. Lo scrit però, come dice l'autore, è abbastanza rudimentale ed ha necessitato non pochi sforzi prima di arrivare al risultato. Ho anche deciso di provare a migliorare lo script avendo già alcune idee, sperando che anche il tempo abbondi..</p>
<p>Premetto che le operazioni sono state fatte tramite il mio sistema Arch, quindi le librerie e versioni potrebbero variare leggermente nel vostro caso.
In breve, i passaggi necessari per convertire tutti i nostri post wordpress in evernote sono i seguenti:</p>
<ul>
<li>
<p>creare un account su postach.io e creare la raccolta postach.io su evernote</p>
</li>
<li>
<p>richiedere un dev token su evernote per la manipolazione dell'account tramite API, all'indirizzo <a href="https://www.evernote.com/api/DeveloperToken.action">https://www.evernote.com/api/DeveloperToken.action</a></p>
</li>
<li>
<p>installare evernote pyhton sdk: <a href="https://github.com/evernote/evernote-sdk-python">https://github.com/evernote/evernote-sdk-python</a></p>
</li>
<li>
<p>disabilitare tutti i plugins perché alcuni interferiscono con l'archivio xml prodotto da wordpress.</p>
</li>
<li>
<p>esportare i propri articoli da wordpress: Tools>Export>Posts.</p>
</li>
<li>
<p>Aggiungere un tag radice (E.G. <root> </root>) altrimenti l'archivio non viene parsato dallo script di import:</p>
</li>
</ul>
<p><img alt="postach.io" src="https://www.j0llyb0x.org/images/fail-1.png"></p>
<ul>
<li>
<p>prendi script da github: <a href="https://github.com/jjg/wp2evernote">https://github.com/jjg/wp2evernote</a></p>
</li>
<li>
<p>fare un check del file xml perché titoli mancanti o problemi simili faranno inceppare lo script (es. <title></title> )</p>
</li>
</ul>
<p><img alt="postach.io" src="https://www.j0llyb0x.org/images/fail-2.png"></p>
<p>Dopo un paio di tentativi dovreste avere la vostra bella raccolta di articoli imoprtati in evernote: ricordate che sarann otuti già marcati come pubblicati e verranno quindi esposti (anche le draft)</p>
<p>Durante la mia piccola oddissea di una giornata ho riscontrato alcuni errori di carattere più personale che potrebbero essere di scarso valore per il resto del mondo, ma un'informazione in più è meglio di una in meno :P</p>
<ul>
<li>thrift-arch:</li>
</ul>
<p>Il pacchetto Aur per le API evernote-python su Archlinux è probabilmente non aggiornato, perché elimina la libreria Thrift embeddata nell'SDK ma la libreria servita da Arch è forse troppo recente e comunque non funziona bene con le API dell'SDK:</p>
<p><img alt="postach.io" src="https://www.j0llyb0x.org/images/fail-3.png"></p>
<p>modificando il PKGBUILD e lasciando la libreria originale, lo script funziona correttamente.
Durante l'importazione dei post, ho riscontrato alcuni fallimenti, dovuti a post malformati o non perfettamente gestiti da Wordpress (ad esempio quelli embeddati via altri servizi )</p>
<p><img alt="postach.io" src="https://www.j0llyb0x.org/images/fail-4.png"></p>
<p>Questo è un semplice draft che spero di riaggiornare quand oavrò il tempo di mettere le mani sullo script di import sopra menzionato.</p>
<p>Stay tuned!</p>
<p>EDIT:</p>
<p>Dopo l'import del sito ho notato che le imagini venivano gestite come link e non direttamente scaricate; questo non è bene per evernote dato che dovrebbe essere il nostro cesto dei ricordi e, se il link è rotto, addio ricordo :P.
Nel caso della migrazione da Wp, questo è ancora peggio, dato che i link puntano ad un blog wordpress che deve essere dismesso..
Con un po di volontà e tanta voglia di riscoprire il python, ho voluto contribuire allo script linkato sopra, per aggiungere la funzionalità di upload delle immagini, migliorando anche qualche errore in fase di parsing e gestione caratteri utf-8! Ho già fatto una pull request, ma se qualcuno ( :D ) volesse utilizzare lo script da subito, <a href="https://github.com/j0lly/wp2evernote/tree/beautifulsoup">questo</a> è il mio github forkato ed aggiornato; il branch è beautifulsoap perché ho aggiunto <a href="http://www.crummy.com/software/BeautifulSoup/">la libreria</a> alle dipendenze, che va installata separatamente.</p>
<p>EDIT 2 [2015-06-17]:</p>
<p>Ormai da qualche tempo postach.io (maledetto lui) è diventato a pagamento, revocando tutti i siti nell'arco di 20 giorni.
La cosa penosa è stato scoprire che non esistono metodi semplici per riprendersi tutti i post migrati da wordpress su evernote, soprattutto considerando che non ho più molto tempo da dedicare al blog...
Alla fine sono riuscito a migrare nuovamente da evernote (sintassi proprietaria) e postach.io (maledetti e 2) ad un metodo di storage dei documenti su markdown, ed utilizzando un motore di generazione di siti statici chiamato pelican (python) molto simile nella sostanza a jekyll, per chi lo conosce.
Sto ancora migrando, a fatica immagine econtenuti, oltre che correggere vari problemi di encoding dovuti alle varie migrazioni, ma suppongo di riuscire a migrare tutto a breve.</p>
<p>Farò probabilemnte un nuovo articolo per presentare Pelican e come ho deciso di hostare il nuovo sito.</p>
<p>Stay Tuned</p>[parte II] DNS, questo sconosciuto.. Configurazione di un Master autoritativo puro2014-06-19T00:00:00+02:002014-06-19T00:00:00+02:00j0llytag:www.j0llyb0x.org,2014-06-19:/2014/parte-ii-dns-questo-sconosciuto-configurazione-di-un-master-autoritativo-puro.html<p>Eccomi per la configurazione personale del mio Bind9 Master, autoritativo per il mio dominio, ed assolutamente non ricorsivo :).</p>
<p><img alt="bind9" src="https://www.j0llyb0x.org/images/bind-1.png"></p>
<p>Nell'articolo mostro anche dei test con dig per verificare le configurazioni ed il livello di sicurezza; consiglio di leggere la teoria alla base delle scelte di configurazione scritte nell'articolo <a href="http://j0llyb0x.org/parte-i-dns-questo-sconosciuto-06-2014/">I sui DNS …</a></p><p>Eccomi per la configurazione personale del mio Bind9 Master, autoritativo per il mio dominio, ed assolutamente non ricorsivo :).</p>
<p><img alt="bind9" src="https://www.j0llyb0x.org/images/bind-1.png"></p>
<p>Nell'articolo mostro anche dei test con dig per verificare le configurazioni ed il livello di sicurezza; consiglio di leggere la teoria alla base delle scelte di configurazione scritte nell'articolo <a href="http://j0llyb0x.org/parte-i-dns-questo-sconosciuto-06-2014/">I sui DNS</a>.</p>
<p>Premetto che la maggior parte del lavoro di configurazione è stato preso da <a href="http://d.stavrovski.net/blog/post/how-to-setup-and-configure-a-master-dns-bind-server-in-debian-wheezyjessie">questo articolo</a>, dove l'autore sembra davvero competente. Lui ha utilizzato una confgurazioen in chroot; io spero di poter testare la cosa in futuri, come compendio ad un terzo articolo sugli slave o magari sull'implementazione di un dns interno con forwarding etc.</p>
<p>La mia confgurazione consiste in:</p>
<ul>
<li>
<p>un server bind 9.8.4</p>
</li>
<li>
<p>Debian 7.5</p>
</li>
<li>
<p>bind in ascolto sull'interfaccia esterna come su localhost</p>
</li>
<li>
<p>configurazione Master (con già la predisposizione agli slaves e lo zone transfer)</p>
</li>
<li>
<p>Bind, dall'esterno, risolve solo le zone per le quali è autoritativo (mio dominio)</p>
</li>
<li>
<p>dall'interno (localhost) è possibile fare richieste DNS utilizzando la ricorsività direttamente verso i root servers; in realtà la macchina usa google come DNS, ma lasciare quest'opzione aperta non è male, soprattutto in fase di test.</p>
</li>
</ul>
<p>Bind9 su debian utilizza 4 principali files di configurazione:</p>
<ol>
<li>
<p>named.conf</p>
</li>
<li>
<p>named.conf.default-zones</p>
</li>
<li>
<p>named.conf.options</p>
</li>
<li>
<p>named.conf.local</p>
</li>
</ol>
<p>named.conf fa semplicemente il source degli altri 3 files.</p>
<p>named.conf.default-zones contiene le zone di default, tra cui gli indirizzi dei root servers e le zone per localhost (necessarie se si usa bind come resolver interno); anche questo file può non essere toccato.</p>
<p>Named.conf.options è il file che gestisce tutte le regole globali del NameServer, non specificatamente definite all'interno dei contesti "zone".</p>
<p>Ecco il mio:</p>
<div class="highlight"><pre><span></span><code><span class="o">/*</span>
<span class="o">*</span><span class="w"> </span><span class="n">Deny</span><span class="w"> </span><span class="n">transfers</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="n">default</span><span class="w"> </span><span class="n">except</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">listed</span><span class="w"> </span><span class="n">hosts</span><span class="o">.</span>
<span class="o">*</span><span class="w"> </span><span class="n">If</span><span class="w"> </span><span class="n">we</span><span class="w"> </span><span class="n">have</span><span class="w"> </span><span class="n">other</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="n">servers</span><span class="p">,</span><span class="w"> </span><span class="n">place</span><span class="w"> </span><span class="n">them</span><span class="w"> </span><span class="n">here</span><span class="o">.</span>
<span class="o">*/</span>
<span class="n">acl</span><span class="w"> </span><span class="s2">"xfer"</span><span class="w"> </span><span class="p">{</span>
<span class="n">xxx</span><span class="o">.</span><span class="n">xxx</span><span class="o">.</span><span class="n">xxx</span><span class="o">.</span><span class="n">xxx</span><span class="p">;</span>
<span class="p">};</span>
<span class="o">/*</span>
<span class="o">*</span><span class="w"> </span><span class="n">You</span><span class="w"> </span><span class="n">might</span><span class="w"> </span><span class="n">put</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">here</span><span class="w"> </span><span class="n">some</span><span class="w"> </span><span class="n">ips</span><span class="w"> </span><span class="n">which</span><span class="w"> </span><span class="n">are</span><span class="w"> </span><span class="n">allowed</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">cache</span><span class="w"> </span><span class="ow">or</span>
<span class="o">*</span><span class="w"> </span><span class="n">recursive</span><span class="w"> </span><span class="n">queries</span>
<span class="o">*/</span>
<span class="n">acl</span><span class="w"> </span><span class="s2">"trusted"</span><span class="w"> </span><span class="p">{</span>
<span class="mf">127.0</span><span class="o">.</span><span class="mf">0.0</span><span class="o">/</span><span class="mi">8</span><span class="p">;</span>
<span class="p">};</span>
<span class="n">options</span><span class="w"> </span><span class="p">{</span>
<span class="n">directory</span><span class="w"> </span><span class="s2">"/var/cache/bind"</span><span class="p">;</span>
<span class="n">pid</span><span class="o">-</span><span class="n">file</span><span class="w"> </span><span class="s2">"/var/run/named/named.pid"</span><span class="p">;</span>
<span class="n">dump</span><span class="o">-</span><span class="n">file</span><span class="w"> </span><span class="s2">"/tmp/named_master_dump.db"</span><span class="p">;</span>
<span class="n">listen</span><span class="o">-</span><span class="n">on</span><span class="o">-</span><span class="n">v6</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">none</span><span class="p">;</span><span class="w"> </span><span class="p">};</span>
<span class="o">//</span><span class="w"> </span><span class="n">listen</span><span class="o">-</span><span class="n">on</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="mf">127.0</span><span class="o">.</span><span class="mf">0.1</span><span class="p">;</span><span class="w"> </span><span class="p">};</span>
<span class="n">listen</span><span class="o">-</span><span class="n">on</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">any</span><span class="p">;</span><span class="w"> </span><span class="p">};</span>
<span class="o">/*</span>
<span class="o">*</span><span class="w"> </span><span class="n">Accept</span><span class="w"> </span><span class="n">queries</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">our</span><span class="w"> </span><span class="s2">"trusted"</span><span class="w"> </span><span class="n">ACL</span><span class="o">.</span><span class="w"> </span><span class="n">We</span><span class="w"> </span><span class="n">will</span>
<span class="o">*</span><span class="w"> </span><span class="n">allow</span><span class="w"> </span><span class="n">anyone</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">query</span><span class="w"> </span><span class="n">our</span><span class="w"> </span><span class="k">master</span><span class="w"> </span><span class="n">zones</span><span class="w"> </span><span class="n">below</span><span class="o">.</span>
<span class="o">*</span><span class="w"> </span><span class="n">This</span><span class="w"> </span><span class="n">prevents</span><span class="w"> </span><span class="n">us</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">becoming</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">free</span><span class="w"> </span><span class="n">DNS</span><span class="w"> </span><span class="n">server</span>
<span class="o">*</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">masses</span><span class="o">.</span>
<span class="o">*/</span>
<span class="n">allow</span><span class="o">-</span><span class="n">query</span><span class="w"> </span><span class="p">{</span>
<span class="n">trusted</span><span class="p">;</span>
<span class="p">};</span>
<span class="o">/*</span><span class="w"> </span><span class="n">Use</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">cache</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="s2">"trusted"</span><span class="w"> </span><span class="n">ACL</span><span class="o">.</span><span class="w"> </span><span class="o">*/</span>
<span class="n">allow</span><span class="o">-</span><span class="n">query</span><span class="o">-</span><span class="n">cache</span><span class="w"> </span><span class="p">{</span>
<span class="n">trusted</span><span class="p">;</span>
<span class="p">};</span>
<span class="o">/*</span><span class="w"> </span><span class="n">Only</span><span class="w"> </span><span class="n">trusted</span><span class="w"> </span><span class="n">addresses</span><span class="w"> </span><span class="n">are</span><span class="w"> </span><span class="n">allowed</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">use</span><span class="w"> </span><span class="n">recursion</span><span class="o">.</span><span class="w"> </span><span class="o">*/</span>
<span class="n">allow</span><span class="o">-</span><span class="n">recursion</span><span class="w"> </span><span class="p">{</span>
<span class="n">trusted</span><span class="p">;</span>
<span class="p">};</span>
<span class="o">/*</span><span class="w"> </span><span class="n">Zone</span><span class="w"> </span><span class="n">tranfers</span><span class="w"> </span><span class="n">are</span><span class="w"> </span><span class="n">denied</span><span class="w"> </span><span class="n">by</span><span class="w"> </span><span class="n">default</span><span class="o">.</span><span class="w"> </span><span class="o">*/</span>
<span class="n">allow</span><span class="o">-</span><span class="n">transfer</span><span class="w"> </span><span class="p">{</span>
<span class="n">none</span><span class="p">;</span>
<span class="p">};</span>
<span class="o">/*</span><span class="w"> </span><span class="n">Don</span><span class="s1">'t allow updates, e.g. via nsupdate. */</span>
<span class="n">allow</span><span class="o">-</span><span class="n">update</span><span class="w"> </span><span class="p">{</span>
<span class="n">none</span><span class="p">;</span>
<span class="p">};</span>
<span class="o">/*</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="n">you</span><span class="w"> </span><span class="n">have</span><span class="w"> </span><span class="n">problems</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">are</span><span class="w"> </span><span class="n">behind</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">firewall</span><span class="p">:</span><span class="w"> </span><span class="o">*/</span>
<span class="o">//</span><span class="n">query</span><span class="o">-</span><span class="n">source</span><span class="w"> </span><span class="n">address</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">port</span><span class="w"> </span><span class="mi">53</span><span class="p">;</span>
<span class="n">dnssec</span><span class="o">-</span><span class="n">validation</span><span class="w"> </span><span class="n">auto</span><span class="p">;</span>
<span class="n">auth</span><span class="o">-</span><span class="n">nxdomain</span><span class="w"> </span><span class="n">no</span><span class="p">;</span><span class="w"> </span><span class="c1"># conform to RFC1035</span>
<span class="n">version</span><span class="w"> </span><span class="s2">"windows NT"</span><span class="p">;</span>
<span class="o">//</span><span class="n">forward</span><span class="w"> </span><span class="n">first</span>
<span class="o">//</span><span class="w"> </span><span class="n">forwarders</span><span class="w"> </span><span class="p">{</span>
<span class="o">//</span><span class="w"> </span><span class="mf">0.0</span><span class="o">.</span><span class="mf">0.0</span><span class="p">;</span>
<span class="o">//</span><span class="w"> </span><span class="p">};</span>
<span class="p">};</span>
</code></pre></div>
<p>In soldoni, questo file crea alcune acl: la prima da applicare al xfer transfer, nel caso creiate degli slave, basta aggiungere i loro ip sostituendoli alle xxx; la seconda crea un gruppo di ip trusted che potranno usare il NameServer come resolver ricorsivo (a la Google DNS).</p>
<p>Alla configurazione di default ho aggiunto l'opzione dump-file, perché esiste un bug (per lo meno nel pacchetto debian) che di default scrive il dump delle zone in una cartella non accessibile a bind, facendomi impazzire in fase di troubleshooting; più in basso è stato disabilitato l'IPv6..</p>
<p>Le direttive successive in pratica abilitano query, lettura record in cache e recursion solo per gli IP trusted (localhost) e vedremo che queste opzioni vengono sovrascritte all'interno della nostra zona particolare.</p>
<p>Ultima direttiva utile è il deny del trasfer che, anch'esso, verrà riabilitato per determinati host in sede di opzioni di zona.</p>
<p>la direttiva version che ho aggiunto, beh, ne parlo dopo :P</p>
<p>Named.conf.local è il file preposto alla gestione delle zone personali, con confgurazioni ad-hoc e il richiamo al file.db con i dati della zona; il mio è così:</p>
<div class="highlight"><pre><span></span><code><span class="c1">//</span>
<span class="c1">// Do any local configuration here</span>
<span class="c1">//</span>
<span class="c1">// Consider adding the 1918 zones here, if they are not used in your</span>
<span class="c1">// organization</span>
<span class="c1">//include "/etc/bind/zones.rfc1918";</span>
<span class="c1">// We are the master server for j0llyb0x.org</span>
<span class="nx">zone</span><span class="w"> </span><span class="s">"j0llyb0x.org"</span><span class="w"> </span><span class="p">{</span>
<span class="k">type</span><span class="w"> </span><span class="nx">master</span><span class="p">;</span>
<span class="nx">file</span><span class="w"> </span><span class="s">"/etc/bind/db.j0llyb0x.org"</span><span class="p">;</span>
<span class="nx">allow</span><span class="o">-</span><span class="nx">query</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">any</span><span class="p">;</span><span class="w"> </span><span class="p">};</span>
<span class="nx">allow</span><span class="o">-</span><span class="nx">transfer</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nx">xfer</span><span class="p">;</span><span class="w"> </span><span class="p">};</span>
<span class="p">};</span>
</code></pre></div>
<p>Nella configurazione di zona, come si vede, si punta al file (ricordate il path assoluto!) che hosta i records, per i quali siamo Master; le due direttive allow-query e allow-transfer, servono a gestire questa zona particolare, permettendo le query non ricorsive (la cache dei record e la ricorsività restano disabilitati a livello di conf globali) per i record specifici e il transfer da parte degli host slave "sicuri".</p>
<p>Da notare che non ho ancora configurato i PTR records, ma non è complesso partendo da quello di default per localhost (127.in-addr.arpa). In questo file viene specificata una zona di competenza, per la quale bind è autoritativo e Master.</p>
<p>Ed ecco il contenuto del mio file di zona db.j0llyb0x.org:</p>
<div class="highlight"><pre><span></span><code><span class="c1">;</span>
<span class="c1">; Zone file for j0llyb0x.org</span>
<span class="c1">;</span>
$<span class="nv">TTL</span><span class="w"> </span><span class="mi">3</span><span class="nv">D</span>
@<span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="nv">IN</span><span class="w"> </span><span class="nv">SOA</span><span class="w"> </span><span class="nv">ns1</span>.<span class="nv">j0llyb0x</span>.<span class="nv">org</span>.<span class="w"> </span><span class="nv">admin</span>.<span class="nv">j0llyb0x</span>.<span class="nv">org</span>.<span class="w"> </span><span class="ss">(</span>
<span class="mi">201406181</span><span class="w"> </span><span class="c1">; serial, todays date+todays serial</span>
<span class="mi">28800</span><span class="w"> </span><span class="c1">; refresh, seconds</span>
<span class="mi">7200</span><span class="w"> </span><span class="c1">; retry, seconds</span>
<span class="mi">360000</span><span class="w"> </span><span class="c1">; expire, seconds</span>
<span class="mi">86400</span><span class="w"> </span><span class="c1">; minimum, seconds</span>
<span class="ss">)</span>
<span class="c1">; DEFINE NS RECORDS</span>
<span class="nv">ns1</span><span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="nv">IN</span><span class="w"> </span><span class="nv">A</span><span class="w"> </span><span class="nv">xxx</span>.<span class="nv">xxx</span>.<span class="nv">xxx</span>.<span class="nv">xxx</span>
@<span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="nv">IN</span><span class="w"> </span><span class="nv">NS</span><span class="w"> </span><span class="nv">ns1</span>.<span class="nv">j0llyb0x</span>.<span class="nv">org</span>.
<span class="c1">; DEFINE A RECORDS</span>
@<span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="nv">IN</span><span class="w"> </span><span class="nv">A</span><span class="w"> </span><span class="nv">xxx</span>.<span class="nv">xxx</span>.<span class="nv">xxx</span>.<span class="nv">xxx</span>
<span class="nv">madhatter</span><span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="nv">IN</span><span class="w"> </span><span class="nv">A</span><span class="w"> </span><span class="nv">xxx</span>.<span class="nv">xxx</span>.<span class="nv">xxx</span>.<span class="nv">xxx</span>
<span class="nv">newsun</span><span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="nv">IN</span><span class="w"> </span><span class="nv">A</span><span class="w"> </span><span class="nv">xxx</span>.<span class="nv">xxx</span>.<span class="nv">xxx</span>.<span class="nv">xxx</span>
<span class="nv">mail</span><span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="nv">IN</span><span class="w"> </span><span class="nv">A</span><span class="w"> </span><span class="nv">xxx</span>.<span class="nv">xxx</span>.<span class="nv">xxx</span>.<span class="nv">xxx</span>
<span class="c1">; DEFINE CNAME</span>
<span class="nv">www</span><span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="nv">IN</span><span class="w"> </span><span class="nv">CNAME</span><span class="w"> </span>@
<span class="nv">ftp</span><span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="nv">IN</span><span class="w"> </span><span class="nv">CNAME</span><span class="w"> </span><span class="nv">newsun</span>
<span class="nv">ns</span><span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="nv">IN</span><span class="w"> </span><span class="nv">CNAME</span><span class="w"> </span><span class="nv">madhatter</span>
<span class="c1">; DEFINE MX RECORDS</span>
@<span class="w"> </span><span class="mi">100</span><span class="w"> </span><span class="nv">IN</span><span class="w"> </span><span class="nv">MX</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="nv">mail</span>
</code></pre></div>
<p>Non ho studiato molto i parametri e valori ottimali per timeout etc, ma credo che questi (presi dal blog già referenziato sopra) siano più che accettabili per un uso didattico.</p>
<p>La lista è semplice: viene richiamato un record SOA che punta al NS Master primario per il dominio j0llyb0x.org (@ sta per il nome referenziato nel file di zona in named.conf.local); come seconda cosa, ho referenziato il NS con un record A e, poi, definendolo come NS per il dominio.</p>
<p>Successivamente ho impostato alcuni record A ad alcuni server; infine dei CNAME ed un MX server (totalmente fittizio dato che non ho un server di posta :P ).</p>
<p>Non sto qui a spiegare cosa fanno i vari record perché esiste una marea di documentazione e, soprattutto, esistono gli RFC <a href="https://www.rfc-editor.org/rfc/rfc1034.txt">1034</a> e <a href="https://www.rfc-editor.org/rfc/rfc1035.txt">1035</a>!</p>
<p>Come chicca, vorrei lasciare alcune info che ho reperito sulla rete rispetto al discovery di informazioni sensibili da parte del Server Bind (alcuni post sull'argomento risalgono al 2006 :P):</p>
<p>all'interno del codice di Bind, si trovano dei record di zona non dichiarati esplicitamente, che possono mostrare alcune info importanti come:</p>
<ul>
<li>
<p>versione del server BIND</p>
</li>
<li>
<p>autori per la versione</p>
</li>
<li>
<p>hostname della macchina</p>
</li>
<li>
<p>"ID" per il quale non ho capito l'utilizzo</p>
</li>
</ul>
<p>dal codice:</p>
<div class="highlight"><pre><span></span><code><span class="s">"</span>
<span class="s">#</span>
<span class="s"># Zones in the "</span><span class="nx">_bind</span><span class="s">" view are NOT counted in the count of zones.</span>
<span class="s">#</span>
<span class="s">view "</span><span class="nx">_bind</span><span class="s">" chaos {</span>
<span class="s">recursion no</span>
<span class="s">notify no</span>
<span class="s">allow-new-zones no</span>
<span class="s">zone "</span><span class="nx">version</span><span class="p">.</span><span class="nx">bind</span><span class="s">" chaos {</span>
<span class="s">type master</span>
<span class="s">database "</span><span class="nx">_builtin</span><span class="w"> </span><span class="nx">version</span><span class="s">"</span>
<span class="s">}</span>
<span class="s">zone "</span><span class="nx">hostname</span><span class="p">.</span><span class="nx">bind</span><span class="s">" chaos {</span>
<span class="s">type master</span>
<span class="s">database "</span><span class="nx">_builtin</span><span class="w"> </span><span class="nx">hostname</span><span class="s">"</span>
<span class="s">}</span>
<span class="s">zone "</span><span class="nx">authors</span><span class="p">.</span><span class="nx">bind</span><span class="s">" chaos {</span>
<span class="s">type master</span>
<span class="s">database "</span><span class="nx">_builtin</span><span class="w"> </span><span class="nx">authors</span><span class="s">"</span>
<span class="s">}</span>
<span class="s">zone "</span><span class="nx">id</span><span class="p">.</span><span class="nx">server</span><span class="s">" chaos {</span>
<span class="s">type master</span>
<span class="s">database "</span><span class="nx">_builtin</span><span class="w"> </span><span class="nx">id</span><span class="err">"</span>
<span class="p">}</span>
<span class="p">}</span>
</code></pre></div>
<p>"</p>
<p>Con la configurazione Bind che ho fatto, queste informazioni non sono rivelate alla rete, ma potete provarle facendo una query particolare con dig da un ip in acl "trusted" o, se preferite, su qualche sventurato server (io non l'ho detto):</p>
<div class="highlight"><pre><span></span><code>dig -t TXT -c CHAOS {HOSTNAME,VERSION,AUTHORS}.BIND @[bind.ip]
</code></pre></div>
<p>Il mio risultato :)</p>
<div class="highlight"><pre><span></span><code><span class="k">[root@newsun][~]</span>
<span class="na">06</span><span class="o">:</span><span class="s">54:37</span><span class="w"> </span><span class="c1"># dig -t TXT -c CHAOS VERSION.BIND @127.0.0.1</span>
<span class="c1">; DiG 9.8.4-rpz2+rl005.12-P1 ; -t TXT -c CHAOS VERSION.BIND @127.0.0.1</span>
<span class="c1">; global options: +cmd</span>
<span class="c1">; Got answer:</span>
<span class="c1">; HEADER - opcode: QUERY, status: NOERROR, id: 40540</span>
<span class="c1">; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0</span>
<span class="c1">; WARNING: recursion requested but not available</span>
<span class="c1">; QUESTION SECTION:</span>
<span class="na">VERSION.BIND. CH TXT</span>
<span class="c1">; ANSWER SECTION:</span>
<span class="na">VERSION.BIND. 0 CH TXT "windows NT"</span>
<span class="c1">; AUTHORITY SECTION:</span>
<span class="na">VERSION.BIND. 0 CH NS VERSION.BIND.</span>
<span class="c1">; Query time: 0 msec</span>
<span class="c1">; SERVER: 127.0.0.1#53(127.0.0.1)</span>
<span class="c1">; WHEN: Thu Jun 19 06:54:42 2014</span>
<span class="c1">; MSG SIZE rcvd: 67</span>
</code></pre></div>
<p>come di consueto lascio le referenze:</p>
<blockquote>
<p><a href="http://d.stavrovski.net/blog/post/how-to-setup-and-configure-a-master-dns-bind-server-in-debian-wheezyjessie">stavrovski</a></p>
<p><a href="http://www.hostingtalk.it/come-funziona-il-sistema-dns-e-come-si-gestisce-un-dns-server-con-bind_-c000000zc/">hostingtalk</a></p>
<p><a href="http://guide.debianizzati.org/index.php/Un_server_DNS_e_DHCP_su_Debian">debianizzati</a></p>
<p><a href="http://www.openlogic.com/wazi/bid/188011/Secure-and-Reliable-Authoritative-DNS-with-BIND">openlogic</a></p>
<p><a href="http://www.zytrax.com/books/dns/ch6/">zytrax</a></p>
</blockquote>[parte I] DNS, questo sconosciuto..2014-06-17T00:00:00+02:002014-06-17T00:00:00+02:00j0llytag:www.j0llyb0x.org,2014-06-17:/2014/parte-i-dns-questo-sconosciuto.html<p>Non puoi dire di conoscere una cosa in informatica(in realtà non potresti dirlo mai) finché non ti ci sporchi le mani. </p>
<p>Cominciamo con un Dry run..
teoria del DNS:
- Il servizio dns è nato perché in passato i pochi siti raggiungibili via internet erano gestiti in un unico foglio …</p><p>Non puoi dire di conoscere una cosa in informatica(in realtà non potresti dirlo mai) finché non ti ci sporchi le mani. </p>
<p>Cominciamo con un Dry run..
teoria del DNS:
- Il servizio dns è nato perché in passato i pochi siti raggiungibili via internet erano gestiti in un unico foglio di testo che associava gli IP ai nomi, più semplici da ricordare.
Con il boom di internet si è reso necessario un approccio più flessibile ed è nato un sistema distribuito di database di carattere "tree" per la gestione dei nomi a dominio: il DNS.</p>
<p><img alt="bind" src="https://www.j0llyb0x.org/images/bind-2.png"></p>
<p>Il portocollo ha varie implementazioni ma la più usata è senza ombra di dubbio BIND(9) ed è anche la mia scelta (anche se vorrò smanacciare un po con il simpatico dnsmasq che però ha uno scopo e un'implementazione differente da BIND.</p>
<p>BIND è attualmente la versione 9 ed è in sviluppo dagli anni 80'. questo articolo parla di DNS e, quando si parla di configurazioni si fa riferimento a BIND versione 9.x su ambiente Debian (nella parte II).</p>
<p>Come ho già detto, DNS è un protocollo implementato a vari livelli, per il quale esistono vari compiti da assolvere.</p>
<p>Quando viene fatta una query, un NameServer si può comportare nei seguenti modi, che possono essere sovrapposti o separati nei compiti:</p>
<ul>
<li>autoritativo</li>
<li>di cache</li>
<li>forwarder</li>
<li>
<p>ricorsivo</p>
</li>
<li>
<p>autoritativo</p>
</li>
</ul>
<p>Nel primo caso, il server possiede dei record DNS (A, TXT, PTR, MX etc..) gestiti direttamente da lui (o a livello secondario come slave), che fornirà su richiesta previa query nella propria cache. come detto, se un server è autoritativo puro, se gli si chiedesse un IP non presente nelle sue tabelle, egli dovrebbe risponderebbe picche (si vedrà che questo non è sempre vero).</p>
<p>Per fare un esempio pratico, possiamo usare dig (suite dnsutils) è capire meglio cosa sia un server autoritativo per un dominio e come dovrebbe comportarsi:</p>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">root@newsun</span><span class="o">][</span><span class="n">~</span><span class="o">]</span><span class="w"> </span><span class="mi">04</span><span class="err">:</span><span class="mi">57</span><span class="err">:</span><span class="mi">30</span>
<span class="n">dig</span><span class="w"> </span><span class="ow">ANY</span><span class="w"> </span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="w"> </span><span class="nv">@ns1</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span>
<span class="p">;</span><span class="w"> </span><span class="n">DiG</span><span class="w"> </span><span class="mf">9.8.4</span><span class="o">-</span><span class="n">rpz2</span><span class="o">+</span><span class="n">rl005</span><span class="mf">.12</span><span class="o">-</span><span class="n">P1</span><span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="ow">ANY</span><span class="w"> </span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="w"> </span><span class="nv">@ns1</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span>
<span class="p">;</span><span class="w"> </span><span class="k">global</span><span class="w"> </span><span class="nl">options</span><span class="p">:</span><span class="w"> </span><span class="o">+</span><span class="n">cmd</span>
<span class="p">;</span><span class="w"> </span><span class="n">Got</span><span class="w"> </span><span class="nl">answer</span><span class="p">:</span>
<span class="p">;</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="n">HEADER</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nl">opcode</span><span class="p">:</span><span class="w"> </span><span class="n">QUERY</span><span class="p">,</span><span class="w"> </span><span class="nl">status</span><span class="p">:</span><span class="w"> </span><span class="n">NOERROR</span><span class="p">,</span><span class="w"> </span><span class="nl">id</span><span class="p">:</span><span class="w"> </span><span class="mi">49650</span>
<span class="p">;</span><span class="w"> </span><span class="nl">flags</span><span class="p">:</span><span class="w"> </span><span class="n">qr</span><span class="w"> </span><span class="n">aa</span><span class="w"> </span><span class="n">rd</span><span class="p">;</span><span class="w"> </span><span class="nl">QUERY</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nl">ANSWER</span><span class="p">:</span><span class="w"> </span><span class="mi">19</span><span class="p">,</span><span class="w"> </span><span class="nl">AUTHORITY</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nl">ADDITIONAL</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span>
<span class="p">;</span><span class="w"> </span><span class="nl">WARNING</span><span class="p">:</span><span class="w"> </span><span class="n">recursion</span><span class="w"> </span><span class="n">requested</span><span class="w"> </span><span class="n">but</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="n">available</span>
<span class="p">;</span><span class="w"> </span><span class="n">QUESTION</span><span class="w"> </span><span class="k">SECTION</span><span class="err">:</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="ow">ANY</span>
<span class="p">;</span><span class="w"> </span><span class="n">ANSWER</span><span class="w"> </span><span class="k">SECTION</span><span class="err">:</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="mf">74.125.21.113</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="mf">74.125.21.101</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="mf">74.125.21.138</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="mf">74.125.21.102</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="mf">74.125.21.139</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="mf">74.125.21.100</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">AAAA</span><span class="w"> </span><span class="mi">2607</span><span class="err">:</span><span class="nl">f8b0</span><span class="p">:</span><span class="mi">4002</span><span class="err">:</span><span class="nl">c06</span><span class="p">:</span><span class="err">:</span><span class="mi">71</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">600</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">MX</span><span class="w"> </span><span class="mi">10</span><span class="w"> </span><span class="n">aspmx</span><span class="p">.</span><span class="n">l</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">86400</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">TYPE257</span><span class="w"> </span><span class="err">\\#</span><span class="w"> </span><span class="mi">19</span><span class="w"> </span><span class="mi">0005697373756573796</span><span class="n">D616E7465632E636F6D</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">345600</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">ns4</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">345600</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">ns3</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">600</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">MX</span><span class="w"> </span><span class="mi">30</span><span class="w"> </span><span class="n">alt2</span><span class="p">.</span><span class="n">aspmx</span><span class="p">.</span><span class="n">l</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">600</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">MX</span><span class="w"> </span><span class="mi">40</span><span class="w"> </span><span class="n">alt3</span><span class="p">.</span><span class="n">aspmx</span><span class="p">.</span><span class="n">l</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">600</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">MX</span><span class="w"> </span><span class="mi">50</span><span class="w"> </span><span class="n">alt4</span><span class="p">.</span><span class="n">aspmx</span><span class="p">.</span><span class="n">l</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">345600</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">ns2</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">345600</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">ns1</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">3600</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">TXT</span><span class="w"> </span><span class="ss">"v=spf1 include:_spf.google.com ip4:216.73.93.70/31 ip4:216.73.93.72/31 ~all"</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">600</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">MX</span><span class="w"> </span><span class="mi">20</span><span class="w"> </span><span class="n">alt1</span><span class="p">.</span><span class="n">aspmx</span><span class="p">.</span><span class="n">l</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">86400</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">SOA</span><span class="w"> </span><span class="n">ns1</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="n">dns</span><span class="o">-</span><span class="k">admin</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">2014021800</span><span class="w"> </span><span class="mi">7200</span><span class="w"> </span><span class="mi">1800</span><span class="w"> </span><span class="mi">1209600</span><span class="w"> </span><span class="mi">300</span>
<span class="p">;</span><span class="w"> </span><span class="n">Query</span><span class="w"> </span><span class="nc">time</span><span class="err">:</span><span class="w"> </span><span class="mi">14</span><span class="w"> </span><span class="n">msec</span>
<span class="p">;</span><span class="w"> </span><span class="nl">SERVER</span><span class="p">:</span><span class="w"> </span><span class="mf">216.239.32.10</span><span class="n">#53</span><span class="p">(</span><span class="mf">216.239.32.10</span><span class="p">)</span>
<span class="p">;</span><span class="w"> </span><span class="k">WHEN</span><span class="err">:</span><span class="w"> </span><span class="n">Tue</span><span class="w"> </span><span class="n">Jun</span><span class="w"> </span><span class="mi">17</span><span class="w"> </span><span class="mi">04</span><span class="err">:</span><span class="mi">57</span><span class="err">:</span><span class="mi">31</span><span class="w"> </span><span class="mi">2014</span>
<span class="p">;</span><span class="w"> </span><span class="n">MSG</span><span class="w"> </span><span class="k">SIZE</span><span class="w"> </span><span class="nl">rcvd</span><span class="p">:</span><span class="w"> </span><span class="mi">497</span>
</code></pre></div>
<p>Ecco un esempio di query Ad un NameServer autoritativo per la sua zona; la query è stata fatta all'indirizzo ip del DNS server primario di google, richiedendo qualsiasi record pertitnente al nome a dominio google.com.</p>
<p>La risposta del server mostra chiaramente che lui stesso (il server contattato tramite dig) è il detentore della zona dns per google.com come si vede nel flag AA (autoritative answer) e dal record SOA/NS per google.com che mostra ns1.google.com come Server DNS autoritativo per il dominio.</p>
<ul>
<li>di cache</li>
</ul>
<p>Se un server non è autoritativo per la zona, non vuol dire che non possieda in cache dei record DNS, può succedere infatti che tali record siano presenti e la cache è il primo luogo dove il server guarda (a parte la propria zona autoritativa) prima di compiere qualsiasi altra azione. In questo caso la risposta sarà presa dalla cache che in genere viene gestita in concomitanza di Nameservers Forwarder/Ricorsivi.</p>
<ul>
<li>forwarder</li>
</ul>
<p>Per servire un contenuto dalla cache un NameServer deve prima aver ricevuto il record da qualcuno :) e questo è uno dei tre metodi di interazione che un DNS server può avere con altri Server nel caso gli sia fatta una query alla quale non sa rispondere direttamente. Se il Server è configurato per avere dei forwarders, egli "girerà la query" al DNS server preposto, in attesa della risposta da servire. In genere, se presente, quest'opzione è preferita alla ricorsione diretta. Dall'altro lato, un server Forwarder non è altro che un NameServer Ricorsivo (non vedo l'utilità che non lo sia) che fa da spoiler per un DNs interno in modo da separare fisicamente query interne e query esterne. Ancora un Forwarder può essere impiegato per diminuire l'area di esposizione di una rete interna settando per tutti gli altri NS un unico forwarder che farà le query non autoritative per loro.</p>
<ul>
<li>ricorsivo</li>
</ul>
<p>è qui che entrano in gioco i server NS ricorsivi: Questi server permettono di fare query ricorsive per nomi/IP per i quali non sono autoritativi. Ad esempio, i DNS pubblici di Google, sono NS non autoritativi (nel caso ve lo foste chiesto come me, Google non hosta le sue zone sui server pubblici che ha regalato a noi :) ). Ovviamente questi server avranno anche una cache (a meno di averla disabilitata) ma il succo è che, per ogni record richiesto, a meno di cache, faranno il percorso dell'alberatura DNS fino a fare la query al corretto SOA/NS per quel particolare nome a dominio, restituendo il risultato richiesto. Un server DNS che fa da Forwarder sarà quasi sicuramente ricorsivo e la query in questione può essere osservata sempre utilizzando dig:</p>
<div class="highlight"><pre><span></span><code><span class="o">[</span><span class="n">root@newsun</span><span class="o">][</span><span class="n">/etc</span><span class="o">]</span><span class="w"> </span>
<span class="mi">05</span><span class="err">:</span><span class="mi">59</span><span class="err">:</span><span class="mi">13</span><span class="w"> </span><span class="err">#</span><span class="w"> </span><span class="n">dig</span><span class="w"> </span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="w"> </span><span class="o">+</span><span class="n">trace</span>
<span class="p">;</span><span class="w"> </span><span class="n">DiG</span><span class="w"> </span><span class="mf">9.8.4</span><span class="o">-</span><span class="n">rpz2</span><span class="o">+</span><span class="n">rl005</span><span class="mf">.12</span><span class="o">-</span><span class="n">P1</span><span class="w"> </span><span class="p">;</span><span class="w"> </span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="w"> </span><span class="o">+</span><span class="n">trace</span>
<span class="p">;</span><span class="w"> </span><span class="k">global</span><span class="w"> </span><span class="nl">options</span><span class="p">:</span><span class="w"> </span><span class="o">+</span><span class="n">cmd</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">G</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">B</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">I</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">E</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">H</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">C</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">L</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">D</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">J</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">K</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">M</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">F</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">.</span><span class="w"> </span><span class="mi">3600000</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">A</span><span class="p">.</span><span class="n">ROOT</span><span class="o">-</span><span class="n">SERVERS</span><span class="p">.</span><span class="n">NET</span><span class="p">.</span>
<span class="p">;</span><span class="w"> </span><span class="n">Received</span><span class="w"> </span><span class="mi">228</span><span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="mf">127.0.0.1</span><span class="n">#53</span><span class="p">(</span><span class="mf">127.0.0.1</span><span class="p">)</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="mi">644</span><span class="w"> </span><span class="n">ms</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">i</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">a</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">g</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">k</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">f</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">h</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">d</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">l</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">j</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">e</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">m</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">b</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">c</span><span class="p">.</span><span class="n">gtld</span><span class="o">-</span><span class="n">servers</span><span class="p">.</span><span class="n">net</span><span class="p">.</span>
<span class="p">;</span><span class="w"> </span><span class="n">Received</span><span class="w"> </span><span class="mi">500</span><span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="mf">192.36.148.17</span><span class="n">#53</span><span class="p">(</span><span class="mf">192.36.148.17</span><span class="p">)</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="mi">693</span><span class="w"> </span><span class="n">ms</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">ns2</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">ns1</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">ns3</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">172800</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">NS</span><span class="w"> </span><span class="n">ns4</span><span class="p">.</span><span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span>
<span class="p">;</span><span class="w"> </span><span class="n">Received</span><span class="w"> </span><span class="mi">164</span><span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="mf">192.54.112.30</span><span class="n">#53</span><span class="p">(</span><span class="mf">192.54.112.30</span><span class="p">)</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="mi">429</span><span class="w"> </span><span class="n">ms</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="mf">74.125.21.113</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="mf">74.125.21.100</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="mf">74.125.21.138</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="mf">74.125.21.102</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="mf">74.125.21.101</span>
<span class="n">google</span><span class="p">.</span><span class="n">com</span><span class="p">.</span><span class="w"> </span><span class="mi">300</span><span class="w"> </span><span class="ow">IN</span><span class="w"> </span><span class="n">A</span><span class="w"> </span><span class="mf">74.125.21.139</span>
<span class="p">;</span><span class="w"> </span><span class="n">Received</span><span class="w"> </span><span class="mi">124</span><span class="w"> </span><span class="n">bytes</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="mf">216.239.32.10</span><span class="n">#53</span><span class="p">(</span><span class="mf">216.239.32.10</span><span class="p">)</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="mi">14</span><span class="w"> </span><span class="n">ms</span>
</code></pre></div>
<p>In breve, il DNS server (o resolver interno) ha caricato la lista dei root server di internet; successivamente ha lanciato una query ad uno di loro (192.36.148.17 - non ricorsivo) ricevendo la lista dei NameServer autoritativi per lo spazio dei nomi più ampio (.com); ora viene lanciata un'altra query identica, ma come target avremo uno degli NS server autoritativi per la radice .com (192.54.112.30 - sempre non ricorsivo) che restituirà la lista degli NS autoritativi per il successivo spazio dei nomi (.google.); finalmente abbiamo trovato gli indirizzi che "devono" sapere che indirizzo ha google.com; la query viene ora fatta all'NS di google ( 216.239.32.10 - non ricorsivo :) ) che ci restituisce finalmente i record A (default) della nostra query (74.125.21.*) da notare che google usa DNS round robin per il bilanciamento del carico sui frontend, ma questa è un'altra storia :).</p>
<ul>
<li>iterativo</li>
</ul>
<p>Alcuni NS (in teoria tutti quelli autoritativi per fattori di sicurezza) non possono essere utilizzati per trovare i record al di fuori delle proprie zone di gestione autoritative. Gli esempi più banali sono appunto i root server di Internet. Questi server mantengono un database autoritativo di tutti i NS che gestiscono lo spazio dei nomi di primo livello (.com,.org,.it etc) ed hanno già un bel da fare a soddisfare le richieste del mondo rispetto a questi indirizzi. Questi ed altri server con grande carico di lavoro si limitano a gestire query iterative per le quali sono direttamente responsabili.</p>
<p>Come si è visto nell'esempio precedente con dig, i root server non hanno fatto il lavoro per noi, restituendoci il risultato (come farebbe un forwarder o un NS ricorsivo) ma dandoci gli indirizzi del primo livello utile a lui demandato (in questo caso gli indirizzi di chi gestisce i domini sotto .com).</p>
<p>Questa è una panoramica parziale del mondo DNS e dei tipi di NameServers e sicuramente ci saranno delle imprecisioni che, spero, chi passerà di qua saprà puntualizzare.</p>
<p>A fondo metto alcune references che mi hanno aiutato a capire come funziona il tutto; lascio per la seconda parte le eventuali configurazioni e i problemi più o meno banali che ho incontrato nei miei esperimenti.</p>
<blockquote>
<p><a href="http://tools.ietf.org/html/rfc1034">RFC1034</a> e <a href="http://tools.ietf.org/html/rfc1035">RFC1035</a></p>
<p><a href="http://lia.deis.unibo.it/Courses/ModApplRetiCalc0607/materiale/4dns.pdf">slide sul DNS</a></p>
<p><a href="http://www.slashroot.in/difference-between-iterative-and-recursive-dns-query">differenti tipi di query DNS</a></p>
</blockquote>[Serie: OpenNebula] [Arch] [Kvm] Overview e preparativi2014-02-02T00:00:00+01:002014-02-02T00:00:00+01:00j0llytag:www.j0llyb0x.org,2014-02-02:/2014/serie-opennebula-arch-kvm-overview-e-preparativi.html<p>Col 2014 ho intenzione di dedicarmi ad un progetto molto ambizioso : aprire un datacenter! :)
Ovviamente non ho liquidità e fondi quindi ho deciso di cominciare il progetto Virtualizzando un ambiente OpenNebula via Kvm sul mio portatile Vaio #Arch Based.</p>
<p><img alt="opennebula" src="https://www.j0llyb0x.org/images/opennebula-1.jpg"></p>
<p>L'dea è di virtualizzare via Kvm delle macchine host L1 che …</p><p>Col 2014 ho intenzione di dedicarmi ad un progetto molto ambizioso : aprire un datacenter! :)
Ovviamente non ho liquidità e fondi quindi ho deciso di cominciare il progetto Virtualizzando un ambiente OpenNebula via Kvm sul mio portatile Vaio #Arch Based.</p>
<p><img alt="opennebula" src="https://www.j0llyb0x.org/images/opennebula-1.jpg"></p>
<p>L'dea è di virtualizzare via Kvm delle macchine host L1 che formeranno il mio private "Cloud".
Gli Host L1 saranno così configurati:</p>
<ul>
<li>1/2 Host Storage (non ancora identificati) per la gestione storage degli altri host ed ovviamente dei filesystem dedicati alle VM L2/L3;</li>
<li>2/3 Host Centos 6.5 per la virtualizzazione che utilizzeranno libvirt, qemu-Kvm ed OpenvSwitch;</li>
<li>2 Host Centos 6.5 In HA per la gestione della Suite OpenNebula.</li>
</ul>
<p>In questo Primo articolo parto dai presupposti, riportando le azioni per preparare il setup del mio Host Primario (Arch) per ospitare tutta la virtualizzazione sottostante.
Questa prima parte della serie non è propriamente correlata ad OpenNebula ma è comunque importante ed ho piacere di condividerla nel caso qualche Archers passasse di qua ;).
Per prima cosa do qualche info su pacchetti e tecnologia utilizzata:</p>
<p>1 ArchLinux Kernel 3.8.8-2-ARCH (<3.10): Non prendetemi per matto, aggiorno i componenti, ma esiste un bug di Kvm che previene l'utilizzo del Nesting Kvm a partire dal kernel 3.10 ed ho quindi dovuto downgradare il mio kernel ad una versione adeguata.
2 Filesystem Btrfs: Anche qua una nota dolente, dato che Btrfs è stupendo per moltissimi aspetti, ma non si può dire che sia performante quando si parla di gestire immagini dischi. Un modo per minimizzare i problemi di performance sono:</p>
<p>2 Disabilitare il Copy on Write nella directory che ospita i file dischi: </p>
<div class="highlight"><pre><span></span><code>chattr -R +C ~/Path/To/VMs-Pool
</code></pre></div>
<p>3 Riempire le immagini preallocando metadati e spazio in modo da minimizzare la frammentazione: </p>
<div class="highlight"><pre><span></span><code>qemu-img create -f qcow2 -o preallocation=metadata OpenNebula01 5G
ls -l OpenNebula01
-rw-r--r-- 1 j0lly j0lly 5369757696 31 dic 01.53 OpenNebula01
fallocate -l 5369757696 OpenNebula01
</code></pre></div>
<p>4 Libvirt config:
Per poter produrre il laboratorio virtuale OpenNebula è necessario abilitare il nesting Kvm sull'Host principale, in modo da esporre VT ( o AMD-V ) nelle Cpu virtuali all'interno delle VM; il parametro nel Kernel per abilitare il nesting è kvm-intel.nested=1 e può essere caricato al boot via bootloader, via modprobe o, nel caso di Arch, più comodamente aggiungendo il file kvm_nesting.conf nella directory /etc/modprobe.d/ con il contenuto: </p>
<div class="highlight"><pre><span></span><code>options kvm-intel nested=1
</code></pre></div>
<p>Un ulteriore accorgimento che consiglio è quello di gestire i pool su dischi/partizioni separate da /, ma in questo modo qemu, che viene startato come utente <em>nobody</em>, non sarà in grado di traversare le partizioni e non potrà accedere ai pool. Le opzioni sono varie ma io per comodità ho impostato il mio utente locale come owner del processo qemu, in modo da mantenere una configurazione funzionante senza dover utilizzare root per far girare le VM:</p>
<div class="highlight"><pre><span></span><code>$<span class="o">~</span><span class="w"> </span><span class="nv">grep</span><span class="w"> </span><span class="o">-</span><span class="nv">C2</span><span class="w"> </span><span class="nv">j0lly</span><span class="w"> </span><span class="o">/</span><span class="nv">etc</span><span class="o">/</span><span class="nv">libvirt</span><span class="o">/</span><span class="nv">qemu</span>.<span class="nv">conf</span>
#<span class="w"> </span><span class="nv">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"100"</span><span class="w"> </span>#<span class="w"> </span><span class="nv">A</span><span class="w"> </span><span class="nv">user</span><span class="w"> </span><span class="nv">named</span><span class="w"> </span><span class="s2">"100"</span><span class="w"> </span><span class="nv">or</span><span class="w"> </span><span class="nv">a</span><span class="w"> </span><span class="nv">user</span><span class="w"> </span><span class="nv">with</span><span class="w"> </span><span class="nv">uid</span><span class="o">=</span><span class="mi">100</span>
#
<span class="nv">user</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"j0lly"</span>
#<span class="w"> </span><span class="nv">The</span><span class="w"> </span><span class="nv">group</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nv">QEMU</span><span class="w"> </span><span class="nv">processes</span><span class="w"> </span><span class="nv">run</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">the</span><span class="w"> </span><span class="nv">system</span><span class="w"> </span><span class="nv">instance</span>.<span class="w"> </span><span class="nv">It</span><span class="w"> </span><span class="nv">can</span><span class="w"> </span><span class="nv">b</span>
</code></pre></div>
<p>Ultimo personale accorgimento è quello di aggiungere la variabile al .bashrc (o rc per la vostra shell) in modo da gestire automaticamente l'hypervisor con i vari tools e api di libvirt:</p>
<div class="highlight"><pre><span></span><code><span class="k">export</span><span class="w"> </span><span class="n">LIBVIRT_DEFAULT_URI</span><span class="o">=</span><span class="n">qemu</span><span class="p">:</span><span class="o">///</span><span class="n">system</span>
</code></pre></div>
<p>Tutte le configurazioni di base per Libvirt le potete invece trovare sul <a href="https://wiki.archlinux.org/index.php/libvirt">wiki di Arch</a> che è sempre impeccabile.
Con questo breve articolo ho spiegato cosa utilizzerò per l'installazione del Cloud virtuale che ospiterà il mio datacenter personale :).
Nel Prossimo aritcolo mi occuperò dell'installazione di OpenNebula e della configurazione in HA tramite Red-Hat Cluster.</p>
<p>Stay Tuned!</p>[Python] I socket: un Server TCP-IP2013-06-25T00:00:00+02:002013-06-25T00:00:00+02:00j0llytag:www.j0llyb0x.org,2013-06-25:/2013/python-i-socket-un-server-tcp-ip.html<p>Per terminare la mia prima <a href="http://j0llyb0x.org/python-i-socket-client-tcp-ip-06-2013/">introduzione ai socket</a>, posto il compendio di un buon client TCP: un server TCP-IP scritto in Pyhton.</p>
<p>Disclaimer: ricordo che questo "<em>esercizio</em>" di programmazione è stato scritto in <a href="http://www.binarytides.com/">questo ottimo blog</a>, dal quale ruberò sicuramente altri esempi dato che l'autore è davvero molto chiaro e …</p><p>Per terminare la mia prima <a href="http://j0llyb0x.org/python-i-socket-client-tcp-ip-06-2013/">introduzione ai socket</a>, posto il compendio di un buon client TCP: un server TCP-IP scritto in Pyhton.</p>
<p>Disclaimer: ricordo che questo "<em>esercizio</em>" di programmazione è stato scritto in <a href="http://www.binarytides.com/">questo ottimo blog</a>, dal quale ruberò sicuramente altri esempi dato che l'autore è davvero molto chiaro e competente.</p>
<p><img alt="socket" src="https://www.j0llyb0x.org/images/socket-1.png"></p>
<p>Posto anche il Link alle pagine di <a href="http://docs.python.org/2/library/socket.html">manuale sui sockets</a> (python 2.7) tanto per non perdere l'abitudine (non si sa mai che qualcuno pensi che servano a qualcosa :P).</p>
<p>Come nell'articolo precedente, ecco l'indice:</p>
<ul>
<li>
<p>la costruzione di un client python che si connette ad un server, invia dati sul socket e attende la risposta prima di chiudere la comunicazione;</p>
</li>
<li>
<p>la creazione di un server, sempre in python, che si mette in ascolto su una porta e fa da “pappagallo” stampando a schermo quello che riceve dal mittente; anche in multi-threading.</p>
</li>
</ul>
<p>Oggi, per concludere l'introduzione, scrivo e commento il <em>server.</em>
_discalimer: _usando Archlinux, il mio interprete python di default è python 3.x, e necessito specificare l'interprete adeguato (pyhton2) per questo codice.</p>
<h3>Il server</h3>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/usr/bin/env python2</span>
<span class="kn">import</span> <span class="nn">socket</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">thread</span> <span class="kn">import</span> <span class="o">*</span>
<span class="n">HOST</span> <span class="o">=</span> <span class="s1">''</span> <span class="c1"># se non metto nulla, significa *.*.*.*</span>
<span class="n">PORT</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="c1"># la porta che preferisco (sopra la 1024)</span>
<span class="n">Sock</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
<span class="k">print</span> <span class="s1">' socket creato '</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">Sock</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="n">HOST</span><span class="p">,</span> <span class="n">PORT</span><span class="p">))</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span> <span class="p">,</span> <span class="n">msg</span><span class="p">:</span>
<span class="k">print</span> <span class="s1">'Bind fallito, Errore: '</span> <span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="s1">'; messaggio: '</span><span class="p">,</span> <span class="n">msg</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">print</span> <span class="s1">'socket bindato a ip/porta '</span>
</code></pre></div></td></tr></table></div>
<p>Come per il client si importano le librerie (rigorosamente standard), e questa volta ne aggiungiamo una che servirà a gestire multiple connessioni in un'ottica di _thread per connection, _cioè un thread (una specie di porcesso [non me ne vogliano i programmatori]) per ogni connessione che un client effettua sul nostro server.</p>
<p>Viene poi impostato HOST, ovvero l'IP sul quale il server starà in ascolto (nel mi caso tutte le interfaccie possibili) e PORT per la porta di scolto (ricordate di utilizzare una porta oltre 1024 se il server gira senza permessi di root (auspicabile).</p>
<p>Prima di tutto creiamo il nostro socket con</p>
<div class="highlight"><pre><span></span><code>Sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
</code></pre></div>
<p>che indica una variabile <em>Sock</em> composta da un socket con protoccolo di rete IP (socket.AF_NET) e di trasporto TCP (socket.SOCK_STREAM).</p>
<p>Ed in fine, dopo aver stampato a video il nosto successo, facciamo il bind (accoppiamo) il nostro socket a/agli IP selezionati in precedenza:</p>
<div class="highlight"><pre><span></span><code>Sock.bind((HOST, PORT))
</code></pre></div>
<p>Anche questa volta il _bind _viene fatto bene, utilizzando il metodo standard per la <a href="http://docs.python.org/2/tutorial/errors.html">gestione degli errori in python</a>, [try/exept].</p>
<p>Gratificati del nostro socket appeso ai nostri IP, passiamo alla fase successiva:</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/usr/bin/env python2</span>
<span class="kn">import</span> <span class="nn">socket</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">thread</span> <span class="kn">import</span> <span class="o">*</span>
<span class="n">HOST</span> <span class="o">=</span> <span class="s1">''</span> <span class="c1"># se non metto nulla, significa *.*.*.*</span>
<span class="n">PORT</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="c1"># la porta che preferisco (sopra la 1024)</span>
<span class="n">Sock</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
<span class="k">print</span> <span class="s1">' socket creato '</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">Sock</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="n">HOST</span><span class="p">,</span> <span class="n">PORT</span><span class="p">))</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span> <span class="p">,</span> <span class="n">msg</span><span class="p">:</span>
<span class="k">print</span> <span class="s1">'Bind fallito, Errore: '</span> <span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="s1">'; messaggio: '</span><span class="p">,</span> <span class="n">msg</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">print</span> <span class="s1">'socket bindato a ip/porta '</span>
<span class="n">Sock</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="c1"># il socket e in ascolto e gestisce fino a 10 connessioni</span>
</code></pre></div></td></tr></table></div>
<p>La cosa si fa interessante, ed ora il socket non è solo <em>bindato</em>, ma è messo in ascolto, con un parametro "10" che definisce il numero di connessioni da gestire simultaneamente, prima di accodare le richieste.</p>
<p>Ed ecco che entra in gioco la libreria importata thread importata al principio, con la quale possiamo gestire le dieci connessioni concorrenti senza <em>crushare</em> il nostro povero server e, quindi, il socket. A differenza di una chiamata client dove all'aumentare delle connessioni aumentano i socket aperti per ogni connessione, il server qui mantiene un solo socket aperto che, grazie al multiplexing, gestisce più connessioni sullo stesso canale (come spiegato in questo illuminante <a href="http://www.python.it/doc/howto/Socket/sockets-it/sockets-it.html">articolo sui sockets</a>).</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span>
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span>
<span class="normal">32</span>
<span class="normal">33</span>
<span class="normal">34</span>
<span class="normal">35</span>
<span class="normal">36</span>
<span class="normal">37</span>
<span class="normal">38</span>
<span class="normal">39</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/usr/bin/env python2</span>
<span class="kn">import</span> <span class="nn">socket</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">thread</span> <span class="kn">import</span> <span class="o">*</span>
<span class="n">HOST</span> <span class="o">=</span> <span class="s1">''</span> <span class="c1"># se non metto nulla, significa *.*.*.*</span>
<span class="n">PORT</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="c1"># la porta che preferisco (sopra la 1024)</span>
<span class="n">Sock</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
<span class="k">print</span> <span class="s1">' socket creato '</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">Sock</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="n">HOST</span><span class="p">,</span> <span class="n">PORT</span><span class="p">))</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span> <span class="p">,</span> <span class="n">msg</span><span class="p">:</span>
<span class="k">print</span> <span class="s1">'Bind fallito, Errore: '</span> <span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="s1">'; messaggio: '</span><span class="p">,</span> <span class="n">msg</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">print</span> <span class="s1">'socket bindato a ip/porta '</span>
<span class="n">Sock</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="c1"># il socket e in ascolto e gestisce fino a 10 connessioni</span>
<span class="k">def</span> <span class="nf">threadconn</span><span class="p">(</span><span class="n">conn</span><span class="p">):</span>
<span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'hey, ecco un server pappagallo</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> <span class="c1"># solo stringhe</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span> <span class="c1"># loop infinito</span>
<span class="c1"># ora rispondiamo ai messaggi</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">conn</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
<span class="n">reply</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="s1">'Tnis what u said</span><span class="se">\n</span><span class="s1">'</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">conn</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="n">reply</span><span class="p">)</span>
<span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="c1"># usciamo dal loop una volta risposto</span>
</code></pre></div></td></tr></table></div>
<p>Aggiungiamo un po di carne al fuco, definendo una funzione chiamata threadconn che ci servirà per gestire le nostre multiple connessioni; come input, prenderemo la variabile <em>conn</em> che più avanti nel codice sarà la nostra connessione singola, e cominciamo inviando un messaggio a chi si connette.</p>
<p>Il comando <em>send</em> invia dati sul socket, ma badate bene, perché è possibile inviare solo stringhe; poco sotto, comincia un loop infinito (while True) nel quale i dati ricevuti vengono salvati in una variabile (in blocchi da 1024 bytes) e rispediti al mittente attraverso il socket. Come protezione (non mi ancora ben chiaro come) viene implementato un meccanismo di uscita nel caso di buffer vuoto. Per terminare ogni "pezzo" di conversazione, la connessione viene chiusa (è importante!).</p>
<p>Al termine del codice, arriva il cuore del server che, sempre in maniera perpetua (while 1) gestisce le connessioni in entrata.</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span>
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span>
<span class="normal">32</span>
<span class="normal">33</span>
<span class="normal">34</span>
<span class="normal">35</span>
<span class="normal">36</span>
<span class="normal">37</span>
<span class="normal">38</span>
<span class="normal">39</span>
<span class="normal">40</span>
<span class="normal">41</span>
<span class="normal">42</span>
<span class="normal">43</span>
<span class="normal">44</span>
<span class="normal">45</span>
<span class="normal">46</span>
<span class="normal">47</span>
<span class="normal">48</span>
<span class="normal">49</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/usr/bin/env python2</span>
<span class="kn">import</span> <span class="nn">socket</span>
<span class="kn">import</span> <span class="nn">sys</span>
<span class="kn">from</span> <span class="nn">thread</span> <span class="kn">import</span> <span class="o">*</span>
<span class="n">HOST</span> <span class="o">=</span> <span class="s1">''</span> <span class="c1"># se non metto nulla, significa *.*.*.*</span>
<span class="n">PORT</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span> <span class="c1"># la porta che preferisco (sopra la 1024)</span>
<span class="n">Sock</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
<span class="k">print</span> <span class="s1">' socket creato '</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">Sock</span><span class="o">.</span><span class="n">bind</span><span class="p">((</span><span class="n">HOST</span><span class="p">,</span> <span class="n">PORT</span><span class="p">))</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span> <span class="p">,</span> <span class="n">msg</span><span class="p">:</span>
<span class="k">print</span> <span class="s1">'Bind fallito, Errore: '</span> <span class="p">,</span> <span class="nb">int</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="s1">'; messaggio: '</span><span class="p">,</span> <span class="n">msg</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">print</span> <span class="s1">'socket bindato a ip/porta '</span>
<span class="n">Sock</span><span class="o">.</span><span class="n">listen</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span> <span class="c1"># il socket e in ascolto e gestisce fino a 10 connessioni</span>
<span class="k">def</span> <span class="nf">threadconn</span><span class="p">(</span><span class="n">conn</span><span class="p">):</span>
<span class="n">conn</span><span class="o">.</span><span class="n">send</span><span class="p">(</span><span class="s1">'hey, ecco un server pappagallo</span><span class="se">\n</span><span class="s1">'</span><span class="p">)</span> <span class="c1"># solo stringhe</span>
<span class="k">while</span> <span class="bp">True</span><span class="p">:</span> <span class="c1"># loop infinito</span>
<span class="c1"># ora rispondiamo ai messaggi</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">conn</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
<span class="n">reply</span> <span class="o">=</span> <span class="n">data</span> <span class="o">+</span> <span class="s1">'Tnis what u said</span><span class="se">\n</span><span class="s1">'</span>
<span class="k">if</span> <span class="ow">not</span> <span class="n">data</span><span class="p">:</span>
<span class="k">break</span>
<span class="n">conn</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="n">reply</span><span class="p">)</span>
<span class="n">conn</span><span class="o">.</span><span class="n">close</span><span class="p">()</span> <span class="c1"># usciamo dal loop una volta risposto</span>
<span class="k">while</span> <span class="mi">1</span><span class="p">:</span> <span class="c1"># e ora aspettiamo le risposte..</span>
<span class="n">conn</span><span class="p">,</span> <span class="n">addr</span> <span class="o">=</span> <span class="n">Sock</span><span class="o">.</span><span class="n">accept</span><span class="p">()</span>
<span class="k">print</span> <span class="s1">'Connessione da'</span><span class="p">,</span> <span class="n">addr</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="p">,</span> <span class="s1">':'</span><span class="p">,</span> <span class="nb">str</span><span class="p">(</span><span class="n">addr</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
<span class="n">start_new_thread</span><span class="p">(</span><span class="n">threadconn</span> <span class="p">,(</span><span class="n">conn</span><span class="p">,))</span>
<span class="n">Sock</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</code></pre></div></td></tr></table></div>
<p>Dopo aver salvato le variabili, inizializziamo il thread col comando <em>start_new_thread</em> che prende come argomenti la funzione creata sopra:</p>
<div class="highlight"><pre><span></span><code>start_new_thread(threadconn ,(conn,))
</code></pre></div>
<p>Per terminare in bellezza e perché siamo dei bravi <em>scrptatori,</em> chiudiamo il socket pirma di uscire dal porgramma.</p>
<p>Ed ecco che abbiamo creato un Client ed un server, che fanno da base per i più sfrenato sogni di gloria con python, i socket e la porgrammazione di rete!</p>
<p>Alla prossima..</p>[Python] I Socket: un client TCP-IP2013-06-18T00:00:00+02:002013-06-18T00:00:00+02:00j0llytag:www.j0llyb0x.org,2013-06-18:/2013/python-i-socket-un-client-tcp-ip.html<p>Ho trovato alcune guide molto interessanti per la programmazione dei socket in Python, ed ho deciso di cominciare a studiare un po il linguaggio.</p>
<p><img alt="socket" src="https://www.j0llyb0x.org/images/socket-2.jpg">
Quale situazione migliore se non quella di commentare gli esercizi per fissare il tutto e, per chi fosse interessato, insegnare qualcosa.</p>
<p>Premetto che il codice e …</p><p>Ho trovato alcune guide molto interessanti per la programmazione dei socket in Python, ed ho deciso di cominciare a studiare un po il linguaggio.</p>
<p><img alt="socket" src="https://www.j0llyb0x.org/images/socket-2.jpg">
Quale situazione migliore se non quella di commentare gli esercizi per fissare il tutto e, per chi fosse interessato, insegnare qualcosa.</p>
<p>Premetto che il codice e la procedure è tutto tranne farina del mio sacco:</p>
<p><a href="http://www.binarytides.com/">Quest blog</a> ha ottimi articoli sul Networking e, ovviamente, su Python :)</p>
<p>In particolare ho utilizzato una <a href="http://www.binarytides.com/python-socket-programming-tutorial/">Guida introduttiva ai Sockets in Python</a>; fate tesoro del sito, perché è davvero ottimo.</p>
<p>Per aiutarmi ed aiutarvi, metto anche il link alle pagine di <a href="http://docs.python.org/2/library/socket.html">manuale sui sockets</a> (è python 2.7).</p>
<p>L'articolo sul blog del link è composto di due parti:</p>
<ul>
<li>
<p>la costruzione di un client python che si connette ad un server, invia dati sul socket e attende la risposta prima di chiudere la comunicazione;</p>
</li>
<li>
<p>la creazione di un server, sempre in python, che si mette in ascolto su una porta e fa da "pappagallo" stampando a schermo quello che ricevere dal mittente, anche in multi-threading.</p>
</li>
</ul>
<p>Oggi io descriverò il client, lasciano il server python per la prossima..</p>
<h3>Il client</h3>
<p>Ed ecco il mio primo socket:</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/usr/bin/env python2</span>
<span class="kn">import</span> <span class="nn">socket</span> <span class="c1"># :)</span>
<span class="kn">import</span> <span class="nn">sys</span> <span class="c1"># per exit code</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># creo il socket TCP/IP</span>
<span class="n">sockMe</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="n">msg</span><span class="p">:</span>
<span class="k">print</span> <span class="s1">'Failed to create a socket. Error Code: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="s1">' , error message: '</span> <span class="o">+</span> <span class="n">msg</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">();</span>
<span class="k">print</span> <span class="s1">'il mio primo Socket esiste!'</span>
</code></pre></div></td></tr></table></div>
<p>La mia intestazione deriva dal fatto che utilizzando Archlinux ho Python3 come interprete di _default _mentre questo codice è stato creato per python 2.x. La maggior parte delle distribuzioni utilizzano python 2.x quindi dovreste poter utilizzare</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/usr/bin/env python</span>
</code></pre></div></td></tr></table></div>
<p>Senza stare troppo a divagare, in queste quattro righe di codice si importano le librerie standard pyhton per i <em>sockets</em> (import socket) e di quelle di sistema (guarda un po) per la gestione dell'I/O, l'imput utente etcetc..</p>
<p>Visto che, chi ha fatto la guida è una persona colta, lui ha utilizzato un metodo di gestione delle "eccezioni" del tipo: prova a fare <em>questo</em> e se non riesci, giustificati con <em>questo</em>.</p>
<p>La forma è try:/except: e come tutte le cose in python gli spazi e l'indentazione contano.</p>
<p>Quel che si "<em>prova</em>" (try) a fare è creare un socket, associando la variabile sockMe:</p>
<p><code>socket.AF_INET, socket.SOCK_STREAM</code>
Dove AF_INET sta per protocollo IP e SOCK_STREAM è il portocollo tcp (indovinate cosa è SOCK_DATAGRAM..).</p>
<p>Andando avanti col codice, aggiungiamo un po di pezzi dato che un socket da solo non fa la felicità..</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span>
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/usr/bin/env python2</span>
<span class="c1">## My fist approach to sockets</span>
<span class="kn">import</span> <span class="nn">socket</span> <span class="c1"># :)</span>
<span class="kn">import</span> <span class="nn">sys</span> <span class="c1"># for exit code</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># creo il socket TCP/IP</span>
<span class="n">sockMe</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="n">msg</span><span class="p">:</span>
<span class="k">print</span> <span class="s1">'Failed to create a socket. Error Code: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="s1">' , error message: '</span> <span class="o">+</span> <span class="n">msg</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">();</span>
<span class="k">print</span> <span class="s1">'il mio primo Socket esiste!'</span>
<span class="n">host</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">remote_ip</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span> <span class="n">host</span> <span class="p">)</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">gaierror</span><span class="p">:</span>
<span class="c1"># non posso risolvere: non ho internet o il dns non funziona</span>
<span class="k">print</span> <span class="s1">'Hostname non trovato.'</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">();</span>
<span class="k">print</span> <span class="s2">"L'IP di "</span> <span class="o">+</span> <span class="n">host</span> <span class="o">+</span> <span class="s2">" e' "</span> <span class="o">+</span> <span class="n">remote_ip</span>
<span class="k">print</span> <span class="s1">'ed ora connettiamoci...'</span>
<span class="c1"># connettiamoci a ip-porta</span>
<span class="n">sockMe</span><span class="o">.</span><span class="n">connect</span><span class="p">((</span><span class="n">remote_ip</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
</code></pre></div></td></tr></table></div>
<p>Facciamo faville :)</p>
<p>Ora stiamo usando il socket, connettendoci ad un <em>host</em> ed una _porta _che definiamo con _argv (_cioè dall'input passando due argomenti allo script tipo "./client.py google.com 80").</p>
<p>socket.gethostbyname, invece, è il resolver python, che cerca di risolvere l'hostname tramite dns o file /etc/hosts; anche questa volta <em>proviamo</em> a risolvere e, se tutto fila liscio, eseguiamo un sockMe.connect per aprire la connessione con l'host (risolto come IP) e la porta definiti.</p>
<p>Ora che abbiamo un bel socket aperto e connesso all'altro capo della linea, perché non inviamo un bel messaggio al nostro interlocutore:</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span>
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span>
<span class="normal">32</span>
<span class="normal">33</span>
<span class="normal">34</span>
<span class="normal">35</span>
<span class="normal">36</span>
<span class="normal">37</span>
<span class="normal">38</span>
<span class="normal">39</span>
<span class="normal">40</span>
<span class="normal">41</span>
<span class="normal">42</span>
<span class="normal">43</span>
<span class="normal">44</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/usr/bin/env python2</span>
<span class="c1">## My fist approach to sockets</span>
<span class="kn">import</span> <span class="nn">socket</span> <span class="c1"># :)</span>
<span class="kn">import</span> <span class="nn">sys</span> <span class="c1"># for exit code</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># creo il socket TCP/IP</span>
<span class="n">sockMe</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="n">msg</span><span class="p">:</span>
<span class="k">print</span> <span class="s1">'Failed to create a socket. Error Code: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="s1">' , error message: '</span> <span class="o">+</span> <span class="n">msg</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">();</span>
<span class="k">print</span> <span class="s1">'il mio primo Socket esiste!'</span>
<span class="n">host</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">remote_ip</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span> <span class="n">host</span> <span class="p">)</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">gaierror</span><span class="p">:</span>
<span class="c1"># non posso risolvere: non ho internet o il dns non funziona</span>
<span class="k">print</span> <span class="s1">'Hostname non trovato.'</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">();</span>
<span class="k">print</span> <span class="s2">"L'IP di "</span> <span class="o">+</span> <span class="n">host</span> <span class="o">+</span> <span class="s2">" e' "</span> <span class="o">+</span> <span class="n">remote_ip</span>
<span class="k">print</span> <span class="s1">'ed ora connettiamoci...'</span>
<span class="c1"># connettiamoci a ip-porta</span>
<span class="n">sockMe</span><span class="o">.</span><span class="n">connect</span><span class="p">((</span><span class="n">remote_ip</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
<span class="n">message</span> <span class="o">=</span> <span class="s2">"W000t W000T"</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1">#inviamo tutto</span>
<span class="n">sockMe</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">:</span>
<span class="k">print</span> <span class="s1">'Errore! Non ho potuto inviare i pacchetti'</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">print</span> <span class="s1">'messaggio consegnato'</span>
</code></pre></div></td></tr></table></div>
<p>Semplicemente, con un altro metodo try/except inviamo il messaggio salvato nel buffer con il comando _sendall. _Questo comando svuota il buffer inviando tutto quello che trova all'altro capo della connessione.</p>
<p>Ed ora, il tocco finale: riceviamo la risposta, la leggiamo, la stampiamo e in fine chiudiamo la comunicazione da bravi sviluppatori (non vogliamo lasciare appese le sessioni giusto?!).</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span>
<span class="normal">16</span>
<span class="normal">17</span>
<span class="normal">18</span>
<span class="normal">19</span>
<span class="normal">20</span>
<span class="normal">21</span>
<span class="normal">22</span>
<span class="normal">23</span>
<span class="normal">24</span>
<span class="normal">25</span>
<span class="normal">26</span>
<span class="normal">27</span>
<span class="normal">28</span>
<span class="normal">29</span>
<span class="normal">30</span>
<span class="normal">31</span>
<span class="normal">32</span>
<span class="normal">33</span>
<span class="normal">34</span>
<span class="normal">35</span>
<span class="normal">36</span>
<span class="normal">37</span>
<span class="normal">38</span>
<span class="normal">39</span>
<span class="normal">40</span>
<span class="normal">41</span>
<span class="normal">42</span>
<span class="normal">43</span>
<span class="normal">44</span>
<span class="normal">45</span>
<span class="normal">46</span>
<span class="normal">47</span>
<span class="normal">48</span>
<span class="normal">49</span>
<span class="normal">50</span>
<span class="normal">51</span>
<span class="normal">52</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/usr/bin/env python2</span>
<span class="c1">## My fist approach to sockets</span>
<span class="kn">import</span> <span class="nn">socket</span> <span class="c1"># :)</span>
<span class="kn">import</span> <span class="nn">sys</span> <span class="c1"># for exit code</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1"># creo il socket TCP/IP</span>
<span class="n">sockMe</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">socket</span><span class="p">(</span><span class="n">socket</span><span class="o">.</span><span class="n">AF_INET</span><span class="p">,</span> <span class="n">socket</span><span class="o">.</span><span class="n">SOCK_STREAM</span><span class="p">)</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">,</span> <span class="n">msg</span><span class="p">:</span>
<span class="k">print</span> <span class="s1">'Failed to create a socket. Error Code: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">msg</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">+</span> <span class="s1">' , error message: '</span> <span class="o">+</span> <span class="n">msg</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">();</span>
<span class="k">print</span> <span class="s1">'il mio primo Socket esiste!'</span>
<span class="n">host</span> <span class="o">=</span> <span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">sys</span><span class="o">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">remote_ip</span> <span class="o">=</span> <span class="n">socket</span><span class="o">.</span><span class="n">gethostbyname</span><span class="p">(</span> <span class="n">host</span> <span class="p">)</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">gaierror</span><span class="p">:</span>
<span class="c1"># non posso risolvere: non ho internet o il dns non funziona</span>
<span class="k">print</span> <span class="s1">'Hostname non trovato.'</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">();</span>
<span class="k">print</span> <span class="s2">"L'IP di "</span> <span class="o">+</span> <span class="n">host</span> <span class="o">+</span> <span class="s2">" e' "</span> <span class="o">+</span> <span class="n">remote_ip</span>
<span class="k">print</span> <span class="s1">'ed ora connettiamoci...'</span>
<span class="c1"># connettiamoci a ip-porta</span>
<span class="n">sockMe</span><span class="o">.</span><span class="n">connect</span><span class="p">((</span><span class="n">remote_ip</span><span class="p">,</span> <span class="n">port</span><span class="p">))</span>
<span class="n">message</span> <span class="o">=</span> <span class="s2">"W000t W000T"</span>
<span class="k">try</span><span class="p">:</span>
<span class="c1">#inviamo tutto</span>
<span class="n">sockMe</span><span class="o">.</span><span class="n">sendall</span><span class="p">(</span><span class="n">message</span><span class="p">)</span>
<span class="k">except</span> <span class="n">socket</span><span class="o">.</span><span class="n">error</span><span class="p">:</span>
<span class="k">print</span> <span class="s1">'Errore! Non ho potuto inviare i pacchetti'</span>
<span class="n">sys</span><span class="o">.</span><span class="n">exit</span><span class="p">()</span>
<span class="k">print</span> <span class="s1">'messaggio consegnato'</span>
<span class="c1">#e ora ricevo</span>
<span class="n">reply</span> <span class="o">=</span> <span class="n">sockMe</span><span class="o">.</span><span class="n">recv</span><span class="p">(</span><span class="mi">1024</span><span class="p">)</span>
<span class="k">print</span> <span class="n">reply</span>
<span class="n">sockMe</span><span class="o">.</span><span class="n">close</span><span class="p">()</span>
</code></pre></div></td></tr></table></div>
<p><em>recv</em> è impostato per ricevere una certa quantità di dati (nel nostro caso 1024 byte). Per concludere in bellezza lo script, la sessione e l'articolo, chiudiamo il nostro socket python invocando la funzione close().</p>[GUIDA] Bcache, luks e btrfs: Archlinux on steroids [parte II]2013-06-15T00:00:00+02:002013-06-15T00:00:00+02:00j0llytag:www.j0llyb0x.org,2013-06-15:/2013/guida-bcache-luks-e-btrfs-archlinux-on-steroids-parte-ii.html<p>Ed eccoci per la seconda parte di questa guida, dove tratterò l'installazione Arch con BTRFS, l'aggiunta del caching device ed l'affinamento dell'installazione. La parte su Bcache & crittografia del disco la trovate nella <a href="http://j0llyb0x.org/bcache-luks-e-btrfs-linux-on-steroids-06-2013/">prima parte della guida</a>.</p>
<p><img alt="bcache" src="https://www.j0llyb0x.org/images/bcache-2.png"></p>
<p>I link alle guide:</p>
<ul>
<li><a href="https://wiki.archlinux.org/index.php/Installing_on_Btrfs_root">https://wiki.archlinux.org/index.php/Installing_on_Btrfs_root</a> </li>
<li><a href="https://wiki.archlinux.org/index.php/Bcache">https://wiki.archlinux …</a></li></ul><p>Ed eccoci per la seconda parte di questa guida, dove tratterò l'installazione Arch con BTRFS, l'aggiunta del caching device ed l'affinamento dell'installazione. La parte su Bcache & crittografia del disco la trovate nella <a href="http://j0llyb0x.org/bcache-luks-e-btrfs-linux-on-steroids-06-2013/">prima parte della guida</a>.</p>
<p><img alt="bcache" src="https://www.j0llyb0x.org/images/bcache-2.png"></p>
<p>I link alle guide:</p>
<ul>
<li><a href="https://wiki.archlinux.org/index.php/Installing_on_Btrfs_root">https://wiki.archlinux.org/index.php/Installing_on_Btrfs_root</a> </li>
<li><a href="https://wiki.archlinux.org/index.php/Bcache">https://wiki.archlinux.org/index.php/Bcache</a> </li>
<li><a href="https://wiki.archlinux.org/index.php/Dm-crypt_with_LUKS">https://wiki.archlinux.org/index.php/Dm-crypt_with_LUKS</a> </li>
<li><a href="http://forums.gentoo.org/viewtopic-t-959542.html">http://forums.gentoo.org/viewtopic-t-959542.html</a></li>
</ul>
<p>... E l'indice: </p>
<p>PARTE I</p>
<ul>
<li>installazione Arch minimale su ssd<ul>
<li>base install con archiso</li>
</ul>
</li>
<li>compilazione del kernel e patch per l'inclusione del modulo bcache<ul>
<li>instalazione dei pacchetti "<a href="https://aur.archlinux.org/packages/linux-bcache-git/">linux-bcache-git</a>" e "<a href="https://aur.archlinux.org/packages/bcache-tools-git/">bcache-tools-git</a>"</li>
</ul>
</li>
<li>preparazione dell'hdd<ul>
<li>creazione del volume bcache di backend</li>
<li>encryption della partizione</li>
</ul>
</li>
</ul>
<p>PARTE II</p>
<ul>
<li>clone dell'installazione Arch da ssd a hdd<ul>
<li>creazione del fs BTRFS</li>
<li>sync dell'installazione precedente</li>
<li>modifica dei files fstab ed affini</li>
</ul>
</li>
<li>termine installazione<ul>
<li>chroot e modifica del bootloader</li>
<li>inclusione dell'hook in mkinitcpio.conf</li>
<li>eliminare Arch sull'ssd</li>
<li>creare il device di cache</li>
</ul>
</li>
</ul>
<p>PARTE III</p>
<ul>
<li>Bonus:<ul>
<li>CryptoSwap + hibernation</li>
<li>UsbKeyFile per l'autenticazione</li>
</ul>
</li>
</ul>
<p>Eravamo rimasti nella Prima parte con un volume crittografato aperto e mappato in /dev/mapper/btrfs</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span><span class="w"> </span>
<span class="err">└──</span><span class="w"> </span><span class="n">cryptsetup</span><span class="w"> </span><span class="n">luksOpen</span><span class="w"> </span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">bcache0</span><span class="w"> </span><span class="n">btrfs</span>
<span class="n">Btrfs_</span><span class="w"> </span><span class="n">è</span><span class="w"> </span><span class="n">il</span><span class="w"> </span><span class="n">_device</span><span class="w"> </span><span class="n">mapper_</span><span class="w"> </span><span class="n">name</span><span class="w"> </span><span class="n">che</span><span class="w"> </span><span class="n">daremo</span><span class="w"> </span><span class="n">alla</span><span class="w"> </span><span class="n">partizione</span><span class="w"> </span><span class="n">una</span><span class="w"> </span><span class="n">volta</span><span class="w"> </span><span class="n">aperta</span><span class="p">.</span><span class="w"> </span><span class="n">Per</span><span class="w"> </span><span class="n">formattare</span><span class="w"> </span><span class="n">il</span><span class="w"> </span><span class="n">device</span><span class="p">,</span><span class="w"> </span><span class="n">installate</span><span class="w"> </span><span class="n">btrfs</span><span class="o">-</span><span class="n">progs</span><span class="p">,</span><span class="w"> </span><span class="n">se</span><span class="w"> </span><span class="n">ancora</span><span class="w"> </span><span class="n">non</span><span class="w"> </span><span class="n">lo</span><span class="w"> </span><span class="n">avete</span><span class="w"> </span><span class="n">fatto</span><span class="w"> </span><span class="n">e</span><span class="w"> </span><span class="n">cominciate</span><span class="w"> </span><span class="n">definendo</span><span class="w"> </span><span class="n">il</span><span class="w"> </span><span class="n">vostro</span><span class="w"> </span><span class="n">_layout_</span><span class="w"> </span><span class="n">per</span><span class="w"> </span><span class="n">le</span><span class="w"> </span><span class="n">partizioni</span><span class="w"> </span><span class="n">che</span><span class="w"> </span><span class="n">volete</span><span class="w"> </span><span class="n">gestire</span><span class="p">.</span><span class="w"> </span><span class="n">Per</span><span class="w"> </span><span class="n">prima</span><span class="w"> </span><span class="n">cosa</span><span class="p">,</span><span class="w"> </span><span class="k">create</span><span class="w"> </span><span class="n">il</span><span class="w"> </span><span class="n">_Root</span><span class="w"> </span><span class="n">device_</span><span class="w"> </span><span class="n">con</span><span class="w"> </span><span class="n">il</span><span class="w"> </span><span class="nl">comando</span><span class="p">:</span>
<span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span><span class="w"> </span>
<span class="err">└──</span><span class="w"> </span><span class="n">mkfs</span><span class="p">.</span><span class="n">btrfs</span><span class="w"> </span><span class="o">-</span><span class="n">L</span><span class="w"> </span><span class="n">btrfs_container</span><span class="w"> </span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">mapper</span><span class="o">/</span><span class="n">btrfs</span>
</code></pre></div>
<p>La procedura seguente intende utilizzare tutte le ultime features che btrfs consente, tra cui:</p>
<ul>
<li>la possibilità di creare <em>snapshots</em> di qualsiasi partizione (anche l'intero filesystem);</li>
<li>la gestione separata dei <em>subvolumes</em> in maniera dinamica;</li>
<li>la compressione trasparente dei dati sul filesystem.</li>
</ul>
<p>Quest'ultima novità di questo stupendo <em>filesystem</em> è vale da sola tutta la fatica spesa: la compressione permette di salvare spazio sul disco, velocizzare la lettura dei files e permette il funzionamento impostandolo per singolo <em>subvolume</em>! Quindi, montate il filesystem root e create i vostri volumi come fareste in lvm, non dimenticando la compressione ;):</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span><span class="w"> </span>
<span class="err">└──</span><span class="w"> </span><span class="n">mount</span><span class="w"> </span><span class="o">-</span><span class="n">o</span><span class="w"> </span><span class="n">defaults</span><span class="p">,</span><span class="n">noatime</span><span class="w"> </span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">mapper</span><span class="o">/</span><span class="n">btrfs</span><span class="w"> </span><span class="o">/</span><span class="n">mnt</span><span class="o">/</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">cd</span><span class="w"> </span><span class="o">/</span><span class="n">mnt</span><span class="o">/</span>
</code></pre></div>
<p>Prima di tutto, create la directory di <em>snapshot:</em></p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">/mnt</span><span class="o">]</span><span class="w"> </span>
<span class="err">└──</span><span class="w"> </span><span class="n">mkdir</span><span class="w"> </span><span class="n">__snapshot</span>
</code></pre></div>
<p>Poi create un <em>subvolume</em> che fungerà da root del sistema:</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span><span class="w"> </span>
<span class="err">└──</span><span class="w"> </span><span class="n">btrfs</span><span class="w"> </span><span class="n">subvol</span><span class="w"> </span><span class="k">create</span><span class="w"> </span><span class="n">__active</span>
</code></pre></div>
<p>Anche in questo caso la nomenclatura è presa dal <a href="https://wiki.archlinux.org/index.php/Installing_on_Btrfs_root">Wiki Arch</a>, per mantenere la compatibilità con gli strumenti al momento disponibili su Arch. Ora smontate pure il vostro <em>filesystem</em>, e preparatevi alla magia:</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span><span class="w"> </span>
<span class="err">└──</span><span class="w"> </span><span class="n">mount</span><span class="w"> </span><span class="o">-</span><span class="n">o</span><span class="w"> </span><span class="n">defaults</span><span class="p">,</span><span class="n">noatime</span><span class="p">,</span><span class="nf">compress</span><span class="o">=</span><span class="n">lzo</span><span class="p">,</span><span class="n">subvol</span><span class="o">=</span><span class="n">__active</span><span class="w"> </span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">mapper</span><span class="o">/</span><span class="n">btrfs</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">cd</span><span class="w"> </span><span class="o">/</span><span class="n">mnt</span><span class="o">/</span>
</code></pre></div>
<p>Ora il <em>subvolume</em> __active è montato e pronto per gestire l'intera installazione; notate l'opzione compress= che permette di comprimere i dati (il formato lzo sembra essere il miglior compromesso tra compressione e consumo di cpu); tenete presente che la compressione del filesystem funziona in <em>realtime</em> per la scrittura dei dati, quindi è il caso che la attiviate fin da subito e in maniera persistente (se volete utilizzarla) o avrete parti del <em>filesystem</em> compresse ed altre no. Ora potete creare tutti i <em>subvolume</em> che preferite; sono molto flessibili e consiglio di utilizzarli in maniera estensiva; io ho fatto così:</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="p">[</span><span class="n">j0lly</span><span class="err">@</span><span class="n">TheH0le</span><span class="p">]</span><span class="err">──</span><span class="p">[</span><span class="o">~</span><span class="p">]</span><span class="w"> </span>
<span class="err">└──</span><span class="w"> </span><span class="n">btrfs</span><span class="w"> </span><span class="n">subvol</span><span class="w"> </span><span class="n">list</span><span class="w"> </span>
<span class="n">ID</span><span class="w"> </span><span class="mi">256</span><span class="w"> </span><span class="n">gen</span><span class="w"> </span><span class="mi">8545</span><span class="w"> </span><span class="n">top</span><span class="w"> </span><span class="n">level</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="n">__active</span><span class="w"> </span>
<span class="n">ID</span><span class="w"> </span><span class="mi">259</span><span class="w"> </span><span class="n">gen</span><span class="w"> </span><span class="mi">8433</span><span class="w"> </span><span class="n">top</span><span class="w"> </span><span class="n">level</span><span class="w"> </span><span class="mi">256</span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="n">usr</span><span class="w"> </span>
<span class="n">ID</span><span class="w"> </span><span class="mi">260</span><span class="w"> </span><span class="n">gen</span><span class="w"> </span><span class="mi">8567</span><span class="w"> </span><span class="n">top</span><span class="w"> </span><span class="n">level</span><span class="w"> </span><span class="mi">256</span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="k">var</span><span class="w"> </span>
<span class="n">ID</span><span class="w"> </span><span class="mi">265</span><span class="w"> </span><span class="n">gen</span><span class="w"> </span><span class="mi">8567</span><span class="w"> </span><span class="n">top</span><span class="w"> </span><span class="n">level</span><span class="w"> </span><span class="mi">256</span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="n">home</span><span class="o">/</span><span class="n">j0lly</span><span class="w"> </span>
<span class="n">ID</span><span class="w"> </span><span class="mi">266</span><span class="w"> </span><span class="n">gen</span><span class="w"> </span><span class="mi">3697</span><span class="w"> </span><span class="n">top</span><span class="w"> </span><span class="n">level</span><span class="w"> </span><span class="mi">256</span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="n">home</span><span class="o">/</span><span class="n">j0lly</span><span class="o">/</span><span class="n">images</span><span class="w"> </span>
<span class="n">ID</span><span class="w"> </span><span class="mi">267</span><span class="w"> </span><span class="n">gen</span><span class="w"> </span><span class="mi">8449</span><span class="w"> </span><span class="n">top</span><span class="w"> </span><span class="n">level</span><span class="w"> </span><span class="mi">256</span><span class="w"> </span><span class="n">path</span><span class="w"> </span><span class="n">home</span><span class="o">/</span><span class="n">j0lly</span><span class="o">/</span><span class="n">music</span>
</code></pre></div>
<p>Le opzioni di mount sono propagate anche ai figli, se non specificato altrimenti. Sulla mia "nuova" root ho poi <em>restorato</em> il sistema <em>backuppato</em> precedentemente, per risparmiare un paio di comandi e non installare da zero. È il momento di affinare le configurazioni.; non dimenticatevi di popolare /etc/fstab. Il mio è così:</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="p">[</span><span class="nx">j0lly</span><span class="err">@</span><span class="nx">TheH0le</span><span class="p">]</span><span class="err">──</span><span class="p">[</span><span class="o">~</span><span class="p">]</span><span class="w"> </span>
<span class="err">└──</span><span class="w"> </span><span class="nx">cat</span><span class="w"> </span><span class="o">/</span><span class="nx">etc</span><span class="o">/</span><span class="nx">fstab</span><span class="w"> </span>
<span class="err">#</span><span class="o">/</span><span class="nx">etc</span><span class="o">/</span><span class="nx">fstab</span><span class="p">:</span><span class="w"> </span><span class="nx">static</span><span class="w"> </span><span class="nx">file</span><span class="w"> </span><span class="nx">system</span><span class="w"> </span><span class="nx">information</span><span class="w"> </span>
<span class="err">#</span><span class="w"> </span>
<span class="err">#</span><span class="w"> </span><span class="p"><</span><span class="nx">file</span><span class="w"> </span><span class="nx">system</span><span class="p">></span><span class="w"> </span><span class="p"><</span><span class="nx">dir</span><span class="p">></span><span class="w"> </span><span class="p"><</span><span class="k">type</span><span class="p">></span><span class="w"> </span><span class="p"><</span><span class="nx">options</span><span class="p">></span><span class="w"> </span><span class="p"><</span><span class="nx">dump</span><span class="p">></span><span class="w"> </span><span class="p"><</span><span class="nx">pass</span><span class="p">></span><span class="w"> </span>
<span class="nx">LABEL</span><span class="p">=</span><span class="nx">btrfs_container</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="nx">btrfs</span><span class="w"> </span><span class="nx">rw</span><span class="p">,</span><span class="nx">space_cache</span><span class="p">,</span><span class="nx">thread_pool</span><span class="p">=</span><span class="mi">32</span><span class="p">,</span><span class="nx">noatime</span><span class="p">,</span><span class="nx">subvol</span><span class="p">=</span><span class="nx">__active</span><span class="p">,</span><span class="nx">compress</span><span class="p">=</span><span class="nx">lzo</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span>
<span class="o">/</span><span class="nx">dev</span><span class="o">/</span><span class="nx">sda3</span><span class="w"> </span><span class="o">/</span><span class="nx">boot</span><span class="w"> </span><span class="nx">ext4</span><span class="w"> </span><span class="nx">defaults</span><span class="w"> </span><span class="mi">1</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span>
<span class="o">/</span><span class="nx">dev</span><span class="o">/</span><span class="nx">mapper</span><span class="o">/</span><span class="nx">cryptswap</span><span class="w"> </span><span class="nx">none</span><span class="w"> </span><span class="nx">swap</span><span class="w"> </span><span class="nx">defaults</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">0</span>
</code></pre></div>
<p>Tenete presente un paio di accorgimenti:</p>
<ul>
<li>non è necessario montare i <em>subvolume</em> dentro al vostro volume root (nel mio caso __active) perchè verranno montati in automatico;</li>
<li>non dimenticate di specificare opzioni come subvol e compress (se volete utilizzarli;</li>
<li>btrfs non necessita assolutamente di fsck all'avvio, quindi mettete 0 nella seconda colonna delle partizioni btrfs;</li>
<li>vorrete probabilmente montare la partizione di boot (esterna e non crittografata).</li>
</ul>
<p>Siamo quasi-quasi a buon punto; manca da rigenerare il ramdisk e reinstallare il bootloader, quindi montate la partizione di boot (che io ho riutilizzato dall'installazione ponte sulla ssd) ed entrate in chroot. Reinstallate Grub ed aggiornate le entry ( per non rischiare, potreste aggiungere una stringa di boot per l'ssd. in caso qualcosa andasse storto). Prima di ricreare il grub.cfg, editate /etc/default/grub per aggiungere questi parametri non ancora gestiti da Grub:</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span><span class="w"> </span>
<span class="err">└──</span><span class="w"> </span><span class="n">cat</span><span class="w"> </span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="k">default</span><span class="o">/</span><span class="n">grub</span><span class="w"> </span>
<span class="n">GRUB_DEFAULT</span><span class="o">=</span><span class="mi">0</span><span class="w"> </span><span class="n">GRUB_TIMEOUT</span><span class="o">=</span><span class="mi">5</span><span class="w"> </span>
<span class="n">GRUB_DISTRIBUTOR</span><span class="o">=</span><span class="ss">"Arch"</span><span class="w"> </span>
<span class="n">GRUB_CMDLINE_LINUX_DEFAULT</span><span class="o">=</span><span class="ss">"quiet"</span><span class="w"> </span>
<span class="n">GRUB_CMDLINE_LINUX</span><span class="o">=</span><span class="ss">"cryptdevice=/dev/bcache0:btrfs1 cryptkey=/dev/disk/by-label/Rec_Me:ext4:/xxxxxxxxxxxxx resume=/dev/mapper/cryptswap"</span><span class="w"> </span>
<span class="o">[</span><span class="n">...</span><span class="o">]</span>
</code></pre></div>
<ul>
<li>cryptdevice: specificate il device bcache da utilizzare per LUKS: se non usate il label in fstab, ricordate di allineare il nome che date al container.</li>
<li>cryptkey: questo è il <em>path</em> per la chiave automatica (parleremo dopo di questo) per non immettere la password all'avvio.</li>
<li>resume: anche questo sarà utilizzato succcessivamente; è il path del device di resume dall'ibernazione.</li>
</ul>
<p>Per l'hook in mkinitcpio, modificate la configurazione aggiungendo le righe seguenti in /etc/mkinitcpio.conf:</p>
<div class="highlight"><pre><span></span><code>┌──<span class="o">[</span>j0lly@TheH0le<span class="o">]</span>──<span class="o">[</span>~<span class="o">]</span><span class="w"> </span>
└──<span class="w"> </span>cat<span class="w"> </span>/etc/mkinitcpio.conf<span class="w"> </span>
<span class="c1"># vim:set ft=sh </span>
<span class="c1"># MODULES </span>
<span class="c1"># The following modules are loaded before any boot hooks are </span>
<span class="c1"># run. Advanced users may wish to specify all system modules </span>
<span class="c1"># in this array. For instance: </span>
<span class="c1"># MODULES="piix ide_disk reiserfs" </span>
<span class="c1">#</span>
<span class="nv">MODULES</span><span class="o">=</span><span class="s2">""</span><span class="w"> </span><span class="nv">MODULES</span><span class="o">=</span><span class="s2">"crc32c dm_mod"</span><span class="w"> </span>
<span class="o">[</span>...<span class="o">]</span><span class="w"> </span>
<span class="nv">HOOKS</span><span class="o">=</span><span class="s2">"base udev modconf block bcache encrypt openswap resume btrfs filesystems keyboard keymap"</span><span class="w"> </span>
<span class="o">[</span>...<span class="o">]</span>
</code></pre></div>
<p>Non ricordo assolutamente dove ho letto dei moduli crc32 e dm_mod, ma quando avrò tempo di testare un ramdisk senza di essi farò un aggiornamento. Riguardo gli <em>HOOK</em>, cercate di pensare alla vostra configurazione; nel mio caso l'ordine cronologico è: bcache encrypt btrfs. importanete: Openswap e resume sono hook che ho aggiunto successivamente e che verranno documentati nella terza parte della guida e non dovreste utilizzarli adesso (anche perchè openswap è uno script creato appositamente per l'apertura del volume swap criptato e potrebbe darvi noie al boot). Ora ricreate <em>l'initrfs</em>:</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span>
<span class="err">└──</span><span class="w"> </span><span class="n">mkinitcpio</span><span class="w"> </span><span class="o">-</span><span class="n">L</span><span class="w"> </span><span class="n">linux</span><span class="o">-</span><span class="n">bcache</span><span class="o">-</span><span class="n">git</span><span class="w"> </span><span class="o">-</span><span class="n">g</span><span class="w"> </span><span class="o">/</span><span class="n">boot</span><span class="o">/</span><span class="n">initramfs</span><span class="o">-</span><span class="n">bcache</span><span class="p">.</span><span class="n">img</span>
</code></pre></div>
<p>Uscite dal chroot, incrociate le dita e.... rebootate. Se tutto è andato bene avrete avviato il vostro nuovo sistema! Dovreste essere sulla vostra partizione bcache, aperta con luks e montata in / con btrfs! Il peggio è fatto e potete bervi una birra ;).
Se il vostro sistema è stabile, potete eliminare la vecchia installazione sull'ssd o, meglio ancora, potete creare la partizione/iso di <em>recovery (_non mi stanco di ripeterlo: È IMPORTANTE!) facendo un altro _sync</em> dall'installazione ancora presente.
Quando sarete pronti formattate il disco e create una partizione; in base alla disponibilità di spazio che avete sull'SSD e se segliete di avere lo <em>swap</em>, potete decidere di utilizzare tutto il disco SSD come raw device (io ho tenuto 8Gb di spazio per lo swap).
Ora potete creare e registrate il <em>caching</em> device, registrandolo al <em>backing</em> device già esistente e funzionante; i devices di <em>cache</em> possono essere collegati, registrati e scollegati a caldo, anche se bcache0 esiste già.</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span>
<span class="err">└──</span><span class="w"> </span><span class="n">make</span><span class="o">-</span><span class="n">bcache</span><span class="w"> </span><span class="o">--</span><span class="n">cache</span><span class="w"> </span><span class="o">--</span><span class="n">block</span><span class="w"> </span><span class="mi">512</span><span class="w"> </span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">sdb1</span>
<span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span>
<span class="err">└──</span><span class="w"> </span><span class="n">echo</span><span class="w"> </span><span class="n">d893f034</span><span class="o">-</span><span class="mi">1440</span><span class="o">-</span><span class="mi">4</span><span class="n">a8c</span><span class="o">-</span><span class="n">bb40</span><span class="o">-</span><span class="n">ae82e01bc7d6</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="o">/</span><span class="n">sys</span><span class="o">/</span><span class="n">block</span><span class="o">/</span><span class="n">bcache0</span><span class="o">/</span><span class="n">bcache</span><span class="o">/</span><span class="n">attach</span>
</code></pre></div>
<p>l'UUID lo trovate sotto /sys/fs/bcacahe/<UUID>. Ora che tutto è al suo posto, un reboot finale non guasta, per verificare che funzioni correttamente. Se siete abbastanza temerari, potete abilitare il writeback nel device: l'SSD fa da <em>cache</em> anche in scrittura, aumentando prestazioni ma, indubbiamente, aggiungendo ulteriori rischi di perdita di dati ( per attivate, <em>echo writeback > /sys/block/sda/sda*/bcache/cache_mode</em> ).</p>
<p>Suggerimento:
Mi capitato alcune volte durante alcune modifiche che il device bcache non partisse all'avvio (non è sicuramente una tecnologia "matura" ;)) e quindi riporto la soluzione trovata direttamente sulla wiki Arch e Gentoo per fare un recovery della partizione e fixare il porbema da dentro (spesso basta ri-registrare il cahing device:</p>
<div class="highlight"><pre><span></span><code>cat /sys/block/sda/sda3/bcache/running
0
echo 1 > /sys/block/sda/sda3/bcache/running
</code></pre></div>
<p>Tenete presente che se avete abilitato il <em>writeback</em> e c'erano dati non salvati, quei dati verranno persi :(.
Con questo ho terminato anche la seconda parte della guida.
Nella terza ed ultima parte scriverò come creare un device di swap da utilizzare per l'ibernazione in maniera sicura crittografando il partizione, e il metodo utilizzato da me per ovviare alle continue richieste di password all'avvio tramite una chiave salvata su un dispositivo esterno (chiavetta usb).</p>
<p>That's all, alla porssima!</p>[GUIDA] Bcache, luks e btrfs: Archlinux on steroids [parte I]2013-06-14T00:00:00+02:002013-06-14T00:00:00+02:00j0llytag:www.j0llyb0x.org,2013-06-14:/2013/guida-bcache-luks-e-btrfs-archlinux-on-steroids-parte-i.html<p>Per inaugurare il ritorno ad Archlinux, ho deciso di scrivere un articolo sulla mia attuale installazione! Ho deciso di scrivere questa guida per chiunque voglia cimentarsi con il nuovissimo modulo Kernel (che sarà ufficialmente supportato solo dalla versione 3.10) bcache, che introduce il caching dinamico di un hard disk …</p><p>Per inaugurare il ritorno ad Archlinux, ho deciso di scrivere un articolo sulla mia attuale installazione! Ho deciso di scrivere questa guida per chiunque voglia cimentarsi con il nuovissimo modulo Kernel (che sarà ufficialmente supportato solo dalla versione 3.10) bcache, che introduce il caching dinamico di un hard disk col supporto di una SSD.</p>
<p><img alt="bcache" src="https://www.j0llyb0x.org/images/bcache-1.jpg"></p>
<p>Il modulo in questione è pensato per chi ha una piccola SSD (magari saldata sulla motherboard come me) da sfruttare al meglio. Fino a poco tempo fa installavo la <em>Root</em> direttamente su SSD, per lasciare la <em>Home</em> sull'HDD. È vero che spesso nella <em>Home</em> esistono files come iso, musica, video, immagini e vari file binari che non giovano delle scritture random delle SSD, ma il caching può comunque servire a velocizzare tutti i files di configurazione all'interno della <em>Home</em> del nostro utente. Visto che ero in ballo con una bella installazione complessa, ho deciso di fare le cose per bene, aggiungendo una <em>full encryption</em> del disco e un <em>filesystem</em> che, posso dirlo, sembra davvero una scelta azzeccatissima: btrfs! Ho utilizzato un paio di guide poco complesse da seguire, ma non credo esista qualcosa in italiano per cui ho deciso di raccogliere tutto in una guida.</p>
<p>PARTE I</p>
<ul>
<li>installazione Arch minimale su ssd</li>
<li>base install con archiso</li>
<li>compilazione del kernel e patch per l'inclusione del modulo bcache</li>
<li>instalazione dei pacchetti "<a href="https://aur.archlinux.org/packages/linux-bcache-git/">linux-bcache-git</a>" e "<a href="https://aur.archlinux.org/packages/bcache-tools-git/">bcache-tools-git</a>"</li>
<li>preparazione dell'hdd</li>
<li>creazione del volume bcache di backend</li>
<li>encryption della partizione</li>
</ul>
<p>PARTE II</p>
<ul>
<li>clone dell'installazione Arch da ssd a hdd</li>
<li>creazione del fs BTRFS</li>
<li>sync dell'installazione precedente</li>
<li>
<p>modifica dei files fstab ed affini</p>
</li>
<li>
<p>Termine installazione</p>
</li>
<li>chroot e modifica del bootloader</li>
<li>inclusione dell'hook in mkinitcpio.conf</li>
<li>eliminare Arch sull'ssd</li>
<li>creare il device di cache</li>
</ul>
<p>PARTE III</p>
<ul>
<li>Bonus:</li>
<li>CryptoSwap + hibernation</li>
<li>UsbKeyFile per l'autenticazione</li>
</ul>
<p>E qui le guide:</p>
<p><a href="https://wiki.archlinux.org/index.php/Installing_on_Btrfs_root">https://wiki.archlinux.org/index.php/Installing_on_Btrfs_root</a>
<a href="https://wiki.archlinux.org/index.php/Bcache">https://wiki.archlinux.org/index.php/Bcache</a>
<a href="https://wiki.archlinux.org/index.php/Dm-crypt_with_LUKS">https://wiki.archlinux.org/index.php/Dm-crypt_with_LUKS</a>
<a href="http://forums.gentoo.org/viewtopic-t-959542.html">http://forums.gentoo.org/viewtopic-t-959542.html</a></p>
<p>Prima di tutto.. la mia attuale configurazione:</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span>
<span class="err">└──</span><span class="w"> </span><span class="n">uname</span><span class="w"> </span><span class="o">-</span><span class="n">mnr</span><span class="w"> </span>
<span class="n">TheH0le</span><span class="w"> </span><span class="mf">3.9.0</span><span class="o">-</span><span class="mi">1</span><span class="o">-</span><span class="n">ARCH</span><span class="o">-</span><span class="mi">01423</span><span class="o">-</span><span class="n">gbfd2858</span><span class="o">-</span><span class="n">dirty</span><span class="w"> </span><span class="n">x86_64</span>
</code></pre></div>
<p>HDD 500Gb + SSD 24Gb</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="p">[</span><span class="n">j0lly</span><span class="p">@</span><span class="n">TheH0le</span><span class="p">]</span><span class="err">──</span><span class="p">[</span><span class="o">~</span><span class="p">]</span>
<span class="err">└──</span><span class="w"> </span><span class="n">lsblk</span>
<span class="n">NAME</span><span class="w"> </span><span class="n">MAJ</span><span class="o">:</span><span class="n">MIN</span><span class="w"> </span><span class="n">RM</span><span class="w"> </span><span class="n">SIZE</span><span class="w"> </span><span class="n">RO</span><span class="w"> </span><span class="n">TYPE</span><span class="w"> </span><span class="n">MOUNTPOINT</span>
<span class="n">sda</span><span class="w"> </span><span class="mi">8</span><span class="o">:</span><span class="mi">0</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">465</span><span class="p">,</span><span class="mi">8</span><span class="n">G</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">disk</span>
<span class="err">├─</span><span class="n">sda1</span><span class="w"> </span><span class="mi">8</span><span class="o">:</span><span class="mi">1</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">2</span><span class="n">M</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">part</span><span class="w"> </span><span class="p">[</span><span class="n">GRUB</span><span class="w"> </span><span class="n">RESERVED</span><span class="p">]</span>
<span class="err">├─</span><span class="n">sda2</span><span class="w"> </span><span class="mi">8</span><span class="o">:</span><span class="mi">2</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">509</span><span class="n">M</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">part</span><span class="w"> </span><span class="p">[</span><span class="n">UEFI</span><span class="w"> </span><span class="n">RESERVED</span><span class="p">]</span>
<span class="err">├─</span><span class="n">sda3</span><span class="w"> </span><span class="mi">8</span><span class="o">:</span><span class="mi">3</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">500</span><span class="n">M</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">part</span><span class="w"> </span><span class="o">/</span><span class="n">boot</span>
<span class="err">├─</span><span class="n">sda4</span><span class="w"> </span><span class="mi">8</span><span class="o">:</span><span class="mi">4</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">1</span><span class="n">G</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">part</span><span class="w"> </span><span class="p">[</span><span class="n">RECOVER</span><span class="w"> </span><span class="n">PARTITION</span><span class="p">]</span>
<span class="err">├─</span><span class="n">sda5</span><span class="w"> </span><span class="mi">8</span><span class="o">:</span><span class="mi">5</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">455</span><span class="p">,</span><span class="mi">8</span><span class="n">G</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">part</span>
<span class="err">└─</span><span class="n">bcache0</span><span class="w"> </span><span class="mi">254</span><span class="o">:</span><span class="mi">0</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">455</span><span class="p">,</span><span class="mi">8</span><span class="n">G</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">disk</span>
<span class="w"> </span><span class="err">└─</span><span class="n">btrfs1</span><span class="w"> </span><span class="mi">253</span><span class="o">:</span><span class="mi">0</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">455</span><span class="p">,</span><span class="mi">8</span><span class="n">G</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">crypt</span><span class="w"> </span><span class="o">/</span>
<span class="n">sdb</span><span class="w"> </span><span class="mi">8</span><span class="o">:</span><span class="mi">16</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">22</span><span class="p">,</span><span class="mi">4</span><span class="n">G</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">disk</span>
<span class="err">├─</span><span class="n">sdb1</span><span class="w"> </span><span class="mi">8</span><span class="o">:</span><span class="mi">17</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">8</span><span class="n">G</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">part</span>
<span class="w"> </span><span class="err">└─</span><span class="n">cryptswap</span><span class="w"> </span><span class="mi">253</span><span class="o">:</span><span class="mi">1</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">8</span><span class="n">G</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">crypt</span><span class="w"> </span><span class="p">[</span><span class="n">SWAP</span><span class="p">]</span>
<span class="err">└─</span><span class="n">sdb2</span><span class="w"> </span><span class="mi">8</span><span class="o">:</span><span class="mi">18</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">14</span><span class="p">,</span><span class="mi">4</span><span class="n">G</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">part</span>
<span class="w"> </span><span class="err">└─</span><span class="n">bcache0</span><span class="w"> </span><span class="mi">254</span><span class="o">:</span><span class="mi">0</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">455</span><span class="p">,</span><span class="mi">8</span><span class="n">G</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">disk</span>
<span class="w"> </span><span class="err">└─</span><span class="n">btrfs1</span><span class="w"> </span><span class="mi">253</span><span class="o">:</span><span class="mi">0</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="mi">455</span><span class="p">,</span><span class="mi">8</span><span class="n">G</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="n">crypt</span><span class="w"> </span><span class="o">/</span>
</code></pre></div>
<p>Per cominciare ho preparato il disco seguendo i consigli della guida Arch su <a href="http://evilpiepirate.org/git/linux-bcache.git/tree/Documentation/bcache.txt?h=bcache-dev">bcache</a>: fare un'installazione base sull'SSD, per poi allineare il tutto sull'HDD; la procedura sembrerebbe macchinosa ma, dato che per <em>bootare</em> un disco preparato per il <em>caching</em> con bcache è necessario un modulo kernel che non è attualmente supportato nella versione mainstream del kernel, è necessario compilarlo da un ambiente Linux preesistente e, dato che per Arch abbiamo un comodo pacchetto su AUR che applica le patch desiderate, la scelta si può fare ad occhi chiusi ;).</p>
<p>Se siete in grado di produrre una iso con un kernel patchato (che velocizzerebbe l'installazione e manterrebbe un sistema "recovery" su chiavetta) siete sicuramente avvantaggiati e, dato che ho smadonnato per due giorni cercando di mettere il kernel nella maledetta iso arch, non sarò io a spiegarvi come (dato che ho fallito miseramente). Prima di tutto installiamo Arch dalla Iso (procedure ben documentata nel <a href="https://wiki.archlinux.org/index.php/Beginners'_Guide_(Italiano)">wiki</a>). Non perdete tempo in fronzoli per l'installazione su SSD dato che servirà da ponte per la vera installazione; l'unico accorgimento che posso dare è quello di creare una partizione di boot da riciclare per l'altra installazione (io l'ho messa su HDD). Dopo aver terminato e restartato il nuovo sistema da SSD, potete procedere scaricando i pacchetti AUR per compilarli:</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="p">[</span><span class="n">j0lly</span><span class="err">@</span><span class="n">TheH0le</span><span class="p">]</span><span class="err">──</span><span class="p">[</span><span class="o">~</span><span class="p">]</span>
<span class="err">└──</span><span class="w"> </span><span class="n">mkdir</span><span class="w"> </span><span class="n">sources</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">cd</span><span class="w"> </span><span class="n">sources</span>
<span class="err">┌──</span><span class="p">[</span><span class="n">j0lly</span><span class="err">@</span><span class="n">TheH0le</span><span class="p">]</span><span class="err">──</span><span class="p">[</span><span class="o">~/</span><span class="n">sources</span><span class="p">]</span>
<span class="err">└──</span><span class="w"> </span><span class="n">wget</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">aur</span><span class="o">.</span><span class="n">archlinux</span><span class="o">.</span><span class="n">org</span><span class="o">/</span><span class="n">packages</span><span class="o">/</span><span class="n">li</span><span class="o">/</span><span class="n">linux</span><span class="o">-</span><span class="n">bcache</span><span class="o">-</span><span class="n">git</span><span class="o">/</span><span class="n">linux</span><span class="o">-</span><span class="n">bcache</span><span class="o">-</span><span class="n">git</span><span class="o">.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span><span class="w"> </span><span class="o">-</span><span class="n">O</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">tar</span><span class="w"> </span><span class="n">xzvf</span><span class="w"> </span><span class="o">-</span>
<span class="err">┌──</span><span class="p">[</span><span class="n">j0lly</span><span class="err">@</span><span class="n">TheH0le</span><span class="p">]</span><span class="err">──</span><span class="p">[</span><span class="o">~/</span><span class="n">sources</span><span class="p">]</span>
<span class="err">└──</span><span class="w"> </span><span class="n">wget</span><span class="w"> </span><span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">aur</span><span class="o">.</span><span class="n">archlinux</span><span class="o">.</span><span class="n">org</span><span class="o">/</span><span class="n">packages</span><span class="o">/</span><span class="n">bc</span><span class="o">/</span><span class="n">bcache</span><span class="o">-</span><span class="n">tools</span><span class="o">-</span><span class="n">git</span><span class="o">/</span><span class="n">bcache</span><span class="o">-</span><span class="n">tools</span><span class="o">-</span><span class="n">git</span><span class="o">.</span><span class="n">tar</span><span class="o">.</span><span class="n">gz</span><span class="w"> </span><span class="o">-</span><span class="n">O</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">tar</span><span class="w"> </span><span class="n">xzvf</span><span class="w"> </span><span class="o">-</span>
</code></pre></div>
<p>Controllate le dipendenze dei pacchetti (ce n'è qualcuna), e quando siete pronti lanciate makepkg -s. dopo un'estenuante attesa avrete il vostro bel kernel _patchato; _installatelo, aggiornate il conf di grub (grub-mkconfig) e fate un reboot con il kernel nuovo di zecca...</p>
<p>Il mio schema di partizionamento è stato dettato da alcuni importanti fattori, con accorgimenti da tenere in considerazione:</p>
<ul>
<li>MBR è anni luce indietro rispetto a GPT e non vedo ragione di usare una tecnologia obsoleta.</li>
<li>Dato che il mio Bios è buggato, non posso utilizzare UEFI, ripiegando sul booting old style installando il bootloader nell'MBR: se utilizzate come me l'accoppiata GPT-BIOS, ricordatevi di creare una piccola partizione all'inizio del disco da lasciare a Grub, con gdisk (gptdisk) di almeno un paio di Mb. </li>
<li>Altra importantissima considerazione è che Grub (e nessun bootloader che io conosca) non è in grado di leggere direttamente da dischi criptati col modulo dm-crypt ne tanto meno attraverso bcache. Quindi, preparatevi una partizione di boot per contenere il vostro kernel e ramdisk che verranno letti da Grub all'avvio.</li>
<li>Quarto accorgimento e potenzialmente più importante di tutti: fatevi una partizione di 1Gb o due per un sistema di <em>recovery!</em> (se siete in grado e preferite, usate una iso patchata); fidatevi, parlo per esperienza personale: se utilizzate tre <em>layer</em> di astrazione di cui due a livello sperimentale, è il caso che abbiate un sistema di <em>recovery</em> a portata di mano, se no col cavolo che accedete ai vostri dati.</li>
<li>Quinto ed ultimo accorgimento: se state pensando all'ibernazione, tenete a mente che btrfs non se la fila bene con partizioni e file di <em>swap</em>; gioco forza, dovrete creare un'altra partizione fuori dal volume btrfs; potete mantenere una partizione separata sul disco oppure, come ho fatto io, prendendo dello spazio dall'ssd.</li>
</ul>
<p>Dopo aver deciso il layout_ create le partizioni sull'HDD con gdisk. Per generare il <em>container</em> (la partizione che tiene i dati, in contrapposizione con quella che fa da cache) detto _backing device, _utilizzate il tool make-bcache:</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span>
<span class="err">└──</span><span class="w"> </span><span class="n">make</span><span class="o">-</span><span class="n">bcache</span><span class="w"> </span><span class="c1">--bdev --block 512 /dev/sd*</span>
</code></pre></div>
<p>Con questa sintassi bcache-tool formatta una partizione (o un disk raw) per il formato bcache, aggiungendo i suo metadata ed headers. Ho specificato 512 come block size perché la mia ssd dava problemi con il default block size, ma è il caso che leggiate la <a href="http://bcache.evilpiepirate.org/Design/">documentazione</a> e le possibili implicazioni. Alla creazione, il device viene automaticamente registrato e nella directory <em>/dev</em> avrete un nuovo <em>Block Device</em> chiamato /dev/bcache*. La registrazione dei <em>devices</em> bcache va fatta ad ogni boot, questo anche per facilitare l'aggiunta o la cancellazione di <em>caching devices</em> (ssd); non preoccupatevi però, perché nel pacchetto bcache-tools è compreso un <em>hook</em> per il kernel da dare in pasto a mkinitcpio che registrerà automaticamente tutti i vostri device bcache al boot. Il parametro da appendere in /etc/mkinitcpio.conf è, manco a dirlo, bcache:</p>
<div class="highlight"><pre><span></span><code>[...] block bcache
[...] filesystems
[...]
</code></pre></div>
<p>Bcache va posizionato dopo l'<em>Hook</em> dei <em>block devices</em>, ma prima dei <em>filesystems</em>.</p>
<p>Il dispositivo bcache è pronto ed è giunto il momento di utilizzare cryptsetup per cifrare la partizione, dove creerete più avanti il filesystem con btrfs. Per creare un volume crittografato, dovete utilizzare la <em>suite</em> cryptsetup. Le ozioni sono molte e dell'alto della mia ignoranza ho preferito mantenere lo standard della guida Arch su Luks (nei riferimenti):</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span>
<span class="err">└──</span><span class="w"> </span><span class="n">cryptsetup</span><span class="w"> </span><span class="c1">--cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 5000 --use-random --verify-passphrase luksFormat /dev/bacache0</span>
</code></pre></div>
<p>Salvatevi la password in un antro oscuro e non disperate: è sempre bene avere una <em>password "incazzata"</em> per il <em>recovery;</em> tanto meglio anzi, dato che Luks permette di avere fino ad 8 "chiavi" per apre i contenitori cifrati; è perfino possibile utilizzare immagini e binari e, mettendoli su una chiavetta per essere letti in automatico all'avvio, potrete scordarvi della password in tranquillità (sempre che le abbiate salvate in un luogo sicuro ;)).</p>
<p>Ok, ora che abbiamo il nostro container cifrato, lo possiamo aprire:</p>
<div class="highlight"><pre><span></span><code><span class="err">┌──</span><span class="o">[</span><span class="n">j0lly@TheH0le</span><span class="o">]</span><span class="err">──</span><span class="o">[</span><span class="n">~</span><span class="o">]</span>
<span class="err">└──</span><span class="w"> </span><span class="n">cryptsetup</span><span class="w"> </span><span class="n">luksOpen</span><span class="w"> </span><span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">bcache0</span><span class="w"> </span><span class="n">btrfs</span>
</code></pre></div>
<p>Dove _btrfs _sta significare il nome del device mapper che verrà creato all'apertura del volume (/dev/mapper/btrfs).
La prima parte della guida termina qui, ma la seconda è già quasi pronta ;)
Per chi volesse cominciare subito, ricordatevi di segnare la password per il volume crittografato, oltre a tutti i nomi simbolici che avete dato nella vostra configurazione.</p>
<p>A presto!</p>Export Mysql Database Structure Without Data2013-01-19T00:00:00+01:002013-01-19T00:00:00+01:00j0llytag:www.j0llyb0x.org,2013-01-19:/2013/export-mysql-database-structure-without-data.html<p>Sometimes you can get in need of your favourite Database clone, but you do not need all the garbage of your 3 years old data.</p>
<p><img alt="mysql" src="https://www.j0llyb0x.org/images/mysql-1.gif"></p>
<p>Well, a part for a Looong DBMS constructs to cancel every peace of data from your tables, you can simply dump your DB with the …</p><p>Sometimes you can get in need of your favourite Database clone, but you do not need all the garbage of your 3 years old data.</p>
<p><img alt="mysql" src="https://www.j0llyb0x.org/images/mysql-1.gif"></p>
<p>Well, a part for a Looong DBMS constructs to cancel every peace of data from your tables, you can simply dump your DB with the _--no-data _switch. This option is there right to dump a Mysql DB structure without the data!</p>
<p>Simply as:</p>
<div class="highlight"><pre><span></span><code><span class="n">mysqldump</span><span class="w"> </span><span class="o">-</span><span class="n">u</span><span class="w"> </span><span class="o">[</span><span class="n">User</span><span class="o">]</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="o">[</span><span class="n">DBname</span><span class="o">]</span><span class="w"> </span><span class="c1">--no-data | gzip > MyDBBackup.gz</span>
</code></pre></div>
<p>And here we go, we have a new and shiny compressed DB Structure without data.
Just to conclude, we can now create the new DB perhaps we can <em>DROP</em> the old one and restore it (remember to take a full backup before this) with</p>
<div class="highlight"><pre><span></span><code><span class="n">gzip</span><span class="w"> </span><span class="o">-</span><span class="n">d</span><span class="w"> </span><span class="n">MyDBBackup</span><span class="p">.</span><span class="n">gz</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">mysql</span><span class="w"> </span><span class="o">-</span><span class="n">u</span><span class="w"> </span><span class="o">[</span><span class="n">user</span><span class="o">]</span><span class="w"> </span><span class="o">-</span><span class="n">p</span><span class="w"> </span><span class="o">[</span><span class="n">DBname</span><span class="o">]</span>
</code></pre></div>MediaWiki & MySql installation: Pwned by Charset2013-01-08T00:00:00+01:002013-01-08T00:00:00+01:00j0llytag:www.j0llyb0x.org,2013-01-08:/2013/mediawiki-mysql-installation-pwned-by-charset.html<p>It's some days i'm dealing with a beast: Upgrading some MediaWiki sites inexplicably hosted on a Winzoz platform.</p>
<p><img alt="mediawiki" src="https://www.j0llyb0x.org/images/mediawiki-1.png"></p>
<p>The process is a pain and i'm spending hours to understand why, for example my Localsettings.php was not read from the stupid IIS server giving me odds messages in the PHP …</p><p>It's some days i'm dealing with a beast: Upgrading some MediaWiki sites inexplicably hosted on a Winzoz platform.</p>
<p><img alt="mediawiki" src="https://www.j0llyb0x.org/images/mediawiki-1.png"></p>
<p>The process is a pain and i'm spending hours to understand why, for example my Localsettings.php was not read from the stupid IIS server giving me odds messages in the PHP logs:</p>
<div class="highlight"><pre><span></span><code>Fatal error: impossibile aprire file blabla blabla
</code></pre></div>
<p>I'm very noob at Windows and i'm unconfortable on checking privilages in graphical windows; turned out that copying the config files previously backupped, from a storage server, erased all the IIS user permissions from my MediaWiki folder...</p>
<p>This is not the funny part of the story while the fight on a Mysql database became a real nightmare!</p>
<p>I spent almost 4 hours in madness looking at the problem which was preventing me to make a fresh install of a new MediaWiki release.</p>
<p>The web installer was getting n error message during the db setup.</p>
<p>The Mysql server is running on a Linux machine and my user got a strong yet human randomized password (by me) full of beautiful leters, numbers and symbols; while others MediaWiki were using the same mechanisms, my newly created user was dull to any call of the web installation script. I tried everything:</p>
<ul>
<li>
<p>Setting the right privileges to the user @ the right host: fail</p>
</li>
<li>
<p>Use the root user to perform the opeartion: it actually creates the DB but fail on the user creation (probably because the user root was already created)</p>
</li>
<li>
<p>i tried to dump a DB from another Wiki site and populating the new one with the already dumped data; i gave permission to the user i created and... you know waht: fail!!</p>
</li>
</ul>
<p>I was very frustrated because everything seems good: good permissions on Mysql server, good permission on Wiki files and folders...</p>
<p>After some other tries I figured out was my stupid random password!</p>
<p>I wrote it with a shiny, undetectable £ symbols, that wasn't properly saved or parsed in the Mysql schema due to the Charset of the MySql.</p>
<p>I've lost a bunch of hours for a stupid symbol; remember: check the charset in use when you set a strong password; this time i had the root access and no problems, but guess what if I had set that password for the Root instead?</p>
<p>So, double check the charset and, to do so in the Mysql simply type status from mysql terminal should look like this:</p>
<div class="highlight"><pre><span></span><code><span class="n">Connection</span><span class="o">:</span><span class="w"> </span><span class="n">Localhost</span><span class="w"> </span><span class="n">via</span><span class="w"> </span><span class="n">UNIX</span><span class="w"> </span><span class="n">socket</span>
<span class="n">Server</span><span class="w"> </span><span class="n">characterset</span><span class="o">:</span><span class="w"> </span><span class="n">latin1</span>
<span class="n">Db</span><span class="w"> </span><span class="n">characterset</span><span class="o">:</span><span class="w"> </span><span class="n">latin1</span>
<span class="n">Client</span><span class="w"> </span><span class="n">characterset</span><span class="o">:</span><span class="w"> </span><span class="n">utf8</span>
<span class="n">Conn</span><span class="o">.</span><span class="w"> </span><span class="n">characterset</span><span class="o">:</span><span class="w"> </span><span class="n">utf8</span>
</code></pre></div>
<p>I hope somebody fallen in my situation could find this infos useful, at least to avoid loosing 4 hours to install a MediaWiki site!</p>WR703N costruire porta seriale e installare openwrt2012-10-17T00:00:00+02:002012-10-17T00:00:00+02:00j0llytag:www.j0llyb0x.org,2012-10-17:/2012/wr703n-costruire-porta-seriale-e-installare-openwrt.html<p>Dopo mesi d'assenza ho trovato la forza per ricominciare a scrivere, e questa volta parlerò di come installare openwrt su un WR703N, grazie anche ad una porta seriale.</p>
<p>Da qualche giorno mi è arrivato un simpatico router microscopico della TP-Link: il <a href="http://www.tp-link.com.cn/pages/product-detail.asp?d=225">WR703N</a>.</p>
<p><img alt="WR703N" src="https://www.j0llyb0x.org/images/openwrt-1.jpg"></p>
<p>Questo aggeggio miniaturizzato è più piccolo di una …</p><p>Dopo mesi d'assenza ho trovato la forza per ricominciare a scrivere, e questa volta parlerò di come installare openwrt su un WR703N, grazie anche ad una porta seriale.</p>
<p>Da qualche giorno mi è arrivato un simpatico router microscopico della TP-Link: il <a href="http://www.tp-link.com.cn/pages/product-detail.asp?d=225">WR703N</a>.</p>
<p><img alt="WR703N" src="https://www.j0llyb0x.org/images/openwrt-1.jpg"></p>
<p>Questo aggeggio miniaturizzato è più piccolo di una scatola di caramelle, ma possiede tante qualità tra cui, che ci si può installare Linux e divertirsi un casino!</p>
<p>La prima cosa che ho fatto infatti è stato installare l'ultima release di Openwrt: <a href="http://downloads.openwrt.org/attitude_adjustment/">attitude_adjustment</a>.</p>
<p>Come dal <a href="http://wiki.openwrt.org/toh/tp-link/tl-wr703n">wiki</a>, questo piccolo portento monta 32MB di ram, 4MB nand e un processore atheros da 400Mhz!</p>
<p>Sempre dal wiki, si può vedere che esistono una valanga di progetti correlati:</p>
<ul>
<li>
<p>Dalla semplice aggiunta di una <a href="http://wiki.villagetelco.org/index.php?title=Building_a_Serial_Port_for_TL-WR703N">porta seriale;</a></p>
</li>
<li>
<p>Alla creazione di un <a href="https://forum.openwrt.org/viewtopic.php?id=34188">hub usb</a>;</p>
</li>
<li>
<p>L'utilizzo della porta <a href="https://forum.openwrt.org/viewtopic.php?id=35682">micro-usb anche come seriale</a> O.o (complicato);</p>
</li>
<li>
<p>E il mio referito: il <a href="http://www.minipwner.com/">minipwner</a>!</p>
</li>
</ul>
<p>Insomma, si può tramutare questo piccolo gioiello da <a href="http://www.ebay.it/sch/i.html?LH_AvailTo=101&_nkw=tp-link+tl-wr703n&_trkparms=65%253A12%257C66%253A2%257C39%253A1%257C72%253A6366&rt=nc&_trksid=p3286.c0.m14&_sop=15&_sc=1">20€</a> in un hub di rete mobile che, all'occorrenza, può anche diventare una stazione di Pentest.</p>
<p>Questo è proprio il tipo di progetto da Hacker nel quale mi volevo cimentare. Il mio esperimento, al momento della scrittura di quest'articolo, non è ancora terminato, quindi racconterò fino a dove sono arrivato, dato che di intoppi se ne possono trovare a iosa!</p>
<p>Per prima cosa mi sono sbarazzato del sistema OEM della TP-Link, facendo l'upload di un trunk di Openwrt che ora non è nemmeno disponibile (assimilato nella beta di <a href="http://downloads.openwrt.org/attitude_adjustment/">attitude_adjustment</a>).</p>
<p>Ovviamente come tutti i trunk che si rispettino il boot usciva con errore, lasciando la piccola schedina verde a lampeggiare senza vita. Io non sapevo cosa stesse succedendo, dato che non c'è nessun uscita monitor e non sapevo come avviare in <em>failsafe</em> mode.</p>
<p>Per risolvere mi sono subito dato da fare per munirmi di una connessione seriale e poter vedere da terminale cosa non andava nel mio router. Per prima cosa, mi sono munito di un chip usb-rs232 che si può trovare sempre su ebay a 2/3 €; io ho acquistato <a href="http://www.ebay.it/itm/USB-2-0-to-UART-TTL-6PIN-Connector-Module-Serial-Converter-CP2102-New-/190685792376?pt=LH_DefaultDomain_0&hash=item2c65c24878#ht_3725wt_1275">questo</a>, che è stato letto senza problemi dalla mia Arch come CP210x. Ne esistono una marea, anche per meno di 1€, vedete voi se il chip va bene.</p>
<p>La cosa difficile di saldare sti tre benedetti connettori è che la scheda è talmente piccola che anche la saldatura è in condizioni davvero difficili. La foto mostra i punti dove saldare RX,TX e GND (ricordate di collegare i fili in maniera pari: Dx-Dx Rx-Rx) che sono davvero minuscoli.</p>
<p><img alt="WR703NSerial" src="https://www.j0llyb0x.org/images/openwrt-2.jpg"></p>
<p>Facendo come nell'immagine, si può anche alimentare il wr703n direttamente con la seriale, ma questa è una cosa che non mi interessava ed ho preferito attaccare solamente i tre cavi di connessione principali.</p>
<p>Con la nuova connessione seriale ho potuto vedermi il boot del router, grazie a <a href="http://en.wikipedia.org/wiki/Minicom">minicom</a> settata con questi parametri:</p>
<p><img alt="minicom" src="https://www.j0llyb0x.org/images/openwrt-3.png"></p>
<p>Ed ecco il boot! Ho dimenticato di catturare una schermata, ma il boot si fermava sempre dopo aver tentato di caricare il modulo per usb 2.0 ehci. In realtà ero un pò disperato, non sapendo come comportarmi. La provvidenza è però arrivata: un paio di giorni dopo è arrivatala la <a href="http://downloads.openwrt.org/attitude_adjustment/12.09-beta/ar71xx/generic/">release beta</a> ufficiale che, dopo avr installato, ha risolto tutti i problemi. Fortunatamente infatti, avevo installato la versione con un filesystem ro come lo Squashfs, che permette di mantenere alcune funzionalità anche se si dovesse avere problemi col sistema.</p>
<p>Nel WR703N, per entrare in modalità failsafe, è necessario che U-BOOT si inizializzi; dopo circa un paio di secondi dal caricamento del Kernel Openwrt lascia una finestra di 1 secondo circa per schiacciare la combinazione <em>F</em>+Enter ed entrare in 'modalità sicura'.</p>
<p><img alt="failsafe" src="https://www.j0llyb0x.org/images/openwrt-4.png"></p>
<p>Dalla modalità sicura ho fatto un Telnet a 192.168.1.1 attaccando un cavo ethernet, creato una password di root</p>
<div class="highlight"><pre><span></span><code>passwd
</code></pre></div>
<p>e fatto un scp:</p>
<div class="highlight"><pre><span></span><code><span class="n">scp</span><span class="w"> </span><span class="o">~/</span><span class="n">openwrtfile</span><span class="o">-</span><span class="n">sysupgrade</span><span class="p">.</span><span class="n">bin</span><span class="w"> </span><span class="n">root</span><span class="nv">@openwrt</span><span class="p">.</span><span class="nl">lan</span><span class="p">:</span><span class="o">/</span><span class="n">fileblahblah</span><span class="p">.</span><span class="n">bin</span>
</code></pre></div>
<p>Ho fatto un bel upgrade e tanti saluti. Se doveste incontrare problemi insormontabili (dubito) c'è sempre il vecchio metodo del flash via <a href="http://wiki.openwrt.org/doc/howto/generic.flashing.tftp">tftp</a>: il WR703N ha U-BOOT con un client incorporato; usate quindi la guida generica e poi deviate nella parte con client tftp... Per entrare nel bootloader all'avvio dovete digitare 'tpl'+<em>enter</em> nel mezzo secondo dopo aver dato corrente al router; vi apparirà una schermata come questa, da dove potrete seguire la guida per il flash via bootloader</p>
<p><img alt="u-boot" src="https://www.j0llyb0x.org/images/openwrt-5.png"></p>
<p>Ora che abbiamo Openwrt installato e funzionante.... è ora di riposare perché c'ho messo 4 ore di smadonnate e quindi il SETUP e la futura costruzione del minipowner sarà per i prossimi articoli.</p>
<p>Spero sia stato utile anche perchè non ho trovato molto in lingua italiana riguardo a questo gioiellino e a come fare quello che sto facendo.</p>
<p>Alla fase 2: _SETUP e tuning _di openwrt <a href="http://downloads.openwrt.org/attitude_adjustment/">attitude_adjustment</a>.</p>Fast connection sharing2012-03-29T00:00:00+02:002012-03-29T00:00:00+02:00j0llytag:www.j0llyb0x.org,2012-03-29:/2012/fast-connection-sharing.html<p>recentemente ho avuto la necessità di condividere una connessione 3g con 9 tra pc e mac avendo solamente il mio portatile e una chiavetta umts. Data la mia ignoranza ho dovuto smanettare per un paio di giorni, ma alla fine sono arrivato ad una conclusione decente della quale vorrei rendervi …</p><p>recentemente ho avuto la necessità di condividere una connessione 3g con 9 tra pc e mac avendo solamente il mio portatile e una chiavetta umts. Data la mia ignoranza ho dovuto smanettare per un paio di giorni, ma alla fine sono arrivato ad una conclusione decente della quale vorrei rendervi partecipi. Ovviamente, questo metodo è adattabile per qualsiasi tipo condivisione, sul quale farò una guida un poco più generale. Nella pratica i passaggi che ho seguito sono essenzialmente 3:</p>
<ol>
<li>
<p>connettersi alla linea 3g:</p>
</li>
<li>
<p>preparare la scheda wireless alla condivisione;</p>
</li>
<li>
<p>preparare l'OS a condividere la connessione;</p>
</li>
</ol>
<p>Prima di tutto è necessario connettersi con un'interfaccia ad internet; per far ciò io ho utilizzato una</p>
<p>chiavetta 3g, e con l'ausilio di <a href="http://freecode.com/projects/wvdial">wvdial</a> (<a href="http://www.linuxcommand.org/man_pages/wvdial1.html">qui</a> il README)ho allacciato una connessione ppp0 (point-to-point) al mio provider. Per l'utilizzo di wvdial è necessario settare i parametri specifici per ogni provider; fortunatamente ho trovato <a href="http://www.istitutomajorana.it/index.php?option=com_content&task=view&id=1229&Itemid=69">questa</a> pagina dove si possono trovare le configurazioni per le principali compagnie italiane.</p>
<p>Fatto ciò si può passare alla messa a punto della scheda di rete che servirà a condividere la connessione con altri dispositivi.</p>
<p>La scheda può essere di qualsiasi tipo, anche virtuale, ma nel mio caso avevo necessità di connettere 9 pc in una stanza, quindi ho usato la mia scheda wi-fi.</p>
<p>Per prima cosa bisogna attivare l'interfaccia e assegnare un indirizzo e una maschera di rete; in secondo luogo va messa in ad-hoc mode (sarebbe stato meglio in master mode, ma non tutte le schede lo supportano) e selezionare un <em>essid</em> per la connessione; in fine mettere una protezione: quest'ultimo passo è facoltativo perché l'unica protezione possibile via iwconfig è di tipo wep, tra l'altro non compatibile con tutti i sistemi, infatti io ho optato per una soluzione di filtraggio di indirizzi mac via iptables.</p>
<div class="highlight"><pre><span></span><code>#<span class="w"> </span><span class="nv">Put</span><span class="w"> </span><span class="nv">the</span><span class="w"> </span><span class="nv">interface</span><span class="w"> </span><span class="nv">in</span><span class="w"> </span><span class="nv">Ad</span><span class="o">-</span><span class="nv">hoc</span><span class="w"> </span><span class="nv">mode</span>
<span class="nv">iwconfig</span><span class="w"> </span><span class="nv">wlan0</span><span class="w"> </span><span class="nv">mode</span><span class="w"> </span><span class="nv">Ad</span><span class="o">-</span><span class="nv">Hoc</span>
#<span class="w"> </span><span class="nv">Set</span><span class="w"> </span><span class="nv">the</span><span class="w"> </span><span class="nv">essid</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nv">the</span><span class="w"> </span><span class="nv">access</span><span class="w"> </span><span class="nv">point</span>
<span class="nv">iwconfig</span><span class="w"> </span><span class="nv">wlan0</span><span class="w"> </span><span class="nv">essid</span><span class="w"> </span><span class="s2">"_youressid_"</span>
#<span class="w"> </span><span class="nv">Set</span><span class="w"> </span><span class="nv">auto</span><span class="w"> </span><span class="nv">channel</span>
<span class="nv">iwconfig</span><span class="w"> </span><span class="nv">wlan0</span><span class="w"> </span><span class="nv">channel</span><span class="w"> </span><span class="nv">auto</span>
#<span class="w"> </span><span class="nv">Set</span><span class="w"> </span><span class="nv">the</span><span class="w"> </span><span class="nv">security</span><span class="w"> </span><span class="ss">(</span><span class="nv">WEP</span><span class="ss">)</span>
#<span class="w"> </span><span class="nv">Set</span><span class="w"> </span><span class="nv">Key</span>
<span class="nv">iwconfig</span><span class="w"> </span><span class="nv">wlan0</span><span class="w"> </span><span class="nv">key</span><span class="w"> </span><span class="nv">restricted</span><span class="w"> </span><span class="nv">s</span>:<span class="s2">"_yourpassword_"</span>
#<span class="w"> </span><span class="nv">Set</span><span class="w"> </span><span class="nv">encryption</span>
<span class="nv">iwconfig</span><span class="w"> </span><span class="nv">wlan0</span><span class="w"> </span><span class="nv">key</span><span class="w"> </span><span class="nv">on</span>
<span class="nv">ifconfig</span><span class="w"> </span><span class="nv">wlan0</span><span class="w"> </span><span class="s2">"_chosenip_"</span><span class="o">/</span><span class="mi">24</span><span class="w"> </span><span class="nv">netmask</span><span class="w"> </span><span class="mi">255</span>.<span class="mi">255</span>.<span class="mi">255</span>.<span class="mi">0</span><span class="w"> </span><span class="nv">up</span>
</code></pre></div>
<p>Ovviamente dovete sostituire a wlan0 il nome della vostra interfaccia, e scegliere essid, password e indirizzo ip per l'interfaccia.</p>
<p>Un passaggio opzionale è quello di gestire i clients con un server DHCP, usando dnsmasq:</p>
<div class="highlight"><pre><span></span><code><span class="o">/</span><span class="nx">usr</span><span class="o">/</span><span class="nx">bin</span><span class="o">/</span><span class="nx">dnsmasq</span><span class="w"> </span><span class="o">-</span><span class="nx">C</span><span class="w"> </span><span class="o">/</span><span class="nx">dev</span><span class="o">/</span><span class="nx">null</span><span class="w"> </span>\
<span class="o">--</span><span class="nx">domain</span><span class="o">-</span><span class="nx">needed</span><span class="w"> </span>\
<span class="o">--</span><span class="nx">bogus</span><span class="o">-</span><span class="nx">priv</span><span class="w"> </span>\
<span class="o">--</span><span class="kd">interface</span><span class="p">=</span><span class="nx">wlan0</span><span class="w"> </span>\
<span class="o">--</span><span class="nx">dhcp</span><span class="o">-</span><span class="nx">option</span><span class="p">=</span><span class="mi">6</span><span class="p">,</span><span class="m m-Double">8.8.8.8</span><span class="p">,</span><span class="m m-Double">8.8.4.4</span><span class="w"> </span>\
<span class="o">--</span><span class="nx">listen</span><span class="o">-</span><span class="nx">address</span><span class="p">=</span><span class="s">"_chosenip_"</span><span class="w"> </span>\
<span class="o">--</span><span class="nx">dhcp</span><span class="o">-</span><span class="nx">range</span><span class="p">=</span><span class="s">"_chosenrange_"</span><span class="p">,</span><span class="mi">12</span><span class="nx">h</span>
</code></pre></div>
<p>Potete passare questo codice in uno script ed eseguirlo; da notare che in listen-address è necessario mettere lo stesso indirizzo usato in precedenza, mentre in dhcp-range bisogna semplicemente scegliere il numero e l'intervallo di indirizzi da assegnare tramite dhcp (per esempio 192.168.1.2,192.168.1.254).</p>
<p>Ora che avete una connessione attiva ed un'interfaccia correttamente settata per fare da access point, non vi resta che organizzare l'OS in maniera da condividere la connessione:</p>
<p>per prima cosa bisogna impostare il kernel in maniera da forwardare il traffico con questo comando:</p>
<div class="highlight"><pre><span></span><code> sysctl -w net.ipv4.ip_forward=1
</code></pre></div>
<p>Dove 1 sta per attivo e 0 per inibito. In secondo luogo bisogna utilizzare iptables per forwardare un'interfaccia verso l'altra, e per creare una nat sull'interfaccia connessa ad internet. In questo caso consideriamo ppp0 l'interfaccia connessa ad internet mentre wlan0 quella che farà da access point:</p>
<div class="highlight"><pre><span></span><code>sudo iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
sudo iptables -A FORWARD -i wlan0 -j ACCEPT
</code></pre></div>
<p>per correttezza, qua è segnata una policy ACCEPT all, mentre sarebbe molto meglio, come ho anch'io fatto, impostare una policy per accettare uno ad uno i pc tramite indirizzo mac, e successivamente una policy DROP all per le rimanenti connessioni:</p>
<div class="highlight"><pre><span></span><code><span class="nx">sudo</span><span class="w"> </span><span class="nx">iptables</span><span class="w"> </span><span class="o">-</span><span class="nx">A</span><span class="w"> </span><span class="nx">FORWARD</span><span class="w"> </span><span class="o">-</span><span class="nx">i</span><span class="w"> </span><span class="nx">wlan0</span><span class="w"> </span><span class="o">-</span><span class="nx">m</span><span class="w"> </span><span class="nx">mac</span><span class="w"> </span><span class="o">--</span><span class="nx">mac</span><span class="o">-</span><span class="nx">source</span><span class="w"> </span><span class="s">"_macaddresstoaccept_"</span><span class="w"> </span><span class="o">-</span><span class="nx">j</span><span class="w"> </span><span class="nx">ACCEPT</span>
<span class="nx">sudo</span><span class="w"> </span><span class="nx">iptables</span><span class="w"> </span><span class="o">-</span><span class="nx">A</span><span class="w"> </span><span class="nx">FORWARD</span><span class="w"> </span><span class="o">-</span><span class="nx">i</span><span class="w"> </span><span class="nx">wlan0</span><span class="w"> </span><span class="o">-</span><span class="nx">j</span><span class="w"> </span><span class="nx">DROP</span>
</code></pre></div>
<p>Ricordatevi che è importante inserire prima i filtri agli indirizzi mac, e poi la policy deny, se no iptables bloccherà tutto prima ancora di leggere quali indirizzi accettare.</p>
<p>Sinceramente, ho collezionato un paio di scripts trovati in rete (sfortunatamente non ho recuperato tutte le fonti) e le ho modificate per le mie necessità, quindi vi posto lo script che, tra l'altro, spero di sviluppare per rendere un poco più carino e utile.</p>
<p><a href="http://pastebin.com/AzA4NHYM">Qui</a> il link, (alla riga 61 c'è un riferimento ad impostazioni iptables salvate con anche una lista di mac address) non dimenticate di renderlo eseguibile e di lanciarlo con privilegi di root.</p>
<p>Fatemi sapere se lo trovate utile, e soprattutto se avete qualche suggerimento per migliorarlo.
P.S.</p>
<p>Ammetto che la limitazione di una protezione wep o mac filtering è molto limitante, ma lo script è per uno sharing volante; cercherò di implementare l'uso di protezione wpa, o più semplicemente farò un tutorial per l'uso di <a href="http://hostap.epitest.fi/hostapd/">hostapd</a> che implementa già moltissime <em>features</em>.</p>Downgrade a package in ubuntu [clean way]2012-02-22T10:20:00+01:002012-02-22T10:20:00+01:00j0llytag:www.j0llyb0x.org,2012-02-22:/2012/downgrade-a-package-in-ubuntu-clean-way.html<p>Da ora in avanti sarò terrorizzato dagli update: Semplice update di php-cgi=il server diventa immensamente lento, le pagine php non si aprono più, e con un traffico di 2 persone il server cade!!
Bene, per chi necessitasse come me un metodo rapido per il downgrade su piattaforma Debian, non …</p><p>Da ora in avanti sarò terrorizzato dagli update: Semplice update di php-cgi=il server diventa immensamente lento, le pagine php non si aprono più, e con un traffico di 2 persone il server cade!!
Bene, per chi necessitasse come me un metodo rapido per il downgrade su piattaforma Debian, non c'è niente di più facile:</p>
<div class="highlight"><pre><span></span><code># apt-cache showpkg [pacchetto da downgradare]
</code></pre></div>
<p>Scegliere la versione che più ci aggrada, ed installarla:</p>
<div class="highlight"><pre><span></span><code><span class="err">#</span><span class="w"> </span><span class="n">apt</span><span class="o">-</span><span class="k">get</span><span class="w"> </span><span class="n">install</span><span class="w"> </span><span class="o">[</span><span class="n">package</span><span class="o">]=</span><span class="n">N</span><span class="err">°</span><span class="o">-</span><span class="n">di</span><span class="o">-</span><span class="n">verione</span>
</code></pre></div>
<p>Tutto qui, anche se devo dire che ci ho messo un po per capire che era stato il pacchetto appena installato e non un problema da qualche altra parte nelle configurazioni.</p>[GUIDA] DNS Tunnel with Iodine PARTE II2012-01-15T00:00:00+01:002012-01-15T00:00:00+01:00j0llytag:www.j0llyb0x.org,2012-01-15:/2012/guida-dns-tunnel-with-iodine-parte-ii.html<p>Se non sapete cos'è un DNS o un tunnel, leggetevi <a href="http://j0llyb0x.org/intro-dns-tunnel-con-iodine-01-2012/">l'articolo</a> introduttivo sul DNS tunneling.</p>
<p>Prima di tutto presentiamo Iodine:</p>
<blockquote>
<div class="highlight"><pre><span></span><code>This is a piece of software that lets you tunnel IPv4 data through a DNS
server. This can be usable in different situations where internet access is
firewalled, but DNS …</code></pre></div></blockquote><p>Se non sapete cos'è un DNS o un tunnel, leggetevi <a href="http://j0llyb0x.org/intro-dns-tunnel-con-iodine-01-2012/">l'articolo</a> introduttivo sul DNS tunneling.</p>
<p>Prima di tutto presentiamo Iodine:</p>
<blockquote>
<div class="highlight"><pre><span></span><code>This is a piece of software that lets you tunnel IPv4 data through a DNS
server. This can be usable in different situations where internet access is
firewalled, but DNS queries are allowed.
</code></pre></div>
</blockquote>
<p>Andate nella <a href="http://code.kryo.se/iodine/">homepage</a> e scaricate l'ultima versione, disponibile per praticamente tutti i sistemi operativi!</p>
<p>Se siete su OSX avete un paio di opzioni; o vi installate una macchina virtuale con <a href="https://www.virtualbox.org/">virtualbox</a>, magari <a href="http://www.backtrack-linux.org/">Back|Track</a> così iodine ve lo trovate già dentro, o vi scaricate Xcode dall'apple store e procedete con un semplice "sudo <em>make & make install</em>", oppure vi installate <a href="https://github.com/mxcl/homebrew">homebrew</a> e lo utilizzate da lì. Queste sono le opzioni che ritengo più comode per avere questo programma in OSX.</p>
<p>Tenete conto che il programma è formato da due parti, il client e il server; ovviamente dovete avere un computer con un Iodine server in attesa di una connessione, come ne ho parlato nel post precedente.</p>
<p>I comandi per lanciare il server (Iodined) sono:</p>
<div class="highlight"><pre><span></span><code>iodined 10.0.0.1 x.miodominio.com
</code></pre></div>
<p>L'ip è la maschera che darete alla vostra rete virtuale (o tunnel), mentre il dominio è quello fittizio al quale il server è stato delegato (x.yourdomain.org).</p>
<p>P.S. è necessario possedere i permessi di amministratore per gestire iodine;</p>
<p>P.P.S Sul server (linux) dovrete anche settare l'ip forwarding se volete usare un tunnel ssh direttamente dalla stessa macchina dove gira Iodined; da root digitate:</p>
<div class="highlight"><pre><span></span><code>echo "1" > /sys/proc/net/ipv4/ip_forward
</code></pre></div>
<p>Ora non vi resta che lanciare il client dalla macchina dalla quale volete instaurare il tunnel <em>et voilà</em>, tunnel servito!</p>
<div class="highlight"><pre><span></span><code>sudo iodine ipserveriodined a.miodominio.com
</code></pre></div>
<p>Ora, tutto questo procedimento risulterebbe inutile se la rete fosse patchata, quindi è sempre buona norma darsi conto di che tipo di rete abbiamo di fronte. Le possibilità sono pressappoco tre:</p>
<ol>
<li>
<p>il gateway permette query DNS di ogni tipo e senza restrizioni: non è nemmeno necessario avere un dominio perché è sufficiente dare un nome fittizio da ricercare (es.<em> iodined 10.0.0.1 pinco.pallino</em> e ovviamente lo stesso per il client);</p>
</li>
<li>
<p>il gateway permette query DNS solamente ad alcuni server o solo al server DNS interno: in questo caso bisogna utilizzare il metodo esposto prima, con la particolarità che se il server DNS utilizzabile è solo quello del gateway (99% delle volte è il classico 192.168.1.1) bisognerà impostare quello come indirizzo per il tunnel (es. iodine 192.168.1.1 a.mydomain.com);</p>
</li>
<li>
<p>La terza opzione è che il muro sia solido e ben costruito, e quindi vi attaccate e pagate il provider 5 € per mezz'ora di internet!</p>
</li>
</ol>
<p>Per capire il livello di sicurezza bastano un paio di <em>nslookup</em> o <em>dig</em> come spiegato <a href="http://dev.kryo.se/iodine/wiki/HowtoSetup">qua</a>!</p>
<p>Questo è all'incirca quanto si deve sapere per avere un tunnel sempre pronto a portata di mano. Alcuni accorgimenti da seguire potrebbero essere:</p>
<ul>
<li>
<p>utilizzare la funzione password implementata in Iodine, anche se è una protezione piuttosto blanda;</p>
</li>
<li>
<p>limitare le connessioni al server Iodined;</p>
</li>
<li>
<p>l'accorgimento più importante è comunque utilizzare una connessione ssh per criptare il flusso di dati che, per questo protocollo, resterebbero se no sempre in chiaro!</p>
</li>
</ul>
<p>Quindi, per concludere le operazioni, il comando ssh per instaurare un "tunnel nel tunnel" è:</p>
<div class="highlight"><pre><span></span><code><span class="n">ssh</span><span class="w"> </span><span class="o">-</span><span class="n">fN</span><span class="w"> </span><span class="o">-</span><span class="n">CD</span><span class="w"> </span><span class="n">xxxx</span><span class="w"> </span><span class="n">username</span><span class="mf">@10.0.0.1</span>
</code></pre></div>
<p>I comandi stanno a significare che ssh deve andare in background (-f) anche senza comandi (-N) e deve instaurare una connessione compressa (-C) e fare un bind (-D) sulla porta locale xxxx (scegliete una porta non standard, magari alta come una 64000 o giù di lì).</p>
<p>Ecco fatto, ora settate per bene il proxy sul vostro browser con la porta da voi scelta ed avrete una navigazione criptata e free, provare per credere!</p>
<p>allego schermata:</p>
<p><img alt="settings" src="https://www.j0llyb0x.org/images/iodine2-1.jpg"></p>
<p>o con firerefox</p>
<p><img alt="settings" src="https://www.j0llyb0x.org/images/iodine2-2.jpg"></p>
<p>per chrome la questione è un poco più complicata: dalle impostazioni proxy, venite reindirizzati alle preferenze generali di connessione del vostro sistema operativo e se cambiate il proxy questo vale per qualsiasi connessione e non solo per il browser; per questo, con chrome, vi consiglio un'estensione semplice semplice che vi permette di gestire il proxy solo per la navigazione: <a href="https://chrome.google.com/webstore/detail/caehdcpeofiiigpdhbabniblemipncjj">proxy switchy</a> vi permette di aggiungere il vostro bel socks proxy.</p>
<p><img alt="switchy" src="https://www.j0llyb0x.org/images/iodine2-3.png"></p>
<p>Molto bene, ore siete pronti per navigare in tranquillità!</p>
<p>fonti:</p>
<blockquote>
<p><a href="http://bottiger.org/wrote/29-Tunneling-traffic-through-DNS-using-Iodine-for-fun-and-profit">bottiger.org</a></p>
<p><a href="http://otacon22.wordpress.com/2011/02/05/dns-tunneling/">octacon22</a></p>
<p><a href="http://sadevil.org/blog/2008/07/07/iodine-dns-tunnel-on-your-mac-to-escape-those-evil-firewalls/">sadevil</a></p>
<p><a href="http://dev.kryo.se/iodine/wiki/HowtoSetup">kryo.se</a></p>
</blockquote>[GUIDA] DNS Tunnel con Iodine PARTE I2012-01-05T00:00:00+01:002012-01-05T00:00:00+01:00j0llytag:www.j0llyb0x.org,2012-01-05:/2012/guida-dns-tunnel-con-iodine-parte-i.html<p>Per chi non lo sapesse, un tunnel DNS è una maniera per trasportare dati derivanti da altri protocolli attraverso la porta 53 UDP, cioè poter far passare qualsiasi connessione (ad esempio ssh od http) attraverso una porta non convenzionale cioè..... un bel proxy tunnel che bypassa qualsiasi restrizione sulla porta …</p><p>Per chi non lo sapesse, un tunnel DNS è una maniera per trasportare dati derivanti da altri protocolli attraverso la porta 53 UDP, cioè poter far passare qualsiasi connessione (ad esempio ssh od http) attraverso una porta non convenzionale cioè..... un bel proxy tunnel che bypassa qualsiasi restrizione sulla porta 80/433 (un hotspot per intenderci).</p>
<p>Per le note legali, ricordo di leggere il <a href="http://j0llyb0x.org/disclaimer/">disclamer</a> del blog</p>
<p>Alt, un passo indietro: cosa è un DNS?</p>
<p>Il Domain Name System è il sistema mondiale, attivo dal 1987, per identificare gli IP delle macchine tramite nomi a dominio, molto più leggibili e memorizzabili dalla mente umana.</p>
<p>Ammetto che l'argomento non è nuovo; in realtà già nel 2000 se ne parlava in alcuni ambienti e nel 2005 Dan Kaminsky aveva già realizzato un programma in perl per l'implementazione del protocollo utilizzato per questo tipo di tunnel, il "NSTX" (Name Server Transfer Protocol) chiamato OzymanDNS.</p>
<p>Il programma che utilizzo e del quale parlerò è <a href="http://code.kryo.se/iodine/">Iodin</a><a href="http://code.kryo.se/iodine/">e</a>, già inserito in molte distro di pentest come <a href="http://www.backtrack-linux.org/backtrack/backtrack-5-release/">BackTrack</a> e soprattutto nella maggioranza dei repository di qualsiasi distro con una community minimamente attiva. Il programma è utilizzabile su praticamente qualsiasi piattaforma (io l'ho provato su Linux, OSX e Windows) e, dai post letti qua e là per il web è ad oggi l'implementazione del protocollo NSTX che riesce a garantire più stabilità e prestazioni rispetto ad altre <a href="http://en.cship.org/wiki/DNS_tunnel">alternative</a>.</p>
<p>Ma come funziona Il DNS è perché dovremmo parlarne in questo ambito?</p>
<p>Allora, il Domain Name System è il più grande database distribuito del pianeta che serve; la sua funzione è principalmente di associare a ciascun ip fisico un nome di dominio che serva ad identificarlo e memorizzarlo più facilmente per l'essere umano. queste richieste possono essere fatte da programmi o da altri server DNS; questo perché, come detto prima, il sistema è formato in maniera distribuita e gerarchica dove esistono 13 Root server che si occupano dei domini di 1° livello (<em>.org, </em>.com, *.net etc.) e demandano ad altri server la risoluzione dei domini di 2°, 3° livello e così via.</p>
<p><img alt="dns" src="https://www.j0llyb0x.org/images/iodine-1.png"></p>
<p>La domanda sorge spontanea: e cosa ce ne facciamo di sta roba?</p>
<p>Semplice, con un pò di settaggi potremo avere il nostro tunnel personale, poco controllato e perfettamente criptato, per navigare in tutta sicurezza in giro per il globo.</p>
<p>Forse sono stato un po ottimista, ma ad oggi (più di 11 anni dalla scoperta) sono poche le compagnie che controllano questo tipo di cose.</p>
<p>La parte più difficile da settare per questo tipo di tunnel è proprio il nameserver e i records del dominio, quindi cominceremo proprio da qua!</p>
<p>Nel mio caso ho acquistato un dominio su Godaddy per 6$ l'anno (assicuratevi che il vostro registrar vi dia il controllo sui record DNS del vostro dominio o andate <a href="https://web.gratisdns.dk/">qua</a> per farveli hostare) ed ho semplicemente aggiunto un subdominio (ns.miodominio.com) con un A record, ed l'ho assegnato come nameserver per un subdominio fittizio (x.miodominio.com); in questo modo, in qualsiasi parte del mondo io sia, se faccio una quary per il subdominio fittizio (x.miodominio.com), i vari server DNS finiranno per chiedere al mio subdominio (ns.miodominio.com) dove esso sia!</p>
<p><img alt="screen" src="https://www.j0llyb0x.org/images/iodine-2.png"></p>
<p><img alt="screen" src="https://www.j0llyb0x.org/images/iodine-3.png"></p>
<p>ovviamente al posto di <em>yourip</em> ci sarà il vostro ip statico (magari comprato tramite un <a href="http://www.lowendbox.com/">vps economico</a>).</p>
<p>Ora che avete settato questi parametri non vi resta che attendere, perché per delegare ns.miodominio.com come nameserver per x.miodominio.com esso deve essere "propagato" verso i DNS server superiori e ci potrebbe volere fino ad 1 giorno o 2, anche se in genere il processo viene eseguito in meno di un'ora.</p>
<p>Bene, questa era la parte più complicata e che mi è costata un poco intendere al principio, ma ora che siamo pronti potremo utilizzare vari metodi per sfruttare questo tunnel.</p>
<p>PS</p>
<p>Se state cercando di hostare il vostro fake DNS server su un router o su qualsiasi sistema con IP dinamico, potete saltare la parte del record A e settare come NS record il vostro dominio <a href="http://www.no-ip.com/">no-ip</a> o <a href="http://dyn.com/dns/dyndns-free/">dyndns</a> che punta al benedetto server.</p>
<p><img alt="screen" src="https://www.j0llyb0x.org/images/iodine-4.png"></p>
<p>Della parte tecnica rispetto a Iodine ne parlerò nel prossimo articolo perché questo mi sembra già abbastanza denso e lunghetto...</p>
<p>fonti:</p>
<blockquote>
<p><a href="http://www.h-i-r.net/2010/03/dns-tunneling-part-1-intro-and.html">hir.net</a></p>
<p><a href="http://dnstunnel.de/">dnstunnel</a></p>
<p><a href="http://www.slideshare.net/bsideslondon/dns-tunnelling-its-all-in-the-name">slideshare</a></p>
<p><a href="http://bottiger.org/wrote/29-Tunneling-traffic-through-DNS-using-Iodine-for-fun-and-profit">bottiger</a></p>
</blockquote>Disable WordPress buggy plugins2011-12-27T00:00:00+01:002011-12-27T00:00:00+01:00j0llytag:www.j0llyb0x.org,2011-12-27:/2011/disable-wordpress-buggy-plugins.html<p>Ieri mentre cercavo di scrivere il mio primo post ho attivato un plugin non compatibile con il tema; il risultato è stato una schermata bianca che mi impedisce di disattivare il plugin galeotto!</p>
<p>La prima cosa che si dovrebbe fare è rinominare la cartella dei plugins all'interno di WordPress; in …</p><p>Ieri mentre cercavo di scrivere il mio primo post ho attivato un plugin non compatibile con il tema; il risultato è stato una schermata bianca che mi impedisce di disattivare il plugin galeotto!</p>
<p>La prima cosa che si dovrebbe fare è rinominare la cartella dei plugins all'interno di WordPress; in questo modo tutti i plugins saranno disattivati.</p>
<p>Se però la vostra situazione è un pò più complicata, o non avete un servizio ftp/ssh attivo, potete disabilitare i plugins direttamente con una query al database di Wordpress; dopo qualche minuto di ricerca infatti ho trovato <a href="http://perishablepress.com/press/2008/02/18/quickly-disable-or-enable-all-wordpress-plugins-via-the-database/">questa</a> pagina nella quale spiega come fare.</p>
<p>Per chi non mastica l'inglese (O.o) o non sa cos'è <a href="http://translate.googleusercontent.com/translate_c?hl=it&ie=UTF8&prev=_t&rurl=translate.google.com&sl=en&tl=it&u=http://perishablepress.com/press/2008/02/18/quickly-disable-or-enable-all-wordpress-plugins-via-the-database/&usg=ALkJrhgOisBtO965xi0uML6RZYnNn0VtZA">google translate</a>e (o.O) riassumo in due righe:</p>
<p>Entrando in PhpMyAdmin bisogna fare questa query (tasto query del menu superiore dopo aver selezionato il database corretto) nel database di WordPress:</p>
<div class="highlight"><pre><span></span><code><span class="nt">UPDATE</span><span class="w"> </span><span class="nt">wp_options</span><span class="w"> </span><span class="nt">SET</span><span class="w"> </span><span class="nt">option_value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'a:0:{}'</span><span class="w"> </span><span class="nt">WHERE</span><span class="w"> </span><span class="nt">option_name</span><span class="w"> </span><span class="o">=</span><span class="s1">'active_plugins'</span><span class="o">;</span>
</code></pre></div>
<p>Tutto qui, La vostra dashboard sarà di nuovo operativa e potrete riattivare i plugins da essa, eliminando o editando il plugin non compatibile.</p>
<p>Qualcuno potrà dire: "Io non ho phpMyAdmin, come cazzo faccio a fare la query??"</p>
<p>Bene, niente di più facile, basta andare in shell e connettersi al database:</p>
<div class="highlight"><pre><span></span><code><span class="nv">mysql</span><span class="w"> </span><span class="o">-</span><span class="nv">u</span><span class="w"> </span><span class="nv">tuoutente</span><span class="w"> </span><span class="o">-</span><span class="nv">p</span><span class="w"> </span><span class="nv">tuapassword</span>
<span class="k">show</span><span class="w"> </span><span class="nv">databases</span><span class="c1">;</span>
<span class="nv">use</span><span class="w"> </span><span class="nv">tuodatabase</span>
<span class="nv">SELECT</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="nv">FROM</span><span class="w"> </span><span class="nv">wp_options</span><span class="w"> </span><span class="nv">WHERE</span><span class="w"> </span><span class="nv">options_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'active_plugins'</span><span class="c1">;</span>
<span class="nv">UPDATE</span><span class="w"> </span><span class="nv">wp_options</span><span class="w"> </span><span class="nv">SET</span><span class="w"> </span><span class="nv">options_value</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'a:0:{}'</span><span class="w"> </span><span class="nv">WHERE</span><span class="w"> </span><span class="nv">options_name</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'active_plugins'</span>
</code></pre></div>
<p>Personalmente preferisco il secondo metodo, più diretto ed elegante, a mio parere.</p>