Программная маршрутизация с vyos

Таблица маршрутизации

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

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

Таблица маршрутизации Windows

Продолжим рассматривать маршрутизатор D, у него есть три интерфейса. Ниже на картинке представлен вид таблицы маршрутизации для windows, которые в качестве идентификатора интерфейса используют ip-адрес, который назначен этому интерфейсу. Таким образом в столбце интерфейс есть 3 ip-адреса, которые соответствуют трем интерфейсам маршрутизатора.

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

Если же нам нужно передать пакет на следующий маршрутизатор то в поле шлюз указывается ip-адрес этого маршрутизатора.

Таблица маршрутизации Linux

В операционной системе linux таблица маршрутизации выглядит немного по-другому, основное отличие это идентификатор интерфейсов. В linux вместо ip-адресов используется название интерфейсов. Например, wlan название для беспроводного сетевого интерфейса, а eth0 название для проводного интерфейса по сети ethernet.

Также здесь некоторые столбцы удалены для сокращения (Flags, Ref и Use). В других операционных системах и в сетевом оборудовании вид таблицы маршрутизации может быть несколько другой, но всегда будут обязательны столбцы ip-адрес, маска подсети, шлюз, интерфейс и метрика.

Как выбрать решение для сетевой защиты

Сегодня крайне сложно вступать в споры о том, к какому типу относится тот или иной межсетевой экран. Мы в Cloud Networks считаем, что прежде всего нужно отталкиваться от тех требований, которые необходимы каждому отдельному заказчику.

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

Если же говорить о замене зарубежного NGFW на отечественное решение, то наш ответ – да, это реально, мы это делаем и это работает.

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

Cloud Networks советует рассмотреть следующие критерии:

  1. Тип платформы (аппаратное устройство, программное решение или облачное).
  2. Набор функций (глубокая проверка пакетов, контроль приложений, проверка SSL/SSH, DLP и прочее).
  3. Производительность (у продукта должна быть высокая пропускная способность, соответствующая заявленной поставщиком).
  4. Управляемость (у решения должна быть современная удобная и гибкая консоль управления).
  5. Техническая поддержка.

А также наличие следующих характеристик:

  • Интеллектуальная фильтрация URL-адресов.
  • Встроенные правила передовой практики.
  • Возможности мониторинга туннелей.
  • Функционал создания VPN туннелей.
  • Проверка почтового трафика.
  • Поддержка кластеризации и отказоустойчивости.
  • Управление пропускной способностью.
  • Проксирование приложений.
  • Поддержка политики BYOD.
  • Инспектирование SSL-трафика.
  • DNS-фильтрация.
  • Функция балансировщика нагрузки.
  • Управление мобильными устройствами.
  • Защита от отказа в обслуживании (DoS).
  • Защита от уязвимостей.
  • Антишпионское ПО, вредоносное ПО, сканирование программ-вымогателей.
  • Предотвращение потери данных (DLP) и многое другое.

Показатели алгоритмов (метрики)

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

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

  • Длина маршрута.
  • Надежность.
  • Задержка.
  • Ширина полосы пропускания.

Длина маршрута

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

Надежность

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

Задержка

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

Полоса пропускания

Полоса пропускания относится к имеющейся мощности трафика какого-либо канала. При прочих равных показателях, канал Ethernet 10 Mbps предпочтителен любой арендованной линии с полосой пропускания 64 Кбайт/с. Хотя полоса пропускания является оценкой максимально достижимой пропускной способности канала, маршруты, проходящие через каналы с большей полосой пропускания, не обязательно будут лучше маршрутов, проходящих через менее быстродействующие каналы.

Шаг 1. Создаем и настраиваем два сервера

Один сер­вер будет внут­ри стра­ны — через него тра­фик пой­дет на локаль­ные ресур­сы, а вто­рой — за гра­ницей. Даль­ше я их буду называть local и external.

Иде­аль­но, если local будет в тво­ей домаш­ней сети, потому что при этом тра­фик на внеш­ние ресур­сы не отли­чает­ся от тво­его домаш­него тра­фика. Но для это­го нужен какой‑то хост дома, белый IP и воз­можность проб­росить порт. У меня это вир­туал­ка на домаш­нем сер­вере, но, навер­ное, подой­дет и Raspberry Pi или ана­логич­ный одноплат­ник.

info

Ва­риант с одноплат­ником я не тес­тировал и не уве­рен, что он сра­бота­ет. Raspberry Pi при­дет­ся мар­шру­тизи­ровать весь тра­фик с устрой­ств и дер­жать в памяти око­ло 11 тысяч мар­шру­тов; ресур­сов на это может не хва­тить.

