Июль 2014 —

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

Для простоты, в примерах директива map будет соседствовать с директивами из location.
В реальном конфиге место map — в блоке http.
Краткое описание map
Это директива, которая устанавливает значение одной переменной (правой), в зависимости от другой (левой).
Выглядит вот так:
map $arg_one $var_two {     "one"      "two"; } 

В левой части можно использовать регулярные выражения, включая именованные выделения.
В правой части могут быть строки, переменные и regexp выделения из левой части.
Директива map описывается в блоке http.
Полное описание можно найти в документации.

Замена if на map


Особенности if в nginx

Рассмотрим примеры замен, от простого к сложному.

Установить переменной одно значение

Для этого у вас, скорее всего, уже написана такая конструкция:
if ($arg_one = "one") {     set $var_two "two"; } 

Вы можете это сделать с помощью map:
map $arg_one $var_two {     "one"    "two"; } 

И в нужном месте просто использовать $var_two.
Даже в таком простом случе у map есть плюсы:
  • не важно, сколько ещё if, или других директив окажется в location, эта переменная получит свое значение;
  • для nginx это менее затратно, так как значение переменной будет вычислено только в момент использования;
Установить переменной одно из нескольких значений

Предположу, что для этого уже прибегают к map, но иногда можно встретить вариант с несколькими if:
if ($arg_one = "one") {     set $var_two "two"; }  if ($arg_one = "three") {     set $var_two "four"; } 

Вы можете это сделать с помощью map:
map $arg_one $var_two {     "one"    "two";     "three"  "four"; } 

Уже виден выигрыш по компактности и читаемости.
Если нужно будет ещё редактировать условия, вам нужно поправить строчку в map.

Вложенные if (зависимость от нескольких условий)

Я находил в списках рассылки nginx вопросы насчет вложенных if, когда нужно учитывать несколько условий.
Вложенные if делать нельзя, можно сделать костыль из нескольких if.
А можно написать один map.
Возможно, вы не знаете, но в исходной части (где первая переменная) можно указывать не одну переменную, а целый текст, содержащий несколько переменных, в кавычках.
Например, вам нужно блокировать пользователей с user-agent «HackYou», долбящихся «POST» запросом по адресу "/admin/some/url".

Это, в принцципе, можно сделать с помощью if:
if ($http_user_agent ~ "HackYou") {     set $block "A"; }  if ($method = "POST") {     set $block "${block}B"; }  if ($uri = "/admin/some/url") {     set $block "${block}C"; }  if ($block = "ABC") {     return 403; } 

Вы можете это сделать с помощью map:
map "$http_user_agent:$method:$uri" $block {     "HackYou:POST:/admin/some/url"  "1"; }  if ($block) {     return 403; } 

Двоеточие — просто для удобства восприятия.
В этом примере возникает «точка невозврата» в сторону map.
Если количество условий растет (например, несколько user-agent), реализовать их набором if уже не получится, или это будет слишком громоздкая конструкция.

http заголовки


Если вам нужно добавлять заголовки в зависимости от каких-то условий, с if это может стать проблемой.

Например, такая конструкция:
if ($arg_a = "1") {     add_header X-one "one"; } add_header X-two "two"; 

Будет отдавать только один заголовок (X-one, если arg_a = true, и X-two, если false).
Это недостаток add_header и разработчики не будут это исправлять.
А если у вас несколько if с заголовками, может и не получиться добавить несколько разных заголовков одновременно.

Но тут на помощь приходит map:
map $arg_a $header_one {     "1"    "one"; }  add_header X-one $header_one; add_header X-two "two"; 

Несколько заголовков — несколько map.
Если переменная будет пустой, nginx просто не создаст заголовок.
Вообще, в случае с if может помочь модуль headers_more, он лишен недостатка add_header насчет if.
Модуль headers_more интересен сам по себе, с его помощью можно гибко управлять любыми заголовками, как ответа, так и запроса (на бекенд).
В паре с директивой map этот модуль может реализовывать многие хотелки, включая генерацию нескольких кук.

Выбор upstream


В директивах типа proxy_pass (fastcgi_pass и прочие *_pass), где можно указывать upstream в качестве бекенда, можно использовать переменные.
Т.е. работает такое определение:
proxy_pass http://$php_backend; 

Об этом сказано в документации:
В этом случае имя сервера ищется среди описанных групп серверов и если не найдено, то определяется с помощью resolver’а.

В паре с map, это дает нам поле для фантазии.
Вот грубый пример — допустим, нам нужно такое:
Есть кука userid.
Если в её значении первое число от 0 до 4, то посылать запросы на upstream old_php_backend.
Если с 5 до 9 — на new_php_backend.
Если куки нет, или она пустая, или первый символ — не число, то на default_php_backend.

