ISP`s IT Аутсорсинг
Быстрый переход: Главная блога Главная сайта Форум
Если Вы чего то недопоняли или не нашли - задайте
вопрос на нашем форуме и мы попробуем Вам помочь.
Subnets.ru Регистрация IP и Автономных систем mega-net.ru

Архивные статьи в категории ‘Cisco Systems’

Добро пожаловать в блог! Надеемся, что Вы еще вернетесь.

В продолжение статьи Настраиваем vlan на FreeBSD, но теперь немного усложним задачу.

Задача:

Есть два свича Cisco Catalyst 3560 к которым подключены два сегмента сети в разных vlan.

Необходимо, что бы пользователи подключенные к Cisco Catalyst 3560 видели IP-адреса FreeBSD сервера и Cisco Catalyst 3560 свичи находились во vlan`е управления.

Схема

Схема

Данная схема будет работать и на любых других свичах (других моделях Cisco Catalyst (тот же Catalyst 2950 или Catalyst 3550) или например свичах Dlink или Planet), главное чтобы в свиче была поддержка vlan (802.1Q).

Приступаем к настройке:

Switch 01
Создадим vlan`ы:

Switch01#configure terminal
Switch01(config)#vlan 5
Switch01(config-vlan)#name management
Switch01(config-vlan)#vlan 10
Switch01(config-vlan)#name segment_10
Switch01(config-vlan)#vlan 20
Switch01(config-vlan)#name segment_20
Switch01(config-vlan)#exit

Настроим IP-адрес свича во влане управления:

Switch01(config)#int vlan 5
Switch01(config-if)#ip address 10.0.0.2 255.255.255.248
Switch01(config-if)#exit

Поместим пользовательские порты свича в эти vlan`ы:

Switch01(config)#int gi 0/2
Switch01(config-if)#switchport mode access
Switch01(config-if)#switchport access vlan 10
Switch01(config-if)#int gi 0/3
Switch01(config-if)#switchport mode access
Switch01(config-if)#switchport access vlan 20

Настроим trunk на порту смотрящий в сторону Switch02, но разрешим только vlan 5,10 и 20:

Switch01(config-if)#int gi 0/1
Switch01(config-if)#switchport trunk encapsulation dot1q
Switch01(config-if)#switchport trunk allowed vlan 5,10,20
Switch01(config-if)#switchport mode trunk

Будьте внимательны: чтобы в последующем добавлять новые vlan в наш trunk вам необходимо использовать ту же команду, но с ключевым add:

Switch01(config-if)#switchport trunk allowed vlan add VLAN_ID

Если вы не будете использовать add, то свич выставит в разрешенные vlan`ы на trunk порту только те что будут вами перечисленны и удалит старые значения.

Например, команда:

Switch01(config-if)#switchport trunk allowed vlan add 25,30

добавит в trunk vlan`ы 25 и 30 при этом сохранив старые значения 5,10 и 20 и получится, что в данном tunk`е разрешены vlan`ы 5,10,20,25,30

Вернемся к нашей схеме и настроим Switch02.

Switch 02
Создадим vlan`ы:

Switch02#configure terminal
Switch02(config)#vlan 5
Switch02(config-vlan)#name management
Switch02(config-vlan)#vlan 10
Switch02(config-vlan)#name segment_10
Switch02(config-vlan)#vlan 20
Switch02(config-vlan)#name segment_20
Switch02(config-vlan)#exit

Настроим IP-адрес свича во влане управления:

Switch02(config)#int vlan 5
Switch02(config-if)#ip address 10.0.0.3 255.255.255.248
Switch02(config-if)#exit

Поместим пользовательские порты свича в эти vlan`ы:

Switch02(config)#int gi 0/11
Switch02(config-if)#switchport mode access
Switch02(config-if)#switchport access vlan 20
Switch02(config-if)#int gi 0/10
Switch02(config-if)#switchport mode access
Switch02(config-if)#switchport access vlan 10
Switch02(config-if)#exit

Настроим trunk на порту смотрящий в сторону Switch01 и разрешим только vlan 5,10 и 20:

Switch02(config)#int gi 0/2
Switch02(config-if)#switchport trunk encapsulation dot1q
Switch02(config-if)#switchport trunk allowed vlan 5,10,20
Switch02(config-if)#switchport mode trunk
Switch02(config-if)#exit

Также настроим trunk порт смотрящий в сторону FreeBSD:

Switch02(config)#int gi 0/24
Switch02(config-if)#switchport trunk encapsulation dot1q
Switch02(config-if)#switchport trunk allowed vlan 5,10,20
Switch02(config-if)#switchport mode trunk
Switch02(config-if)#exit

Настроим сервер FreeBSD

Создадим vlan управления:

/sbin/ifconfig vlan1 create
/sbin/ifconfig vlan1 vlan 5 vlandev em0
/sbin/ifconfig vlan1 add 10.0.0.1/29
/sbin/ifconfig vlan1 up

Создадим vlan 10:

/sbin/ifconfig vlan2 create
/sbin/ifconfig vlan2 vlan 10 vlandev em0
/sbin/ifconfig vlan2 add 192.168.10.1/24
/sbin/ifconfig vlan2 up

Создадим vlan 20:

/sbin/ifconfig vlan3 create
/sbin/ifconfig vlan3 vlan 20 vlandev em0
/sbin/ifconfig vlan3 add 192.168.20.1/24
/sbin/ifconfig vlan3 up

На этом с настройками покончено, настало время проверки. Если вы все сделали правильно, то:

  1. С FreeBSD сервера во влане управления (vlan 5) вы будете видеть и управлять (например по telnet) cisco catalyst)
  2. Пользователи во вланах 10,20 будут видеть IP интерфейсы сервера FreeBSD. Вы можете использовать этот сервер как шлюз в сеть Интернет для данных пользователей.

Посмотрим на cisco catalyst:

show vlan brief — просмотр существующих vlan`ов на свиче
show ip interface brief — просмотр существующих IP интерфейсов на свиче
show interfaces trunk — просмотр существующих trunk интерфейсов на свиче
show interfaces switchport — просмотр коммутации на интерфейсах свича

На FreeBSD интерфейсы смотрим командой ifconfig

Проверьте наличие пинга (ping) с FreeBSD сервера до пользователей и свичей.

Ссылки:

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Николаев Дмитрий (virus (at) subnets.ru)
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 6, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

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

Введние в статичскую маршрутизацию

Статический маршруты используются по ряду причин и чаще всего, когда не существует динамического маршрута к определенному месту назначения или когда включение динамического протокола маршрутизации не выполнимо. По умолчанию статические маршруты имеют административную дистанцию равную 1, что дает им преимущество над маршрутами изученными из динамических протоколов маршрутизации. Что такое административная дистанция и как она влияет на выбор маршрута, читайте в статье “Административная Дистанция”, опубликованной ранее на CicsoLab.RU.

Когда вы увеличиваете административную дистанцию в значение большем чем значение динамического протокола маршрутизации, статический маршрут будет работать только в случае, когда пропадет динамическая маршрутизация. Например, маршруты изученные из динамического протокола IGRP имеют административную дистанцию по умолчанию 100. Для того, чтобы конфигурировать статический маршрут, который будет перекрыт IGRP маршрутом, укажите административную дистанцию больше 100. Такой вид статической маршрутизации называется “плавающей”. Такой маршрут инсталлируется в таблицу маршрутизации только, когда более предпочтительный маршрут исчезнет оттуда. Например,

ip route 172.31.10.0 255.255.255.0 10.10.10.2 101

Обратите внимание, что административная дистанция 255, рассматривается как недостижимая и статический маршрут с административной дистанцией 255 никогда не будет введен в таблицу маршрутизации.

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

ip route 0.0.0.0 0.0.0.0 Ethernet0

В такой конфигурации маршрутизатор выполняет ARP запросы на интерфейсе Ethernet0 для каждого узла, который попадает в маршрут по умолчанию, потому что маршрутизатор рассматривает все эти узлы как напрямую подсоединенные к этому интерфейсу.

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

Указание числового следующего хопа (next hop) для маршрута, предотвратит выполнение ARP запросов на каждый адрес. Однако, если интерфейс за которым лежит next hop упадет, а числовое значение следующего хопа достижимо через рекурсивный маршрут, вы должный указать и IP адрес следующего хопа и интерфейс через который данный next hop может быть найден. Например,

ip route 0.0.0.0 0.0.0.0 Serial 3/3 192.168.20.1

Проблема

Теперь рассмотрим небольшой проблемный сценарий. В данной сетевой диаграмме, существует два статических маршрута к одному и тому же месту назначения (172.31.10.0/24). Один маршрут является “плавающим” маршрутом. Это резервный путь к целевой сети. Проблема в данном сценарии в том, что плавающий маршрут никогда не инсталлируется не таблицу маршрутизации, когда основной канал падает.

Рис.1

Рис.1

R1 имеет маршрут по умолчанию который указывает на маршрутизатор сервис провайдера (ISP) для доступа в Интернет. R1 также имеет два канала к R2. T1 это основной канал, а 56К это резервный канал. На R1 настроен статический маршрут в сторону сети 172.31.10.0/24, который указывает на IP адрес интерфейса Serial0 маршрутизатора R2 (10.10.10.2) в качестве следующего хопа. R1 также имеет плавающий маршрут для сети 172.31.10.0/24 который указывает на IP адрес интерфейса Serial1 роутера R2 (192.168.20.2). Административная дистанция для такого плавающего статического маршрута установлена в значение 250. Задача, сделать так, чтобы пакеты ходили по 56К каналу в обоих направлениях только в случае падения основного канала.

Конфигурация R1
hostname R1
!
ip subnet-zero
!
interface Serial3/0
description ISP Link
ip address 192.168.10.1 255.255.255.252
clockrate 64000
!
interface Serial3/2
description Primary Link to R2
ip address 10.10.10.1 255.255.255.252
!
interface Serial3/3
description Backup Link to R2
ip address 192.168.20.1 255.255.255.252
clockrate 64000
!
ip classless
#Это маршрут по умолчнию на ISP router
ip route 0.0.0.0 0.0.0.0 Serial3/0
!
#Это основной маршрут к LAN.
ip route 172.31.10.0 255.255.255.0 10.10.10.2
!
#Это плавающий маршрут к LAN.
ip route 172.31.10.0 255.255.255.0 192.168.20.2 250

Таблица маршрутизации на R1 выглядит следующим образом:

R1#show ip route
Gateway of last resort is 0.0.0.0 to network 0.0.0.0
10.0.0.0/30 is subnetted, 1 subnets
C 10.10.10.0 is directly connected, Serial3/2
192.168.10.0/30 is subnetted, 1 subnets
C 192.168.10.0 is directly connected, Serial3/0
192.168.20.0/30 is subnetted, 1 subnets
C 192.168.20.0 is directly connected, Serial3/3
#Основной статический маршруи к LAN через канал T1.
172.31.0.0/24 is subnetted, 1 subnets
S 172.31.10.0 [1/0] via 10.10.10.2
#Статический маршрут по умолчнию в Internet.
S* 0.0.0.0/0 is directly connected, Serial3/0

Конфигурация R2

hostname R2
ip subnet-zero
!
interface Ethernet0
description Local LAN
ip address 172.31.10.2 255.255.255.0
!
interface Serial0
description Primary Link to R1
ip address 10.10.10.2 255.255.255.252
clockrate 56000
!
interface Serial1
description Backup Link to R1
ip address 192.168.20.2 255.255.255.252
!
ip classless
!
#Это основной маршрут по умолчнию.
ip route 0.0.0.0 0.0.0.0 10.10.10.1
#Это плавающий маршрут по умолчнию, используется если канал T1 неисправен.
ip route 0.0.0.0 0.0.0.0 192.168.20.1 250

R2 имеет маршрут по умолчанию инсталлированный через 10.10.10.1, и когда вы используете команду traceroute от R2 к ISP, пакеты ходят по каналу T1.

R2#show ip route
Gateway of last resort is 10.10.10.1 to network 0.0.0.0
172.31.0.0/24 is subnetted, 1 subnets
C 172.31.10.0 is directly connected, Ethernet0
192.168.20.0/30 is subnetted, 1 subnets
C 192.168.20.0 is directly connected, Serial1
10.0.0.0/8 is variably subnetted, 2 subnets, 2 masks
C 10.10.10.0/30 is directly connected, Serial0
#Это основной маршрут по умолчнию.
S* 0.0.0.0/0 [1/0] via 10.10.10.1

R2#traceroute 192.168.10.2
.
Type escape sequence to abort.
Tracing the route to 192.168.10.2
.
1 10.10.10.1 16 msec 20 msec 16 msec
2 192.168.10.2 32 msec * 32 msec

R2 посылает ICMP пакеты к Internet хосту 192.168.30.1 с адресом отправителя 172.31.10.2.

R2#ping 192.168.30.1 source 172.31.10.2
Sending 5, 100-byte ICMP Echos to 192.168.20.1, timeout is 2 seconds:
!!!!!
Success rate is 100 percent (5/5), round-trip min/avg/max = 32/32/32 ms

Если мы опускаем интерфейс Serial3/2 на R1, то мы ожидаем, что R1 инсталирует плавающий статический маршрут к сети 172.31.10.0, а R2 инсталирует плавающий статический маршрут для 0.0.0.0 через 192.168.20.1. И по идее трафик будет ходить по 56К каналу.

Выполним указанный тест и посмотрим так ли это на самом деле:

R1#show ip interface brief
Interface IP-Address OK? Method Status Protocol
Serial3/0 192.168.10.1 YES manual up up
Serial3/2 10.10.10.1 YES manual up up
Serial3/3 192.168.20.1 YES manual up up

R1#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
R1(config)#int s3/2
R1(config-if)#shut
R1(config-if)#end
2d21h: %LINEPROTO-5-UPDOWN: Line protocol on Interface Serial3/2, changed state to down
2d21h: %LINK-5-CHANGED: Interface Serial3/2, changed state to administratively down

R1#show ip interface brief
Interface IP-Address OK? Method Status Protocol
Serial3/0 192.168.10.1 YES manual up& up
Serial3/2 10.10.10.1 YES manual administratively down down
Serial3/3 192.168.20.1 YES manual up up

Взглянем на таблицы маршрутизации обоих роутеров.

R1#show ip route
Gateway of last resort is 0.0.0.0 to network 0.0.0.0
192.168.10.0/30 is subnetted, 1 subnets
C 192.168.10.0 is directly connected, Serial3/0
192.168.20.0/30 is subnetted, 1 subnets
C 192.168.20.0 is directly connected, Serial3/3
#Статический маршрут через канал T1 остался в таблице маршрутизации.
#Это не то, что мы ожидали увидеть, когда выключали Serial 3/2
172.31.0.0/24 is subnetted, 1 subnets
S 172.31.10.0 [1/0] via 10.10.10.2
#Маршрут по умолчнию в Интерент.
S* 0.0.0.0/0 is directly connected, Serial3/0

На маршрутизаторе R2 все правильно.

R2#show ip route
Gateway of last resort is 192.168.20.1 to network 0.0.0.0
172.31.0.0/24 is subnetted, 1 subnets
C 172.31.10.0 is directly connected, Ethernet0
192.168.20.0/30 is subnetted, 1 subnets
C 192.168.20.0 is directly connected, Serial1
S* 0.0.0.0/0 [250/0] via 192.168.20.1

Однако теперь более не возможно пинговать внешний хост 192.168.20.1, поскольку R1 пытается послать ICMP ответы через Serial3/2 который выключен.

R2#ping 192.168.30.1 source 172.31.10.2
Sending 5, 100-byte ICMP Echos to 192.168.20.1, timeout is 2 seconds:
…..
Success rate is 0 percent (0/5)

Итак плавающий статический маршрут не был инсталлирован на R1 и основной маршрут все еще находиться в таблице маршрутизации R1, даже хотя интерфейс Serial3/2 лежит.

Причина этого поведения в том, что статические маршруты являются рекурсивными по природе. У вас всегда статический маршрут будет храниться в таблице маршрутизации до тех пор пока у вас есть маршрут на следующий хоп. В данном случае, R1 думает, что он может получить 10.10.10.2 через 192.168.10.2, потому, что 192.168.10.2 это следующий хоп для 0.0.0.0 0.0.0.0. Маршрут на следующий хоп может быть более специфичным, менее специфичным или маршрутом по умолчанию. В этом сценарии вы думает, что поскольку линк упал, вы не должный иметь маршрута для 10.10.10.2, но если вы посмотрите на таблицу маршрутизации R1, вы увидите, что существует статический маршрут по умолчанию, указывающий на ISP роутер. Поэтому R1 думает, что он может достичь next hop (10.10.10.2) для сети 172.31.10.0/24, через свой маршрут по умолчанию и статический маршрут 172.31.10.0/24 через 10.10.10.2 остается в таблице маршрутизации, тем самым предотвращаю инсталляцию плавающего маршрута.

Для того, чтобы предотвратить данную проблему вы должны указать интерфейс через который может быть найден следующий хоп. Тогда плавающий маршрут будет инсталлироваться только в случае, когда IP адрес next-hop будет достижим через указный интерфейс. Решение, заключается в удалении старого статического маршрута к сети 172.31.10.0 и добавлении нового, но на этот раз указываем интерфейс, через который достижим IP адрес следующего хопа. Это позволит инсталлировать плавающий маршрут, когда упадет интерфейс Serial3/2.

R1(config)#no ip route 172.31.10.0 255.255.255.0 10.10.10.2
R1(config)#no ip route 172.31.10.0 255.255.255.0 192.168.20.2 250
R1(config)#ip route 172.31.10.0 255.255.255.0 Serial3/2 10.10.10.2
R1(config)#ip route 172.31.10.0 255.255.255.0 Serial3/3 192.168.20.2 250

Статический маршрут к сети 172.31.10.0 через 10.10.10.2 будет находиться в таблице маршрутизации только, если 10.10.10.2 будет виден через интерфейс Serial3/2. Если данное условие не выполняется, статический маршрут через 10.10.10.2 удаляется их таблицы и взамен инсталлируется плавающий маршрут через Serial 3/3 и следующий хоп 192.168.20.2.

По материалам: cisco.com

Оригинал статьи тут

Ссылки:

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 4, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

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

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

Выбираем наилучший путь

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

Чем меньше численное значение административной дистанции, тем более надежен протокол. Например, если роутер принимает маршрут к определенной сети и через OSPF и через IGRP, маршрутизатор выберет протокол IGRP, поскольку IGRP более надежен. Это значит, что маршрутизатор добавит в свою роутинговую таблицу маршрут от протокола IGRP.

Если вдруг, вы потеряли источник IGRP информации (например, выключили питание на нем), роутер будет использовать информацию поставляемую протоколом OSPF, до тех пор пока источник IGRP маршрутов не возобновит свою работу.

Таблица значений административной дистанции

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

Connected interface 0
Static route 1
Enhanced Interior Gateway Routing Protocol (EIGRP) summary route 5
External Border Gateway Protocol (BGP) 20
Internal EIGRP 90
IGRP 100
OSPF 110
Intermediate System-to-Intermediate System (IS-IS) 115
Routing Information Protocol (RIP) 120
Exterior Gateway Protocol (EGP) 140
On Demand Routing (ODR) 160
External EIGRP 170
Internal BGP 200
Unknown 255

Если административная дистанция равна 255, роутер не доверяет источнику маршрута и никогда не инсталлирует такой маршрут в таблицу маршрутизации.

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

ip route 10.0.0.0 255.0.0.0 Dialer 1 250

Здесь административная дистанция для маршурута 10.0.0.0/8 установлена в значение 250.

Таблица маршрутизации может выглядеть следующий образом

R1#show ip route

Gateway of last resort is not set

172.16.0.0/24 is subnetted, 1 subnets
C 172.16.1.0 is directly connected, Ethernet0
R 10.0.0.0/8 [120/1] via 172.16.1.200, 00:00:16, Ethernet0
C 192.168.1.0/24 is directly connected, Loopback0

Если интерфейс Ethernet0 упадет, то в таблицу маршрутизации инсталлируется плавающий статический маршрут и весь трафик предназначенный для сети 10.0.0.0/8 будет маршрутизироваться через интерфейс Dialer 1 и по резервному каналу.

R1#show ip route
Gateway of last resort is not set
172.16.0.0/24 is subnetted, 1 subnets
C 172.16.1.0 is directly connected, Ethernet0
S 10.0.0.0/8 is directly connected, Dialer1
C 192.168.1.0/24 is directly connected, Loopback0

Как только Ethernet интерфейс подниматься обратно, то в таблицу сразу же инсталлируется маршрут от динамического протокола RIP и трафик снова пойдет через Ethernet 0.

По материалам: cisco.com

Оригинал статьи тут

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 4, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту

Натолкнулся на просторах интернета, хорошая статья, решил скопировать.

Автор: Ильяс Кулиев

NAT, поистине, спасение для системного администратора, когда нужно быстро подключить к Интернету локальную сеть. Но все ли вы о нём знаете?

NAT и его реализации

Используя терминологию Cisco, в контексте NAT есть четыре основных определения для IP-адресов. Рассмотрим их на примере, показанном на рис. 1. На обоих маршрутизаторах делается NAT (network address translation).

Рисунок 1. Определение IP-адресов в контексте NAT

Рисунок 1. Определение IP-адресов в контексте NAT

При этом:

  • Inside Local (IL). Это адрес, присвоенный хосту, находящемуся в локальной сети. В данном случае адреса 10.0.0.100 и 172.16.0.100 – адреса IL.
  • Inside Global (IG). Это внешний адрес, при отправлении пакетов на который они будут доставлены на хост с адресом IL. В данном случае для хоста 10.0.0.100 адресом IG является 111.222.0.1.
  • Outside Global (OG). Внешний адрес хоста, доступ к которому мы хотим получить из нашей локальной сети. В данном случае, если мы отправляем пакет от 10.0.0.100 для 172.16.0.100, адресом OG будет 111.222.0.2.
  • Outside Local (OL). Это адрес, под которым адреса внешних хостов видны внутри локальной сети. В данном случае, если мы отправляем пакет от 10.0.0.100 для 172.16.0.100, для хоста 172.16.0.100 это будет выглядеть так, будто пакет пришёл от 172.16.0.1 (адрес OL).

Простейший случай NAT – это трансляция адресов IL в IG и наоборот. При этом маршрутизатор, выполняющий NAT, модифицирует поле адреса в заголовке IP следующим образом:

  • в исходящих пакетах адрес источника IL заменяется на IG, и пакет отправляется дальше по роутингу к хосту с адресом OG;
  • во входящих пакетах адрес приемника IG заменяется на IL и отправляется в локальную сеть для хоста с адресом IL.

Таким образом, в таблице сопоставлений NAT каждая запись состоит из двух значений – IL и IG.

Эта или подобная схема иногда применяется для обеспечения доступа снаружи к хостам, находящимся в локальной сети (например, к веб-серверу или FTP-серверу). Она может также применяться для балансировки нагрузки путем динамического распределения пакетов, приходящих на публичный адрес маршрутизатора, между несколькими серверами, находящимися в локальной сети, и еще в некоторых случаях.

Более распространённый случай – это NPAT, network and port address translation. При использовании NPAT в таблице сопоставлений каждая запись имеет не два (как в простом NAT), а пять значений:

  1. транспортный протокол;
  2. локальный адрес (IL);
  3. локальный порт;
  4. глобальный адрес (IG);
  5. глобальный порт.

Это позволяет использовать единственный публичный адрес для предоставления доступа в Интернет компьютерам, находящимся в локальной сети. В документации Cisco такая схема обычно называется «NAT with port overload» или короче – «NAT overload».

Исторически сложилось так, что именно его, как правило, имеют в виду, когда употребляют термин «NAT», и о нём мы и будем говорить в дальнейшем, ввиду его распространённости.

До сих пор речь шла о вещах общеизвестных. Однако, если посмотреть на NAT поближе, возникают новые вопросы. Возьмём простейшую сеть, с одним компьютером и одним маршрутизатором, выполняющим NAT. Модель маршрутизатора в данном случае не слишком важна – допустим, что это давно устаревшая, но все еще популярная Cisco 1601R (см. рис. 2).

Рисунок 2. Пример сети с NAT

Рисунок 2. Пример сети с NAT

В конфигурации маршрутизатора указано, что он должен выполнять NAT для всех пакетов, с адресами источника 192.168.0.0/24, пришедших через интерфейс Ethernet0 и отправляемых далее через интерфейс Serial0, а также для ответных пакетов, пришедших через Serial0, для которых есть соответствующая запись в таблице трансляций:


!
! Last configuration change at 09:29:45 UTC someday by TheAllmightyMaster
! NVRAM config last updated at 19:27:46 UTC some other day by TheAllmightyMaster
!
version 12.2

interface Serial0
ip address 11.22.33.44 255.255.255.252
ip nat outside

interface Ethernet0
ip address 192.168.0.1 255.255.255.0
ip nat inside

ip nat inside source list MyNetwork interface Serial0 overload

ip access-list extended MyNetwork
permit ip 192.168.0.0 0.0.0.255 any

Предположим, компьютер с адресом IL 192.168.0.141 отправляет DNS-запрос на внешний хост 1.2.3.4 (порт 53, протокол UDP). Как следует из конфигурации, наш внешний адрес IG – 11.22.33.44.

В результате этого в таблице NAT появится примерно такая запись:

Proto Inside global Inside local Outside local Outside global
UDP 11.22.33.44:1053 192.168.0.141:1053 1.2.3.4:53 1.2.3.4:53

Допустим, после появления такой записи в таблице, другой хост, 1.2.3.5, отправляет пакет UDP с адресом назначения 11.22.33.44 и портом назначения 1053. Вопрос – получит ли наш хост 192.168.0.141 этот пакет?

Здравый смысл подсказывает, что вроде бы не должен. С другой стороны, налицо факт: в нашей таблице NAT черным по белому записано, что пакет с адресом назначения 11.22.33.44 и портом назначения 1053 нужно принять и транслировать в локальную сеть для хоста 192.168.0.141 (который его примет и молча уничтожит, поскольку на этом компьютере не запущено сетевого приложения, которому был бы предназначен этот пакет.)

Кстати говоря – ну хорошо, допустим такого приложения нет, а если бы оно было? Как хорошо известно пользователям таких программ, как eMule и eDonkey, они требуют, чтобы им была предоставлена возможность беспрепятственно получать UDP пакеты с портом назначения 4661, или 4242, или 4321 – точный номер порта зависит от настроек. И, что также хорошо известно их пользователям, эти программы плохо работают, будучи запущены из локальной сети, находящейся за NAT. Так вот, это может происходить, в том числе и потому, что несмотря на успешное установление локальным клиентом соединения с сервером, из-за специфики данной конкретной реализации NAT другие клиенты, находящиеся во внешнем мире, не могут устанавливать соединение с локальным клиентом.

По этой же причине может не работать DCC chat в клиентах IRC, передача файлов в ICQ и тому подобные вещи, для которых требуется обеспечение беспрепятственного прохождения пакетов непосредственно между пользовательскими компьютерами.

Итак, отвечая на вопрос, «получит ли наш хост 192.168.0.141 пакет, направленный на 11.22.33.44 от постороннего хоста», – может быть, получит, а может быть, и нет; ответ на этот вопрос зависит от реализации NAT на пограничном маршрутизаторе.

Реализаций же насчитывается четыре:

  1. Symmetric NAT. До недавнего времени это была наиболее распространённая реализация. Его характерная особенность – в таблице NAT маппинг адреса IL на адрес IG жёстко привязан к адресу OG, то есть к адресу назначения, который был указан в исходящем пакете, инициировавшем этот маппинг. При указанной реализации NAT в нашем примере хост 192.168.0.141 получит оттранслированные входящие UDP-пакеты только от хоста 1.2.3.4 и строго с портом источника 53 и портом назначения 1053 – ни от кого более. Пакеты от других хостов, даже если указанные в пакете адрес назначения и порт назначения присутствуют в таблице NAT, будут уничтожаться маршрутизатором. Это наиболее параноидальная реализация NAT, обеспечивающая более высокую безопасность для хостов локальной сети, но в некоторых случаях сильно усложняющая жизнь системных администраторов. Да и пользователей тоже.
  2. Full Cone NAT. Эта реализация NAT – полная противоположность предыдущей. При Full Cone NAT входящие пакеты от любого внешнего хоста будут оттранслированы и переправлены соответствующему хосту в локальной сети, если в таблице NAT присутствует соответствующая запись. Более того, номер порта источника в этом случае тоже не имеет значения – он может быть и 53, и 54, и вообще каким угодно. Например, если некое приложение, запущенное на компьютере в локальной сети, инициировало получение пакетов UDP от внешнего хоста 1.2.3.4 на локальный порт 4444, то пакеты UDP для этого приложения смогут слать также и 1.2.3.5, и 1.2.3.6, и вообще все до тех пор, пока запись в таблице NAT не будет по какой-либо причине удалена. Ещё раз: в этой реализации NAT во входящих пакетах проверяется только транспортный протокол, адрес назначения и порт назначения, адрес и порт источника значения не имеют.
  3. Address Restricted Cone NAT (он же Restricted NAT). Эта реализация занимает промежуточное положение между Symmetric и Full Cone реализациями NAT – маршрутизатор будет транслировать входящие пакеты только с определенного адреса источника (в нашем случае 1.2.3.4), но номер порта источника при этом может быть любым.
  4. Port Restricted Cone NAT (или Port Restricted NAT). То же, что и Address Restricted Cone NAT, но в этом случае маршрутизатор обращает внимание на соответствие номера порта источника и не обращает внимания на адрес источника. В нашем примере маршрутизатор будет транслировать входящие пакеты с любым адресом источника, но порт источника при этом обязан быть 53, в противном случае пакет будет уничтожен маршрутизатором.

Как видим, реализации NAT – это настоящий зоопарк, в котором каждой твари по паре. Положение смягчается тем, что для большинства сетевых приложений подробности реализации NAT большого значения не имеют (в особенности для приложений, использующих транспорт TCP, как известно, это протокол, использующий сессии, поэтому сказанное выше для TCP неактуально. Тем не менее с развитием приложений Peer-to-Peer (eDonkey, eMule, Skype), IPтелефонии и разнообразной сетевой мультимедии (зачастую использующих транспорт на основе UDP) различия в реализациях NAT постепенно начинают играть заметную роль. Поэтому для разработчиков таких приложений пришла пора задуматься над тем, как их детище будет работать, находясь в локальной сети за NATом. Одним из плодов таких раздумий стал протокол STUN (Simple Traversal of UDP through NAT), описанный в RFC 3489.

STUN

Некоторым приложениям, особенно предназначенным для IP-телефонии (поскольку там это наиболее актуально), важно знать, находится ли компьютер, на котором они запущены, в локальной сети за NAT или на компьютере с публичным IP адресом, и в случае NAT – определить, какого он типа. Для этого в настоящее время широко используется протокол STUN, который позволяет также определить наличие блокирующего firewall на пограничном маршрутизаторе или самом компьютере.

Идея STUN несложна – клиент отправляет на находящийся снаружи сервер зондирующие сообщения, используя транспорт UDP. В теле этих сообщений содержатся IPадреса и номера портов источника и приемника. Непременным условием работы сервера является использование им двух IP-адресов – дальше станет понятно, для чего.

Процесс определения типа NAT с использованием STUN протекает следующим образом. Допустим, наш клиент находится за NAT, его локальный адрес 192.168.0.111, публичный адрес NAT – 1.2.3.4, адреса сервера STUN – 11.22.33.1 и 11.22.33.2, номера портов 3478.

Происходит следующее:

  1. Клиент отправляет запрос на основной адрес сервера (11.22.33.1), при этом в теле отправленного запроса указаны адреса и порты: 192.168.0.111:1055 -> 11.22.33.1:3478. Эти же адреса и порты фигурируют в заголовке IP-пакета, содержащего запрос, но после прохождения NAT адрес источника изменится на 1.2.3.4, а номер порта в зависимости от реализации NAT может измениться или остаться неизменным. Если клиент не получает никакого ответа в течение тайм-аута, он делает вывод, что находится за блокирующим firewall, и завершает работу.
  2. Сервер отвечает клиенту со своего адреса 11.22.33.1 сообщением, в теле которого также указаны адреса и порты: 11.22.33.1:3478 -> 1.2.3.4:1055. Если бы адрес, с которого клиент отправлял своё первое сообщение (192.168.0.111), и адрес в полученном от сервера сообщении (1.2.3.4) совпали, клиент сделал бы вывод, что на пути пакетов NAT отсутствует. В этом случае клиент и сервер обменялись бы еще парой запросов-ответов, на основании которых можно было бы определить, не находится ли по пути между ними firewall, блокирующий входящие пакеты UDP. Поскольку они не совпадают, очевидно, что на пути между клиентом и сервером находится NAT. В этом же сообщении сервер информирует клиента о своем альтернативном IP-адресе (11.22.33.2) и номере порта (3478).
  3. После этого клиент отправляет второе зондирующее сообщение, в котором установлен специальный флажок, указывающий серверу, что клиент ожидает ответа с альтернативного IP-адреса сервера (11.22.33.2), и с другим номером порта источника. Если клиент получает ответ на этот запрос, делается вывод, что находящийся по пути между ними NAT относится к Full Cone типу.
  4. Если ответ на предыдущий запрос не был получен, клиент повторяет свое первое зондирующее сообщение на альтернативный адрес STUN сервера. Если в полученном ответе адрес и номер порта отличаются от указанных в первом ответе, это означает, что этот запрос инициировал появление в таблице NAT новой записи. Такое поведение характерно исключительно для Symmetric NAT.
  5. Если адрес и номер порта в полученном ответе остались такими же, какими они были в первом ответе, то NAT относится к типу Restricted Cone. Осталось установить, является ли он Address Restricted или Port Restricted. Для этого клиент отсылает четвертое сообщение, в котором установлен флажок, указывающий серверу, что он должен ответить, используя порт источника с другим номером. Если ответ был получен, NAT относится к Address Restricted Cone, если нет – то к Port Restricted Cone.

Для иллюстрации работы STUN см. рис. 3 (взят из статьи «Anatomy: A Look Inside Network Address Translators» в «The IP Journal» Vol.7 Num. 2 за сентябрь 2004 г.).

Рисунок 3. Алгоритм работы STUN

Рисунок 3. Алгоритм работы STUN

Клиент STUN встроен в некоторые приложения IP-телефонии, например, X-Pro и X-Lite от компании CounterPath, и в некоторые другие. Консольный клиент STUN под ОС Windows может быть загружен отсюда: http://prdownloads.sourceforge.net/stun/client.exe?download.

Запустив его и указав в качестве параметра командной строки один из публичных STUN-серверов, вы узнаете тип вашего NAT:


C:\>client.exe stun.xten.com
STUN client version 0.94

Primary: Full Cone Nat, random port, no hairpin
Return value is 0x9

Приведённый выше результат получен на компьютере, находящемся за маршрутизатором ZyXEL Prestige 645R.

Результат для маршрутизатора Cisco 1721 с IOS версии 12.2 в свою очередь выглядит так:

C:\>client.exe stun.xten.net
STUN client version 0.94

Primary: Port Restricted Nat, preserves ports, no hairpin
Return value is 0x1b

Такой же результат получен для маршрутизатора, построенного на основе FreeBSD 4.9, на которой NAT выполнялась демоном natd.

Осталось объяснить, что такое «random port», «preserves ports» и «no hairpin» в приведенных выше результатах.

Посмотрим еще раз на строчку из таблицы NAT в нашем примере:

Proto Inside global Inside local Outside local Outside global
UDP 11.22.33.44:1053 192.168.0.141:1053 1.2.3.4:53 1.2.3.4:53

«Random port» означает, что данная реализация NAT не заботится о том, чтобы номер порта источника в исходящем наружу пакете оставался таким же, каким он был получен от хоста локальной сети, и заменяет его на случайное значение в диапазоне от 1024 до 65535. Можно предположить, что по замыслу автора идеи «random ports» такая замена уменьшает вероятность конфликта между записями, если несколько хостов локальной сети одновременно попытаются отправить наружу пакеты с совпадающим номером порта источника. Поскольку номер порта источника в исходящих пакетах формируется хостами локальной сети также случайным образом, преимущества такой замены сомнительны, из недостатков же можно назвать хотя бы потенциальную проблему с протоколом RPC, да и не только.

Как видно из примера, наш маршрутизатор старается сохранять номер порта неизменным (11.22.33.44:1053 и 192.168.0.141:1053), из чего следует, что запущенный в его локальной сети STUN-клиент сообщил бы о нем «preserves ports». К слову, на FreeBSD этот результат достигается ключом «-same_ports» или «-s» в строчке запуска или конфигурационном файле демона natd.

«Hairpin» же означает следующее. Допустим, при наличии в таблице NAT приведенной выше строчки другой хост нашей локальной сети (например, 192.168.0.241) отправляет UDP-пакет с адресом назначения 11.22.33.44, портом назначения 1053 и портом источника 53. Что произойдет в результате?

Ответ на этот вопрос зависит от того, поддерживает маршрутизатор функцию «hairpin» или не поддерживает. Если он ее поддерживает, пакет будет обычным образом обработан и (если на маршрутизаторе используется реализация NAT Full Cone или Port Restricted) попадет по назначению – на хост 192.168.0.141. Если же нет («no hairpin»), пакет будет уничтожен маршрутизатором. Название функции «hairpin» (шпилька для волос) произошло от того, что, если изобразить прохождение такого пакета на рисунке, форма его траектории будет похожа на U-образную шпильку. Другое объяснение – слово «hairpin» переводится так же, как «разворот на 180 градусов». При поддержке маршрутизатором функции «hairpin» подпадающие под ее действие пакеты, действительно, будут развернуты на 180 градусов и отправлены обратно в локальную сеть.

NAT и шлюзы приложений

К сожалению, не у всех сетевых протоколов взаимодействие с NAT протекает безболезненно. Наиболее часто встречающийся пример – это FTP. Здесь возможны два случая.

Первый случай. Пользователь, находящийся в локальной сети за NAT, использует FTP-клиент для того, чтобы получить доступ к FTP-серверу с публичным IP-адресом (см. рис. 4).

Рисунок 4. Пример FTP-сессии

Рисунок 4. Пример FTP-сессии

Проблема здесь возникает, когда клиент пытается использовать активный режим FTP. Сессия протекает при этом следующим образом. В некоторый момент по управляющему соединению серверу передается команда FTP-клиента: PORT 192,16,0,101,4,211.

Дальнейший диалог выглядит примерно так:

Server: 200 PORT command successful. Consider using PASV.
Client: RETR file.zip
Server: 150 Opening BINARY mode data connection for file.zip (1334109 bytes).

Наибольший интерес здесь представляет первая команда от клиента, которая информирует сервер о том, что хост с адресом 192.168.0.101 открыл для приема соединения данных порт номер (4*256) + 211 = 1235. В ответ на это сервер должен установить соединение данных со своего порта номер 20 на указанный порт хоста 192.168.0.101. Поскольку этот адрес является приватным, такое соединение не может быть установлено. В результате наблюдается знакомый многим системным администраторам эффект, когда клиент вроде бы успешно подключается к FTP-серверу, но не может скачивать с него файлы или даже просматривать содержимое текущего каталога (это происходит потому, что передача листинга файлов с сервера на клиент также осуществляется по соединению данных).

Для борьбы с описанной проблемой может использоваться переключение сервера в так называемый пассивный режим. Поскольку в этом режиме инициатором соединения данных выступает клиент, проблема исчезает. Именно поэтому в Microsoft Internet Explorer, как и консольный FTP-клиент, встроенный в Windows, используют по умолчанию пассивный режим (они автоматически вставляют перед командами RETR и NLST команду PASV, переключающую сервер в пассивный режим).

Второй случай. Пользователь, находящийся в локальной сети за NAT, использует FTP-клиент для того, чтобы получить доступ к FTP-серверу, который также находится за NAT. В этом случае, очевидно, не поможет и пассивный режим, так как в команде PORT независимо от того, клиент или сервер ее отдает, всегда будет указан приватный IP-адрес, и соединение данных никогда не будет установлено.

Для разрешения этой проблемы в некоторых реализациях NAT существует специальная функция – трансляция адресов на уровне приложений, называемая также NAT ALG (Application Level Gateways). При задействованной функции ALG маршрутизатор отслеживает и модифицирует данные уровня приложений некоторых сетевых протоколов.

Так, в приведенном выше примере, если предположить, что публичный IP-адрес маршрутизатора с NAT 1.2.3.4 и что он сохраняет номер порта источника неизменным, команда PORT 192,16,0,101,4,211 была бы изменена маршрутизатором на PORT 1,2,3,4,4,211. Благодаря этому в обоих указанных выше случаях соединение данных будет успешно установлено.

Функция ALG в маршрутизаторах Cisco позволяет осуществлять трансляцию адресов уровня приложений не только для протокола FTP, но также и для протоколов SIP, H.323, Skinny и некоторых других (благодаря этому можно, например, размещать в локальной сети серверы DNS). Для большего удобства функция ALG в маршрутизаторах Cisco включена по умолчанию.

Аналогичную ALG функциональность в маршрутизаторах на основе ОС Linux обеспечивают дополнительные загружаемые модули и патчи к ядру (такие, как ip_masq_ftp, ip_masq_irc и т. п.).

Заключение

Понимание принципов работы различных реализаций NAT может оказаться полезным при поиске причины неудовлетворительной работы некоторых приложений, использующих транспортный протокол UDP. Так, например, сочетание ALG и Symmetric или Port Restricted NAT и IP-телефонов, использующих протокол установки соедиенения SIP, может порой давать самые причудливые результаты (спорадические отказы в регистрации на сервере, односторонняя слышимость между абонентами и т. п.), причем это зависит не только от настроек IP-телефона, но и от настроек сервера. Другой пример: компания Microsoft сообщает в своей статье KB817778, что их реализация туннеля IPv6 over UDP не будет работать через Symmetric NAT (адрес статьи в Интернете: http://support.microsoft.com/kb/817778/EN-US). Таких примеров можно найти ещё много, и во всех случаях понимание различий в реализациях NAT если и не поможет немедленно устранить проблему, то хотя бы укажет на возможные пути решения (например, заменить firmware маршрутизатора на такое, где NAT реализован в виде Full Cone, если, конечно, оно существует, или заменить сам маршрутизатор).

Оригинал статьи

Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 7, среднее: 4,43 из 5)
Загрузка...
Отправить на почту Отправить на почту

Описание задачи

Снимать статистику с интерфейсов посредством netflow и отправлять на биллинговый сервер.

Решение

На IOS 12.3 и выше ( в моем случае это был 12.4Т) по рекомендации cisco, ip flow настраивается следующим образом:

1. Включаем cef (Cisco Express Forwarding)

configure terminal
ip cef

2. описываем кол-во записей

ip flow-cache entries 40960

3. выставляем тайм ауты

ip flow-cache timeout inactive 130
ip flow-cache timeout active 20

4. указываем интерфейс

ip flow-export source INTERFACE

где INTERFACE это интерфейс с которого будет отправляться flow

5. версия

ip flow-export version 5

6. куда отправляем

ip flow-export destination IP-адрес Порт

собственно на этом «описательная» часть закончилась …

теперь настраиваем сами интерфейсы …

на физических интерфейсах обязательно включаем (fa 0/1 например):

configure terminal
interface fa 0/1
ip route-cache flow

и все больше на них ничего быть не должно (если на них нет ip-адресов)

все остальный телодвижения проделываем только на subinterfaces

включаем на сабах (fa 0/1.1 например):

configure terminal
interface fa 0/1.1
ip flow ingress
ip flow egress

ingress — для входящего трафика
egress — для исходящего трафика

Собственно все. Только заработает все выше описанное после ребута cisco.

ЗЫ: Не наступите на мои грабли и сразу продумайте откуда Вы хотите снимать статистику. В моем случае я не снимаю статистику с uplink , только с саб интерфейсов, на/через которые подключены абоненты. Иначе трафик будет считаться несколько раз.

Что можно посмотреть:

show ip cache flowпоказывает записи флоу на cisco
show ip cache ver flow — тоже самое расширено
show ip flow int — показывает интерфейсы, на которых настроено флоу
show ip flow export — показывает, откуда и куда настроен экспорт флоу, сколько отправлено датаграмм и сколько ошибок

Прием netflow

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

Можно как вариант использовать пакет flow-tools ( для FreeBSD — в портах: net-mgmt/flow-tools ). Настройка этого пакета подробно рассмотрена на http://opennet.ru, поэтому здесь он будет описан бегло.

Для flow-tools особых настроек я не делал просто прописал стартовый скрипт типа:

/usr/local/bin/flow-capture -p /var/run/flow-capture.pid -n 0 -N 2 -w /var/netflow -S 60 localip/rempteip/port

Рассмотрим опции:

-p pid файл (можно не писать)

-n кол-во ротаций файла с флоу в день я поставил 0 чтобы за сутки был один файл (просто мне так удобнее)

-N формат имени файла с флоу, где далее указывается:

  • -3 YYYY/YYYY-MM/YYYY-MM-DD/flow-file
  • -2 YYYY-MM/YYYY-MM-DD/flow-file
  • -1 YYYY-MM-DD/flow-file
  • 0 flow-file
  • 1 YYYY/flow-file
  • 2 YYYY/YYYY-MM/flow-file
  • 3 YYYY/YYYY-MM/YYYY-MM-DD/flow-file

я выбрал 2 (просто привычка)

-w рабочая директория, то, куда будут ложиться файлы со статистикой в выбранном ранее формате

-S этот параметр больше нужен для самоуспокоения и мониторинга. Это кол-во минут, через которое в лог файл будет сыпаться информация о принятых записях флоу. Я использую ее как мониторинг.

localip/remoteip/port — тут, я думаю, все и так понятно:

localip — ip машины, на которой запущен коллектор flow-tools;

remoteip — ip машины, с которой мы принимаем флоу (это может быть как cisco так и другая машина, которая отправляет флоу), в моем случае это ip cisco;

port — порт коллектора, на котором flow-tools слушает и получает данные.

Пример с IP-адресами:

/usr/local/bin/flow-capture -p /var/run/flow-capture.pid -n 0 -N 2 -w /var/netflow -S 60 192.168.1.1/192.168.1.2/5555

В свое время у меня возникла необходимость иметь два коллектора. Flow-tools прекрасно справляется и с этой задачей: я просто запустил еще один flow-capture, но на другом порту и с другой рабочей директорией.

Посмотреть статистику можно утилитой из того же flow-tools:

/usr/local/bin/flow-cat <путь к файлу с флоу> | /usr/local/bin/flow-print

Удачи.

З.Ы. При копировании статьи ссылка на источник ОБЯЗАТЕЛЬНА !

Автор: Green
Ничего не понялТак себе...Не плохоДовольно интересноОтлично ! То что нужно ! (голосов: 8, среднее: 5,00 из 5)
Загрузка...
Отправить на почту Отправить на почту