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

Исходное сообщение
"Раздел полезных советов: Скрипт для автоматизации настройки iptables фильтра для локальной сети"

Отправлено auto_tips , 20-Окт-05 09:19 
На разных машинах в моей локальной сети накопилась куча программ,
которым нужен был выход в интернет напрямую. У каждой свой набор портов.
Захотелось на входе иметь минимальную конфигурацию, описывающую
ресурсы, а на выходе набор разрешающих  правил для iptables.
В основном были клиент-банки - поэтому и такая терминология в программе.
А так вместо банка можно указывать любой ресурс в формате определенном в
man iptables.

Ограничения, недостатки:

1. использование количества портов для одного ресурса менее 16
2. нельзя указать диапазон портов через двоеточие как в iptables
Оба легко устаняются: первое - есть пример в самом скрипте,
второе через использование другого разделителя для записей на входе,
проверку наличия ":" - использование другого формата вызова iptables. Мне это не нужно и код не хотел раздувать.


#!/bin/bash
#bkv 2005.10
#Дано:
#  Два списка:
#  Первый список из записей вида - банк:порты(через запятую)
#  Второй список из записей вида - клиент:банки(через запятую)
#Найти:
#  Набор разрешающих правил iptables для forward
#Примечания:
#  политика FORWARD по умолчанию - "запрещено все, что не разрешенно"
#  iptables поддерживает одновременное указание не более 15 портов
#Решение:
#  Создадим отдельную цепочку, например, - CLIENTBANK
#  Сгенерируем необходимые правила и поместим их в цепочку CLIENTBANK
#  Обращения по всем портам из первого списка направим на обработку в CLIENTBANK
#  Перед выполнением все правила связаные с цепочкой CLIENTBANK удалим, чтобы не плодить
#    правила от многократного запуска

itls="/sbin/iptables"

#Подаем список на обработку awk
#признак первого списка - первое поле BankPorts
#признак второго списка - первое поле ClientBanks
echo -e "\
BankPorts:smtp.mail.ru:25\n\
BankPorts:10.24.70.0/26:22,23\n\
BankPorts:pop.mail.ru:110\n\
BankPorts:bank4.ru:9999,888\n\
BankPorts:bank5.ru:1,2,3,4,5,6,7,8,9,10,11,12,13,14,15\n\
BankPorts:bank6.ru:21,22,23,24,25,26,27,28,29,210,211,212,213,214,215\n\
ClientBanks:192.168.9.0/16:smtp.mail.ru,pop.mail.ru,10.24.70.0/26\n\
ClientBanks:192.168.9.8:bank4.ru,bank5.ru,bank6.ru\n\
ClientBanks:192.168.9.6:bank6.ru,bank4.ru\n\
"|\
awk -v itls=$itls -F: '{
  if($0~/^BankPorts/) BankPorts[$2]=$3 #создаем ассоциативный массив - индекс:банк, значение:порты через запятую
  if($0~/^ClientBanks/) ClientBanks[$2]=$3 #аналогично клиент -> банки
}END{
#Cгенерируем _необходимые_ правила для цепочки CLIENTBANK
for (client in ClientBanks){
  split(ClientBanks[client],bank_arr,",") #поместили в массив bank_arr адреса банков для клиента
  for(i in bank_arr){
      all_ports=all_ports","BankPorts[bank_arr[i]] #создаем список всех портов для дальнейшего использования
      count_ports=split(BankPorts[bank_arr[i]],tmp_arr,",")
      if(count_ports > 15)
        print "echo Слишком много портов для "bank_arr[i]".Допиши программу.Выход&&exit 1"
       else
        printf("%s -A CLIENTBANK -s %s -d %s -p tcp -m multiport --dports %s -j ACCEPT\n",itls,client,bank_arr[i],BankPorts[bank_arr[i]])
      }
}

#Создадим правила перенаправляющие из FORWARD на обработку в CLIENTBANK, помня про ограничение в 15 портов
sub(",","",all_ports) #отрезаем первую запятую у списка всех использующихся портов
split(all_ports,all_ports_arr,",")#поместили в массив all_ports_arr все порты какие есть
j=1;i=1
while(all_ports_arr[i]){
  while(i<=(j*15)){
    if (all_ports_arr[i])
      tmp_all_ports=tmp_all_ports","all_ports_arr[i]
    i++
    }
  sub(",","",tmp_all_ports) #отрезаем первую запятую
  printf("%s -I FORWARD -p tcp -m multiport --ports %s -j CLIENTBANK\n",itls,tmp_all_ports)
  tmp_all_ports=""
  j++
  }

print itls" -A CLIENTBANK  -p tcp -m state --state ESTABLISHED -j ACCEPT"
print itls" -N CLIENTBANK"
print itls" -X CLIENTBANK"
print itls" -F CLIENTBANK"

#Удаляем из FORWARD все цепочки содержащие цель CLIENTBANK
del_rules_nums="'`$itls --line-numbers -L FORWARD -n|grep CLIENTBANK|cut -f1 -d" "|tr "\n" ","`'"
split(del_rules_nums,del_rules_arr,",")
cnt_rules=1
while(del_rules_arr[cnt_rules]){
  printf("%s -D FORWARD %s\n",itls,del_rules_arr[cnt_rules])
  cnt_rules++
  }

}'|tac > gen.itls.sh
chmod 700 gen.itls.sh
echo "Команды сгенерированы в файл ./gen.itls.sh .Выход."
exit
./gen.itls.sh
rm ./gen.itls.sh


