Новости из Блогов Привязка IPFW к SAMS

Discussion in 'Мировые новости. Обсуждения.' started by Suicide, 26 Dec 2012.

  1. Suicide

    Suicide Super Moderator
    Staff Member

    Joined:
    24 Apr 2009
    Messages:
    2,482
    Likes Received:
    7,062
    Reputations:
    693
    Привязка IPFW к SAMS


    24.12.2012 , Автор: Bani
    http://www.opennet.ru/tips/2725_sams_ipfw_squid_web_freebsd.shtml



    Долго я искал решение как привязать правила IPFW и Squid к веб-интерфейсу, никак не мог найти готовое и подходящее для себя решение. Поставил SAMS но и он только для Squid. Задумался привязать его к IPFW, вот готовое решение, для
    таких как я... очень удобно если находишься вне офиса или территориально отдалён.

    Этот способ не является идеальным, но как вариант очень удобен и не требует больших усилий.

    Система и компоненты: FreeBSD 8.0/Squid 2.6/SAMS-1.0.5/Rejik/PHP 5.3.14/Apache
    2.2/Sudo Как ставить из портов думаю ясно.

    И так, пишем скрипт и кладём его в /usr/local/etc/rc.d чтобы он запускался автоматом:
    Code:
    #! /bin/sh
    
       # PROVIDE: ipfwsams
    
       . /etc/rc.subr
    
       name="ipfwsams"
       rcvar=`set_rcvar`
       start_cmd="myscript_start"
       stop_cmd=":"
       load_rc_config $name
       FwCMD="/sbin/ipfw"
       DATE=`date`
    
       myscript_start()
     
       {
       if checkyesno ${rcvar}; then
    
          echo  > /usr/local/rejik/blocked_ipfw
          grep -E -o -h '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /usr/local/rejik/_sams_banlists/default_denied/urls | tr A-Z a-z | sort | uniq >> /usr/local/rejik/blocked_ipfw
          echo  > /usr/local/rejik/blocked2_ipfw
          grep -E -o -h '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /usr/local/rejik/_sams_banlists/4fb624a388513_denied/urls | tr A-Z a-z | sort | uniq >> /usr/local/rejik/blocked2_ipfw
    
          ${FwCMD} table 1 flush
          ${FwCMD} table 2 flush
          ${FwCMD} table 3 flush
          cat /usr/local/rejik/4b8bcc7c015ed.sams | awk '{ if ($1!="") {system("ipfw table 2 add "$1"")} }' > /dev/null
          cat /usr/local/rejik/4fb624a388513.sams | awk '{ if ($1!="") {system("ipfw table 1 add "$1"")} }' > /dev/null
          cat /usr/local/rejik/default.sams | awk '{ if ($1!="") {system("ipfw table 1 add "$1"")} }' > /dev/null
          cat /usr/local/rejik/50336b692ec18.sams | awk '{ if ($1!="") {system("ipfw table 1 add "$1"")} }' > /dev/null
          cat /usr/local/rejik/blocked_ipfw | awk '{ if ($1!="") {system("ipfw table 3 add "$1"")} }' > /dev/null
          cat /usr/local/rejik/blocked2_ipfw | awk '{ if ($1!="") {system("ipfw table 3 add "$1"")} }' > /dev/null
          echo "$DATE: IPFW to SAMS STARTED" >> /var/log/samslog
       fi
       }
    
       run_rc_command "$1"
    Данный скрипт будет выделять нужные IP из списков Rejik-а и помещать их в таблицы IPFW (далее поясню как он работает).
    Для того чтобы скрипт запускался автоматом при старте системы прописываем строчку в rc.config:
    Code:
     ipfwsams_enable="YES"
    Для запуска данного скрипта через веб-интерфейс нужно создать PHP файл, я
    расположил его в корне самса (/usr/local/share/sams/ipfwrestart.php):
    Code:
     <?php
       exec ('/usr/local/share/sams/src/script/restart_ipfw');
    
       print("
          <center><b>IPFW RESTARTED</b>
       ");
       $str= file_get_contents("/var/log/samslog");
       $str = nl2br($str, true);
       $str = nl2br($str, false);
       echo $str;
       print("</center>");
       ?>
    Теперь пропишем ссылку на этот файл в Самсе, редактируем файл /usr/local/share/sams/src/squidbuttom_0_reconfig.php

    Ищем строчку:
    Code:
    $str="<FONT color=\"BLUE\" SIZE=+1>$squidbuttom_0_reconfig_ReconfigSquid_3\n";
    заменяем на:
    Code:
     $str="<FONT color=\"BLUE\" SIZE=+1>    $squidbuttom_0_reconfig_ReconfigSquid_3<BR><BR><a href=\"ipfwrestart.php\">Restart IPFW</a></FONT><BR>\n";
    для проверки лезем в самс > сквид > реконфигурировать, после того как команда
    отправлена должна вылезти ссылка на рестарт IPFW.

    файл скрипт рестарта, это по сути команда sudo на старт скрипта от пользоватеоля с правами рута:
    Code:
    #! /bin/sh
       sudo -u root /usr/local/etc/rc.d/ipfwsams start
    Так как PHP файл запустить Shell скрипт от пользователя www не может используем sudo.
    Для того чтобы разрешить пользователю www запускать от рута нужно добавить в
    конфиг sudo строчку (/usr/local/etc/sudoers):
    Code:
    www ALL=(ALL) NOPASSWD: /usr/local/etc/rc.d/ipfwsams start
    нужные строки для IPFW (80 порт завёрнут на squid):
    Code:
    allowedports="20,21,53,443,123,4321" (по каким портам натить)
       ifout='vr0' (внешний)
       ifuser='ste0' (внутренний)
    
       #TABLE1 - обычные пользователи
       #TABLE2 - ADMINS
       #TABLE3 - IP адреса к которым нужно заблокировать доступ (только для обычных пользователей)
    
       ipfw add divert natd all from "table(2)" to any out via ${ifout}
       ipfw add deny all from "table(1)" to "table(3)"
       ipfw add divert natd icmp from "table(1)" to any out via ${ifout}
       ipfw add divert natd all from "table(1)" to any ${allowedports} out via ${ifout}
    И так, рассмотрим ранее упомянутый скрипт-граббер IP-адресов:
    Code:
     #! /bin/sh
    
       # PROVIDE: ipfwsams
       ...
    
       echo  > /usr/local/rejik/blocked_ipfw - создаём файл где будем хранить IP адреса из списков запрета SAMS
    
       grep -E -o -h '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /usr/local/rejik/_sams_banlists/default_denied/urls | tr A-Z a-z | sort | uniq >> /usr/local/rejik/blocked_ipfw - по маске выковыриваем из файла Rejik все IP адреса, которые мы добавили в САМСЕ, в данном случае это первый созданный в самс Запрет доступа по URL.
    
       echo  > /usr/local/rejik/blocked2_ipfw - создаём файл где будем хранить IP адреса из списков запрета SAMS
    
       grep -E -o -h '[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}\.[[:digit:]]{1,3}' /usr/local/rejik/_sams_banlists/4fb624a388513_denied/urls | tr A-Z a-z | sort | uniq >> /usr/local/rejik/blocked2_ipfw - по маске выковыриваем из файла Rejik все IP адреса, которые мы добавили в САМСЕ, в данном случае это какой то список имеющий идентификатор "4fb624a388513" в Запрет доступа по URL, его можно определить в таблицах MySql
    
       ${FwCMD} table 1 flush - Сбрасываем всё содержимое таблицы
       ${FwCMD} table 2 flush - Сбрасываем всё содержимое таблицы
       ${FwCMD} table 3 flush - Сбрасываем всё содержимое таблицы
    
       cat /usr/local/rejik/4b8bcc7c015ed.sams | awk '{ if ($1!="") {system("ipfw table 2 add "$1"")} }' > /dev/null - обавляем в таблицу IP адреса шаблона Админов (ID можно найти в MySql)
    
       cat /usr/local/rejik/4fb624a388513.sams | awk '{ if ($1!="") {system("ipfw table 1 add "$1"")} }' > /dev/null - Добавляем в таблицу IP адреса входящие в шаблон обычных пользователей (ID можно найти в MySql)
    
       cat /usr/local/rejik/50336b692ec18.sams | awk '{ if ($1!="") {system("ipfw table 1 add "$1"")} }' > /dev/null - Добавляем в таблицу IP адреса входящие в шаблон обычных пользователей, второй шаблон (ID можно найти в MySql)
    
       cat /usr/local/rejik/default.sams | awk '{ if ($1!="") {system("ipfw table 1 add "$1"")} }' > /dev/null - Добавляем в таблицу IP адреса группы обычных пользователей, у меня 3 шаблона в САМС, разница только в доступе по 80 порту, поэтому всё остальное как у обычных пользователей (ID можно найти в MySql)
    
       cat /usr/local/rejik/blocked_ipfw | awk '{ if ($1!="") {system("ipfw table 3 add "$1"")} }' > /dev/null - Добавляем в таблицу IP адреса к которым нужно закрыть доступ из ранее созданного файла
    
       cat /usr/local/rejik/blocked2_ipfw | awk '{ if ($1!="") {system("ipfw table 3 add "$1"")} }' > /dev/null - Добавляем в таблицу IP адреса к которым нужно закрыть доступ из ранее созданного файла
    
       echo "$DATE: IPFW to SAMS STARTED" >> /var/log/samslog - пишем в логе что всё удачно добавлено.
    
       ...
    Проверяем, создаём новых пользователей, добавляем их к какому-либо шаблону,
    добавляем в списки запретов IP адреса и запускаем скрипт, проверяем таблицы,
    читаем логи. В логах при запуске от sudo появляется запись.

    Если ничего не происходит смотрим на пути и имена файлов, скорее всего не тот файл указан.
     
    _________________________