Как поднять свой vpn настроить openvpn и stunnel

Что нам понадобится

Вот что нам потребуется для поднятия своего VPN.

Провайдер VPS

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

Выбор ОС

В моем примере используется RHEL версии 7.4. Для точного копирования команд из статьи сгодится и CentOS 7 (1708), так как это бесплатная и почти идентичная копия RHEL, основанная на его коде. Возможно, подойдут другие дистрибутивы, а также производные RHEL (Fedora), но пути файлов конфигурации и версии программ могут различаться.

Возможные проблемы

Большая часть проблем решается при помощи логов, которые находятся в папке C:\Program Files\OpenVPN\log. Уровень детализации лога контролируется параметром verb в конфигурационном файле сервера или клиента.

Также возможны следующие часто возникающие проблемы:

  1. Проблема: клиент постоянно пытается подключиться к серверу, но соединения не происходит или подключение зависает.
    Причина: сервер блокирует подключения по настроенному порту VPN (в нашем примере, 443).
    Решение: на сервере необходимо добавить 443 порт в исключения брандмауэра или отключить последний.
     
  2. Проблема: при попытке подключиться к серверу выскакивает ошибка «Не удалось подключиться к config».
    Причина: ошибка в настройках.
    Решение: перепроверьте каждую строчку файла конфигурации. Проверьте наличие всех файлов, на которые ссылаетесь в настройках.
     
  3. Проблема: клиенты получают одинаковые IP-адреса.
    Причина: подключение выполняется под одним и тем же пользователем.
    Решение: сервер выдает одинаковые адреса одинаковым клиентам. Необходимо настроить авторизацию на сервере и выдать каждому клиенту индивидуальные настройки.
     
  4. Проблема: соединение происходит, но через несколько минут связь прерывается.
    Причина: дублирование IP-адресов.
    Решение: данная проблема описана выше (пункт 3).

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

Переходим в папку C:\Program Files\OpenVPN\config-auto (или для старой версии C:\Program Files\OpenVPN\config) и создаем файл server.ovpn. Открываем его на редактирование и приводим к следующему виду:

port 443
proto udp
dev tun
dev-node «VPN Server»
dh «C:\\Program Files\\OpenVPN\\ssl\\dh.pem»
ca «C:\\Program Files\\OpenVPN\\ssl\\ca.crt»
cert «C:\\Program Files\\OpenVPN\\ssl\\cert.crt»
key «C:\\Program Files\\OpenVPN\\ssl\\cert.key»
server 172.16.10.0 255.255.255.0
max-clients 32
keepalive 10 120
client-to-client
compress
ncp-disable
fast-io
cipher AES-256-CBC
persist-key
persist-tun
status «C:\\Program Files\\OpenVPN\\log\\status.log»
log «C:\\Program Files\\OpenVPN\\log\\openvpn.log»
verb 4
mute 20

* где port — сетевой порт (443 позволит избежать проблем при использовании Интернета в общественных местах, но может быть любым из свободных, например 1194, занятые порты в Windows можно посмотреть командой netstat -a); dev-node — название сетевого интерфейса; server — подсеть, в которой будут работать как сам сервер, так и подключенные к нему клиенты.
** так как в некоторых путях есть пробелы, параметр заносится в кавычках.
*** при использовании другого порта необходимо проверить, что он открыт в брандмауэре или на время тестирования отключить его.

В сетевых подключениях Windows открываем управление адаптерами — TAP-адаптер переименовываем в «VPN Server» (как у нас указано в конфигурационном файле, разделе dev-node):

Теперь открываем службы Windows и находим «OpenVpnService». Открываем ее, настраиваем на автозапуск и включаем:

Если служба в запущенном состоянии, то перезапускаем ее.

Ранее переименованный сетевой интерфейс должен включиться:

VPN-сервер работает. Проверьте, что сетевой адаптер VPN Server получил IP 172.16.10.1. Если он получает что-то, на подобие, 169.254…, выключаем сетевой адаптер — перезапускаем службу OpenVpnService и снова включаем сетевой адаптер.

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

netsh advfirewall firewall add rule name=»ALLOW OpenVPN» dir=in action=allow protocol=UDP localport=443

* где 443 — наш порт, который мы решили задействовать под OpenVPN; UDP — протокол, который мы настроили в конфигурационном файле сервера.

Как настроить сетевой мост между двумя сетями для Open VPN сервера?

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

