вторник, 25 апреля 2017 г.

Как посмотреть открытые порты в Linux

Если порт открыт это означает, что какая либо программа (например сервис) использует его для связи с другой программой через интернет или в локальной системе. Чтобы посмотреть какие порты открыты в вашей системе Linux можно использовать команду netstat. В выводе будут показаны все сервисы и прослушиваемые ими порты и ip адреса.

Способ 1. netstat

$ sudo netstat -ntulp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:139 0.0.0.0:* LISTEN 2392/smbd
tcp 0 0 0.0.0.0:9518 0.0.0.0:* LISTEN 2894/skype
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 2896/vlc
tcp 0 0 127.0.0.1:3493 0.0.0.0:* LISTEN 2467/upsd
...
Здесь:
  • -l или --listening - посмотреть только прослушиваемые порты
  • -p или --program - показать имя программы и ее PID
  • -t или --tcpпоказать tcp порты
  • -u или --udp показать udp порты
  • -n или --numeric показывать ip адреса в числовом виде

Способ 2 lsof

Утилита lsof позволяет посмотреть все открытые в системе соединения, в том числе и сетевые, для этого нужно использовать опцию i.
$ sudo lsof -i
dhcpcd 2136 root 6u IPv4 4986 0t0 UDP *:bootpc
ntpd 2213 root 27u IPv6 5598 0t0 UDP [fe80::7879:19ff:fe51:f833]:ntp
hamachid 2323 root 8u IPv4 5587 0t0 TCP 192.168.1.2:35445->212.118.234.65:https (ESTABLISHED)
smbd 2392 root 27u IPv6 5624 0t0 TCP *:microsoft-ds (LISTEN)
sshd 2421 root 3u IPv4 6196 0t0 TCP *:ssh (LISTEN)
upsd 2467 nut 4u IPv4 6235 0t0 TCP comm-app.local:nut (LISTEN)
...
Еще один пример, смотрим какие процессы работают с портом 80:
$ sudo lsof -i | grep 80
ntpd 2213 root 23u IPv6 5422 0t0 UDP [fe80::beae:c5ff:febe:8bb7]:ntp
ntpd 2213 root 27u IPv6 5598 0t0 UDP [fe80::7879:19ff:fe51:f833]:ntp
skype 2894 serigy 87u IPv4 7080 0t0 TCP *:9518 (LISTEN)
chrome 3114 sergiy 122u IPv4 31904 0t0 TCP 192.168.1.2:47804->srv118-131-240-87.vk.com:https (ESTABLISHED)

Способ 3. nmap

Nmap - мощный сетевой сканер,  разработанный для сканирования и пентестинга удаленных узлов, но ничего не мешает направить его на локальный компьютер:
$ nmap localhost
Starting Nmap 6.47 ( http://nmap.org ) at 2015-08-02 17:27 EEST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00036s latency).
Other addresses for localhost (not scanned): 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1 127.0.0.1
rDNS record for 127.0.0.1: comm-app.local
Not shown: 995 closed ports
PORT STATE SERVICE
22/tcp open ssh
139/tcp open netbios-ssn
445/tcp open microsoft-ds
3493/tcp open nut
8080/tcp open http-proxy
Nmap done: 1 IP address (1 host up) scanned in 0.10 seconds
Детальнее об опциях сканирования в Nmap можно узнать в статье как просканировать сеть в Nmap.
Если вы хотите посмотреть какие порты на компьютере доступны снаружи, здесь тоже пригодится Nmap. Если компьютер - общедоступный сервер, то результат скорее всего не будет отличатся от локального сканирования, но на домашнем компьютере все немного по другому. Первый вариант - используется роутер и в сеть будут видны только порты роутера, еще одним порогом защиты может стать NAT сервер провайдера. Технология NAT позволяет нескольким пользователям использовать один внешний IP адрес. И так для просмотра открытых внешних портов сначала узнаем внешний ip адрес, для надежности воспользуемся онлайн сервисом:
$ wget -O - -q icanhazip.com
178.93.149.50
Дальше запускаем сканирование:
$ nmap 178.93.149.50
В результате мы можем получить открытый порт 80 веб сервера, или даже 21 - файлового сервера, которых мы не устанавливали, эти порты открыты роутером, 80 - для веб-интерфейса, а 21 для может использоваться для обновления прошивки. А еще можно вообще не получить результатов, это будет означать что все порты закрыты, или на сервере установлена система защиты от вторжений IDS.

вторник, 4 апреля 2017 г.

Настройка OpenVPN в Ubuntu

Настоящая частная виртуальная сеть или Virtual Private Network (VPN)  - это зашифрованное соединенный туннель между двумя сетями, который соединяет две доверенные точки. Это не веб-протокол HTTPS, который считает доверенными всех клиентов. К VPN могут подключиться только те клиенты, которые имеют специальные ключи доступа.
Понятие VPN в наши дни стало очень растянутым, после появления частных виртуальных сетей, которые доверяют всем и распространения HTTPS. Многие из сетей VPN представляют из себя коммерческие решения с минимальным количеством настроек для обеспечения удаленного доступа сотрудников. Но не все доверяют этим решениям. Частная виртуальная сеть соединяет две сети в одну, например, сеть офиса и домашнюю сеть работника. Сервер VPN необходим для того чтобы сервер и клиент могли пройти аутентификацию друг с другом.
Настройка аутентификации сервера и клиента требует много работы, и поэтому коммерческие решения с минимумом настроек проигрывают в этом плане. Но на самом деле не так уж трудно установить сервер OpenVPN. Вам понадобится два узла в разных сетях чтобы организовать тестовое окружение, например, можно использовать несколько виртуальных машин или реальные серверы. Как вы уже поняли, в этой статье будет рассмотрена настройка OpenVPN в Ubuntu для создания полноценной частной виртуальной сети.

Установка OpenVPN

На обоих машинах должен быть установлен OpenVPN, это довольно популярная программа, поэтому вы можете установить ее из официальных репозиториев. Также нам понадобится Easy-RSA для работы с секретными ключами. Для установки программ в Ubuntu используйте такую команду:
$ sudo apt install openvpn easy-rsa
Оба пакеты должны быть установлены как на сервере, так и на клиенте. Они понадобятся для настройки программы. Первый этап статьи установка и настройка openvpn завершен.

Настройка центра сертификации

Первое что нужно сделать, это создать правильную инфраструктуру для открытых ключей на сервере. Сервером мы считаем ту машину, к которой будут подключаться пользователи. Собственный центр сертификации дает несколько преимуществ, у вас будет собственный орган сертификации, который упростит распространение ключей и управление ими. Например, вы можете отозвать сертификаты клиента на сервере. Также теперь не нужно хранить все клиентские сертификаты, центру сертификации будет достаточно знать, что сертификат подписан CA. Кроме сложной системы ключей, вы можете использовать статические ключи, если нужно предоставить доступ только нескольким пользователям.
Обратите внимание, что все секретные ключи должны находится в надежном месте. В OpenVPN открытый ключ называется сертификатом и имеет расширение .crt, а закрытый ключ так и называется ключом, его расширение - .key.
Сначала создайте папку для хранения сертификатов Easy-RSA. Фактически, конфигурация OpenVPN выполняется вручную, так что папку можно разместить где угодно:
$ sudo mkdir /etc/openvpn/easy-rsa
Затем скопируем в эту папку все необходимые скрипты easy-rsa:
$ sudo cp -R /usr/share/easy-rsa /etc/openvpn/
Далее нам нужно создать центр сертификации в этой папке. Для этого перейдите в нее и выполните такие команды:
$ cd /etc/openvpn/easy-rsa/
$ sudo -i
# source ./vars
# ./clear-all
# ./build-ca

Первой командной мы переключаемся в консоль от имени суперпользователя, второй загружаем переменные окружения из файла ./vars. Команда ./clear-all создает папку keys если ее нет и очищает ее содержимое. И последняя команда инициализирует наш центр сертификации. Теперь в папке .keys появились все необходимые ключи:

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


Дальше нужно повторить процедуру копирования скриптов управления RSA, как мы это делали на сервере:
$ sudo cp -R /usr/share/easy-rsa /etc/openvpn/

Теперь нам нужно скопировать сертификат, файл с расширением .crt в папку /etc/openvpn на всех клиентах. Например, скачаем этот файл для нашего клиента с помощью scp:
$ sudo scp пользователь@хост:/etc/openvpn/easy-rsa/keys/ca.crt /etc/openvpn/easy-rsa/keys
Только теперь можно создать свой секретный ключ на основе сертификата CA:
$ cd /etc/openvpn/easy-rsa/
$ sudo -i
# source ./vars
# build-req Sergiy
Обратите внимание, что ca.crt должен лежать в папке с ключами, иначе ничего не сработает. Теперь утилита создаст ключ, на основе которого, вы сможете подключиться к OpenVPN серверу, но вам еще осталось подписать его на сервере. Отправьте полученный .csr файл на сервер с помощью того же самого scp:
$ scp /etc/openvpn/easy-rsa/keys/Sergiy.csr пользователь@хост:~/
Затем уже на сервере в папке /etc/openvpn/easy-rsa нужно выполнить команду подписи сертификата:
# ./sign-req ~/Sergiy
Подпись сертификата нужно подтвердить. Затем программа сообщит что он был подписан и добавлен в базу данных. В папке с сертификатом csr появится файл .crt, который нужно вернуть назад на клиентскую машину:
$ sudo scp пльзователь@хост:/home/Sergiy.crt /etc/openvpn/easy-rsa/keys
Только после этого сервер и клиент имеют все необходимые ключи для подключения и установки связи. Осталось еще несколько настроек. Если вы планируете использовать шифрование TLS, то необходимо создать на сервере набор данных Диффи-Хафмана, для этого используйте команду:
$ ./build-dh
Дальше будет рассмотрена настройка OpenVPN для сервера и клиента, осталось совсем немного до получения рабочей конфигурации.

Настройка OpenVPN

Теперь настройка сервера OpenVPN. По умолчанию, в папке конфигурационных файлов OpenVPN ничего нет. Их нужно создать самостоятельно в зависимости от того, что планируется настраивать, сервер или клиент. Нужный файл конфигурации OpenVPN можно найти по адресу /usr/share/doc/openvpn/examples/sample-config-files/. Сначала создадим конфигурационный файл для сервера:
$ zcat /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf
Здесь вам нужно настроить несколько параметров:
port и proto - порт и протокол, по которым будет работать программа;
port 1194
proto udp
Все созданные ключи нужно прописать в конфигурационном файле. Наши ключи хранятся по адресу /etc/openvpn/easy-rsa/keys:
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/ca.crt
key /etc/openvpn/easy-rsa/keys/ca.key
dh /etc/openvpn/easy-rsa/keys/dh.pem
Настраиваем диапазон адресов для виртуальной сети, наш сервер будет доступен по первому из них - 10.8.0.1:
server 10.8.0.0 255.255.255.0
После завершения настройки сохраните изменения в файле, вы можете либо вставить всю эту конфигурацию себе или отредактировать файл с примером. Готовые рабочие настройки сервера:
port 1194
proto udp
comp-lzo
dev tun
ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/ca.crt
dh /etc/openvpn/easy-rsa/2.0/keys/dh2048.pem
topology subnet
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
Настройка сервера OpenVPN завершена. Дальше необходимо запустить OpenVPN сервер. Это можно сделать прямо из командной строки, просто укажите адрес конфигурационного файла:
$ openvpn /etc/openvpn/server.conf
Дальше нам нужно настроить компьютер клиента. Вы можете аналогично скопировать конфигурационный файл из директории с примерами, только на этот раз его не нужно распаковывать:
$ sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf  /etc/openvpn/client.conf
Вы можете создать несколько конфигурационных файлов клиента для подключения к разным серверам. Откройте конфигурационный файл и измените в нем такие параметры:
remote - это ваш адрес сервера OpenVPN, адрес и порт должны совпадать с настроенными на сервере, например:
remote 194.67.215.125 1194

ca - ключ, который вы получили от центра сертификации, мы расположили его в папке /etc/openvpn/.
cert и key - это открытый и секретный ключи клиента, с помощью них вы и будете подключаться к серверу. Как вы помните, мы сохранили их в папке /etc/openvpn/easy-rsa/keys/.
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/Sergiy.crt
key /etc/openvpn/easy-rsa/keys/Sergiy.key
Остальные настройки можно оставить как есть. Вот файл настройки целиком, который вы можете скопировать:
client
dev tun
proto udp
remote 194.67.215.125 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/Sergiy.crt
key /etc/openvpn/easy-rsa/keys/Sergiy.key
tls-auth ta.key 1
comp-lzo
verb 3
Сохраните настройки, теперь клиент готов к подключению. Обратите внимание, что конфигурационные файлы должны максимально совпадать, отсутствие определенных опций в одном из файлов может привести к ошибкам. Это не значит, что файлы будут идентичны, но основные параметры openvpn должны быть одинаковыми. Вам осталось запустить OpenVPN на этой машине используя этот конфигурационный файл:
$ openvpn /etc/openvpn/client.conf
Готово, теперь все работает, если вы выполните ifconfig, то увидите что был добавлен интерфейс tun0:
$ ifconfig

Также вы можете попробовать выполнить ping адреса 10.8.0.1, именно этот адрес мы настроили для нашего сервера OpenVPN, пакеты ping будут нормально отправляться. Если пакеты не идут, или еще что-то не работает, обратите внимание на вывод обоих программ, возможно, возникли какие-либо ошибки или предупреждения, также убедитесь, что брандмауэр сервера разрешает доступ извне по udp для порта 1194. Еще можно запустить сервер или клиент, настроив в конфиге уровень подробности на максимум verb 9. Очень часто это помогает понять почему что-то не работает.

Выводы

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

суббота, 18 марта 2017 г.

Как пользоваться nslookup

 Иногда может возникнуть необходимость проверить работоспособность DNS, посмотреть как быстро работает сервер, увидеть IP адрес и скорость его получения для определенного домена. Для этого используется утилита nslookup. С помощью нее вы можете не только получить IP адрес по домену, но и выполнить обратное преобразование, а также проверить установлены все необходимые записи DNS.
В этой статье мы рассмотрим как пользоваться nslookup, что делает эта утилита, а также ее синтаксис и опции.

Как работает DNS?

Служба DNS позволяет преобразовывать сложные для запоминания ip адреса в простые и легкие доменные имена, которые намного проще запомнить. Если не вдаваться в подробности, то существует сеть DNS серверов, на которых хранится вся необходимая информация об IP адресах  и соответствующих им доменах. Время от времени они обмениваются между собой информацией, чтобы база данных была полной и актуальной.
Когда компьютеру нужно обратиться к какому-либо сайту по домену, он запрашивает его IP адрес у DNS сервера, а затем сохраняет его в локальном кэше. Но DNS запросы могут отсылаться не только автоматически, их может формировать и отправлять утилита nslookup в Linux или Windows.

 Команда nslookup

Перед тем как мы перейдем дальше, к практике и примерам, давайте рассмотрим синтаксис и опции утилиты. Синтаксис достаточно прост:
$ sudo nslookup опции домен сервер
Домен - это то доменное имя, для которого необходимо посмотреть информацию, а сервер - необязательный параметр, который указывает, что нужно использовать другой dns сервер. Основные опции nslookup:
  • -type - тип информации, которую хотим получить, возможные типы: txt, soa, ptr, ns, mx, mr, minfo, mg, mb, hinfo, gid, cname, a, any;
  • -port - другой порт DNS сервера;
  • -recurse - использоваться другие DNS серверы, если на этом нет ответа;
  • -retry - количество попыток получить нужную информацию;
  • -timeout - время между попытками запросов к серверу;
  • -fail - пробовать другой сервер имен, если этот вернул ошибку.
Самое интересное, что команду можно выполнять не только в обычном, но и в интерактивном режиме, если запустить ее без параметров. А теперь перейдем ближе к самим примерам как работает команда nslookup linux.

Как пользоваться nslookup?

Сначала посмотрим ip адрес для losst.ru. Для этого не нужно передавать никаких дополнительных параметров, только само доменное имя:
$ nslookup losst.ru


В выводе утилиты мы можем видеть ip адрес 192.168.137.1, это не адрес сервера, а наш, системный DNS сервер. В следующей строке выводится тот же ip адрес и порт, это адрес DNS сервера вместе с портом. По умолчанию порт - 53. И только после этого находится информация про запрашиваемый сайт. Наш ip адрес 194.67.215.125, это означает, что все пакеты, которые вы будете отправлять на losst.ru будут приходить на этот адрес.
Иногда вы можете получить в ответе утилиты сообщение "Non-authoritative answer". Ответ считается авторитетным, только если наш DNS сервер имеет полную информацию о зоне, для рассматриваемой области. Чаще всего, у нашего сервера будет не вся информация, а кэш последнего ответа от авторитетного сервера. Такая информация считается не авторитетной, хотя она была получена из авторитетного источника, но сам DNS сервер таковым не считается.
Также вы можете выполнить обратное преобразование IP адреса в домен. Для этого передайте утилите IP адрес:
$ nslookup 194.67.215.125
Первоисточник информации о домене, это его ns сервера. Вы можете их получить, использовав команду с опцией type=ns:
$ nslookup -type-ns losst.ru
Команда выведет список используемых серверов имен, например, у нас это ns1.nameself.com. Обычно это от двух до четырех серверов. Если есть авторитетный источник для получения информации, то он указывается в нижней части вывода. Например, если мы запросим информацию у сервера имен ns1.nameself.com, то это уже будет авторитетный ответ:
$ nslookup losst.ru ns1.nameself.com
Еще вы можете получить MX запись для домена, для этого нужно установить тип запроса в mx:
$ nslookup -type=mx linux.com
Здесь будут отображены все настроенные почтовые серверы, у каждого сервера есть свой приоритет, например, 10, 15 или 5. Чем меньше число, тем выше приоритет адреса.
SOA или Start Of Authority предоставляет техническую информацию о домене, для получения этого поля используйте тип запроса soa:
$ nslookup -type=soa losst.ru
Здесь будет выведена такая информация:
  • origin - происхождение полученной информации;
  • mail addr - адрес электронной почты администратора домена;
  • serial - время с момента последнего обнволения домена в формате timestamp;
  • refresh - количество секунд, с момента последнего обновления, когда его нужно повторить;
  • retry - количество секунд, через которое нужно повторить попытку подключения, если DNS сервер недоступен;
  • expire - количество секунд, по истечении которых полученная от первичного DNS информация будет считаться устаревшей;
  • minimum - минимальное количество секунд до следующего обновления.
Также возможно использование nslookup для просмотра всех доступных записей DNS:
$ nslookup -type=any losst.ru
Для просмотра более подробной информации про выполнение запроса вы можете использовать опцию -debug:
$ nslookup -type=any -debug linux.com
Здесь отображается сообщение, отправленное на сервер и полученный от него ответ. Если ip адресов несколько, то система может отобразить ttl для каждого из них. Некоторые крупные сайты размещены на нескольких серверах, это сделано для противостояния DDoS атакам.
Команда nslookup linux может использоваться и в интерактивном режиме, для этого нужно выполнить ее без параметров:
$ nslookup
Дальше просто наберите имя домена, чтобы узнать его IP:
losst.ru
С помощью команды set вы можете задавать различные параметры, например, порт, или тип запроса:
set port=53
set type=mx


Чтобы завершить работу с утилитой, используйте команду exit.