Dns на freebsd. сервер имен named. теория и практика

17.9.3. Причины, по которым вам может понадобиться сервер имён

Сервера имён обычно используются в двух видах: авторитетный сервер
имён и кэширующий сервер имён.

Авторитетный сервер имён нужен, когда:

  • нужно предоставлять информацию о DNS остальному миру, отвечая
    на запросы авторизированно.

  • зарегистрирован домен, такой, как
    example.org и в этом домене требуется
    поставить имена машин в соответствие с их адресами IP.

  • блоку адресов IP требуется обратные записи DNS (IP в имена
    хостов).

  • резервный (slave) сервер имён должен отвечать на запросы о
    домене, когда основной не работает или не доступен.

Кэширующий сервер имён нужен, когда:

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

  • требуется уменьшение общего сетевого трафика (DNS
    составляет около 5% всего трафика Интернет, или чуть
    больше).

19.11.1 Обзор

По умолчанию во FreeBSD используется одна из версий программы BIND (Berkeley Internet
Name Domain), являющейся самой распространенной реализацией протокола DNS. DNS — это
протокол, при помощи которого имена преобразуются в IP-адреса и наоборот. Например, в
ответ на запрос о www.FreeBSD.org будет получен IP-адрес
веб-сервера Проекта FreeBSD, а запрос о ftp.FreeBSD.org возвратит
IP-адрес соответствующей машины с FTP-сервером. Точно также происходит и обратный
процесс. Запрос, содержащий IP-адрес машины, возвратит имя хоста. Для выполнения запросов
к DNS вовсе не обязательно иметь в системе работающий сервер имён.

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

В этом документа рассматривается BIND 8.x, так как это стабильная версия, используемая
во FreeBSD. BIND 9.x может быть установлен как порт net/bind9.

Протокол DNS стандартизован в RFC1034 и RFC1035.

in-addr.arpa

У записей типа есть существенный недостаток — информация в них указывается в обратном порядке. Сервер DNS проверяет компоненты имени справа налево. При поиске хоста с именем www.absolutefreebsd.com сервер имен сначала отыскивает сервер имен, обслуживающий домен .com. Затем в домене .com отыскивается сервер имен для домена absolutefreebsd.com, а затем уже www.absolutefreebsd.com. Самый крупный элемент находится справа. Основной сервер домена .com перенаправляет запрос серверу имен поддомена absolutefreebsd, то есть моему серверу, а он в свою очередь отыскивает адрес конкретной машины www.

В IP-адресах самый крупный элемент находится слева. Возьмем IP-адрес 72.32.92.4. Первое число можно сравнить с целым доменом .com. Все IP-адреса, принадлежащие блоку 72, распределяются Американским бюро регистрации номеров Интернета (American Registry for Internet Numbers, ARIN). В свою очередь ARIN передает право распоряжаться блоком адресов 72.32 конкретной компании-провайдеру. Эта компания передает блок адресов 72.32.92 клиенту, который присваивает адрес 72.32.92.4 конкретной машине. Концепция передачи права распоряжаться блоками адресов проста, но происходит слева направо — в противоположном направлении тому, как распределены имена хостов.

IP-адрес, записанный в прямом порядке, очень легко перепутать с IP-адресом, записанным в обратном порядке, поэтому в DNS используется специальный домен, который указывает, что IP-адрес, записан в обратном порядке. К перевернутым IP-адресам справа добавляется строка in-addr.arpa. (Причины такого расположения уходят корнями в прошлое; они довольно скучны и здесь рассматриваться не будут.) В результате наш адрес 72.32.92.4 превращается в 4.92.32.72.in-addr.arpa.

Тогда почему бы не оставить прямую запись IP-адреса и не использовать строку in-addr.arpa для обозначения обратного запроса DNS? Хороший вопрос! Дело в том, что предыдущий запрос достаточно прост, потому что поиск производится в весьма ограниченной области. Однако если вы владеете блоком адресов 72.32.92.0/24*, возможно, вам придется запросить информацию целиком обо всей области, которой распоряжается компания-провайдер, то есть информацию о 92.32.72.in-addr.arpa. Точно так же можно запросить информацию о целом блоке 72.32/16, или 32.72.in-addr.arpa, и даже о блоке 72.in-addr.arpa. Каждый такой запрос подразумевает проверку значительного пространства — аналогично запуску . Вам, скорее всего, никогда не понадобится запускать , однако это потребуется инженерам, обслуживающим магистрали Интернета. Именно они и пишут такие программы. Один из недостатков профессиональных инструментов заключается в том, что в первую очередь они адресованы профессионалам.

