URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID8
Нить номер: 7131
[ Назад ]

Исходное сообщение
"управление ipfw через php"

Отправлено ARH665 , 04-Фев-11 20:49 
Доброго дня! Раскурил как направлять людей с локальной сети на адрес сервера, таким образом можно сделать уведомление, например: сегодня в сети с 15 до 16 будут производиться работы. Но это неудобно, пользователь будет все время редиректиться на эту страницу. Хотелось бы прикрутить например так: сегодня в сети с 15 до 16 будут производиться работы. (и чуть ниже кнопочка: Я УВЕДОМЛЕН) и по нажатию на эту кнопку в /etc/rc.firewall прописывается удаление правила перенаправления и перечитывание конфига ipfw.
Очень много покопавшись по форумам, повторяю ооочень много, но не нашел ничего дельного вовсе, а все что нашел, и попытался скрутить, даже вывод команды в файл не писало. Подскажите, как попроще сделать это? Или хотя бы подскажите, как обратиться к командному процессору из php? А дальше я бы сам разобрался

Содержание

Сообщения в этом обсуждении
"управление ipfw через php"
Отправлено ARH665 , 04-Фев-11 22:02 
да, извне доступ к серверу закрывается, т.е. атаковать и исполнять кто-то левый обращения командного процессора не будет, только те, кто под шлюзом, а там врядли кому-то надо это делать



"управление ipfw через php"
Отправлено gregory , 05-Фев-11 02:19 
функцией exec (http://docs.php.net/manual/en/function.exec.php) давать команды ipfw (man ipfw)


"управление ipfw через php"
Отправлено ARH665 , 05-Фев-11 14:24 
> функцией exec (http://docs.php.net/manual/en/function.exec.php) давать команды ipfw
> (man ipfw)

дело в том, что этой функцией можно давать комманды процессору /bin/sh. Но апач логинится под логином с ограниченными правами, поэтому требуется произвести вход в root. при написании что-то типа:

<?php
shell_exec('su');
shell_exec('пароль');
?>

dmesg -a ввыписывает вот что:
Feb  5 13:59:12 srv2 su: BAD SU admin to root on tty
Feb  5 13:59:54 srv2 su: in prompt_echo_off(): tcgetattr(): Inappropriate ioctl for device

а под пользователем www (который апач создал для себя), нет доступа к команде (хотя бы) ipfw show. Дальше как?


"управление ipfw через php"
Отправлено gregory , 05-Фев-11 14:34 
1. дать пользователю www такие права
2. есть такой роутер-дистр на базе FreeBSD, m0n0wall, у него интерфейс на php написан. Было дело, разбирался, так там все на exec'ах реализовано, в том числе и управление файрволлом. Можно расковырять.

"управление ipfw через php"
Отправлено gregory , 05-Фев-11 14:35 
Сслыка: http://m0n0.ch/wall/

"управление ipfw через php"
Отправлено gregory , 05-Фев-11 14:38 
Вот, еще нашел:

"sudo can be executed without storing pass in a file

system('echo "PASS" | sudo -u root -S COMMAND');"
(http://docs.php.net/manual/en/function.shell-exec.php#101440)



"управление ipfw через php"
Отправлено ARH665 , 05-Фев-11 20:40 
> Вот, еще нашел:
> "sudo can be executed without storing pass in a file
> system('echo "PASS" | sudo -u root -S COMMAND');"
> (http://docs.php.net/manual/en/function.shell-exec.php#101440)

блииин... даже не знаю в какую сторону курить, сайтом не понятно :(
есть хоть какая-нибудь наброска для php, что бы получить например ipfw show? Если не сложно?


"управление ipfw через php"
Отправлено михалыч , 06-Фев-11 15:21 
>> Вот, еще нашел:
>> "sudo can be executed without storing pass in a file
>> system('echo "PASS" | sudo -u root -S COMMAND');"
>> (http://docs.php.net/manual/en/function.shell-exec.php#101440)
> блииин... даже не знаю в какую сторону курить, сайтом не понятно :(
> есть хоть какая-нибудь наброска для php, что бы получить например ipfw show?
> Если не сложно?

Все гениальное просто. :)
Если стоит пакет sudo, тогда переходим ко вторй части марлезонского балета.
Если нет, то -
cd /usr/ports/security/sudo
make install clean
rehash
добавить в /usr/local/etc/sudoers
www     ALL=NOPASSWD: /sbin/ipfw
если надо добавить что-то еще - то готовить по вкусу

А теперь обещанная вторая часть

минимум
cat /usr/local/www/apache22/data/test.php

<html>
<body>
<?php
print "<pre>";
echo system("/usr/local/bin/sudo /sbin/ipfw show");
print "</pre>";
?>
</body>
</html>

Заходим, проверяем, любуемся :)
В качестве бонуса - exec() system() passthru() popen() и самое главное - escapeshellcmd()

Вот такие дела..


"управление ipfw через php"
Отправлено ARH665 , 06-Фев-11 18:12 
> Вот такие дела..

с виду просто, только я в итоге где-то накосячил, я менял группы и пользователей в httpd.conf

# User/Group: The name (or #number) of the user/group to run httpd as.
# It is usually good practice to create a dedicated user and group for
# running httpd, as with most system services.
#
User apache
Group apache

но ничего не проканало, все равно писал бэд пассворд, а сейчас поставил обратно www и www. Теперь ничего кроме hello, не выводит, даже на это:

hello!


<html>
<body>
<?php
print "<pre>";
echo system("/usr/local/bin/sudo ls /");
print "</pre>";
?>
<?php
exec('ls /');
?>


</body>
</html>

может кто сталкивался? где же я так накосячил-то...?

зы. а раньше выводил корень, и даже dmesg -a выводил...
зыы. а на
<?php
shell_exec('su');
shell_exec('12345');
?>

в dmesg выводит это:
Feb  6 18:16:46 srv2 su: BAD SU www to root on tty

это уже значит апач работает под пользователем www. Почему же он не выводит тогда правила и прочее теперь?

зыыы... нашел что то в дмесге, вот это выплевывает на скрипт (в начале сообщения):
Feb  6 18:25:11 srv2 sudo:      www : /usr/local/etc/sudoers is mode 0644, should be 0440 ; TTY=unknown ; PWD=/usr/local/www/apache22/data/hotspot ; COMMAND=ls
Feb  6 18:25:11 srv2 sudo:      www : no valid sudoers sources found, quitting ; TTY=unknown ; PWD=/usr/local/www/apache22/data/hotspot ; COMMAND=ls

что значит mode 0644, should be 0440 ? и где это моде наверное прописывается?


зыыыы. вот что в sudoers прописано:

www     ALL=NOPASSWD: /sbin/ipfw


"управление ipfw через php"
Отправлено михалыч , 06-Фев-11 18:20 
> с виду просто, только я в итоге где-то накосячил, я менял группы
> и пользователей в httpd.conf
> # User/Group: The name (or #number) of the user/group to run httpd
> as.
> # It is usually good practice to create a dedicated user and
> group for
> # running httpd, as with most system services.
> #
> User apache
> Group apache

Хмм..

Вообще-то, при стандартной установке апача из портов по дефолту
User www
Group www

Если от у вас apache
о в /usr/local/etc/sudoers
вместо
www     ALL=NOPASSWD: /sbin/ipfw
нужно
apache     ALL=NOPASSWD: /sbin/ipfw

но, в таком случае, пользователь apache должен быть в системе!


"управление ipfw через php"
Отправлено ARH665 , 06-Фев-11 18:29 
>[оверквотинг удален]
> Вообще-то, при стандартной установке апача из портов по дефолту
> User www
> Group www
> Если от у вас apache
> о в /usr/local/etc/sudoers
> вместо
> www     ALL=NOPASSWD: /sbin/ipfw
> нужно
> apache     ALL=NOPASSWD: /sbin/ipfw
> но, в таком случае, пользователь apache должен быть в системе!

это я понял, уже все сделал, может тупо сам апач переустановить... блин. за ним и пхп потянется и это еще мороки надолго, может тупо заменить httpd.conf? или где может быть косяк?

уже даже серв ребутнул, благо есть возможность


"управление ipfw через php"
Отправлено михалыч , 06-Фев-11 18:56 
>[оверквотинг удален]
>> о в /usr/local/etc/sudoers
>> вместо
>> www     ALL=NOPASSWD: /sbin/ipfw
>> нужно
>> apache     ALL=NOPASSWD: /sbin/ipfw
>> но, в таком случае, пользователь apache должен быть в системе!
> это я понял, уже все сделал, может тупо сам апач переустановить... блин.
> за ним и пхп потянется и это еще мороки надолго, может
> тупо заменить httpd.conf? или где может быть косяк?
> уже даже серв ребутнул, благо есть возможность

Вот это - 100% работает :)

<html>
<body>
<?php
print "<pre>";
echo system("man man | col -b");
print "</pre>";
?>
</body>
</html>


<html>
<body>
<?php
function message($msg){
    echo "$msg";
    flush();
}
message("<p>Results:<blockquote>");
$cmd=("ping -c5 ya.ru");
if (! $msg .= trim(nl2br(`ping -c5 ya.ru`)))
    $msg .= "</blockquote></p>";
message($msg);
?>
</body>
</html>


<html>
<body>
<?php
exec("ls -al .",$output);
foreach($output as $file)
    print "$file
";
?>
</body>
</html>


"управление ipfw через php"
Отправлено ARH665 , 06-Фев-11 18:51 
> Feb  6 18:25:11 srv2 sudo:      www
> : no valid sudoers sources found, quitting ; TTY=unknown ; PWD=/usr/local/www/apache22/data/hotspot
> ; COMMAND=ls

ну не знаю... может путь к бинарнику криво прописан?
но вот:

<html>
<body>
<?php
print "<pre>";
echo system("/usr/local/bin/sudo /sbin/ipfw show");
print "</pre>";
?>
</body>
</html>

srv2# whereis sudo
sudo: /usr/local/bin/sudo /usr/local/man/man8/sudo.8.gz /usr/ports/security/sudo


"управление ipfw через php"
Отправлено Trooper , 06-Фев-11 18:54 
>[оверквотинг удален]
> зыыы... нашел что то в дмесге, вот это выплевывает на скрипт (в
> начале сообщения):
> Feb  6 18:25:11 srv2 sudo:      www
> : /usr/local/etc/sudoers is mode 0644, should be 0440 ; TTY=unknown ;
> PWD=/usr/local/www/apache22/data/hotspot ; COMMAND=ls
> Feb  6 18:25:11 srv2 sudo:      www
> : no valid sudoers sources found, quitting ; TTY=unknown ; PWD=/usr/local/www/apache22/data/hotspot
> ; COMMAND=ls
> что значит mode 0644, should be 0440 ? и где это моде
> наверное прописывается?

chmod 0644 /usr/local/etc/sudoers

> зыыыы. вот что в sudoers прописано:
> www     ALL=NOPASSWD: /sbin/ipfw


"управление ipfw через php"
Отправлено михалыч , 06-Фев-11 18:59 
>[оверквотинг удален]
>> : /usr/local/etc/sudoers is mode 0644, should be 0440 ; TTY=unknown ;
>> PWD=/usr/local/www/apache22/data/hotspot ; COMMAND=ls
>> Feb  6 18:25:11 srv2 sudo:      www
>> : no valid sudoers sources found, quitting ; TTY=unknown ; PWD=/usr/local/www/apache22/data/hotspot
>> ; COMMAND=ls
>> что значит mode 0644, should be 0440 ? и где это моде
>> наверное прописывается?
> chmod 0644 /usr/local/etc/sudoers
>> зыыыы. вот что в sudoers прописано:
>> www     ALL=NOPASSWD: /sbin/ipfw

Протестите вышестоящие примеры, они безо всякого судо работают


"управление ipfw через php"
Отправлено ARH665 , 06-Фев-11 19:04 
> Протестите вышестоящие примеры, они безо всякого судо работают

Feb  6 19:02:35 srv2 sudo:      www : /usr/local/etc/sudoers is mode 0644, should be 0440 ; TTY=unknown ; PWD=/usr/local/www/apache22/data/hotspot ; COMMAND=/sbin/ipfw
Feb  6 19:02:35 srv2 sudo:      www : no valid sudoers sources found, quitting ; TTY=unknown ; PWD=/usr/local/www/apache22/data/hotspot ; COMMAND=/sbin/ipfw


chmod 0440 сделал для sudoers. вывело правила ipfw. спасибо друзья! теперь дуду курить как изменять правила :)



"управление ipfw через php"
Отправлено Alexander Sheiko , 06-Фев-11 21:26 
> chmod 0440 сделал для sudoers. вывело правила ipfw. спасибо друзья! теперь дуду
> курить как изменять правила :)

В sudo нужно задать список всех команд, что будут выполняться. Для себя я так делал:

cat /usr/local/etc/sudoers | grep ipfw
www ALL = NOPASSWD: /sbin/ipfw show
www ALL = NOPASSWD: /sbin/ipfw pipe show

cat ipfw.sh
#!/bin/sh

echo Content-type: text/plain
echo

/usr/local/bin/sudo /sbin/ipfw show

cat dummynet.sh
#!/bin/sh

echo Content-type: text/plain
echo

/usr/local/bin/sudo /sbin/ipfw pipe show

Скрипты выполняются апачем.


"управление ipfw через php"
Отправлено ARH665 , 06-Фев-11 22:16 
я решил пойти немного другим путем, может быть вопрос будет задан не там, но не подскажете, ли вы, как можно из формы, вытащить переменную и воспользоваться ею. Ну в общем кто не понял (хотя я думаю все не поняли;) ) я ввожу в поле номер пайпа, скорость, нажимаю кнопочку и все это изменяется. Чуть ниже тестовый скрипт, что бы тупо показывал номер пайпа из формы ввода. Так вот никак не могу скормить сюда: system("/usr/local/bin/sudo ipfw pipe $pipenum show"); номер пайпа.

Скриптик примерно такой вышел:
<html>
<body>

<FORM ENCTYPE="multipart/form-data" ACTION="bandwidth.php" METHOD=POST>
Pipe number: <INPUT NAME="pipenum" TYPE="text">


Bandwidth: <INPUT NAME="bw" TYPE="text">


<INPUT TYPE="submit" VALUE="Cnahge">
</FORM>

<?php

print "<pre>";
system("/usr/local/bin/sudo ipfw pipe $pipenum show");
print "</pre>";

?>


</body>
</html>

вот одно не ясно, как указать в команде system("/usr/local/bin/sudo ipfw pipe $pipenum show");, на месте $pipenum, что нужно взять число из формы ввода? Тут-то оно ясно, что сейчас $pipenum берется откуда-то из переменных в самой системе, а такой-то переменной и нет. Может тупо писать инфу из формы ввода в файл, а потом как-нибудь через echo писать в файл .sh комманду для фаервола и исполнять ее? но это уже вообще закручено. вообще голова не варит, сижу уже 4 часа, сообразить не могу, как это сделать, впринципе все просто, я уверен, но вот... догадаться не могу. Вообще, если обобщить: как взять из формы и передать это командой?

может взять переменную, сначала подставить system("/usr/local/bin/sudo ipfw pipe потом подклеить $pipenum и еще подклеить show"); и передать сразу уже на исполнение для system?

чем дальше иду, тем сильнее зарываюсь, вот что по мотивам http://www.lissyara.su/articles/freebsd/programms/hotspot/ вышло:


<html>
<body>

<FORM ENCTYPE="multipart/form-data" ACTION="bandwidth.php" METHOD=POST>
Pipe number: <INPUT NAME="pipenum" TYPE="text">


Bandwidth: <INPUT NAME="bw" TYPE="text">


<INPUT TYPE="submit" VALUE="Cnahge">
</FORM>

<?php
echo ($_POST["pipenum"]);
define('EXECUTE', "/usr/local/bin/sudo ipfw pipe %s show");
define('PIPENUMBER', $pipenum);
$command = sprintf(EXECUTE, PIPENUMBER);
print "<pre>";
system($command);
print "</pre>";
?>

</body>
</html>

теперь хоть что-то выводит, только все равно не то что нужно


"управление ipfw через php"
Отправлено ARH665 , 06-Фев-11 23:26 
короче вот, на этом закончилась моя фантазия, мозг и рабочий день:

<html>
<body>

<FORM ENCTYPE="multipart/form-data" ACTION="bandwidth.php" METHOD=POST>
Pipe number: <INPUT NAME="pipenum" TYPE="text">


Bandwidth: <INPUT NAME="bw" TYPE="text">


<INPUT TYPE="submit" VALUE="Cnahge">
</FORM>


<?php

define('DEBUG', true);
define('EXECUTE1', '/usr/local/bin/sudo ipfw pipe ');
define('EXECUTE2', '231');
define('EXECUTE3', ' show');
$command = sprintf(EXECUTE1, EXECUTE2, EXECUTE3);
print "<pre>";
system($command);
print "</pre>";
echo ($_POST["pipenum"]);

?>

</body>
</html>


по идее, введенное число в поле проходит через весь скрипт, и в итоге оказывается внизу, я тут попытался с помощью $command слепить 3 объявленные переменные и исполнить их )system($command); но увы, ничего не вышло :( с сожалением ложусь спать

зы. такое впечатление, что скрипт даже не выполняется!


и правда, не клеится скрипт почему-то, заработало вот так, но опять же без чтения из формы ввода:

<html>
<body>

<FORM ENCTYPE="multipart/form-data" ACTION="bandwidth.php" METHOD=POST>
Pipe number: <INPUT NAME="pipenum" TYPE="text">


Bandwidth: <INPUT NAME="bw" TYPE="text">


<INPUT TYPE="submit" VALUE="Cnahge">
</FORM>


<?php

define('DEBUG', true);
define('EXECUTE1', '/usr/local/bin/sudo ipfw pipe %s show');
define('EXECUTE2', '230');
define('EXECUTE3', 'pipe show');
$pipenum = EXECUTE2;
$command = sprintf(EXECUTE1, $pipenum);
print "<pre>";
system($command);
print "</pre>";
echo ($_POST["pipenum"]);

?>

</body>
</html>


в итоге прочитало пайп 230, блин, да как же вместо 230 подставить перемененную из поля ввода...


"управление ipfw через php"
Отправлено михалыч , 07-Фев-11 12:53 
>[оверквотинг удален]
> $command = sprintf(EXECUTE1, $pipenum);
> print "<pre>";
> system($command);
> print "</pre>";
> echo ($_POST["pipenum"]);
> ?>
> </body>
> </html>
> в итоге прочитало пайп 230, блин, да как же вместо 230 подставить
> перемененную из поля ввода...

Не знаю, что вы затеяли.. :), но наменяют они вам там скорость, ох и наменяют.
Хотя бы селектом в выпадающем списке задать конкретные значения и предлагать выбрать, а то ежели сами будут указывать, будут пихать в эту форму все-что ни попадя, небезопасно все это.

