Создание  
  О компании  Программ Устройств   Linux    
  Контакты   Обучение  
    Инвестиционные проекты

LsoL

  Обслуживание    
  Продукция     Советы  
   

Полезные советы: Как настроить 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);

}

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