Openvpn через командную строку: разрешение отказано в обновлении resolv.conf

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

Dnsmasq — это легкий и быстроконфигурируемый DNS, DHCP и TFTP сервер, предназначенный для обеспечения доменными именами и связанными с ними сервисами небольшие сети. Может обеспечивать именами локальные машины, которые не имеют глобальных DNS-записей. DHCP сервер интегрирован с DNS сервером.

Настройку будем проводить на сервере с операционной системой CentOS7

Настройка DHCP-сервера

Настройка производится в конфигурационному файле /etc/dnsmasq.conf

cat /etc/dnsmasq.conf


# Указываем пользователя и группу с правами которых будет запущен демон

user=nobody
group=nobody

# Указываем интерфейсы на которых будут приниматься запросы
interface=eth0
interface=eth1

# Или интерфейсы на которых не будут приниматься запросы

except-interface="интерфейс" 

# Или ip-адреса

listen-address= "ip-адрес"

#Если вы хотите что бы интерфейс принимал только DNS запросы

no-dhcp-interface= "интерфейс"


# Указываем диапозон адресов и время аренды

dhcp-range=192.168.0.50,192.168.0.150,10h

# Для статической привязки адресов указываем MAC-адрес хоста и 
#адрес, который будем ему выдавать

dhcp-host=11:22:33:44:55:66,192.168.0.51

# или ip-адрес и имя хоста

dhcp-host=11:22:33:44:56:77,mail-server,192.168.0.55,60m

# Можем выдать один ip-адрес одному из хостов кто первый успеет

dhcp-host=12:21:33:43:88:11,22:11:55:44:88:81,192.168.0.59

# Указание опций DHCP

# Шлюз по умолчанию

dhcp-option,3,192.168.0.1

# DNS сервер

dhcp-option,6,192.168.0.1

# Лимит на аренду ip-адреса в секундах (по-умолчанию 150)

dhcp-lease-max=3600

# Указание файла для хранения информации об аренде адресов

dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases

# Указание, что DHCP сервер работает в режиме authritative

dhcp-authoritative


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

Перечень всех опций DHCP можно найти по сслыке IANA (Internet Assigned Numbers Authority).

Настройка DNS

Настройка DNS сервера производится в том же конфигурационном файле /etc/dnsmasq.conf

cat /etc/dnsmasq.conf

# Указание интерфейсов и ip-адрес мы рассмотрели в секции DHCP

# Указываем доменое имя

domain=test.un

# можно указать отдельное доменое имя, для отдельной сети

domain=wifi.test.un,192.168.100.0/24

#Или для определенного диапозона адресов

domain=range.test.un,192.168.100.100,192.168.100.200

# Указание серверов для форвардинга запросов

server=8.8.8.8

# Указание адресов доменных серверов для перенаправления запроса к определенным зонам

server=/office.un/192.168.50.10

# Аналогично можно указать для обратной зоны

server=/50.168.192.in-addr.arpa/192.168.50.10

#По умолчанию dnsmasq использует файл /etc/hosts для сопоставления имен
#хостов IP-адресам, но это тоже можно изменить. Если вы не хотите
#использовать /etc/hosts, вы можете указать это при помощи опции

no-hosts

# Если вы хотите использовать для этих целей другой файл

addn-hosts= "путь к файлу"

#Записи зоны

#Запись типа А

address=/mail-server.test.un/192.168.0.55

address=/ldap.test.un/192.168.0.210

#Запись CNAME

cname=mail-server,mail # алиасом для mail-server будет имя mail

#Запист типа SRV

srv-host=_ldap._tcp.test.un,ldap.test.un,389

#Алиасы или подмена ip-адресов
#Кроме задания собственных записей DNS можно изменять информацию,
#получаемую от внешних DNS-серверов путем подмены полученного IP-адреса.
#Для замены одного адреса