А так..

<html>
<body>

Show pipe?
<form method="post">
<input type="submit" value="OK" name="submit">
</form>

<?
if(isset($_POST['submit'])) pipeshow();

function pipeshow() {
        print "<pre>";
        echo system("/usr/local/bin/sudo /sbin/ipfw pipe show");
        print "</pre>";
}

print 'Chage bandwidth?
Enter number pipe and new bandwidth
<form method="post">
<table border="0">
<tr>
<td>PIPE</td>
<td><input type="text" name="pipe"></td>
</tr>
<tr>
<td>BW</td>
<td><input type="text" name="bw"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="OK"><input type="reset" value="reset"></td>
</tr>
</table>
</form>';

if(isset($_POST['pipe']) && isset($_POST['bw'])) {
        if(empty($pipe[pipe])) {echo "<font color=red>ENTER PIPE!</font>"; exit;}
        if(empty($bw[bw])) {echo "<font color=red>ENTER BW!</font>"; exit;}
        checkpipe($pipe,$bw);
}

function checkpipe($pipe,$bw) {
        $cmd = escapeshellcmd("$cmd");
        $cmd="/usr/local/bin/sudo /sbin/ipfw pipe $pipe show | grep $pipe:";
        exec($cmd,$ouput,$return);
        if($return==1) echo "<font color=red>PIPE NOT FOUND!</font>";
        elseif($return==0) changepipe($pipe,$bw);
}

function changepipe($pipe,$bw) {
        $cmd = escapeshellcmd("$cmd");
        $cmd="/usr/local/bin/sudo /sbin/ipfw pipe $pipe config mask dst-ip 0xffffffff bw $bw"."Kbit/s";
        echo $cmd;
        exec($cmd);
        echo "<p><font color=green>Bandwidth for pipe $pipe changed on $bw successfully!</font></p>";
}
?>
</body>
</html>


Но немного лучше вот так (хотя повторюсь, не знаю ваших задач, вам виднее)

<html>
<body>

Show pipe?
<form method="post">
<input type="submit" value="OK" name="submit">
</form>

<?
if(isset($_POST['submit'])) pipeshow();

function pipeshow() {
        print "<pre>";
        echo system("/usr/local/bin/sudo /sbin/ipfw pipe show");
        print "</pre>";
}

print 'Chage bandwidth?
Enter number pipe and new bandwidth
<form method="post">
<table border="0">
<tr>
<td>PIPE</td>
<td><input type="text" name="pipe"></td>
</tr>
<tr>
<td>BW</td>
<td>
<select name="bw">
<option></option>
<option>256</option>
<option>512</option>
</select>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="OK"><input type="reset" value="reset"></td>
</tr>
</table>
</form>';

if(isset($_POST['pipe']) && isset($_POST['bw'])) {
        if(empty($pipe[pipe])) {echo "<font color=red>ENTER PIPE!</font>"; exit;}
        if(empty($bw[bw])) {echo "<font color=red>ENTER BW!</font>"; exit;}
        checkpipe($pipe,$bw);
}

function checkpipe($pipe,$bw) {
        $cmd = escapeshellcmd("$cmd");
        $cmd="/usr/local/bin/sudo /sbin/ipfw pipe $pipe show | grep $pipe:";
        exec($cmd,$ouput,$return);
        if($return==1) echo "<font color=red>PIPE NOT FOUND!</font>";
        elseif($return==0) changepipe($pipe,$bw);
}

function changepipe($pipe,$bw) {
        $cmd = escapeshellcmd("$cmd");
        $cmd="/usr/local/bin/sudo /sbin/ipfw pipe $pipe config mask dst-ip 0xffffffff bw $bw"."Kbit/s";
        echo $cmd;
        exec($cmd);
        echo "<p><font color=green>Bandwidth for pipe $pipe changed on $bw successfully!</font></p>";
}
?>
</body>
</html>

То есть вся разница в формах.


"управление ipfw через php"
Отправлено ARH665 , 07-Фев-11 17:57 
превосходно, правда пайп не меняется ;) пишет ENTER PIPE! Надо покурить...

сделал даже тупо так:

<html>
<body>

Show pipe?
<form method="post">
<input type="submit" value="OK" name="submit">
</form>

<?php
if(isset($_POST['submit'])) pipeshow();

