понедельник, 25 апреля 2011 г.

Пример PAC файла для балансировки проксей Cisco IronPort WSA.

Для клиентов, прикупивших пару Айронпортовских апплайнсов, на прошлой неделе помог составить файл автоконфигурирования (PAC - Proxy Auto-Configuration). Требования были, в принципе, простые и логичные:
- доступ к ресурсам локальной сети по IP адресам - без прокси,
- доступ к доменам, ресолвищимся в локальные адреса - без прокси,
- доступ к списку конкретных доменов - без прокси,
- балансировка обычных http запросов между проксями,
- для https запросов включен механизм (MIM - Man In the Middle) - передается основная прокся (условно №1), если она не доступна - вторая. То есть режим основной / резервный.
В результате получился такой скриптец:
function FindProxyForURL (url,host) {
var resolved_ip = dnsResolve(host);

if (isInNet(resolved_ip, "10.0.0.0", "255.0.0.0") ||
isInNet(resolved_ip, "172.16.0.0", "255.240.0.0") ||
isInNet(resolved_ip, "192.168.0.0", "255.255.0.0") ||
isInNet(resolved_ip, "127.0.0.0", "255.255.255.0"))
return "DIRECT";

if (shExpMatch(url, "*.test.room.local")||
shExpMatch(url, "*.test.room.ru")||
shExpMatch(url, "*.citrixweb.test.room.ru")||
shExpMatch(url, "*.test.room.net")||
shExpMatch(url, "*.test.room.com")||
shExpMatch(url, "*.test.room.spb.ru")||
shExpMatch(url, "secure.test.room.com")||
shExpMatch(url, "*.internal.test.room.com"))
return "DIRECT";

if (shExpMatch(url, "https:*")) return "PROXY spbsrvprx-wsa1.test.room.local:3128; PROXY spbsrvprx-wsa2.test.room.local:3128";

else
switch (URLHash (url) %2) {
case 1: return "PROXY spbsrvprx-wsa2.test.room.local:3128";
default: return "PROXY spbsrvprx-wsa1.test.room.local:3128";
}
}
function URLHash (url) {
server_name=url.split("/")[2]
if (!server_name) {return url.length;}
return server_name.length;
}
Проверку файлец выдержал, под IE и FF не встал колом.
Пара ссылок, подмогнувших в написании:
http://en.wikipedia.org/wiki/Proxy_auto-config
http://www.findproxyforurl.com/pac_file_examples.html

воскресенье, 17 апреля 2011 г.

Запуск Cisco IOU под Windows в andLinux

Некоторое время назад, когда появились первые ссылки на цисковскую внутреннюю разработку IOS over UNIX (IOU), коллега протестивший, естественно в целях обучения, этот симулятор (пусть так называется), попросил проверить, существуют ли методы запуска этой полезняшки на Windows машинах. По-первости, я смотрел в сторону Sygwin'а, но достаточно быстро понял, что это не то. Насколько я понимаю, sygwin - это взятые линуховые исходники, поправлен синтаксис и скомпилированы виндовыми компиляторами, то есть портация приложений (утилит и пр.). В процессе изучения вопроса, натолкнулся на проект coLinux, от которого отпочковался проект andLinux, построенный на дистрибутиве Ubuntu. Текущая стабильная версия 0.7.4 доступна в двух вариантах (минимальная XFCE и "большая" KDE) - http://www.andlinux.org/downloads.php. Однако проект не обновлялся с мая 2009 года! Текущее ядро базируется на Ubuntu 9.04 (логично для мая 2009го). Я решил поставить вариант с кедами. Сам процесс установки достаточно прозрачен, мастер задает вопросы о том, куда поставить это богатство, логин / пароль для доступа к общей шаре, как запускать приложение (можно автоматически процессом винды), сколько памяти выдать - максимально - 1 Гб.
после установки (я выбрал авто-старт с гигом оперативы), обнаружились первые грабли: запуск производится под системной учетной записью, а терминал стартует с авто входом судоера cobuntu, если не читать мануал, то не очень понятно, какой у этого пользователя пароль. Ругнувшись, зачем тогда спрашивали логин / пасс при установке, выясняем:
логин - cobuntu
пароль - rescue
пароля root - нет (логично для Ubuntu)
Создаем своего пользователя:
$ sudo useradd -m mik17
$ passwd mik17
$ sudo visudo
добавляем
mik17 ALL=(ALL) ALL
Теперь поправим запись старта от имени нового пользователя:
$ sudo vim /etc/andlinux/xsession_cmd
меняем запись на
sux - mik17 /usr/local/sbin/launcher.pl
все сохраняем выходим, перезапускаем сервис самого andLinux.
Теперь при вызове терминала наблюдаем в качестве шелла sh, что за позапрошлый век! Меняем на привычный bash:
$ sudo chsh
/bin/bash
теперь при входе от имени mik17, будет привычное окружение.
Настало время разобраться с сетью. Сам сервис создает в винде интерфейс TAP-Colinux с адресацией 192.168.11.0/24 (непосредственно со стороны Windows адрес 192.168.11.1). На стороне andLinux доступ в эмулятор проходит по адресу 192.168.11.150. Внутри линуха настроены интерфейсы /etc/network/interfaces
iface eth0 inet static
address 10.0.2.15
netmask 255.255.255.0
gateway 10.0.2.2

