Програмний інтернет шлюз для вже не маленької компанії (Shorewall, QoS на всю широчінь). Частина 3

Уявляю третю статтю із серії, орієнтованих на «середнього рівня» системних адміністраторів, для досвідчених я навряд чи відкрию щось нове.

У цих статтях ми розглянемо побудову інтернет шлюзу linux, що дозволяє зв'язати кілька офісів компанії, і забезпечити обмежений доступ в мережу, приоритетзацию трафіку (QoS) і просту балансування навантаження з резервуванням каналу між двома провайдерами.

Конкретно в цій частині:
  • QoS на всю широчінь в Shorewall
  • Більш детальна настройка Shorewall
  • Розподіл трафіку каналами згідно з протоколами
  • Милиці, без них нікуди
А в першої частини були розглянуті:
  • Найпростіша налаштування Shorewall
  • Страшенно складна настройка dnsmasq
  • Не менш складна налаштування OpenVPN
  • для багатьох продовжують адмінів нетипова, динамічна маршрутизація, на прикладі OSPF
А у другий:
  • Більш детальна настройка Shorewall
  • Страшний і не зрозумілий QoS
  • Балансування навантаження і резервування

Планування класифікації трафіку
Все, що описано далі, це просто моє бачення питання, ваша думка може (і по хорошому повинно бути) іншим.

Отже, виділимо кілька видів трафіку:
  • Службовий трафік (DNS, ICMP, TCP/ACK)
  • Тунельний трафік
  • Voip трафік
  • Адміністративний (SSH і т. п.)
  • Користувальницький
    • Високо пріоритетний
    • Звичайний

    • Низько пріоритетний
    • VPN Трафік
У свою чергу, користувальницький трафік, всередині кожного класу, ми поділимо між деякими службами.
Усвідомити всю складну конфігурацію можна подивившись на картинку (лівий верхній кут: батьківський клас, правий верхній: пріоритет, по нижнім кутам: мінімальна і максимальна швидкість):



Розрулювати ми будемо трафік на не дуже то і швидкому каналі 1 мбіт (подумати тільки, не так давно і 128 кбит було круто), точніше на двох (щоб було цікавіше)!

Правила працюють таким чином: якщо в класі є кілька дочірніх класів, з однаковим пріоритетом, то при розрахунку, кому скільки смуги дати зверх ліміту, буде використана пропорція від мінімальних швидкостей цих класів. Якщо пріоритети не однакові, то вони увійдуть в розрахунок як додатковий ваговий коефіцієнт. Понад мінімальної смуги, виділеної у класу, є ще якась не розподілена смуга, вона може бути використана, якщо канал вільний в достатній мірі. У більшості випадків я вказував для цієї смуги ключове значення full (максимум батьківського класу).

Для підвищення ефективності використання каналу, не варто ділити його між усіма класами за мінімальною доступній швидкості. У такій конфігурації, перерозподіл швидкості буде йти з дуже великою затримкою (SIP, а точніше RTP цьому невимовно зрадіє). У будь-якому випадку, швидкість перерозподіляється з деякою затримкою, і вона найбільше залежить від видів використовуваних протоколів користувачами. Приміром, torrent, отожравший доступний максимум, вкрай повільно сходить з займаної смуги (до хвилин), проблема з-за великого числа джерел трафіку до нашого сервера (поки вони всі відреагують на зниження швидкості...).

Але досить лірики, почнемо (частина конфіги ми використовуємо з минулих статей, якщо щось мною не налаштоване тут, ви знаєте де шукати):

Оголосимо змінні:
params
#
# Shorewall -- /etc/shorewall/params
#
# Assign any variables that you need here.
#
# It is suggested that variable names begin with an upper case letter
# to distinguish them from variables used within the internally
# Shorewall programs
#
# Example:
#
# NET_IF=eth0
# NET_BCAST=130.252.100.255
# NET_OPTIONS=routefilter,norfc1918
#
# Example (/etc/shorewall/interfaces record):
#
# net $NET_IF $NET_BCAST $NET_OPTIONS
#
# The result will be the same as if the record had been written
#
# net eth0 130.252.100.255 routefilter,norfc1918
#
###############################################################################
IF_RED1=eth0
# Шлюзи однакові, так як працюємо в лабораторії, і обидва інтерфейсу дивляться в одну мережу
GW_RED1=192.168.10.1
IF_RED2=eth2
GW_RED2=192.168.10.1
IF_GRN=eth1
NET_GRN=172.16.0.0/23
IF_TUN=tap+
# Тут у нас милиці з-за повної підтримки ipset у всіх місцях, обіцяють виправити в наступних релізах
IP_SLOW=172.16.0.45
IP_SLOW_SPEC=172.16.0.45
IP_VIP=172.16.0.46
IP_VIP_SPEC=172.16.0.46
IP_NORMAL=$NET_GRN
IP_NORMAL_SPEC=172.16.0.47
#LAST LINE -- DO NOT REMOVE


Оголосимо провайдерів:
providers
#
# Shorewall -- /etc/shorewall/providers
#
# For information about entries in this file, type "man shorewall-providers"
#
# For additional information, see http://shorewall.net/MultiISP.html
#
############################################################################################
#NAME NUMBER MARK DUPLICATE GATEWAY INTERFACE OPTIONS COPY
pr1 1 0x10000 - $IF_RED1 GW_RED1 track,balance=1
pr2 2 0x20000 - $IF_RED2 GW_RED2 track,balance=1
# Цей розділ розкрию трохи пізніше. Це костылики :)
tap0 4 0x30000 - tap0 - loose
tap1 3 0x40000 - tap1 - loose


interfaces
#
# Shorewall -- /etc/shorewall/interfaces
#
# For information about entries in this file, type "man shorewall-interfaces"
#
# The manpage is also online at
# http://www.shorewall.net/manpages/shorewall-interfaces.html
#
###############################################################################
?FORMAT 2
###############################################################################
#ZONE INTERFACE OPTIONS
red $IF_RED1 dhcp,routeback,optional
red $IF_RED2 dhcp,routeback,optional
grn $IF_GRN dhcp,routeback,optional
tun tap0 dhcp,routeback,optional
tun tap1 dhcp,routeback,optional