function pipeshow() {
        print "<pre>";
        echo system("/usr/local/bin/sudo /sbin/ipfw pipe show");
        print "</pre>";
}

print 'Chage bandwidth?
Enter number pipe and new bandwidth
<form method="post">
<table border="0">
<tr>
<td>PIPE</td>
<td><input type="text" name="pipe"></td>
</tr>
<tr>
<td>BW</td>
<td><input type="text" name="bw"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="OK"><input type="reset" value="reset"></td>
</tr>
</table>
</form>';

function changepipe($pipe,$bw) {
        $cmd = escapeshellcmd($cmd);
        $cmd="/usr/local/bin/sudo ipfw pipe $pipe config bw $bw"."Kbit/s";
        system($cmd);
        echo "<p><font color=green>Bandwidth for pipe $pipe changed on $bw successfully!</font></p>";
}
?>
</body>
</html>

все равно не меняет правила, что ж такое-то а...


"управление ipfw через php"
Отправлено михалыч , 07-Фев-11 18:10 
> превосходно, правда пайп не меняется ;) пишет ENTER PIPE! Надо покурить...

Так а пайп там и не меняется, изменяется только bw у pipe
Все пайпы заданы сразу же вначале (у меня во всяком случае).

А вприведенном примере просто проверяется существующий пайп, если он найден - можно сменить bw, а если pipe не найден - то отлуп.

Повторюсь, у меня сразу же при запуске фаервла

pipe 128 config mask dst-ip 0xffffffff bw 256Kbit/s
pipe 256 config mask dst-ip 0xffffffff bw 512Kbit/s
pipe 512 config mask dst-ip 0xffffffff bw 1024Kbit/s

номер пайпа сознательно так задан (изначально), чтобы легче ориентироваться по скорости (мне во всяком случае), а потом я могу, к примеру, ночью увеличить тупо в 2 раза скорость каждой трубы, ну или той которой мне нужно.


"управление ipfw через php"
Отправлено ARH665 , 07-Фев-11 18:23 
> Так а пайп там и не меняется, изменяется только bw у pipe

ну смотри, ввожу пайп и скорость тут:
<form method="post">
<table border="0">
<tr>
<td>PIPE</td>
<td><input type="text" name="pipe"></td>
</tr>
<tr>
<td>BW</td>
<td><input type="text" name="bw"></td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="OK"><input type="reset" value="reset"></td>
</tr>
</table>
</form>';

> Все пайпы заданы сразу же вначале (у меня во всяком случае).

у меня тоже в фаерволе цикл что-то типа:
p=4
while [ $p != 254 ]
do

${FwCMD} add pipe $p ip from not ${NetIn}/${NetMask} to 192.168.0.${p}
# Speed to all not in rules
${FwCMD} pipe $p config bw 256Kbit/s
(тра та-та, тра-та-та, и там где-то конец цикла, т.е. пайпы от 4 до 254 создались)

> А вприведенном примере просто проверяется существующий пайп, если он найден - можно
> сменить bw, а если pipe не найден - то отлуп.

пытаюсь поменять скорость у пайпа который ввел ($pipe), на скорость, которую ввел ($bw):

function changepipe($pipe,$bw) {
        $cmd = escapeshellcmd("$cmd");
        $cmd="/usr/local/bin/sudo ipfw pipe $pipe config bw $bw"."Kbit/s";
        system($cmd);
        echo "<p><font color=green>Bandwidth for pipe $pipe changed on $bw successfully!</font></p>";
}

в итоге echo даже не вываливается, жму ОК, и все. как будто обновил страницу

что значит тут:
> $cmd = escapeshellcmd("$cmd");

escapeshellcmd?

как с тобой связаться вне форума?


"управление ipfw через php"
Отправлено михалыч , 07-Фев-11 18:36 
>[оверквотинг удален]
>         $cmd = escapeshellcmd("$cmd");
>         $cmd="/usr/local/bin/sudo ipfw pipe $pipe
> config bw $bw"."Kbit/s";
>         system($cmd);
>         echo "<p><font color=green>Bandwidth for
> pipe $pipe changed on $bw successfully!</font></p>";
> }
> в итоге echo даже не вываливается, жму ОК, и все. как будто
> обновил страницу
> как с тобой связаться вне форума?

Я вроде exec а не system указывал в примере (разница между ними все-таки есть),
это во-первых, во-вторых, попробуй указать полный путь к ipfw , тоесть /sbin/ipfw
в консоли ipfw pipe show вывод что показывает?

или в моем примере кнопочкой показать пайпы вывод есть? Скопируй мой пример полностью, и проверь


"управление ipfw через php"
Отправлено ARH665 , 07-Фев-11 18:47 
> Я вроде exec а не system указывал в примере (разница между ними
> все-таки есть),
> это во-первых,

изменил обратно, думал нет разницы. косяк

> во-вторых, попробуй указать полный путь к ipfw , тоесть /sbin/ipfw

сделал, ниже покажу

> в консоли ipfw pipe show вывод что показывает?

все те, что создались циклом, все верно, и допустим среди них 111 пайп есть, над которым я экспериментирую
> или в моем примере кнопочкой показать пайпы вывод есть?

кусок:
00204: 256.000 Kbit/s    0 ms burst 0
q131276  50 sl. 0 flows (1 buckets) sched 65740 weight 0 lmax 0 pri 0 droptail
sched 65740 type FIFO flags 0x0 0 buckets 0 active
00136: 256.000 Kbit/s    0 ms burst 0
q131208  50 sl. 0 flows (1 buckets) sched 65672 weight 0 lmax 0 pri 0 droptail
sched 65672 type FIFO flags 0x0 0 buckets 0 active
00068: 256.000 Kbit/s    0 ms burst 0
q131140  50 sl. 0 flows (1 buckets) sched 65604 weight 0 lmax 0 pri 0 droptail
sched 65604 type FIFO flags 0x0 0 buckets 0 active
00205: 256.000 Kbit/s    0 ms burst 0
q131277  50 sl. 0 flows (1 buckets) sched 65741 weight 0 lmax 0 pri 0 droptail
sched 65741 type FIFO flags 0x0 0 buckets 0 active
00137: 256.000 Kbit/s    0 ms burst 0
q131209  50 sl. 0 flows (1 buckets) sched 65673 weight 0 lmax 0 pri 0 droptail
sched 65673 type FIFO flags 0x0 0 buckets 0 active
00069: 256.000 Kbit/s    0 ms burst 0
q131141  50 sl. 0 flows (1 buckets) sched 65605 weight 0 lmax 0 pri 0 droptail
sched 65605 type FIFO flags 0x0 0 buckets 0 active
00206: 256.000 Kbit/s    0 ms burst 0
q131278  50 sl. 0 flows (1 buckets) sched 65742 weight 0 lmax 0 pri 0 droptail
sched 65742 type FIFO flags 0x0 0 buckets 0 active
00138: 256.000 Kbit/s    0 ms burst 0
q131210  50 sl. 0 flows (1 buckets) sched 65674 weight 0 lmax 0 pri 0 droptail
sched 65674 type FIFO flags 0x0 0 buckets 0 active


> Скопируй мой пример полностью, и проверь

скопировал тупо полностью, только вначале вместо <? добавил <?php. У меня короткие теги не понимает:
в итоге выводит мне: ENTER PIPE! Какие догадки?