Ес­ли дома хос­та нет, мож­но взять любой сер­вер у хос­тера VDS. Увы, некото­рые сай­ты бло­киру­ют под­сети хос­теров, опа­саясь ботов, так что это менее пред­почти­тель­ный вари­ант.

А вот внеш­нюю машину мож­но арен­довать и у хос­тера. К при­меру, у RU VDS и VDSina есть зарубеж­ные пло­щад­ки. А мож­но выб­рать инос­тран­ного хос­тера, если най­дешь спо­соб опла­чивать его услу­ги. Нап­ример, я исполь­зую исланд­ский 1984.hosting, соз­данный спе­циаль­но для парано­иков.

Счи­таем, что на обо­их сер­верах у нас Debian 11.

Ста­вим нуж­ные нам пакеты:

Вклю­чаем перенап­равле­ние тра­фика: в этом слу­чае сер­вер, получив пакет, который не пред­назна­чает­ся ни одно­му из его IP-адре­сов, не отбро­сит его, а попыта­ется перенап­равить в соот­ветс­твии со сво­ими мар­шру­тами.

Оп­циональ­но (но очень удоб­но) сра­зу поменять hostname обо­их сер­веров, что­бы не запутать­ся, где какая кон­соль:

Метрика

Можно заметить, что в нашей схеме в одну и ту же сеть, например вот в эту (10.2.0.0/16) можно попасть двумя путями, первый путь проходят через один маршрутизатор F, а второй путь через два маршрутизатора B и E.

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

Какой путь выбрать? Для этого используются поле метрика таблицы маршрутизации.

Метрика это некоторое число, которые характеризует расстояние от одной сети до другой. Если есть несколько маршрутов до одной и той же сети, то выбирается маршрут с меньшей метрикой.

Раньше, метрика измерялось в количестве маршрутизаторов, таким образом расстояние через маршрутизатор F было бы один, а через маршрутизаторы B и E два.

Однако сейчас метрика учитывает не только количество промежуточных маршрутизаторов, но и скорость каналов между сетями, потому что иногда бывает выгоднее пройти через два маршрутизатора, но по более скоростным каналам. Также может учитываться загрузка каналов, поэтому сейчас метрика — это число, которое учитывает все эти характеристики. Мы выбираем маршрут с минимальной метрикой в данном примере выше, будет выбран первый маршрут через маршрутизатор F.

DPI

К сожалению, все эти средства могут оказаться бесполезными, если твой провайдер начал блокировки с применением DPI (Deep Packet Inspection) — системы глубокого анализа сетевого трафика. Цель DPI — отбрасывать все, что не похоже на работу обычного человека за обычным компьютером, то есть блокировать любую подозрительную активность. А все способы анонимизации трафика априори подозрительны, поэтому программы зачастую дают сбои или в принципе отказываются работать.

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

OpenVPN сам по себе легко различим, но stunnel позволяет также обойти анализ пакетов. Stunnel маскирует канал VPN под соединение SSL, которое с виду безобидно: это может быть и простой браузер, который обращается к сайту по HTTPS. Благодаря этому заблокировать такой туннель непросто. Если перестараться, можно заблокировать вообще все.

INFO

Подробнее о настройке OpenVPN и stunnel читай в статье «Твой тайный туннель. Детальный гайд по настройке OpenVPN и stunnel для создания защищенного канала».

Обходить DPI также помогает tls-crypt, режим, введенный в версии OpenVPN 2.4, который шифрует трафик VPN.

Создатели Tor Browser специально работают над обходом средств анализа DPI. При подключении к сети Tor можно воспользоваться транспортом-прослойкой, которая обеспечивает беспрепятственное подключение к первому серверу защищенной сети. Этот транспорт можно либо выбрать из списка (это общедоступные серверы), либо получить персональный на официальном сайте Tor Bridges.

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

Еще есть несколько программ, которые пытаются тем или иным способом обмануть анализ пакетов, например разбивая их на мелкие части или меняя заголовки. В их числе GoodbyeDPI или Green Tunnel с простым графическим интерфейсом — они не скрывают ни IP, ни данные, но обходят блокировку.

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

Какую защиту ставить на Wi-Fi роутере?

Используйте WPA2/WPA3 — Personal, или WPA2 — Personal с шифрованием AES. На сегодняшний день, это лучший и самый безопасный способ. Вот так настройки защиты беспроводной сети выглядит на маршрутизаторах ASUS:

Подробнее в статье: как установить пароль на Wi-Fi роутере Asus.

А вот так эти настройки безопасности выглядят на роутерах от TP-Link (со старой прошивкой).

