Własny looking glass

Looking glass (LG) to jedno z podstawowych narzędzi diagnostycznych w BGP. Najczęściej korzystamy z LG u swoich peerów, ale równie pomocne może być takie narzędzie we własnej sieci.

Looking glass to wygodniejsza diagnostyka własnej sieci. Nie musimy się logować na routery by wykonać podstawową diagnostykę. Jest to też wygodne jeżeli chcemy dać narzędzia diagnostyczne swoim pracownikom, ale niekoniecznie chcemy ich wpuszczać do routerów. Poniżej dwa znane mi LG działające z routerami różnych producentów.

Pierwsza propozycja znajduje tutaj: https://github.com/hsdn/lg
Jak widać obsługuje nie tylko Cisco, Quaggę ale również Mikrotika, Junipera oraz Huawei. Instalacja jest bardzo prosta. Należy zainstalować wymagane pakiety
i skopiować zawartość archiwum do katalogu na naszym serwerze www. Cała konfiguracja znajduje się w pliku lg_config.php który musimy dostosować do naszych potrzeb. Przykład mojego pliku dla routerów Cisco ASR1001-X.

<?php isset($_CONFIG) or die('No direct access allowed.');

// ------------------------------------------------------------------------
// LOOKING GLASS CONFIGURATIONS
// ------------------------------------------------------------------------

/*
 * Your own AS number
 */
$_CONFIG['asn'] = '65666';

/*
 * Your own company name
 */
$_CONFIG['company'] = 'NETMON';

/*
 * Your logo URL (or FALSE)
 */
$_CONFIG['logo'] = 'logo_4a.png';

/*
 * Main style color
 */
$_CONFIG['color'] = '#E48559';

/*
 * Putty `plink' command path (for SSH connections)
 */
$_CONFIG['plink'] = '/usr/local/bin/plink';

/*
 * URL address of the IP whois service
 */
$_CONFIG['ipwhois'] = 'https://apps.db.ripe.net/db-web-ui/#/query?searchtext=';

/*
 * URL address of the AS whois service
 */
$_CONFIG['aswhois'] = 'https://apps.db.ripe.net/db-web-ui/#/query?searchtext=';

/**
 * Router nodes
 *
 * Parameters:
 *	url          - URL address in format: [ssh|telnet]://[login]:[password]@[host]:[port]
 *	pingtraceurl - URL address for ping and traceroute tools (or FALSE)
 *	description  - Node description
 *	group        - Node group name (of FALSE)
 *	ipv6         - Node is supports IPv6 (TRUE/FALSE)
 *	os           - Node OS (ios, mikrotik, quagga, junos)
 */
$_CONFIG['routers'] = array
(
	'bgp1' => array
	(
		'url' => 'telnet://login:pass@192.168.1.1:23',
		'pingtraceurl' => FALSE,
		'description' => 'BGP-1',
		'group' => 'AS65666',
		'ipv6' => TRUE,
		'os' => 'ios',
	),

	'bgp2' => array
	(
		'url' => 'telnet://login:pass@192.168.1.2:23',
		'pingtraceurl' => FALSE,
		'description' => 'BGP-2',
		'group' => 'AS65666',
		'ipv6' => TRUE,
		'os' => 'ios',
	),
);


/* End of file */

Jak widać konfiguracja jest bardzo prosta. Definiujemy nasz ASN, nazwę, możemy dodać własnego logo (należy je skopiować do głównego katalogu) oraz URL do bazy WHOIS. Ja jak widać wykorzystałem bazę RIPE. Na koniec zostaje nam konfiguracja połączenia z routerami. Możemy wykorzystać SSH lub telnet.

Efekt widoczny poniżej. Jak widać, poza przeszukiwaniem tablicy routingu, dostajemy kilka ekstra opcji jak możliwość sprawdzenia stanu sesji, ping, traceroute czy nawet graficzny widok ścieżek. Istotne jest również to, że nasz LG wspiera IPv6.

Niestety powyższy LG ma dla mnie ogromną wadę. Nie wspiera popularnego demona BGP Birda. Na szczęście jest rozwiązanie dedykowane tylko dla Birda i działa całkiem dobrze. Znajdziecie je tutaj: https://github.com/sileht/bird-lg/

Wystarczy spojrzeć na bazę referencyjną, z tego LG korzysta sporo firm i organizacji. Zasada działania jest jednak inna niż w pierwszej propozycji. Tym razem do działania potrzebujemy „webserver” który uruchamiamy na naszym hoście pełniącym rolę LG,
a na routerach BGP musimy zainstalować „lgproxy”.



                                         ***************
                                    +--> * lgproxy.py *
                                    |    ***************
                                    |  
********       *******************  |    ***************
* USER * ----> * webserver/lg.py *--+--> * lgproxy.py *
********       *******************  |    ***************
                                    |  
                                    |    ***************
                                    +--> * lgproxy.py *
                                         ***************

źródło: https://github.com/sileht/bird-lg/

Nie będę omawiał instalacji, ponieważ sprowadza się tak naprawdę do uruchomienia skryptu python. Opiszę natomiast konfigurację. Najpierw webserver czyli plik lg.cfg:

DEBUG = True
LOG_FILE="/var/log/lg.log"
LOG_LEVEL="WARNING"

DOMAIN = "netmon.pl"

BIND_IP = "0.0.0.0"
BIND_PORT = 5000

PROXY = {
		"its": 5000,
	}

# Used for bgpmap
ROUTER_IP = {
	"its" : ["192.168.1.1"],
}

AS_NUMBER = {
	"its" : "65666",
}

#WHOIS_SERVER = "whois.foo.bar"

# DNS zone to query for ASN -> name mapping
ASN_ZONE = "asn.cymru.com"

Definiujemy sobie naszą domenę, następnie adres IP na którym webserver będzie nasłuchiwał oraz port. W sekcji proxy definiujemy nazwę routera BGP i port proxy, następnie jego adres IP i ASN.

Po stronie proxy, plik lgproxy.cfg:

DEBUG=False
LOG_FILE="/var/log/lg-proxy/lg-proxy.log"
LOG_LEVEL="WARNING"
BIND_IP = "192.168.1.1"
BIND_PORT = 5000
ACCESS_LIST = ["192.168.1.254"]
IPV4_SOURCE=""
IPV6_SOURCE=""
BIRD_SOCKET="/var/run/bird/bird.ctl"
BIRD6_SOCKET="/var/run/bird/bird6.ctl"

Tu w zasadzie tylko wskazujemy IP na którym nasłuchuje proxy, port oraz IP webservera. Pozostaje uruchomić usługi webserver i proxy:

python /usr/local/lookingglass/lg.py
python /usr/local/lookingglass/lgproxy.py

No i efekt końcowy:

Przy okazji możemy przedstawić graficznie jak wyglądają nasze ścieżki i zobaczyć że te przez EPIX są najkrótsze 🙂

Mam nadzieję, że wpis okazał się przydatny 🙂