Смотрим в looking-glass

в 9:43, , рубрики: BGP, lg, version6.net, маршрутизация, мир дружба жвачка, Сетевые технологии, системное администрирование

Замечательным примером сетевой солидарности являются многочисленные сервисы looking-glass, позволяющие заглянуть за кулисы очень многих больших и маленьких сетей во всём мире. Это настолько удивительно в современном мире, спрятанном за сотней систем безопасности, просто так взять и выполнить команды на маршрутизаторах являющихся одними из самых критичных устройств всей инфраструктуры передачи данных.

looking-glass version6

Надо лишь ввести IP адрес или префикс в поле и получить в ответ таблицу маршрутизации или трассировку и результаты работы утилиты ping. Поэтому когда понимаешь, что можно вводить не только адреса, но и некоторые другие символы сформированные в осмысленные команды и получать осмысленные результаты, наступает ступор. Хочется бежать и кричать на всех углах: «Да что же это такое надо немедленно запретить, что за несуразность?». Это всё последствия последних лет, когда безопасность превыше открытости и удобности и на это, несомненно, есть причины.

Речь пойдёт об очень популярной реализации looking-glass от version6.net и о том что-же можно получить от этого сервиса.

Если вам вдруг покажется обычным что интерфейс looking-glass позволяет вводить что-то кроме IP адреса, то вероятно вы относитесь к «старой школе» или не читаете новости. Мне показалось это необычным, тем более что другие реализации этого сервиса такого не позволяют.

  • У ReTN (достаточно популярная реализация) все введённые символы воспринимаются как доменное имя, если это не IP адрес.
  • MSX-IX всё разделено на части, вводить можно, но только там где это предусмотрено и интерпретируется всё достаточно жёстко.
  • Data IX позволяет некоторую свободу, хотя и сообщает что указан не IP адрес: «Указан недопустимый аргумент — должен быть IP или IP/n» — но всё равно выполняется birdc, который сообщает об ошибке и фильтрует все непотребства.
  • А Вконтакте разрешён только ping и traceroute и только с IP адресами.

Так как это было для меня необычным я даже начал предупреждать об этом владельцев сервисов, но потом заглянул в код и понял что так и должно быть — это фича, а не баг. На сайте version6.net, который сейчас почему-то не доступен, про функционал честно написано: "all BGP show commands, ping and traceroute".

Открываем lg.cgi, который читается достаточно тяжело и Perl здесь совсем не помогает:

my %FORM = &cgi_decode($incoming);
...
$FORM{addr} =~ s/s.*// if (($FORM{query} eq "ping") || ($FORM{query} eq "trace"));
$FORM{addr} =~ s/[^sd.:w-_/$]//g;

Команда передаётся в переменной $addr, в которой удаляются все символы кроме пробельных (включая табы, опция s), букв, цифр, символов "-", "_", "/", "$", ".", ":".

Условие с ping значительно строже. Насколько я вижу вытирается весь ввод после пробельного символа. Поэтому добавить что-то лишнее в команду ping и traceroute значительно сложнее.

my $command = sprintf($query_cmd, $FORM{addr});
...
if ($FORM{addr} !~ /^[w.^$-/ ]*$/) {
	if ($FORM{addr} =~ /^[w.^$-:/ ]*$/) {
...
	} else {
		&print_error("Illegal characters in parameter string");
	}
}

Потом формируется команда для непосредственного выполнения из шаблона $query_cmd и выполняется проверка на принадлежность ввода немного другой группе символов: исключаются табы, потому что явно указаны пробелы, символ "_" остаётся включённым потому что попадает под опцию w вместе с цифрами, появляется символ "^". Дополнительная проверка делается на ":", которое возможно только при работе с IPv6.

Вот собственно и всё, оставшиеся проверки только на пустую строку для некоторых режимов работы. Команда для выполнения уже сформирована ранее и она без изменений уходит на устройство:

$FORM{addr} = "" if ($FORM{addr} =~ /^[ ]*$/);
...
if ($query_cmd =~ /%s/) {
	&print_error("Parameter missing") if ($FORM{addr} eq "");
} else {
	&print_warning("No parameter needed") if ($FORM{addr} ne "");
}
...
&run_command($FORM{router}, $router_list{$FORM{router}}, $command);

Что же мы можем? Из полезного потеряли кавычки, символы "|", "?" и все скобки. Но осталось очень много, даже очень. Шаблон формирующий команды выглядит вот так (для Cisco):

