Выполнение удаленных команд на CISCO
Передо мной встала задача осуществление выполнения удаленных команд на устройстве CISCO. В моем распоряжении находятся Cisco 2821 с IOS c2800nm-adventerprisek9_ivs-mz.124-24.T8.bin и сервер под управлением FreeBSD 8.4-RELEASE, с которого и будут осуществляться команды удаленного управления CISCO. |
Для решения поставленной задачи необходимо выполнить следующее:
1. Заходим на cisco и в режиме конфигурирования включаем возможность удаленного выполнения команд:
Router#conf t Enter configuration commands, one per line. End with CNTL/Z. Router(config)#ip rcmd rsh-enable
2. Для безопасности необходимо указать с какого интерфейса будут осуществляться команды удаленного управления. В моем случае команда для cisco выглядит так:
Router(config)#ip rcmd source-interface GigabitEthernet0/1.1
— где GigabitEthernet0/1.1 интерфейс одной из локальных сетей, в которой находится сервер FreeBSD.
3. Необходимо указать имя локального пользователя cisco, от имени которого удаленный пользователь будет выполнять команды, ip адрес (или hostname) удаленного сервера и само имя удаленного пользователя. Данная команда будет иметь следующий вид:
Router(config)#ip rcmd remote-host cisco_user 192.168.100.3 remote_user enable 15
— где cisco_user – локальный пользователь, заведенный на cisco;
— 192.168.100.3 – ip адрес сервера, с которого будут выполняться команды удаленного администрирования;
— remote_user – имя пользователя на удаленном сервере, от имени которого будут выполняться команды удаленного администрирования (в моем случае – это root сервера FreeBSD);
— 15 – уровень привилегий, с которыми будет работать локальный пользователь cisco.
Некоторое отступление. В моем случае, в качестве локального пользователя cisco, мною был использован пользователь admin, уже заведенный на cisco командой:
Router(config)#username admin privilege 15 secret swordfish
— где: admin – собственно – имя пользователя;
— 15 – уровень привилегий (в данном слечае – максимальный);
— swordfish – пароль (замените на свой).
Если вам необходимо, создайте еще одного пользователя с привилегиями, отличными от 15, и пропишите ему команды, которые он будет иметь право с данным уровнем привилегий исполнять. Например, создадим пользователя traf с уровнем привилегий 5 и дадим ему возможность собирать и обнулять статистику какого-либо интерфейса по ip accounting. Листинг команд будет следующим:
Router(config)#username traf privilege 5 secret swordfish Router(config)#ip rcmd remote-host traf 192.168.100.3 root enable 5 Router(config)#privilege exec level 5 clear ip accounting Router(config)#privilege exec level 5 clear ip accounting checkpoint Router(config)#privilege exec level 5 show ip accounting checkpoint
4. Если вы в предыдущей команде указали ip адрес удаленного сервера, а не его hostname, вам необходимо дать следующую команду:
Router(config)#no ip rcmd domain-lookup
— которая отключит проверку соответствия ip в базе DNS его hostname, т.к. при неудачном сопоставлении – у вас не получится выполнить удаленные команды на cisco. В принципе, если ваш DNS настроен правильно, то данную команду можно опустить.
5. Нам осталось включить отладку проделанной работы, чтобы в случае неудачи иметь возможность отследить ошибки. Делается это так:
Router#deb ip tcp rcm RCMD transactions debugging is on
Просмотр отладочной информации осуществляется так:
Router#sh deb TCP: RCMD transactions debugging is on
Отключение отладочной информации будет осуществлена следующей командой:
Router#no debug ip tcp rcmd RCMD transactions debugging is off
На этом подготовку cisco к выполнению удаленных команд можно считать завершенной.
Листинг проделанной работы:
Router#conf t Router(config)#ip rcmd rsh-enable Router(config)#ip rcmd source-interface GigabitEthernet0/1.1 Router(config)#ip rcmd remote-host admin 192.168.100.3 root enable 15 Router(config)#no ip rcmd domain-lookup
Для проверки выполнения удаленных команд с сервера FreeBSD выполним под root’ом на нем команду:
[root@mail /]# rsh -l admin 192.168.100.2 show clock 11:38:07.271 MSK Tue Aug 6 2013
Синтаксис команды прост:
— после флага -l идет имя локального пользователя в cisco;
— 192.168.100.2 – ip адрес cisco;
— show clock – команда, которая должна выполниться на cisco.
Если после отработки данной команды вы получите примерно тоже самое, то задача решена.
ХХХХХХХХХХХ
Теперь настало время разобрать нюансы. Все они связаны с уже существующим настройками виртуальной консоли на вашей cisco — line vty 0 4.
При моей первой попытке выполнить удаленную команду на cisco у меня выскочила ошибка No free VTYs
:
[root@mail /]# rsh -l admin 192.168.100.2 show clock No free VTYs.
Как оказалось, в моих настройках данной виртуальной консоли при подключении к ней, был обозначен только протокол ssh (transport input ssh). Для выполнения удаленных команд требуется еще и протокол telnet. (Причем при исходящих соединениях протокол telnet не обязателен). Так что настройки line vty 0 4 в этой части должны выглядеть так:
line vty 0 4 ... transport input telnet ssh transport output ssh
Следующая ошибка, которая может у вас возникнуть, Permission denied.
Она возникает, если вы неправильно указали локального пользователя в cisco, от имени которого должны выполняться удаленные команды:
[root@mail /]# rsh -l root 192.168.100.26 show clock Permission denied.
В данном примере мною был указан пользователь root, не имеющий никакого отношения к самой cisco. Если вы не хотите путаться, то заведите пользователя на cisco с таким именем и не забудьте поправить команду ip rcmd remote-host на что-то подобное:
Router(config)#ip rcmd remote-host root 192.168.100.3 root enable
Опять же, из-за существующих настроек в моей cisco, я получил ошибку следующего рода – Access denied
:
[root@mail /]# rsh -l admin 192.168.100.2 show clock Access denied.
На этот раз дело оказалось в настройке списка доступа, указанном мною в line vty 0 4:
line vty 0 4 access-class acl_login in ...
Список acl_login выглядел сперва так:
ip access-list extended acl_login permit tcp 192.168.0.0 0.0.0.255 any eq 22 deny ip any any
Для выполнения удаленных команд необходимо еще разрешить подключение к 514 порту (cmd). После правки список доступа стал выглядеть так:
Router#conf t Enter configuration commands, one per line. End with CNTL/Z. Router(config)#ip access-list extended acl_login Router(config-ext-nacl)#no 10 Router(config-ext-nacl)#10 permit tcp 192.168.0.0 0.0.0.255 any eq 22 514 Router(config-ext-nacl)#exit Router(config)#do sh ip acce ... Extended IP access list acl_login 10 permit tcp 192.168.0.0 0.0.0.255 any eq 22 cmd (2 matches) 20 deny ip any any (8 matches) ...
Настройка line vty 0 4 выглядит полностью так:
line vty 0 4 access-class acl_login in exec-timeout 0 0 privilege level 15 logging synchronous login local transport input telnet ssh transport output ssh
В заключении осталось указать на возможные решения при выполнении удаленных команд на cisco, требующих подтверждения [confirm]. В интерактивном режиме с ним проблем нет, но возникает вопрос, как послать его через rsh? Сам я пока с таким не сталкивался. Но вот тут подсказывают:
Есть несколько вариантов, подбирайте подходящий для вашей системы: 1. rsh -l user_cisco addr_cisco clear line tty X 2. rsh addr_cisco -l user_cisco clear line tty X 3. (sleep 2; echo ") | rsh addr_cisco clear line tty X P.S. Естественно с того хоста откуда лезете должен быть установлен priv-level 15 : username xxx privilege 15 password ttt
Вот теперь, действительно – все! :)
_____
В современных версиях FreeBSD в явном виде команда rsh отсутствует.
Чтобы она появилась необходимо установить пакет net/bsdrcmds