Archive for the Category ◊ Tech Stuff ◊

[CCIELab] Output manipulation in Cisco IOS
Thursday, March 25th, 2010 | Author: AlexJ

[Originally posted on ccielab.ro]

One of the things that make Command Line Interfaces, like Bash, very efficient for administration is the output manipulation with piping and redirecting. Cisco IOS has most of the Bash equivalent modifiers, and administrators that know how to work with them can do things much more faster… this can make the difference in a lab exam or in the real world. Most show commands support this features and depending on the IOS, you have more or less features.

The usual “show run” command prints a large output, from which you need only a few lines. You can only scroll down with space and enter (the the Linux more command). If you are searching for a keyword in the running config, you can go to the line that contains the string using the slash key, like in vim or more or less in Linux. So, “/KEYWORD” after running the show command, while scrolling, will take you to the wanted line.

If you want from the output just some lines, you can filter them, just like piping the output to grep in Linux. You can use the ” | ” after the show command to see how you can filter (be careful, there is a space before and after the |). To print just the lines that have a keywork, use “ | include KEYWORD“, and to print all lines except the ones what have the keyword, use “ | exclude KEYWORD“. If you want to print out all output starting with a line that contains a keyword until the end of the lines, use “ | begin KEYWORD“.

Taking advantage of the hierarchical structure of the running config, you can print out just a section of the output. For example, “show run | section   router ospf 1” will list the configuration for the OSPF process 1 and “show run | section interface Serial0/0” will print the configuration for the specified interface. Be careful, this is case sensitive and you need to mach the case of the line in the running config (“Serial 0/0″ will work, “serial 0/0″ won’t).

Redirection into a file is also possible. “show run | redirect flash:run” will put the contents of the running config into a file called ‘run’ in flash memory. This is similar to the “>” operand in Bash. Using redirect, the content of the target file will be replaced. You can append to the file (like “>>” in Bash) with “ | append FILE“.  “ | tee FILE” works like redirect, but it also prints the output to the screen.

Regular expressions are also supported. If you like to print from the routing table, the routes received from RIP, you can filter with “show ip route | include R” and the routes from EIGRP with  “show ip route | include D”. But you can do this in one line, filtering with both conditions, with “show ip route | include [RD]“.

Slightly off topic, but good to know, is how to stop output. For example, traceroute to an unreachable location, will try 30 hops before it stops, and this might take a long time. To break the action hit the key combination “Ctrl+Shift+6“.

Academy War Games. ROSEdu Tech Talks
Saturday, October 10th, 2009 | Author: AlexJ

Astăzi, 10 octombrie, au avut loc două evinimente în facultate. La ora 14 a fost prima prezentare din cadru ROSEdu Tech Talks. Prezentarea a fost ținută de Răzvan Deaconescu, care a prezentat Preprocesorul C. La acestă primă sesiune au participat apoximativ 20 de studenți. Prezentarea este publicată pe pagina proiectului [1] și înregistrarea video urmează să fie încărcată. Următoarea sesiune va avea loc pe 20 octombrie.

În acest timp, echipa Academiei Cisco UPB [2] împreună cu echipa Academiei Microsoft [3] lucrau la amenjarea holului EC pentru Academy War Games [4]. LAN Party-ul a început la ora 18:00 și durează toată noaptea. Mare parte din echipa de organizare a evenimentului vine după două ediții de LAN Strike (oranizate de SRAITS), lucru ce au făcut aceast lan party unul mult mai bine organizat. La eveniment, a venit CEO-ul Microsoft România, Călin Tatomir, ce a stat și a jucat împreună cu studenții.

[1] http://talks.rosedu.org/prezentari

[2] http://ccna.ro

[3] http://itacad.ro

[4] http://awg.cs.pub.ro

Juniper Certified Associate in Enterprise Routing
Monday, September 28th, 2009 | Author: AlexJ

Am reușit vineri să iau examenul JN0-342, ceea e mă face un Juniper Networks Certified Internet Associate in Enterprise Routing. Deci concluzia experimentului [1], este că se poate trece un examen de certificare de nivel entry level fără să ai experiență practică cu echipamentele firmei respective, lucru care este destul de trist pentru că înseamnă că a scăzut calitatea (greutatea) examenelor. Dar, aparent scopul firmelor, fie ele Cisco sau Juniper, este de a avea cât mai mulți oameni certificați ca Associate. Odată ce îi au în lista lor de potențiali profesioniști, îi atrag spre un loc mai înalt în piramida lor de certificări.

