none
Ошибки при добавлении списка разрешенных IP в IIS RRS feed

  • Общие обсуждения

  • ?????? - ??????? ?????? ? ??????? (WS2003) c ??????????? IP.
    ??????? - ??????? ?????? ????, ????? ??????? ?????? ??????????? IP, ?? ?????? ?????????? ?????. ????? ?????? ???? ?? ?????? http://noc.masterhost.ru/allrunet/runet
    ??????????:
    ????????? ??????? ??????? ??? ??? ?????????, ? ??????? ?????? ?? PHP, ??????? ??????? ?????? ?? VBS ??? ?????????? ?????? IP. ????? ?? PHP ?? ??????? ???????? VBS.
    ? ????? ?????????? ?????:

    <?php
    echo "'Getting IP list... ";
    $ip_array=file("http://noc.masterhost.ru/allrunet/runet");
    echo "IP List Loaded.\r\n";
    $ip_count=count($ip_array);
    echo "'Subnets count: $ip_count\r\n";
    echo "'Converting masks... ";
    for ($i=0; $i<$ip_count; ++$i)
    {
    $ip_array[$i]=str_ireplace("/8\n",",255.0.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/9\n",",255.128.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/10\n",",255.192.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/11\n",",255.224.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/12\n",",255.240.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/13\n",",255.248.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/14\n",",255.252.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/15\n",",255.254.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/16\n",",255.255.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/17\n",",255.255.128.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/18\n",",255.255.192.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/19\n",",255.255.224.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/20\n",",255.255.240.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/21\n",",255.255.248.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/22\n",",255.255.252.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/23\n",",255.255.254.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/24\n",",255.255.255.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/25\n",",255.255.255.128",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/26\n",",255.255.255.192",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/27\n",",255.255.255.224",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/28\n",",255.255.255.240",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/29\n",",255.255.255.248",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/30\n",",255.255.255.252",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/31\n",",255.255.255.254",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/32\n",",255.255.255.255",$ip_array[$i]);
    }
    echo "Done.\r\n";
    echo "'Writing IIS config script...\r\n";
    ?>
    '------------------------------------------------------------
    Dim IIsWebVirtualDirObj
    Dim IIsIPSecurityObj
    Set IIsWebVirtualDirObj = GetObject("IIS://localhost/W3SVC/793577/Root")
    Set IIsIPSecurityObj = IIsWebVirtualDirObj.IPSecurity
    IIsIPSecurityObj.GrantByDefault = false
    <?php
    $ip_count--;
    echo "Dim IPList ($ip_count)\r\n";
    $i=0;
    foreach ($ip_array as $ip)
    {
    echo "IPList ($i) = \"$ip\"\r\n";
    $i++;
    }
    ?>
    IIsIPSecurityObj.IPGrant = IPList
    IIsWebVirtualDirObj.IPSecurity = IIsIPSecurityObj
    IIsWebVirtualDirObj.SetInfo
    WScript.Echo("Granted access from:")
    for each IP in IIsIPSecurityObj.IPGrant
    WScript.Echo(IP)
    next
    '------------------------------------------------------------
    'Done!


    ????????? ?????? ?????????? ????? ?????:
    http://sync.ministryofmp3.ru/ip2.txt

    ????????:

    ???? ?????? ?? ????????. ??????:
    <...>\ip2.vbs(1741, 1) Microsoft VBScript runtime error: Invalid procedure call or argument

    ??!

    ???? ???????? ?????? IP, ?? ??????? http://sync.ministryofmp3.ru/ip.txt
    ? ??? ????????.

    ??????:
    ??? ?????? ? ??? ????????
    ???? ?? ??? ?????-?????? ??????? ?????? ???????

     

    UPD:

    ????????: 1. ?????? ?? ?????-?? ?? ???????? ?????????? ????, ?.?. ? ?? ???? ????????? ????? ??? ????? ????? ??????? IPList ?????????? ????.

    2. ?????????????, ???? ??????????? ?? ???????????? ?????? ??????? IPGrant. ??????????? ?? IPList ? ?? ?????, ????? ?????????? ????? ??????, ????? ?????????? ??? ?????? ???????.

    12 марта 2007 г. 15:56

Все ответы

  • Zadacha - zakryt' dostup k serveru (WS2003) c inostrannyh IP.
    Reshenie - zakryt' dostup vsem, zatem sozdat' spisok razreshennyh IP, iz spiska rossiiskih setei. Takoi spisok est' po adresu http://noc.masterhost.ru/allrunet/runet
    Realizatsiya:
    Poskol'ku vruchnuyu vbivat' vse eto nereal'no, ya napisal skript na PHP, kotoryi generit skript na VBS dlya dobavleniya spiska IP. Pisal na PHP po prichine neznaniya VBS.
    V itoge poluchaetsya takoe:

    <?php
    echo "'Getting IP list... ";
    $ip_array=file("http://noc.masterhost.ru/allrunet/runet");
    echo "IP List Loaded.\r\n";
    $ip_count=count($ip_array);
    echo "'Subnets count: $ip_count\r\n";
    echo "'Converting masks... ";
    for ($i=0; $i<$ip_count; ++$i)
    {
    $ip_array[$i]=str_ireplace("/8\n",",255.0.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/9\n",",255.128.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/10\n",",255.192.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/11\n",",255.224.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/12\n",",255.240.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/13\n",",255.248.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/14\n",",255.252.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/15\n",",255.254.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/16\n",",255.255.0.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/17\n",",255.255.128.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/18\n",",255.255.192.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/19\n",",255.255.224.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/20\n",",255.255.240.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/21\n",",255.255.248.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/22\n",",255.255.252.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/23\n",",255.255.254.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/24\n",",255.255.255.0",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/25\n",",255.255.224.128",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/26\n",",255.255.255.192",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/27\n",",255.255.255.224",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/28\n",",255.255.255.240",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/29\n",",255.255.255.248",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/30\n",",255.255.255.252",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/31\n",",255.255.255.254",$ip_array[$i]);
    $ip_array[$i]=str_ireplace("/32\n",",255.255.255.255",$ip_array[$i]);
    }
    echo "Done.\r\n";
    echo "'Writing IIS config script...\r\n";
    ?>
    '------------------------------------------------------------
    Dim IIsWebVirtualDirObj
    Dim IIsIPSecurityObj
    Set IIsWebVirtualDirObj = GetObject("IIS://localhost/W3SVC/793577/Root")
    Set IIsIPSecurityObj = IIsWebVirtualDirObj.IPSecurity
    IIsIPSecurityObj.GrantByDefault = false
    <?php
    $ip_count--;
    echo "Dim IPList ($ip_count)\r\n";
    $i=0;
    foreach ($ip_array as $ip)
    {
    echo "IPList ($i) = \"$ip\"\r\n";
    $i++;
    }
    ?>
    IIsIPSecurityObj.IPGrant = IPList
    IIsWebVirtualDirObj.IPSecurity = IIsIPSecurityObj
    IIsWebVirtualDirObj.SetInfo
    WScript.Echo("Granted access from:")
    for each IP in IIsIPSecurityObj.IPGrant
    WScript.Echo(IP)
    next
    '------------------------------------------------------------
    'Done!

    Rezul'tat raboty posmotret' mozhno zdes':
    http://sync.ministryofmp3.ru/ip2.txt

    PROBLEMA:

    Etot skript ne rabotaet. Vydaet:
    <...>\ip2.vbs(1741, 1) Microsoft VBScript runtime error: Invalid procedure call or argument

    NO!

    Esli obrezat' spisok IP, to poluchim http://sync.ministryofmp3.ru/ip.txt
    I eto rabotaet.

    VOPROS:
    Chto delat' i kto vinovat?
    Est' li esche kakie-nibud' resheniya dannoi zadachi?

    UPD:
    Vidimo chto-to ne tak so spiskom IP. T.k. ne mogu nayti chetkuyu granicu massiva, pri kotoroy proishodit oshibka.

    12 марта 2007 г. 17:10
  • Ошибка связана не с длиной массива, а с несоответствием формата в каких-то элементах массива, например, где-то указаны некорректные адреса или маски подсетей. Это не значит, что так оно и есть на самом деле. К сожалению, здесь не обойтись без тщательной отладки. Вот обсуждение похожей ситуации.

    12 марта 2007 г. 21:07
    Модератор
  • Предполагаю, что

    <...>\ip2.vbs(1741, 1) Microsoft VBScript runtime error: Invalid procedure call or argument

    соответствует вызову IIsIPSecurityObj.IPGrant = IPList

     

    Это может означать, что в списке IP адресов заданы противоречивые сети, т.е. одна сеть дабавляется, но при попытке вставки какой-то еще сети выдается ошибка. Это может быть, например, из-за перекрывающихся сетей.

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

    13 марта 2007 г. 3:39
    Модератор
  • Да, там скорее всего есть сети, которые перекрываются, или дополняют друг друга. Я так и подумал, когда пораскинул мозгами. Вот.
    Как перебором вычислить перекрывающиеся сети, я не знаю, если кто предложит алгоритм - буду очень рад.

    Вопрос - как сделать обработку ошибок? Чтобы можно было игнорировать это рантайм эррор...
    15 марта 2007 г. 11:51
  • Попробуйте в начале скрипта:

    On error resume next

    Хотя может быть я путаю :)

    15 марта 2007 г. 13:23
    Модератор
  • Да, видимо так и придется сделать.
    Единственное, я не смогу определить, почему не вставлено значение, и, может быть, некоторые российские подсети останутся заблокированными.
    Буду придумывать алгоритм суммирования всех этих сетей, а потом выделения из "суммы" "рабочего" списка.
    16 марта 2007 г. 10:20
  •  synclpz написано:
    Да, там скорее всего есть сети, которые перекрываются, или дополняют друг друга. Я так и подумал, когда пораскинул мозгами. Вот.
    Как перебором вычислить перекрывающиеся сети, я не знаю, если кто предложит алгоритм - буду очень рад.

     

    Надо просто отсортировать сети между собой по возрастанию плюс по возрастанию маски. Тогда более общие сети окажутся первыми. Теперь достаточно просто добавлять сети и игнорировать ошибки добавления.

    Например:

    172.16.0.0 255.255.0.0

    172.16.0.0 255.255.255.0

    - первая сеть добавится, а вторая уйдет в ошибку, но она и не нужна, т.к. более общая сеть уже добавлена

    20 марта 2007 г. 4:18
    Модератор