Поиск по этому блогу

среда, 26 октября 2016 г.

RouterOS та налаштування Proxy через DHCP

Рік тому публікував тут як налаштувати прозорий web-proxy на Мікротиці. Але сталося, що частині комп'ютерів, які це вміють, треба було якось віддавати налаштування щодо proxy автоматично.

Для isc dhcp серверу було знайдено опис щодо option 252, через яку можна налаштувати Web Proxy Autodiscovery Protocol (надалі wpad). Зазвичай налаштовується якось так:
option wpad code 252 = text;
option wpad "http://192.168.xxx.xxx/wpad.dat";
де http://192.168.xxx.xxx/wpad.dat вказує на файл налаштувань проксі.

Того самого ефекту можна досягнути у RouterOS наступним чином. Додаємо налаштування dhcp-опції та додаємо її до налаштувань мережі у dhcp-server-і:
/ip dhcp-server option add code=252 name=auto-proxy-config value="'http://192.168.xxx.xxx/wpad.dat'"
/ip dhcp-server network … dhcp-option=auto-proxy-config
Після додання опції клієнти які підтримують wpad автоматично завантажать wpad.dat та застосують налаштування з нього.

Приклад вмісту доволі простого wpan.dat:
// Функція використання проксі
function FindProxyForURL(url, host)
{
    // якщо текстове ім'я хоста без точок, то з'єднуємо з ним безпосередньо (корисно для локальних адрес)
    if (isPlainHostName(host)) { return "DIRECT"; }

    // якщо хост в мережі 192.168.88.0/24 або в мережі 127.0.0.0/8 то до нього підключаємося напряму
    if (isInNet (host, "192.168.88.0", "255.255.255.0") || isInNet (host, "127.0.0.0", "255.0.0.0")) { return "DIRECT"; }

    // якщо жодна умова не виконується - повертаємо ім'я проксі
    return "PROXY 192.168.88.1:8080; DIRECT";
}

Доступні наступні функції:

isResolvable(host) — запит імені хоста (перевірка існування) на DNS-сервері.
Приклад:
if (isResolvable(host))

dnsResolve(host) — запит DNS-сервера для перекладу імені в IP.
Приклад:
if (dnsResolve(host) == "xxx.xxx.xxx.xxx")

myIpAddress() — повертає IP-адреса (що складається з цілих чисел і точок) вузла, на якому запущений браузер.
Приклад:
if (myIpAddress() == "xxx.xxx.xxx.xxx")

isPlainHostName(host) — перевіряє, чи містяться точки в імені вузла. якщо точка знайдена, то повертається значення false; якщо немає, повертається значення true.
Приклад:
if (isPlainHostName(host))

dnsDomainLevels(host) — повертає ціле число, яке дорівнює кількості точок в імені вузла.
Приклад:
if (dnsDomainLevels(host) > 0)

dnsDomainIs(host, ".company.com") — повертає значення true, якщо домен з імені вузла збігається з заданим доменом.
Приклад:
if (isPlainHostName(host) || dnsDomainIs(host, ".company.com"))

localHostOrDomainIs(host, "www.company.com") — повертає значення true, якщо домен з імені вузла збігається з заданим доменом. Виконується тільки для URL-адрес, що відносяться до локального домену.
Приклад:
if (!localHostOrDomainIs(host, "www.company.com"))

shExpMatch(str, shexp) — повертає значення true, якщо str відповідає шаблоном оболонки shexp.
Приклад:
if (shExpMatch(host, "*.com"))

isInNet(host, pattern, mask) — повертає значення true, якщо IP-адреса вузла відповідає зазначеному шаблоном (наприклад, 127.0.0.0). mask вказує, яку частина IP-адреси слід зіставляти (255 = зіставляти, 0 = ігнорувати).
Приклад:
if (isInNet(host, "999.99.9.9", "255.0.255.0"))

url.substring(0, n) — витягує вказану кількість знаків з початку рядка
Приклад:
url.substring(0, 4)

weekdayRange( day1 [, day2] [,"GMT"] ) — повертає значення true, якщо поточний
час системи потрапляє в діапазон, заданий з використанням параметрів і необов'язковий параметр GMT вказує, якщо задано не місцевий час, а час за Гринвічем.
Приклад:
if(weekdayRange("WED", "SAT", "GMT"))

dateRange(day1 [,month1] [,year1] [,day2] [,month2] [,year2] [,gmt] )
day — число дня місяцю між 1 и 31;
month — місяць: JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC;
year — повний (чотиризначний) рік;
gmt — зона GMT (по Гринвічу).
Приклад:
dateRange (1) // true якщо сьогодні перше число, використовується локальний час.
dateRange (1, "GMT") // true сьогодні перше число, використовується час за Гринвічем.
dateRange (1, 15) // true якщо сьогодні число в діапазоні від 1 до 15-е.
dateRange (24, "DEC") // true кожне 24-е грудня.
dateRange (24, "DEC", 1995) // true якщо сьогодні 24е-е грудня 1995 року.
dateRange ( "JAN", "MAR") // true з січня по березень
dateRange (1, "JUN", 15, "AUG") // true з 1 червня по 15-е серпня (включно).
dateRange (1, "JUN", 15, 1995, "AUG", 1995) // true з 1-го червня 1995 року по 15-е червня 1995 року.
dateRange ( "OCT", 1995, "MAR", 1996) // true з жовтня 1995 по березень 1996 (включно).
dateRange (1995) // true протягом 1995 року.
dateRange (1995, 1997) // true з 1995 до 1997

timeRange(hour1 [,min1] [,sec1] [,hour2] [,min2] [,sec2] [,gmt] )
hour — час від 0 до 23;
min — хвилини від 0 до 59;
sec — секунди від 0 до 59;
gmt — зона GMT (по Гринвічу).
Приклад:
timerange (12) // true до 13:00.
timerange (12, 13) // true з 12:00 до 13:00.
timerange (12, "GMT") // true з початку для до 13:00 за Гринвічем.
timerange (9, 17) // true from 9am to 5pm.
timerange (8, 30, 17, 00) // true з 8:30 to 17:00.
timerange (0, 0, 0, 0, 0, 30) // true з півночі і до 00:00:30 секунд.

Також ще підтримуються змінні.
Приклад:
ip_host  = dnsResolve(host);
ip_localnet = "192.168.0.0";
ip_localhost = "127.0.0.1";
proxy_general = "PROXY gwhost.my:3128";
proxy_local = "PROXY localhost:3128";