Зробимо кой чого, під час запуску:
init
#
# Shorewall -- /etc/shorewall/init
#
# Add commands below that you want to be executed at the beginning of
# a "shorewall start", "shorewall-reload" або "shorewall restart" command.
#
# For additional information, see
# http://shorewall.net/shorewall_extension_scripts.htm
#
###############################################################################
modprobe ifb numifbs=3
ip link set ifb0 up
ip link set ifb1 up
ip link set ifb2 up
ipset -N ip_vip iphash
ipset -N ip_vip_spec iphash
ipset -N ip_normal iphash
ipset -A ip_normal $NET_GRN
ipset -N ip_normal_spec iphash
ipset -N ip_slow iphash
ipset -N ip_slow_spec iphash


started
#
# Shorewall -- /etc/shorewall/started
#
# Add commands below that you want to be executed after shorewall has
# been completely started, reloaded or restarted. The difference between
# this extension script and /etc/shorewall/start is that this one is
# invoked after the 'shorewall' chain has been created (thus
# signaling that the firewall is completely up).
#
# This script should not change the firewall configuration directly but
# may do so indirectly by running /sbin/shorewall with the 'nolock'
# option.
#
# See http://shorewall.net/shorewall_extension_scripts.htm for additional
# information.
#
###############################################################################
IPROUTE='/usr/sbin/ip'
IFS=$'\n'
for line in $(grep tap /etc/shorewall/providers | grep loose);do
IFS=$' \t\n' read -r -a line_ <<< "$line"
$IPROUTE route del default table ${line_[1]} >/dev/null 2 > &1
done


Доповнимо політику маршрутизації (необхідність цього кроку розкрию нижче):
rtrules
#
# Shorewall -- /etc/shorewall/rtrules
#
# For information about entries in this file, type "man shorewall-rtrules"
#
# For additional information, see http://www.shorewall.net/MultiISP.html
#
####################################################################################
#SOURCE DEST PROVIDER PRIORITY MASK
0.0.0.0/0 0.0.0.0/0 tap0 19001
0.0.0.0/0 0.0.0.0/0 tap1 19002


Оголосимо купу класів трафіка:
tcclasses
#
# Shorewall -- /etc/shorewall/tcclasses
#
# For information about entries in this file, type "man shorewall-tcclasses"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
#
###############################################################################
#INTERFACE:CLASS MARK RATE: CEIL PRIORITY OPTIONS
# DMAX:UMAX
INCLUDE tcclasses.1
INCLUDE tcclasses.2
INCLUDE tcclasses.3
INCLUDE tcclasses.4
INCLUDE tcclasses.5
INCLUDE tcclasses.6


tcclasses.1
#
# Shorewall -- /etc/shorewall/tcclasses
#
# For information about entries in this file, type "man shorewall-tcclasses"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
#
###############################################################################
#INTERFACE:CLASS MARK RATE: CEIL PRIORITY OPTIONS
# DMAX:UMAX
# Виділяємо трафік, який потрапив на інтерфейс локальної мережі
# В цьому класі буде весь трафік з інтернету
1:1:2 - 1mbit 2mbit 1
# В цьому від локальної мережі
1:1:3 - 998mbit 999mbit 2

# Виділимо ACK пакетів широку смугу. Мінімальна припускає, що є
# тільки TCP трафіку з максимальним MTU (найменше пакетів ACK), та для
# плохово варіанти, беремо що у нас всі пакети в четверь від MTU (пакетів ACK більше),
# ще виділимо потік пакетів до одного одержувача
1:2:4 - full*64/1500 full*64*4/1500 1 tcp-ack
# Для SSH у нас два класу, перший, для коротких пакетів (в основному команди)
1:2:5 - 32kbit 128kbit 2 
# Другий для довгих пакетів (для передачі файлів приміром)
1:2:6 - 32kbit full*9/10 5 flow=dst
# Окрема смуга для DNS і ICMP,
1:2:7 - 32kbit 128kbit 3
# дозволить зменшити затримки на запити DNS
1:7:8 - 16kbit full 1 
# і зробить PING цікавіше
1:7:9 - 16kbit full 1 
# Тут виділяємо окрему смугу для трафіку VoIP
1:2:A - 180kbit 180kbit 1
# Це для чистого SIP (один канал u(a)law), використовуємо ще й маркування пакетів від nf_conntrack_sip
1:A:B 1 90kbit full 1
# Це для SIP VPN тунеле (міжофісний трафік)
1:A:C - 90kbit full 1
# Виділяємо користувальницький трафік
1:2:D - 252kbit full 4

# Клас звичайного користувача трафіку
1:D:E - 100kbit full 2
# Тут живе VPN (який запускає користувач)
1:D:F - 32kbit full 1 
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються)
1:E:10 - 25kbit full 1 flow=dst
# Для RDP
1:E:12 - 15kbit full 2 flow=dst
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки
1:E:13 - 15kbit full 3 flow=dst
# Для поштового трафіку оперативність зазвичай менш важлива
1:E:14 - 10kbit full 4 flow=dst
# Сюди помістимо трафік спеціального сервісу (наприклад, трансляцію Webinar)
1:E:16 - 25kbit full 2 flow=dst
# Сюди впаде все, що ми не класифікували явно
1:E:17 - 10kbit full 5 default,flow=dst

# Клас VIP користувача трафіку (VIP-ів у нас зазвичай не багато), їм пріоритет вище
1:D:18 - 60kbit full 1
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються)
1:18:19 - 20kbit full 1
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки
1:18:1A - 10kbit full 3
# Для поштового трафіку оперативність зазвичай менш важлива
1:18:1B - 10kbit full 4
# Сюди помістимо трафік VIP спеціального сервісу
1:18:1C - 20kbit full 2 

# Клас покараних користувачів
1:D:1D - 60kbit full 3
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються)
1:1D:1E - 20kbit full 1 
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки
1:1D:1F - 10kbit full 3
# Для поштового трафіку оперативність зазвичай менш важлива
1:1D:20 - 10kbit full 4 
# Сюди помістимо трафік спеціального сервісу, нехай мучаться
1:1D:21 - 20kbit full 2 


tcclasses.2
#
# Shorewall -- /etc/shorewall/tcclasses.2
#
# For information about entries in this file, type "man shorewall-tcclasses"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
#
###############################################################################
#INTERFACE:CLASS MARK RATE: CEIL PRIORITY OPTIONS
# DMAX:UMAX
# Виділяємо трафік, який потрапив на інтерфейс локальної мережі
# В цьому класі буде весь трафік з інтернету
2:1:2 - 1mbit 1mbit 1
# В цьому від локальної мережі
2:1:3 - 999mbit 999mbit 2

