доброго времени!Подскажите пожалуйста каким образом можно прикрутить к ipfw простейший web-интерфейс удаленого добавления правил?
Иными словами, человеку, не разбирающемуся в Unix и не имеющему доступ к консоли трубется дать инструмент запрета определенных внешних ресурсов (предположительно, путем добавления правил фаера, либо есть другие соображения?)
БЫть может есть готовые решения? я не нашелзараннее спасибо!
>Иными словами, человеку, не разбирающемуся в Unix и не имеющему доступ к консоли трубется дать инструмент запрета определенных внешних ресурсовэто тоже самое что дать макаке в зоопарке гранату ))
>Иными словами, человеку, не разбирающемуся в Unix...... нехрен в нем и ковыряться...
>
> ... нехрен в нем и ковыряться...
>парни, ну никто же не говорит, чтоб это человек ковырялся в правилах или еще где-либо.
нужна по сути форма для ввода запрещенных сайтов.
ты видимо сам в никсах неселен ибо несеш чушь, и вообще путаешь понятия ipfw,ip,site.
Начнем с того что речь о разных уровнях модели ISO/OSI.
>ты видимо сам в никсах неселен ибо несеш чушь, и вообще путаешь
>понятия ipfw,ip,site.
>Начнем с того что речь о разных уровнях модели ISO/OSI.Действительно не силен, и тем не менее спасибо за проявленный интерес к теме.
>[оверквотинг удален]
>
>Подскажите пожалуйста каким образом можно прикрутить к ipfw простейший web-интерфейс удаленого добавления
>правил?
>
>Иными словами, человеку, не разбирающемуся в Unix и не имеющему доступ к
>консоли трубется дать инструмент запрета определенных внешних ресурсов (предположительно, путем добавления
>правил фаера, либо есть другие соображения?)
>БЫть может есть готовые решения? я не нашел
>
>зараннее спасибо!Не знаю насчет готовых "решений", но написать простенький web-интерфейс на самом деле не сложно: например, используя Perl + CGI, затем на этот скрипт установать атрибут (+s) чтоб скрипты от имени root выполнялись
>установать атрибут (+s) чтоб скрипты от имени root выполнялисьТакже поставить пользователя root и установить perl-suid, который еще с perl 5.8 не рекомендуется к использованию.
>>установать атрибут (+s) чтоб скрипты от имени root выполнялись
>
>Также поставить пользователя root и установить perl-suid, который еще с perl 5.8
>не рекомендуется к использованию.ну это да, согласен
Если все касательно только http то по пунктам:поставить squid;
настоить в нем поддержку режима прозрачного прокси;
путем ipfw forward завернуть на него весь http трафик;
поставить webmin;(завести в нем пользователя. кторому дать доступ только на модуль сквида;
1 раз показать как добавлять ACL.) или
(средствами sudo дать возможность сказать ee /usr/local/etc/squid/squid.conf и /usr/local/etc/rc.d/squid reload)все.
Поправлю вышеотписавшегося участника ...Только webmin ставить нафик. Есть ход проще
Собственно после того как сквид поставлен к нему либо ACL`ом либо редиректором (в зависимости от обьемов), если порядка сотни сайтов тогда можно без редиректора^ прикручивается список сайтов. Что сквид, что редиректо этот список может брать из файла ... так что =) Далее ставится апач, в нем заводится папка, на которую прикручивается авторизация (бейсик авторизация вполне пойдет, настраивается просто да и вполне оправдана) и в эту папку ложится перловый скрипт, который добавляет это все дело в файл, который собственно и прицеплен в качестве файла для ACL. Я лично взял скрипт гостевой книги и переписал ... если нужно - отпишитесь кому, кто в перле вообще не силен - пришлю, хотя его самому написать - час работы. Ну и далее в крон /path_to_squid -k reconfigure. Время зададите по вкусу =) Учтите что во время перечитывания конфигов он перечитывает ацл`ы тоже. Так что это обязательно. Вот и все дела =) Главное чаще раз в 15 минут не ставте реконфигурение сквида.
Фигасе час работы. Да там шелл cgi скриптом на пару строчек можно обойтись :)
>[оверквотинг удален]
>настраивается просто да и вполне оправдана) и в эту папку ложится
>перловый скрипт, который добавляет это все дело в файл, который собственно
>и прицеплен в качестве файла для ACL. Я лично взял скрипт
>гостевой книги и переписал ... если нужно - отпишитесь кому, кто
>в перле вообще не силен - пришлю, хотя его самому написать
>- час работы. Ну и далее в крон /path_to_squid -k reconfigure.
>Время зададите по вкусу =) Учтите что во время перечитывания конфигов
>он перечитывает ацл`ы тоже. Так что это обязательно. Вот и все
>дела =) Главное чаще раз в 15 минут не ставте реконфигурение
>сквида.спасибо большое (!) за столь подробное описние. довольно интересен метод- попробую его. Если не сложно пришли свой скрипт ( с перлом знакомлюсь). А вообще хотелось бы обойтись без прокси.
>Если не сложно пришли свой скрипт ( с перлом знакомлюсь). А
>вообще хотелось бы обойтись без прокси.Чего-то с первого раза не отправилось сообщение ... дубль 2
А почему бы и нет? Никто ведь не заставляет включать кэш. И никто не заставляет прикручивать авторизацию если таковая не требуется. Зато можно поиметь бонус в виде лоад-балансинга. Настроить delay pools и поставить ограничения по скорости на закачку больших файлов. =) Делается очень просто.
Собственно сам скрипт:
#!/usr/bin/perl
$file = "disabled.users";
$html_file = "add.cgi";
print "Content-Type: text/html\n\n";
print "Users in access-denied list:\n";
use CGI qw (:standard);
$q=new CGI ();
$action = $q->param (action);
&post if ($action eq 'post');
&view;
sub post {
$nick = $q->param (nick);
$to_base = "$nick\n";
open (OUT, ">>$file");
print OUT $to_base;
close (OUT);
}
sub view {
open (BASE, "<$file");
@base = <BASE>;
close (BASE);{
print "@base";
}
print "
<form action=$html_file method=get>
Add user to acces denied list: <input name=nick>
<input name=action value=post type=hidden>
<input type=submit value=Add>
</form>
";
}Помещается в файл (у меня add.cgi, если будете другое имя использовать - поправте переменную $html_file)
По скрипту
1) Скрипт был найден в гугле, это БЫЛА примитивнейшая гостевая книга, которая была облегчена под мои нужды. Если автор узнает свое творение - спасибо ему огромное.2) Он делает 2 действия, выводит существующие записи, и есть форма для добавления новых. Удалять через него нельзя. (В моем случае это не нужно, у меня удалением занимается крон и сш-скрипт раз в месяц, а пользуюсь я им исключительно для добавления "охреневших" пользователей в deny-лист.
3) На апач авторизация обязательна потому как за пару часов этим скриптом можно забить весь раздел ... это не есть гут.
Успехов =)
>[оверквотинг удален]
>2) Он делает 2 действия, выводит существующие записи, и есть форма для
>добавления новых. Удалять через него нельзя. (В моем случае это не
>нужно, у меня удалением занимается крон и сш-скрипт раз в месяц,
>а пользуюсь я им исключительно для добавления "охреневших" пользователей в deny-лист.
>
>
>3) На апач авторизация обязательна потому как за пару часов этим скриптом
>можно забить весь раздел ... это не есть гут.
>
>Успехов =)Ну вот, я же говорил :) Perl + CGI :) Можно еще поставить модуль DBI, DBD-mysql и хранить не в файле, а в базе данных список правила ipfw
>[оверквотинг удален]
>>
>>
>>3) На апач авторизация обязательна потому как за пару часов этим скриптом
>>можно забить весь раздел ... это не есть гут.
>>
>>Успехов =)
>
>Ну вот, я же говорил :) Perl + CGI :) Можно еще
>поставить модуль DBI, DBD-mysql и хранить не в файле, а в
>базе данных список правила ipfwпопробуй WebGui m0n0wall или PfSense
>Ну вот, я же говорил :) Perl + CGI :) Можно еще
>поставить модуль DBI, DBD-mysql и хранить не в файле, а в
>базе данных список правила ipfwА подробнее можно? Каким образом заставить ipfw брать правила из MySQL? Я весь инет перерыл :( но так и не нашел примеров реализации этого... :(
Похоже вы не так поняли. С базой работать должен перловый скрипт и на основе данных генерировать правила для ipfw.
>Похоже вы не так поняли. С базой работать должен перловый скрипт и
>на основе данных генерировать правила для ipfw.Нет! Понял я правильно!
Написал же человек:"Ну вот, я же говорил :) Perl + CGI :) Можно еще поставить модуль DBI, DBD-mysql и хранить не в файле, а в базе данных список правила ipfw"
Если так, то правила лежат не в файле rc.firewall а как раз в базе MySQL, только как такое реализовать, я так и не понял. В манах по IPFW ни чего про это... :(
мда, безнадежен :(
>мда, безнадежен :(Можно и не хамить! :)
Понятно что к MySQL-у обращается не IPFW а скрипт при чем на чем он, не суть важна, мне интересен механизм... допустим, я написал программу на Delphi через ODBC подключил MySQL и запихиваю себе в базу приспокойно правила для IPFW, дальше некий скриптик через крон обращается к базе забирает от туда все что я там накропал и пихает это все IPFW, вот вопрос собственно в том, каким образом он это пихает... ведь надо:
1. Либо заново постоянно генирировать файл правил, либо как-то дописывать в конец файла то, что изменилось.
2. Перезапускать IPFW после изменения правил.
Так? :)
что мешает вызывать из скрипта консольный ipfw и при помощи него добавлять правила?
>что мешает вызывать из скрипта консольный ipfw и при помощи него добавлять
>правила?Мешает то, что добавлять правила должен не один человек, а допустим несколько и проблема в том, что консольный набор осилит только тот, кто это все делал, остальные в этом ни как. То есть, грубо горя есть 2 администратора, которые от Unix далеки, но вполне могут выполнять эту работу. Пускать на сам сервер под root, как-то не хотелось бы. По этому и такие вот извращения. :)
Проблема еще в том, что в Perl я как-то не силен. Ну не нравится мне его синтаксис...
Накропал на PHP скриптик. Работает. Но, придется его руками запускать после добавления правил в БД.<?php
$filename = '/etc/rc.firewall';
$conn = mysql_connect("localhost", "user", "password");
if (!$conn)
{
echo "Unable to connect to DB: " . mysql_error();
exit;
}if (!mysql_select_db("network"))
{
echo "Unable to select table: " . mysql_error();
exit;
}$sql = "SELECT * FROM ipfw";
$result = mysql_query($sql);if (!$result)
{
echo "Error run ($sql) from DB: " . mysql_error();
exit;
}if (mysql_num_rows($result) == 0)
{
echo "No record in table!";
exit;
}if (is_writable($filename))
{
if (!$handle = fopen($filename, 'w+'))
{
echo "Error open ($filename)";
exit;
}while ($row = mysql_fetch_assoc($result))
{
$somecontent = $row["rule"];
if (fwrite($handle, $somecontent. "\n") === FALSE) {
echo "No write to ($filename)";
exit;
}
$somecontent = '';
}
fclose($handle);}
mysql_free_result($result);
?>Вот, как-то так.
>[оверквотинг удален]
> ($filename)";
> exit;
> }
> $somecontent = '';
> }
> fclose($handle);
> }
> mysql_free_result($result);
> ?>
> Вот, как-то так.а нафига это БАЗОЙ впихивать в файл???