iface eth1 inet static
address 192.168.11.150
netmask 255.255.255.0

такой хоккей нам не нужен - комментируем шлюз 10й подсети и добавляем на eth1
gateway 192.168.11.1
Разрешение имен тоже нужно поправить, добавим Гугловый ДНС:
/etc/resolv.conf
nameserver 8.8.8.8
nameserver 10.0.2.3
Со стороны эмулятора теперь с сетью должно быть все ОК, настраиваем винду поработать маршрутизатором с NAT'ом:
- включаем службу "Маршрутизация и удаленный доступ",
- на интерфейсе "Подключение по локальной сети" (если явно не переименовывать подключение - скорее всего оно так и называется) в Свойствах / Дополнительно разрешаем общий доступ подключения к Интернету. Смотрим предупреждение, что "внутренней сети" будет присвоена адресация подсети 192.168.0.0/24, соглашаемся, а потом меняем TAP-Colinux адрес обратно на 192.168.11.1.
Теперь эмулятор получил доступ во внешний мир.
Пришла очередь запуска IOU.
Где получить - микроквест для самостоятельного решения.
закидываем бинарник в /home/mik17 и пробуем стартануть... Ругается на несоответствие библиотеки, смотрим у себя в /lib/ библиотечку со схожим именем и делаем на нее ссылку:
$ sudo ln -s /lib/libcrypto.so.0.9.8 /lib/libcrypto.so.4
теперь идет ругань на файл с лицензией. Вопрос решается скриптом:
$ vim iou-lic.py
#! /usr/bin/python
print "*********************************************************************"
print "Cisco IOU License Generator - Kal 2011, python port of 2006 C version"
import os
import socket
import hashlib
import struct
# get the host id and host name to calculate the hostkey
hostid=os.popen("hostid").read().strip()
hostname = socket.gethostname()
ioukey=int(hostid,16)
for x in hostname:
ioukey = ioukey + ord(x)
print "hostid=" + hostid +", hostname="+ hostname + ", ioukey=" + hex(ioukey)[2:]
# create the license using md5sum
iouPad1='\x4B\x58\x21\x81\x56\x7B\x0D\xF3\x21\x43\x9B\x7E\xAC\x1D\xE6\x8A'
iouPad2='\x80' + 39*'\0'
md5input=iouPad1 + iouPad2 + struct.pack('!i', ioukey) + iouPad1
iouLicense=hashlib.md5(md5input).hexdigest()[:16]
print "\nAdd the following text to ~/.iourc:"
print "[license]\n" + hostname + " = " + iouLicense + ";\n"
print "You can disable the phone home feature with something like:"
print " echo '127.0.0.127 xml.cisco.com' >> /etc/hosts\n"
если скопировать этот скрипт напрямую, нужно убрать все стартовые пробелы, а отступ ioukey = ioukey + ord(x) сделать табуляцией.
в результате работы будет сформирован вывод (его можно направить в файл) с нужными параметрами. Если файл /etc/hostname не менялся, то нужный файл будет:
$ vim .iourc
[license]
andLinux = e5439a28afd220f1;
Теперь будет ругань на карту сети - файл NETMAP. По адресу http://evilrouters.net/2011/01/09/creating-a-netmap-file-for-iou/ есть неплохое объяснение, как рассчитывать интерфейсы для этой карты, у меня для теста получился простенький:
$ vim NETMAP
101:0
101:1 102:1
102:0
Теперь открываем терминальные окошки для старта рутеров:
$ ./i86bi_linux-ipbase-ms 101
и
$ ./i86bi_linux-ipbase-ms 102
в выводе sh cdp neigh можно увидеть, что у этих рутеров есть коннект на порту eth1/0.
Чтож, сама возможность запуска симулятора доказана, позднее проверю фичи - wrapper и IOUlive.