В нашем случае  это наш сетевой адаптер, который «смотрит» в интернет и только что созданный адаптер TAP. Настройки IP обнуляем. Выделяем оба адаптера мышкой и объединяем в «мост»:

После установки устройства «Сетевой мост» нужно сделать ему настройки через «свойства» IP адреса, шлюза, маски а так же адреса DNS -серверов (выданные провайдером) . Если IP не было — назначить постоянный, внутренний

Это важно, без этого наш сервер не заработает!

Настройки IP адаптеров включенных в мост не изменяем и ничего не трогаем!

Отключаем брандмауэр windows.  Дополнительно, там же идем в «Разрешение обмена данными с приложениями в брандмауэре  Windows,  добавляем наш установленный open vpn в список (C:Program FilesOpenVPVBinOpenVPNgui,exe).

Сняли возможную блокировку соединения. Идем далее! Предварительная подготовка почти закончена. Теперь займемся непосредственно сервером. Идем в папку C:Program FilesOpenVPVeasy-rsa

В ней находятся программы  с которыми мы сейчас будем взаимодействовать. Открываем командную строку от имени Администратора. Переходим в папку easy-rsa, для чего в командную строку скопируем команду  cd C:Program FilesOpenVPNeasy-rsa

Все операции далее совершаем через командную строку. Для создания конфигурации сервера запустим файл init-config.bat

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

Значения «server»  не изменяем. Все значения (страна, регион, город, организация, почтовый адрес) проставляем произвольно английским шрифтом. Сохраняем файл. Переходим в командную строку снова. Набираем  первой команду Vars.bat  

Если OpenVPN устанавливался ранее -набираем команду clean-all.bat  Она удалит созданную до этого  папку с ключами (keys) со всем содержимым . При установе сервера  OpenVPN с нуля  делать эту команду необязательно.

Если у вас так как на фото, нормально. Идем далее

Теперь с помощью проводника перейдем в каталог C:Program FilesOpenVPNbin и скопируем файлы библиотек (*.dll) , файл openssl.exe в каталог, где лежат наши исполняемы файлы и который открыт сейчас   в командной строке (C:Program FilesOpenVPNeasy-rsa):

Библиотеки нужны в этом каталоге, чтобы не возникало ошибок при создании сертификатов центра авторизации и файла  Диффи-Хеллмана. Начнем с последнего. Файл Диффи-Хеллмана  препятствует расшифровке информации (если файлы ключей были похищены), а так же отвечает за шифрование. Создадим его для нашего сервера в командной строке набрав команду build-dh.bat

Ждем, пока файл генерируется на основании информации указанной в vars.bat Далее, сгенерируем сертификат нашего удостоверяющего центра. Он будет необходим для  дальнейшей выдачи серверного и клиентских сертификатов. Наберем в командной строке команду build-ca.bat Последовательно и не спеша нажимаем клавишу Enter…

…после появления очередной строчки; данные в сертификате будут скопированы по значениям указанным в файле vars.bat Следующий этап —  создадим сертификат нашего сервера. В командной строке набираем команду build-key-server.batserver (server -имя серверного сертификата):

Так же последовательно и не спеша нажимаем Enter пока не дойдем до строчки Common Name(eg, your name or your servers hostname Здесь нужно обязательно указать имя сервера ( можно имя компьютера) и нажать Enter. Далее будут оставшиеся поля и запрос на создание пароля от сертификата. Просто нажимаем Enter. На вопросы записи сертификата и добавления его в базу данных  нажимаем Y и Enter

Срок действия сертификата — 10 лет.

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

В папке sample-config лежит пример файла server.ovpn, находим его, открываем блокнотом( от имени администратора!):

Прописываем маршрут OpenVPN

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

В моем примере VPN сервер не является шлюзом по умолчанию, так что маршрут нужен.

Добавляем следующую строчку:

route add -net 10.10.20.0/24 gw 192.168.94.2

Эта команда означает, что мы хотим для любого адреса из сети 10.10.20.0 255.255.255.0 отправлять все пакеты на шлюз 192.168.94.2.

Теперь закиньте что-нибудь в общую папку или просто создайте текстовый файлик, чтобы проверить, что все доступно, например так:

echo 12345 > /home/user/testshare/test.txt

После этого тестируем нашу общую папку:

Вводим учетные данные нашего Samba пользователя и видим, что всё доступно :)

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