Обычно делается с помощью if, rewrite и нескольких location:
location /some/url/ {     if ($cookie_userid ~ "~^[0-4]") { rewrite ^(.+)$ /old/$1 last; }     if ($cookie_userid ~ "~^[5-9]") { rewrite ^(.+)$ /new/$1 last; }      proxy_pass http://default_php_backend; }  location /old/some/url/ {     internal;     rewrite    ^/old/(.+)$ $1 break;     proxy_pass http://old_php_backend; }  location /new/some/url/ {     internal;     rewrite    ^/new/(.+)$ $1 break;     proxy_pass http://new_php_backend; } 

Использование map все упрощает:
map $cookie_userid     $php_backend {     "~^[0-4]"          "old_php_backend";     "~^[5-9]"          "new_php_backend";     default        "default_php_backend"; }  location /some/url/ {     proxy_pass http://$php_backend; } 

Это действительно работает, применяется на нагруженном сервисе, и с этим не наблюдается проблем.
Главное — не забывать про default, чтобы всегда было, куда направить запрос.
Этот прием можно применять и с geo/split_clients.
Например, в split_clients выделить 1% запросов и направить их на отдельный бекенд для тестов.

Переменную из map можно использовать в другой map


Такой код работает:
map $arg_a $var_a {     "0"    "1"; }  map $var_a $var_b {     "1"    "2"; }  map $var_b $var_c {     "2"    "3"; } 

Когда вы обратитесь к $var_c, последовательно сработает три директивы map.
При GET параметре a=0, $var_c будет содержать «3».
nginx прожевывает цепочку из 12 map'ов, дальше я не пробовал.
Можете попробовать, ради интереса, узнать максимальную длинну цепочки.
Обычно мне хватает пары map'ов, которые зависят друг от друга.
Мне это бывает полезно для формирования сложных заголовков и кук средствами nginx (когда надо добавить текст в заголовок, на бекенд отправить один заголовок, а клиенту — другой).
Это может пригодиться, как развитие примера с вложенными if.
В одном map вычисляем $var_a, в другом map вычисляем $var_b, а третий map зависит от "$var_a:var_b".

Так же map работает с перменными из geo и split_clients.
В geo и split_clients результирующей переменной можно присвоить только простую строку, нельзя использовать переменные или регулярные выражения.
Если вам, в зависимости от ip, нужно что-то посложнее простой строки, geo+map помогут вам.
А связка split_clients+map поможет вам, например, гибко изменить заголовки для 1% пользователей.

Например, так:
split_clients "${remote_addr}XXX" $test_percent {     1%                            "1";     *                             "0"; }  map "$test_percent:$http_user_agent" $test_mobile_users {     "~*^1:.*iphone.*"                  "X-tester: iphone"; }  more_set_input_headers $test_mobile_users; 

Если ip пользователя попал в тестовый 1% пользователей, и в его user-agent есть слово iphone, то вместе с запросом на бекенд отправляется заголовок «X-tester: iphone».
Разработчикам остается отреагировать на этот заголовок и отдавать тестовую версию сайта для айфонов.

Заключение


Как видите, map помогает делать сложную логику малым количеством команд.
Она позволяет избавиться от if в большинстве случаев.
А совместно с другими директивами, творит хитрые преобразования в несколько строк.
Я надеюсь, эти возможности помогут вам, с одной стороны, сократить конфиги, а с другой — реализовать хитрые хотелки.

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

Вы такие страницы часто встречаете. Обычная структура таких документов содержит в начале содержание страницы. а в теле страницы – описание элементов содержания.

Содержание
Раздел1
Раздел2
Раздел3

А в теле страницы – описание элементов содержания.

Раздел1
текст
…………
Раздел2
текст
…………

Будет логично для создания меток использовать заголовки и подзаголовки на странице, хотя это и не обязательно.

Как поставить HTML якоря?

Создать метку можно двумя способами. В первом случай для создания метки используют тег <a> с атрибутом name. Запись в HTML-коде будет выглядеть следующим образом

<a name=”Razdel1”> Раздел1</a>

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

Во втором случае поступают еще проще. Любому html-тегу добавляют атрибут ID, например:

<h3 id=”Razdel2”> Раздел2 </h3>

Можно использовать любой из описанных выше способов.

Как сослаться на HTML якоря?

Для того, чтобы перейти в нужное место, помеченное якорем, организовывается ссылка. Она является частным случаем обычной гиперссылки, но имеет некоторые нюансы. Например:

<a href=”#Razdel4”> Раздел4 </a>

Как Вы уже поняли к имени метки, заданной в атрибутах name или ID, добавляется знак решетки – #.

Переход на метку якоря HTML на другой странице

<a href=”page1#Razdel4> Якоря. Раздел4 </a>

Если Вы задаете ссылку в таком виде

<a href=”#”> В начало </a>

то переход произойдет к началу вебстраницы.

В ближайшее время на POP3 и SMTP-серверах останется только безопасная авторизация через протокол SSL.
В связи с этим необходимо внести изменения в настройки вашего почтового клиента. Мы уже подготовили для вас подробную инструкцию. Пожалуйста, перейдите по ссылке

Руткит (rootkit) представляет собой скрытый тип программного обеспечения, как правило вредоносного и который разработан, чтобы скрыть существование определенных процессов или программ от нормальных методов обнаружения и включить постоянный привилегированный доступ к компьютеру. Термин руткит представляет собой объединение «root» ( традиционное название из привилегированной учетной записи на операционных системах Unix) и слово «kit» (которая относится к программным компонентам, которые реализуют функции). Термин «руткит» имеет негативные коннотации через свою ассоциацию с вредоносными программами.

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

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

Классификация руткитов.

Приведу наглядный рисунок на котором все классифицируется и все становится понятным.

klassifikatsiya rutkitov  Поиск руткитов в Debian/Ubuntu/ Linux Mint и Red Hat/CentOS/Fedora

классификация руткитов

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

Инструмент chkrootkit (Check Rootkit).

chkrootkit (Check Rootkit) — является Unix-программой которая призвана помочь системным администраторам проверить свою систему на наличие известных руткитов. Это скрипт с помощью обычных инструментов UNIX / Linux (таких как strings и grep команд) дают возможность искать основные системные программы для сетей/ подписей сравнивая в файловой системе /proc файлов с выводом команды ps (состояние процесса), чтобы искать разные расхождения. Утилита может быть использована с запуском «спасательного диска» (как правило, Live CD) или утилиту можно установить в систему.

Утилита имеет в себе модули для различного сканирования:

* chkrootkit — Модуль который проверяет вашу ОС.

* ifpromisc — Служит для поиска интерфейса (ов), которые работают в режимах захвата пакетов.

* chklastlog — Служит для обнаружения различных фактов удаления записей из журнального файла lastlog.

* chkwtmp — Служит для обнаружения фактов удаления записей из журнального файла wtmp.

* check_wtmpx — Служит для обнаружения фактов удаления записей из журнального файла (только в Solaris).

* chkproc — Ищет следы от троянов LKM (Linux Kernel Module — модуль ядра Linux.)

* chkdirs - Ищет следы от троянов LKM.

* strings — Утилита для быстроты поиска и замены текстовых строк.

В сhkrootkit имеется очень хорошая база для обнаружения различного нежелательного ПО и руткитов, я приведу список и покажу на рисунке внизу.

Spisok chto mozhet najti chkrootkit  Поиск руткитов в Debian/Ubuntu/ Linux Mint и Red Hat/CentOS/Fedora

Список что может найти chkrootkit

Установка chkrootkit для Debian/Ubuntu/Linux Mint.

Чтобы запустить установку достаточно выполнить команду:
# sudo apt-get install chkrootkit

Установка chkrootkit на RedHat/CentOS/Fedora

Для начала нужно подключить и установить репозиторий EPEL, затем выполнить команду:
# yum install chkrootkit

Установка для других операционных системах.

Идем на официальный сайт и качаем последнюю версию исходников программы chkrootkit, это можно сделать следующим образом:
# cd /usr/local/src
# wget ftp://ftp.pangeia.com.br/pub/seg/pac/chkrootkit.tar.gz

После чего нужно распаковать архив и скомпилировать утилиту:
# tar -xfvz chkrotkit.tar.gz
# cd chkrotkit
# make sense

Как только программа скомпилируется, запускаем ее и сканируем.

Использование утилиты chkrootkit.

Чтобы запустить утилиту, достаточно выполнить команду ( только нужно запустить ее от рута):
# sudo chkrootkit

Опции

: Показывает справку о работе с программой.
-V : Покажет версю утилиты.
-l : Выведет список проверок которые поддерживает программа.
-d : Режим отладки.
-q : Опция которая может задать минимальный вывод информации.
-x : Опция с помощью которой задается вывод дополнительной информации.
-r : <каталог>Задается имя каталогов для использования в качестве корневого (root).
-p : dir_1:dir_2:dir_N С помощью этой опции задаются пути для внешних программам, используемым chkrootkit.
-n : С помощью этой опции можно отключить просмотр всех смонтированных каталогов NFS.

Примеры использования:

1. Например, мы хотим начать поиск троянских программ в ps и ls и обнаружение интерфейсов которые работают в режиме захвата пакетов, то утилиту нужно запустить так:
# chkrootkit ps ls sniffer

2. Нужно найти все подозрительные строки в бинарных файлах, то нужно выполнить следующую команду:
# chkrootkit -x | more

Будет вывод осуществляться по страницам. Как по мне это удобно очень.

3. Нужно найти все подозрительные строки в бинарных файлах по имени «bin»:
# chkrootkit -x | egrep ‘^/bin’

Утилита chkrootkit может использовать и другие утилиты для проверки, такие как awk, cut, egrep, find, head, id, ls, netstat, ps, strings, sed, uname. Если эти утилиты недоступны в пути поиска, то нужно указать путь к ним с помощью опции -p.

4. Команда что будет приведена ниже будет выполнять тесты chkrootkit с использованием утилит которые хранятся в директории /bin на компакт-диске и смонтированы в системе как /cdrom:
# chkrootkit -p /cdrom/bin

5. Можно смонтировать раздел с помощью команды:
# chkrootkit -r /mnt1

Это нужно когда, например, вам нужно просканировать ХДД, на другом ПК на котором нет зараженных файлов ( если вы уверены на 100%).

6. Так же можно перенаправить вывод команды в файл. Например вы хотите что бы посте сканирования вашей системы вам отправился отчет на мыло:
0 3 * * * cd /usr/local/bin; ./chkrootkit 2>&1 | mail -s «chkrootkit output for HostName» captain

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

7. Тест LKM позволяет увидеть в вашей ОС все процессы которые скрыты от программы ps:
0,10,30 * * * * cd /usr/local/bin; ./chkrootkit lkm 2>&1 | mail -s «LKM search for HostName» captain@AdminHost

Отчет будет выслан на мыло.

8. С тестом sniffer можете видеть в своей сети все компьютеры и интерфейсы которые работают в режиме захвата пакетов:
1,5,11,16,21,26,31,36,41,46,51,56 * * * * cd /usr/local/bin; ./chkrootkit sniffer 2>&1 | mail -s «Packet sniffer search result for HostName» captain

Инструмент rkhunter (Rootkit Hunter).

RkHunter (Rootkit Hunter) является Unix-инструментом, который сканирует вашу систему на наличие руткитов, бэкдоров и возможных локальных эксплойтов. Она делает это путем сравнения SHA-1 хэшей важных файлов с известными хорошими базами данных в онлайновом режиме, а так же поиск каталогов по умолчанию (руткитов), неправильных разрешений, скрытых файлов, подозрительных строк в модулей ядра для Linux и FreeBSD.

Установка RkHunter для Debian/Ubuntu/Linux Mint.

Чтобы установить утилиту выполните команду что ниже, данная программа доступна в стандартном репозитории системы:
# apt-get install rkhunter

После того как установили эту утилиту нужно обновить базы данных вирусов:
# rkhunter —update

Затем, подредактируем конфигурационный файл RkHunter:
# vim /etc/rkhunter.conf

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

После конфигурирования конфига нужно создать «слепок» нашей ОС (первоначальная база данных свойств различных системных команд), для того, чтобы RootKit Hunter мог сравнивать текущее состояние команд в системе с созданной базой:
# rkhunter —propupd

Затем можно приступать к сканированию системы:
# rkhunter —check

По желанию можно добавить программу в кронтаб на выполнение по заданному расписанию, вот пример:
0 11 * * * /usr/bin/rkhunter —update; /usr/bin/rkhunter -c —createlogfile —cronjob

В кроне я прописал выполнение 1 раз в сутки в 11.00. Вы можете установить любое другое время и дату. Утилита ведет логи которые можно найти и почитать по пути:
# vim /var/log/rkhunter.log

Установка RkHunter на RedHat/CentOS/Fedora

Для того чтобы установить RkHunter нужно выполнить команду в консоле только для начала подключите репозиторий EPEL:
# yum install rkhunter

После того как установили эту утилиту обновим БД вирусов:
# rkhunter —update

Можно немного подредактировать конфигурационный файл RkHunter для своих нужд:
# vim /etc/rkhunter.conf

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

Создадим «образ» нашей ОС (первоначальная БД со свойствами различных системных команд), для того, чтобы RootKit Hunter мог сравнивать текущее состояние команд в системе с созданной базой:
# rkhunter —propupd

Собственно теперь можно приступать к сканированию системы:
# rkhunter —check

rkhunter check  Поиск руткитов в Debian/Ubuntu/ Linux Mint и Red Hat/CentOS/Fedora

Сканирование на уязвимости в системе с помощью rkhunter —check

Сканирование выполняется в нескольких режимах:

  • Ищет уязвимости в командах;
  • Поиск rootkits;
  • Проверка network сети;
  • Проверка локального хоста;

После чего нам покажут полную статистику, вот что получилось у меня:

vy vod otcheta o provedennoj rabote  Поиск руткитов в Debian/Ubuntu/ Linux Mint и Red Hat/CentOS/Fedora

вывод отчета о проведенной работе

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

По желанию можно добавить программу в cron на выполнение по заданному расписанию, вот пример:
0 22 * * * /usr/bin/rkhunter —update; /usr/bin/rkhunter -c —createlogfile —cronjob

Выполняться утилита будет 1 раз в сутки в 22.00, но вы настраивайте для своих нужд, как кому будет удобно.

В случаи необходимости можно всегда глянуть лог:
# vim /var/log/rkhunter.log

Что делать если руткит обнаружен?

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

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

Сейчас многие покупают точки доступа 802.11n, но хороших скоростей достичь удается не всем. В этом посте поговорим о не очень очевидных мелких нюансах, которые могут ощутимо улучшить (или ухудшить) работу Wi-Fi. Всё описанное ниже применимо как к домашним Wi-Fi-роутерам со стандартными и продвинутыми (DD-WRT & Co.) прошивками, так и к корпоративным железкам и сетям. Поэтому, в качестве примера возьмем «домашнюю» тему, как более родную и близкую к телу. Ибо даже самые администые из админов и инженеристые из инженеров живут в многоквартирных домах (или поселках с достаточной плотностью соседей), и всем хочется быстрого и надежного Wi-Fi.
[!!]: после замечаний касательно публикации первой части привожу текст целиком. Если вы читали первую часть — продолжайте отсюда.
FCC ID). Тем не менее, можно уверенно заявлять, что мощность типичных мобильных клиентов находится в диапазоне 30-50 мВт. Таким образом, если ТД вещает на 100мВт, а клиент – только на 50мВт, в зоне покрытия найдутся места, где клиент будет слышать точку хорошо, а ТД клиента — плохо (или вообще слышать не будет) – асимметрия. Это справедливо даже с учетом того, что у точки обычно лучше чувствительность приема — смотрите под спойлером. Опять же, речь идет не о дальности, а о симметрии.Сигнал есть – а связи нет. Или downlink быстрый, а uplink медленный. Это актуально, если вы используете Wi-Fi для онлайн-игр или скайпа, для обычного интернет-доступа это не так и важно (только, если вы не на краю покрытия). И будем жаловаться на убогого провайдера, глючную точку, кривые драйвера, но не на неграмотное планирование сети.


Обоснование (для тех, кому интересны подробности):

Вывод: может оказаться, что для получения более стабильной связи мощность точки придется снизить. Что, согласитесь, не совсем очевидно :)