Более подробную инструкцию для TP-Link можете посмотреть здесь.

Инструкции для других маршрутизаторов:

  • Настройка защиты Wi-Fi сети и пароля на D-Link
  • Защита беспроводной сети на роутерах Tenda
  • Инструкция для Totolink: установка метода аутентификации и пароля

Так как WPA2 — Personal (AES) старые устройства (Wi-Fi адаптеры, телефоны, планшеты и т. д.) могут не поддерживать, то в случае проблем с подключением устанавливайте смешанный режим (Авто). Это же касается и WPA3. Если у вас есть устройства без поддержи этой версии, то нужно устанавливать смешанный режим WPA2/WPA3.

Не редко замечаю, что после смены пароля, или других параметров защиты, устройства не хотят подключаться к сети. На компьютерах может быть ошибка «Параметры сети, сохраненные на этом компьютере, не соответствуют требованиям этой сети». Попробуйте удалить (забыть) сеть на устройстве и подключится заново. Как это сделать на Windows 7, я писал здесь. А в Windows 10 нужно забыть сеть.

Межсетевой экран

Обычный набор встроенных функций МСЭ (межсетевой экран): антивирус, IDP, патруль приложений — позволяет проверять трафик вплоть до 7 уровня OSI. Помимо этого, есть и другие возможности контроля, отсутствующие в обычных маршрутизаторах.

Разумеется, многие межсетевые экраны обладают стандартным «джентльменским набором» типичного маршрутизатора. Но «сила» МСЭ определяется наличием функций по фильтрации и управлению трафиком, а также усиленном аппаратным обеспечением для реализации этих задач.

Стоит отметить, что набор возможностей фильтрации того или иного устройства МСЭ вовсе не означает: «Чем больше функций смогли «накрутить», тем «лучше» межсетевой экран». Основной ошибкой было бы при покупке делать акцент на длине перечня всевозможных «фишек», без учета конкретного предназначения, конструктивных особенностей, параметров быстродействия и других факторов. Все должно быть строго дозировано и сбалансировано без перекосов в сторону «сверхбезопасности» или «суперэкономии».

И тут администратор сети сталкивается с первой проблемой. Если для SOHO сегмента не так уж сложно сформулировать типичный набор требований, то для корпоративного сегмента это требует дополнительной подготовки. Для лучшего удовлетворения нужд бизнеса существуют различные устройства — каждое под свою нишу. Например, для VPN Gateway набор функций по обеспечению безопасности, разумеется, играет большую роль, но основной задачей является все же создание и поддержание работоспособности VPN каналов. В качестве примера такого устройства можно привести ZyWALL VPN1000

Рисунок 2. Межсетевой экран VPN — ZyWALL VPN1000

А вот для Secure Gateway всевозможные фильтры, «Песочница» и другие виды проверок стоят на первом месте. В качестве примера такого специализированного устройства для повышения уровня защиты можно привести ZyWALL ATP800.

Рисунок 3. Межсетевой экран для обеспечения безопасности — ZyWALL ATP800.

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

Маршрутизатор

В самом названии маршрутизатор заключена расшифровка его предназначения.

В классическом (академическом) представлении маршрутизатор нужен для трансляции пакетов между раздельными IP сетями. Это решает вопрос объединения разрозненных LAN и предотвращения роста широковещательного трафика в одной большой локальной сети разделением её на сегменты. Разумеется, для правильного перенаправления трафика необходимо знать, куда его отправлять, то есть выстраивать маршрут (автор благодарит «Капитана Очевидность» за точную формулировку).

Современные модели маршрутизаторов работают выше 3-го уровня модели OSI. Помимо трансляции IP пакетов из одной сети в другую, эти устройства часто имеют функции управления трафиком, например, возможность закрывать/открывать TCP или UPD порты, выполнять функции Port Address Translation, PAT (иногда называется Destination NAT, DNAT) и так далее. Также для работы некоторых протоколов необходимо, чтобы маршрутизатор умел работать как Application-level gateway, ALG, для обеспечения работы таких протоколов как: PPTP, IPsec, RTSP, SIP, H.323, SMTP, DNS, TFTP.

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

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

В современных локальных сетях вместо маршрутизаторов в виде отдельных устройств часто используются коммутаторы L3, позволяющие управлять VLAN, и соответственно, отдельными подсетями.

Пример из практики. Сеть небольшого предприятия, где в качестве ядра сети использовался Cisco Catalyst 3750. Согласно требованиям безопасности, коммутаторы уровня доступа были настроены по принципу: один коммутатор — одна подсеть — один VLAN. Для удешевления проекта выбрали свичи от 3Com. Проще говоря, каждый 3Com был подключен строго в одном VLAN и в одной подсети, а пакеты между подсетями ходили через Catalyst.

