О построении провайдерской сети в небольшом городе. Часть 3

в 10:25, , рубрики: Cisco, dlink, linux, shaper, utm5, биллинг, доработка напильником, провайдер, Сетевое оборудование, Сетевые технологии, сеть, системное администрирование, шейпер, метки: , , , , , , , , ,

Предыдущие статьи серии:
О построении провайдерской сети в небольшом городе. Часть 2
О построении провайдерской сети в небольшом городе. Часть 1

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

image

Снова Cisco

Вернусь к настройке маршрутизатора. C увеличением абонентской базы увеличилось количество любителей торрентов, поскольку циска у меня не очень мощная, то это стало проблемой. Когда количество соединений превышало некоторый критический порог маршрутизатор «прилегал» отдохнуть, периодически пытаясь все же тащить нагруженную на него работу.

Применив прокачанный навык «гугление», был найден рецепт — ограничить число соединений с одного внутреннего IP. Опытным путем было установлено, что 500 соединений на одного абонента вполне достаточно. Для организаций же пришлось поднять лимит до 10000 соединений, поскольку количество компьютеров в организациях, находящихся за NAT их бытовых маршрутизаторов, может быть более десяти. Впрочем лимит соединений на организации можно сделать и больше, поскольку работают они в дневное время, когда нагрузка на сеть редко превышает средние значения, а вечером в моменты пиковых нагрузок их активность минимальна.

Установка ограничения для всех:

ip nat translation max-entries all-host 500

Если же требуется установить для какого то IP другое ограничение (например, для организаций):

ip nat translation max-entries host 10.1.0.100 10000

Для просмотра статистики уже установленным ограничениям:

sh ip nat statistics

Ксати, без ввода команды, ограничивающей количество трансляций, невозможно посмотреть статистику по конкретным адресам.

При необходимости узнать настройку на конкретный адрес:

sh ip nat statistics | i 10.1.0.100

Выборка по максимальному количеству трансляций:

sh ip nat statistics | i max allowed N

N — количество трансляций

Также весьма желательно прописать таймауты на отдельные протоколы и порты, чтобы абоненты не жаловались на отсутствие доступа:

Скрытый текст

ip nat translation timeout 900
ip nat translation tcp-timeout 300
ip nat translation pptp-timeout 1800
ip nat translation udp-timeout 45
ip nat translation dns-timeout 5
ip nat translation icmp-timeout 10
ip nat translation port-timeout tcp 1600 10
ip nat translation port-timeout tcp 8080 10
ip nat translation port-timeout tcp 110 60
ip nat translation port-timeout tcp 25 60
ip nat translation port-timeout tcp 80 15

Далее спустя месяц наступило время Ч, поскольку у меня был лишь один внешний IP, то общее количество соединений от абонентов превысило максимальное количество трансляций на один внешний адрес. Обеспокоенные клиенты выражали свое обоснованное негодование вечерними «затыками», а я усиленно прокачивал скилл «гугление».

Все делал по инструкции, прописал пул адресов для двух имеющихся Vlan.

ip nat pool vlan2 XX.XX.XX.2 XX.XX.XX.3 prefix-length 24
ip nat pool vlan3 XX.XX.XX.4 XX.XX.XX.5 prefix-length 24

Затем прописал access-list'ы

ip access-list extended NAT1
 permit ip 10.1.0.0 0.0.255.255 any
ip access-list extended NAT2
 permit ip 10.2.0.0 0.0.255.255 any

Ну, и привязал первое ко второму:

ip nat inside source list NAT1 pool vlan2 overload
ip nat inside source list NAT2 pool vlan3 overload

А также удалил из старого access-list'та:

ip access-list extended NAT
 permit ip 10.2.0.0 0.0.255.255 any
 permit ip 10.1.0.0 0.0.255.255 any

