Работа с другими фаерволами, например IPF

Вопросы по UTM 3.0 и UTM 4.0 (поддержка прекращена)
Закрыто
Scr
Сообщения: 6
Зарегистрирован: Ср авг 10, 2005 11:06

Работа с другими фаерволами, например IPF

Сообщение Scr »

У меня UTM3.0 и FireWall разнесены на разные серверы.
Задача состоит в том, чтобы UTM управлял FireWallом по SSH.
Причём, в качестве FireWall я использую IPF. Все сервера на FreeBSD.
Кто-ндь уже реализовывал такую связку?

ratelcom
Сообщения: 31
Зарегистрирован: Сб май 07, 2005 04:07

Re: Работа с другими фаерволами, например IPF

Сообщение ratelcom »

Scr писал(а):У меня UTM3.0 и FireWall разнесены на разные серверы.
Задача состоит в том, чтобы UTM управлял FireWallом по SSH.
Причём, в качестве FireWall я использую IPF. Все сервера на FreeBSD.
Кто-ндь уже реализовывал такую связку?
Можно указать локальный фаервол -
/opt/my_iptables - в котором будет выполняться ssh ... $1 $2...

Scr
Сообщения: 6
Зарегистрирован: Ср авг 10, 2005 11:06

Сообщение Scr »

А поподробнее разжевать можно?

Scr
Сообщения: 6
Зарегистрирован: Ср авг 10, 2005 11:06

Сообщение Scr »

Всё было бы гораздо проще, если бы на удалённом сервере стоял один из предлагаемых NetUpом фаерволов, например IPFW, но у меня стои IPF, а это совсем другое... Дело в том, что при открывании инета (применительно к IPFW) передаётся ip юзера и номер правила, а при закрывании передаётся только номер правила для удаления. В IPF нет нумерации правил...
В итоге, я пока добился возможности открыть юзеру инет.
Скрипт выгдядит вот так:
-bash-2.05b$cat /sbin/ipfw
#!/bin/sh
/usr/bin/ssh -i /home/nobody/.ssh/id_rsa nobody@192.168.88.1 \
sudo echo "pass in on rl0 from $6 to any | sudo /sbin/ipf -f -"

Scr
Сообщения: 6
Зарегистрирован: Ср авг 10, 2005 11:06

Сообщение Scr »

Использовать шелл для решения данной задачи меня разубедили.
В итоге, решил сделать всё на Perl.
Текст скрипта приведён ниже.
Осталась нерешённой самая главная задача, а именно, UTM не может распознать ответ о наличии/отсутствии правил в фаерволе, поэтому всегда на админской странице статус всех пользователей - ВКЛЮЧЕН. Соответственно, нажатие на звёздочку приводит лишь к действиям "ipfw delete" и "ipfw show".
Команды "Выключить/Включить всем пользователям интернет" отрабатываются прекрасно (но в админке, при этом, всё-равно отображая всем статус ВКЛЮЧЕН).
Вопрос в студию - как должен выглядеть sub ipfstatlist?

#!/usr/bin/perl
##################################################################################################
# Скрипт создан для биллинговой системы UTM3.0
# Он производит действия с фаерволом "ipf" на удалённом сервере.
#
# Входными данными являются:
# 1) show номер_правила_ipfw (например ipfw show 1006)
# 2) add номер_правила ip-адрес (например ipfw add 1006 172.16.1.6)
# 3) delete номер_правила_ipfw (например ipfw delete 1006)
# 4) Заявление adminа NetUp на http://old.netup.ru/phorum/viewthread.php?tid=1239
#
# Алгоритм действий следующий:
# 1) Получение входного параметра "show"
# *1.1 Сопоставление номера правила ip-адресу
# *1.2 Выполнение удалённого скрипта
# 1.3 Возвращение 0, если ip-адрес найден и 1, если не найден
#*2) Получение входного параметра "add"
#*3) Получение входного параметра "delete"
##################################################################################################

#################################
# Используемые переменные:

$listfile = "/temp/listing3"; # Файл, где хранятся данные "номер правила","ip-адрес"

$path_to_key = "/home/utmuser/.ssh/id_rsa"; # Ключ для беcпарольной работы ssh

$user_login = "utmuser"; # Логин пользователя, от которого происходит коннект.
# Внимание! Этот пользователь должен существовать на
# обоих серверах и у него обязательно должен быть
# home-dir для хранения ключа.

