Внутреннее устройство Linux - Уорд Брайан. Страница 73

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

Простая и недорогая альтернатива заключается в выборе адресов частной подсети на основе документов RFC 1918/6761, содержащих интернет-стандарты, показанные в табл. 9.2.

Таблица 9.2. Частные подсети, определяемые в документах RFC 1918 и 6761

Сеть

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

Форма CIDR

10.0.0.0

255.0.0.0

10.0.0.0/8

192.168.0.0

255.255.0.0

192.168.0.0/16

172.16.0.0

255.240.0.0

172.16.0.0/12

Вы можете настраивать частные подсети как вам угодно. Если вы не планиру­ете иметь более 254 хостов внутри одной сети, выберите небольшую подсеть вроде 10.23.2.0/24, которую мы рассматриваем в этой главе. Сети с такой маской иногда называют подсетями класса C. Хотя этот термин является технически устаревшим, он по-прежнему применяется.

Что же в итоге? Хосты в реальном Интернете ничего не знают о частных подсетях и не станут отправлять им пакеты, поэтому без дополнительной помощи хосты частных подсетей не могут общаться с внешним миром. Маршрутизатору (с неприватным адресом), подключенному к Интернету, необходимо какое-либо средство, чтобы заполнить разрыв между данным соединением и хостами частной сети.

9.19. Преобразование сетевых адресов (маскировка IP-адреса)

Функция NAT — широко применяемый способ совместного использования единственного IP-адреса для частной сети. Он почти универсален в домашних сетях и сетях небольших офисов. В Linux вариант функции NAT, который использует большинство людей, известен как маскировка IP-адреса.

Суть функции NAT заключается в том, что маршрутизатор не просто передает пакеты от одной подсети в другую, но и трансформирует их во время передачи. Интернет-хосты знают, как подключиться к маршрутизатору, однако ничего не знают о расположенной за ним частной сети. Хостам частной сети не требуется специальная конфигурация; маршрутизатор является для них шлюзом по умолчанию.

Эта система в общих чертах работает так.

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

2. Маршрутизатор перехватывает эти пакеты, вместо того чтобы отправить их в Интернет (в котором они пропали бы, поскольку общественный Интернет ничего не знает о частных сетях).

3. Маршрутизатор определяет пункт назначения для пакета-запроса и открывает собственное соединение с этим пунктом назначения.

4. Когда маршрутизатор установит соединение, он отправляет фальсифицированное сообщение «соединение установлено» обратно, исходному внутреннему хосту.

5. Теперь маршрутизатор становится посредником между внутренним хостом и пунктом назначения. Пункт назначения ничего не знает о внутреннем хосте; для удаленного хоста соединение выглядит как исходящее от маршрутизатора.

Однако все не настолько просто, как выглядит. Нормальная IP-маршрутизация знает лишь IP-адреса источника и пункта назначения в интернет-уровне. Однако, если бы маршрутизатор имел дело только с интернет-уровнем, каждый хост вну­тренней сети смог бы установить только одно соединение с единственным пунктом назначения в данный момент времени (есть и другие ограничения), поскольку та часть пакета, которая относится к интернет-уровню, не содержит информации о том, как отличить повторные запросы от одного хоста к тому же пункту назначения. Следовательно, функция NAT должна выйти за пределы интернет-уровня и «вскрыть» пакеты, чтобы извлечь дополнительную идентифицирующую информацию, в частности номера портов UDP и TCP, из транспортных уровней. Протокол UDP достаточно прост, поскольку здесь есть порты, но нет соединений; сложнее дело с транспортным уровнем на основе протокола TCP.

Чтобы компьютер с Linux играл роль NAT-маршрутизатора, в конфигурации ядра должны быть активизированы следующие составляющие: фильтрация сетевых пакетов («поддержка брандмауэра»), отслеживание подключений, поддержка IP-таблиц, полная функция NAT и поддержка маскировки (MASQUERADE). В большинстве версий ядра эта поддержка присутствует.

Далее необходимо запустить несколько сложных на вид команд iptables, чтобы маршрутизатор использовал функцию NAT для частной подсети. Вот пример, который применяется к внутренней сети Ethernet с интерфейсом eth1, совместно использующей внешнее подключение к интерфейсу eth0 (о синтаксисе команды iptables вы узнаете подробнее из раздела 9.21):

# sysctl -w net.ipv4.ip_forward

# iptables -P FORWARD DROP

# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# iptables -A FORWARD -i eth0 -o eth1 -m state —state ESTABLISHED,RELATED -j ACCEPT

# iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

примечание

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

Вам, вероятно, никогда не потребуется использовать команды, приведенные выше, если вы не заняты разработкой собственного ПО. К тому же сейчас доступно так много специализированных маршрутизаторов. Однако роль Linux в сети на этом не заканчивается.

9.20. Маршрутизаторы и Linux

В ранние годы широкополосного Интернета пользователи с не столь высокими требованиями просто подключали свой компьютер напрямую к Интернету. Однако прошло совсем немного времени, и многим захотелось совместно использовать единственное широкополосное подключение для своих сетей, а пользователи Linux, в частности, настраивали дополнительный компьютер в качестве маршрутизатора с функцией NAT.

Производители откликнулись на этот новый рынок, предложив специализированные аппаратные средства маршрутизации, которые содержат эффективный процессор, некоторый объем флеш-памяти и несколько сетевых портов — этой функциональности достаточно для управления типичной простой сетью, запуска такого необходимого ПО, как сервер DHCP, а также для использования функции NAT. Когда дело дошло до программного обеспечения, многие производители прибегли к помощи Linux, чтобы привести в действие свои маршрутизаторы. Были добавлены необходимые функции ядра, упрощено ПО пространства пользователя и созданы графические интерфейсы администрирования.

Почти сразу же с появлением первых таких маршрутизаторов многие пользователи заинтересовались детальным устройством аппаратных средств. У одного из производителей, компании Linksys, потребовали выпустить исходный код ПО на условиях лицензии для одного из его компонентов, и вскоре для маршрутизаторов стали появляться специальные версии Linux, такие как OpenWRT. Символы WRT возникли из названия моделей оборудования Linksys.

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