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

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

Для примера допустим, что пакет попадает в систему через входящий интерфейс 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 коммент.:
последний абзац не переварил.
по поводу предпоследнего, например, пакет может предназначаться для en0, а из ip_output он вроде как может попасть только в en1 - это немного смущает и путает.
to redddis: понял
просто на схеме рассмотрена ситуация вошел через en0 вышел через en1
в симетричном случае en0 и en1 меняются местами
кстати, для этой серии статей неплохо наверное еще рассказать об открытии портов - ведь тоже делается через ipfw?
мм, в каком смысле "открытии портов"?
в прямом. как открыть и закрыть порты.
Отправить комментарий