[1.2] Также далеко не самым известным фактом, добавляющим к асимметрии, является то, что у большинства клиентских устройств мощность передатчика снижена на «крайних» каналах (1 и 11/13 для 2.4 ГГц). Вот пример для iPhone из документации FCC (мощность на порту антенны).

Как видите, на крайних каналах мощность передатчика в ~2.3 раза ниже, чем на средних. Причина в том, что Wi-Fi – связь широкополосная, удержать сигнал чётко в пределах рамки канала не удастся. Вот и приходится снижать мощность в «пограничных» случаях, чтобы не задевать соседние с ISM диапазоны. Вывод: если ваш планшет плохо работает в туалете – попробуйте переехать на канал 6.

в этой ветке комментариев (вначале прочтите [3.4]).

3. Раз уж речь зашла о скоростях…


[3.1] Уже несколько раз мы упоминали скорости (rate/MCS — не throughput) в связке с SNR. Ниже приведена таблица необходимых SNR для рейтов/MCS, составленная мной по материалам стандарта. Собственно, именно поэтому для более высоких скоростей чувствительность приемника меньше, как мы заметили в [1.1].

В сетях 802.11n/MIMO благодаря MRC и другим многоантенным ухищрениям нужный SNR можно получить и при более низком входном сигнале. Обычно, это отражено в значениях чувствительности в datasheet'ах.
Отсюда, кстати, можно сделать еще один вывод: эффективный размер (и форма) зоны покрытия зависит от выбранной скорости (rate/MCS). Это важно учитывать в своих ожиданиях и при планировании сети.