>if(isset($_POST['pipe']) && isset($_POST['bw'])) {
>        if(empty($pipe[pipe])) {echo "<font color=red>ENTER PIPE!</font>"; exit;
>        if(empty($bw[bw])) {echo "<font color=red>ENTER BW!</font>"; exit;}
>        checkpipe($pipe,$bw);

но они ведь не empty. собственноручно туда забивал пайп 111 и скорость 512...

попробовал в другом браузере, то же самое


"управление ipfw через php"
Отправлено михалыч , 07-Фев-11 18:57 
>[оверквотинг удален]
> lmax 0 pri 0 droptail
>  sched 65742 type FIFO flags 0x0 0 buckets 0 active
> 00138: 256.000 Kbit/s    0 ms burst 0
> q131210  50 sl. 0 flows (1 buckets) sched 65674 weight 0
> lmax 0 pri 0 droptail
>  sched 65674 type FIFO flags 0x0 0 buckets 0 active
>> Скопируй мой пример полностью, и проверь
> скопировал тупо полностью, только вначале вместо <? добавил <?php. У меня короткие
> теги не понимает:
> в итоге выводит мне: ENTER PIPE! Какие догадки?

Хм.. ну если так пишет - тогда и нужно указать в поле PIPE тот пайп с которым эксперимент, то есть 111
навсякий случай, кидаю абсолютно рабочий код (проверил), кидаю в тегах коде

<html>
<body>


Show pipe?
<form method="post">
<input type="submit" value="OK" name="submit">
</form>


<?php
if(isset($_POST['submit'])) pipeshow();

function pipeshow() {
        print "<pre>";
        echo system("/usr/local/bin/sudo /sbin/ipfw pipe show");
        print "</pre>";
}


print 'Chage bandwidth?<br />
Enter number pipe and new bandwidth
<form method="post">
<table border="0">
<tr>
<td>PIPE</td>
<td><input type="text" name="pipe"></td>
</tr>
<tr>
<td>BW</td>
<td>
<select name="bw">
<option></option>
<option>256</option>
<option>512</option>
</select>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="OK"><input type="reset" value="reset"></td>
</tr>
</table>
</form>';


if(isset($_POST['pipe']) && isset($_POST['bw'])) {
        if(empty($pipe[pipe])) {echo "<font color=red>ENTER PIPE!</font>"; exit;}
        if(empty($bw[bw])) {echo "<font color=red>ENTER BW!</font>"; exit;}
        checkpipe($pipe,$bw);
}


function checkpipe($pipe,$bw) {
        $cmd = escapeshellcmd("$cmd");
        $cmd="/usr/local/bin/sudo /sbin/ipfw pipe $pipe show | grep $pipe:";
        exec($cmd,$ouput,$return);
        if($return==1) echo "<font color=red>PIPE NOT FOUND!</font>";
        elseif($return==0) changepipe($pipe,$bw);
}


function changepipe($pipe,$bw) {
        $cmd = escapeshellcmd("$cmd");
        $cmd="/usr/local/bin/sudo /sbin/ipfw pipe $pipe config mask dst-ip 0xffffffff bw $bw"."Kbit/s";
        echo $cmd;
        exec($cmd);
        echo "<p><font color=green>Bandwidth for pipe $pipe changed on $bw successfully!</font></p>";
}
?>

</body>
</html>



"управление ipfw через php"
Отправлено ARH665 , 07-Фев-11 18:59 
> Хм.. ну если так пишет - тогда и нужно указать в поле
> PIPE тот пайп с которым эксперимент, то есть 111

так указываю ведь - 111

> навсякий случай, кидаю абсолютно рабочий код (проверил), кидаю в тегах коде:

я проклят, пишет ENTER PIPE!

мош в конфиге апача или php что криво прописано уже, а? сделал php.ini по умолчанию, ребутнул апач, нифига

какая версия php у вас установлена?


"управление ipfw через php"
Отправлено михалыч , 07-Фев-11 19:20 
>> Хм.. ну если так пишет - тогда и нужно указать в поле
>> PIPE тот пайп с которым эксперимент, то есть 111
> так указываю ведь - 111
>> навсякий случай, кидаю абсолютно рабочий код (проверил), кидаю в тегах коде:
> я проклят, пишет ENTER PIPE!
> мош в конфиге апача или php что криво прописано уже, а? сделал
> php.ini по умолчанию, ребутнул апач, нифига
> какая версия php у вас установлена?

Добейтесь, чтобы работало вот это
<html>
<body>
<?php
print '<form method="post">
PIPE<input type="text" name="pipe">
BW<select name="bw">
<option></option>
<option>256</option>
<option>512</option>
</select>
<input type="submit" value="OK">
</form>';

if(isset($_POST['pipe'])){
        $pipe=$_POST['pipe'];
        echo "pipe=$pipe";
}
echo "<br/>";
if(isset($_POST['bw'])){
        $bw=$_POST['bw'];
        echo "bw=$bw";
}
?>
</body>
</html>

PHP 5.3.4 Apache/2.2.17


"управление ipfw через php"
Отправлено ARH665 , 07-Фев-11 19:29 
выводит:

pipe=111
bw=512

все нормально, что дальше?


"управление ipfw через php"
Отправлено михалыч , 07-Фев-11 19:41 
> выводит:
> pipe=111
> bw=512
> все нормально, что дальше?

значит работает..

в этом коде (если все будет работать), уберите echo (там для проверки, чтобы вы проконтролировать переменные могли)

<html>
<body>

Show pipe?
<form method="post">
<input type="submit" value="OK" name="submit">
</form>

<?php
if(isset($_POST['submit'])) pipeshow();

function pipeshow() {
        print "<pre>";
        echo system("/usr/local/bin/sudo /sbin/ipfw pipe show");
        print "</pre>";
}

print 'Chage bandwidth?<br/>Enter number pipe and new bandwidth
<form method="post">
<table border="0">
<tr>
<td>PIPE</td>
<td><input type="text" name="pipe"></td>
</tr>
<tr>
<td>BW</td>
<td>
<select name="bw">
<option></option>
<option>256</option>
<option>512</option>
</select>
</td>
</tr>
<tr>
<td></td>
<td><input type="submit" value="OK"><input type="reset" value="reset"></td>
</tr>
</table>
</form>';

if(isset($_POST['pipe']) && isset($_POST['bw'])) {
        echo $pipe=$_POST['pipe'];
        echo $bw=$_POST['bw'];
        if(empty($pipe[pipe])) {echo "<font color=red>ENTER PIPE!</font>"; exit;}
        if(empty($bw[bw])) {echo "<font color=red>ENTER BW!</font>"; exit;}
        checkpipe($pipe,$bw);
}

function checkpipe($pipe,$bw) {
        $cmd = escapeshellcmd("$cmd");
        $cmd="/usr/local/bin/sudo /sbin/ipfw pipe $pipe show | grep $pipe:";
        exec($cmd,$ouput,$return);
        if($return==1) echo "<font color=red>PIPE NOT FOUND!</font>";
        elseif($return==0) changepipe($pipe,$bw);
}

function changepipe($pipe,$bw) {
        $cmd = escapeshellcmd("$cmd");
        $cmd="/usr/local/bin/sudo /sbin/ipfw pipe $pipe config mask dst-ip 0xffffffff bw $bw"."Kbit/s";
        echo $cmd;
        exec($cmd);
        echo "<p><font color=green>Bandwidth for pipe $pipe changed on $bw successfully!</font></p>";
}
?>
</body>
</html>


"управление ipfw через php"
Отправлено ARH665 , 07-Фев-11 21:25 
> значит работает..

ААА! Спасибо! Заработало! Вот какой косяк был, не знаю :(


"управление ipfw через php"
Отправлено михалыч , 07-Фев-11 21:33 
>> значит работает..
> ААА! Спасибо! Заработало! Вот какой косяк был, не знаю :(

Получается, что в этом: добавлено только -
echo $pipe=$_POST['pipe'];
echo $bw=$_POST['bw'];

ну и нужно эхо убрать и оставить только
$pipe=$_POST['pipe'];
$bw=$_POST['bw'];


"управление ipfw через php"
Отправлено ARH665 , 08-Фев-11 11:48 
а как бы скриптом отредактировать к примеру /etc/firewall.conf и сохранить изменения?
понимаю, что надо взять другую форму ввода, вывести в нее файл, а потом записать файл...


"управление ipfw через php"
Отправлено михалыч , 08-Фев-11 20:32 
> а как бы скриптом отредактировать к примеру /etc/firewall.conf и сохранить изменения?
> понимаю, что надо взять другую форму ввода, вывести в нее файл, а
> потом записать файл...

Несекьюрно все это, но если очень хочется - то можно.. ))


"управление ipfw через php"
Отправлено ARH665 , 08-Фев-11 22:23 
>> а как бы скриптом отредактировать к примеру /etc/firewall.conf и сохранить изменения?
>> понимаю, что надо взять другую форму ввода, вывести в нее файл, а
>> потом записать файл...
> Несекьюрно все это, но если очень хочется - то можно.. ))

не, что не секьюрно знаю. несекьюрно было вообще, когда я сделал

> добавить в /usr/local/etc/sudoers
> www     ALL=NOPASSWD: /sbin/ipfw

:)
а правда, как сделать? может подкинете хотя бы идею, я постораюсь докурить сам


"управление ipfw через php"
Отправлено михалыч , 10-Фев-11 01:16 
>>> а как бы скриптом отредактировать к примеру /etc/firewall.conf и сохранить изменения?
>>> понимаю, что надо взять другую форму ввода, вывести в нее файл, а
>>> потом записать файл...
>> Несекьюрно все это, но если очень хочется - то можно.. ))
> не, что не секьюрно знаю. несекьюрно было вообще, когда я сделал
>> добавить в /usr/local/etc/sudoers
>> www     ALL=NOPASSWD: /sbin/ipfw
> :)
> а правда, как сделать? может подкинете хотя бы идею, я постораюсь докурить
> сам

Посмотрим, что можно сделать..


"управление ipfw через php"
Отправлено михалыч , 10-Фев-11 20:52 
> а правда, как сделать? может подкинете хотя бы идею, я постораюсь докурить сам

Подкидываю.. )
Смотреть как сделаны на php гостевые книги, новостные ленты, публикаторы, форумы и т.д. и т.п.
Там много чему можно поучиться, примеров масса.
Но только для чего все это? КПД? Вот правда, непонимаю, ну откройте мне секрет, ответьте на сакраментальный вопрос, - А зачем это надо? В чём потаённый и глубинный смысл?
Ведь намного легче (быстрее, безопаснее, гибче - вставить по вкусу) все что хотите сделать через веб, можно сделать и через консоль, пусть и удаленную.

> не, что не секьюрно знаю. несекьюрно было вообще, когда я сделал
>> добавить в /usr/local/etc/sudoers
>> www     ALL=NOPASSWD: /sbin/ipfw

А не согласен я с этим ))
У меня так сделано, но одно дело, когда правила фаервола ВЫПОЛНЯЮТСЯ через веб (для биллинга, иногда, нужно) и совсем другое дело, когда эти же самые правила, не только ВЫПОЛНЯЮТСЯ, но ещё и РЕДАКТИРУЮТСЯ через веб!

Как насчет безопасности в таком случае?
Ведь гораздо легче по ssh отредактировать и запустить что нужно!

Или всё это только для того, что бы поиграться? Так уж лучше установить webmin и usermin,
раздать нужные права да и рулить через веб, если сильно хочется.
Или вообще, установить себе webshell на php или perl (опять же для чего себе-то?)

Короче, попробовал, я тут набросать чего-то там, проверил наскорую руку, но потом тормознул, ибо встают вопросы безопасности, хотябы со стороны веб-сервера apache, самого php (сессии, куки), встают вопросы резервирования, а ну как запорете конфиг фаервола и что потом? Одним словом, чем дальше в лес, тем ну его на фиг! ))

Или снова изобретать велосипед?

Мой ответ - лучше удаленки по ssh ничего нету.
Даже по мобиле рулить можно, при желании.

Вот, такие дела..


"управление ipfw через php"
Отправлено ARH665 , 10-Фев-11 21:39 
> Но только для чего все это? КПД? Вот правда, непонимаю, ну откройте
> мне секрет, ответьте на сакраментальный вопрос, - А зачем это надо?
> В чём потаённый и глубинный смысл?

хы. респект за речь :) ну собственно смысл, может быть глупо, но мне удобнее рулить фаерволом через веб. зашел на нужную страничку, вписал айпишник - оп, пользователю в инет доступ заблокирован. т.е. не надо писать ipfw add fwd ... ... ... ... php скрипт сделает это за меня, впринципе самое интересное я уже сделал, но вот теперь такая беда, у меня (конечно неправильно это, но мне так удобно) есть скрипт резки скорости на IP адреса под шлюзом, который работает по времени (по крону). Скрипта 4 штуки на разное время суток. Каждый из этих скриптов в определенное время суток копирует rc.firewall-01-09 в /etc/rc.firewall и ребутает правила фаервола. А rc.firewall'ов соответственно 4, так вот, например надо мне добавить пользователя, что бы не править все 4 файла с конфигами, удобнее было бы забить в php коде, добавить пользователя такого-то с такой-то входящей и исходящей скоростью. Удобно ведь? Чем лезть в консоль, вводить пароль, вводить su. проходить в директорию, ee конфиг и т.д., ведь это может сделать за тебя скрипт php с заранее записанными в нем действиями, а что бы левые не зашли в веб интерфейс управления ipfw, можно защитить каталог паролем, причем можно защитить каждый файл на сервере паролем. Еще играет роль интерес к php и интерес к написанию этого всего (скорее всего сам процесс написания и моральное удовлетворение от получившегося) :) вот

> Или вообще, установить себе webshell на php или perl (опять же для
> чего себе-то?)

кроме вебмина, какой вебшел посоветуете?

> Короче, попробовал, я тут набросать чего-то там, проверил наскорую руку, но потом
> тормознул, ибо встают вопросы безопасности, хотябы со стороны веб-сервера apache, самого
> php (сессии, куки), встают вопросы резервирования, а ну как запорете конфиг
> фаервола и что потом? Одним словом, чем дальше в лес, тем
> ну его на фиг! ))

дайте наброски, если не жалко =)

> Или снова изобретать велосипед?

я это люблю, как Вы заметили :)


"управление ipfw через php"
Отправлено михалыч , 11-Фев-11 00:20 
> т.е. не надо писать ipfw add fwd ... ... ... ... php скрипт сделает это за меня

Вроде речь в предыдущих постах шла немного не об этом, я так думал, что надо просто редактировать основной скрипт ipfw для себя (rc.firewall для примера или какой-либо ещё)
Правила типа ipfw add таки все равно придется писать ручками )) о всяком случае в моем примере.

> дайте наброски, если не жалко =)

Не вопрос, только хочу заметить, то, что выкладываю, рабочий вариант, не лишенный недостатков )), но это скорее всего, как пример, как вариант, не более. Не претендует на исключительность и полноту. ))
Там начисто не проработан механизм защиты, нет авторизации.
Вход по паролю, кукисы, сесии и защиту на файла на стороне apache оставляю в качестве домашнего задания. Можно (нужно, лучше) повесить и входить в отдельный вирт хост по https хотя бы с разрешенных ip (прописать на стороне апача)
Если вас ломанут, автор ответственности не несет, и т.д. и т.п. )) ну типа там распространяется как есть, без гарантий и тому подобное =)
Еще раз заявляю - это не руководство к действию, это лишь как пример, но может кому-либо и где-то пригодится.
Считайте, что вас предупредили!

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=koi8-r"/>
<title>Редактирование правил фаервола IPFW</title>
<style type="text/css">
    body {font-family: Arial, Verdana;}
    select {font: Verdana, Arial; background: GreenYellow;}
    .d {font: Verdana, Arial; background: DeepPink;}
    input {font: Verdana, Arial;}
    textarea {font: "Lucida Console"; background: Seashell;}
</style>
</head>
<body>

