Каким разработан snull

Предыдущая  Содержание  Следующая V*D*V

В этом разделе обсуждаются концепции дизайна, которые привели сетевому интерфейсу snull. Хотя эта информация может показаться  несущественной, непонимание может привести к проблемам при игре с кодом примера.

 

Первым и самым главным дизайнерским решением было то, что интерфейсы примера должны оставаться независимыми от реального оборудования, так же как и большая часть кода примеров, используемого в этой книге. Это ограничение привело к чему-то, похожему на переделку интерфейса обратной связи. snull не является интерфейсом обратной связи; однако, он имитирует сеансы связи с настоящими удалёнными сетевыми устройствами, чтобы лучше продемонстрировать задачу написать сетевого драйвера. Драйвер обратной связи Linux на самом деле довольно прост; он может быть найден в drivers/net/loopback.c.

 

Ещё одной особенностью snull является то, что он поддерживает только IP трафик. Это является следствием внутренние работы интерфейса - snull требуется смотреть внутрь и интерпретировать пакеты, чтобы правильно эмулировать пару аппаратных интерфейсов. Настоящие интерфейсы не зависят от протокола передачи и это ограничение snull не влияет на фрагменты кода, показанные в этой главе.

Назначение IP адресов

Модуль snull создаёт два интерфейса. Эти интерфейсы отличаются от простой обратной связи, где всё, что вы передаёте через один интерфейс возвращается обратно через другой, а не к самому себе. Это выглядит так, как будто у вас есть два внешних подключения, но на самом деле компьютер отвечая самому себе.

 

К сожалению, этот эффект не может быть достигнут только путём назначения IP адреса, потому что ядро не будет посылать пакеты через интерфейс А, которые были направлены на его собственный интерфейс Б. Вместо этого, оно будет использовать канал обратной связи без передачи через snull. Чтобы установить связь через интерфейсы snull, адреса источника и места назначения при передачи данных должны быть изменены. Другими словами, пакеты, отправленные через один из интерфейсов должны быть получены другим, но получатель исходящих пакетов не должен быть распознан, как локальный компьютер. То же самое относится к адресу источника полученных пакетов.

 

Для достижения такого рода "скрытой обратной связи", интерфейс snull переключает наименее значащий бит третьего октета обоих адресов источника и назначения; то есть, изменяет адрес сети и адрес компьютера IP адресов класса C. Результирующим эффектом является то, что пакеты, отправленные в сеть А (подключенной к sn0, первому интерфейсу) появляются на интерфейсе sn1 как пакеты, принадлежащие сети Б.

 

Чтобы избежать иметь дело со слишком большим числом адресов, давайте назначим символические имена IP адресам, включающим:

 

snullnet0 - это сеть, которая подключена к интерфейсу sn0. Аналогично, snullnet1 - сеть, подключенная к sn1. Адреса этих сетей должны отличаться только младшим битом третьего октета. Эти сети должны иметь 24-х разрядные сетевые маски.

local0 - это IP адрес, присвоенный интерфейсу sn0; он принадлежит snullnet0. Адресом, связанным с sn1 является local1. local0 и local1 должны различаться младшим битом третьего октета и четвертым октетом.

remote0 является сетевым устройством в snullnet0 и его четвертый октет такой же, что и у local1. Любой пакет, отправленный на remote0 достигает local1 после того, как его сетевой адрес был изменён кодом интерфейса. Сетевое устройство remote1 принадлежит snullnet1 и его четвёртый октет такой же, как у local0.

 

Функционирование интерфейса snull изображено на Рисунке 17-1, на котором имя сетевого устройства, связанного с каждым интерфейсом, напечатано вблизи имени интерфейса.

 

Рисунок 17-1. Как сетевое устройство видит свои интерфейсы

Рисунок 17-1. Как сетевое устройство видит свои интерфейсы

 

Вот возможные значения для сетевых адресов. Как только вы поместили эти строки в /etc/networks, вы можете обратиться к вашим сетям по имени. Эти значения были выбраны из диапазона адресов, отведённых для частного использования.

 

snullnet0 192.168.0.0

snullnet1 192.168.1.0

 

Ниже приведены возможные адреса сетевых устройств, чтобы поместить их в /etc/networks:

 

192.168.0.1 local0

192.168.0.2 remote0

192.168.1.2 local1

192.168.1.1 remote1

 

Важная особенность этих адресов в том, что часть для адреса устройства local0 такая же, как и у remote1, и часть для адреса устройства local1 та же самая, что и у remote0. Вы можете использовать совершенно разные номеров до тех пор, пока выполняется это отношение.

 

Однако, будьте осторожны, если ваш компьютер уже подключен к сети. Адреса, которые вы выбираете, могут быть реальными адресами Интернет или внутренней сети, и их назначение вашим интерфейсам прервёт связь с настоящими сетевыми устройствами. Например, хотя только что показанные адреса не являются маршрутизируемыми Интернет-адресами, они уже могут использоваться в вашей частной сети.

 

Независимо от адресов, которые вы выберете, вы можете правильно настроить интерфейсы для работы, вводя следующие команды:

 

ifconfig sn0 local0

ifconfig sn1 local1

 

Вам может понадобиться добавить параметр netmask 255.255.255.0, если выбранный адресный диапазона ее является диапазоном класса C.

 

На данный момент может быть достигнут "удалённый" конец интерфейса. Следующая распечатка экрана показывает, как компьютер через интерфейс snull достигает remote0 и remote1:

 

morgana% ping -c 2 remote0

64 bytes from 192.168.0.99: icmp_seq=0 ttl=64 time=1.6 ms

64 bytes from 192.168.0.99: icmp_seq=1 ttl=64 time=0.9 ms

2 packets transmitted, 2 packets received, 0% packet loss

 

morgana% ping -c 2 remote1

64 bytes from 192.168.1.88: icmp_seq=0 ttl=64 time=1.8 ms

64 bytes from 192.168.1.88: icmp_seq=1 ttl=64 time=0.9 ms

2 packets transmitted, 2 packets received, 0% packet loss

 

Заметим, что вам не удастся достичь какого-либо другого "компьютера", принадлежащего этим двум сетям, потому что пакеты отбрасываются вашим компьютером после того, как адрес был изменён и пакет был получен. Например, пакет, направленный на 192.168.0.32 будет выходить через sn0 и вновь появится на sn1 с адресом назначения 192.168.1.32, который не является локальным адресом для  данного компьютера.

Физический транспорт пакетов

Что касается передачи данных, интерфейсы snull принадлежат к классу Ethernet.

 

snull эмулирует Ethernet, поскольку подавляющее большинство существующих сетей, по крайней мере сегменты, которые соединяют рабочие станции, базируются на технологии Ethernet, будь то 10Base-T, 100Base-T или Gigabit. Кроме того, ядро предлагает некоторую обобщённую поддержку для устройств Ethernet и нет никаких оснований не использовать её. Преимущество быть устройством Ethernet настолько сильно, что даже интерфейс plip (интерфейс, который используют принтерные порты) заявляет о себе, как о устройстве Ethernet.

 

Последним преимуществом использования установки Ethernet для snull является то, что вы можете запустить на интерфейсе tcpdump, чтобы увидеть проходящие через него пакеты. Наблюдение за интерфейсом с помощью tcpdump может оказаться полезным способом увидеть, как работают эти два интерфейса.

 

Эта быстрая и грязная модификация данных уничтожает не-IP пакеты. Если вы хотите доставить через snull другие протоколы, вы должны изменить исходный код модуля.

 

Как уже упоминалось ранее, snull работает только с IP пакетами. Это ограничение - результат того факта, что snull роется в пакетах и даже изменяет их, чтобы код работал. Код изменяет источник, место назначения и контрольную сумму в IP заголовке каждого пакета, не проверяя, передаётся ли на самом деле IP информация.

 

Предыдущая  Содержание  Следующая