[3.2] Этот пункт может оказаться неосуществимым для владельцев точек доступа с совсем простыми прошивками, которые не позволяют выставлять Basic и Supported Rates. Как уже было сказано выше, скорость (rate) зависит от соотношения сигнал/шум. Если, скажем, 54Mbps требует SNR в 25dB, а 2Mbps требует 6dB, то понятно, что фреймы, отправленные на скорости 2Mbps «пролетят» дальше, т.е. их можно декодировать с большего расстояния, чем более скоростные фреймы. Тут мы и приходим к Basic Rates: все служебные фреймы, а также броадкасты (если точка не поддерживает BCast/MCast acceleration и его разновидности), отправляются на самой нижней Basic Rate. А это значит, что вашу сеть будет видно за многие кварталы. Вот пример (спасибо Motorola AirDefense).

Опять же, это добавляет к рассмотренной в [2.2] картине коллизий: как для ситуации с соседями на том же канале, так и для ситуации с соседями на близких перекрывающихся каналах. Кроме того, фреймы ACK (которые отправляются в ответ на любой unicast пакет) тоже ходят на минимальной Basic Rate (если точка не поддерживает их акселерацию)
Еще немного математики

Вывод: отключайте низкие скорости – и у вас, и у соседей сеть станет работать быстрее. У вас – за счет того, что весь служебный трафик резко начнет ходить быстрее, у соседей – за счет того, что вы теперь для них не создаете коллизий (правда, вы все еще создаете для них интерференцию — сигнал никуда не делся — но обычно достаточно низкую). Если убедите соседей сделать то же самое – у вас сеть будет работать еще быстрее.