Сертификаты внутри конфигурационного файла

Ключи сертификатов можно хранить не в отдельных файлах, а внутри конфигурационного файла ovpn.

<ca> ——BEGIN CERTIFICATE—— … ——END CERTIFICATE—— </ca>

<tls-auth> ——BEGIN OpenVPN Static key V1—— … ——END OpenVPN Static key V1—— </tls-auth>

<cert> ——BEGIN CERTIFICATE—— … ——END CERTIFICATE—— </cert>

<key> ——BEGIN PRIVATE KEY—— … ——END PRIVATE KEY—— </key>

<dh> ——BEGIN DH PARAMETERS—— … ——END DH PARAMETERS—— </dh>

* key-direction 1 — необходим для tls-auth, в противном случае, работать не будет; ca — ключ центра сертификации (ca.crt); tls-auth — ta.key; cert — открытый сертификат клиента (clients.crt); key — закрытый сертификат клиента (clients.key); dh — сертификат, созданный на базе протокола Диффи Хеллмана.

Simple Server Configuration

Along with your OpenVPN installation you got these sample config files (and many more if you check):

Start with copying and unpacking server.conf.gz to /etc/openvpn/server.conf.

Edit to make sure the following lines are pointing to the certificates and keys you created in the section above.

Complete this set with a ta key in for tls-auth like:

Edit and uncomment the following line to enable IP forwarding.

Then reload sysctl.

That is the minimum you have to configure to get a working OpenVPN server. You can use all the default settings in the sample server.conf file. Now start the server.

Be aware that the “systemctl start openvpn” is not starting your openvpn you just defined.
Openvpn uses templatized systemd jobs, openvpn@CONFIGFILENAME. So if for example your configuration file is your service is called openvpn@myserver. You can run all kinds of service and systemctl commands like start/stop/enable/disable/preset against a templatized service like openvpn@server.

You will find logging and error messages in the journal. For example, if you started a templatized service openvpn@server you can filter for this particular message source with:

The same templatized approach works for all of systemctl:

You can enable/disable various openvpn services on one system, but you could also let Ubuntu do it for you. There is config for in . Allowed values are “all”, “none” or space separated list of names of the VPNs. If empty, “all” is assumed. The VPN name refers to the VPN configutation file name. i.e. would be If you’re running systemd, changing this variable will require running followed by a restart of the openvpn service (if you removed entries you may have to stop those manually).

After “systemctl daemon-reload” a restart of the “generic” openvpn will restart all dependent services that the generator in /lib/systemd/system-generators/openvpn-generator created for your conf files when you called daemon-reload.

Now check if OpenVPN created a tun0 interface:

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

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

emerge openvpn

Подготовка ключей и сертификатов

Создайте директорию сертификатов:

mkdir /etc/openvpn/keys

Скопируйте созданные ранее PKI-ключи и сертификаты. Если клиент OpenVPN находится на той же машине, где создавались ключи, выполните:

cp /var/calculate/easy-rsa/pki/ca.crt /etc/openvpn/keys/

cp /var/calculate/easy-rsa/pki/issued/client.crt /etc/openvpn/keys/

cp /var/calculate/easy-rsa/pki/private/client.key /etc/openvpn/keys/

cp /var/calculate/easy-rsa/pki/ta.key /etc/openvpn/keys/

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

Отредактируйте файл настроек OpenVPN-клиента следующим образом:

/etc/openvpn/openvpn.conf

client
# протокол, устройство, метод сжатия
proto udp
dev tun
compress lzo
# удалённый сервер, порт
remote vpn.domain.org 1194
# оставлять без изменений устройство и файлы ключей при перезапуске туннеля
persist-tun
persist-key
remote-cert-tls server
# ключи и сертификаты
ca keys/ca.crt
cert keys/client.crt
key keys/client.key
tls-auth keys/ta.key 1
# лог
status /var/log/openvpn-status.log

Вместо впишите сетевое имя вашего VPN-сервера.

Настройка сервера OpenVPN на компьютерах под управлением Виндовс

Для завершения настройки OpenVPN сервера на Windows остается только правильно задать значения сервера и клиента.

Конфигурация сервера OpenVPN

Чтобы настроить OpenVPN сервер на Windows, заходят в папку config, которая находится в корневом каталоге утилиты, создают в ней файл server.ovpn и редактируют его, как указано на этом фото:

Содержимое созданного файла server.ovpn

