Ищем ...
пятница, 20 ноября 2009 г.

Памятка Linux - настройка роутера и файрвола


Полезные советы: Как настроить Linux-роутер?
Как правило вы получайте от провайдера один канал, а Интернет нужно подключить ко всем компьютерам локальной сети, при этом обеспечив максимальную безопасность. Для этого между локальной сетью и внешним каналом ставиться шлюз-роутер. Это может быть компьютер с двумя сетевыми адаптерами и установленным Linux-ом. Один адаптер подключается к локальной сети, другой к каналу провайдера. Следующий пример скрипта покажет как обеспечить по возможности полный и защищенный доступ в и-интернет для всех пользователей локальной сети.

# Задаем исходные данные:
# Наша локальная сеть:
USNET=10.0.0.0/24
# Наш внешний IP адрес (выданный провайдером):
PUBIP=212.55.280.121

# Наш внутренний IP адрес:
LANIP=10.0.0.1

# Шлюз:
GW=212.55.280.12.1
# Адаптер подключенный к локальной сети:
LAN_ADAPTER=eth0
# Адаптер подключенный к Интернету:
WAN_ADAPTER=eth1


#
# Если системная сетевая конфигурации не была установлена или была
# установлена не правельно
# установлен можно внести следующие строки:
#
#ifconfig $LAN_ADAPTER $LANIP
#ifconfig $WAN_ADAPTER $PUBIP
#
#route del default
#route add default gw $GW
#

# Сбрасываем старые правила:
iptables -F

# Закрываем порт SSH:
iptables -A INPUT -p tcp -i ! $LAN_ADAPTER --destination-port 22 -j DROP

# Закрываем порты NETBIOS :
iptables -A INPUT -p tcp --destination-port 445 -j DROP
iptables -A INPUT -p tcp --destination-port 135 -j DROP
iptables -A INPUT -p udp -m multiport --ports 135,136,137,138,139 -j DROP
iptables -A INPUT -p tcp -m multiport --ports 135,136,137,138,139 -j DROP
iptables -A FORWARD -p udp -m multiport --ports 135,136,137,138,139,445 -j DROP
iptables -A FORWARD -p tcp -m multiport --ports 135,136,137,138,139,445 -j DROP

# Блокируем входящие пакеты с локальными IP адресами приходящие на внешний интерфейс
iptables -A INPUT -p tcp -i $WAN_ADAPTER -s $USNET -j DROP
# Блокируем входящие пакеты c нелокальными IP на внутреннем интерфейсе
iptables -A INPUT -p tcp -i $LAN_ADAPTER -s ! $USNET -j DROP

# Защищаемся от SYN атак
iptables -A INPUT -p tcp --tcp-flags SYN,ACK SYN,ACK \
 -m state --state NEW -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN SYN \
 -i $WAN_ADAPTER -m state --state NEW -m limit --limit 30/second --limit-burst 30 -j RETURN
iptables -A INPUT -p tcp  --tcp-flags SYN,ACK,FIN SYN \
 -i $WAN_ADAPTER -m state --state NEW -j DROP

# Разрешаем маршрутизацию
echo "1" > /proc/sys/net/ipv4/ip_forward


# Настраиваем NAT
iptables -t nat -F
iptables -t nat -A POSTROUTING -p tcp -o $WAN_ADAPTER -s $USNET -j SNAT --to-source $PUBIP
iptables -t nat -A POSTROUTING -p udp -o $WAN_ADAPTER -s $USNET -j SNAT --to-source $PUBIP
iptables -t nat -A POSTROUTING -p icmp -o $WAN_ADAPTER -s $USNET -j SNAT --to-source $PUBIP


# Защищаем IPv6
ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP
ip6tables -A INPUT -i $WAN_ADAPTER -j DROP
ip6tables -A FORWARD  -j DROP

#
# Часто бывает, что не опытные пользователи или злоумышленники запускают на своем
# компьютере вредоносные программы рассылающие спам и проводящие ICMP DoS атаки.
# Чтобы блокировать рассылку спама из нашей сети и в тоже время дать возможность
# пользователям нормально работать с почтой введем следующие правила:
#

iptables -N SMTP

Для каждого IP нашей локалки:
for (( i=1 ; i < 255 ; i=i+1 )) ; do