cert_inet_asct_graphic_rgb

Am publicat pe Scribd notițele mele pentru examen [2], poate sunt de folos celor ce doresc să obțină acestă certificare. Acestea au fost luate după cursul la distanță ce face parte din Juniper Summer School [3]

[1] http://alexj.info?p=1013

[2] http://www.scribd.com/doc/20162185/Juniper-Summer-School-Routing-Notes-August-2009

[1] http://alexj.info?p=966

IPv6 Part III: Linux Routing
Friday, August 21st, 2009 | Author: AlexJ

[Part I]
[Part II]

Clientul este un Linux box. Legătura la Internet este prin eth1, interfață peste care se face tunelul 6to4.

După ce am creat tunelul, am aflat că pot cere o clasă de IPv6 să fie routată prin IP-ul meu v6. Astfel, mi-a fost alocată rețeaua 2001:470:9f00::/48 ( 1208925819614629174706178 adrese adică adică aproximativ 1 milion de miliarde de miliarde de adese), pe care am început să o subnetez.

Prima rețea am alocat-o rețelei de pe eth1 (uplink-ul la Internet, precum și legătura cu alte servere locale). Pentru ușurință în denumire, am ales rețeaua 2001:0470:9f00:0141:0085:0037:0208::/112, adresă obținută prin o concatenare (la nivel de notație) a adresei IPv6 /48 alocate cu adresa IPv4/24 (141.85.37.208). Atenție, valorite în binar sunt total diferite, pentru că adresa IPv6 conține cifre în hexadecimal și IPv4 în decimal.

Configurație prin /etc/network/intefaces:

iface eth1 inet6 static
address 2001:0470:9f00:0141:0085:0037:208:1
netmask 112

Routarea IPv6 nu este implicit activată, și pachetele nu vor trece dintr-o rețea în cealaltă. Pentru aceasta, trebuie modificat fișierul /etc/sysctl.conf și decomentată (sau adăugată) linia:
net.ipv6.conf.all.forwarding=1
urmată de un restart a sysctl
sysctl -p

În continuare am alocat o altă rețea /112 pentru tunelul VPN peste care am o rețea IPv4 172.30.0.0/24 în spatele unui NAT. Partea frumoasă aici este că la IPv6 nu mai este nevoie de NAT pentru că sunt adrese routabile IPv6, deci traficul IPv4 va fi translatat la router în spatele unei singure adrese iar cel IPv6 va fi routat normal spre Internet. Rezultatul final a fost conectivitate IPv6 pe două sisteme care se află în cu totul altă rețea decât cea unde există tuneul 6to4, rețea ce se află in spatele unui NAT. Pentru a ajunge la un server IPv6 extern, aceste stații trebuiat să treacă peste printr-un tunel 6to4 aflat peste o conexiune VPN(OpenVPN) până la server unde era routat în altă rețea IPv6 care trecea peste un alt tunel 6to4 și routat mai departe doar prin IPv6.

IPv6 Part II: Linux Configuration
Friday, August 21st, 2009 | Author: AlexJ

[Part I]

De la provider-ul tunelului [1] am primit următoarele:

Server IPv4 address:      216.66.80.30
Server IPv6 address:     2001:470:1f0a:68d::1/64
Client IPv4 address:     141.85.37.208
Client IPv6 address:     2001:470:1f0a:68d::2/64

Între cele două adrese IPv4 este creat un tunel ce are alocată rețeaua IPv6 2001:470:1f0a:68d::/64 ( deci aproximativ 18 milidarde de miliarde de adrese pierdute pentru 2 adrese…dar nu e problemă pentru că sunt destule ).
Configurarea tunelului poate fi făcută în mai multe feluri.

Temporară prin ifconfig/route

ifconfig sit0 up
ifconfig sit0 inet6 tunnel ::216.66.80.30
ifconfig sit1 up
ifconfig sit1 inet6 add 2001:470:1f0a:68d::2/64
route -A inet6 add ::/0 dev sit1

Temporară prin iproute2

modprobe ipv6
ip tunnel add he-ipv6 mode sit remote 216.66.80.30 local 141.85.37.208 ttl 255
ip link set he-ipv6 up
ip addr add 2001:470:1f0a:68d::2/64 dev he-ipv6
ip route add ::/0 dev he-ipv6
ip -f inet6 addr