[3.3] Понятно, что при отключении низких скоростей подключиться к тоже можно будет только в зоне более сильного сигнала (требования к SNR стали выше), что ведет к уменьшению эффективного покрытия. Равно как и в случае с понижением мощности. Но тут уж вам решать, что вам нужно: максимальное покрытие или быстрая и стабильная связь. Используя табличку и datasheet'ы производителя точки и клиентов почти всегда можно достичь приемлемого баланса.

[3.4] Еще одним интересным вопросом являются режимы совместимости (т.н. “Protection Modes”). В настоящее время есть режим совместимости b-g (ERP Protection) и a/g-n (HT Protection). В любом случае скорость падает. На то, насколько она падает, влияет куча факторов (тут еще на две статьи материала хватит), я обычно просто говорю, что скорость падает примерно на треть. При этом, если у вас точка 802.11n и клиент 802.11n, но у соседа за стеной точка g, и его трафик долетает до вас – ваша точка точно так же свалится в режим совместимости, ибо того требует стандарт. Особенно приятно, если ваш сосед – самоделкин и ваяет что-то на основе передатчика 802.11b. :) Что делать? Так же, как и с уходом на нестандартные каналы – оценить, что для вас существеннее: коллизии (L2) или интерференция (L1). Если уровень сигнала от соседа относительно низок, переключайте точки в режим чистого 802.11n (Greenfield): возможно, понизится максимальная пропускная способность (снизится SNR), но трафик будет ходить равномернее из-за избавления от избыточных коллизий, пачек защитных фреймов и переключения модуляций. В противном случае – лучше терпеть и поговорить с соседом на предмет мощности/перемещения ТД. Ну, или отражатель поставить… Да, и не ставьте точку на окно! :)