И что я получил? А шиш! Дальше я пару дней провел в периодических попытках менять настройки и запустить, но ничего не помогало. Исчерпав все свои варианты, я решил связаться с техподдержкой вышестоящего магистрального провайдера и поинтересоваться — «А прописали ли вы, друзья мои любезные, указанный в договоре пул адресов с маской /24, у себя в маршрутизаторе?» Далее я узнаю — «А этот пул мы отдали другим»… приехали. А на маршрутизатор вообще не прописывали. Вот и верь после этого людям!

В общем история закончилась тем, что мне выдали другой пул адресов с маской /24. Хотя вначале их технический специалист даже пытался брыкаться по принципу «Мы сейчас так щедро пулы не раздаем», но, ладно, ситуация утряслась и все заработало. Абоненты разбежаться не успели и то хорошо.

О построении провайдерской сети в небольшом городе. Часть 3

Настройка UTM5

Настройка самого биллинга подробно описана в поставляющемся «Руководстве администратора», которое идет как в бумажном виде, так и электроном на диске с самим биллингом UTM5. Также руководства можно просмотреть на официальном сайте в разделе «Документация».

Из нестандартного — пришлось прописывать отсутствующие зависимости пакетов, создавая линки с существующих версий пакетов, на уже несуществующие. Эти линки, с большой долей вероятности, придется восстанавливать после каждого обновления пакетной базы используемого дистрибутива. Программисты биллинга почему то не придумали грамотного решения для обхода этого неудобства.

На один из серверов я установил сам биллинг (UTM5 Core — ядро системы), а на шейпер был водружен демон исполнения команд поступающих от ядра (UTM5 RFW). Демон запускает скрипт и передает данные к утилите tc из пакета iproute2, которая и режет трафик.

У этого демона есть одна нехорошая особенность — иногда при перезагрузке системы он запускается криво и не выполняется. Происходит такое один раз на 10-15 перезагрузок системы. Побороть это я не смог, вероятно радиус кривизны у разработчиков был не совсем точно выставлен при разработке. Приходится вручную завершать сервис и перезапускать его или просто еще раз перезагружать систему.

Скрытый текст

О построении провайдерской сети в небольшом городе. Часть 3

Также в работе шейпера под высокой нагрузкой наблюдается накопление некоторой энтропии (не знаю как это назвать по другому) и деградация пропускной способности. Я эту проблему пока «решил» только перезапуском раз в сутки всего сервера, в ночное время.

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

Скрипт задающий правила шейпера в режиме Bridge

