пїЅпїЅпїЅпїЅпїЅпїЅ пїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅпїЅ пїЅпїЅпїЅпїЅпїЅ
Слишком длинный поисковый запрос.
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие наши статьи:
img
Учет использования системных ресурсов, производительности и возможных проблем в обслуживании довольно сложная задача. Более серьёзные сложности появляются при создании инфраструктуры, включающей несколько компонентов, таких как сервер, база данных, обмен сообщениями, аутентификация, балансировка нагрузки и т.д. Когда у вас есть 1 или 2 сервера, то, вероятно, ими легко управлять вручную, но когда вы имеете дело с сотнями или тысячами, то вам нужен инструмент для управления ими. Умный инструмент, который может помочь ускорить административные задачи как установка, внесение исправлений, конфигурация, контроль, и т.д. Представьте, что вы - sysadmin и должны управлять сотней серверов вручную. На это не хватит времени чисто физически. В этой статье приведём некоторые инструменты, которые можете использовать для облегчения и упрощения рутинных задач. Некоторые из них бесплатны, поэтому не придётся убеждать своего начальника в целесообразности вложения. Cockpit Cockpit - это решение с открытым исходным кодом для администрирования Linux серверов. С его помощью можно запускать контейнеры, управлять дисками, настраивать сеть, анализировать логи и т.д. и т.п. Система имеет возможность одновременного управления и мониторинга состояние нескольких серверов. Для этого достаточно добавить нужные хосты в систему и Cockpit начнёт следить за ними. Вот некоторые возможности системы: Визуализация производительности системы Управление Docker-контейнерами Веб-оболочка в окне терминала Командная строка Управление учетными записями Сбор конфигурации системы и диагностической информации Изменение настроек сети Благодаря хорошей документации эту систему можно легко установить и сразу же начать пользоваться. Ajenti Ajenti - популярное решение с открытым исходным кодом, которое предлагает панель администрирования сервера через браузер. Можно устанавливать дополнительные пакеты и выполнять команды, а также просматривать важную информацию о состоянии сервера, например, количество используемой оперативной памяти, размер свободного места на диске и т. д. Ajenti предлагает очень удобный инструмент для управления несколькими веб-сайтами. Для этого нужно установить дополнительную надстройку под названием Ajenti V. Она позволяет управлять сайтами на основе PHP, Python, Ruby и Node.js. Ajenti модульный, легко расширяемый, который удивительно полезен для различных случаев использования. Некоторые из его особенностей включают: Понятный и хорошо документированный интерфейс Графический интерфейс пользователя на AngularJS Одностраничное приложение на AJAX Интуитивный дизайн Уведомления, модульные окна и обновления в реальном времени Подключаемая аутентификация и авторизация Брандмауэр Webmin Webmin - как и говорит название, панель управления для Linux серверов через веб-браузер. Он поддерживает более 100 Unix дистрибутивов. Он выполняет функции комплексного интерфейса для базовых приложений на серверах, включая поддержку настройки таких приложений, как FTP, ssh, почта, Web, базы данных и многое другое. Webmin модульная система, благодаря чему любой кто может писать плагины очень легко может добавлять новые функции и возможности Webmin основан на модуле, что позволяет легко добавлять новые функциональные возможности и возможно для любого, кто хочет писать плагины для управления сервером. По умолчанию, доступно более 100 модулей. InterWorx InterWorx состоит из двух модулей: NodeWorx - для управления серверами SiteWorx - для управления сайтами и доменами Система имеет поддержку на основе приложений, которая включает в себя Apache, PHP, MySQL, Perl и Djbdns (DNS), а также работу электронной почты и включает в себя сервисы POP3, IMAP, SMTP, использующие Qmail. Ниже перечислены некоторые возможности системы Управление резервными копиями Использование полосы пропускания Уведомления в случае сбоев CLI, API и поддержка плагинов Кластеризация для отказоустойчивости cPanel Пожалуй, самая известная система управления сайтом. Система работает на Linux, имеет простой и понятный графический интерфейс и позволяет автоматизировать задачи управление веб-хостингом. cPanel безусловно одна из лучших панелей управления веб-хостингом в своей отрасли. Она имеет возможность публикации веб-сайта, создания электронной почты и календарей, безопасного управления файлами, управления доменами, запуска баз данных, добавления или удаления DNS, настройки FTP, планирования заданий с помощью cron, отображения статистики логирования и многое другое. Plesk Plesk - система, позволяющая управлять облачными серверами, WordPress-ом, Joomla и т.д. Она поддерживает больше ста расширений. Почему для управления хостингом стоит выбирать Plesk? Все просто: Дружественный интерфейс; Мультитенантность; Высокая безопасность; Набор SEO-инструментов. Мультитенантность - элемент архитектуры программного обеспечения, где один экземпляр запущенного на сервере приложения обслуживает множество клиентов («арендаторов»). Почти все ИТ специалисты, разработчики, цифровые агентства, контент-менеджеры - пользователи Plesk. Plesk - основной конкурент cPanel, о котором упоминалось выше. Directadmin DirectAdmin - не менее популярная система управление веб хостингом, которая по умолчания имеет три уровня доступа - администраторы, реселлеры, пользователи. Каждый их уровней имеет свой функционал. Администраторы имеют право на администрирование и кластеризацию DNS, управление IP, управление пользователями, обновление программного обеспечения и многие другие функции. Реселлеру доступны функции управления учетными записями и пакетами, управления связями с пользователями, системной информацией. Пользователи получат возможность управления файлами и базами данных, администрирования электронной почты, управления FTP, резервного копирования сайта и многие другие функции. Virtualmin Virtualmin мощная и расширяемая панель для управления веб-хостингом для Linux и BSD систем. Панелью можно пользоваться через настольные ПК, планшеты и мобильные устройства. Virtualmin решение с открытым исходным кодом с премиум поддержкой. Эта система с большим чем 100 тысяч установок - одна из самых популярных панелей управления веб-хостингом. После установке Virtulmin вы получаете все функции управления веб-хостингом, как web, электронная почта, домен, DNS, аналитика, отчетность и т. д. Она также предлагает некоторые эксклюзивные возможности, как двухфакторная аутентификация, аутентификация через LDAP, управление посредством командной строки и много других передовых средств управления доступом. Заключение Подключение к серверам по одному и ручная проверка их работы действительно занимает очень много времени пользователя. Именно поэтому управление серверами со временем привлекло к себе столько внимания. Средства удаленного администрирования серверов облегчают управление серверами и повышают эффективность.
img
Мы рассказали про принципы работы протокола NAT (Network Address Translation) и теперь настало время рассмотреть его настройку на оборудовании Cisco. Настройка статического NAT (Static NAT) Напомним, что статический NAT представляет собой сопоставление внутреннего и внешнего адреса один к одному. Он позволяет внешним устройствам инициировать подключения к внутренним с использованием статически назначенного общего адреса. Например, внутренний веб-сервер может быть сопоставлен с определенным внутренним глобальным адресом, чтобы он был доступен из внешних сетей. На схеме показана внутренняя сеть, содержащая веб-сервер с частным адресом IPv4. Маршрутизатор сконфигурирован со статическим NAT, чтобы позволить устройствам из внешней сети обращаться к веб-серверу. Клиент из внешней сети обращается к веб-серверу с использованием общедоступного IPv4-адреса. Статический NAT переводит общедоступный IPv4-адрес в частный. При настройке статических трансляций NAT выполняются две основные задачи: Создание сопоставления между внутренним локальным (inside local) адресом и внутренними глобальными (inside global) адресами. Например, внутренний локальный адрес 192.168.1.5 и внутренний глобальный адрес 208.165.100.5 на схеме настроены как статическая NAT трансляция. После того как сопоставление настроено, интерфейсы, участвующие в трансляции должны быть настроены как внутренние (inside) и наружные (outside) относительно NAT. На схеме интерфейс маршрутизатора Serial 0/0/0 является внутренним, а Serial 0/1/0 – внешним. Пакеты, поступающие на внутренний интерфейс маршрутизатора Serial 0/0/0 из настроенного внутреннего локального адреса IPv4 (192.168.1.5), транслируются и затем перенаправляются во внешнюю сеть. Пакеты, поступающие на внешний интерфейс Serial 0/1/0, адресованные настроенному внутреннему глобальному адресу IPv4 (208.165.100.5), переводятся на внутренний локальный адрес (192.168.1.5) и затем перенаправляются внутрь сети. Настройка проходит в несколько шагов: Создать статическую трансляцию между внутренним локальным и внешним глобальным адресами. Для этого используем команду ip nat inside source static [локальный _IP глобальный_IP]. Чтобы удалить трансляцию нужно ввести команду no ip nat inside source static. Если нам нужно сделать трансляцию не адреса в адрес, а адреса в адрес интерфейса, то используется команда ip nat inside source static [локальный _IP тип_интерфейса номер_интерфейса]. Определим внутренний интерфейс. Сначала зайти в режим конфигурации интерфейса, используя команду interface[тип номер] и ввести команду ip nat inside Таким же образом определить внешний интерфейс, используя команду ip nat outside Пример: Router(config)# ip nat inside source static 192.168.1.5 208.165.100.5 Router(config)# interface serial0/0/0 Router(config-if)#ip nat inside Router(config-if)#exit Router(config)# interface serial0/1/0 Router(config-if)#ip nat outside В результате трансляции будут проходить так: Клиент хочет открыть соединение с веб-сервером. Клиент отправляет пакет на веб-сервер, используя общедоступный IPv4-адрес назначения 208.165.100.5. Это внутренний глобальный адрес веб-сервера. Первый пакет, который роутер получает от клиента на внешнем интерфейсе NAT, заставляет его проверять свою таблицу NAT. Адрес IPv4 адресата находится в таблице NAT он транслируется. Роутер заменяет внутренний глобальный адрес назначения 208.165.100.5 внутренним локальным 192.168.1.5 и пересылает пакет к веб-серверу. Веб-сервер получает пакет и отвечает клиенту, используя внутренний локальный адрес источника 192.168.1.5. Роутер получает пакет с веб-сервера на свой внутренний интерфейс NAT с адресом источника внутреннего локального адреса веб-сервера, 192.168.1.5. Он проверяет NAT таблицу для перевода внутреннего локального адреса во внутренний глобальный, меняет адрес источника с 192.168.1.5 на 208.165.100.5 и отправляет его из интерфейса Serial 0/1/0 в сторону клиента Клиент получает пакет, и обмен пакетами продолжается. Роутер выполняет предыдущие шаги для каждого пакета. Проверка статического NAT Полезной командой для проверки работы NAT является команда show ip nat translations. Эта команда показывает активные трансляции NAT. Статические переводы, в отличие от динамических переводов, всегда находятся в таблице NAT. Router#show ip nat translations Pro Inside global Inside local Outside local Outside global --- 208.165.100.5 192.168.1.5 208.165.100.70 208.165.100.70 Другой полезной командой является команда show ip nat statistics. Она отображает информацию об общем количестве активных переводов, параметрах конфигурации NAT, количестве адресов в пуле и количестве адресов, которые были выделены. Router#show ip nat statistics Total active translations: 1 (1 static, 0 dynamic; 0 extended) Peak translations: 2, occurred 00:00:21 ago Outside interfaces: Serial0/1/0 Inside interfaces: Serial0/0/0 Hits:7 Misses:0 Чтобы убедиться, что трансляция NAT работает, лучше всего очистить статистику из любых прошлых переводов, используя команду clear ip nat statistics перед тестированием. Настройка динамического NAT (Dynamic NAT) В то время пока статический NAT постоянное сопоставление между внутренним локальным и внутренним глобальным адресом, динамический NAT позволяет автоматически сопоставлять внутренние локальные и глобальные адреса (которые обычно являются публичными IP-адресами). Динамический NAT использует группу или пул публичных адресов IPv4 для перевода. Динамический NAT, как и статический NAT, требует настройки внутреннего и внешнего интерфейсов, участвующих в NAT. Рассмотрим на примере этой схемы. Мы тут имеем внутреннюю сеть с двумя подсетями 192.168.1.0/24 и 192.168.2.0/24 и пограничным маршрутизатором, на котором настроен динамический NAT с пулом публичных адресов 208.165.100.5 - 208.165.100.15. Пул публичных адресов (inside global address pool) доступен для любого устройства во внутренней сети по принципу «первым пришел – первым обслужили». С динамическим NAT один внутренний адрес преобразуется в один внешний адрес. При таком типе перевода должно быть достаточно адресов в пуле для одновременного предоставления для всех внутренних устройств, которым необходим доступ к внешней сети. Если все адреса в пуле были использованы, то устройство должно ждать доступного адреса, прежде чем оно сможет получить доступ к внешней сети. Рассмотрим настойку по шагам: Определить пул которые будут использоваться для перевода, используя команду ip nat pool [имя начальный_ip конечный_ip]. Этот пул адресов обычно представляет собой группу публичных общедоступных адресов. Адреса определяются указанием начального IP-адреса и конечного IP-адреса пула. Ключевые слова netmask или prefix-length указывают маску. Нужно настроить стандартный access-list (ACL), чтобы определить только те адреса, которые будут транслироваться. Введем команду access-list [номер_ACL] permit source [wildcard_маска]. Про стандартные access-list’ы можно прочитать в этой статье (а про расширенные в этой). ACL который разрешает очень много адресов может привести к непредсказуемым результатам, поэтому в конце листа есть команда deny all. Необходимо привязать ACL к пулу, и для этого используется команду ip nat inside source list [номер_ACL] number pool [название_пула]. Эта конфигурация используется маршрутизатором для определения того, какие устройства (список) получают адреса (пул). Определить, какие интерфейсы находятся внутри, по отношению к NAT, то есть любой интерфейс, который подключен к внутренней сети. Определить, какие интерфейсы находятся снаружи, по отношению к NAT, то есть любой интерфейс, который подключен к внешней сети. Пример: Router(config)# ip nat pool MerionNetworksPool 208.165.100.5 208.165.100.15 netmask 255.255.255.0 Router(config)# access-list 1 permit 192.168.0.0 0.0.255.255 Router(config)#ip nat inside source list 1 pool MerionNetworksPool Router(config)# interface serial0/0/0 Router(config-if)#ip nat inside Router(config-if)#exit Router(config)# interface serial0/1/0 Router(config-if)#ip nat outside Как это будет работать на нашей схеме: Компьютеры с адресами 192.168.1.10 и 192.168.2.10 отправляют пакеты в сторону сервера по публичному адресу 208.165.100.70 Маршрутизатор принимает первый пакет от хоста 192.168.1.10. Поскольку этот пакет был получен на интерфейсе, сконфигурированном как внутренний интерфейс NAT, маршрутизатор проверяет конфигурацию NAT, чтобы определить, должен ли этот пакет быть транслирован. ACL разрешает этот пакет, и роутер проверяет свою таблицу NAT. Поскольку для этого IP-адреса нет записи трансляции, роутер определяет, что исходный адрес 192.168.1.10 должен быть переведен динамически. R2 выбирает доступный глобальный адрес из пула динамических адресов и создает запись перевода, 208.165.200.5. Исходный IPv4-адрес источника (192.168.1.10) является внутренним локальным адресом, а переведенный адрес является внутренним глобальным адресом (208.165.200.5) в таблице NAT. Для второго хоста 192.168.2.10 маршрутизатор повторяет эту процедуру, выбирая следующий доступный глобальный адрес из пула динамических адресов, создает вторую запись перевода - 208.165.200.6. После замены внутреннего локального адреса источника в пакетах маршрутизатор перенаправляет пакет. Сервер получает пакет от первого ПК и отвечает, используя адрес назначения 208.165.200.5. Когда сервер получает пакет от второго ПК, то в ответе в адресе назначения будет стоять 208.165.200.6. Когда роутер получает с адресом назначения 208.165.200.5, то он выполняет поиск в таблице NAT и переводит адрес назначения во внутренний локальный адрес 192.168.1.10 и направляет в сторону ПК. То же самое происходит с пакетом, направленным ко второму ПК. Оба ПК получают пакеты, и обмен пакетами продолжается. Для каждого следующего пакета выполняются предыдущие шаги. Проверка динамического NAT Для проверки также используется команда show ip nat отображает все статические переводы, которые были настроены, и любые динамические переводы, которые были созданы трафиком. Добавление ключевого слова verbose отображает дополнительную информацию о каждом переводе, включая то, как давно запись была создана и использовалась. По умолчанию данные о переводах истекают через 24 часа, если таймеры не были переконфигурированы с помощью команды ip nat translation timeout [время_в_секундах] в режиме глобальной конфигурации. Чтобы очистить динамические записи до истечения времени ожидания, можно использовать команду clear ip nat translation. Полезно очищать динамические записи при тестировании конфигурации NAT. Эту команду можно использовать с ключевыми словами и переменными, чтобы контролировать, какие записи очищаются. Конкретные записи можно очистить, чтобы не прерывать активные сеансы. Только динамические переводы удаляются из таблицы. Статические переводы не могут быть удалены из таблицы. Также можно использовать команду show ip nat statistics которая отображает информацию об общем количестве активных переводов, параметрах конфигурации NAT, количестве адресов в пуле и количестве переведенных адресов. Поскольку у нас здесь используются листы контроля доступа ACL, то для их проверки можно использовать команду show access-lists. Настройка Port Address Translation (PAT) PAT (также называемый NAT overload) сохраняет адреса во внутреннем глобальном пуле адресов, позволяя маршрутизатору использовать один внутренний глобальный адрес для многих внутренних локальных адресов. Другими словами, один открытый IPv4-адрес может использоваться для сотен и даже тысяч внутренних частных IPv4-адресов. Когда несколько внутренних локальных адресов сопоставляются с одним внутренним глобальным адресом, номера портов TCP или UDP каждого внутреннего узла различают локальные адреса. Общее количество внутренних адресов, которые могут быть переведены на один внешний адрес, теоретически может составлять 65 536 на каждый IP-адрес. Однако на практике число внутренних адресов, которым может быть назначен один IP-адрес, составляет около 4000. Существует два способа настройки PAT, в зависимости от того, как провайдер выделяет общедоступные IPv4-адреса. В первом случае интернет-провайдер выделяет более одного публичного IPv4-адреса организации, а в другом он выделяет один общедоступный IPv4-адрес, который требуется для организации для подключения к интернет-провайдеру. Настройка PAT для пула публичных IP-адресов Если нам доступно более одного общедоступного IPv4-адреса, то эти адреса могут быть частью пула, который используется PAT. Это похоже на динамический NAT, за исключением того, что в этом случае недостаточно общих адресов для взаимного сопоставления внутренних адресов. Небольшой пул адресов распределяется между большим количеством устройств. Основное различие между этой конфигурацией и конфигурацией для динамического NAT, заключается в том, что используется ключевое слово overload, которое включает PAT. Рассмотрим настойку PAT для пула адресов по шагам: Определить пул адресов глобальных адресов, которые будут использоваться для PAT трансляции, используя команду ip nat pool [имя начальный_ip конечный_ip] netmask [маска] | prefix-length [длина_префикса]. Создать стандартный access-list, разрешающий адреса, которые должны быть переведены. Используется команда access-list [номер_ACL] permit source [wildcard_маска]. Включим PAT, используя волшебное слово Overload. Вводим команду ip nat inside source list [номер_ACL] number pool [название_пула] overload. Определяем, какие интерфейсы находятся внутри, по отношению к NAT, а какие снаружи. Используем команду ip nat inside и ip nat outside Пример настройки для схемы, что использовалась ранее, только теперь мы будем использовать PAT: Router(config)# ip nat pool MerionNetworksPool2 208.165.100.5 208.165.100.15 netmask 255.255.255.0 Router(config)# access-list 1 permit 192.168.0.0 0.0.255.255 Router(config)#ip nat inside source list 1 pool MerionNetworksPool2 overload Router(config)# interface serial0/0/0 Router(config-if)#ip nat inside Router(config-if)#exit Router(config)# interface serial0/1/0 Router(config-if)#ip nat outside Настройка PAT для одного публичного IPv4-адреса На схеме показана топология реализации PAT для трансляции одного IP публичного адреса. В этом примере все хосты из сети 192.168.0.0/16 (соответствующие ACL), которые отправляют трафик через маршрутизатор, будут переведены на адрес IPv4 208.165.99.225 (адрес IPv4 интерфейса S0 /1/0). Трафик будет идентифицироваться по номерам портов в таблице NAT. Настройка: Создать лист access-list разрешающий адреса, которые нужно транслировать – access-list [номер_ACL] permit source [wildcard_маска]. Настроить преобразование адреса источника в адрес интерфейса, через команду ip nat inside source list [номер_ACL] interface [тип номер] overload Определить внешние и внутренние интерфейсы через команды ip nat inside и ip nat outside. Конфигурация похожа на динамический NAT, за исключением того, что вместо пула адресов мы используем адрес интерфейса с вешним IP адресом. NAT пул не определяется. Пример: Router(config)# access-list 1 permit 192.168.0.0 0.0.255.255 Router(config)# ip nat source list 1 interface serial0/1/0 overload Router(config)# interface serial0/0/0 Router(config-if)#ip nat inside Router(config-if)#exit Router(config)# interface serial0/1/0 Router(config-if)#ip nat outside Процесс PAT не изменятся при использовании одного адреса, или пула адресов. Рассмотрим процесс PAT по шагам: На схеме два разных ПК связываются с двумя разными веб-серверами. Первый ПК имеет адрес источника 192.168.1.10 и использует TCP порт 1444, а второй ПК имеет адрес источника 192.168.2.10 и по совпадению использует то же TCP порт 1444 Пакет с первого ПК сначала достигает роутера и он, используя PAT, изменяет исходный IPv4-адрес на 208.165.99.225 (inside global address). В таблице NAT нет других устройств с портом 1444, поэтому PAT использует тот же номер порта и пакет отправляется в направлении сервера по 208.165.101.20. Далее пакет со второго компьютера поступает в маршрутизатор, где PAT настроен на использование одного глобального IPv4-адреса для всех переводов - 208.165.99.225. Подобно процессу перевода для первого ПК, PAT изменяет исходящий адрес второго ПК на внутренний глобальный адрес 208.165.99.225. Однако второй ПК имеет тот же номер порта источника, что и текущая запись PAT первого ПК, поэтому PAT увеличивает номер порта источника до тех пор, пока он не станет уникальным в своей таблице. В этом случае запись исходного порта в таблице NAT и пакет для второго ПК получает 1445 порт. Хотя оба ПК используют один и тот же внутренний глобальный адрес 208.165.99.225 и тот же номер порта источника – 1444, измененный номер порта для второго ПК (1445) делает каждую запись в таблице NAT уникальной. Это станет очевидным при отправке пакетов с серверов обратно клиентам. Сервера отвечают на запросы от компьютеров, и используют исходный порт из принятого пакета в качестве порта назначения и исходный адрес как адрес назначения. Может казаться, что они общаются одним и тем же хостом по адресу 208.165.99.225, однако, это не так – они имеют разные порты. Когда пакеты возвращаются на роутер, он находит уникальную запись в своей таблице NAT с использованием адреса назначения и порта назначения каждого пакета. В случае пакета от первого сервера адрес назначения 208.165.99.255 имеет несколько записей, но только одну с портом назначения 1444. Используя эту запись в своей таблице, роутер изменяет адрес IPv4 адресата пакета на 192.168.1.10, не меняя порт назначения. Затем пакет перенаправляется на первый ПК Когда пакет от второго сервера прилетает на маршрутизатор, он выполняет аналогичный перевод. Адрес IPv4 назначения 208.165.99.225 имеет несколько записей, однако используя порт назначения 1445, роутер может однозначно идентифицировать запись трансляции. Адрес IPv4 назначения будет изменен на 192.168.2.10 и в этом случае порт назначения также должен быть изменен до исходного значения 1444, которое хранится в таблице NAT. После этого пакет высылается на второй ПК Проверка Port Address Translation (PAT) Для проверки PAT используются такие же команды, что и для обычного NAT. Команда show ip nat translations отображает переводы IP адресов вместе с портами и команда show ip nat statistics показывает информацию о количестве и типе активных переводов, параметрах конфигурации NAT, количестве адресов в пуле и количестве выделенных адресов. Router#show ip nat statistics Total active translations: 2 (0 static, 2 dynamic; 2 extended) Peak translations: 2, occurred 00:00:07 ago Outside interfaces: Serial0/1/0 Inside interfaces: Serial0/0/0 Hits:4 Misses:0 CEF Translated packets: 4, CEF Punted packets:0 Expired translations: 0 Dynamic mappings: -- Inside Source [Id: 3] access-list 1 pool MerionNetworksPool2 refcount 2 pool MerionNetworksPool2: netmask 255.255.255.0 start 208.165.100.5 end 208.165.100.15 type generic, total addressers 10, allocated 1(10%), misses 0 Total doors: 0 Appl doors: 0 Normal doors: 0 Queued Packets: 0 Также для поиска проблем можно использовать дебаг, который запускается командой debug ip nat, который отображает информацию о каждом пакете, который транслируется маршрутизатором. Также можно использовать команду debug ip nat detailed, которая генерирует описание каждого пакета. Эта команда также предоставляет информацию о различных ошибках, например, таких как неспособность выделить глобальный адрес. Однако эта команда более требовательна к ресурсам устройства. Router#debug ip nat IP NAT debugging is on Router# *Aug 24 16:20:331:670: NAT*: s=192.168.1.10->208.165.99.225 d=208.165.101.20 [3730] *Aug 24 16:20:331:682: NAT*: s=208.165.101.20 d=208.165.99.225 ->192.168.1.10 [4156] *Aug 24 16:20:331:698: NAT*: s=192.168.1.10->208.165.99.225 d=208.165.101.20 [3731] *Aug 24 16:20:331:702: NAT*: s=192.168.1.10->208.165.99.225 d=208.165.101.20 [3732] *Aug 24 16:20:331:710: NAT*: s=208.165.101.20 d=208.165.99.225 ->192.168.1.10 [4157] В выводе используются следующие символы и значения: * (звездочка) – звездочка с NAT указывает, что перевод происходит по пути с быстрым переключением (fast-switched path). Первый пакет в разговоре всегда медленнее, остальные пакеты проходят путь с быстрым переключением. s= - IP адрес источника a.b.c.d ? w.x.y.z - это значение указывает, что адрес источника a.b.c.d переводится на w.x.y.z. d= - IP адрес назначения [xxxx] - значение в скобках - это идентификационный номер IP.
img
В этой статье мы заглянем под капот нейронных сетей и узнаем, как построить её с нуля. Как работает нейронная сеть? Для начала давайте разберемся, как устроены нейронные сети на самом высоком уровне. Нейронная сеть получает набор данных и выдает предсказание. Это очень просто. Разберем пример. Допустим, один из ваших друзей (который не является большим поклонником футбола) показывает на старую фотографию известного футболиста — скажем, Лионеля Месси — и спрашивает вас о нем. Вы сможете опознать футболиста за секунду, даже если фотография старая или сделана при тусклом свете. Причина в том, что вы уже тысячу раз видели его фотографии.  Но что произойдет, если вам дадут фотографию известного бейсболиста (а вы никогда раньше не видели ни одного бейсбольного матча)? Вы не сможете узнать этого игрока, даже если фотография будет четкой и яркой. Этот же принцип используется для нейронных сетей. Если наша цель — создать нейронную сеть для распознавания кошек и собак, мы просто покажем нейронной сети кучу фотографий собак и кошек. Точнее, мы показываем нейросети фотографии собак, а затем говорим ей, что это собаки. А затем показываем ей фотографии кошек и определяем, что это кошки. Как только мы обучим нашу нейросеть изображениям кошек и собак, она сможет легко классифицировать, кто изображен на картинке - кошка или собака. Короче говоря, она может отличить кошку от собаки. Но если показать нашей нейросети изображение лошади или орла, она никогда не определит, что это - лошадь или орел. Это происходит потому, что нейросеть никогда не видела изображения лошади или орла, потому что мы никогда не показывали ей этих животных. Если вы хотите улучшить возможности нейронной сети, вам нужно показать ей фотографии всех животных, которых вы хотите, чтобы нейронная сеть классифицировала. На данный момент она знает только кошек и собак и больше ничего. Набор данных, который мы используем для обучения, во многом зависит от поставленной перед нами задачи. Если вы хотите определить, положительно или отрицательно настроен твит, то, вероятно, вам понадобится набор данных, содержащий множество твитов с соответствующими метками - положительными или отрицательными.  Теперь, когда у вас есть общее представление о наборах данных и о том, как нейронная сеть обучается на этих данных, давайте углубимся в то, как работают нейронные сети. Понимание нейронных сетей Мы будем строить нейронную сеть для классификации цифр три и семь на изображении. Но прежде чем мы построим нейронную сеть, нам нужно глубже понять, как она работает. Каждое изображение, которое мы передаем нашей нейронной сети, - это просто набор чисел. То есть каждое изображение имеет размер 28?28, что означает, что в нем 28 строк и 28 столбцов, как в матрице. Мы видим каждую из цифр как полноценное изображение, но для нейросети это просто набор чисел в диапазоне от 0 до 255. Вот пиксельное представление цифры пять: Как вы можете видеть выше, у нас 28 строк и 28 столбцов (индекс начинается с 0 и заканчивается на 27), как и в матрице. Нейронные сети видят только эти матрицы 28?28. Чтобы показать больше деталей, тени идут вместе со значениями пикселей. Если присмотреться к изображению, то можно увидеть, что значения пикселей, близкие к 255, темнее, а значения, близкие к 0, светлее по оттенку. В PyTorch мы не используем термин матрица. Вместо этого мы используем термин тензор. Каждое число в PyTorch представлено в виде тензора. Поэтому с этого момента мы будем использовать термин тензор вместо матрицы. Визуализация нейронной сети Нейронная сеть может иметь любое количество нейронов и слоев. Вот как выглядит нейронная сеть: Пусть вас не смущают греческие буквы на картинке.  Возьмем случай, когда нужно предсказать, выживет пациент или нет, на основе набора данных, содержащего имя пациента, температуру, кровяное давление, состояние сердца, месячную зарплату и возраст. В нашем наборе данных только температура, кровяное давление, состояние сердца и возраст имеют существенное значение для предсказания того, выживет пациент или нет. Поэтому мы присвоим этим значениям больший вес, чтобы показать их большую важность. Но такие характеристики, как имя пациента и ежемесячная зарплата, практически не влияют на выживаемость пациента. Поэтому мы присваиваем этим признакам меньшие значения веса, чтобы показать их меньшую важность. На рисунке выше x1, x2, x3...xn - это признаки в нашем наборе данных, которые могут быть значениями пикселей в случае данных об изображениях или такими признаками, как кровяное давление или состояние сердца, как в приведенном выше примере. Значения признаков умножаются на соответствующие весовые коэффициенты, обозначаемые как w1j, w2j, w3j...wnj. Перемноженные значения суммируются и передаются на следующий слой. Оптимальные весовые значения узнаются в процессе обучения нейронной сети. Значения весов постоянно обновляются таким образом, чтобы максимизировать количество правильных предсказаний. Функция активации — это не что иное, как сигмоидная функция в нашем случае. Любое значение, которое мы передаем сигмоиду, преобразуется в значение между 0 и 1. Мы просто накладываем сигмоидную функцию на предсказание нашей нейронной сети, чтобы получить значение между 0 и 1. Вы поймете важность сигмоидального слоя, когда мы начнем строить нашу модель нейронной сети. Существует множество других функций активации, которые даже проще в изучении, чем сигмоида. Это уравнение для сигмоидальной функции: Узлы круглой формы на диаграмме называются нейронами. На каждом слое нейронной сети веса перемножаются с входными данными. Мы можем увеличить глубину нейронной сети, увеличив количество слоев. Мы можем повысить производительность слоя, увеличив количество нейронов в нем. Понимание набора данных Первое, что нам нужно для обучения нашей нейронной сети, это набор данных. Поскольку цель нашей нейронной сети - классифицировать, содержит ли изображение число три или семь, нам нужно обучить нашу нейронную сеть на изображениях троек и семерок. Итак, давайте создадим наш набор данных. К счастью, нам не придется создавать набор данных с нуля. Наш набор данных уже присутствует в PyTorch. Все, что нам нужно сделать, — это загрузить его и проделать с ним несколько базовых операций. Нам нужно загрузить набор данных под названием MNIST (Измененный Национальный институт стандартов и технологий) из библиотеки torchvision в PyTorch. Что такое набор данных MNIST? Набор данных MNIST содержит рукописные цифры от 0 до 200 с соответствующими метками, как показано ниже: Итак, мы просто передаем нейронной сети изображения цифр и соответствующие им метки, которые говорят нейронной сети, что это тройка или семерка. Как подготовить наш набор данных В загруженном наборе данных MNIST есть изображения и соответствующие им метки. Мы просто напишем код, который будет индексировать только изображения с меткой три или семь. Таким образом, мы получим набор данных из троек и семерок. Сначала импортируем все необходимые библиотеки. import torch from torchvision import datasets import matplotlib.pyplot as plt Мы импортируем библиотеку PyTorch для построения нашей нейронной сети и библиотеку torchvision для загрузки набора данных MNIST, как обсуждалось ранее. Библиотека Matplotlib используется для отображения изображений из нашего набора данных. Теперь давайте подготовим наш набор данных. mnist = datasets.MNIST('./data', download=True)   threes = mnist.data[(mnist.targets == 3)]/255.0 sevens = mnist.data[(mnist.targets == 7)]/255.0   len(threes), len(sevens) Как мы узнали выше, в PyTorch все представлено в виде тензоров. Поэтому наш набор данных также представлен в виде тензоров. Мы загружаем набор данных в первой строке. Мы индексируем только те изображения, целевое значение которых равно 3 или 7, нормализуем их путем деления на 255 и сохраняем отдельно. Мы можем проверить, правильно ли мы проиндексировали, выполнив код в последней строке, который выдает количество изображений в тензоре троек и семерок. Теперь давайте проверим, правильно ли мы подготовили наш набор данных. def show_image(img):   plt.imshow(img)   plt.xticks([])   plt.yticks([])   plt.show()   show_image(threes[3]) show_image(sevens[8]) Используя библиотеку Matplotlib, мы создадим функцию для вывода изображений. Давайте проведем быструю проверку на вменяемость, распечатав форму наших тензоров. print(threes.shape, sevens.shape) Если все прошло правильно, вы получите размеры троек и семерок как ([6131, 28, 28]) и ([6265, 28, 28]) соответственно. Это означает, что у нас есть 6131 изображение размером 28?28 для троек и 6265 изображений размером 28?28 для семерок. Мы создали два тензора с изображениями троек и семерок. Теперь нам нужно объединить их в один набор данных, который будет использоваться в нашей нейронной сети. combined_data = torch.cat([threes, sevens]) combined_data.shape   Мы объединим два тензора с помощью PyTorch и проверим форму объединенного набора данных. Теперь мы сплющим изображения в наборе данных. flat_imgs = combined_data.view((-1, 28*28)) flat_imgs.shape   Мы сплющим изображения таким образом, чтобы каждое из изображений размером 28?28 стало одной строкой с 784 столбцами (28?28=784). Таким образом, форма преобразуется в ([12396, 784]). Нам нужно создать метки, соответствующие изображениям в объединенном наборе данных. target = torch.tensor([1]*len(threes)+[2]*len(sevens)) target.shape   Изображениям, содержащим тройку, мы присваиваем метку 1, а изображениям, содержащим семерку, — метку 0. Как обучить нейронную сеть Чтобы обучить нейронную сеть, выполните следующие шаги. Шаг 1: Построение модели Ниже приведено простейшее уравнение, которое показывает, как работают нейронные сети: y = Wx + b Здесь термин «y» означает наше предсказание, то есть три или семь. 'W' - это значения весов, 'x' - входное изображение, а 'b' - смещение (которое, наряду с весами, помогает делать прогнозы). Короче говоря, мы умножаем значение каждого пикселя на значения весов и прибавляем их к значению смещения. Веса и величина смещения определяют важность каждого значения пикселя при составлении прогноза. Мы классифицируем три и семь, поэтому у нас есть только два класса для предсказания. Поэтому мы можем предсказать 1, если изображение равно трем, и 0, если изображение равно семи. Предсказание, которое мы получим в результате этого шага, может быть любым реальным числом, но нам нужно, чтобы наша модель (нейронная сеть) предсказывала значение между 0 и 1. Это позволяет нам создать порог в 0,5. То есть если предсказанное значение меньше 0,5, то это семерка. В противном случае это тройка. Для получения значения между 0 и 1 мы используем сигмоидальную функцию. Мы создадим функцию сигмоида, используя то же уравнение, которое было показано ранее. Затем мы передадим в сигмоид значения из нейронной сети. Мы создадим однослойную нейронную сеть. Мы не можем создавать много циклов для умножения каждого значения веса на каждый пиксель изображения, так как это очень дорого. Поэтому мы можем использовать магический трюк, чтобы выполнить все перемножение за один раз, используя матричное умножение. def sigmoid(x): return 1/(1+torch.exp(-x))   def simple_nn(data, weights, bias): return sigmoid((data@weights) + bias)   Шаг 2: Определение потерь Теперь нам нужна функция потерь, чтобы вычислить, на сколько наше предсказанное значение отличается от истинного. Например, если предсказанное значение равно 0,3, а истинное - 1, то наши потери очень велики. Поэтому наша модель будет пытаться уменьшить этот убыток, обновляя веса и смещение таким образом, чтобы наши предсказания стали близки к истине. Для проверки величины потерь мы будем использовать среднюю квадратичную ошибку. Среднеквадратичная ошибка - это среднее квадратическое значение разницы между предсказанным значением и истинным значением. def error(pred, target): return ((pred-target)**2).mean()   Шаг 3: Инициализация значений весов Мы просто произвольно инициализируем веса и смещение. Позже мы увидим, как эти значения обновляются для получения наилучших предсказаний. w = torch.randn((flat_imgs.shape[1], 1), requires_grad=True) b = torch.randn((1, 1), requires_grad=True) Форма значений весов должна иметь следующий вид: (количество нейронов в предыдущем слое, количество нейронов в следующем слое). Мы используем метод градиентного спуска для обновления весов и смещения, чтобы сделать максимальное количество правильных предсказаний. Наша цель — оптимизировать или уменьшить потери, поэтому лучший метод - вычисление градиентов. Нам нужно взять производную каждого веса и смещения по отношению к функции потерь. Затем мы должны вычесть это значение из наших весов и смещений. Таким образом, значения весов и смещения обновляются так, чтобы наша модель делала хорошие предсказания. Обновление параметра для оптимизации функции не является чем-то новым - вы можете оптимизировать любую произвольную функцию с помощью градиентов. Мы установили специальный параметр (называется requires_grad) в true, чтобы вычислить градиент весов и смещения. Шаг 4: Обновление весов Если наше предсказание не совпадает с истинным, это означает, что мы сделали неправильное предсказание. Это означает, что наши веса не верны. Поэтому нам нужно обновлять веса до тех пор, пока мы не получим хорошие предсказания. Для этого мы помещаем все описанные выше шаги в цикл for и позволяем ему повторяться любое количество раз. На каждой итерации вычисляется потеря и обновляются веса и смещения, чтобы получить лучший прогноз на следующей итерации. Таким образом, наша модель становится лучше после каждой итерации, находя оптимальное значение веса, подходящее для конкретной задачи. Для каждой задачи требуется свой набор значений весов, поэтому мы не можем ожидать, что нейронная сеть, обученная классифицировать животных, будет хорошо справляться с классификацией музыкальных инструментов. Вот как выглядит обучение нашей модели: for i in range(2000):   pred = simple_nn(flat_imgs, w, b)   loss = error(pred, target.unsqueeze(1))   loss.backward()     w.data -= 0.001*w.grad.data   b.data -= 0.001*b.grad.data     w.grad.zero_()   b.grad.zero_()   print("Loss: ", loss.item())   Мы вычислим предсказания и сохраним их в переменной 'pred', вызвав функцию, которую мы создали ранее. Затем мы рассчитаем среднюю квадратичную ошибку. Затем мы рассчитаем все градиенты для наших весов и смещения и обновим значение, используя эти градиенты. Мы умножили градиенты на 0,001, и это называется скоростью обучения. Это значение определяет скорость, с которой будет обучаться наша модель. Если оно слишком мало, то модель будет обучаться медленно, или, другими словами, потери будут уменьшаться медленно. Если скорость обучения слишком высока, наша модель не будет стабильной, прыгая между широким диапазоном значений потерь. Это означает, что она не сможет сходиться. Мы проделываем описанные выше шаги 2000 раз, и каждый раз наша модель пытается уменьшить потери, обновляя значения весов и смещения. Мы должны обнулять градиенты в конце каждого цикла или эпохи, чтобы в памяти не накапливались нежелательные градиенты, которые повлияют на обучение модели. Поскольку наша модель очень мала, обучение в течение 2000 эпох или итераций не займет много времени. После 2000 эпох наша нейронная сеть дала значение потерь 0,6805, что неплохо для такой маленькой модели. Подведем итоги В модели, которую мы только что создали, есть огромное пространство для совершенствования. Это всего лишь простая модель, и вы можете экспериментировать с ней, увеличивая количество слоев, число нейронов в каждом слое или количество эпох.  Одним словом, машинное обучение - это сплошная магия с использованием математики. Всегда изучайте фундаментальные концепции - они могут быть скучными, но со временем вы поймете, что эти скучные математические концепции создали эти передовые технологии, такие как deepfakes.  
ЗИМНИЕ СКИДКИ
40%
50%
60%
До конца акции: 30 дней 24 : 59 : 59