[3.5] Другой вариант – переезжать в 5 ГГц, там воздух чище: каналов больше, шума меньше, сигнал ослабляется быстрее, да и банально точки стоят дороже, а значит – их меньше. Многие покупают dual radio точку, настраивают 802.11n Greenfield в 5 ГГц и 802.11g/n в 2.4 ГГц для гостей и всяких гаджетов, которым скорость все равно не нужна. Да и безопаснее так: у большинства script kiddies нет денег на дорогие игрушки с поддержкой 5 ГГц.
Для 5 ГГц следует помнить, что надежно работают только 4 канала: 36/40/44/48 (для Европы, для США есть еще 5). На остальных включен режим сосуществования с радарами (DFS). В итоге, связь может периодически пропадать.

4. Раз уж речь зашла о безопасности…


Упомянем некоторые интересные аспекты и здесь.
[4.1] Какой должна быть длина PSK? Вот выдержка из текста стандарта 802.11-2012, секция M4.1:
Keys derived from the pass phrase provide relatively low levels of security, especially with keys generated form short passwords, since they are subject to dictionary attack. Use of the key hash is recommended only where it is impractical to make use of a stronger form of user authentication. A key generated from a passphrase of less than about 20 characters is unlikely to deter attacks.
Вывод: ну, у кого пароль к домашней точке состоит из 20+ символов? :)

[4.2] Почему моя точка 802.11n не «разгоняется» выше скоростей a/g? И какое отношение это имеет к безопасности?
Стандарт 802.11n поддерживает только два режима шифрования: CCMP и None. Сертификация Wi-Fi 802.11n Compatible требует, чтобы при включении TKIP на радио точка переставала поддерживать все новые скоростные режимы 802.11n, оставляя лишь скорости 802.11a/b/g. В некоторых случаях можно видеть ассоциации на более высоких рейтах, но пропускная способность все равно будет низкой. Вывод: забываем про TKIP – он все равно будет запрещен с 2014 года (планы Wi-Fi Alliance).

[4.3] Стоит ли прятать (E)SSID? (это уже более известная тема)
спрятался


5. Всякая всячина.


[5.1] Немного о MIMO. Почему-то по сей день я сталкиваюсь с формулировками типа 2x2 MIMO или 3x3 MIMO. К сожалению, для 802.11n эта формулировка малополезна, т.к. важно знать еще количество пространственных потоков (Spatial Streams). Точка 2x2 MIMO может поддерживать только один SS, и не поднимется выше 150Mbps. Точка с 3x3 MIMO может поддерживать 2SS, ограничиваясь лишь 300Mbps. Полная формула MIMO выглядит так: TX x RX: SS. Понятно, что количество SS не может быть больше min (TX, RX). Таким образом, приведенные выше точки будут записаны как 2x2:1 и 3x3:2. Многие беспроводные клиенты реализуют 1x2:1 MIMO (смартфоны, планшеты, дешевые ноутбуки) или 2x3:2 MIMO. Так что бесполезно ожидать скорости 450Mbps от точки доступа 3x3:3 при работе с клиентом 1x2:1. Тем не менее, покупать точку типа 2x3:2 все равно стоит, т.к. большее количество принимающих антенн добавляет точке чувствительности (MRC Gain). Чем больше разница между количеством принимающих антенн точки и количеством передающих антенн клиента — тем больше выигрыш (если на пальцах). Однако, в игру вступает multipath.