Permanentă (on boot) prin /etc/network/interfaces
iface he-ipv6 inet6 v4tunnel
endpoint 216.66.80.30
address  2001:470:1f0a:68d::2
netmask  64
mtu 1480
up ip -6 route add 2000::/3 dev he-ipv6
down ip -6 route del 2000::/3 dev he-ipv6

[1] http://www.tunnelbroker.net/

IPv6 Part I: TunnelBroker & IPv6 Certification
Thursday, August 20th, 2009 | Author: AlexJ

Deși mai configurasem o adresăIPv6 și cu alte ocazii [1], nu intrasem adânc în subiect decât la clasa de BSCI de la Cisco pe care am terminat-o recent. După clasă, pentru că mi-a plăcut subiectul, am încercat să văd IPv6 în viața reală, ceea ce era puțin problematic pentru că legăturile mele la Internet vin numai în varianta IPv4.

Dar am descoperit un site interesant, TunnelBroker [2], care oferă tunele IPv6 peste conexiuni IPv4, gratuit. Provider-ul respectiv are o rețea globală de servere accesibile prin IPv4, dar care routează IPv6 în Internet. Tot ce e nevoie este un server propriu sau un workstation care să aibă un IP public (acesta va fi clientul). Configurația tunelului se face într-o parte automat, pe site și cealaltă parte pe stația locală manual. Instrucțiunile complete se găsesc pe site.

ipv6_ping

Aceeași firmă ce administrează site-ul TunnelBroker și rețeaua de servere, Hurricane Electric, oferă și o certificare [3] de atestare a cunoștințelor despre IPv6. De exemplu, primul test constă într-un quiz despre IPv6 iar al doilea presupune configurarea unui client care să fie capabil să acceseze o pagină IPv6.

IPv6 Certification Badge for AlexJ

Fun fact: Există un ‘experiment’ pentru a promova IPv6 [4], dar care, momentan, pare a fi mort.

[1] http://alexj.info/?p=92

[2] http://www.tunnelbroker.net/

[3] http://ipv6.he.net/certification/cert-main.php

[4] http://ubergeek.ro/2008/08/22/ipv6-experiment/

Security boost in Wireless with VPN
Sunday, June 28th, 2009 | Author: AlexJ

Când ai un laptop, ești foarte fericit când găsești o conexiune Wireless pentru a te conecta la Internet. Problema este că, de obicei, rețele publice sunt Open, adică nu au nici o securitate în transferul de date. Majoritatea software-ului  nu trimite encriptate datele și este foarte ușor ca cineva să captureze parole sau conversații.

O soluție ar fi VPN, Virtual Private Network. Nu este o soluție implementabilă de oricine, pentru că necesită un server conectat la Internet cu un IP public. Pe serverul respectiv trebuie instalat un daemon cum este OpenVPN [1]. De asemenea, pe fiecare calculator ce va folosi rețeaua VPN va fi necesară instalarea clientului OpenVPN. Pentru fiecare client, se va genera o pereche de chei publică-privată pentru a se asigura că restricționarea accesului la serviciul de VPN.

Un tutorial despre cum se poate crea o rețea VPN se găsește pe site-ul OpenVPN [2]. O versiune mai scurtă și mai practică pe Big Lazy Sysadmin [3].

După crearea rețelei, pe serverul VPN trebuie activată rutarea rețelei private în cea de Internet (cel mai probabil prin NAT). Aici intervine problema unei soluții VPN: tot traficul trece prin serverul respectiv, ceea ce înseamnă că viteza maximă atinsă pe un client este  jumătate din viteza serverului (pentru că traficul trebuie să circule în două direcții). Dar pentru persoanele ce țin la securitate, prețul merită.

[1] http://openvpn.net/

[2] http://openvpn.net/howto.html

[3] http://big.lazyadmin.ro/2007/04/27/openvpn-gateway-tutorial/

Diacritice(UTF-8) & JDBC/mySQL/HTML
Tuesday, June 16th, 2009 | Author: AlexJ

Ce am dorit să fac: un program în Java ce capturează conversații de pe IRC și le stochează într-o bază de date mySQL; din acea bază de date se ia prin PHP și se afișează pe o pagină HTML. Deși pare destul de mult de făcut, necesită puțin cod, dar multă atenție la interconectarea elementlor: programul Java, conectorul dintre Java-mySQL (JDBC), baza de date mySQL și script-ul PHP.

Am creat ‘topologoia’ necesară și programul mergea ok. Dar am descoperit rapid o problemă: pagina web (HTML+PHP) nu afișa diacritice. Și am început să caut prin fiecare element să văd unde era problema ( oricare din componente putea să ducă la problema aceasta).