# Виділимо ACK пакетів широку смугу. Мінімальна припускає, що є
# тільки TCP трафіку з максимальним MTU (найменше пакетів ACK), та для
# плохово варіанти, беремо що у нас всі пакети в четверь від MTU (пакетів ACK більше),
# ще виділимо потік пакетів до одного одержувача
2:2:4 - full*64/1500 full*64*4/1500 1 tcp-ack
# Для SSH у нас два класу, перший, для коротких пакетів (в основному команди)
2:2:5 - 32kbit 128kbit 2 
# Другий для довгих пакетів (для передачі файлів приміром)
2:2:6 - 32kbit full*9/10 5 flow=nfct-src
# Окрема смуга для DNS і ICMP,
2:2:7 - 32kbit 128kbit 3
# дозволить зменшити затримки на запити DNS
2:7:8 - 16kbit full 1 
# і зробить PING цікавіше
2:7:9 - 16kbit full 1 
# Тут виділяємо окрему смугу для трафіку VoIP
2:2:A - 180kbit 180kbit 1
# Це для чистого SIP (один канал u(a)law), використовуємо ще й маркування пакетів від nf_conntrack_sip
2:A:B 1 90kbit full 1
# Це для SIP VPN тунеле (міжофісний трафік)
2:A:C - 90kbit full 1
# Виділяємо користувальницький трафік
2:2:D - 252kbit full 4

# Клас звичайного користувача трафіку
2:D:E - 100kbit full 2
# Тут живе VPN (який запускає користувач)
2:D:F - 32kbit full 1 
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються)
2:E:10 - 25kbit full 1 flow=nfct-src
# Для RDP
2:E:12 - 15kbit full 2 flow=nfct-src
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки
2:E:13 - 15kbit full 3 flow=nfct-src
# Для поштового трафіку оперативність зазвичай менш важлива
2:E:14 - 10kbit full 4 flow=nfct-src
# Сюди помістимо трафік спеціального сервісу (наприклад, трансляцію Webinar)
2:E:16 - 25kbit full 2 flow=nfct-src
# Сюди впаде все, що ми не класифікували явно
2:E:17 - 10kbit full 5 default,flow=nfct-src

# Клас VIP користувача трафіку (VIP-ів у нас зазвичай не багато), їм пріоритет вище
2:D:18 - 60kbit full 1
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються)
2:18:19 - 20kbit full 1
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки
2:18:1A - 10kbit full 3
# Для поштового трафіку оперативність зазвичай менш важлива
2:18:1B - 10kbit full 4
# Сюди помістимо трафік VIP спеціального сервісу
2:18:1C - 20kbit full 2 

# Клас покараних користувачів
2:D:1D - 60kbit full 3
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються)
2:1D:1E - 20kbit full 1 
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки
2:1D:1F - 10kbit full 3
# Для поштового трафіку оперативність зазвичай менш важлива
2:1D:20 - 10kbit full 4 
# Сюди помістимо трафік спеціального сервісу, нехай мучаться
2:1D:21 - 20kbit full 2 


tcclasses.3
#
# Shorewall -- /etc/shorewall/tcclasses.3
#
# For information about entries in this file, type "man shorewall-tcclasses"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
#
###############################################################################
#INTERFACE:CLASS MARK RATE: CEIL PRIORITY OPTIONS
# DMAX:UMAX
# Виділимо ACK пакетів широку смугу. Мінімальна припускає, що є
# тільки TCP трафіку з максимальним MTU (найменше пакетів ACK), та для
# плохово варіанти, беремо що у нас всі пакети в четверь від MTU (пакетів ACK більше),
# ще виділимо потік пакетів до одного одержувача
3:1:4 - full*64/1500 full*64*4/1500 1 tcp-ack
# Для SSH у нас два класу, перший, для коротких пакетів (в основному команди)
3:1:5 - 32kbit 128kbit 2 
# Другий для довгих пакетів (для передачі файлів приміром)
3:1:6 - 32kbit full*9/10 5 flow=dst
# Окрема смуга для DNS і ICMP,
3:1:7 - 32kbit 128kbit 3
# дозволить зменшити затримки на запити DNS
3:7:8 - 16kbit full 1 
# і зробить PING цікавіше
3:7:9 - 16kbit full 1 
# Тут виділяємо окрему смугу для трафіку VoIP
3:1:A - 180kbit 180kbit 1
# Це для чистого SIP (один канал u(a)law), використовуємо ще й маркування пакетів від nf_conntrack_sip
3:A:B 1 90kbit full 1
# Це для SIP VPN тунеле (міжофісний трафік)
3:A:C - 90kbit full 1
# Виділяємо користувальницький трафік
3:1:D - 252kbit full 4

# Клас звичайного користувача трафіку
3:D:E - 100kbit full 2
# Тут живе VPN (який запускає користувач)
3:D:F - 32kbit full 1 
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються)
3:E:10 - 25kbit full 1 flow=dst
# Для RDP
3:E:12 - 15kbit full 2 flow=dst
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки
3:E:13 - 15kbit full 3 flow=dst
# Для поштового трафіку оперативність зазвичай менш важлива
3:E:14 - 10kbit full 4 flow=dst
# Сюди помістимо трафік спеціального сервісу (наприклад, трансляцію Webinar)
3:E:16 - 25kbit full 2 flow=dst
# Сюди впаде все, що ми не класифікували явно
3:E:17 - 10kbit full 5 default,flow=dst


tcclasses.4
#
# Shorewall -- /etc/shorewall/tcclasses.4
#
# For information about entries in this file, type "man shorewall-tcclasses"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
#
###############################################################################
#INTERFACE:CLASS MARK RATE: CEIL PRIORITY OPTIONS
# DMAX:UMAX
# Виділимо ACK пакетів широку смугу. Мінімальна припускає, що є
# тільки TCP трафіку з максимальним MTU (найменше пакетів ACK), та для
# плохово варіанти, беремо що у нас всі пакети в четверь від MTU (пакетів ACK більше),
# ще виділимо потік пакетів до одного одержувача
4:1:4 - full*64/1500 full*64*4/1500 1 tcp-ack
# Для SSH
4:1:6 - 32kbit full*9/10 5 flow=nfct-src
# Окрема смуга для DNS і ICMP,
4:1:7 - 32kbit 128kbit 3
# дозволить зменшити затримки на запити DNS
4:7:8 - 16kbit full 1 
# і зробить PING цікавіше
4:7:9 - 16kbit full 1 
# Тут виділяємо окрему смугу для трафіку VoIP
4:1:A - 180kbit 180kbit 1
# Це для чистого SIP (один канал u(a)law), використовуємо ще й маркування пакетів від nf_conntrack_sip
4:A:B 1 90kbit full 1
# Це для SIP VPN тунеле (міжофісний трафік)
4:A:C - 90kbit full 1
# Виділяємо користувальницький трафік
4:1:D - 252kbit full 4