<script language="javascript">
function del(theform){
    var c=theform.filecur;
    if (confirm("Are you sure?")) {
        alert("DELETED");
        return true;
    }
    else {
        alert("OTMEHEHO");
        c.focus();
        return false;
    }
}
</script>

<?php
// ОСНОВНАЯ ДИРЕКТОРИЯ
$dirmain="/etc";
// ДИРЕКТОРИЯ ДЛЯ БЭКАПА КОНФИГА IPFW
$dirbak="$dirmain/fwrulesbak";
// ОСНОВНОЙ КОНФИГУРАЦИОННЫЙ ФАЙЛ
$fileconf="rc.firewall";
$filemain="$dirmain/$fileconf";
?>

Loading for edit the main or backup configuration file IPFW firewall rules?

<table cellpadding="3" cellspacing="2" border="0">
  <tr>
    <td>
      <font color="blue">Load MAIN</font>
    </td>
    <td>
      <font color="green">Load BACKUP</font>
    </td>
    <td>
      <font color="red">Delete BACKUP</font>
    </td>
  </tr>
  <tr>
    <td>
      <form method="post">
      <input type="hidden" name="actionflag" value="loading">
      <input type="hidden" name="dircur" value="/etc">
      <input type="hidden" name="filecur" value=<?=$fileconf?>>
      <input type="submit" value="OK" name="loadmain">
      </form>
    </td>
    <td>
      <form method="post">
      <select name="filecur">
<?php
// ДЕЛАЕМ ВЫБОРКУ КОНФИГУРАЦИОННЫХ ФАЙЛОВ ИЗ ДИРЕКТОРИИ БЭКАПА
// ДЛЯ ВЫБОРОЧНОЙ ЗАГРУЗКИ И ДАЛЬНЕЙШЕГО РЕДАКТИРОВАНИЯ
if ($handle=opendir($dirbak)) {
    while (false!==($file=readdir($handle))) {
        if (!is_dir("$dirbak/$file") && $file!='.' && $file!='..') {
            print "<option value='$file'>".$file."</option>";
        }
    }
closedir($handle);
}
?>
      </select>
      <input type="hidden" name="dircur" value=<?php print $dirbak;?>>
      <input type="hidden" name="actionflag" value="loading">
      <input type="submit" value="OK" name="loadbackup">
      </form>
    </td>
    <td>
      <form method="post" onSubmit="return del(this)">
      <select name="filecur" class="d">
<?php
// ДЕЛАЕМ ВЫБОРКУ КОНФИГУРАЦИОННЫХ ФАЙЛОВ ИЗ ДИРЕКТОРИИ БЭКАПА ДЛЯ УДАЛЕНИЯ НУЖНОГО ФАЙЛА
if ($handle=opendir($dirbak)) {
    while (false!==($file=readdir($handle))) {
        if (!is_dir("$dirbak/$file") && $file!='.' && $file!='..') {
            print "<option value='$file'>".$file."</option>";
        }
    }
closedir($handle);
}
?>
      </select>
      <input type="hidden" name="action" value="remove">
      <input type="submit" value="OK" name="deletebackup">
      </form>
    </td>
  </tr>
</table>

<p><input type="button" value="BACK" onClick="javascript:history.go(-1)"></p>

<?php
// ЕСЛИ ПРИШЕЛ ОТВЕТ, ЧТО РЕДАКТИРОВАТЬ НЕ БУДЕМ - ВЫВАЛИВАЕМСЯ В НАЧАЛО
if (isset($_POST['nowriterules'])) $nowriterules=$_POST['nowriterules'];

// ЕСЛИ ПРИШЕЛ ОТВЕТ, ЧТО ЗАГРУЖАЕМ ДЛЯ РЕДАКТИРОВАНИЯ ФАЙЛ
// ИЛИ ОСНОВНОЙ ИЛИ ИЗ БЭКАПА
if(isset($_POST['actionflag'])) {
    $actionflag=$_POST['actionflag'];

    $dircur=$_POST['dircur'];

    if(isset($_POST['loadmain'])) {
        $filecur="$fileconf";
    }
    if (isset($_POSST['loadbackup'])) {
        $filecur=$_POST['filecur'];
    }
    $filelist="$dircur/$filecur";
    $fp=fopen("$filelist","r") or die("<font color=red>Couldn't open $file! No file or no rights?");
    $fwcon=file_get_contents(trim($filelist));
    fclose($fp);

    print "<form method=\"post\">
    <textarea name=\"fwconf\" rows=\"20\" cols=\"100\">";
    echo $fwcon;
    print "</textarea>
    <br/>
    Write new rules?
    <input type=\"hidden\" value=\"$filecur\" name=\"filecur\">
    <input type=\"hidden\" value=\"$dircur\" name=\"dircur\">
    <input type=\"submit\" value=\"OK\" name=\"writerules\">
    <input type=\"submit\" value=\"NO\" name=\"nowriterules\">
    </form>";
}

// ЕСЛИ ПРИШЛО ПОДТВЕРЖДЕНИЕ, ЧТО ЗАПИСЫВАТЬ ОТРЕДАКТИРОВАННЫЙ ФАЙЛ БУДЕМ
if(isset($_POST['writerules']) and isset($_POST['fwconf'])) {
    $writerules=$_POST['writerules'];
    $fwconf=$_POST['fwconf'];
    $filecur=$_POST['filecur'];
    $dircur=$_POST['dircur'];
    if(empty($fwconf)) {echo "<font color=red><b>PANIC! YOU ARE IDIOT? EMPTY RULES NOT WRITING!</b></font>"; exit;}
    createbackup($dirbak,$filemain,$dircur,$filecur,$fileconf); // ВЫЗЫВАЕМ ФУНКЦИЮ ДЛЯ СОЗДАНИЯ БЭКАПА ФАЙЛА И ДИРЕКТОРИИ ДЛЯ БЭКАПА
    filewrite($fwconf,$filemain);
}

// ЕСЛИ ПРИШЕЛ ОТВЕТ, ЧТО УДАЛЯЕМ ВЫБРАННЫЙ ФАЙЛ ИЗ БЭКАПА
//if(isset($_POST['deletebackup']) and isset($_POST['filecur'])) {
//echo    $deletebackup=$_POST['deletebackup'];
if(isset($_POST['action'])) {
    $action=$_POST['action'];
    if($action=="remove"){
    $file=$_POST['filecur'];
    deletefile($dirbak,$file); // ВЫЗЫВАЕМ ФУНКЦИЮ ДЛЯ УДАЛЕНИЯ ФАЙЛА
    }
}

// ФУНКЦИЯ СОЗДАНИЯ БЭКАПОВ
function createbackup($dirbak,$filemain,$dircur,$filecur,$fileconf) {
    if(!$dh=opendir($dirbak)) { // ЕСЛИ НЕ МОЖЕМ ОТКРЫТЬ ДИРЕКТОРИЮ БЭКАПА ИЛИ НЕ СУЩЕСТВУЕТ
        $cmdmd=escapeshellcmd($cmdmd);
        $cmdmd="/usr/local/bin/sudo /bin/mkdir $dirbak";
        exec($cmdmd,$ouput,$return);
        if($return==1) print "<font color=red>Can't create directory <b>$dirbak</b> for the backup!<br/>
        In files sudoers next line <u>/usr/local/bin/sudo /bin/mkdir</u> is not added?</font><br/>";
        elseif($return==0) echo "<font color=green>Created directory <b>$dirbak</b> for the backup sucessfully!</font>";
    }
    $cmdcp=escapeshellcmd($cmdcp);
    $cmdcp="/usr/local/bin/sudo /bin/cp $dircur/$filecur /tmp/$fileconf && /usr/local/bin/sudo /bin/mv /tmp/$fileconf $dirbak/$fileconf".".".date("Y-m-d_H:i:s");
    exec($cmdcp,$ouput,$return);
    if($return==1) print "<font color=red>Can't copy file <b>$filecur</b> in the backup directory <b>$dirbak</b>!<br/>
    In files sudoers next line <u>/usr/local/bin/sudo /bin/cp</u> is not added?</font><br/>";
    elseif($return==0) {
        echo "<font color=green>Copy file <b>$filecur</b> in the backup directory <b>$dirbak</b> sucessfully!<br/></font>";
    }
}

// ФУНКЦИЯ ЗАПИСИ ОТРЕДАКТИРОВАННОГО КОНФИГА В ФАЙЛ
function filewrite($fwconf,$filemain) {
    $cmdto=escapeshellcmd($cmdto);
    $cmdto="/usr/local/bin/sudo /usr/sbin/chown www $filemain";
    exec($cmdto,$ouput,$return);
    if($return==1) echo "<font color=red>Can't change the file <b>$filemain</b> owner on <b>www</b>!</font><br/>
    In files sudoers next line <u>/usr/local/bin/sudo /usr/sbin/chown</u> is not added?</font><br/>";
    elseif($return==0) echo "<font color=green>Changed the file <b>$filemain</b> owner on <b>www</b> for writing sucessfully!<br/></font>";
    $fp=fopen($filemain,"w+") or die("<font color=red>Couldn't open <b>$filemain</b>! No file or no rights?</font>"); // МАТЕРИМСЯ, ЕСЛИ НЕ МОЖЕМ ОТКРЫТЬ ФАЙЛ
    flock($fp,LOCK_EX);                         // БЛОКИРУЕМ ФАЙЛ (ВНИМАНИЕ! БЛОКИРОВКА НЕ ПОЛНАЯ! ТОЛЬКО СРЕДСТВАМИ PHP, ОТ UNIX НЕ СПАСЕТ!)
    $fwconf=str_replace("\r\n","\n",$fwconf);   // ЗАМЕНА ПЕРЕХОДА СТРОКИ И ВОЗВРАТА КАРЕТКИ ИЗ WINDOWS НА UNIX
    $fwconf=trim($fwconf);                      // ЧИСТИМ ФАЙЛ, УДАЛЯЕМ ПРОБЕЛЫ И ТАБЫ, НА ВСЯКИЙ СЛУЧАЙ
    fwrite($fp,$fwconf);                        // ПИШЕМ В ФАЙЛ
    flock($fp,LOCK_UN);                         // СНИМАЕМ БЛОКИРОВКУ С ФАЙЛА
    fclose($fp);                                // ЗАКРЫВАЕМ
    $cmdbak="/usr/local/bin/sudo /usr/sbin/chown root $filemain";
    exec($cmdbak,$ouput,$return);
    if($return==1) echo "<font color=red>Can't change the file <b>$filemain</b> owner back on <b>root</b>!</font><br/>
    <b>PANIC! UNKNOWN ERROR!</b>";
    elseif($return==0) echo "<font color=green>Changed the file <b>$filemain</b> owner back on <b>root</b> for security sucessfully!<br/></font>";
    echo "<font color=green>Write new rules successfully! Congratulation! <b>YES!</b></font>";
    // АВТОПЕРЕХОД С ЗАДЕРЖКОЙ 3 СЕКУНДЫ ДЛЯ ОБНОВЛЕНИЯ ВЫПАДАЮЩЕГО СПИСКА СЕЛЕКТ
    echo "<META HTTP-EQUIV=Refresh CONTENT=\"3; URL=./conf3.php\">"; // ВМЕСТО conf3.php ВСТАВИТЬ СВОЮ СТРАНИЦУ
}