$remote_server = "192.168.0.1"; # Удалённый сервер, на котором установлен ipf

### Открываем файл со списком пользователей и заносим данные в массив %USEARG
open (TESTING, "$listfile");
%USERARG = split ',',<TESTING>; # Данные разделены запятыми и занесены одной строкой
close (TESTING);

#################################
# Подпрограмма добавления разрешающего правила в ipf
sub open_inet
{
if ($ARGV[0] eq 'add')
{
print "Работа подпрограммы \"open_inet\":\n";
print `/usr/bin/ssh -i $path_to_key $user_login\@$remote_server sudo /bin/echo \"pass in on rl0 from $ARGV[2] to any | sudo ipf -f -\"`;
print `/usr/bin/ssh -i $path_to_key $user_login\@$remote_server sudo /bin/echo \"pass in on rl0 from any to $ARGV[2] | sudo ipf -f -\"`;
print "Добавлено правило $ARGV[1] для ip-адреса $ARGV[2]\n";
}
}

#################################
# Подпрограмма удаления разрешающего правила из ipf
sub close_inet
{
if ($ARGV[0] eq 'delete')
{
print "Работа подпрограммы \"close_inet\":\n";
print "удалямое правило фаервола и ip-адрес при условии *** $ARGV[0] ***\n";
while (($rule_number, $ip_adress) = each %USERARG)
{
if ($ARGV[1]==$rule_number)
{
print "Удаляемому номеру правила $ARGV[1] соответствует ip-адрес $USERARG{$rule_number}\n";
system `/usr/bin/ssh -i $path_to_key $user_login\@$remote_server sudo /bin/echo \"pass in on rl0 from any to '$ip_adress/32' \| sudo ipf -rf -\"`;
system `/usr/bin/ssh -i $path_to_key $user_login\@$remote_server sudo /bin/echo \"pass in on rl0 from '$ip_adress/32' to any \| sudo ipf -rf -\"`;
}
}
}
}

#################################
# Подпрограмма опроса фаервола ipf и занесение данных в массив
sub ipfstatlist
{
if ($ARGV[0] eq 'show')
{
while (($rule_number, $ip_adress) = each %USERARG)
{
if ($ARGV[1]==$rule_number)
{
$out = `/usr/bin/ssh -i $path_to_key $user_login\@$remote_server sudo /temp/ipfstatlist.pl $ip_adress`;
}
}
if ($out eq "")
{
print "ipfw_real: rule $ARGV[1] does not exist\n";
}
else
{
print "0$ARGV[1]\n";
}
}
}

open_inet(); # Добавление разрешающего правила в ipf
close_inet(); # Удаление разрешающего правила из ipf
ipfstatlist(); # Получение с удалённого сервера статуса запрашиваемых правил

Scr
Сообщения: 6
Зарегистрирован: Ср авг 10, 2005 11:06

Сообщение Scr »

Ну, вот и всё...
Сам управился...
Просто надо было exit задать в зависимости от результата...
Теперь скрипт заканчивается вот так:

#################################
# Подпрограмма опроса фаервола ipf
sub ipfstatlist
{
if ($ARGV[0] eq 'show')
{
while (($rule_number, $ip_adress) = each %USERARG)
{
if ($ARGV[1]==$rule_number)
{
$out = `/usr/bin/ssh -i $path_to_key $user_login\@$remote_server sudo /temp/ipfstatlist.pl $ip_adress`;
}
}
}
}

open_inet(); # Добавление разрешающего правила в ipf
close_inet(); # Удаление разрешающего правила из ipf
ipfstatlist();
if ($out eq "")
{
exit (1);
}
else
{
exit (0);
}

Scr
Сообщения: 6
Зарегистрирован: Ср авг 10, 2005 11:06

Сообщение Scr »

Да, чуть не забыл...
В файле listing3 данные лежат вот в таком виде:
1001,192.168.0.50,1002,192.168.0.49,1005,172.16.1.5,...

Скрипт на стороне удалённого сервера (/temp/ipfstatlist.pl)
#!/usr/bin/perl

outparent();

sub outparent
{
$outsystem = `/sbin/ipfstat -i | grep $ARGV[0]`;
print $outsystem;
}

Вот вроде и всё...
Тока надо бы теперь это всё оптимизировать ИМХО...

Закрыто