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

Страницы

Расширенный поиск в статьях блога

8 февраля 2012 г.

Настройка шлюза в локальной сети, лимитирование скорости (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 позволяет создавать тарифы, возможна настройка приоритезации трафика, очень гибкая и функциональная система.
Настройка и установка займет у вас совсем не много времени.

=====================================================================
SwiftBlack on 13 Фев 2011 at 09:24 #
Отличный скрипт, только доработать напильником надо перед использованием.
Например сделать эту строку коментарием
Сколько секунд ожидать приема FIN до полного закрытия сокета
Перед командами start, stop и так далее требуется отступ в виде TAB,
после допила вполне чудненько работает в виде скрипта /etc/init.d/iptables на Ubuntu 10.04.1 LTS

.

Счетчик тИЦ и PR Яндекс.Метрика Msn bot last visit powered by MyPagerank.NetYahoo bot last visit powered by MyPagerank.Net ping fast  my blog, website, or RSS feed for Free