my %valid_query = (
	"ios"		=>	{
		"ipv4"			=>	{
			"bgp"			=>	"show ip bgp %s",
			"advertised-routes"	=>	"show ip bgp neighbors %s advertised-routes",
			"summary"		=>	"show ip bgp summary",
			"ping"			=>	"ping %s",
			"trace"			=>	"traceroute %s"
			},
...

Основные команды show ip bgp, ping и traceroute. Очевидно что show ip bgp summary и show ip bgp neighbors %s advertised-routes, можно сформировать из show ip bgp %s.

show ip bgp

Наш хлеб. Стоит отметить что на разных сайтах всё же производится дополнительная фильтрация, или доработка под другие системы отличные от стандартных, поэтому не всегда ввод произвольных символов возможен. Скорее даже он возможен, но дальнейшее выполнение команд приводит к ошибкам. Однако если мы имеем базовые устройства предусмотренные в оригинальном коде то можем вводить широкий спектр команд. Сайт Cisco, остановимся на одном вендоре, предлагает много вариантов. Немного полезных, для примера.

show ip bgp regexp

Смотрим все маршруты по заданному AS-PATH. Например, до всех сетей Yandex из Стокгольма, ТТК (GET отправит напрямую к результатам запроса):

show ip bgp regexp 13238$

Router: sgm01rb 
Command: show bgp regexp 13238$


Sat Dec 19 16:30:21.141 UTC
BGP router identifier 10.146.0.1, local AS number 20485
BGP generic scan interval 60 secs
BGP table state: Active
Table ID: 0x0   RD version: 0
BGP main routing table version 2995757495
BGP scan interval 60 secs

Status codes: s suppressed, d damped, h history, * valid, > best
              i - internal, r RIB-failure, S stale, N Nexthop-discard
Origin codes: i - IGP, e - EGP, ? - incomplete
   Network            Next Hop            Metric LocPrf Weight Path
Route Distinguisher: 20485:1 (default for vrf internet)
*>i5.45.192.0/18      10.78.0.6             1000     70      0 13238 i
* i                   10.99.0.8             1000     70      0 13238 i
*                     149.6.168.201         1000     70      0 174 13238 i
*                     166.63.220.185        1000     70      0 1273 9002 13238 i
*                     212.73.250.153        1000     60      0 3356 13238 i
*                     213.248.99.221        1000     70      0 1299 13238 i
*>i5.45.194.0/24      10.78.0.6             1000     70      0 13238 i
* i                   10.99.0.8             1000     70      0 13238 i
*                     212.73.250.153        1000     60      0 3356 13238 i
*                     213.248.99.221        1000     70      0 1299 13238 i
*>i5.45.196.0/24      10.78.0.6             1000     70      0 13238 i
* i                   10.99.0.8             1000     70      0 13238 i
*                     149.6.168.201         1000     70      0 174 13238 i
*                     166.63.220.185        1000     70      0 1273 9002 13238 i
*                     212.73.250.153        1000     60      0 3356 13238 i
*                     213.248.99.221        1000     70      0 1299 13238 i
*>i5.45.202.0/24      10.78.0.6             1000     70      0 13238 i
* i                   10.99.0.8             1000     70      0 13238 i
*                     212.73.250.153        1000     60      0 3356 13238 i
*                     213.248.99.221        1000     70      0 1299 13238 i
...

show ip bgp neighbors

Подробная информация об установленных соседствах. Команда иногда косвенно доступна в подсвеченном выводе при выполнении других команд. Например, подробная информация об одном из соседств Билайна в Ставрополе:

show ip bgp neighbors 10.255.0.2

Router: len244-bb.stv 
Command: show ip bgp neigh


BGP neighbor is 10.255.0.2,  remote AS 3216, external link
  BGP version 4, remote router ID 79.104.32.226
  BGP state = Established, up for 1y5w
  Last read 00:00:40, last write 00:00:14, hold time is 180, keepalive interval is 60 seconds
  Neighbor sessions:
    1 active, is not multisession capable
  Neighbor capabilities:
    Route refresh: advertised and received(new)
    Four-octets ASN Capability: advertised and received
    Address family IPv4 Unicast: advertised and received
    Multisession Capability: advertised
  Message statistics:
    InQ depth is 0
    OutQ depth is 0
    
                         Sent       Rcvd
    Opens:                  1          1
    Notifications:          0          0
    Updates:                1        352
    Keepalives:        631466     635532
    Route Refresh:          0          0
    Total:             631468     635885
  Default minimum time between advertisement runs is 30 seconds

 For address family: IPv4 Unicast
  Session: 10.255.0.2
  BGP table version 182470946, neighbor version 182470946/0
  Output queue size : 0
  Index 77
  77 update-group member
  Incoming update prefix filter list is B2B-BRAS-IN
  Outgoing update prefix filter list is DENY-ALL
  Slow-peer detection is disabled
  Slow-peer split-update-group dynamic is disabled
                                 Sent       Rcvd
  Prefix activity:               ----       ----
    Prefixes Current:               0          1 (Consumes 52 bytes)
    Prefixes Total:                 0        176
    Implicit Withdraw:              0          0
    Explicit Withdraw:              0        175
    Used as bestpath:             n/a          1
    Used as multipath:            n/a          0

                                   Outbound    Inbound
  Local Policy Denied Prefixes:    --------    -------
    prefix-list                       16426          0
    Well-known Community:         126392327        n/a
    Bestpath from this peer:            347        n/a
    Suppressed due to dampening:      15381        n/a
    Invalid Path:                   2886275        n/a
    Total:                        129310756          0
  Maximum prefixes allowed 500
  Threshold for warning message 75%, restart interval 3 min
  Number of NLRIs in the update sent: max 0, min 0
  Last detected as dynamic slow peer: never
  Dynamic slow peer recovered: never

Datagrams (max data segment is 1460 bytes):
Rcvd: 1268112 (out of order: 0), with data: 635885, total data bytes: 12089768
Sent: 1265174 (retransmit: 1 fastretransmit: 0),with data: 631468, total data bytes: 11997935

...

Можно расширить до advertised-routes, чтобы посмотреть какие маршруты анонсируются в сторону определённого соседа, часто присутствует непосредственно в интерфейсе.

show ip bgp summary

Команда не всегда доступна напрямую, поэтому можно попробовать выполнить в обход. Например, для РТКОММ:

show ip bgp summary

BGP router identifier 81.176.81.18, local AS number 8342 
RIB entries 1052472, using 64 MiB of memory 
Peers 2, using 5024 bytes of memory 
Peer groups 1, using 16 bytes of memory 

Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd 
195.161.1.10 4 8342 42323357 15458 0 0 0 01w3d17h 574623 
195.161.1.155 4 8342 43105981 15458 0 0 0 01w3d17h 574623 

Total number of neighbors 2

Ping и Traceroute

И эти команды можно расширить: увеличить размер пакета, выключить фрагментирование. Но сделать это сложнее, потому что код для фильтрации строже. Примеры, однако можно найти — Starnet, кстати здесь Juniper:

ping count 5 detail do-not-fragment size 1200 8.8.8.8

Router: MSK-IX MX480 
Command: ping count 5 detail do-not-fragment size 1200 8.8.8.8


PING 8.8.8.8 (8.8.8.8): 1200 data bytes
1208 bytes from 8.8.8.8 via xe-3/3/0.0: icmp_seq=0 ttl=60 time=1.041 ms
1208 bytes from 8.8.8.8 via xe-3/3/0.0: icmp_seq=1 ttl=60 time=0.964 ms
1208 bytes from 8.8.8.8 via xe-3/3/0.0: icmp_seq=2 ttl=60 time=0.959 ms
1208 bytes from 8.8.8.8 via xe-3/3/0.0: icmp_seq=3 ttl=60 time=32.190 ms
1208 bytes from 8.8.8.8 via xe-3/3/0.0: icmp_seq=4 ttl=60 time=1.038 ms

--- 8.8.8.8 ping statistics ---
5 packets transmitted, 5 packets received, 0% packet loss
round-trip min/avg/max/stddev = 0.959/7.238/32.190/12.476 ms
...

Looking-glass замечательный инструмент, даже отличный, решающий многие проблемы и сплачивающий ряды сетевых специалистов по всему миру, очень чёткий признак зрелости компании. Упомянув несколько разных компаний, в своей я пока не решился выставить подобный сервис наружу.

Экспериментировать можно долго, сервисов LG доступно очень много по всему миру и достаточное количество из них построено на версии предлагаемой version6.net. Но любой инструмент должен быть предсказуем, некоторые из нефильтруемых команд ужасно ресурсоёмки, некоторые открывают чуть больше чем можно позволить в современном мире. Загляните в свой код и сделайте так как вам будет достаточно. Будьте внимательны друг к другу, взаимовыручка и открытость позволили построить Интернет, не будем это разрушать.

Автор: Loiqig

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js