// ФУНКЦИЯ УДАЛЕНИЯ ФАЙЛА ИЗ ДИРЕКТОРИИ БЭКАПА
// СДЕЛАНА С ИСПОЛЬЗОВАНИЕМ РОДНОГО UNIX ШЕЛА, ИБО И ТАК ГЕМОРНО, А ИНАЧЕ ЕЩЕ И ПРАВА НА ДИРЕКТОРИЮ БЭКАПА И ФАЙЛЫ УСТАНАВЛИВАТЬ
function deletefile($dirbak,$file) {
    $cmddel=escapeshellcmd($cmddel);
    $cmddel="/usr/local/bin/sudo /bin/rm $dirbak/$file";        // САМА КОМАНДА НА УДАЛЕНИЕ ФАЙЛА
    exec($cmddel,$ouput,$return);                               // УДАЛЯЕМ ФАЙЛ
    if($return==1) echo "<font color=red>Can't delete file <b>$file</b> from directory <b>$dirbak</b>!<br/>
    In files sudoers next line <u>/usr/local/bin/sudo /bin/rm</u> is not added?</font><br/>";
    elseif($return==0) {
        print "<font color=green>Deleted files <b>$file</b> from directory <b>$dirbak</b> sucessfully!<br/></font>";

        echo "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=koi8-r\">
        <script language=\"JavaScript\">
        alert(\"Deleted files $file from directory $dirbak sucessfully!\");
        </script>";
        // АВТОПЕРЕХОД
        echo "<META HTTP-EQUIV=Refresh CONTENT=\"0; URL=./conf3.php\">"; // ВМЕСТО conf3.php ВСТАВИТЬ СВОЮ СТРАНИЦУ
//      header("Location: $_SERVER[PHP_SELF]");
    }
}
?>

</body>
</html>


"управление ipfw через php"
Отправлено ARH665 , 11-Фев-11 08:08 
> Вроде речь в предыдущих постах шла немного не об этом, я так
> думал, что надо просто редактировать основной скрипт ipfw для себя (rc.firewall
> для примера или какой-либо ещё)

просто поняв, что можно управлять, из веба, разыгрался аппетит

> Если вас ломанут, автор ответственности не несет, и т.д. и т.п. ))
> ну типа там распространяется как есть, без гарантий и тому подобное

со всем согласен, где поставить галочку? ;)

> {echo "PANIC! YOU ARE IDIOT? EMPTY > RULES NOT WRITING!"; exit;}

:)

спасибо большое, будем курить!
зы. кстати сделал проще, запретил доступ к этим скриптам из WAN, а разрешил только из LAN. А к локалке подключаюсь по впн, врядли кто-то изнутри сетки захочет играться с фаерволом


"управление ipfw через php"
Отправлено михалыч , 12-Фев-11 14:18 
>[оверквотинг удален]
> просто поняв, что можно управлять, из веба, разыгрался аппетит
>> Если вас ломанут, автор ответственности не несет, и т.д. и т.п. ))
>> ну типа там распространяется как есть, без гарантий и тому подобное
> со всем согласен, где поставить галочку? ;)
>> {echo "PANIC! YOU ARE IDIOT? EMPTY > RULES NOT WRITING!"; exit;}
>  :)
> спасибо большое, будем курить!
> зы. кстати сделал проще, запретил доступ к этим скриптам из WAN, а
> разрешил только из LAN. А к локалке подключаюсь по впн, врядли
> кто-то изнутри сетки захочет играться с фаерволом


"управление ipfw через php"
Отправлено михалыч , 12-Фев-11 18:14 
Я тут шлифанул свой код немного. Все же безопасность превыше всего, ибо в нашем деле лучше перебздеть, чем не добздеть..
Короче, изобрел в очередной раз колесо..
Доп инфа в коментах

<?php
session_start();
session_register("authoriz");
$authoriz=$_SESSION['authoriz'];
?>

<html>
<head>
<meta http-equiv="content-type" content="text/html; charset=koi8-r"/>
<title>Редактирование правил фаервола IPFW</title>
<style type="text/css">
    body {font-family: Arial, Verdana;}
    select {font: Verdana, Arial; background: GreenYellow;}
    .d {font: Verdana, Arial; background: DeepPink;}
    input {font: Verdana, Arial;}
    input.login-pass {width: 150px}
    textarea {font: "Lucida Console"; background: Seashell;}
</style>
</head>
<body>

<script language="javascript">
function del(theform){
    var c=theform.filecur;
    if (confirm("Are you sure?")) {
        alert("DELETED");
        return true;
    }
    else {
        alert("OTMEHEHO");
        c.focus();
        return false;
    }
}
</script>

<?

if(isset($_POST['logout'])) logout();

// ЛОГИН И ПАРОЛЬ
$login="admin";
// ЭТО ЛИШЬ ПРИМЕР ЗАШИФРОВАННОГО ПАРОЛЯ (passwd) АЛГОРИТМОМ MD5
// САМЫМ НАСТОЯТЕЛЬНЫМ ОБРАЗОМ КРАЙНЕ РЕКОМЕНДУЕТСЯ УКАЗАТЬ СВОЙ ПАРОЛЬ
// ВО ИЗБЕЖАНИИ, ТАК СКАЗАТЬ, САМЫХ НЕГАТИВНЫХ ПОСЛЕДСТВИЙ :))
$password="76a2173be6393254e72ffa4d6df1030a";

if($authoriz!=1) step($login,$password);
else protection();

function step($login,$password) {
    print "<b>Authorization</b>
    <form method=\"post\">
    <table cellspacing=\"5\" cellpadding=\"3\" border=\"0\">
        <tr>
            <td align=\"right\">login</td>
            <td><input class=\"login-pass\" type=\"text\" name=\"name\" value=\"\"></td>
        </tr>
        <tr>
            <td align=\"right\">password</td>
            <td><input class=\"login-pass\" type=\"password\" name=\"pass\" value=\"\"></td>
        </tr>
            <input type=\"hidden\" name=\"auth\" value=\"auth\">
        <tr>
            <td></td>
            <td><input type=\"submit\" value=\"OK\"></td>
        </tr>
    </table></form>";

    // ЕСЛИ ПРИШЕЛ ОТВЕТ ОТ ФОРМЫ АВТОРИЗАЦИИ
    if(isset($_POST['auth'])) {
        $name=$_POST['name'];
        $pass=$_POST['pass'];

        if(empty($name)) {echo "<font color=red>Enter LOGIN!</font>"; exit;}
        if(empty($pass)) {echo "<font color=red>Enter PASSWORD</font>"; exit;}

        $pass=md5($pass);

        if($name!==$login) {echo "<font color=red>Invalid LOGIN!</font>"; exit;}
        if($pass!==$password) {echo "<font color=red>Invalid PASSWORD</font>"; exit;}

        if($name==$login and $pass==$password and $name!='' and $pass!='') {
            $_SESSION['authoriz']=1;

        protection();                           // ВЫЗЫВАЕМ ФУНКЦИЮ protection()
        header("Location: $_SERVER[PHP_SELF]"); // СВАЛИВАЕМ ОТСЮДА НАФИГ :)
        }
    }
}

// start protection()
function protection() {

    // ОСНОВНАЯ ДИРЕКТОРИЯ
    $dirmain="/etc";
    // ДИРЕКТОРИЯ ДЛЯ БЭКАПА КОНФИГА IPFW
    $dirbak="$dirmain/fwrulesbak";
    // ОСНОВНОЙ КОНФИГУРАЦИОННЫЙ ФАЙЛ
    $fileconf="rc.firewall";
    $filemain="$dirmain/$fileconf";

    print "Loading for edit the main or backup configuration file IPFW firewall rules?

    <table cellpadding=\"3\" cellspacing=\"2\" border=\"0\">
      <tr>
        <td>
          <font color=\"blue\">Load MAIN</font>
        </td>
        <td>
          <font color=\"green\">Load BACKUP</font>
        </td>
        <td>
          <font color=\"red\">Delete BACKUP</font>
        </td>
      </tr>
      <tr>
        <td>
          <form method=\"post\">
          <input type=\"hidden\" name=\"dircur\" value=".$dirmain.">
          <input type=\"hidden\" name=\"filecur\" value=".$fileconf.">
          <input type=\"submit\" value=\"OK\" name=\"load\">
          </form>
        </td>
        <td>
          <form method=\"post\">
          <select name=\"filecur\">";

    // ДЕЛАЕМ ВЫБОРКУ КОНФИГУРАЦИОННЫХ ФАЙЛОВ ИЗ ДИРЕКТОРИИ БЭКАПА
    // ДЛЯ ВЫБОРОЧНОЙ ЗАГРУЗКИ И ДАЛЬНЕЙШЕГО РЕДАКТИРОВАНИЯ
    if ($handle=opendir($dirbak)) {                                      // ЕСЛИ МОЖЕМ ОТКРЫТЬ ДИРЕКТОРИЮ ДЛЯ БЭКАПА
        while (false!==($file=readdir($handle))) {                       // ЧИТАЕМ В ЦИКЛЕ ДИРЕКТОРИЮ ПОКА НЕ КОНЧИТСЯ
            if (!is_dir("$dirbak/$file") && $file!='.' && $file!='..') { // ПРОВЕРЯЕМ: ЕСЛИ ТО ЧТО ПРОЧИТАЛИ ДИРЕКТОРИЯ ИЛИ
                print "<option value='$file'>".$file."</option>";        // ФАЙЛЫ . И .. ТО, ИГНОРИРУЕМ И ВЫВОДИМ ЧТО ОСТАЛОСЬ
            }
        }
    closedir($handle);
    }
    print "</select>
          <input type=\"hidden\" name=\"dircur\" value=".$dirbak.">
          <input type=\"submit\" value=\"OK\" name=\"load\">
          </form>
        </td>
        <td>
          <form method=\"post\" onSubmit=\"return del(this)\">
          <select name=\"filecur\" class=\"d\">";

    // ДЕЛАЕМ ВЫБОРКУ КОНФИГУРАЦИОННЫХ ФАЙЛОВ ИЗ ДИРЕКТОРИИ БЭКАПА ДЛЯ УДАЛЕНИЯ НУЖНОГО ФАЙЛА
    if ($handle=opendir($dirbak)) {
        while (false!==($file=readdir($handle))) {
            if (!is_dir("$dirbak/$file") && $file!='.' && $file!='..') {
                print "<option value='$file'>".$file."</option>";
            }
        }
    closedir($handle);
    }
    print "</select>
          <input type=\"submit\" value=\"OK\" name=\"delete\">
          </form>
        </td>
      </tr>
    </table>

    <p><form method=\"post\"><input type=\"submit\" value=\"LOGOUT\" name=\"logout\"></form></p>

    <p><input type=\"button\" value=\"BACK\" onClick=\"javascript:history.go(-1)\"></p>";

    // ЕСЛИ ПРИШЕЛ ОТВЕТ, ЧТО РЕДАКТИРОВАТЬ НЕ БУДЕМ - ВЫВАЛИВАЕМСЯ В НАЧАЛО
    if (isset($_POST['nowriterules'])) $nowriterules=$_POST['nowriterules'];

    // ЕСЛИ ПРИШЕЛ ОТВЕТ, ЧТО ЗАГРУЖАЕМ ДЛЯ РЕДАКТИРОВАНИЯ ФАЙЛ
    // ИЛИ ОСНОВНОЙ ИЛИ ИЗ БЭКАПА
    if (isset($_POST['load']) and isset($_POST['filecur'])) {
        $filecur=$_POST['filecur'];
        $dircur=$_POST['dircur'];
        $filelist="$dircur/$filecur"; // ОПРЕДЕЛЯЕМСЯ КАКОЙ ФАЙЛ БУДЕМ ПРОСМАТРИВАТЬ
        $fp=fopen("$filelist","r") or die("<font color=red>Couldn't open <b>$filelist</b>! No file or no rights?"); // ОТКРЫВАЕМ
        $fwcon=file_get_contents(trim($filelist)); // ПОТРОШИМ ФАЙЛ И ПОЛУЧАЕМ СОДЕРЖИМОЕ (ЗАОДНО ЧИСТИМ, А МОЖЕТ И НЕ НАДО?)
        fclose($fp);                               // ЗАКРЫВАЕМ

        // ВЫВОДИМ НА ПЕЧАТЬ ФОРМУ
        print "<form method=\"post\">
        <textarea name=\"fwconf\" rows=\"20\" cols=\"100\">";
        echo $fwcon;    // НАПРАВЛЯЕМ ВНУТРЕННОСТИ ФАЙЛА ПОСЛЕ ПОТРОШЕНИЯ И ПРЕПАРАЦИИ В TEXTAREA
        print "</textarea>
        <br/>Write new rules?
        <input type=\"hidden\" value=\"$filecur\" name=\"filecur\">
        <input type=\"hidden\" value=\"$dircur\" name=\"dircur\">
        <input type=\"submit\" value=\"OK\" name=\"writerules\">
        <input type=\"submit\" value=\"NO\" name=\"nowriterules\">
        </form>";
    }elseif(isset($_POST['load']) and empty($filecur)) {echo "<font color=red>You are idiot? You can't get and load of anything!</font>";}

    // ЕСЛИ ПРИШЛО ПОДТВЕРЖДЕНИЕ, ЧТО ЗАПИСЫВАТЬ ОТРЕДАКТИРОВАННЫЙ ФАЙЛ БУДЕМ
    if(isset($_POST['writerules']) and isset($_POST['fwconf'])) {
        $fwconf=$_POST['fwconf'];
        $filecur=$_POST['filecur'];
        $dircur=$_POST['dircur'];
        if(empty($fwconf)) {echo "<font color=red><b>PANIC! YOU ARE IDIOT? EMPTY RULES NOT WRITING!</b></font>"; exit;}
        createbackup($dirbak,$filemain,$dircur,$filecur,$fileconf); // ВЫЗЫВАЕМ ФУНКЦИЮ ДЛЯ СОЗДАНИЯ БЭКАПА ФАЙЛА И ДИРЕКТОРИИ ДЛЯ БЭКАПА
        filewrite($fwconf,$filemain);                               // ВЫЗЫВАЕМ ФУНКЦИЮ ДЛЯ ЗАПИСИ ОТРЕДАКТИРОВАННОГО ФАЙЛА
    }

    // ЕСЛИ ПРИШЕЛ ОТВЕТ, ЧТО УДАЛЯЕМ ВЫБРАННЫЙ ФАЙЛ ИЗ БЭКАПА
    if(isset($_POST['delete']) and isset($_POST['filecur'])) {
        $file=$_POST['filecur'];
        deletefile($dirbak,$file); // ВЫЗЫВАЕМ ФУНКЦИЮ ДЛЯ УДАЛЕНИЯ ФАЙЛА
    }
} // end function protection()