# разрешаем отправить 10 сообщений, после которых вводим
# ограничение -- не более пяти сообщений в час:
 iptables -A SMTP -p tcp --syn -i $LAN_ADAPTER -s \
  10.0.0.$i --dport 25 -m limit --limit 5/hour \
 --limit-burst 10 -j RETURN ;
# можно было бы поставить одно общее DROP правило на все остальные пакеты,
# но для того чтобы было видно на каком адресе работает вредоносная
# программа, создаем такие правила для каждого адреса:
 iptables -A SMTP -p tcp --syn -i $LAN_ADAPTER -s 10.0.0.$i --dport 25 -j DROP ;
 
# Ограничиваем ICMP:
 iptables -A SMTP -p icmp -i $LAN_ADAPTER -s 10.0.0.$i \
 -m limit --limit 30/hour --limit-burst 50 -j RETURN ;
 
done

iptables -A SMTP -p tcp --dport 25 --syn -i $LAN_ADAPTER  -j DROP
iptables -A SMTP -p icmp -i $LAN_ADAPTER  -j DROP ;

iptables -A INPUT -p tcp --dport 25 --syn -i $LAN_ADAPTER  -j SMTP
iptables -A FORWARD -p tcp --dport 25 --syn -i $LAN_ADAPTER  -j SMTP

# Закрываем известные троянские порты:
iptables -A FORWARD -p udp --sport 16355  -j DROP
iptables -A FORWARD -p udp --sport 21111  -j DROP



Этот скрипт можно положить, например, в /etc/us_net_up и включить в последовательность загрузки, запускать. например из rc.local Следить за состоянием файрвола можно с помощью команды

iptables -L -v -n

Особое внимание нужно обращать на DROP-правила в таблице SMTP -- если на них что-то есть значит на соответствующем компьютере локальной сети работает вредоносная программа. Для того чтобы сразу обнаруживать вредоносные программы желательно делать это автоматически. Можно запускать некий скрипт по расписанию с помощью cron, но в следующем примере мы предлагаем скрипт который работает постоянно и может так же запускаться из rc.local сразу после запуска us_net_up

#!/usr/bin/perl

# шаблон для поиска и выделения IP адреса нашей сети:
$us_net_patern='10\.[0-9]+\.[0-9\.]+' ;

# e-mail администратора
$admin_email='admin@mail' ;

# команда для отправки письма:
$sndmsg = '/bin/sndmsg -o smtp://127.0.0.1 ' . $admin_email ;


$counter=0;
while(1)
{
# открываем поток из iptables -L -v -n
open(FILE,'-|', 'iptables -L -v -n') || die "Cant open file";

while(<FILE>)
{
# находим правило DROP для порта 25
# В нашем случае
 if(/([0-9]+).+DROP.+($us_net_patern).+tcp dpt:25 flags/)
 {
  $a=$1;
  $b=$2;
# проверяем не увеличилось ли значение на счетчике
# отклоненных пакетов
  if( $a > ($lmt{$b}+10 ) )
  {
# да, -- запоминаем новое значение
  $lmt{$b}=$a;
  
#  если это не первый проход скрипта...
  if($counter)
  {

# запрещаем маршрутизацию для зараженного компьютера
   $c = ` if ! /sbin/iptables -L -v -n | grep -e "DROP.*all.*$b" ; then
    /sbin/iptables -A FORWARD -s $b -j DROP ;
   fi ` ;

# если маршрутизация не была запрещена раньше,
    if( $c eq '' )
    {
# отправляем письмо администратору
     open(FILE2, "|$sndmsg" ) || die "Cant open file";
     printf FILE2 'From: %s
To: %s
Subject: Probably virus at %s

 %u SYN пактов на SMTP порт c адреса %s было откланено

 Адрес заблокирован!


'
,$admin_email ,$admin_email ,$b,$a,$b;

     close FILE2 ;
    }
  }
  $tmt{$b}=time;
  }
 }
}

close FILE;
$counter++;

# Ждем 15 минут
sleep(900);

}
Задать вопросы и высказать предложения по защите сети вы можете на нашем форуме


* This source code was highlighted with Source Code Highlighter.


Взято с http://lsol.ru/Linux_router_firewal.htm
 
Вверх!