Home

среда, 28 октября 2009 г.

Входит и выходит...

В своей благодарственной речи на дне рождения один известный персонаж достаточно точно сформулирован основной принцип прохождения ip пакетов по системе: входит и выходит.

276.jpg

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

На иллюстрации представлена схема хоста с двумя интерфейсами, en0 и en1.

packetflow.png

Для примера допустим, что пакет попадает в систему через входящий интерфейс en0, схема показывает его возможный маршрут по всем закоулкам стека TCP/IP

В точке {1} входящий обработчик ip_input {3} получает пакет от драйвера сетевой карты en0. Обработчик записывает соответствующую информацию у себя и пакет получает дополнительную метку "входящий" и "входящий интерфейс en0".

Далее входной обработчик передает пакет в ipfw {4}, в этот момент актуальна информация "in" (входящий), via en0 (прошел через en0) и recv en0 (получен через en0)

Дальнейшая судьба пакета зависит от адреса назначения пакета. Если пакет предназначен данному хосту, он передается вовнутрь {5} (local), где подхватится одним из обработчиков высокого уровня.

Если пакет предназначен не нам и включена маршрутеризация, то пакет будет передан обработчику ip_forward {6}, где на основании таблицы маршрутов будет определен интерфейс, через который пакет покинет хост. Пусть это будет интерфейс en1 {2} В этот момент у пакета появляется атрибут "исходящий интерфейс"

Затем пакет попадает в исходящий обработчик ip_output {8}. Теперь пакет уже исходящий, так что атрибута in уже нет, но есть атрибут out. Но данные о входящем интерфейсе сохраняются, так что пакет по прежнему recv en0, но зато он теперь еще и xmit en1 (выходит через en1), а признаки via en0 и via en1 верны оба. И с этим набором атрибутов пакет передается на растерзание в ipfw {9}

Кроме того, сам хост может быть источником пакетов. Тогда пакет исходит из local {5} и сразу попадает в ip_output {8}. Соответственно, никаких входящих атрибутов у него нет.

И наоборот, у входящего пакета, предназначенного в local {5} нет никаких исходящих данных, поэтому использовать в одном правиле recv и xmit нельзя. Для гарантии необходимо комбинировать условия in и recv, out и xmit

Ой.

5 коммент.:

redddis комментирует...

последний абзац не переварил.
по поводу предпоследнего, например, пакет может предназначаться для en0, а из ip_output он вроде как может попасть только в en1 - это немного смущает и путает.

tsybulin комментирует...

to redddis: понял
просто на схеме рассмотрена ситуация вошел через en0 вышел через en1

в симетричном случае en0 и en1 меняются местами

redddis комментирует...

кстати, для этой серии статей неплохо наверное еще рассказать об открытии портов - ведь тоже делается через ipfw?

tsybulin комментирует...

мм, в каком смысле "открытии портов"?

Bess комментирует...

в прямом. как открыть и закрыть порты.

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