URL: http://www.opennet.me/soft/iptables_clientbank.sh
Обсуждается: http://www.opennet.me/tips/info/907.shtml


Содержание

Сообщения в этом обсуждении
"А вот так?"
Отправлено Andrey Mitrofanov , 20-Окт-05 09:19 
cat <<EOF >/etc/firehol/firehol.conf
# "bkv 2005.10" for firehol
version 5

LAN="192.168.9.0/16"
CLI1="192.168.9.6"
CLI2="192.168.9.8"

server_bank4_ports="tcp/9999 tcp/888"; client_bank4_ports="any"
server_bank5_ports="tcp/1:15"; client_bank5_ports="any"
server_bank6_ports="tcp/21:29 tcp/210:215"; client_bank6_ports="any"

router bkv_lan src "$LAN"
  client "ssh telnet" accept dst "10.24.70.0/26"
  client "pop" accept dst "pop.mail.ru"
  client "smtp" accept dst "smtp.mail.ru"

router bkv_cli12 src "$CLI1 $CLI2"
  client bank4 accept dst "bank4.ru"
  client bank6 accept dst "bank6.ru"
  client bank5 accept src "$CLI2" dst "bank5.ru"
EOF

http://firehol.sourceforge.net/
http://packages.debian.org/src:firehol
http://wiki.atmsk.ru/index.html/Ip/Netfilter#firehol
(жалко debian.lrn.ru "лежит" -- я там в форуме ешё писал...)


"Скрипт для автоматизации настройки iptables фильтра для локальной сети"
Отправлено Константин , 25-Окт-05 10:49 
Ссылка хорошая, но бывает проще самому побыстрому написать скрипт. Если, например, сеть небольшая и требуются простые настройки. У меня начиналось с такого простого скрипта:

#!/bin/bash
#bkv 2005.10
our_net="192.168.9.0/24"
mail_hosts="yandex mail ngs nsk rambler"
itls="/sbin/iptables"

echo Разрешаем 25 и 110 порт для \( $mail_hosts \)

$itls -D FORWARD -p tcp -m multiport --ports 25,110 -j MAIL
$itls -F MAIL
$itls -X MAIL
$itls -N MAIL
$itls -I FORWARD -p tcp -m multiport --ports 25,110 -j MAIL

$itls -A MAIL  -p tcp -m state --state ESTABLISHED -j ACCEPT;

for i in $mail_hosts;do
  for j in `(dig +short smtp.$i.ru;dig +short pop3.$i.ru)|grep -v [[:alpha:]]|sort|uniq`;
   do
     $itls -A MAIL -s $our_net -d $j -j ACCEPT;
   done
done


"Скрипт для автоматизации настройки iptables фильтра для локальной сети"
Отправлено Имя , 24-Окт-06 17:05 
а как можно ip-шники лежащие в столюик в файле подключить к фаерволу что-б забанить?