декабря 23 2007 02:29 пп

Настройка шлюза в локальной сети, лимитирование скорости (shaper), фаервол (iptables).

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

Для настройки всех необходимых сервисов я использовал одну программу стороннего разработчика (Master Shaper), все остальные необходимые программы присутствуют в штатных репозитариях Ubuntu Linux.




2. Настройка iptables (firewall & nat)

Начнем пожалуй с настройки NAT и фаервола, так же включим форвардинг и исправим некоторые параметры SYSCTL, для выделения нужного количества ресурсов, если у вас к примеру более 5000 компьютеров в локальной сети.

Реализовать все это можно с помощью одного скрипта, который приведен ниже, все парамтры с комментариями.

Код:

#!/bin/bash

OUT="eth0" # Имя исходящего интерфейса, смотрящего в интернет.
OUTADDR="1.1.1.1" # Адрес исходящего интерфейса
IN="eth1" # Имя входящего интерфейса, смотрящего в локальную сеть
INADDR="2.2.2.2" # Адрес входящего интерфейса
NETWORK="10.0.0.0/8" # Адресация вашей локальной сети
ANYWHERE="0.0.0.0/0" # Назначение, любое.
PORTS="1024:65535" # Порты, которые считаются локальными
MULTICAST="224.0.0.0/4" # Мультикаст пакеты, если у вас не используется оставьте как есть,
# если используется IP TV тогда надо удалить этот пункт

ADMINS="2.2.2.3 2.2.2.4" # IP адреса администраторов, имеют полный доступ на сервер, без каких либо ограничений.

##############################################################################################
# Здесь прописаны параметры запуска\остановки\статуса скрипта. лучше не трогайте =)
# Остановка скрипта
case "$1" in
stop)
echo "Shutting down firewall..."

iptables --flush
iptables --delete-chain
iptables --table nat --flush
iptables --table filter --flush
iptables --table nat --delete-chain
iptables --table filter --delete-chain

iptables -t filter -P INPUT ACCEPT
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT

echo "...done"
;;
status)
echo $"Table: filter"
iptables --list
echo $"Table: nat"
iptables -t nat --list
;;
restart|reload)
$0 stop
$0 start
;;

##############################################################################################
# Запуск скрипта
start)
echo "Starting Firewall..."
echo ""

# Очистка таблиц и цепочек
iptables --flush
iptables --delete-chain
iptables --table nat --flush
iptables --table filter --flush
iptables --table nat --delete-chain
iptables --table filter --delete-chain

# Назначение глобальных политик фаервола
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD

# Загружаем модули, для корректной работы VPN, Active ftp, DCC in IRC которые будут идти через нат.
modprobe ip_nat_ftp
modprobe ip_nat_pptp
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc

# Изменение параметров SYSCTL
# Включение форвардинга
echo 1 > /proc/sys/net/ipv4/ip_forward
# Включение форвардинга для VPN
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
# Увеличение размера очередей
echo 32000000 > /proc/sys/net/ipv4/netfilter/ip_conntrack_max
# Время ожидания до закрытия соединения
echo 14400 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_established
# Время ожидания до посылки FIN пакета
echo 60 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_fin_wait
# Время ожидания до посылки FIN пакета
echo 10 > /proc/sys/net/ipv4/netfilter/ip_conntrack_tcp_timeout_syn_sent
# Для защиты от syn флуда
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Увеличиваем размер backlog очереди
echo 1280 > /proc/sys/net/ipv4/tcp_max_syn_backlog
# Число начальных SYN и SYNACK пересылок для TCP соединения
echo 4 > /proc/sys/net/ipv4/tcp_synack_retries
echo 4 > /proc/sys/net/ipv4/tcp_syn_retries
#Какие порты использовать в качестве локальных TCP и UDP портов
echo "16384 61000" > /proc/sys/net/ipv4/ip_local_port_range
Сколько секунд ожидать приема FIN до полного закрытия сокета
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
# Как часто посылать сообщение о поддержании keep alive соединения
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
# Сколько пакетов проверки keepalive посылать, прежде чем соединение будет закрыто.
echo 2 > /proc/sys/net/ipv4/tcp_keepalive_probes
# Зaпрещаем TCP window scaling
echo 0 > /proc/sys/net/ipv4/tcp_window_scaling
# Запрещаем selective acknowledgements, RFC2018
echo 0 > /proc/sys/net/ipv4/tcp_sack
# Запрещаем TCP timestamps, RFC1323
echo 0 > /proc/sys/net/ipv4/tcp_timestamps
# Уличиваем размер буфера для приема и отправки данных через сокеты.
echo 1048576 > /proc/sys/net/core/rmem_max
echo 1048576 > /proc/sys/net/core/rmem_default
echo 1048576 > /proc/sys/net/core/wmem_max
echo 1048576 > /proc/sys/net/core/wmem_default
# Через какое время убивать соединеие закрытое на нашей стороне
echo 1 > /proc/sys/net/ipv4/tcp_orphan_retries

# Temporary eth0 completely disabled
#iptables -A INPUT -i $OUT -j DROP

# Admins - full control (even dagerous)
for admin_ips in $ADMINS; do

iptables -A INPUT -s $admin_ips -m state --state NEW -j ACCEPT
done

##############################################################################################

# Silently Drop Stealth Scans
# All of the bits are cleared
iptables -A INPUT -p icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
# SYN and FIN are both set
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
# SYN and RST are both set
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
# FIN and RST are both set
iptables -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
# FIN is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP
# PSH is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP
# URG is the only bit set, without the expected accompanying ACK
iptables -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP

##############################################################################################

# Multicast - ignore
iptables -A INPUT -s $MULTICAST -j DROP
iptables -A INPUT -d $MULTICAST -j DROP

# any established or related conns are welcome
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Loopback
iptables -A INPUT -i lo -j ACCEPT

# Statistics and auths for customers, ping tests
for net_ips in $NETWORK; do

iptables -A INPUT -p icmp -i $IN --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp -i $OUT --icmp-type echo-request -j ACCEPT

done

############ Открываем нужные нам порты.
# FTP
iptables -A INPUT -p tcp --dport 21 -m state --state NEW -j ACCEPT
# PASSIVE FTP
iptables -t filter -A INPUT -p tcp -m tcp --dport 50000:50500 -m state --state NEW -j ACCEPT
iptables -t filter -A INPUT -p udp -m udp --dport 50000:50500 -m state --state NEW -j ACCEPT
# APACHE
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT

########### OUTPUT

iptables -A OUTPUT -p icmp --icmp-type timestamp-reply -j DROP

########### NAT Вписываем сюда IP своих компьютеров в локальной сети.

iptables -t nat -A POSTROUTING -s 2.2.2.10 -o $OUT -j MASQUERADE
iptables -t nat -A POSTROUTING -s 2.2.2.11 -o $OUT -j MASQUERADE
iptables -t nat -A POSTROUTING -s 2.2.2.12 -o $OUT -j MASQUERADE
iptables -t nat -A POSTROUTING -s 2.2.2.13 -o $OUT -j MASQUERADE
iptables -t nat -A POSTROUTING -s 2.2.2.14 -o $OUT -j MASQUERADE

############ PORT FORWARD Сюда вписываем проброс портов локальную сеть.

iptables -t nat -A PREROUTING -p tcp -d $OUTADDR --dport 8230 -j DNAT --to-destination 2.2.2.10:8230
iptables -t filter -A FORWARD -i $OUT -d 2.2.2.10 -p tcp --dport 8230 -j ACCEPT

echo "...done"

echo "--> IPTABLES firewall loaded/activated <--"

##--------------------------------End Firewall---------------------------------##

;;
*)
echo "Usage: firewall (start|stop|restart|status) EXTIF INTIF"
exit 1
esac

exit 0

После настройки этого скрипта под себя у вас выйдет фаервол с политикой DROP, и NAT.

3. Установка и настройка Shaper.

Скачайте с сайта разработчика дистрибутив программы Master Shaper .
В архиве вы найдете подробное описание продукта, а так инструкции по использованию и установки.
Программа имеет WEB интерфейс для работы и настройки, а так же серверную часть.
Master Shaper позволяет создавать тарифы, возможна настройка приоритезации трафика, очень гибкая и функциональная система.
Настройка и установка займет у вас совсем не много времени.

10 комментариев »

10 комментариев to “Настройка шлюза в локальной сети, лимитирование скорости (shaper), фаервол (iptables).”

  1. SwiftBlack on 13 Фев 2011 at 09:24 #

    Отличный скрипт, только доработать напильником надо перед использованием.
    Например сделать эту строку коментарием
    Сколько секунд ожидать приема FIN до полного закрытия сокета

    Перед командами start, stop и так далее требуется отступ в виде TAB,
    после допила вполне чудненько работает в виде скрипта /etc/init.d/iptables на Ubuntu 10.04.1 LTS

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

  2. foxvalera on 13 Мар 2011 at 10:45 #

    Добрый день у меня такая ситуация мне еще нужно чтоб Samba сервер работал. Как видоизменить скрипт для портов локальной сети!! на обоих интерфейсах!

  3. Максим Степанов on 13 Мар 2011 at 14:05 #

    Добавить правило для самбы. По аналогии с FTP пнаример.

  4. foxvalera on 13 Мар 2011 at 19:23 #

    SwiftBlack из комента данного пользователя не совсем пойму что и где допиливать нужно?

  5. Максим Степанов on 13 Мар 2011 at 20:37 #

    Он имел ввиду просто косметические правки, что бы скрипт легче читался.

  6. foxvalera on 13 Мар 2011 at 20:52 #

    Полностью моя задача выглядит так: у меня есть две подсети на предприятии, их нужно разделить шлюзом на линуксе, на данном шлюзе должен быть установлен файловый сервер и веб сервер(локальный), которые будут видны в обеих подсетях. Канал интернета поступает от прокси сервера из первой подсети его на шлюзе нужно распределить между пользователями второй подсети!
    Сразу отвечу на вопрос почему такое сложное разделение, потому как в первой подсети очень много вирусов и админ первого отделения не собирается ничего делать!!

  7. foxvalera on 13 Мар 2011 at 20:54 #

    Еще б русскоязычная инструкция не помешал по настройке Master Shaper.

  8. Максим Степанов on 13 Мар 2011 at 21:07 #

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

  9. foxvalera on 13 Мар 2011 at 21:57 #

    Сколько денег?

  10. Максим Степанов on 13 Мар 2011 at 22:09 #

    Пишите в ICQ, Jabber, или на почту, все есть в разделе Контакты, в шапке сайта, обсудим.

Trackback URI | Comments RSS

Leave a Reply

You must be logged in to post a comment.

  • Реклама

  • Ссылки



    Лазерная эпиляция! Александритовый, неодимовый лазеры! Доступные цены
    cosmic-center.ru

  • Теги



Server load average: 0.00, 0.01, 0.00
Server uptime: 409 days, 20:03
Your IP is: 54.145.68.45.