# Клас звичайного користувача трафіку, іншого тут немає.
4:D:E - 100kbit full 2
# Тут живе VPN (який запускає користувач)
4:D:F - 32kbit full 1 
# Для RDP
4:E:12 - 15kbit full 2 flow=nfct-src
# Для HTTP(S)
4:E:13 - 25kbit full 3 flow=nfct-src
# Для поштового трафіку оперативність зазвичай менш важлива
4:E:14 - 15kbit full 4 flow=nfct-src
# Сюди помістимо трафік спеціального сервісу (наприклад, трансляцію Webinar)
4:E:16 - 25kbit full 2 flow=nfct-src
# Сюди впаде все, що ми не класифікували явно
4:E:17 - 10kbit full 5 default,flow=nfct-src


tcclasses.5
#
# Shorewall -- /etc/shorewall/tcclasses.5
#
# For information about entries in this file, type "man shorewall-tcclasses"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
#
###############################################################################
#INTERFACE:CLASS MARK RATE: CEIL PRIORITY OPTIONS
# DMAX:UMAX
# Виділимо ACK пакетів широку смугу. Мінімальна припускає, що є
# тільки TCP трафіку з максимальним MTU (найменше пакетів ACK), та для
# плохово варіанти, беремо що у нас всі пакети в четверь від MTU (пакетів ACK більше),
# ще виділимо потік пакетів до одного одержувача
5:1:4 - full*64/1500 full*64*4/1500 1 tcp-ack
# Для SSH у нас два класу, перший, для коротких пакетів (в основному команди)
5:1:5 - 32kbit 128kbit 2 
# Другий для довгих пакетів (для передачі файлів приміром)
5:1:6 - 32kbit full*9/10 5 flow=dst
# Окрема смуга для DNS і ICMP,
5:1:7 - 32kbit 128kbit 3
# дозволить зменшити затримки на запити DNS
5:7:8 - 16kbit full 1 
# і зробить PING цікавіше
5:7:9 - 16kbit full 1 
# Тут виділяємо окрему смугу для трафіку VoIP
5:1:A - 180kbit 180kbit 1
# Це для чистого SIP (один канал u(a)law), використовуємо ще й маркування пакетів від nf_conntrack_sip
5:A:B 1 90kbit full 1
# Це для SIP VPN тунеле (міжофісний трафік)
5:A:C - 90kbit full 1
# Виділяємо користувальницький трафік
5:1:D - 252kbit full 4

# Клас звичайного користувача трафіку
5:D:E - 100kbit full 2
# Тут живе VPN (який запускає користувач)
5:D:F - 32kbit full 1 
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються)
5:E:10 - 25kbit full 1 flow=dst
# Для RDP
5:E:12 - 15kbit full 2 flow=dst
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки
5:E:13 - 15kbit full 3 flow=dst
# Для поштового трафіку оперативність зазвичай менш важлива
5:E:14 - 10kbit full 4 flow=dst
# Сюди помістимо трафік спеціального сервісу (наприклад, трансляцію Webinar)
5:E:16 - 25kbit full 2 flow=dst
# Сюди впаде все, що ми не класифікували явно
5:E:17 - 10kbit full 5 default,flow=dst


tcclasses.6
#
# Shorewall -- /etc/shorewall/tcclasses.6
#
# For information about entries in this file, type "man shorewall-tcclasses"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
#
###############################################################################
#INTERFACE:CLASS MARK RATE: CEIL PRIORITY OPTIONS
# DMAX:UMAX
# Виділимо ACK пакетів широку смугу. Мінімальна припускає, що є
# тільки TCP трафіку з максимальним MTU (найменше пакетів ACK), та для
# плохово варіанти, беремо що у нас всі пакети в четверь від MTU (пакетів ACK більше),
# ще виділимо потік пакетів до одного одержувача
6:1:4 - full*64/1500 full*64*4/1500 1 tcp-ack
# Для SSH
6:1:6 - 32kbit full*9/10 5 flow=nfct-src
# Окрема смуга для DNS і ICMP,
6:1:7 - 32kbit 128kbit 3
# дозволить зменшити затримки на запити DNS
6:7:8 - 16kbit full 1 
# і зробить PING цікавіше
6:7:9 - 16kbit full 1 
# Тут виділяємо окрему смугу для трафіку VoIP
6:1:A - 180kbit 180kbit 1
# Це для чистого SIP (один канал u(a)law), використовуємо ще й маркування пакетів від nf_conntrack_sip
6:A:B 1 90kbit full 1
# Це для SIP VPN тунеле (міжофісний трафік)
6:A:C - 90kbit full 1
# Виділяємо користувальницький трафік
6:1:D - 252kbit full 4

# Клас звичайного користувача трафіку, іншого тут немає.
6:D:E - 100kbit full 2
# Тут живе VPN (який запускає користувач)
6:D:F - 32kbit full 1 
# Для RDP
6:E:12 - 15kbit full 2 flow=nfct-src
# Для HTTP(S)
6:E:13 - 25kbit full 3 flow=nfct-src
# Для поштового трафіку оперативність зазвичай менш важлива
6:E:14 - 15kbit full 4 flow=nfct-src
# Сюди помістимо трафік спеціального сервісу (наприклад, трансляцію Webinar)
6:E:16 - 25kbit full 2 flow=nfct-src
# Сюди впаде все, що ми не класифікували явно
6:E:17 - 10kbit full 5 default,flow=nfct-src


Якщо глянути на описи, можна помітити, що однакового дуже багато. Невелика різниця у використанні flow (угруповання трафіку в потоки). Самі потоки дозволяють боротися з таким явищем: один юзер встановлює купу сполук з різними адресами, і без потоків, він в рамках класу віджимає трафік у всіх інших. Вся тема в тому, що без потоків, поділ йде за безпосереднім з'єднанням, у кого їх більше, той в цілому більше на себе ковдру і відтягнув.

Ще невелика особливість, зовнішній інтерфейс (як фізичний, так і IFB), нічого не знає про структуру внутрішньої мережі (якщо використовується NAT), тому частина детальної класифікації відсутня.

Тепер будемо трафік класифікувати (для класів з ACK і MARK, описувати ми нічого не будемо, відповідний трафік сам туди впаде) і фільтрувати.

Запасемося підказками:


mangle
#
# Shorewall -- /etc/shorewall/mangle
#
# For information about entries in this file, type "man shorewall-mangle"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
# For usage in selecting among multiple ISPs, see
# http://shorewall.net/MultiISP.html
#
# See http://shorewall.net/PacketMarking.html for a detailed description of
# the Netfilter/Shorewall packet marking mechanism.
#
####################################################################################################################################################
#ACTION SOURCE DEST PROTO DEST SOURCE USER TEST LENGTH TOS CONNBYTES HELPER PROBABILITY DSCP
# PORT(S) PORT(S)
# Важливо, останній збіг і буде означати остаточну класифікацію!
# Відновимо мітку пакету з мітки з'єднання (якщо вона зараз 0)
RESTORE 0.0.0.0/0 0.0.0.0/0 all - - - 0
# Припиняємо подальшу обробку, якщо мітка вже стоїть
CONTINUE 0.0.0.0/0 0.0.0.0/0 all - - - !0
# Встановимо мітку для всіх SIP пакетів, включаючи RTP
MARK(1) 0.0.0.0/0 0.0.0.0/0 all - - - - - - - sip
# Якщо SIP трафік йде до нашої внутрішньої мережі (наприклад в іншу філію), логічним І з'єднати мітку пакету і нашого тунеля
MARK(|0x40000) 172.16.0.0/12 172.16.0.0/12 all - - - - - - - sip
MARK(|0x40000) 172.16.0.0/12 172.16.0.0/12 udp 4569
SAVE 0.0.0.0/0 0.0.0.0/0 all - - - !0

INCLUDE mangle.1
INCLUDE mangle.3
INCLUDE mangle.5


mangle.1
#
# Shorewall -- /etc/shorewall/mangle.1
#
# For information about entries in this file, type "man shorewall-mangle"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
# For usage in selecting among multiple ISPs, see
# http://shorewall.net/MultiISP.html
#
# See http://shorewall.net/PacketMarking.html for a detailed description of
# the Netfilter/Shorewall packet marking mechanism.
#
####################################################################################################################################################
#ACTION SOURCE DEST PROTO DEST SOURCE USER TEST LENGTH TOS CONNBYTES HELPER PROBABILITY DSCP
# PORT(S) PORT(S)
# Важливо, останній збіг і буде означати остаточну класифікацію!

# Клас звичайного користувача трафіку
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються), тут все, що від 0 до 256kb
CLASSIFY(1:10) - +ip_normal tcp - 80,443 - - - - 0:262144
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки,
# тут все, що від 256kb
CLASSIFY(1:13) - +ip_normal tcp - 80,443 - - - - 262145:
# Для поштового трафіку оперативність зазвичай менш важлива
CLASSIFY(1:14) - +ip_normal tcp - 25,110,143,465,587,993,995,2525,4190
# Сюди помістимо трафік спеціального сервісу (наприклад, трансляцію Webinar, з порту 32765)
CLASSIFY(1:16) - +ip_normal_spec tcp - 32765

# Клас VIP користувача трафіку (VIP-ів у нас зазвичай не багато), їм пріоритет вище
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються)
CLASSIFY(1:19) - +ip_vip tcp - 80,443 - - - - 0:262144
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки
CLASSIFY(1:1A) - +ip_vip tcp - 80,443 - - - - 262145:
# Для поштового трафіку оперативність зазвичай менш важлива
CLASSIFY(1:1B) - +ip_vip tcp - 25,110,143,465,587,993,995,2525,4190
# Сюди помістимо трафік VIP спеціального сервісу
CLASSIFY(1:1) - +ip_vip_spec tcp - 32765

# Клас покараних користувачів
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються)
CLASSIFY(1:1E) - +ip_slow tcp - 80,443 - - - - 0:262144
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки
CLASSIFY(1:1F) - +ip_slow tcp - 80,443 - - - - 262145:
# Для поштового трафіку оперативність зазвичай менш важлива
CLASSIFY(1:20) - +ip_slow tcp - 25,110,143,465,587,993,995,2525,4190
# Сюди помістимо трафік спеціального сервісу, нехай мучаться
CLASSIFY(1:21) - +ip_slow_spec tcp - 32765

# Тут живе VPN (який запускає користувач)
CLASSIFY(1:F) - - udp - 1194

# Це для IAX2
CLASSIFY(1:B) - - udp - 4569

# Це для SIP VPN тунеле (міжофісний трафік)
CLASSIFY(1:C) - - udp - 40032

# RDP
CLASSIFY(1:12) - - tcp - 3389
CLASSIFY(1:12) - - udp - 3389

# дозволить зменшити затримки на запити DNS
CLASSIFY(1:8) - - udp - 53
CLASSIFY(1:8) - - tcp - 53
# і зробить PING цікавіше
CLASSIFY(1:9) - - icmp echo-request,echo-reply

# Для SSH у нас два класу, перший, для коротких пакетів (в основному команди)
CLASSIFY(1:5) - - tcp - 22 - - 0:512
# Другий для довгих пакетів (для передачі файлів приміром)
CLASSIFY(1:6) - - tcp - 22 - - 513:

CLASSIFY(1:3) $NET_GRN $NET_GRN


mangle.3
#
# Shorewall -- /etc/shorewall/mangle.3
#
# For information about entries in this file, type "man shorewall-mangle"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
# For usage in selecting among multiple ISPs, see
# http://shorewall.net/MultiISP.html
#
# See http://shorewall.net/PacketMarking.html for a detailed description of
# the Netfilter/Shorewall packet marking mechanism.
#
####################################################################################################################################################
#ACTION SOURCE DEST PROTO DEST SOURCE USER TEST LENGTH TOS CONNBYTES HELPER PROBABILITY DSCP
# PORT(S) PORT(S)
# Важливо, останній збіг і буде означати остаточну класифікацію!

# Клас звичайного користувача трафіку
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються), тут все, що від 0 до 256kb
CLASSIFY(3:10) - - tcp 80,443 - - - - - 0:262144
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки,
# тут все, що від 256kb
CLASSIFY(3:13) - - tcp 80,443 - - - - - 262145:
# Для поштового трафіку оперативність зазвичай менш важлива
CLASSIFY(3:14) - - tcp 25,110,143,465,587,993,995,2525,4190
# Сюди помістимо трафік спеціального сервісу (наприклад, трансляцію Webinar, з порту 32765)
CLASSIFY(3:16) - - tcp 32765

# Тут живе VPN (який запускає користувач)
CLASSIFY(3:F) - - udp 1194