[5.2] Как известно, multipath для сетей 802.11a/b/g – зло. Точка доступа, поставленная антенной в угол, может работать не самым лучшим образом, а выдвинутая из этого угла на 20-30см может показать значительно лучший результат. Аналогично для клиентов, помещений со сложной планировкой, кучей металлических предметов и т.д.
Для сетей MIMO с MRC и в особенности для работы нескольких SS (и следовательно, для получения высоких скоростей) multipath – необходимое условие. Ибо, если его не будет – создать несколько пространственных потоков не получится. Предсказывать что-либо без специальных инструментов планирования здесь сложно, да и с ними непросто. Вот пример рассчетов из Motorola LANPlanner, но однозначный ответ тут может дать только радиоразведка и тестирование.

Создать благоприятную multipath-обстановку для работы трех SS сложнее, чем для работы двух SS. Поэтому новомодные точки 3x3:3 работают с максимальной производительностью обычно лишь в небольшом радиусе, да и то не всегда. Вот красноречивый пример от HP (если копнуть глубже в материалы анонса их первой точки 3x3:3 — MSM460)

[5.3] Ну, и несколько интересных фактов для коллекции:

  • Человеческое тело ослабляет сигнал на 3-5dB (2.4/5ГГц). Просто развернувшись лицом к точке можно получить более высокую скорость.
  • Некоторые дипольные антенны имеют асммметричную диаграмму направленности в H-плоскости («вид сбоку») и лучше работают перевернутыми
  • В фрейме 802.11 может использоваться одновременно до четырех MAC-адресов, а в 802.11s (новый стандарт на mesh) — до шести!



Итого


Технология 802.11 (да и радиосетей в целом) обладает множеством неочевидных особенностей. Лично у меня вызывает громадное уважение и восхищение тот факт, что люди отточили насколько сложную технологию до уровня «воткни-работай». Мы рассмотрели (в разном объеме) разные аспекты физического и канального уровня сетей 802.11:

  • Асиметрию мощностей
  • Ограничения на мощность передачи в граничных каналах
  • Пересечение «непересекающихся» каналов и последствия
  • Работу на «нестандартных» каналах (отличных от 1/6/11/13)
  • Работу механизма Clear Channel Assesment и блокировку канала
  • Зависимость скорости (rate/MCS) от SNR и, как следствие, зависимость чувствительности приемника и зоны покрытия от требуемой скорости
  • Особенности пересылки служебного трафика
  • Последствия включения поддержки низких скоростей
  • Последствия включения поддержки режимов совместимости
  • Выбор каналов в 5ГГц
  • Некоторые забавные аспекты безопасности, MIMO и проч.

Не все было рассмотрено в полном объеме и исчерпывающем виде, равно как за бортом остались неочевидные аспекты сосуществования клиентов, балансировки нагрузки, WMM, питания и роуминга, экзотика типа Single-Channel Architecture и индивидуальных BSS — но это уже тема для сетей совсем другого масштаба. Если следовать хотя бы вышеприведенным соображениям, в обычном жилом доме можно получить вполне приличный коммунизм microcell, как в высокопроизводительных корпоративных WLAN. Надеюсь, статья была вам интересна.

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