Am început prin modificarea paginii PHP/HTML și forțarea ca browserul să citeacă caracterele în format UTF-8. Codul nu depinde de PHP (am presupus că el transmite corect din baza de date în HTML) ci de headerul HTML.

<head>  <meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />   [...]  </head>

Al doilea test a fost făcut pe mySQL. Implicit, baza de date codează folosind Latin.  Și tabela unde se făcea scrierea trebuia trecută pe UTF.

CREATE TABLE `chats` ( [..] ) DEFAULT CHARSET=utf8;

Cum programul Java imprima corect la stdout diacriticile, problema trebuia să fie la JDBC. Suportul pentru UTF a fost adăugat în JDBC, dar trebuia specificat la conectarea cu baza de date. Acest lucru se face pasând un parametru la  URL-ul bazei de date.

jdbc:mysql://my_server/my_data_base?unicode=true&characterEncoding=utf-8

Cisco VoIP quick HOWTO
Thursday, March 19th, 2009 | Author: AlexJ

Una din direcţiile majore de dezvoltare a Cisco este Voice over IP. Cisco oferă un număr mare de echipamente, software şi soluţii pentru VoIP.

Soluţiile VoIP se conectrează în jurul a Cisco Call Manager care este un Call Agent. Este un software ce face administrarea reţelei de VoIP. Acest software vine în două variante: Cisco Call Manager (sau după noua denumire dată de Cisco Unified Communications Manager… este acelaşi lucru) ce este un software ce rulează pe un server x386 peste MS Windows sau Call Manager Express (CME sau Cisco Unified Communications Manager Express) ce este un pachet ce rulează pe un router Cisco peste IOS. Ambele oferă aceleaşi facilităţi de bază. Imaginile de IOS ce vin cu CME au, de obicei, ‘voice’ în nume.

CME este compatibil cu o suită întreagă de protocoale VoIP printre care SIP, H323 şi SCCP. SSCP ( sau Skinny) este protocolul proprietar Cisco şi este suportat de majoritatea echipamentelor Cisco de Voce.

Clienţii pentru Call Manager sunt de obicei Telefoane IP ( ex 7960, 7906G )sau Cisco IP Communicator care este un program pentru Windows ce simulează un telefon (mai este cunoscut şi ca Softphone).

Call Manager Express oferă un wizard pentru configurarea telfoniei IP prin comanda “telephony-service setup”.

Iată o configurare simplă ( liniile notate cu * sunt explicaţii)

Router>enable

Router#configure terminal

Router(config)#interface f0/0

Router(config-if)#ip address 10.0.0.254 255.0.0.0

Router(config-if)#no shutdown

Router(config-if)#exit

Router(config)#telephony-service setup

Do you want to setup DHCP service for your IP Phones? [yes/no]: yes

*Activează un pool DHCP pentru telefoane

IP network for telephony-service DHCP Pool:10.0.0.0

Subnet mask for DHCP network :255.0.0.0

TFTP Server IP address (Option 150) : 150

* Prin Opţiunea 150 de la DHCP (netransmisă implicit), telefonul IP va ştii adresa serveului TFTP

TFTP Server IP address (Option 150) :10.0.0.254

Default Router for DHCP Pool :10.0.0.254

Do you want to start telephony-service setup? [yes/no]: yes

Enter the IP source address for Cisco IOS Telephony Services :10.0.0.254

Enter the Skinny Port for Cisco IOS Telephony Services : [2000]:

How many IP phones do you want to configure : [0]: 2

*Numărul de telefoane ce se vor conecta la CME

Do you want dual-line extensions assigned to phones? [yes/no]: yes

What Language do you want on IP phones : 0

Which Call Progress tone set do you want on IP phones : 0

What is the first extension number you want to configure : 100

*Numărul de telefon primit pe prima linie a primului telefon ce se înregistrează la CME

Do you have Direct-Inward-Dial service for all your phones? [yes/no]: no

Do you want to forward calls to a voice message service? [yes/no]: no

Do you wish to change any of the above information? [yes/no]: no

Acest setup va crea in running-config setările necesare pentru VoIP.