# Це для IAX2
CLASSIFY(3:B) - - udp 4569

# Це для SIP VPN тунеле (міжофісний трафік)
CLASSIFY(3:C) - - udp 40032

# RDP
CLASSIFY(3:12) - - tcp 3389
CLASSIFY(3:12) - - udp 3389

# дозволить зменшити затримки на запити DNS
CLASSIFY(3:8) - - udp 53
CLASSIFY(3:8) - - tcp 53
# і зробить PING цікавіше
CLASSIFY(3:9) - - icmp echo-request,echo-reply

# Для SSH у нас два класу, перший, для коротких пакетів (в основному команди)
CLASSIFY(3:5) - - tcp 22 - - - 0:512
# Другий для довгих пакетів (для передачі файлів приміром)
CLASSIFY(3:6) - - tcp 22 - - - 513:


mangle.5
#
# Shorewall -- /etc/shorewall/mangle.5
#
# For information about entries in this file, type "man shorewall-mangle"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
# For usage in selecting among multiple ISPs, see
# http://shorewall.net/MultiISP.html
#
# See http://shorewall.net/PacketMarking.html for a detailed description of
# the Netfilter/Shorewall packet marking mechanism.
#
####################################################################################################################################################
#ACTION SOURCE DEST PROTO DEST SOURCE USER TEST LENGTH TOS CONNBYTES HELPER PROBABILITY DSCP
# PORT(S) PORT(S)
# Важливо, останній збіг і буде означати остаточну класифікацію!

# Клас звичайного користувача трафіку
# Для HTTP(S) з короткими пакетами, виділимо пріоритет більше (буде здаватися,
# сторінки швидше відкриваються), тут все, що від 0 до 256kb
CLASSIFY(5:10) - - tcp 80,443 - - - - - 0:262144
# Для HTTP(S) з довгими пакетами, довше будуть вантажиться картики і великі сторінки,
# тут все, що від 256kb
CLASSIFY(5:13) - - tcp 80,443 - - - - - 262145:
# Для поштового трафіку оперативність зазвичай менш важлива
CLASSIFY(5:14) - - tcp 25,110,143,465,587,993,995,2525,4190
# Сюди помістимо трафік спеціального сервісу (наприклад, трансляцію Webinar, з порту 32765)
CLASSIFY(5:16) - - tcp 32765

# Тут живе VPN (який запускає користувач)
CLASSIFY(5:F) - - udp 1194

# Це для IAX2
CLASSIFY(5:B) - - udp 4569

# Це для SIP VPN тунеле (міжофісний трафік)
CLASSIFY(5:C) - - udp 40032

# RDP
CLASSIFY(5:12) - - tcp 3389
CLASSIFY(5:12) - - udp 3389

# дозволить зменшити затримки на запити DNS
CLASSIFY(5:8) - - udp 53
CLASSIFY(5:8) - - tcp 53
# і зробить PING цікавіше
CLASSIFY(5:9) - - icmp echo-request,echo-reply

# Для SSH у нас два класу, перший, для коротких пакетів (в основному команди)
CLASSIFY(5:5) - - tcp 22 - - - 0:512
# Другий для довгих пакетів (для передачі файлів приміром)
CLASSIFY(5:6) - - tcp 22 - - - 513:


tcfilters
#
# Shorewall -- /etc/shorewall/tcfilters
#
# For information about entries in this file, type "man shorewall-tcfilters"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
#
########################################################################################################
#INTERFACE: SOURCE DEST PROTO DEST SOURCE TOS LENGTH PRIORITY
#CLASS PORT(S) PORT(S)
# Важливо, перше збіг і буде означати остаточну класифікацію!
INCLUDE tcfilters.2
INCLUDE tcfilters.4
INCLUDE tcfilters.6


tcfilters.2
#
# Shorewall -- /etc/shorewall/tcfilters.2
#
# For information about entries in this file, type "man shorewall-tcfilters"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
#
########################################################################################################
#INTERFACE: SOURCE DEST PROTO DEST SOURCE TOS LENGTH PRIORITY
#CLASS PORT(S) PORT(S)
# Важливо, перше збіг і буде означати остаточну класифікацію!
2:3 $NET_GRN $NET_GRN
# Для SSH
2:6 - - tcp 22
# дозволить зменшити затримки на запити DNS
2:8 - - udp 53
2:8 - - tcp 53
# і зробить PING цікавіше
2:9 - - icmp echo-request,echo-reply
# RDP
2:12 - - tcp 3389
2:12 - - udp 3389
# Це для IAX2
2:B - - udp 4569
# Це для SIP VPN тунеле (міжофісний трафік)
2:C - - udp 40032
# Тут живе VPN (який запускає користувач)
2:F - - udp 1194
# Клас покараних користувачів
# Для HTTP(S)
2:1F $IP_SLOW 0.0.0.0/0 tcp 80,443
# Для поштового трафіку оперативність зазвичай менш важлива
2:20 $IP_SLOW - tcp 25,110,143,465,587,993,995,2525,4190
# Сюди помістимо трафік спеціального сервісу, нехай мучаться
2:21 $IP_SLOW_SPEC - tcp 32765
# Клас VIP користувача трафіку (VIP-ів у нас зазвичай не багато), їм пріоритет вище
# Для HTTP(S)
2:1A $IP_VIP - tcp 80,443
# Для поштового трафіку оперативність зазвичай менш важлива
2:1B $IP_VIP - tcp 25,110,143,465,587,993,995,2525,4190
# Сюди помістимо трафік VIP спеціального сервісу
2:1C $IP_VIP_SPEC - tcp 32765
# Клас звичайного користувача трафіку
# Для HTTP(S)
2:13 $IP_NORMAL - tcp 80,443
# Для поштового трафіку оперативність зазвичай менш важлива
2:14 $IP_NORMAL - tcp 25,110,143,465,587,993,995,2525,4190
# Сюди помістимо трафік спеціального сервісу (наприклад, трансляцію Webinar, з порту 32765)
2:16 $IP_NORMAL_SPEC - tcp 32765


tcfilters.4
#
# Shorewall -- /etc/shorewall/tcfilters.4
#
# For information about entries in this file, type "man shorewall-tcfilters"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
#
########################################################################################################
#INTERFACE: SOURCE DEST PROTO DEST SOURCE TOS LENGTH PRIORITY
#CLASS PORT(S) PORT(S)
# Важливо, перше збіг і буде означати остаточну класифікацію!

# Так як в tcfilters робота з довгою пакету спрощена, то і класифікацію по довжині ми не зробимо
4:6 - - tcp - 22

