пятница, 28 декабря 2012 г.

Компьютерные сети и сетевые порты


Компьютерные сети и сетевые порты


План:

1. Принцип устройства компьютерной сети
2. Сетевые порты

1. Принцип устройства компьютерной сети


ip-адрес:

Компьютеры связываются между собой с помощью адресов, представленных цифрами. Cистема исчисления у компьютеров двоичная, т.е. адрес компьютера представляет собой последовательность из нулей и единиц (1010010101....) и длина этой последовательности равна 32 знакам. Для удобства и наглядности для человека эту последовательность цифр разбили на 4 части и перевели в десятичную систему. Получилось, что 32 единицы = 255.255.255.255 (8 единиц = 2 в 8 степени - 1 = 256 - 1 = 255).

Маска подсети:

Для удобства компьютера и наглядности пользоваеля, разбили этот адрес, и получилось, что первая часть 32-значного адреса отвечает за адрес подсети, а вторая часть - за адрес хоста. Но разделили не пополам. Для определения длины подсети используется маска. Например, маска 255.255.255.0 в двоичной форме представляет собой последовательность из 24 единиц и 8 нулей (255 в десятичной системе исчисления = 11111111 в двоичной системе, по-этому 255.255.255.0 = 11111111 11111111 11111111 00000000). Это говорит о том, что первые 24 бита ip-адреса - подсеть, а остальные 8 бит - адрес хоста в этой подсети. Это нужно для того, чтобы компьютер, формируя пакет для другого компьютера, посмотрел на свою и его подсеть и сравнив их понял, куда слать пакет. Если подсеть одинаковая - значит напрямую компьютеру-получателю, если разная - то шлюзу. Маску так же часто записывают в виде целого числа через дробь после ip-адреса: 192.168.0.1/24 , 62.5.246.190/30 и так далее. Это как раз указывается количество единиц в маске. Т.е. 192.168.0.1/24 = 192.168.0.1/255.255.255.0. В случае с /30 тут расчеты будут немного сложнее (неочевиднее). 30 = 11111111 11111111 11111111 11111100. Можно воспользоваться ip-калькулятором (http://jodies.de/ipcalc), но если нужно вручную, то лично я считал бы так: /30 до 255.255.255.255 не хватает 3:
11111111 11111111 11111111 11111100 + 1 = 11111111 11111111 11111111 11111101
11111111 11111111 11111111 11111101 + 1 = 11111111 11111111 11111111 11111110
11111111 11111111 11111111 11111110 + 1 = 11111111 11111111 11111111 11111111
Значит /30 = 255.255.255.255 - 3 = 255.255.255.252
Теперь про то, как компьютер определяет, в одной он подсети с получателем или в разных. Допустим, что компьютер с адресом и маской 192.168.0.1/24 отправляет пакет для компьютера 192.168.0.254. 
11111111.11111111.11111111.00000000 (255.255.255.0 = 24)
11000000.10101000.00000000.00000001 (192.168.0.1)
11000000.10101000.00000000.11111110 (192.168.0.254)
Теперь компьютеру осталось только сравнить те части ip-адресов (своего и получателя), которые лежат под единичками маски. В нашем случае 11000000.10101000.00000000 - одинаковые, значит они в одной подсети.

Маршрутизация, шлюз:

Когда я говорю "напрямую слать пакет туда-то", или "слать пакет шлюзу", я должен сразу рассказать о том, как же это происходит: сформированный пакет просто выбрасывается в провод, а дальше его ловят все, до кого он дошел. По идее, компьютеры сверяют информацию о получателе в пакете со своими данными и в случае несовпадения просто отбрасывают его. Информация, которая нас интересует: MAC-адрес получателя, ip-адрес получателя. Когда мы посылаем пакет через шлюз, то компьютер указывает MAC-адрес шлюза (который он сам получит из ip-адреса шлюза с помощью arp-запроса), и ip-адрес конечного компьютера. Шлюз - специально настроенный ПК или сетевое оборудование, которое принимает пакеты не только для себя (у которых адрес получателя соответствует его адресу), но и для других компьютеров. Можно указывать несколько шлюзов (это делается в таблице маршрутизации), один из которых можно назначить шлюзом по умолчанию (который использовать, если остальные не подходят). Чаще всего шлюз связывает две сети - локальную и глобальную. В этом случае он помимо передачи пакетов из одной сети в другую еще вносит некоторые изменения в передаваемые пакеты (NAT).

DNS:

Когда мы пытаемся подключиться к "страничке" http://www.yandex.ru, компьютер должен сформировать пакет-запрос для удаленного компьютера, на котором эта страничка находится. Для того, чтобы узнать адрес этого компьютера ему необходимо сначала просмотреть локальный файл hosts (в windows - C:/windows/system32/drivers/etc/hosts, в linux - /etc/hosts) и если там нет записей с этим именем, то послать запрос ДНС-серверу, который получит http://www.yandex.ru и вернет его 32-битный адрес. Если же ДНС-сервер не отвечает, то мы отправляем запрос второму ДНС-серверу.
На апельсинах: Сначала идем в записную книжку своего мобильного телефона и ищем там "Серёгу", если там его нет, то звоним Антону (он знает номера всех людей на планете). Антон нам говорит номер Серёги, после чего звоним Сереге. Если же Антон сам не поднимает трубку, то звоним его брату Коляну, у них по-идее одна записная книжка на двоих.
Соответственно: если Вам кто-то сказал, что у него не работает интернет, проверьте, может быть у него просто не прописаны или прописаны неправильные ДНС-сервера. Проверить это можно "попинговав" сначала yandex.ru, а потом его ip-адрес: 77.88.21.11.

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

Так уж договорились, что адреса, относящиеся к подсетям, представленным ниже, не используются в интернете в качестве реальных адресов.
10.0.0.0 — 10.255.255.255 (одна сеть класса A)
172.16.0.0 — 172.31.255.255 (шестнадцать сетей класса B)
192.168.0.0 — 192.168.255.255 (256 сетей класса C)
Это и есть "серые", "внутренние" адреса. Их используют в обособленных компьютерных сетях, которые если и имеют подключение к интернет, то через особый компьютер (шлюз), у которого есть внешний адрес (ну или он может быть в сети с тем компьютером, у которого внешний адрес и т.д.). Особый он тем, что у него настроен forwarding (пропуск) пакетов из одной сети в другую через него. Если у этого шлюза вторая сеть - интернет, и адрес как раз реальный (внешний), то необходимо настроить на нем технологию транслирования сетевых адресов (network address translation, NAT). Это делается для того, чтобы сетевые пакеты из локальной сети, прошедшие через него в интернет не имели серого адреса-отправителя, т.к. в этом случае сервер, для которого предназначен пакет, не поймет, кому именно из миллионов локальных сетей возвращать ответный пакет. При использовании NAT, шлюз меняет адрес-отправителя на свой внешний адрес, а у себя записывает "ответные пакеты с этого сервера перенаправлять такому-то компьютеру...". В этом случае используется SNAT (source network address translation).
Если же нам необходимо изменять адрес получателя (например, в нашей локальной сети есть почтовый сервер с серым адресом, а мы бы хотели иметь к нему доступ из интернета), то можно использовать на нашем шлюзе DNAT (destination network address translation) или, как говорят в простонародье "проброс портов". То есть мы указываем в правилах файервола, что пакеты, предназначенные нам и пришедшие на порт 110 перенаправлять на внутренний серый адрес почтового сервера.



2. Сетевые порты


Наш компьютер, находясь в одной сети с другими устройствами/компьютерами обменивается с ними данными благодаря сетевым протоколам. Сетевой протокол – набор правил, позволяющий осуществлять соединение и обмен данными между двумя или более компьютерами. Передаваемые данные могут быть самыми разными, соответственно, некоторые из них передаются по одним протоколам, некоторые - по другим. Существует множество различных протоколов, например, TCP, UDP, ICMP, GRE и т.д. Грубо говоря - TCP - самый распространенный сетевой протокол. С его помощью мы открываем страницы сайта, обмениваемся почтой, общаемся в чатах. Не стоит забывать и про UDP-протокол, по которому идут DNS-запросы и ответы, компьютерные сетевые игры. Оба этих сетевых протокола (TCP и UDP), в отличие от других протоколов, имеют такой критерий, как ПОРТ (отправителя или получателя). Если говорить простым языком - порт предназначен для того, чтобы компьютер, получивший некоторый запрос, знал, какому приложению этот запрос передать на дальнейшую обработку. Количество портов у компьютера ограничено: от нуля до 65535, причем, порты с 0 по 1023 - зарезервированные некоторыми службами, но это не запрещает нам их использовать.

Допустим, на нашем сервере работает apache (http-сервер) с какими-то сайтами. Другому компьютеру, имеющему маршрут до нашего компьютера, для отображения этих сайтов необходимо послать запрос нашему серверу: "покажи-ка мне сайт". Сервер (его сетевая подсистема) его принимает, передает его программе (в данном случае apache), та его обрабатывает, генерирует ответ, передает обратно сетевой подсистеме, а та уже отсылает его исходному компьютеру. Сетевой подсистеме абсолютно все равно, что за запрос, кому она передала. Все происходит абстрактно. А как же она поняла, кому передавать запрос? Ведь на нашем сервере еще работают несколько служб, обрабатывающих запросы из сети: удаленное управление сервером, фтп-сервер, базы данных. И ко всем им подключаются по сети. Неужели сетевая подсистема отсылает всем подряд, а те уже в свою очередь сами разбираются, нужно оно им или нет?! Ни в коем случае. Мы же четко указали ему "покажи-ка мне сайт". Именно "сайт", а не что-либо другое. А как мы это сделали? Вот тут возвращаемся обратно к теории.
На самом деле я немного приврал. Компьютер не может послать запрос именно на "сайт". Для идентификации службы, которая должна обработать запрос существует числовое поле, называемое "портом". Таким образом, при запуске сетевой службы на сервере необходимо указать этот самый порт, который она будет слушать. Причем если он уже занят, то запустить её не удастся.

Порты с 0 по 1023 - зарезервированные некоторыми службами. Это какими?
На примере TCP протокола: Порт 80 зарезервирован http, 22 - ssh, 25 и 110 - отправка и прием почты.
Подробнее:
http://ru.wikipedia.org/wiki/Список_портов_TCP_и_UDP
http://ru.wikipedia.org/wiki/Зарезервированные_порты_TCP/UDP

Но в тоже время, это не запрещает нам их использовать.
Так и есть: если на нашем сервере не запущена служба ssh, или она не занимает порт 22, то мы можем спокойно указать службе apache использовать этот порт. Правда тогда сайт наш будет открываться не сразу. Когда мы открываем интернет-браузер (firefox, opera, ie, safari) и вводим в строке адреса "адрес.домен" (например ubuntuserveradmin.blogspot.ru), что компьютер делает?
1. идет в свой кеш днс-запросов.
2. не находит там ip-адрес ubuntuserveradmin.blogspot.ru
3. идет в hosts
4. не находит там ip-адрес ubuntuserveradmin.blogspot.ru
5. сравнивает по маске ip-адрес dns-сервера со своим
6. посылает dns-запрос шлюзу, чтобы тот передал его dns-серверу
7. получает ip-адрес сервера, обрабатывающего сайт ubuntuserveradmin.blogspot.ru
8. формирует http-запрос этому ip-адресу (опять-же через шлюз)
9. получает ответ
10. передает его интернет-браузеру, а тот уже сам разбирается.

Где-же тут порты?
dns-запрос, http-запрос - по сути заголовки этих пакетов (конверты) отличаются не только адресом получателя (dns-сервер и сервер ubuntuserveradmin.blogspot.ru), но еще и портом назначения. Если бы порт был и в том и в другом случае одинаковым, то наш dns-сервер отбросил бы его, сказав "эй, у меня нет сайтов, я всего лишь днс", или сервер ubuntuserveradmin.blogspot.ru заявил бы: "я не днс, парень, ты чего". ДНС-запрос был послан ДНС-серверу на 53 порт протокола UDP, а HTTP-запрос - на 80 порт протокола TCP.

Но если мы перевесим нашу службу на 22 порт, то сайт не будет открываться. Порт №80 интернет-браузер подставляет сам автоматически, т.к. он используется по-умолчанию. Если мы указываем ftp://domain.ru, то браузер подставит порт №21 (фтп). В нашем случае в строке адреса необходимо указать явно порт назначения через двоеточие:
ubuntuserveradmin.blogspot.ru:22

Чтобы узнать, какие порты слушает мой компьютер, существует утилита netstat. Её вывод очень длинный, немного непонятный с первого раза. По-этому мы воспользуемся некоторыми ключами:
-n - не пытаться преобразовать ip-адреса в dns-доменные имена
-a - ой, по-моему, показывать не только соединенные, но и "слушающие" (принимающие соединения)
-p - показать программу (сервис), которая слушает этот порт
-t - tcp
-u - udp
Код: Выделить всё
netstat -pnatu
Разберем вывод
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3016/sshd
tcp 0 0 0.0.0.0:110 0.0.0.0:* LISTEN 3516/dovecot
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 3506/vsftpd
tcp 0 0 192.168.0.1:3128 0.0.0.0:* LISTEN 3597/(squid)
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 3414/master
tcp 0 0 192.168.0.1:53 0.0.0.0:* LISTEN 2991/named
tcp 0 300 192.168.0.1:22 192.168.0.2:2497 ESTABLISHED 32318/sshd: user
udp 0 0 192.168.0.1:53 0.0.0.0:* LISTEN 2991/named
Отображен список слушающих (LISTEN) и установленных (ESTABLISHED) соединений. Видим, что установленное только одно - на tcp порт 22, программа, обслуживающая этот порт - sshd (secure shell deamon). Что еще видно из списка: на 22 порту висит ссш, на 21 - фтп, 25 и 110 - почта, 3128 - прокси, 53 - днс.

Чтобы узнать, какие порты слушает другой компьютер существует другая утилита - nmap. У неё очень много полезных опций, но они не очень подходят к нашей теме. Приведу самое простое использование сканирования портов
Код: Выделить всё
nmap 192.168.0.2
Starting Nmap 4.62 ( http://nmap.org ) at 2009-09-01 16:56 MSD
Interesting ports on (192.168.0.2):
Not shown: 1705 closed ports
PORT STATE SERVICE
21/tcp open ftp
22/tcp open ssh
25/tcp open smtp
110/tcp open pop3
111/tcp open rpcbind
139/tcp open netbios-ssn
389/tcp open ldap
445/tcp open microsoft-ds
995/tcp open pop3s
5432/tcp open postgresql
MAC Address: 00:80:48:2A:42:30 (Compex Incorporated)
Nmap done: 1 IP address (1 host up) scanned in 0.571 seconds


Это всё необходимо знать для:
Во-первых, для общего развития.
Во-вторых, эта информация просто необходима при настройке файервола. Ведь для него существует такой критерий, как порт назначения. Таким образом, можно разрешить, например, все, кроме ICQ, заблокировав пакеты на порт 5190, или наоборот.
В-третьих, если необходимо сделать проброс или перенаправление портов (в том же самом файерволе)
В-четвертых, если нужно повесить службу на другой порт (в целях безопасности, например)

Комментариев нет:

Отправить комментарий