В данном файле:

  • Port — назначенный сетевой порт. Лучше всего использовать номер 443 – он поможет без проблем подключаться к общественным сетям, но можно назначить любой из «лишних» портов Виндовс. Чтобы узнать, какие порты в операционной системе заняты, применяют команду netstat–a.
  • dev-node — наименование сетевого интерфейса;
  • server – полное имя подсети.

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

Важно! Используя иное значение порта, нужно обязательно убедиться, что он открыт в файрволе. Далее осталось включить созданный сервер

Для этого:

Далее осталось включить созданный сервер. Для этого:

  1. Открывают «Сетевые подключения Windows», раздел управления адаптерами.
  2. Изменяют название «TAP-адаптер» на «VPN Server» или присваивают ему иное имя, которое было вписано в строке dev-node bat-файла.
  3. При помощи горячих клавиш WIN+R активируют утилиту «Выполнить».
  4. В строке поиска появившегося окна пишут services.msc и нажимают «ОК».
  5. В открывшемся меню «Службы Windows» переходят в раздел OpenVpnService.
  6. Активируют автозапуск и нажимают «Старт». VPN-сервер начнет работу.

Включение VPN-сервера

Важно! Перед использованием службы необходимо убедиться, что новый сетевой адаптер VPN Server получил IP-адрес 172.16.10.1. Если же айпи выглядит примерно, как 169.254…, нужно отключить сервер, закрыть и заново открыть OpenVpnService, а затем снова включить адаптер

Создание клиентских сертификатов на сервере

Чтобы создать ключи для клиентов, открывают каталог easy-rsa\keys в папке, в которую была установлена утилита, находят в нем index.txt и очищают его. После этого открывают окно терминала и последовательно вводят команды:

  1. cd %ProgramFiles%\OpenVPN\easy-rsa – заходят в easy-rsa;
  2. vars.bat – запускают соответствующий файл;
  3. build-key.bat client1 – генерируют клиентский ключ.

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

В итоге должен получиться файл, примерно похожий на то, что изображено на этом фото:

Создание клиентских ключей

Все команды подтверждают нажатием клавиши Enter. Исключение – Common Name, туда подставляется значение из файла vars.bat, но с ним невозможно создать сертификат, поэтому его меняют на название клиентской машины (в примере выше – client1).

Завершают процесс двойным нажатием кнопки Y.

В конце копируют client1.key, ca.crt, dh.pem и client1.crt из папки keys на компьютер или ноутбук.

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

Настройка машины клиента

Чтобы настроить VPN на клиенте:

  1. Устанавливают на компьютер программу OpenVPN, подходящую к текущей версии Виндовс, как было описано выше.
  2. Копируют в папку \OpenVPN\config сертификаты с сервера.
  3. Открывают «Блокнот», вписывают в него команды согласно рисунку ниже и сохраняют в папке OpenVPN под именем config.ovpn.

Создание config.ovpn

Обратите внимание!  Айпи-адрес в файле принадлежит серверу. Для клиентской машины он будет внешним

Далее запускают утилиту OpenVPN GUI. Когда на панели инструментов появится ее пиктограмма, кликают по ней правой клавишей мыши и в открывшемся меню нажимают на «Подключиться». Об успешном подключении будет говорить смена цвета пиктограммы на зеленый.

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

Установка и настройка VPN cервера на основе OpenVPN для первого примера

На этапе выбора куда, собственно, все это ставить, я бы рекомендовал указать директорию, у которой путь идет без пробелов (например C:\), т.к. могут быть проблемы с работой некоторых скриптов. На этапе выбора компонент обязательно указываем OpenSSL Utilities и OpenVPN RSA Certificate Management Scripts:

Устанавливаем. В процессе установки адаптера может появиться сообщение о необходимости установить VPN драйвер. Соглашаемся и жмем «Установить»:

Как только все установили, можно приступить к настройке.

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

Для того, чтобы создать защищенное соединение, в OpenVPN используется аутентификация на цифровых сертификатах стандарта Х.509.

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

Тыкаете на него и видите свойства сертификата. Можете там же просмотреть сам сертификат и узнать кем он был выпущен:

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

Пара слов об OpenVPN

OpenVPN использует два канала: канал управления (control channel) и канал данных (data channel). В первом случае задействуется TLS — с его помощью ведется аутентификация и обмен ключами для симметричного шифрования. Эти ключи используются в канале данных, где и происходит само шифрование трафика.

Кстати, есть скрипты, которые автоматизируют установку, и процесс занимает меньше времени. Но, во-первых, данные скрипты подходят только для конкретных дистрибутивов, а во-вторых, они не предоставляют выбора. Например, используют RSA и AES-CBC, когда есть поддержка ECDSA и AES-GCM. Т.е, без знания и понимания того, как это работает, вы не сможете подправить скрипт, чтобы он исполнялся на других системах или делал то, что вы хотите.

Что такое stunnel

Stunnel — это утилита для обеспечения защищенного соединения между клиентом и сервером посредством TLS для программ, которые сами шифровать трафик не умеют. Например, можно туннелировать трафик для netcat, vnc и даже bash.

В нашем примере stunnel будет использоваться для маскировки трафика OpenVPN под «чистый» TLS, чтобы его было невозможно определить посредством DPI и, следовательно, заблокировать.

Трафик, туннелируемый через stunnel, ничем не отличается от обычного HTTPS

С учетом того что OpenVPN использует шифрование для своего канала данных, у нас есть два варианта настройки:

  • использовать шифрование stunnel плюс шифрование канала данных OpenVPN;
  • использовать шифрование stunnel, а шифрование канала данных OpenVPN отключить.

Таким образом, в первом варианте получается два слоя: один от stunnel, второй от OpenVPN. Этот вариант позволит использовать RSA вместе с ECDSA. Недостаток в том, что тратится больше ресурсов, и второй вариант позволит этого избежать. В любом случае настройка stunnel остается неизменной.

Подытожим — Что же такое OpenVPN?

OpenVPN — это и VPN-протокол с открытым исходным кодом, и VPN-программа, которая позволяет пользователям безопасно подключаться к интернету. Большинство VPN-Провайдеров предоставляют этот протокол, потому что он очень безопасен (использует библиотеку OpenSSL и 256-битное шифрование). При этом он отлично работает на множестве платформ. OpenVPN считается лучшим среди VPN-протоколов, и только SoftEther способен конкурировать с ним.

Как правило, мы рекомендуем выбирать поставщика VPN-услуг, который предлагает подключение через OpenVPN. Однако желательно, чтобы в его ассортименте были и другие VPN-протоколы на выбор.

Настройка

Сначала нам нужно создать сертификат CA. Для этого используйте следующие команды:

Если вы используете Linux, BSD или операционную систему, подобную Unix, откройте командную оболочку и запустите команду , чтобы перейти в подкаталог easy-rsa. Если вы установили OpenVPN из RPM или DEB файла, подкаталог easy-rsa обычно можно найти в /usr/share/doc/packages/openvpn или /usr/share/doc/openvpn. Лучше всего скопировать этот подкаталог (например, в /etc/openvpn) ещё до изменений. Таким образом будущие обновления пакета OpenVPN не перепишут ваши модификации.
Если вы устанавливали из файла .tar.gz, подкаталог easy-rsa будет находиться в каталоге верхнего уровня развернутого исходного дерева..

В Debian, если вы выполнили , запустите следующие команды:

Если вы используете Windows, откройте окно командной строки и запустите команду , чтобы перейти в \Program Files\OpenVPN\easy-rsa. Запустите следующий пакетный файл, чтобы скопировать файлы конфигурации на место (это перезапишет все существующие файлы vars.bat и openssl.cnf): .

Выйдите и сохраните файл vars.

В Debian, если вы выполнили , запустите эту команду: .

Затем инициализируйте PKI.

На Linux/BSD/Unix:

На Windows:

Далее, сгенерируем сертификат и приватный ключ для сервера.

На Linux/BSD/Unix: .

На Windows: .

Как и на предыдущем шаге, большинство параметров могут быть по умолчанию. Когда запрашивается Common Name, введите «server». Два других запроса требуют положительных ответов («y»): «Sign the certificate? [y/n]» и “1 out of 1 certificate requests certified, commit? [y/n]”.

Сгенерируйте сертификаты и ключи для 3 клиентов. Генерирование сертификатов клиента очень похоже на предыдущий шаг.

На Linux/BSD/Unix:

На Windows:

Помните, что для каждого клиента обязательно нужно ввести соответствующее Common Name при появлении запроса, то есть «client1», «client2» или «client3». Всегда используйте уникальное общее имя для каждого клиента.

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

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

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

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