# дозволить зменшити затримки на запити DNS
4:8 - - udp - 53
4:8 - - tcp - 53
# і зробить PING цікавіше
4:9 - - icmp echo-request,echo-reply

# RDP
4:12 - - tcp - 3389
4:12 - - udp - 3389

# Це для IAX2
4:B - - udp - 4569
# Це для SIP VPN тунеле (міжофісний трафік)
4:C - - udp - 40032

# Тут живе VPN (який запускає користувач)
4:F - - udp - 1194

# Клас звичайного користувача трафіку, причому без суб-класів, так як це зовнішній інтерфейс,
# про внутрішньої мережі він нічого не знає. HTTP(S)
4:13 - - tcp - 80,443
# Для поштового трафіку оперативність зазвичай менш важлива
4:14 - - tcp - 25,110,143,465,587,993,995,2525,4190
# Сюди помістимо трафік спеціального сервісу (наприклад, трансляцію Webinar, з порту 32765)
4:16 - - tcp - 32765


tcfilters.6
#
# Shorewall -- /etc/shorewall/tcfilters.6
#
# For information about entries in this file, type "man shorewall-tcfilters"
#
# See http://shorewall.net/traffic_shaping.htm for additional information.
#
########################################################################################################
#INTERFACE: SOURCE DEST PROTO DEST SOURCE TOS LENGTH PRIORITY
#CLASS PORT(S) PORT(S)
# Важливо, перше збіг і буде означати остаточну класифікацію!

# Так як в tcfilters робота з довгою пакету спрощена, то і класифікацію по довжині ми не зробимо
6:6 - - tcp - 22

# дозволить зменшити затримки на запити DNS
6:8 - - udp - 53
6:8 - - tcp - 53
# і зробить PING цікавіше
6:9 - - icmp echo-request,echo-reply

# RDP
6:12 - - tcp - 3389
6:12 - - udp - 3389

# Це для IAX2
6:B - - udp - 4569

# Це для SIP VPN тунеле (міжофісний трафік)
6:C - - udp - 40032

# Тут живе VPN (який запускає користувач)
6:F - - udp - 1194

# Клас звичайного користувача трафіку, причому без суб-класів, так як це зовнішній інтерфейс,
# про внутрішньої мережі він нічого не знає. HTTP(S)
6:13 - - tcp - 80,443
# Для поштового трафіку оперативність зазвичай менш важлива
6:14 - - tcp - 25,110,143,465,587,993,995,2525,4190
# Сюди помістимо трафік спеціального сервісу (наприклад, трансляцію Webinar, з порту 32765)
6:16 - - tcp - 32765


Після перезапуску у нас запрацює шейпінг!

Дивні милиці
Власне з застосуванням OSPF багато стало краще, але залишилося одне маленьке «Але»! Зв'язок з VoIP між філіями. З VPN всі хорохо, і шифрує, і множинні шляхи дає (спасибі OSPF), але як шейпить VoIP, та так, що-б голоси не заїкалися, адже про даних, за зрозумілих причин, ми нічого не знаємо, класифікувати шифрований трафік не можемо (але от хлопці з Cisco зробили реалізацію)? Якщо VoIP йде в нас через зовнішню мережу, то проблеми немає (крім не повного шифрування у IAX2 і відсутність зручної маршрутизації альтернативних каналів). Тож направимо VoIP в окремий тунель! І тут привіт від OSPF, маршрут будується або через обидва тунелю (якщо у них однакову вагу), або через той, де вага нижче (це той, який у нас без телефонії).

Тут нам на допомогу прийде ось такий милицю:

/usr/local/bin/ospf_alt_route.sh
#!/bin/bash
METRIC_BOOST=$1
IP_INTERVAL=$2
IPROUTE='/usr/sbin/ip'
function search_and_del() {
# $1 - TABLE
# $2 - DST
# $3 - VIA
# $4 - METRIC
TABLE=$1
declare -a DST=("${!2}")
declare -VIA a=("${!3}")
declare -a METRIC=("${!4}")
# Шукаємо маршрути, які відсутні в маршрутизації OSPF
IFS=$'\n' 
for line in $(${IPROUTE} route show table $TABLE);do
IFS=$' \t' read -r -a line_ <<< "$line"
CONT=0
for i in "${!DST[@]}"; do
if [ "${line_[0]}" = "${DST[$i]}" ]; then
if [ "${line_[6]}" -eq "${METRIC[$i]}" ] && [ "${line_[2]}" = "${VIA[$i]}" ];then
CONT=1
continue
fi
fi
done
[ "$CONT" -eq "0" ] && eval "${IPROUTE} route del $line table $TABLE"
done
}
DST_="
METRIC_="
DEV_="
DST="
VIA_PRIM="
VIA_SEC="
METRIC_PRIM="
METRCI_SEC="
TABLE_PRIM="
TABLE_SEC="
COUNT=0
# Знайдемо таблиці маршрутизації
while IFS=$' \t' read -r -a line_; do
if [[ $(( $(echo ${line_[4]} | sed -e 's/[a-zA-Z]*//') % 2)) == 0 ]];then
TABLE_PRIM=${line_[1]}
else
TABLE_SEC=${line_[1]}
fi
done < <(grep tap /etc/shorewall/providers | grep loose)
# Якщо номерів таблиць немає, то пропускаємо якої кофігурації повністю
[ -z "$TABLE_PRIM" ] || [ -z "$TABLE_SEC" ] && exit 0
# Отримуємо маршрути від OSPF
while IFS=$' \t' read -r -a line_; do
# Шукаємо запису маршрутів в повному форматі (з позиції слова via)
if [ "${line_[3]}" == "via" ]; then
# Запам'ятаємо парметр для слдующих рядків у скороченому форматі
DST_=${line_[1]}
METRIC_=${line_[2]}
# Займемося тільки активними маршрутами
if [ "${line_[$(( ${#line_[@]} -2 ))]}" != "inactive," ]; then
DEV_=$(echo ${line_[$(( ${#line_[@]} -2 ))]} | sed -e "s/,//")
if [[ $(( $(echo $DEV_ | sed -e 's/[a-zA-Z]*//') % 2)) == 0 ]];then
DST[$COUNT]=$(echo ${line_[1]} | sed -e "s/\/32//")
VIA_PRIM[$COUNT]=$(echo ${line_[$(( ${#line_[@]} -3 ))]} | sed -e "s/,//")
METRIC_PRIM[$COUNT]=$(echo ${line_[2]} | sed -e "s/\[[0-p]*\///" | sed -e "s/\]//")
# Важливо використовувати статичні адреси для OpenVPN клієнтів,і важливо, щоб вони йшли з фіксованим
# кроком щодо основного з'єднання, в моєму випадку це 128 (так як мережа /25)
IFS=$'.' read -r -a IP <<< ${VIA_PRIM[$COUNT]}
VIA_SEC[$COUNT]="${IP[0]}.${IP[1]}.${IP[2]}.$(( ${IP[3]} + $IP_INTERVAL ))"
METRIC_SEC[$COUNT]=$(( ${METRIC_PRIM[$COUNT]} + $METRIC_BOOST ))
COUNT=$(($COUNT + 1 ))
fi
fi
else
# Аналогічна обробка для скороченого формату, використовуємо дані від попереднього кроку
if [ "${line_[$(( ${#line_[@]} -2 ))]}" != "inactive," ]; then
DEV_=$(echo ${line_[$(( ${#line_[@]} -2 ))]} | sed -e "s/,//")
if [[ $(( $(echo $DEV_ | sed -e 's/[a-zA-Z]*//') % 2)) == 0 ]];then
DST[$COUNT]=$(echo $DST_ | sed -e "s/\/32//")
if [ "${line_[0]}" == "via" ]; then
VIA_PRIM[$COUNT]=$(echo ${line_[1]} | sed -e "s/,//")
else
VIA_PRIM[$COUNT]=$(echo ${line_[2]} | sed -e "s/,//")
fi
METRIC_PRIM[$COUNT]=$(echo $METRIC_ | sed -e "s/\[[0-p]*\///" | sed -e "s/\]//")
IFS=$'.' read -r -a IP <<< ${VIA_PRIM[$COUNT]}
VIA_SEC[$COUNT]="${IP[0]}.${IP[1]}.${IP[2]}.$(( ${IP[3]} + $IP_INTERVAL ))"
METRIC_SEC[$COUNT]=$(( ${METRIC_PRIM[$COUNT]} + $METRIC_BOOST ))
COUNT=$(($COUNT + 1 ))
fi
fi
fi
done < <(/usr/bin/vtysh -c 'show ip route ospf' | grep via | grep tap | grep -v -e 'directly connected')
# Знайдемо неіснуючі маршрути для основного і додаткового тунеля
search_and_del $TABLE_PRIM DST[@] VIA_PRIM[@] METRIC_PRIM[@]
search_and_del $TABLE_SEC DST[@] VIA_SEC[@] METRIC_SEC[@]
# Приб'ємо шлюз за промовчанням для обох тунелів
${IPROUTE} route del default table $TABLE_PRIM >/dev/null 2 > &1
${IPROUTE} route del default table $TABLE_SEC >/dev/null 2 > &1
# Пройдемося по масиву маршрутів, і додамо їх у таблиці основного і додаткового тунеля
for i in "${!DST[@]}"; do
[ -z ${DST[$i]} ] || [ -z ${VIA_PRIM[$i]} ] || [ -z ${METRIC_PRIM[$i]} ] && continue
${IPROUTE} route replace ${DST[$i]} via ${VIA_PRIM[$i]} table $TABLE_PRIM metric ${METRIC_PRIM[$i]} >/dev/null 2 > &1
# Так як OSPF будує маршрути і до кінцевої точки тунеля, то в маршрутах для вторинного тунеля з'являється маршрут "сам до себе"
if [ "${DST[$i]}" = "${VIA_SEC[$i]}" ]; then
# Тому ми "розгорнемо" маршрути
${IPROUTE} route replace ${VIA_PRIM[$i]} via ${DST[$i]} table $TABLE_SEC metric ${METRIC_SEC[$i]} >/dev/null 2 > &1
else
${IPROUTE} route replace ${DST[$i]} via ${VIA_SEC[$i]} table $TABLE_SEC metric ${METRIC_SEC[$i]} >/dev/null 2 > &1
fi
# Видалимо маршрути з таблиці main
${IPROUTE} route del ${DST[$i]} via ${VIA_PRIM[$i]} metric ${METRIC_PRIM[$i]} >/dev/null 2 > &1
done


Цей скрипт копіює маршрути, анонсовані OSPF в окрему таблицю маршрутизації, та створює додаткові маршрути, через другий тунель, до тих-таки мереж, що нам анонсував OSPF. А Shorewall створює для нас правила маршрутизації і додаткові таблиці. А що-б трафік телефонії втік в цей тунель, ми його позначаємо спеціальною міткою.

В policy routing можна побачити таке:

Routing Rules

0: from all local lookup
999: from all main lookup
10000: from all fwmark 0x10000/0xff0000 lookup pr1
10001: from all fwmark 0x20000/0xff0000 lookup pr2
10002: from all fwmark 0x40000/0xff0000 lookup tap1
10003: from all fwmark 0x30000/0xff0000 lookup tap0
19001: from all lookup tap0
20000: from 192.168.10.37 lookup pr1
20000: from 192.168.10.36 lookup pr2
32765: from all lookup balance
32766: from all main lookup
32767: from all lookup default

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

Залишилося тільки додати цей скрипт в cron:

/etc/cron.d/ospf_alt_route# For details see man 4 crontabs

# Example of job definition:
# .---------------- minute (0 — 59)
# | .------------- hour (0 — 23)
# | | .---------- day of month (1 — 31)
# | | | .------- month (1 — 12) OR jan,feb,mar,apr…
# | | | | .---- day of week (0 — 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed

*/1 * * * * root /usr/local/bin/ospf_alt_route.sh 1 128


P. S.
Оновлено:
  • Скрипт для заміни маршрутів
  • Завдання cron
  • rtrules
  • Додано файл started

Мотивуючий опитування

/>
/>


<input type=«checkbox» id=«vv71561»
class=«checkbox js-field-data»
name=«variant[]»
value=«71561» />
Став QoS більш зрозумілий?
<input type=«checkbox» id=«vv71563»
class=«checkbox js-field-data»
name=«variant[]»
value=«71563» />
чи Застосовуєте QoS у себе?
<input type=«checkbox» id=«vv71565»
class=«checkbox js-field-data»
name=«variant[]»
value=«71565» />
Будете застосовувати QoS завдяки статті?
<input type=«checkbox» id=«vv71567»
class=«checkbox js-field-data»
name=«variant[]»
value=«71567» />
Нічого нового для себе не дізнався

Проголосувало 2 людини. Утрималося 15 чоловік.


Тільки зареєстровані користувачі можуть брати участь в опитуванні. Увійдіть, будь ласка.


Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.