// ФУНКЦИЯ СОЗДАНИЯ БЭКАПОВ
function createbackup($dirbak,$filemain,$dircur,$filecur,$fileconf) {
    if(!$dh=opendir($dirbak)) {                          // ЕСЛИ НЕ МОЖЕМ ОТКРЫТЬ ДИРЕКТОРИЮ БЭКАПА ИЛИ НЕ СУЩЕСТВУЕТ
        $cmdmd=escapeshellcmd($cmdmd);
        $cmdmd="/usr/local/bin/sudo /bin/mkdir $dirbak"; // КОМАНДА СОЗДАНИЯ ДИРЕКТОРИИ ДЛЯ БЭКАПА
        exec($cmdmd,$ouput,$return);                     // ВЫЗОВ КОМАНДЫ
        if($return==1) print "<font color=red>Can't create directory <b>$dirbak</b> for the backup!<br/>
        In files sudoers next line <u>www ALL=NOPASSWD: /bin/mkdir</u> is not added?</font><br/>";
        elseif($return==0) echo "<font color=green>Created directory <b>$dirbak</b> for the backup sucessfully!</font>";
    }
    $cmdcp=escapeshellcmd($cmdcp);
    $cmdcp="/usr/local/bin/sudo /bin/cp $dircur/$filecur /tmp/$fileconf && /usr/local/bin/sudo /bin/mv /tmp/$fileconf $dirbak/$fileconf".".".date("Y-m-d_H:i:s");
    exec($cmdcp,$ouput,$return); // КОМАНДА ДЛЯ СОЗДАНИЯ БЭКАПА - СНАЧАЛА КОПИРУЕМ В /tmp ДИРЕКТОРИЮ,
                                 // ПОТОМ ПЕРЕМЕЩАЕМ В ДИРЕКТОРИЮ БЭКАПА С ДРУГИМ НАЗВАНИЕМ
                                 // ИМЯ ФАЙЛА ВЫБИРАЕТСЯ КАК СТАРОЕ НАЗВАНИЕ И В КОНЦЕ ДОБАВЛЯЕТСЯ ТЕКУЩЕЕ ВРЕМЯ
                                 // ТАКОЙ ФИНТ УШАМИ ПОТОМУ, ЧТО МОЖЕТ БЫТЬ ВЫЗВАН ФАЙЛ КАК ОСНОВНОЙ ТАК И ИЗ БЭКАПА
                                 // А ИЗ БЭКАПА УЖЕ ИМЕЕТ НАЗВАНИЕ СО ВРЕМЕНЕМ ВКОНЦЕ, КОРОЧЕ, ЧТОБЫ ВРЕМЯ НЕ НАКЛАДЫВАЛОСЬ ДВА, ТРИ И БОЛЕЕ РАЗ
    if($return==1) print "<font color=red>Can't copy file <b>$filecur</b> in the backup directory <b>$dirbak</b>!<br/>
    In files sudoers next line <u>www ALL=NOPASSWD: /bin/cp</u> is not added?</font><br/>
    Or in files sudoers next line <u>www ALL=NOPASSWD: /bin/mv</u> is not added?</font><br/>";
    elseif($return==0) {
        echo "<font color=green>Copy file <b>$filecur</b> in the backup directory <b>$dirbak</b> sucessfully!<br/></font>";
    }
}