alias=10.10.1.1,172.20.1.1 # если при запросе от внешнего DNS сервера мы получили адрес 
						   #10.10.1.1 то мы подменим его на 172.20.1.1

#Или можно заменять целую сеть

alias=10.10.1.0,172.20.1.0,255,255,255,0


#Dnsmasq читает файл /etc/resolv.conf для определения перечня DNS серверов
#для форвардинга, если вы хотите поменять это и указать другой файл для этих целей

resolv-file= "путь к файлу"


Для того, чтобы обращения к DNS шли именно на dnsmasq на том же сервере, где он сам работает, необходимо указать первой записью в /etc/resolv.conf следующую строку

nameserver 127.0.0.1

Что требуется от операционной системы?

Перед установкой OpenVPN необходимо убедиться в корректности базовых параметров.

1. У сервера есть хотя бы один “белый” статичный IP-адрес. Т.е. сервер должен быть доступен из сети Интернет. Если адрес динамический, но сервер все же остается быть доступным из глобальной сети — воспользуйтесь услугами DynDNS.

2. Разрешена загрузка и установка пакетов из официальных репозиториев. Для проверки выполните cat /etc/apt/sources.list. Строки с указаниями репозиториев должны быть раскомментированы (не должно быть символа “#” решетка в начале строки).


Скриншот 1. Репозитории

3. Должны быть верно указаны параметры сети — hostname, параметры DNS-серверов.

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

Приступаем к установке.

Все действия по установке будем выполнять от пользователя root.

1. Обновляем информацию о репозиториях:

2. Устанавливаем текущие обновления системы и установленных программ:

3. Устанавливаем OpenVPN:


Скриншот 2. Установка OpenVPN

Важно. В базовых репозиториях, зачастую отсутствует новейшая версия пакета

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

4. Аналогичным образом устанавливаем пакет easy-rsa:

Действия после установки.

Размещаем скрипты easy-rsa:

Подготавливаем публичные ключи (PKI — Public Key Infrastructure):

1. Переходим в директорию /etc/openvpn/easy-rsa:

2. Создаем символьную ссылку на файл конфигурации openssl:

3. Инициализируем скрипт vars:

Система сообщит: NOTE: If you run ./clean-all, I will be doing a rm -rf on /etc/openvpn/easy-rsa/keys

4. Выполняем


Скриншот 3. Подготавливаем публичные ключи

5. Для создания центра сертификации выполняем скрипт:

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


Скриншот 4. Создание центра сертификации

Создаем ключ сервера.

Для создания ключа сервера выполним команду:


Скриншот 5. Создание ключа сервера

Следует обратить внимание, что процесс похож на генерацию сертификата центра сертификации, однако, перед подписанием сертификата программа задаст 2 уточняющих вопроса. Если все указано верно, отвечаем “y”

Managing a Running Session

  1. Once a VPN session has started, it should be seen in the session list:
  2. Using the openvpn3 session-manage there are a few things which can be done, but most typically it is the –disconnect or –restart alternatives which are most commonly used. . This disconnects and re-connects to the server again, re-establishing the connection. The ${CONFIGURATION_PROFILE_NAME} is the configuration name as displayed in openvpn3 sessions-list
  3. It is also possible to use the D-Bus path to the session as well: . This command above will disconnect a running session. Once this operation has completed, it will be removed from the openvpn3 sessions-list overview. Important: you will be able to start a new session with this or another OpenVPN profile only after you have disconnected from the current session using the command in this step
  4. It is also possible to retrieve real-time tunnel statistics from running sessions: or
  5. And to retrieve real-time log events as they occur, run the following command: This might be quite silent, as it does not provide any log events from the past. Issue an openvpn3 session-manage –restart from a different terminal, and log events will occur. You may want to boost the log-level with –log-level 6. Valid log levels are from 0 to 6, where 6 is the most verbose. Note: VPN sessions are also owned by the user which started it. But the Session Manager also provides its own Access Control List feature via

Настройка OpenVPN

Начните с копирования файлов в директорию OpenVPN. Скопировать нужно будет все файлы, которые позже понадобятся в конфигурационной директории /etc/openvpn.

Начать лучше с тех файлов, которые были созданы ранее (о них можно прочитать в предыдущей статье): они были помещены в директорию ~/openvpn-ca/keys. Конкретные файлы, которые нужно будет переместить: сертификат и ключ центра сертификации, сертификат сервера и ключ, а также подпись HMAC и файл протокола Диффи — Хеллмана. Используйте команды ниже:

$ cd ~/openvpn-ca/keys
$ sudo cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn

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

$ gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf

Переходим к настройке конфигурации OpenVPN. Для этого нужно открыть конфигурационный файл сервера:

$ sudo nano /etc/openvpn/server.conf

Базовая конфигурация

Вам нужно найти директиву tls-auth для того, чтобы, в свою очередь, найти секцию HMAC. Удалите знак точки с запятой (;) для того, чтобы раскомментировать строку tls-auth. А ниже добавьте параметр key-direction со значением 0:

tls-auth ta.key 0 # This file is secret
key-direction 0

Следующая задача – найти секцию с криптографическим шифром, и для этого вам нужно найти закомментированные строки cipher. Шифр AES-128-CBC имеет хороший уровень защиты и отличную поддержку разными продуктами. Удалите точку с запятой для того, чтобы раскомментировать строку cipher AES-128-CBC:

cipher AES-128-CBC

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

auth SHA256

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

user nobody
group nogroup

Как использовать VPN для всего трафика

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

Надо раскомментировать несколько директив для того, чтобы клиентские машины по умолчанию перенаправляли весь трафик через VPN. Найдите секцию redirect-gateway и удалите знак точки с запятой:

push "redirect-gateway def1 bypass-dhcp"

Теперь найдите секцию dhcp-option и точно так же раскомментируйте обе строки:

push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

Теперь клиенты смогут настроить DNS так, чтобы VPN использовался в качестве канала по умолчанию.Как изменить порт и протокол
Это еще одна необязательная, но полезная настройка, которая может вам понадобиться. По умолчанию OpenVPN использует порт 1194 и UDP протокол для того, чтобы принимать клиентские соединения. Возможно, вам надо будет изменить порт, если вы столкнетесь с какими-нибудь ограничениями.

Сделать это можно в строке port в файле /etc/openvpn/server.conf. Например, вы можете изменить порт на 443, так как обычно он разрешен для использования большинством фаерволов.

# Optional!
port 443

Если протокол, который вы используете, имеет ограничения по номеру порта, то в строке proto вам нужно изменить UDP на TCP:

# Optional!
proto tcp

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

Настраиваем сервер (создаем файл-конфиг и заполняем его):

touch /etc/openvpn/server.conf

nano /etc/openvpn/server.conf

port 17993 # порт, на котором будет слушать сервер

proto tcp # протокол (по умолчанию udp)

dev tun # тип устройства (tun или tap)

############################ KEYS #######################################

tls-server # явно указывает, что данный хост является tls-server

tls-auth keys/ta.key 0 # 0-сервер , 1- для конфига клиента

ca /etc/openvpn/keys/ca.crt # файл сертификата для CA

cert /etc/openvpn/keys/gate.crt # сертификат сервера

key /etc/openvpn/keys/gate.key # ключ сервера

dh /etc/openvpn/keys/dh1024.pem # файл с ключем Диффи-Хелмана

########################## END KEYS #####################################

# автоматически присваивает адреса всем клиентам (DHCP) в указанном

# диапазоне с маской сети. Данная опция заменяет ifconfig и может

# работаеть только с TLS-клиентами в режиме TUN, соответственно

# использование сертификатов обязательно.

server 10.8.0.0 255.255.255.0

ifconfig-pool-persist ipp.txt # Тут будут храниться ip адреса клиентов

push «route 10.10.10.0 255.255.255.0» # передача клиенту маршрута к сетке,

# в которой сервер.

# каждые 10 секунд посылать ping на удаленный хост, и, если за 60 секунд

# не было получено ни одного пакета — то перезапускать туннель.

keepalive 10 60

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

# Может принимать значения yes, no, adaptive.

# Последнее используется по умолчанию.

comp-lzo

# Для улучшения безопасности рекомендовано запускать

# все сервисы с минимальными правами. Openvpn будет работать от имени nobody.

user nobody

group nogroup

persist-key # указывает не перечитавать файлы ключей при перезапуске туннеля

persist-tun # данная опция оставляет без изменения устройства tun/tap

#при перезапуске OpenVPN.

# сервер работает в режиме демона

daemon

############################ LOGS #######################################

status openvpn-status.log # указывает путь к статус-файлу,

# в котором содержится информация о текущих соединениях и

#  информация о интерфейсах TUN/TAP

log-append  openvpn.log # дописывать сообщения в лог-файл, а не перезаписывать.

verb 4 # уровень логирования

mute 20 # в лог будет записываться только по 20 сообщений из одной категории

########################### END LOGS ####################################

client-to-client # позволяет клиентам видеть друг друга (сети)

client-config-dir /etc/openvpn/ccd # папка содержащая маршруты к сетям

# клиентов и посылаемые клиентам ip адреса клиента и сервера

ccd-exclusive # каждому клиенту свои настройки

management localhost 7505

tun-mtu 1500 # устанавливает максимальный размер MTU

tun-mtu-extra 32

mssfix 1450

# маршруты к сетям клиентов

route 192.168.10.0 255.255.255.0 10.8.0.2

route 192.168.0.0 255.255.255.0 10.8.0.2

route 192.168.2.0 255.255.255.0 10.8.0.2

Ubuntu network management program

There is also the option of connecting through the GUI using the openvpn extension for the Gnome network manager plugin. But this is currently a bit tricky to set up. There is for example the incorrect assumption that all VPNs will be able to redirect Internet traffic, and older versions might not understand the .ovpn file format, requiring you to split up the certificate embedded in it into separate file. And you would likely have to dig into the options to ensure that a default Internet traffic route going through the VPN server is not always enabled by default, especially for servers where you only give access to some internal resources, and not the entire Internet. However the advantage of using the GUI component is that you can start/stop the connection from the desktop environment on Linux.

Usage

First, get the script and make it executable:

curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh
chmod +x openvpn-install.sh

Then run it:

./openvpn-install.sh

You need to run the script as root and have the TUN module enabled.

The first time you run it, you’ll have to follow the assistant and answer a few questions to setup your VPN server.

When OpenVPN is installed, you can run the script again, and you will get the choice to:

  • Add a client
  • Remove a client
  • Uninstall OpenVPN

In your home directory, you will have files. These are the client configuration files. Download them from your server and connect using your favorite OpenVPN client.

If you have any question, head to the first. Please read everything before opening an issue.

Headless install

It’s also possible to run the script headless, e.g. without waiting for user input, in an automated manner.

Example usage:

AUTO_INSTALL=y ./openvpn-install.sh

# or

export AUTO_INSTALL=y
./openvpn-install.sh

A default set of variables will then be set, by passing the need for user input.

If you want to customise your installation, you can export them or specify them on the same line, as shown above.

If the server is behind NAT, you can specify its endpoint with the variable. If the endpoint is the public IP address which it is behind, you can use (the script will default to this). The endpoint can be an IPv4 or a domain.

Other variables can be set depending on your choice (encryption, compression). You can search for them in the function of the script.

Password-protected clients are not supported by the headless installation method since user input is expected by Easy-RSA.

The headless install is more-or-less idempotent, in that it has been made safe to run multiple times with the same parameters, e.g. by a state provisioner like Ansible/Terraform/Salt/Chef/Puppet. It will only install and regenerate the Easy-RSA PKI if it doesn’t already exist, and it will only install OpenVPN and other upstream dependencies if OpenVPN isn’t already installed. It will recreate all local config and re-generate the client file on each headless run.

Headless User Addition

It’s also possible to automate the addition of a new user. Here, the key is to provide the (string) value of the variable along with the remaining mandatory variables before invoking the script.

The following Bash script adds a new user to an existing OpenVPN configuration

#!/bin/bash
export MENU_OPTION="1"
export CLIENT="foo"
export PASS="1"
./openvpn-install.sh

Перемещение сертификатов и ключей

Сервер

Ключи и сертификаты созданы. Настало время раздать их пользователям, а серверные ключи скопировать в соответствующие каталоги на сервере.

1. Переходим в каталог с ключами:

2. Копируем только необходимые серверу файлы:

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

Важно хранить их в надежном месте и не передавать по открытым каналам связи.

Клиенты

Клиенту понадобится всего 3 файла ca.crt, client1.crt, client1.key. Каждому клиенту необходимо отдавать только его ключи. Данные файлы можно разместить в директории /etc/openvpn на машине клиента, если она под управлением Linux-подобной ОС.

В ОС Windows их следует разместить в пользовательский каталог.

Команды для управления маршрутизацией

Обозначение: VPN-хост — удаленная сторона (удаленный хост)route < network > — устанавливает указанную маршрутизацию на VPN-хосте, после успешного запуска туннеля. Пример:
route 10.0.10.0 255.255.255.252route-gateway < IP > — устанавливает шлюз на VPN-хосте. Пример:
route-gateway 192.168.0.22
После успешного запуска виртуального туннеля клиенту будет задан шлюз 192.168.0.22route-delay < seconds > — указывает подождать n-секунд перед установкой маршрутов. Пример:
route-delay 5
Т.е. через 5 секунд после установки туннеля будут заданы маршруты.route-up < cmd > — выполнить скрипт или программу < cmd > после установки маршрутов. Пример:
route-up /script.shredirect-gateway — установить шлюзом по умолчанию удаленный сервер. Т.е. когда удаленный пользователь подключается к нашему серверу, то ему будет задан шлюз по умолчанию на наш сервер.

16. Настройка клиента OpenVPN

  • разместите сгенерированные сертификаты vpn на клиентах/устройствах
  • установите клиент OpenVPN на машние/устройствах

Для установки клиента OpenVPN:

pacman -S openvpn

Настройки даны исходя из расположения файлов здесь:

  • /etc/openvpn/certs/ca.crt
  • /etc/openvpn/certs/client.crt
  • /etc/openvpn/certs/client.key
  • /etc/openvpn/certs/ta.key

Создайте следующий конфигурационный файл client.conf:

touch /etc/openvpn/client.conf

откройте его для редактирования:

vim /etc/openvpn/client.conf

и скопируйте туда:

client
remote 185.117.153.79
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/client.crt
key /etc/openvpn/certs/client.key
cipher DES-EDE3-CBC
comp-lzo yes
dev tun
proto udp
tls-auth /etc/openvpn/certs/ta.key 1
nobind
auth-nocache
persist-key
persist-tun
user nobody
group nogroup

Обратите внимание на строку remote 185.117.153.79 – вам обязательно нужно заменить это значение на IP вашего собственного VPN сервера!

Сохраните и закройте файл. 

Добавьте группу

groupadd nogroup

Для запуска и проверки статуса:

systemctl start openvpn@client
systemctl status openvpn@client

Для добавления в автозагрузку:

systemctl enable openvpn@client

Разные вопросы

В. Чем отличаются виртуальные устройства tun и tap?О. TUN — туннель, соединение по которому указывается по типу: локальный IP < — > удаленный IP. Например, при явном указании ifconfig:
—ifconfig 10.3.0.2 10.3.0.1
в этом примере 10.3.0.2 — локальный IP, 10.3.0.1 — удаленный IP
TAP — эмулирует виртуальную ethernet карточку, для которой требуется указывать локальный IP и маску подсети. Например:
—ifconfig 10.3.0.2 255.255.255.0

В. Для чего нужны файлы serial и index.txt при генерации ключей с easy-rsa?О. Эти два файла используются в качестве временной базы данных, используемой при генерации ключей. Должны находиться в том каталоге, где и ключи.

Авторизуйтесь для добавления комментариев!

Опции в режиме сервера

push < options > — передача клиенту конфигурационных параметров. Пример:
push «route 192.168.0.0 255.255.255.0»
Аналогично с помощью push клиенту могут передаваться следующие параметры:route
route-gateway
route-delay
redirect-gateway
inactive
ping, ping-exit, ping-restart
persist-key, persist-tun
comp-lzo
dhcp-option
ip-win32

Последние две опции применимы только для Window-клиентов. Например передадим Windows-клиенту адрес DNS-сервера 11.11.11.11:
push «dhcp-option DNS 11.11.11.11»comp-lzo — параметр сжатия трафика, идущего через виртуальный туннель. Может принимать значения yes, no, adaptive. Последнее используется по умолчанию.
Например:
comp-lzo yes — принудительно включить сжатие
comp-lzo no — принудительно отключить сжатие
comp-lzo adaptive — адаптивный режим.

Security and Encryption

OpenVPN’s default settings are pretty weak regarding encryption. This script aims to improve that.

OpenVPN 2.4 was a great update regarding encryption. It added support for ECDSA, ECDH, AES GCM, NCP and tls-crypt.

Most of OpenVPN’s encryption-related stuff is managed by Easy-RSA. Defaults parameters are in the vars.example file.

Compression

By default, OpenVPN doesn’t enable compression. This script provides support for LZ0 and LZ4 (v1/v2) algorithms, the latter being more efficient.

TLS version

With we enforce TLS 1.2, which the best protocol available currently for OpenVPN.

TLS 1.2 is supported since OpenVPN 2.3.3.

Certificate

OpenVPN uses an RSA certificate with a 2048 bits key by default.

OpenVPN 2.4 added support for ECDSA. Elliptic curve cryptography is faster, lighter and more secure.

This script provides:

  • ECDSA: // curves
  • RSA: // bits keys

It defaults to ECDSA with .

OpenVPN uses as the signature hash by default, and so does the script. It provides no other choice as of now.

Data channel

By default, OpenVPN uses as the data channel cipher. Blowfish is an old (1993) and weak algorithm. Even the official OpenVPN documentation admits it.

The script supports the following ciphers:

And defaults to .

OpenVPN 2.4 added a feature called «NCP»: Negotiable Crypto Parameters. It means you can provide a cipher suite like with HTTPS. It is set to by default and overrides the parameter when used with an OpenVPN 2.4 client. For the sake of simplicity, the script set both the and to the cipher chosen above.

Control channel

OpenVPN 2.4 will negotiate the best cipher available by default (e.g ECDHE+AES-256-GCM)

The script proposes the following options, depending on the certificate:

  • ECDSA:
  • RSA:

It defaults to .

Diffie-Hellman key exchange

OpenVPN uses a 2048 bits DH key by default.

OpenVPN 2.4 added support for ECDH keys. Elliptic curve cryptography is faster, lighter and more secure.

Also, generating a classic DH keys can take a long, looong time. ECDH keys are ephemeral: they are generated on-the-fly.

The script provides the following options:

  • ECDH: // curves
  • DH: // bits keys

It defaults to .

From the OpenVPN wiki, about :

The script provides the following choices:

It defaults to .

and

From the OpenVPN wiki, about :

About :

So both provide an additional layer of security and mitigate DoS attacks. They aren’t used by default by OpenVPN.

is an OpenVPN 2.4 feature that provides encryption in addition to authentication (unlike ). It is more privacy-friendly.

The script supports both and uses by default.

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

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