19.11.6 Конфигурационные файлы

19.11.6.1 Использование make-localhost

Обязательно выполните следующие команды:

# cd /etc/namedb
# sh make-localhost

для того, чтобы правильно создать файл /etc/namedb/localhost.rev локальной обратной зоны для
loopback-интерфейса.

19.11.6.2 /etc/namedb/named.conf

// $FreeBSD$
//
// Refer to the named(8) manual page for details.  If you are ever going
// to setup a primary server, make sure you've understood the hairy
// details of how DNS is working.  Even with simple mistakes, you can
// break connectivity for affected parties, or cause huge amount of
// useless Internet traffic.

options {
        directory "/etc/namedb";

// In addition to the "forwarders" clause, you can force your name
// server to never initiate queries of its own, but always ask its
// forwarders only, by enabling the following line:
//
//      forward only;

// If you've got a DNS server around at your upstream provider, enter
// its IP address here, and enable the line below.  This will make you
// benefit from its cache, thus reduce overall DNS traffic in the
Internet.
/*
        forwarders {
                127.0.0.1;
        };
*/
/*
         * If there is a firewall between you and name servers you want
         * to talk to, you might need to uncomment the query-source
         * directive below.  Previous versions of BIND always asked
         * questions using port 53, but BIND 8.1 uses an unprivileged
         * port by default.
         */
        // query-source address * port 53;

        /*
         * If running in a sandbox, you may have to specify a different
         * location for the dumpfile.
         */
        // dump-file "s/named_dump.db";
};

// Note: the following will be supported in a future release.
/*
host { any; } {
        topology {
                127.0.0.0/8;
        };
};
*/

// Setting up secondaries is way easier and the rough picture for this
// is explained below.
//
// If you enable a local name server, don't forget to enter 127.0.0.1
// into your /etc/resolv.conf so this server will be queried first.
// Also, make sure to enable it in /etc/rc.conf.

zone "." {
        type hint;
        file "named.root";
};

zone "0.0.127.IN-ADDR.ARPA" {
        type master;
        file "localhost.rev";
};

zone
"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.INT" {
        type master;
        file "localhost.rev";
};

// NB: Do not use the IP addresses below, they are faked, and only
// serve demonstration/documentation purposes!
//
// Example secondary config entries.  It can be convenient to become
// a secondary at least for the zone where your own domain is in.  Ask
// your network administrator for the IP address of the responsible
// primary.
//
// Never forget to include the reverse lookup (IN-ADDR.ARPA) zone!
// (This is the first bytes of the respective IP address, in reverse
// order, with ".IN-ADDR.ARPA" appended.)
//
// Before starting to setup a primary zone, better make sure you fully
// understand how DNS and BIND works, however.  There are sometimes
// unobvious pitfalls.  Setting up a secondary is comparably simpler.
//
// NB: Don't blindly enable the examples below. :-)  Use actual names
// and addresses instead.
//
// NOTE!!! FreeBSD runs bind in a sandbox (see named_flags in rc.conf).
// The directory containing the secondary zones must be write accessible
// to bind.  The following sequence is suggested:
//
//      mkdir /etc/namedb/s
//      chown bind:bind /etc/namedb/s
//      chmod 750 /etc/namedb/s

Дополнительная информация о запуске BIND в ограниченном окружении находится в .

/*
zone "example.com" {
        type slave;
        file "s/example.com.bak";
        masters {
                192.168.1.1;
        };
};

zone "0.168.192.in-addr.arpa" {
        type slave;
        file "s/0.168.192.in-addr.arpa.bak";
        masters {
                192.168.1.1;
        };
};
*/

Это примеры описаний прямой и обратной зон из файла named.conf для вторичных серверов.

Для каждого новой зоны, которую будет обслуживать сервер имён, в файл named.conf должна быть добавлена запись

К примеру, самая простая запись для домена example.org может
выглядеть вот так:

zone "example.org" {
    type master;
    file "example.org";
};

Зона является первичной, что отражается в поле type, и
информация о зоне хранится в файле /etc/namedb/example.org, что
указывается в поле file.

zone "example.org" {
    type slave;
    file "example.org";
};

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

Запуск

Перезапускаем Nginx /usr/local/etc/rc.d/nginx restart

Перезапускаем PHP-FPM # /usr/local/etc/rc.d/php-fpm restart

Запускаем Exim и Dovecot # /usr/local/etc/rc.d/exim start # /usr/local/etc/rc.d/dovecot start

Roundcube доступен по адресу http://mail.deathstar.name а Vexim по http://exim.deathstar.name

Заходим по адресу http://exim.deathstar.name Логинимся под siteadmin и пароль, что выставляли ранее Жмем Add local domain Прописываем домен, имя администратора ( по умолчанию postmaster, можно сменить на любое , так же создастся ящик вида postmaster@domain, а создадим например admin ) прописываем пароль ( например pass ) повторяем пароль отмечаем антиспам и антивирус ( по желанию ) и жмем Submit

У нас появился почтовый аккаунт admin@domain с паролем pass

Чтоб для созданного домена создать еще ящик, логинимся под логином админа домена, в нашем случае — admin

17.9.6. Конфигурационные файлы

17.9.6.1. make-localhost

Обязательно выполните следующие команды:

    # cd /etc/namedb
# sh make-localhost

для того, чтобы правильно создать файл
/etc/namedb/localhost.rev локальной обратной
зоны для loopback-интерфейса.

17.9.6.2. /etc/namedb/named.conf

    // $FreeBSD$
    //
    // Refer to the named(8) manual page for details.  If you are ever going
    // to setup a primary server, make sure you've understood the hairy
    // details of how DNS is working.  Even with simple mistakes, you can
    // break connectivity for affected parties, or cause huge amount of
    // useless Internet traffic.
    
    options {
            directory "/etc/namedb";
    
    // In addition to the "forwarders" clause, you can force your name
    // server to never initiate queries of its own, but always ask its
    // forwarders only, by enabling the following line:
    //
    //      forward only;
    
    // If you've got a DNS server around at your upstream provider, enter
    // its IP address here, and enable the line below.  This will make you
    // benefit from its cache, thus reduce overall DNS traffic in the
    Internet.
    /*
            forwarders {
                    127.0.0.1;
            };
    */
    /*
             * If there is a firewall between you and name servers you want
             * to talk to, you might need to uncomment the query-source
             * directive below.  Previous versions of BIND always asked
             * questions using port 53, but BIND 8.1 uses an unprivileged
             * port by default.
             */
            // query-source address * port 53;
    
            /*
             * If running in a sandbox, you may have to specify a different
             * location for the dumpfile.
             */
            // dump-file "s/named_dump.db";
    };
    
    // Note: the following will be supported in a future release.
    /*
    host { any; } {
            topology {
                    127.0.0.0/8;
            };
    };
    */
    
    // Setting up secondaries is way easier and the rough picture for this
    // is explained below.
    //
    // If you enable a local name server, don't forget to enter 127.0.0.1
    // into your /etc/resolv.conf so this server will be queried first.
    // Also, make sure to enable it in /etc/rc.conf.
    
    zone "." {
            type hint;
            file "named.root";
    };
    
    zone "0.0.127.IN-ADDR.ARPA" {
            type master;
            file "localhost.rev";
    };
    
    zone
    "0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.IP6.INT" {
            type master;
            file "localhost.rev";
    };
    
    // NB: Do not use the IP addresses below, they are faked, and only
    // serve demonstration/documentation purposes!
    //
    // Example secondary config entries.  It can be convenient to become
    // a secondary at least for the zone where your own domain is in.  Ask
    // your network administrator for the IP address of the responsible
    // primary.
    //
    // Never forget to include the reverse lookup (IN-ADDR.ARPA) zone!
    // (This is the first bytes of the respective IP address, in reverse
    // order, with ".IN-ADDR.ARPA" appended.)
    //
    // Before starting to setup a primary zone, better make sure you fully
    // understand how DNS and BIND works, however.  There are sometimes
    // unobvious pitfalls.  Setting up a secondary is comparably simpler.
    //
    // NB: Don't blindly enable the examples below. :-)  Use actual names
    // and addresses instead.
    //
    // NOTE!!! FreeBSD runs bind in a sandbox (see named_flags in rc.conf).
    // The directory containing the secondary zones must be write accessible
    // to bind.  The following sequence is suggested:
    //
    //      mkdir /etc/namedb/s
    //      chown bind:bind /etc/namedb/s
    //      chmod 750 /etc/namedb/s

Дополнительная информация о запуске BIND в ограниченном окружении
находится в .

    /*
    zone "example.com" {
            type slave;
            file "s/example.com.bak";
            masters {
                    192.168.1.1;
            };
    };
    
    zone "0.168.192.in-addr.arpa" {
            type slave;
            file "s/0.168.192.in-addr.arpa.bak";
            masters {
                    192.168.1.1;
            };
    };
    */

Это примеры описаний прямой и обратной зон из файла
named.conf для вторичных серверов.

Для каждого новой зоны, которую будет обслуживать сервер имён,
в файл named.conf должна быть добавлена
запись