// ФУНКЦИЯ ЗАПИСИ ОТРЕДАКТИРОВАННОГО КОНФИГА В ФАЙЛ
function filewrite($fwconf,$filemain) {
    $cmdto=escapeshellcmd($cmdto);
    $cmdto="/usr/local/bin/sudo /usr/sbin/chown www $filemain";
    exec($cmdto,$ouput,$return);
    if($return==1) echo "<font color=red>Can't change the file <b>$filemain</b> owner on <b>www</b>!</font><br/>
    In files sudoers next line <u>www ALL=NOPASSWD: /usr/sbin/chown</u> is not added?</font><br/>";
    elseif($return==0) echo "<font color=green>Changed the file <b>$filemain</b> owner on <b>www</b> for writing sucessfully!<br/></font>";
    $fp=fopen($filemain,"w+") or die("<font color=red>Couldn't open <b>$filemain</b>! No file or no rights?</font>"); // МАТЕРИМСЯ, ЕСЛИ НЕ МОЖЕМ ОТКРЫТЬ
    flock($fp,LOCK_EX);                       // БЛОКИРУЕМ ФАЙЛ (ВНИМАНИЕ! БЛОКИРОВКА НЕ ПОЛНАЯ! ТОЛЬКО СРЕДСТВАМИ PHP, ОТ UNIX НЕ СПАСЕТ!)
    $fwconf=str_replace("\r\n","\n",$fwconf); // ЗАМЕНА ПЕРЕХОДА СТРОКИ И ВОЗВРАТА КАРЕТКИ ИЗ WINDOWS НА UNIX
    $fwconf=trim($fwconf);                    // ЧИСТИМ ФАЙЛ, УДАЛЯЕМ ПРОБЕЛЫ И ТАБЫ, НА ВСЯКИЙ СЛУЧАЙ
    fwrite($fp,$fwconf);                      // ПИШЕМ В ФАЙЛ
    flock($fp,LOCK_UN);                       // СНИМАЕМ БЛОКИРОВКУ С ФАЙЛА
    fclose($fp);                              // ЗАКРЫВАЕМ
    $cmdbak="/usr/local/bin/sudo /usr/sbin/chown root $filemain";
    exec($cmdbak,$ouput,$return);
    if($return==1) echo "<font color=red>Can't change the file <b>$filemain</b> owner back on <b>root</b>!</font><br/>
    <b>PANIC! UNKNOWN ERROR!</b>";
    elseif($return==0) {
        echo "<font color=green>Changed the file <b>$filemain</b> owner back on <b>root</b> for security sucessfully!<br/></font>";
        echo "<font color=green>Write new rules successfully! Congratulation! <b>YES!</b></font>";

        echo "<meta http-equiv=\"content-type\" content=\"text/html; charset=koi8-r\">
        <script language=\"javascript\">
        alert(\"Yes! All right!\");
        </script>";

        // АВТОПЕРЕХОД ДЛЯ ОБНОВЛЕНИЯ ВЫПОДАЮЩЕГО СПИСКА СЕЛЕКТ
        echo "<meta http-equiv=\"refresh\" content=\"0; url=./conf3.php\">"; // ВМЕСТО conf3.php ВСТАВИТЬ СВОЮ СТРАНИЦУ
    }
}

// ФУНКЦИЯ УДАЛЕНИЯ ФАЙЛА ИЗ ДИРЕКТОРИИ БЭКАПА
// СДЕЛАНА С ИСПОЛЬЗОВАНИЕМ РОДНОГО UNIX ШЕЛА, ИБО И ТАК ГЕМОРНО, А ИНАЧЕ ЕЩЕ И ПРАВА НА ДИРЕКТОРИЮ БЭКАПА И ФАЙЛЫ УСТАНАВЛИВАТЬ
function deletefile($dirbak,$file) {
    $cmddel=escapeshellcmd($cmddel);
    $cmddel="/usr/local/bin/sudo /bin/rm -f $dirbak/$file"; // САМА КОМАНДА НА УДАЛЕНИЕ ФАЙЛА
    exec($cmddel,$ouput,$return);                           // УДАЛЯЕМ ФАЙЛ
    if($return==1) echo "<font color=red>Can't delete file <b>$file</b> from directory <b>$dirbak</b>!<br/>
    In files sudoers next line <u>www ALL=NOPASSWD: /bin/rm</u> is not added?</font><br/>";
    elseif($return==0) {
        print "<font color=green>Deleted files <b>$file</b> from directory <b>$dirbak</b> sucessfully!<br/></font>";

        echo "<meta http-equiv=\"content-type\" content=\"text/html; charset=koi8-r\">
        <script language=\"javascript\">
        alert(\"Deleted files $file from directory $dirbak sucessfully!\");
        </script>";
        // АВТОПЕРЕХОД ДЛЯ ОБНОВЛЕНИЯ ВЫПАДАЮЩЕГО СПИСКА СЕЛЕКТ
        // ЕСЛИ ИСПОЛЬЗОВАТЬ header("Location: url") ТО НЕ УВИДИМ ОТЛАДОЧНЫХ СООБЩЕНИЙ :)
        echo "<meta http-equiv=\"refresh\" content=\"0; url=./conf3.php\">"; // ВМЕСТО conf3.php ВСТАВИТЬ СВОЮ СТРАНИЦУ
//      header("Location: $_SERVER[PHP_SELF]");
    }
}

// ФУНКЦИЯ ВЫХОДА
// РАЗРЕГИСТРИРУЕМ ПЕРЕМЕНЫЕ И УНИЧТОЖАЕМ ИХ
// РАЗРУШАЕМ СЕССИЮ
function logout() {
    session_unset();
    session_destroy();
    header("Location: $_SERVER[PHP_SELF]");
}

/*
ЛИРИЧЕСКИЙ ПОСТСКРИПТУМ :)
НАПИСАНО ЧИСТО РАДИ ЛЮБВИ К ИСКУССТВУ, СПОРТИВНОГО И АКАДЕМИЧЕСКОГО ИНТЕРЕСА.
НЕ УПОТРЕБЛЯТЬ!

ОБЯЗАТЕЛЬЕО ДОБАВИТЬ В КОНФИГУРАЦИОННЫЙ ФАЙЛ SUDO /ur/local/etc/sudoers СЛЕДУЮЩИЕ СТРОКИ:
www     ALL=NOPASSWD: /bin/rm
www     ALL=NOPASSWD: /bin/cp
www     ALL=NOPASSWD: /bin/mkdir
www     ALL=NOPASSWD: /bin/mv
www     ALL=NOPASSWD: /usr/sbin/chown

ЗАШИФРОВАТЬ ПАРОЛЬ ДЛЯ ВХОДА АЛГОРИТМОМ MD5
С ПОМОЩЬЮ PHP ИЛИ ЧЕРЕЗ КОНСОЛЬ
В PHP ПРОЧЕСТЬ ВЫВОД СТРОКИ echo md5('passwd');
В КОНСОЛИ UNIX ВЫПОЛНИТЬ md5 -s passwd
ЛИБО В КОНСОЛИ UNIX php -r "print md5('passwd');"
ГДЕ ВМЕСТО passwd ПОДСТАВИТЬ СВОЮ ХРЕНЬ
НУ И ВЫВОД ВСЕГО ЭТОГО МРАКОБЕСИЯ, СООТВЕТСТВЕННО, ВСТАВИТЬ В ОДНО МЕСТО (ПО УСМОТРЕНИЮ - КОМУ И КУДА, УЖ САМИ РАЗБЕРЕТЕСЬ)

КРАЙНЕ ВАЖНО!
ЧТОБЫ СЕССИЮ НЕ ПЕРЕХВАТИЛИ И НЕ УГНАЛИ, В КОНЦЕ ОБЯЗАТЕЛЬНО ДЕЛАЙТЕ LOGOUT !!
ИНАЧЕ, ПОСЛЕ ПЕРВОНАЧАЛЬНОЙ АВТОРИЗАЦИИ, ВХОД БУДЕТ ВЫПОЛНЕН И ДОСТУПЕН И ПОСЛЕ ОБЫЧНОГО ЗАКРЫТИЯ СТРАНИЦЫ БРАУЗЕРА!
СЕССИЯ НЕ БУДЕТ РАЗРУШЕНА И, СООТВЕТСТВЕННО, ВЫ ИМЕЕТЕ ДЫРУ В ЗАЩИТЕ И ГЕМОР НА ОДНО МЕСТО :))
*/
?>

</body>
</html>

Вот такие дела..


"управление ipfw через php"
Отправлено krayn , 12-Фев-11 01:41 
> да, извне доступ к серверу закрывается, т.е. атаковать и исполнять кто-то левый
> обращения командного процессора не будет, только те, кто под шлюзом, а
> там врядли кому-то надо это делать

спасибо за инфу


"управление ipfw через php"
Отправлено ARH665 , 08-Май-11 23:35 
все было хорошо и прекрасно, пока не случилось что-то ;)
не то после перезагрузки сервера (спустя пол года), не то после ковыряний с PHP и Apache, перестали выводиться любые команды, даже тупо:

<html>
<body>
<?php
print "<pre>";
echo system("/usr/local/bin/sudo dmesg -a");
print "</pre>";
?>
</body>
</html>


ничего не кажет. перепроверил, может изменились права, нет, и даже поправил на случай так:
file "/usr/local/etc/sudoers", 1 lines

www     ALL=NOPASSWD: ALL

и даже сделал chmod 0644 /usr/local/etc/sudoers. Куда могло все пропасть? Ну, или хотя бы скажите в какую сторону ковырнуть, что бы начать?


зы. есть подозрение, что все пропало из-за php.ini, но что я там (или не я) делал, точно за пол года никто не скажет, ведь журнальчик не вели с записью о каждом движении в PHP, к сожалению :(



"управление ipfw через php"
Отправлено ARH665 , 13-Май-11 09:59 
проблема решена, каким-то образом сменились права у /usr/local/etc/sudoers, помогло

chmod 0440 /usr/local/etc/sudoers


"управление ipfw через php"
Отправлено LSTemp , 09-Июн-11 01:49 
> да, извне доступ к серверу закрывается, т.е. атаковать и исполнять кто-то левый
> обращения командного процессора не будет, только те, кто под шлюзом, а
> там врядли кому-то надо это делать

а ты статистику и литературу по взлому серьезных систем почитай (большинство взломано изнутри при содействии бывших сотрудников).

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


"управление ipfw через php"
Отправлено LSTemp , 09-Июн-11 01:31 
> Доброго дня! Раскурил как направлять людей с локальной сети на адрес сервера,
> таким образом можно сделать уведомление, например: сегодня в сети с 15
> до 16 будут производиться работы. Но это неудобно, пользователь будет все
> время редиректиться на эту страницу. Хотелось бы прикрутить например так: сегодня
> в сети с 15 до 16 будут производиться работы. (и чуть
> ниже кнопочка: Я УВЕДОМЛЕН) и по нажатию на эту кнопку в
> /etc/rc.firewall прописывается удаление правила перенаправления и перечитывание конфига
> ipfw.

браво!!!

пусть лучше ч/з апач дыра откроется с рутовым доступом. великолепное решение.

а на сайте куки использовать, к примеру, не проще для этих целей (т.е перенаправления)? пакетным фильтром рулить ч/з апач для оповещения пользователей о проведении каких-то работ - ну это я не знаю даже...

PS
вообще задача ИМХО - бред. о плановых (и внеплановых) работах в новостях пишешь (и редиректить на них не надо). кто не прочел - тот сам себе злобный буратино. вот так это живет в реальности.


> Очень много покопавшись по форумам, повторяю ооочень много, но не нашел ничего
> дельного вовсе, а все что нашел, и попытался скрутить, даже вывод
> команды в файл не писало. Подскажите, как попроще сделать это? Или
> хотя бы подскажите, как обратиться к командному процессору из php? А
> дальше я бы сам разобрался


"управление ipfw через php"
Отправлено ARH665 , 09-Июн-11 09:46 
> PS
> вообще задача ИМХО - бред. о плановых (и внеплановых) работах в новостях
> пишешь (и редиректить на них не надо). кто не прочел -
> тот сам себе злобный буратино. вот так это живет в реальности.

я приму к сведению Ваши гневные сообщения


"управление ipfw через php"
Отправлено LSTemp , 13-Июн-11 01:37 
>> PS
>> вообще задача ИМХО - бред. о плановых (и внеплановых) работах в новостях
>> пишешь (и редиректить на них не надо). кто не прочел -
>> тот сам себе злобный буратино. вот так это живет в реальности.
> я приму к сведению Ваши гневные сообщения

Они не гневные совсем. Просто жизнь такая.



"управление ipfw через php"
Отправлено ARH665 , 07-Июл-11 23:40 
Вечер добрый, скажите, что могло произойти, после ребута сервера перестали отрабатываться команды, просто белая страница и ничего не выводит, в dmesg тоже пусто, и права менял и все равно ничего, и даже sudo переустановил, куда копнуть-то? заранее благодарен


"управление ipfw через php"
Отправлено михалыч , 12-Июл-11 10:37 
> Вечер добрый, скажите, что могло произойти, после ребута сервера перестали отрабатываться
> команды, просто белая страница и ничего не выводит, в dmesg тоже
> пусто, и права менял и все равно ничего, и даже sudo
> переустановил, куда копнуть-то? заранее благодарен

Запуск phpinfo.php

<?php
phpinfo();
?>

что-нибудь говорит, показывает?


"управление ipfw через php"
Отправлено ARH665 , 13-Июл-11 09:45 
показывает, все как обычно, что-то конкретное оттуда выделить надо?



"управление ipfw через php"
Отправлено михалыч , 13-Июл-11 12:51 
> показывает, все как обычно, что-то конкретное оттуда выделить надо?

Надо phpinfo использовать для отладки скриптов.
Установить уровень ошибок E_ALL,
для этого, на время отладки добавить в начало скрипта

ini_set('display_errors',1);
error_reporting(E_ALL);

Убрать всех собак (если таковые имеются) (@) из кода.
Дополнительно, смотреть текст ошибки в логе ошибок апача.

Проверить, все ли переменные имеют то значение, которое ожидается.
Выводить все используемые переменные на экран,
визуально контролировать их содержимое.
Для этого, написать в проблемных местах var_dump($var)

Например, есть массив $_POST,
где-то и как-то там обращаемся к нему,
после обращения проверяем,
для этого вставляем в код (после обращения :) )
echo '<pre>';
var_dump($_POST);

Проверить все значения $_GET, $_POST
Может где переменная теряется.
Для этого вызываем
phpinfo(INFO_VARIABLES); или phpinfo(32);
То есть, в конце отладочного скрипта пишем
<?
phpinfo(32);
?>
Смотрим вывод.

А в самом начале советую посмотреть файл php.ini
Вдруг чего изменилось. ))


"управление ipfw через php"
Отправлено ARH665 , 04-Авг-11 12:35 
все фигня, не стал сильно разбираться, бекапнул все конфиги и переустановил веб сервер - заработало. скажите, если я начинаю править скриптом выше конфиг firewall.conf, исходный текст при загрузке в форму такой:

="

а после сохранения происходит конвертация и получается
=/"
а после пересохранения получается
=//" и так далее. как это вылечить? не подскажете?

зы. для полного прояснения картины вот так:
исходный текст:
test
тест
1234

#!/bin/sh
FwCMD="/sbin/ipfw"
LanOut="vr0"
LanIn="vr1"


полученный после сохранения:
test
тест
1234

#!/bin/sh
FwCMD=\"/sbin/ipfw\"
LanOut=\"vr0\"
LanIn=\"vr1\"


"управление ipfw через php"
Отправлено михалыч , 05-Авг-11 07:21 
>[оверквотинг удален]
> LanOut="vr0"
> LanIn="vr1"
> полученный после сохранения:
> test
> тест
> 1234
> #!/bin/sh
> FwCMD=\"/sbin/ipfw\"
> LanOut=\"vr0\"
> LanIn=\"vr1\"

Поиск в php.ini magic_quotes (магические кавычки)
Скорее всего включены

если
1.magic_quotes_gpc = On
то, чтобы не заслешивалось, должно быть
2.magic_quotes_sybase = On
А у вас, скорее всего Off

а если
1.magic_quotes_gpc = Off
то, 2 тогда пофиг, может быть
magic_quotes_sybase = Off
или
magic_quotes_sybase = On

Выставить нужные значения, перезапустить апач


"управление ipfw через php"
Отправлено ARH665 , 05-Авг-11 09:07 
>[оверквотинг удален]
>> полученный после сохранения:
>> test
>> тест
>> 1234
>> #!/bin/sh
>> FwCMD=\"/sbin/ipfw\"
>> LanOut=\"vr0\"
>> LanIn=\"vr1\"
> Поиск в php.ini magic_quotes (магические кавычки)
> Скорее всего включены

спасибо, пошел немного другим путем, убрал просто кавычки и все, без них тоже ipfw хавает переменные :)

михалыч, как можно с Вами связаться вне форума?
мой e-mail: admin[at]arh665.ru
буду благодарен, если откликнитесь