В рамках науки я много писал о программном обеспечении, что-то вроде — если вы хотите разобраться в 40 гигабайтах данных, полученных при сканировании мозга, вы должны закатать рукава и написать парочку сортировочных скриптов. И я всегда был действительно неплохим программистом, хотя и не осознавал этого, пока не выпустился из академии и не начал работать над одним небольшим и очень амбициозным стартапом, — именно тогда я узнал всю правду о разработчиках программного обеспечения и — что еще более важно — о том, что значит, быть в этом бизнесе. Разработка программного обеспечения — это не просто знание языков, библиотек, алгоритмов и проектировочных шаблонов. Это — особый образ мышления.
Github. Git помогает вам управляться с работой и позволяет никогда не беспокоиться о создании резервных копий, плюс, к нему прилагается тонна кодов, с помощью которых вам не придется каждый раз заново изобретать колесо. Ах да, и еще: пожалуйста, всегда делитесь своими кодами с другими людьми, сослуживцами и коллегами по цеху. Пускай они их просматривают. Никогда не используйте для анализа код, который никто кроме вас не читал (никогда бы не поверил, что буду акцентировать на этом столько внимания, но теперь я совершенно точно знаю, что 30% от результатов в любом научном исследовании составляют ошибочные данные, которых можно было легко избежать, своевременно передав коды на рассмотрение своим друзьям).
  • Иллюстративные приложения: лично я предпочитаю Inkscape, но стандартный Adobe Illustrator или относительно новый Sketch — также хороши. Используйте их в целях пост-обработки своих графиков и диаграмм — это гораздо проще, чем писать графики в Matlab или Matplotlib.
  • Научитесь максимально эффективно использовать свой редактор текстов и кодов. Кстати, одним из лучших, на мой взгляд, редакторов является Sublime Text — научиться работать с ним намного легче, чем с VIM или Emacs. И всегда ищите кратчайшие пути — они сэкономят вам кучу времени.
  • Учитесь говорить. Смотрите выступления на TED и особо учитесь тому, как некоторые говорящие умудряются завоевать внимание аудитории в отпущенные им 15 минут. Тренируйтесь перед зеркалом. Ваши тело и голос — это тоже средства.
  • Изучение основ Python, R, HTML и Javascript может занять у вас очень много времени. Если вы уже не профан в программировании, всегда старайтесь учить новые аспекты и библиотеки. Интересуйтесь компьютерным видением, обработкой естественного языка и робототехникой, читайте как можно больше информации в Интернете, занимайтесь созданием музыки и т.д.

  • Решение той или иной проблемы всегда зависит от средств, которыми вы располагаете. Таким образом, изучение новых инструментов позволяет вам взглянуть на вопрос с разных ракурсов.

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

    4. Будь заинтересованным лицом, и пусть твоя повестка дня всегда будет всем известна


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

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

    И если ваш босс считает, что он — единственное заинтересованное в предприятии лицо (которое старается выпустить максимальное количество готовых продуктов и ищет быстрых и эффективных путей), выписывайтесь из такого коллектива как можно быстрее, иначе на вас повесят всех собак. А на кого же еще? Не на инвесторов же их вешать. И не на студентов. Да и остальная часть человечества вряд ли здесь будет при делах. Суть в следующем: узнайте как можно скорей, кто и чем занят. И если у вас не окажется возможности оставаться одним из заинтересованных лиц, бегите. В противном случае ваша любимая работа превратится в бестолковое занятие, преследующее чужие интересы.

    5. Держи свои наработки на подхвате


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

    Будучи студентом, я чаще всего писал программы, которые должны были выстрелить лишь раз на заведомо определенной системе. Но когда пишешь коды для ПО, которым будет пользоваться полмиллиона человек, все воспринимается иначе — и когда я начал писать коды профессионально я в этом очень скоро убедился.

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

    6. Знай правило 80/20


    Правило 80/20 заключается в том, что для достижения 80% желаемого эффекта вам необходимо затратить лишь 20% времени, а оставшиеся 80% времени вам понадобятся на грамотную доработку оставшиеся 20% работы. Это похоже на путешествие с окраин до центра города: за 20% времени вы покроете 80% расстояния, после чего попадете в пробку, на прохождение которой вы затратите гораздо больше времени.

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

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

    7. Не продавай свою душу


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

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

    8. Покинь свою зону комфорта


    Вот, как я смотрю на мир:


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

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

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

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

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

    9. Приручи свой ум


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

    Как много времени понадобится твоему уму, чтобы переключиться на что-то другое? Пять минут? Не думаю. Может, минута? Уже лучше. Двадцать секунд — или даже меньше? Скорее всего, так. Твой ум подобен обезьяне, которая цепляется за ближайшую ветку. Впрочем, когда дело касается обучения, здесь следует пользоваться другими выражениями. Есть, к примеру, такое: ассоциативное мышление. Превосходная вещь, когда необходимо сделать что-то творческое, и самый страшный враг концентрации. Но есть и хорошие новости: ты можешь научиться концентрироваться. Для этого существует миллион специальных техник, которые, по сути, не очень эффективны. Вам не нужны массажеры для локтей и особый софт. Вам нужно приручить свой ум — раз и навсегда.

    Впрочем, то, что сработало в моем случае, может оказаться совершенно неприменимым для вас. К примеру, я достиг поразительных результатов посредством медитаций (которые, к слову, дают массу других полезных «побочных эффектов»), но даже здесь существует огромное множество различных стилей и техник, которые выбираются индивидуально. Так что единственное, что я могу посоветовать в этом вопросе, — стараться держать свой ум в максимально хорошей форме и относиться к этому крайне серьезно. Считаете, что медитация — это потеря времени? Тогда вперед, в тренажерный зал, и занимайтесь с усердием: несколько сожженных кило приравниваются к сожжению нескольких фунтов абстрактных мыслей. Также развивайте свой мысленный взор. Укрепите позиции сейчас, чтобы в будущем ваш ум сослужил вам добрую службу, не отвлекаясь на посторонние вещи.