С задачей маршрутизацией между VLAN вполне справится L3 коммутатор Zyxel XGS4600-32. Помимо перенаправления пакетов он обладает ещё множеством полезных функций.

Рисунок 1. Коммутатор Zyxel XGS4600-32 L3 с функциями маршрутизатора.

Tor

Tor (The Onion Router) — одно из лучших средств для обеспечения анонимности в Сети. Схема работы подразумевает трехкратную защиту данных и анонимизацию трафика.

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

Схема работы компьютера в сети Tor

Работу всей системы обеспечивают тысячи энтузиастов по всему миру, борющиеся за права человека и приватность. Благодаря этому для каждого отдельного сайта строится собственная цепочка промежуточных серверов Tor, что дает полную защиту: каждый сайт — новая личность.

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

Для упрощения жизни пользователям разработчики создали Tor Browser, основанный на Firefox, и улучшили его дополнениями, запрещающими сайтам следить за тобой. Например, HTTPS Everywhere заставляет веб-сайты использовать шифрование, а NoScript отключает выполнение скриптов на странице, фактически запрещая собирать любые данные пользователя.

Скачать Tor, как и прилагающийся к нему браузер, можно на официальном сайте проекта Tor Project.

Дистанционно-векторный алгоритм

В дистанционно-векторном алгоритме (DVA) основная идея заключается в рассылке маршрутизаторов друг другу так называемого вектора расстояний. В векторе расстояний содержится информация (расстояние) от передающего маршрутизатора до всех соседних (известных) ему сетей.

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

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

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

Самым распространенным представителем дистанционно-векторного алгоритма является протокол RIP (Routing Information Protocol) – протокол маршрутной информации.

Интерфейсный модуль или линейная карта

PIC — Physical Interface Card

  1. Восстанавливает битовый поток из электрических импульсов
  2. Восстанавливает пакет из набора битов.
  3. Удаляет служебную информацию (как то: преамбула, ).
  4. Вычисляет контрольную сумму и
    • а) если она бьётся со значением в пакете, пропускает его, удалив лишние заголовки, например .
    • б) если не бьётся — отбрасывает пакет и увеличивает счётчик отброшенных пакетов с ошибкой.
  5. Подсчитывает статистику:
    • количество пакетов
    • общий объём трафика
    • пиковые значения
    • утилизация порта
    • количество Unicast/Broadcast/Multicast
  6. PIC также может восстановить сигнал SynchroEthernet, если необходимо.

FE — Forwarding Engine

  • Запросы к CAM/TCAM
  • Трансформация Soft Table в Hard Table
  • Принятие решения о передаче пакета (ACL, полисинг)
  • Коммутация/Маршрутизация
  • Маркировка приоритетов
  • Зеркалирование
  • Обнаружение протокольных пакетов
  • Обработка сигналов/пакетов от CPU.

ВНИМАНИЕIngress FEEgress FE

  • Вид будущих заголовков
  • Приоритет внутри узла и при передаче вовне
  • Выходной FE и интерфейс
  • Какой именно из физических членов или

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

Выводы

Па­ры клю­чей в статье — дей­ству­ющие, так что можешь, ничего не исправ­ляя в кон­фигах (толь­ко IP internal-сер­вера), залить их на свои сер­веры и кли­ент и пораз­вле­кать­ся. Но для боево­го при­мене­ния клю­чи надо обя­затель­но переге­нерить.

Бла­го это прос­то, даже если тебе лень раз­бирать­ся с руч­ной генера­цией клю­чей, — я соз­дал неболь­шой bash-скрипт для это­го. Дос­таточ­но сде­лать так на internal-сер­вере:

Пос­ле чего в пап­ке появят­ся кон­фиги с толь­ко что сге­нери­рован­ными клю­чами, и оста­нет­ся толь­ко ско­пиро­вать в , унес­ти на дру­гой сер­вер, а  исполь­зовать для ноут­бука или телефо­на. Ну и не забыть о проб­росе пор­та, если internal у тебя за NAT.

Ес­ли кто‑то захочет это все кра­сиво обер­нуть в два докера и прик­рутить один из веб‑интерфей­сов для WireGuard (потому что кон­фиги кли­ентов все же удоб­нее соз­давать в нем) — доб­ро пожало­вать на гит­хаб: Trickster VPN.

Рейтинг
( Пока оценок нет )
Editor
Editor/ автор статьи

Давно интересуюсь темой. Мне нравится писать о том, в чём разбираюсь.

Понравилась статья? Поделиться с друзьями:
Работатека
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: