вторник, 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 для работы с аутентификацией по ключу. Организация частных виртуальных сетей может быть очень полезной не только в организациях, но и скажем для обмена данными между двумя вашими компьютерами или для повышения безопасности в сети.