#!/bin/bash
if="eth0"
if1="eth1"
echo $*
#echo "First create:"
#echo "tc qdisc add dev $if root handle 1: htb"
#echo "tc qdisc add dev $if1 root handle 2: htb"
case "$6" in
###############################################################################
# DELETE INPUT DATA
###############################################################################
0)
echo "delete PREROUTING"
iptables -t mangle -D PREROUTING -s $2/$3 -j MARK --set-mark $1
#
echo "delete POSTROUTING"
iptables -t mangle -D POSTROUTING -d $2/$3 -j MARK --set-mark $1
#
echo "delete TC FILTER $if"
tc filter del dev $if parent 1: protocol 802.1q prio 3 handle $1 fw classid 1:$1
#
echo "delete TC CLASS $if"
tc class del dev $if parent 1:1 classid 1:$1 htb rate 1kbit burst 20k
;;
###############################################################################
# ADD INPUT DATA
###############################################################################
1)
echo "add PREROUTING"
iptables -t mangle -A PREROUTING -s $2/$3 -j MARK --set-mark $1
#
echo "add POSTROUTING"
iptables -t mangle -A POSTROUTING -d $2/$3 -j MARK --set-mark $1
#
echo "delete TC FILTER $if"
tc filter del dev $if parent 1: protocol 802.1q prio 3 handle $1 fw classid 1:$1
#
echo "delete TC CLASS $if"
tc class del dev $if parent 1:1 classid 1:$1 htb rate 1kbit burst 20k
#
echo "add TC CLASS $if"
tc class add dev $if parent 1:1 classid 1:$1 htb rate $5kbit burst 20k
#------------------------------------------------------------------------------
if [ "$7" = 0 ]
then
#
echo "add TC FILTER $if"
tc filter add dev $if parent 1: protocol 802.1q prio 3 handle $1 fw classid 1:$1
#---------------------------------------
else
#
echo "add TC FILTER $if"
tc filter add dev $if parent 1: protocol 802.1q prio 3 handle $1 fw classid 1:2
#
fi
#------------------------------------------------------------------------------
;;
###############################################################################
# CHANGE INPUT DATA
###############################################################################
2)
#
echo "change TC CLASS $if"
tc class change dev $if parent 1:1 classid 1:$1 htb rate $5kbit burst 20k
#
;;
###############################################################################
# DELETE OUTPUT DATA
###############################################################################
3)
echo "delete TC FILTER $if1"
tc filter del dev $if1 parent 2: protocol ip prio 3 handle $1 fw classid 2:$1
#
echo "delete TC CLASS $if1"
tc class del dev $if1 parent 2:1 classid 2:$1 htb rate 1kbit burst 20k
;;
###############################################################################
# ADD OUTPUT DATA
###############################################################################
4)
echo "delete TC FILTER $if1"
tc filter del dev $if1 parent 2: protocol ip prio 3 handle $1 fw classid 2:$1
#
echo "delete TC CLASS $if1"
tc class del dev $if1 parent 2:1 classid 2:$1 htb rate 1kbit burst 20k
#
echo "add TC CLASS $if1"
tc class add dev $if1 parent 2:1 classid 2:$1 htb rate $5kbit burst 20k
#------------------------------------------------------------------------------
if [ "$7" = 0 ]
then
#
echo "add TC FILTER $if1"
tc filter add dev $if1 parent 2: protocol ip prio 3 handle $1 fw classid 2:$1
#---------------------------------------
else
#
echo "add TC FILTER $if1"
tc filter add dev $if1 parent 2: protocol ip prio 3 handle $1 fw classid 2:2
#
fi
#------------------------------------------------------------------------------
;;
###############################################################################
# CHANGE OUTPUT DATA
###############################################################################
5)
#
echo "change TC CLASS $if1"
tc class change dev $if1 parent 2:1 classid 2:$1 htb rate $5kbit burst 20k
#
;;
###############################################################################
# CHANGE BLOCK_TYPE
###############################################################################
6)
echo "delete TC FILTER $if"
tc filter del dev $if parent 1: protocol 802.1q prio 3 handle $1 fw classid 1:$1
#------------------------------------------------------------------------------
if [ "$7" = 0 ]
then
#
echo "add TC FILTER $if block off"
tc filter add dev $if parent 1: protocol 802.1q prio 3 handle $1 fw classid 1:$1
#---------------------------------------
else
#
echo "add TC FILTER $if block on"
tc filter add dev $if parent 1: protocol 802.1q prio 3 handle $1 fw classid 1:2
#
fi
#------------------------------------------------------------------------------
echo "delete TC FILTER $if1"
tc filter del dev $if1 parent 2: protocol ip prio 3 handle $1 fw classid 2:$1
#------------------------------------------------------------------------------
if [ "$7" = 0 ]
then
#
echo "add TC FILTER $if1 block off"
tc filter add dev $if1 parent 2: protocol ip prio 3 handle $1 fw classid 2:$1
#---------------------------------------
else
#
echo "add TC FILTER $if1 block on"
tc filter add dev $if1 parent 2: protocol ip prio 3 handle $1 fw classid 2:2
#
fi
#------------------------------------------------------------------------------
;;
###############################################################################
*)
echo "Usage: `basename $0` {UID UIP UBITS UMASK BANDWIDTH [0|1|2]}" >&2
exit 64
;;
esac

Полезные инструменты

О построении провайдерской сети в небольшом городе. Часть 3

Насколько мне известно на Хабре не много любителей Perl. Не раз встречал отрицательные высказывания в комментариях. Не являясь специалистом в этом языке, не могу знать глубинные причины нелюбви посетителей ресурса к именно этому языку. Мой коллега по бывшей работе, однако, во всю его использовал и весьма успешно. В частности разработал скрипт опроса коммутаторов, который я использую по сегодняшний день. Приведу его текст — вдруг кому то понадобится.

Скрипт проверки коммутаторов на Perl

#!/usr/bin/perl -w
use strict; use warnings;
use LWP;
my $timeout = 5;

my $ua = LWP::UserAgent -> new();
$ua -> timeout($timeout);

my %addr = (
	'172.16.0.1' => 'ГС DGS-3627G (2) Main',
# Vlan 10.1.x.x
	'10.1.0.28' => 'DES-3200-10 Первомайская 56/68',
	'10.1.0.29' => 'DES-3200-10 Гагарина 16',
	'10.1.0.30' => 'DES-3200-10 Гагарина 12',
# Vlan 10.2.x.x
	'10.2.0.50' => 'DES-3200-10 Мира 46а',
	'10.2.0.51' => 'DES-3200-10 МРЦ 5',
	'10.2.0.52' => 'DES-3200-10 Шорина 24',
);

my @bad;
foreach(sort (keys %addr)) {
	my $response = $ua -> get('http://'.$_);
	print "Checking $_ ... ";
	if ($response -> is_success() == 1) {
		print "HTTP online.n";
	} else {
		print "not responding in $timeout seconds.n";
		push @bad, $_;
	}
}

print "nnTotal bad respond:n";
if ( $#bad >= 0 ) {
	map {print "t$_ => $addr{$_}n"} @bad;
} else {
	print "not foundn";
}

$a = getc(STDIN); #Ждет нажатия enter 
read(STDIN, $a, 1); #Ждет нажатия enter 
$a = <STDIN>; #Ждет нажатия enter

К сожалению у меня пока руки не дошли сделать полноценную систему мониторинга, да и под это дело нужен отдельный сервер, а бюджеты по прежнему ограничены. По этой причине выкручиваюсь как умею.

Скрытый текст

О построении провайдерской сети в небольшом городе. Часть 3

Настройка NUT — Network UPS Tools

Изначально, руководством, мне был выдан б/у стоечный UPS фирмы небезызвестной APC. Может быть в свои лучшие времена он и обеспечивал хоть какое то время автономной работы, но аккумуляторы на нем были явно на исходе.
О построении провайдерской сети в небольшом городе. Часть 3

После трех историй с отключением серверов при достаточно кратковременном пропадании питающей сети, бешенством негодующих абонентов, и парой тысяч моих нервных клеток павших смертью храбрых, руководство таки решилось на смену аккумуляторов. Однако цена новых аккумуляторов была едва ли не выше половины стоимости нового UPS этой же фирмы. По этой причине были приобретены новые UPS, но уже другой фирмы — Ippon Smart Power Pro 1400. Емкость их достаточна, чтобы выключить сервера при пропадании питания, а при коммутации между двумя резервными линиями не будет пропадания питания.

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

У меня получились такие настройки для NUT:
ups.conf

[ippon]
	driver = blazer_usb
	port = auto
	desc = "Ippon Smart Power Pro 1400"

upsd.conf

ACL all 0.0.0.0/0
ACL localhost 127.0.0.1/32
ACL lan 10.1.0.0/16
ACCEPT localhost
ACCEPT lan
REJECT all

upsmon.conf

MONITOR  ippon@localhost 1 monitor ippon master

Собственно остается только запустить сервисы, как описано в altlinux.org/nut

Автор: Mario_Z

Источник

Поделиться

* - обязательные к заполнению поля