Se observă că adresa 10.0.0.254 a fost completată de 3 ori (ca Default Gateway, TFTP server şi IOS Telephony Services). Nu este obigatoriu ca aceste adrese să coincidă, pentru că nu este obligatoriu ca routerul respectiv să indeplinească toate rourile acestea. Default Gateway este routerul setat pe telefonul IP pentru a ieşi din reţeaua locală (serverul SCCP sau TFTP poate să fie în alt broadcast domain). Serverul TFTP oferă telefonului setările sale sub forma unui fişier XML (în acest fişier se va afla adresa/protul serverului SCCP). IOS Telephony Services este serverul cu CME ce are pornit serverul SCCP şi care va procesa semnalele de telefonie.

[1] http://alex.clubcisco.ro?p=104

OpenVZ Full HOWTO – Part I: Basic Install
Saturday, February 14th, 2009 | Author: AlexJ

Am mai discutat despre OpenVZ [1] iar în continuare voi prezenta un deployment simplu.

Pornim de la o maşină VMware (în cazut unei instalări reale, în locul mașinii VMware am avea o stație fizică) în care avem instalat un Debian Lenny (basic install). Acesta va fi serverul OpenVZ cu numele de hostname Cronus. Instalăm pe el un server OpenSSH pentru a uşura controlul maşinii. Măsina este conectată la maşina fizică prin interfaţa eth0, care este şi conexiunea la Internet (prin NAT). Paşii de instalare OpenVZ ar fi:

Adăugare Repository

cronus:~# echo  “deb http://download.openvz.org/debian-systs etch openvz” >> /etc/apt/sources.list

cronus:~# wget -q http://download.openvz.org/debian-systs/dso_archiv_signing_key.asc -O- | apt-key add – && apt-get update

Instalat Kernel (varianta pentru mai puţin de 4GB de RAM)

cronus:~# apt-get install fzakernel-2.6.18-686

cronus:~# vim /boot/grub/menu.lst   [kernelul fza trebuie pus ca default]

cronus:~# reboot

Instalare utilitare de control şi template-ul de container Debian

cronus:~# apt-get install vzctl vzquota
cronus:~# apt-get install linux-image-openvz-686
cronus:~# apt-get install vzctl-ostmpl-debian-5.0-i386-minimal

Creere containere (3 maşini)
cronus:~# vzctl create 10 --ostemplate debian-5.0-i386-minimal
cronus:~# vzctl create 20 --ostemplate debian-5.0-i386-minimal
cronus:~# vzctl create 30 --ostemplate debian-5.0-i386-minimal

Pornire maşini
cronus:~# vzctl start 10
cronus:~# vzctl start 20
cronus:~# vzctl start 30

Setare hostname-uri
cronus:~# vzctl enter 10
root@localhost:/# echo "zeus">/etc/hostname
root@localhost:/# exit
cronus:~# vzctl enter 20
root@localhost:/# echo "poseidon">/etc/hostname
root@localhost:/# exit
cronus:~# vzctl enter 30
root@localhost:/# echo "hades">/etc/hostname
root@localhost:/# exit

Un restart la maşini (pentru hostname)
cronus:~# vzctl restart 10
cronus:~# vzctl restart 20
cronus:~# vzctl restart 30

Testare (comandă la distanţă)
cronus:~# uname -a
Linux cronus 2.6.18-14-fza-686 #1 SMP Thu Jan 1 16:03:36 UTC 2009 i686 GNU/Linux
cronus:~# vzctl exec 10 uname -a
Linux zeus 2.6.18-14-fza-686 #1 SMP Thu Jan 1 16:03:36 UTC 2009 i686 GNU/Linux
cronus:~# vzctl exec 20 uname -a
Linux poseidon 2.6.18-14-fza-686 #1 SMP Thu Jan 1 16:03:36 UTC 2009 i686 GNU/Linux
cronus:~# vzctl exec 30 uname -a
Linux hades 2.6.18-14-fza-686 #1 SMP Thu Jan 1 16:03:36 UTC 2009 i686 GNU/Linux

Tips & triks: Alias la comenzi
cronus:~# echo "alias zeus='vzctl enter 10'">>~/.bashrc
cronus:~# echo "alias poseidon='vzctl enter 20'">>~/.bashrc
cronus:~# echo "alias hades='vzctl enter 30'">>~/.bashrc
cronus:~# source ~/.bashrc
Rezultat:
cronus:~# zeus
entered into CT 10
root@zeus:/#

Paginile de documentaţie folosite au fost [2] şi [3].

[1] http://alexj.info/?p=464

[2] http://wiki.openvz.org/Installation_on_Debian

[3] http://wiki.openvz.org/Basic_operations_in_OpenVZ_environment