1 (23.02.2010 17:34:10 отредактировано forkostya)

Автор: Кузнецов Константин

[size=+3]Компьютерные сети и сетевые порты[/size]

План:
1. Принцип устройства сети
2. Сетевые порты

-----------------------------------------------------------------------------------------

[size=+2]1. Принцип устройства сети[/size]

Компьютеры связываются между собой с помощью адресов, представленных цифрами. Cистема исчисления у компьютеров двоичная, т.е. адрес компьютера представляет собой последовательность из нулей и единиц (1010010101....) и длина этой последовательности равна 32 знакам. Для удобства и наглядности для человека эту последовательность цифр разбили на 4 части и перевели в десятичную систему. Получилось, что 32 единицы = 255.255.255.255 (8 единиц = 2 в 8 степени - 1 = 256 - 1 = 255).
На апельсинах: телефонная связь тоже работает с цифровыми адресами (4951234567).
Маска подсети:
Для удобства компьютера и наглядности пользоваеля, разбили этот адрес, и получилось, что первая часть 32-значного адреса отвечает за адрес подсети, а вторая часть - за адрес хоста. Но разделили не пополам. Для определения длины подсети используется маска. Например, 255.255.255.0 - последовательность из 24 единиц и 8 нулей - говорит о том, что первые 24 символа (бита) адреса - подсеть, а остальные 8 бит - адрес хоста в этой подсети. Это нужно для того, чтобы компьютер, формируя пакет для другого компьютера, посмотрел на свою и его подсеть и сравнив их понял, куда слать пакет. Если подсеть одинаковая - значит напрямую компьютеру-получателю, если разная - то шлюзу.
На апельсинах: в Москве телефонные номера могут быть в коде 495 или 499. Когда мы смотрим на весь номер (4991234567) мы автоматически понимаем, в одной "подсети" мы с ним или нет. Если в одной, то звоним напрямую 1234567, а если в разных, то через "шлюз" - восьмерку.
Шлюз:
Когда я говорю "напрямую слать пакет туда-то", или "слать пакет шлюзу", я должен сразу рассказать о том, как же это происходит: сформированный пакет просто выбрасывается в провод, а дальше его ловят все, до кого он дошел. По идее, компьютеры сверяют информацию о получателе в пакете со своими данными и в случае ошибки просто отбрасывают его. Информация, которая нас интересует: MAC-адрес получателя, ip-адрес получателя. Когда мы посылаем пакет через шлюз, то компьютер указывает MAC-адрес шлюза (который он сам получит из ip-адреса шлюза с помощью arp-запроса), и ip-адрес конечного компьютера.
На апельсинах: Раньше нужно было звонить "девушке" и просить её соединить с "Ларисой Ивановной". Номер девушки и есть аналогия MAC-адресу шлюза.
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 перенаправлять на внутренний серый адрес почтового сервера.

-----------------------------------------------------------------------------------------

[size=+2]2. Сетевые порты[/size]

Расскажи-ка нам, Костян, про сетевые порты. Что это, зачем нужно?
Наш компьютер, находясь в одной сети с другими устройствами/компьютерами обменивается с ними данными благодаря сетевым протоколам. Сетевой протокол – набор правил, позволяющий осуществлять соединение и обмен данными между двумя или более компьютерами. Передаваемые данные могут быть самыми разными, соответственно, некоторые из них передаются по одним протоколам, некоторые - по другим. Существует множество различных протоколов, например, TCP, UDP, ICMP, GRE и т.д. Грубо говоря - TCP - самый распространенный сетевой протокол. С его помощью мы открываем страницы сайта, обмениваемся почтой, общаемся в чатах. Не стоит забывать и про UDP-протокол, по которому идут DNS-запросы и ответы, компьютерные сетевые игры, в конце концов (например, counter strike 1.6 ab ).
Оба этих сетевых протокола (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) и вводим в строке адреса "адрес.домен" (например ubuntologia.ru), что компьютер делает?
1. идет в свой кеш днс-запросов.
2. не находит там ip-адрес ubuntologia.ru
3. идет в hosts
4. не находит там ip-адрес ubuntologia.ru
5. сравнивает по маске ip-адрес dns-сервера со своим
6. скорее всего посылает dns-запрос шлюзу, чтобы тот передал его dns-серверу
7. получает ip-адрес сервера, обрабатывающего сайт ubuntologia.ru
8. формирует http-запрос этому ip-адресу (опять-же через шлюз скорее всего)
9. получает ответ
10. передает его интернет-браузеру, а тот уже сам разбирается.

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

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

ubuntologia.ru:22

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

Ладно-ладно, уговорил. Бухти дальше. Как, например, узнать, какие порты слушает мой компьютер?
Для этого существует утилита 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

Довольно интересно. Теперь я понимаю, зачем они нужны и как ими пользоваться. Спасибо большое, Костян!
P.S. Набросал немного впопыхах, по-этому жду критики, предложений и пр.

2

Спасибо за статью, для новичка очень интересно и хорошо разбавлено небольшими отступлениями  wink

3

спасибо ab

4

спасибо огромное! Очень понравилось, как содержательная часть, так и юмористические вставки.

PS За "на апельсинах" отдельное спасибо!

github.com/cocaine

5

forkostya, copy/paste?

для примера:

forkostya пишет:

Расскажи-ка нам, Костян, про сетевые порты. Что это, зачем нужно?

быдло писатель Костян? или поговорим по паЦански?  или все же Константин?  ah

forkostya пишет:

Ладно-ладно, уговорил. Бухти дальше. Как, например, узнать, какие порты слушает мой компьютер?
Для этого существует утилита netstat.

1) одним  netstat'ом здесь не обойтись, забыл добавить про lsof -i
и тд)
2) Про разбор выводов:, описывайте подробней вывод, что значит каждый столбец его значение. А то это не разбор, а так себе. 
3) Про раздел "Сетевые порты", про файл /etc/services вообще тишина.
4) Нет картинок   ac
5) и многое другое.
Пробежитесь еще раз по тексту
Не плохо, но до учебника еще далеко,писать писать писать и еще раз писать, smile  По 5 бальной шкале за текст ставлю 3) за проделанный труд 5) средняя 4)

P.s. выкладывайте статейки небольшие, их легче править и читать, а то утомляет большой текст :-)  Пока что все.

Удачи!

It is good day to die ...
MS Windows 10
Заметки о главном...

6

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