К примеру, самая простая запись для домена example.org может
выглядеть вот так:

    zone "example.org" {
    	type master;
    	file "example.org";
    };

Зона является первичной, что отражается в поле
type, и информация о зоне хранится в файле
/etc/namedb/example.org, что указывается в
поле file.

    zone "example.org" {
    	type slave;
    	file "example.org";
    };

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

Установка и настройка Roundcube

Ставим RoundCube (выбираем MySQL): # cd /usr/ports/mail/roundcube/ # make config-recursive # make install clean

И далее команды по порядку: # cd /usr/local/www/roundcube # chmod 777 logs/ # chmod 777 temp/

Заходим в MySQL # mysql -u root -p

Вводим ранее установленный пароль для root

Создаем пользователя для Roundcube CREATE USER ’roundcube’@’localhost’ IDENTIFIED BY ‘PASSWORD’;

Устанавливаем тип таблиц и прочие настройки SET storage_engine=INNODB; SET GLOBAL innodb_file_per_table=1, innodb_file_format=Barracuda, innodb_large_prefix=1;

Вызодим из MySQL q

Копируем конфиг: # cd /usr/local/www/roundcube/config # cp config.inc.php.sample config.inc.php

Редактируем /usr/local/www/roundcube/config/defaults.inc.php # ee /usr/local/www/roundcube/config/defaults.inc.php

Правим ( или раскоментировать при наличии и поправить) строки: $config = ‘%u’; $config = ‘%p’; $config = true;

Делаем виртуальный хост в nginx для Roundcube # ee /usr/local/etc/nginx/vhosts/mail.deathstar.name и приводим к такому виду

<listen 80; #listen 443 ssl; #ssl on; #ssl_certificate /usr/local/etc/letsencrypt/live/mail.deathstar.name/fullchain.pem; #ssl_certificate_key /usr/local/etc/letsencrypt/live/mail.deathstar.name/privkey.pem;

location /.well-known/acme-challenge <allow all; auth_basic off; root /tmp/; >

.php$ <fastcgi_pass php-fpm; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include /usr/local/etc/nginx/fastcgi_params; >

Запускаем Nginx /usr/local/etc/rc.d/nginx start

Запускаемся

Выполняем команду

/usr/sbin/named -t /var/named -u bind -c /etc/namedb/named.conf

смотрим, что у нас в логах

tail -F /var/log/named.log

Если мы видим сообщение:

loading configuration from ‘/etc/namedb/named.conf’
zone mydomain.ru/IN: loaded serial 2008071001
zone mydomain.ru/IN: sending notifies (serial 2008071001)

То значит вы нигде не ошиблись и named успешно запущен и зона mydomain.ru загружена.

Если вы видите сообщение:

config: none:0: open: /etc/namedb/named.conf: permission denied
general: reloading configuration failed: permission denied

Это означает что named (из-за отсутствия прав) не может прочесть конфиг. Исправим это:

cd /varchown -R bind:bind named

тем самым изменили права на папку named установив владельца (owner) bind, группу (group) bind

Проверить наличие владельца с именем bind можно

команда результат

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

id -P bindbind:*:53:53::0:0:Bind Sandbox:/:/usr/sbin/nologin

Проверяем наличе в системе группы bind:

cat /etc/group | grep bind bind:*:53:

Или узнаем и то и то одной командой:

id binduid=53(bind) gid=53(bind) groups=53(bind)

Точно убедиться что named запущен:

ps -ax | grep named /usr/sbin/named -t /var/named -u bind -c /etc/namedb/named.conf

sockstat | grep :53bind named 67664 20 udp4 194.87.0.50:53 *:*
bind named 67664 21 tcp4 194.87.0.50:53 *:*
bind named 67664 22 udp4 127.0.0.1:53 *:*
bind named 67664 23 tcp4 127.0.0.1:53 *:*

Проверить наличие резолва можно командой:

nslookup mydomain.ru
Server: 127.0.0.1
Address: 127.0.0.1#53

Name: mydomain.ru
Address: 194.87.0.51

Если IP-адрес выдается, то вы все сделали правильно.

Командой nslookup можно проверять любые домены, эта команда есть даже в Windows

Прочтите man nslookup

Named не стартует и в логах тишина…. Что делать ?

Воспользоваться debug режимом. Для этого нужно запустить named с ключами -g -d9

/usr/sbin/named -t /var/named -u bind -c /etc/namedb/named.conf -g -d9

Иерархия DNS:

Практически повсеместно корневой домен (root) обозначают символом «.», на самом деле точка — разделитель компонентов доменного имени, а т. к. у корневого домена нет обозначения, то полное доменное имя кончается точкой. Тем не менее, это обозначение достаточно прочно закрепилось в литературе в качестве обозначения корневого домена. Далее по иерархии идут домены верхнего уровня (TLD, Top Level Domain), за ними домены второго уровня, далее третьего и т. д., друг от друга они отделяются точками. Общая структура представлена на рисунках:

Иллюстрация работы:

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

4.14. Дополнительная информация

4.14.1. Системный справочник (man)

Пожалуй, самым полным руководством по FreeBSD является системный справочник (man). Практически каждое приложение или утилита имеют соответствующую страницу (часто не одну), описывающую тот или иной аспект работы программы, всевозможные опции и настройки. Для просмотра этих страниц существует команда :

Здесь — это команда, о которой вы хотите получить информацию. Например, чтобы узнать побольше о команде , наберите:

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

  1. Пользовательские команды.

  2. Системные вызовы и коды ошибок.

  3. Функции стандартных библиотек.

  4. Драйверы устройств.

  5. Форматы файлов.

  6. Развлечения и игры.

  7. Дополнительная информация.

  8. Команды системного администрирования.

  9. Для разработчиков ядра.

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

Эта команда выведет справку об утилите . По традиции, конкретный раздел справочника указывается в скобках после команды, например, chmod(1) относится к утилите , а chmod(2) — к соответствующему системному вызову.

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

Вы получите список команд, имеющих слово «mail» в своих описаниях. Это эквивалентно использованию команды .

Или например, вы видите список файлов в каталоге /usr/bin, при этом не имея ни малейшего представления о том, какие функции выполняет каждый их них? Просто наберите:

или

что фактически одно и то же.

4.14.2. Файлы GNU Info

FreeBSD поставляется с многочисленными приложениями и утилитами от Фонда Свободного Программного Обеспечения, Free Software Foundation (FSF). В дополнение к страницам справочника, с этими программами поставляется обширная гипертекстовая документация в виде так называемых файлов, которые могут быть просмотрены с помощью команды , или, если установлен emacs, в info режиме этого редактора.

Чтобы воспользоваться командой info(1), просто наберите в командной строке:

Вызвать на экран краткое введение можно набрав . Краткий список команд можно получить набрав .

Список серверов имен

Итак, распознаватель знает, в каких доменах искать по умолчанию, и надо сообщить ему, к каким серверам имен обращаться. Перечислите все серверы имен в отдельных строках файла /etc/resolv.conf — в порядке предпочтения. Распознаватель будет обращаться к серверам имен в этом порядке. Список в файле /etc/resolv.conf выглядит примерно так:

Обратите внимание: первая запись в списке — это IP-адрес 127.0.0.1, принадлежащий «обратной петле» (loopback). Данная запись нужна на машине, выполняющей функции сервера имен, поскольку она предписывает распознавателю обращаться к серверу имен локального хоста

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

Если в /etc/resolv.conf есть записи , а также ключевые слова или , ваш распознаватель сконфигурирован. Теперь нужно настроить эти источники информации, чтобы распознаватель мог их использовать.

Заключение

На этом по настройке apache все. Я рассмотрел все основные моменты, которые необходимы для установки и настройки web сервера на основе apache и php, который обычно называют LAMP. При этом рассказал о некоторых вещах, которые повышают удобство и гибкость эксплуатации сервера.

Тема настройки веб сервера обширна. Рассмотреть все варианты в одной статье невозможно, так как функционал будет разниться, в зависимости от назначения сервера. Тем не менее приведу еще несколько ссылок на материалы, которые имеют отношение к настройке web сервера:

  • Полный бэкап сервера или отдельных сайтов.
  • Мониторинг веб сервера и веб сайта с помощью zabbix.
  • Защита админки wordpress с помощью fail2ban.
  • Если у вас будут проблемы с ботами, то пригодится статья по блокировке доступа к сайту по странам или защита сайта от ddos.

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

Напоминаю, что данная статья является частью единого цикла статьей про сервер Centos.

Онлайн курс «DevOps практики и инструменты»

Если у вас есть желание научиться строить и поддерживать высокодоступные и надежные системы, научиться непрерывной поставке ПО, мониторингу и логированию web приложений, рекомендую познакомиться с онлайн-курсом «DevOps практики и инструменты» в OTUS. Курс не для новичков, для поступления нужны базовые знания по сетям и установке Linux на виртуалку. Обучение длится 5 месяцев, после чего успешные выпускники курса смогут пройти собеседования у партнеров.

Проверьте себя на вступительном тесте и смотрите программу детальнее по .

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

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