Sophie

Sophie

distrib > Mandriva > mes5 > x86_64 > by-pkgid > 45723c51178a73df679c2a8284d8eeff > files > 28

shorewall-doc-4.0.15-0.2mdvmes5.noarch.rpm

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /><title>Shorewall и подключение к Internet по нескольким каналам</title><link rel="stylesheet" href="html.css" type="text/css" /><meta name="generator" content="DocBook XSL Stylesheets V1.73.2" /></head><body><div class="article" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title"><a id="id257527"></a>Shorewall и подключение к Internet по нескольким каналам</h2></div><div><div class="authorgroup"><div class="author"><h3 class="author"><span class="firstname">Tom</span> <span class="surname">Eastep</span></h3></div></div></div><div><p class="copyright">Copyright © 2005, 2006, 2007 Thomas M. Eastep</p></div><div><p class="copyright">Copyright © 2007 Russian Translation: Grigory Mokhin</p></div><div><div class="legalnotice"><a id="id257926"></a><p>Этот документ разрешается копировать, распространять и/или изменять при выполнении условий лицензии GNU Free Documentation License версии 1.2 или более поздней, опубликованной Free Software Foundation; без неизменяемых разделов, без текста на верхней обложке, без текста на нижней обложке. Копия лицензии приведена по ссылке “<span class="quote"><a class="ulink" href="GnuCopyright.htm" target="_self">GNU Free Documentation License</a></span>”.</p></div></div><div><p class="pubdate">2008/12/15</p></div></div><hr /></div><div class="toc"><p><b>Table of Contents</b></p><dl><dt><span class="section"><a href="#Support">Поддержка нескольких соединений с Internet</a></span></dt><dd><dl><dt><span class="section"><a href="#Overview">Обзор</a></span></dt><dt><span class="section"><a href="#providers">Файл /etc/shorewall/providers</a></span></dt><dt><span class="section"><a href="#Providers">Какие функции выполняет запись в файле providers</a></span></dt><dt><span class="section"><a href="#Provider_Doesnt">Какие функции НЕ выполняет запись в файле providers</a></span></dt><dt><span class="section"><a href="#Martians">Марсианские пакеты</a></span></dt><dt><span class="section"><a href="#Example1">Пример</a></span></dt><dt><span class="section"><a href="#morethan2">Если провайдеров больше, чем 2</a></span></dt><dt><span class="section"><a href="#Local">Приложения, работающие в системе файрвола</a></span></dt><dt><span class="section"><a href="#route_rules">/etc/shorewall/route_rules</a></span></dt><dd><dl><dt><span class="section"><a href="#Routing_rules">Правила маршрутизации</a></span></dt><dt><span class="section"><a href="#route_rules_columns">Файл route_rules</a></span></dt></dl></dd></dl></dd></dl></div><div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p>Вы должны <span class="bold"><strong> установить современный дистрибутив, который обновляется поставщиком</strong></span>, прежде чем пытаться настроить работу в этом режиме. Старые дистрибутивы не удовлетворяют минимальным требованиям, и вам потребуется перекомпилировать iptables, ядро и прочее программное обеспечение в системе. Если вы проигнорируете этот совет, <span class="bold"><strong>то <span class="bold"><strong>не </strong></span> рассчитывайте, что кто-либо сможет вам помочь.</strong></span>.</p></div><div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p>Чтение только документации Shorewall не будет достаточным для понимания раскрываемых здесь тем. Shorewall упрощает работу с iptables, но разработчики Shorewall не имеют достаточных ресурсов, чтобы учить вас основам управляемой маршрутизации в Linux (равно как и пособие по вождению комбайна не учит правильно выращивать пшеницу). Скорее всего вам потребуется обратиться к следующим дополнительным источникам:</p><div class="itemizedlist"><ul type="disc"><li><p>LARTC HOWTO: <a class="ulink" href="http://www.lartc.org" target="_self">http://www.lartc.org</a></p></li><li><p>Вывод команды <span class="command"><strong>man ip</strong></span></p></li><li><p>Вывод команд <span class="command"><strong>ip route help</strong></span> и <span class="command"><strong>ip rule help</strong></span></p></li></ul></div></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h2 class="title" style="clear: both"><a id="Support"></a>Поддержка нескольких соединений с Internet</h2></div></div></div><p>Начиная с версии 2.3.2 в Shorewall реализована ограниченная поддержка нескольких соединений с Internet. Ниже описаны существующие ограничения:</p><div class="itemizedlist"><ul type="disc"><li><p>Используется статическая конфигурация маршрутов. Поэтому не предусмотрены меры по защите от сбоя какого-либо из каналов связи с провайдером.</p></li><li><p>Изменения маршрутизации и очистка кэша маршрутов осуществляются при запуске <span class="bold"><strong>и при перезапуске Shorewall </strong></span> (если не указана опция "-n" для <span class="command"><strong>shorewall restart</strong></span>). Вообще говоря, в идеальном случае перезапуск пакетного фильтра никак не должен влиять на маршрутизацию.</p></li><li><p>В версиях Shorewall ниже 3.4.0 маршруты и правила маршрутизации, добавляемые при запуске, не удалялись полностью в ходе выполнения команд <span class="command"><strong>shorewall stop</strong></span>, <span class="command"><strong>shorewall clear</strong></span> или <span class="command"><strong>shorewall restart</strong></span>.</p></li></ul></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="Overview"></a>Обзор</h3></div></div></div><p>Предположим, что система, в которой работает файрвол, подключена к двум провайдерам по двум интерфейсам Ethernet, как показано на рисунке.</p><div align="center"><table border="0" summary="manufactured viewport for HTML img" cellspacing="0" cellpadding="0"><tr><td align="center" valign="middle"><img src="images/TwoISPs.png" align="middle" /></td></tr></table></div><div class="itemizedlist"><ul type="disc"><li><p>eth0 подключен к ISP1. IP-адрес eth0 - это 206.124.146.176, и шлюз провайдера имеет IP-адрес 206.124.146.254.</p></li><li><p>eth1 подключен к ISP2. IP-адрес eth1 - это 130.252.99.27, и шлюз провайдера имеет IP-адрес 130.252.99.254.</p></li><li><p>eth2 подключен к локальной сети. У него может быть любой IP-адрес.</p></li></ul></div><p>Все эти <em class="firstterm">провайдеры </em> должны быть перечислены в файле <code class="filename">/etc/shorewall/providers</code>.</p><p>В записях в файле <code class="filename">/etc/shorewall/providers</code> можно указать, что для исходящих соединений должно быть включено распределение нагрузки по двум каналам связи с провайдерами. В записях в файле <code class="filename">/etc/shorewall/tcrules</code> можно указать, что некоторые исходящие соединения должны использовать определённый канал провайдера. Правила в файле <code class="filename">/etc/shorewall/tcrules</code> необязательны для того, чтобы настройка <code class="filename">/etc/shorewall/providers</code> работала, но необходимо указать уникальное значение MARK для каждого из провайдеров, чтобы Shorewall настроил правила маркировки.</p><p>Если задать опцию <span class="bold"><strong>track</strong></span> в файле <code class="filename">/etc/shorewall/providers</code>, то соединения из Internet будут автоматически маршрутизироваться обратно через правильный интерфейс на соответствующий шлюз провайдера. Это будет работать как в том случае, когда соединение обрабатывается самим файрволом, так и для соединений, маршрутизируемых или пробрасываемых к системам позади файрвола.</p><p>Shorewall настраивает маршрутизацию и обновляет файл <code class="filename">/etc/iproute2/rt_tables</code>, включая в него имена таблиц и их номера.</p><div class="caution" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Caution</h3><p>При этом используются функции <a class="ulink" href="traffic_shaping.htm" target="_self">маркировки пакетов</a> для управления маршрутизацией. Как следствие этого возникают ограничения на записи в файле <code class="filename">/etc/shorewall/tcrules</code>:</p><div class="itemizedlist"><ul type="disc"><li><p>Маркировка пакетов для целей управления трафиком не может осуществляться в цепочке PREROUTING для соединений с участием провайдеров, для которых задана опция 'track' (см. далее).</p></li><li><p>Нельзя использовать опции SAVE или RESTORE.</p></li><li><p>Нельзя использовать маркировку соединений.</p></li></ul></div></div><p>Файл <code class="filename">/etc/shorewall/providers</code> может также использоваться в других сценариях маршрутизации. В <a class="ulink" href="Shorewall_Squid_Usage.html" target="_self">документации по работе с Squid </a> приведены примеры.</p></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="providers"></a>Файл /etc/shorewall/providers</h3></div></div></div><p>Далее описаны поля этого файла. Как и везде в файлах конфигурации Shorewall, укажите в поле для столбца "-", если не требуется задавать никакое значение.</p><div class="variablelist"><dl><dt><span class="term">NAME</span></dt><dd><p>Имя провайдера. Должно начинаться с буквы и состоять из букв и цифр. Имя провайдера становится именем сгенерированной таблицы маршрутизации для этого провайдера.</p></dd><dt><span class="term">NUMBER</span></dt><dd><p>Число от 1 до 252. Оно будет номером таблицы маршрутизации для сгенерированной таблицы для этого провайдера.</p></dd><dt><span class="term">MARK</span></dt><dd><p>Метка, применяемая в файле /etc/shorewall/tcrules для направления пакетов через этого провайдера. Shorewall также помечает этой меткой соединения, которые входят через этого провайдера, и восстанавливает метку пакета в цепочке PREROUTING. Метка должна быть целым числом от 1 до 255.</p><p>Начиная с Shorewall версии 3.2.0 Beta 6, можно задать опцию HIGH_ROUTE_MARKS=Yes в файле <code class="filename">/etc/shorewall/shorewall.conf</code>. Это позволяет решить следующие задачи:</p><div class="itemizedlist"><ul type="disc"><li><p>Использовать метки пакетов для управления трафиком, при условии что эти метки присваиваются в цепочке FORWARD.</p></li><li><p>Использовать значения меток &gt; 255 для меток провайдера. Эти метки должны быть кратными 256 в диапазоне 256-65280 (в 16-ричном представлении 0x100 - 0xFF00, с нулевыми младшими 8 битами).</p></li></ul></div></dd><dt><span class="term">DUPLICATE</span></dt><dd><p>Имя или номер таблицы маршрутизации, которая будет продублирована. Можно указать 'main' или имя или номер ранее объявленного провайдера. Для большинства приложений здесь достаточно будет указать 'main'.</p></dd><dt><span class="term">INTERFACE</span></dt><dd><p>Имя интерфейса канала связи с провайдером.</p><div class="caution" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Caution</h3><p>В реализации поддержки нескольких подключений с провайдерами Shorewall предполагается, что каждый провайдер подключен к собственному интерфейсу.</p></div></dd><dt><span class="term">GATEWAY</span></dt><dd><p>IP-адрес шлюза провайдера.</p><p>Здесь можно указать <span class="bold"><strong>detect</strong></span> для автоматического определения IP-адреса шлюза.</p><p><span class="bold"><strong>Совет:</strong></span> <span class="bold"><strong>"detect"</strong></span> следует указывать в том случае, если интерфейс из поля INTERFACE настраивается динамически по DHCP.</p></dd><dt><span class="term">OPTIONS</span></dt><dd><p>Список параметров через запятую, описанных ниже:</p><div class="variablelist"><dl><dt><span class="term">track</span></dt><dd><p>Если эта опция включена, то будут отслеживаться соединения, ВХОДЯЩИЕ через этот интерфейс, чтобы ответы могли маршрутизироваться обратно через этот же интерфейс.</p><p>Укажите 'track', если через этого провайдера к локальным серверам будут обращаться хосты из Internet. Вместе с 'track' всегда следует указывать опцию 'balance'.</p><p>Для работы с этой функцией ядро и iptables должны поддерживать цель CONNMARK и сравнение connmark. Расширение цели ROUTE не требуется.</p><div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p>В iptables 1.3.1 есть ошибка в реализации CONNMARK и iptables-save/iptables-restore. Поэтому при настройке нескольких провайдеров команда <span class="command"><strong>shorewall restore</strong></span> может быть не выполнена. Если это имеет место, примените исправление iptables, доступное по адресу <a class="ulink" href="http://shorewall.net/pub/shorewall/contrib/iptables/CONNMARK.diff" target="_self">http://shorewall.net/pub/shorewall/contrib/iptables/CONNMARK.diff</a>.</p></div><div class="important" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Important</h3><p>Если используется файл <code class="filename">/etc/shorewall/providers</code> для настройки нескольких соединений с Internet, укажите опцию 'track', даже если в ней нет необходимости. Она помогает поддерживать длительные соединения, в которых могут быть долгие периоды отсутствия трафика.</p></div></dd><dt><span class="term">balance</span></dt><dd><p>Опция 'balance' позволяет распределять нагрузку исходящих потоков между несколькими провайдерами. Распределение нагрузки не будет идеальным, поскольку оно осуществляется посредством маршрутов, а маршруты кэшируются. При этом маршрут к хостам, к которым часто обращаются пользователи, будет проходить всегда через одного и того же провайдера.</p><p>По умолчанию всем провайдерам присваивается одинаковый вес (1). Вес конкретного провайдера можно изменить опцией <span class="emphasis"><em>balance</em></span> с "=" и весом (например, balance=2). Веса отражают относительную пропускную способность каналов связи с провайдером. Они должны быть небольшими числами, потому что ядро создает дополнительные маршруты для каждого приращения веса. </p><div class="important" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Important</h3><p>Если файл <code class="filename">/etc/shorewall/providers</code> используется для настройки нескольких соединений с Internet, укажите опцию 'balance', даже если в ней нет необходимости. Для направления всего трафика через какого-либо определенного провайдера можно использовать файл <code class="filename">/etc/shorewall/tcrules</code>. </p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>Если вы проигнорируете этот совет, то прочитайте <a class="ulink" href="FAQ.htm#faq57" target="_self">FAQ 57</a> и <a class="ulink" href="FAQ.htm#faq58" target="_self">FAQ 58</a>.</p></div></div><div class="important" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Important</h3><p>Если указана опция 'balance', но весь трафик по-прежнему идёт через одного провайдера, то причина этого может состоять в том, что ядро не собрано с опцией CONFIG_IP_ROUTE_MULTIPATH_CACHED=n. У некоторых пользователей пересборка ядра с этой опцией помогла устранить неполадку.</p><p>Эта неполадка присутствует в ядре SuSE 10.0, и согласно <a class="ulink" href="https://bugzilla.novell.com/show_bug.cgi?id=190908" target="_self">в этом случае может возникать критическая ошибка ядра.</a> В SUSE 10.1 и SLES 10 опция CONFIG_IP_ROUTE_MULTIPATH_CACHED=n включена по умолчанию. Источник неполадки описан здесь: <a class="ulink" href="http://news.gmane.org/find-root.php?message_id=%3c00da01c5b35a%24b12b9860%241b00a8c0%40cruncher%3e" target="_self">несовместимость между исправлениями от LARTC и опцией CONFIG_IP_ROUTE_MULTIPATH_CACHED.</a></p></div></dd><dt><span class="term">loose</span></dt><dd><p>Не включать правила маршрутизации, которые принудительно направляют через данный интерфейс трафик, исходный IP-адрес которого совпадает с адресом интерфейса канала с провайдером. Эта опция полезна для определения провайдеров, которые должны использоваться только при наличии соответствующей метки пакета. Эту опцию нельзя указывать совместно с <span class="bold"><strong>balance</strong></span>.</p></dd><dt><span class="term">optional (начиная с Shorewall 3.2.2)</span></dt><dd><p>Shorewall определит, работает ли этот интерфейс и настроен ли его IP-адрес. Если он не настроен, то будет показано предупреждение, а сам провайдер не будет включен.</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>Параметр 'optional' предназначен для определения состояния интерфейсов, которые могли бы вызвать сбой команды <span class="command"><strong>shorewall start</strong></span> или <span class="command"><strong>shorewall restart</strong></span> - однако даже если интерфейс находится в состоянии, в котором Shorewall может [пере]запуститься без ошибок, это не означает, что трафик может с гарантией проходить через этот интерфейс.</p></div></dd></dl></div><p>Для тех, кто окончательно запутался в том, что такое <span class="bold"><strong> track</strong></span> и <span class="bold"><strong>balance</strong></span>:</p><div class="itemizedlist"><ul type="disc"><li><p><span class="bold"><strong>track</strong></span> управляет входящими соединениями.</p></li><li><p><span class="bold"><strong>balance</strong></span> управляет исходящими соединениями.</p></li></ul></div></dd><dt><span class="term">COPY</span></dt><dd><p>Если в поле DUPLICATE указана существующая таблица, то Shorewall копирует все маршруты, проходящие через интерфейс, указанный в столбце INTERFACE, а также через интерфейс, указанный в этом поле. В этом поле следует указать все интерфейсы в системе файрвола, исключая интерфейсы Internet, указанные в поле INTERFACE этого файла.</p></dd></dl></div></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="Providers"></a>Какие функции выполняет запись в файле providers</h3></div></div></div><p>Добавление записи в файле providers приводит к созданию альтернативной таблицы маршрутизации. Помимо этого:</p><div class="orderedlist"><ol type="1"><li><p>Если не указана опция <span class="bold"><strong>loose</strong></span>, то создается правило ip для каждого IP-адреса из поля INTERFACE, которое обеспечивает маршрутизацию трафика с этого адреса через соответствующую таблицу маршрутизации.</p></li><li><p>Если указана опция <span class="bold"><strong>track</strong></span>, то соединения, для которых хотя бы один пакет прошел на интерфейс, указанный в поле INTERFACE, получат метку соединения, заданную в  поле MARK. В цепочке PREROUTING метка пакетов, имеющих метку соединения, будет задана равной метке соединения, и такие помеченные пакеты не будут подчиняться правилам для цепочки PREROUTING, заданным в файле <code class="filename">/etc/shorewall/tcrules</code>. Это обеспечивает маршрутизацию через правильный интерфейс для входящих соединений.</p></li><li><p>Если указана опция <span class="bold"><strong>balance</strong></span>, то Shorewall заменит маршрут по умолчанию с весом 100 в таблице маршрутизации 'main' маршрутом с распределением нагрузки между шлюзами, для которых опция <span class="bold"><strong>balance</strong></span> включена. Поэтому, если вы настраиваете маршруты по умолчанию, то укажите их вес меньше, чем 100, иначе маршрут, добавленный Shorewall, не будет иметь силы.</p></li></ol></div><p>Больше эти записи не делают <span class="bold"><strong>ничего</strong></span>. Вспомните основной принцип, описанный в <a class="ulink" href="Shorewall_and_Routing.html" target="_self">документации по маршрутизации Shorewall</a>:</p><div class="orderedlist"><ol type="1"><li><p>Маршрутизация отвечает за то, куда направляются пакеты.</p></li><li><p>После того, как маршрут пакета определён, файрвол (Shorewall) определяет, разрешить ли отправку пакета по его маршруту.</p></li></ol></div><p>Итак, если вы хотите направить трафик через определённого провайдера, то <span class="emphasis"><em>необходимо </em></span>пометить этот трафик значением MARK провайдера в файле <code class="filename">/etc/shorewall/tcrules</code> и пометить пакет в цепочке PREROUTING; другим способом будет указание соответствующих правил в файле <code class="filename">/etc/shorewall/route_rules</code>.</p><div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title"><a id="Undo"></a>Warning</h3><p>В Shorewall версий ниже 3.4.0 записи из файла <code class="filename">/etc/shorewall/providers</code> необратимо изменяют маршрутизацию системы, то есть эти изменения не отменяются при вызове команды <span class="command"><strong>shorewall stop</strong></span> или <span class="command"><strong>shorewall clear</strong></span>. Для того чтобы восстановить исходные маршруты, может потребоваться перезапустить сеть. Обычно это делает команда <span class="command"><strong>/etc/init.d/network restart</strong></span> или <span class="command"><strong>/etc/init.d/networking restart</strong></span>. Обратитесь к документации по сети вашего дистрибутива.</p><p>Дополнительные замечания:</p><div class="itemizedlist"><ul type="disc"><li><p>Влияние изменений, вносимых Shorewall в таблицу маршрутизации, можно уменьшить, указав параметр <span class="emphasis"><em>metric</em></span> для каждого настраиваемого маршрута по умолчанию. Shorewall создаст маршрут по умолчанию с распределением нагрузки (если опция <span class="bold"><strong>balance</strong></span> включена для какого-либо из провайдеров), который не будет включать метрику и тем самым не будет заменять никакой существующий маршрут, для которого метрика отлична от нуля.</p></li><li><p>Опция <span class="command"><strong>-n</strong></span> команд <span class="command"><strong>shorewall restart</strong></span> и <span class="command"><strong>shorewall restore</strong></span> позволяет предотвратить изменение маршрутизации.</p></li><li><p>Файл <code class="filename">/etc/shorewall/stopped</code> можно также использовать для восстановления маршрутизации при остановке Shorewall. Когда система работает в обычной конфигурации маршрутизации (одна таблица), то ее содержимое можно сохранить следующим образом:</p><pre class="programlisting">ip route ls &gt; routes</pre><p>Ниже приведен пример файла <code class="filename">routes</code> для моей системы:</p><pre class="programlisting">192.168.1.1 dev eth3  scope link
206.124.146.177 dev eth1  scope link
192.168.2.2 dev tun0  proto kernel  scope link  src 192.168.2.1
192.168.2.0/24 via 192.168.2.2 dev tun0
192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.254
206.124.146.0/24 dev eth3  proto kernel  scope link  src 206.124.146.176
169.254.0.0/16 dev eth0  scope link
127.0.0.0/8 dev lo  scope link
default via 206.124.146.254 dev eth3</pre><p>Отредактируйте этот файл следующим образом:</p><pre class="programlisting"><span class="command"><strong>ip route flush table main
ip route add</strong></span> 192.168.1.1 dev eth3  scope link
<span class="command"><strong>ip route add </strong></span>206.124.146.177 dev eth1  scope link
192.168.2.2 dev tun0  proto kernel  scope link  src 192.168.2.1
192.168.2.0/24 via 192.168.2.2 dev tun0
192.168.2.2 dev tun0  proto kernel  scope link  src 192.168.2.1
192.168.2.2 dev tun0  proto kernel  scope link  src 192.168.2.1
<span class="command"><strong>ip route add </strong></span>206.124.146.177 dev eth1  scope link
<span class="command"><strong>ip route add </strong></span>206.124.146.177 dev eth1  scope link
<span class="command"><strong>ip route add </strong></span>206.124.146.177 dev eth1  scope link
<span class="command"><strong>ip route flush cache</strong></span></pre><p>Сохраните этот файл как <code class="filename">/etc/shorewall/stopped</code>.</p><p>В этот файл можно также добавить следующее:</p><pre class="programlisting"><span class="command"><strong>ip rule ls</strong></span> | while read priority rule; do
    case ${priority%:} in
        0|3276[67])
            ;;
        *)
            ip rule del $rule
            ;;
    esac
done</pre><p>Этот код удаляет все правила маршрутов, за исключением маршрута по умолчанию.</p></li></ul></div></div></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="Provider_Doesnt"></a>Какие функции НЕ выполняет запись в файле providers</h3></div></div></div><p>Shorewall - это инструмент для настройки Netfilter, а не процесс, который непрерывно работает в  системе, поэтому записи в файле providers <span class="bold"><strong>не обеспечивают автоматического переключения в случае сбоя одного из каналов связи с Internet </strong></span>.</p></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="Martians"></a>Марсианские пакеты</h3></div></div></div><p>В конфигурации с несколькими провайдерами часто возникает типичная неполадка с "марсианскими пакетами".  Если для сетевых интерфейсов задана опция <span class="bold"><strong>routefilter</strong></span> в файле <code class="filename">/etc/shorewall/interfaces</code> (а вместе с этой опцией должны быть задана опция <span class="bold"><strong>logmartians</strong></span>), то могут возникать ошибки, и в протоколе будут сообщения следующего вида: </p><pre class="programlisting">Feb  9 17:23:45 gw.ilinx kernel: martian source 206.124.146.176 from 64.86.88.116, on dev eth1 
Feb  9 17:23:45 gw.ilinx kernel: ll header: 00:a0:24:2a:1f:72:00:13:5f:07:97:05:08:00</pre><p>Это сообщение может ввести в заблуждение.  Исходным IP входящего пакета является 64.86.88.116, а целевым IP - 206.124.146.176. Следует также учитывать, что целевой IP-адрес входящего пакета мог быть уже изменен, либо в DNAT, либо записью в файле <code class="filename">/etc/shorewall/masq</code> (SNAT или Masquerade) для первоначального исходящего соединения.  Поэтому целевой IP-адрес (206.124.146.176) может отличаться от исходного целевого IP-адреса пришедшего пакета. </p><p>Эти неполадки могут возникать по следующим причинам: </p><div class="orderedlist"><ol type="1"><li><p>Оба внешних интерфейса подключены на один хаб или коммутатор.  Никогда не подключайте несколько интерфейсов файрвола на один хаб, если хотите избежать неприятных и труднообъяснимых неполадок. </p></li><li><p>В файле providers указаны вместе опции <span class="bold"><strong>loose</strong></span> и <span class="bold"><strong>balance</strong></span>.  Это приводит к тому, что отдельные соединения будут перескакивать между интерфейсами, и будут возникать ошибки. </p></li><li><p>Локальный трафик направляется через один из интерфейсов с помощью маркировки пакетов записью из файла <code class="filename">/etc/shorewall/tcrules</code>. Вместо этого следует привязать приложение к соответствующему локальному IP-адресу требуемого интерфейса.  См. <a class="link" href="#Local" title="Приложения, работающие в системе файрвола">далее</a>.</p></li></ol></div><p>Если больше ничего не помогает, удалите опцию <span class="bold"><strong>routefilter</strong></span> для внешнего интерфейса.  При этом можно добавить правила для регистрации и сбрасывания пакетов из Интернета, имеющих адрес источника из вашей локальной сети.  Например, если локальная сеть в указанной выше конфигурации имеет адреса 192.168.1.0/24, то добавьте следующее правило:</p><pre class="programlisting">#ACTION          SOURCE                     DEST
DROP:info        net:192.168.1.0/24         all</pre><p>Be sure the above rule is added before any other rules with <span class="emphasis"><em>net</em></span> in the SOURCE column.</p></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="Example1"></a>Пример</h3></div></div></div><p>Конфигурация схемы сети, показанной на рисунке в начале этого документа, описывается в файле <code class="filename">/etc/shorewall/providers</code> следующим образом.</p><pre class="programlisting">#NAME   NUMBER  MARK    DUPLICATE       INTERFACE       GATEWAY         OPTIONS          COPY
ISP1    1       1       main            eth0            206.124.146.254 track,balance    eth2
ISP2    2       2       main            eth1            130.252.99.254  track,balance    eth2</pre><p>Прочие файлы конфигурации будут иметь следующий вид: </p><p><code class="filename">/etc/shorewall/interfaces</code>:</p><pre class="programlisting">#ZONE    INTERFACE    BROADCAST       OPTIONS
net      eth0         detect          …          
net      eth1         detect          …</pre><p><code class="filename">/etc/shorewall/policy</code>:</p><pre class="programlisting">#SOURCE    DESTINATION    POLICY     LIMIT:BURST
net        net            DROP</pre><p>Если соединения файрвола будут перенаправляться с помощью правил <code class="filename">/etc/shorewall/tcrules</code>, или если для провайдеров указана опция <span class="bold"><strong>balance</strong></span>, то независимо от того, есть ли маскируемые хосты, в файл <code class="filename">/etc/shorewall/masq</code> необходимо добавить следующие записи.</p><pre class="programlisting">#INTERFACE       SUBNET            ADDRESS
eth0             130.252.99.27     206.124.146.176
eth1             206.124.146.176   130.252.99.27</pre><p>Эти записи обеспечивают отправку пакетов, созданных в системе файрвола, с правильным исходным IP-адресом, соответствующим интерфейсу, через который они направляются.</p><div class="note" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Note</h3><p>Если какой-либо из интерфейсов имеет динамический IP-адрес, то указанные правила можно создать  с помощью переменных оболочки. Например, если <code class="filename">eth0</code> имеет динамический IP-адрес:</p><p><code class="filename">/etc/shorewall/params</code>:</p><pre class="programlisting">ETH0_IP=$(find_first_interface_address eth0)</pre><p>/etc/shorewall/masq:</p><pre class="programlisting">#INTERFACE       SUBNET            ADDRESS
eth0             130.252.99.27     $ETH0_IP
eth1             $ETH0_IP          130.252.99.27</pre></div><p>Если есть маскируемые хосты, то настройте в файле <code class="filename">/etc/shorewall/masq</code> маскарадинг для обоих провайдеров. Например, если маскируются хосты, подключенные через <code class="filename">eth2</code> то это делается так:</p><pre class="programlisting">#INTERFACE       SUBNET            ADDRESS
eth0             eth2              206.124.146.176
eth1             eth2              130.252.99.27</pre><div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p>Записи в файле <code class="filename">/etc/shorewall/masq</code> никак не влияют на то, через какого провайдера пройдёт конкретное соединение. Для этого применяются правила в файле <code class="filename">/etc/shorewall/tcrules</code> или <code class="filename">/etc/shorewall/route_rules</code>.</p></div><p>Предположим, что требуется направить весь исходящий трафик SMTP из локальной сети через провайдера 2. В файле <a class="ulink" href="traffic_shaping.htm" target="_self">/etc/shorewall/tcrules</a> укажите следующее (и в версии Shorewall ниже 3.0.0 также задайте TC_ENABLED=Yes в файле <a class="ulink" href="???" target="_self">/etc/shorewall/shorewall.conf</a>).</p><pre class="programlisting">#MARK           SOURCE          DEST            PROTO   PORT(S) CLIENT  USER    TEST
#                                                               PORT(S)
2:P             &lt;локальная сеть&gt; 0.0.0.0/0       tcp     25</pre></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="morethan2"></a>Если провайдеров больше, чем 2</h3></div></div></div><p>Для более чем двух провайдеров требуется внести соответствующие дополнения: </p><div class="orderedlist"><ol type="1"><li><p>Для каждого внешнего адреса в файл <code class="filename">/etc/shorewall/masq</code> необходимо добавить записи для случаев, когда соединение, использующее этот адрес как SOURCE, направляется через интерфейс с отличным адресом. </p></li><li><p>Для каждого внешнего интерфейса в файл <code class="filename">/etc/shorewall/masq</code> необходимо добавить записи для каждой внутренней подсети, которая будет маскироваться (или для которой применяется SNAT) через этот интерфейс. </p></li></ol></div><p>Например, для eth3 с IP-адресом 16.105.78.4 и шлюзом 16.105.78.254, необходимо добавить следующее:</p><p><code class="filename">/etc/shorewall/providers</code>:</p><pre class="programlisting">#NAME   NUMBER  MARK    DUPLICATE       INTERFACE       GATEWAY         OPTIONS          COPY
ISP1    1       1       main            eth0            206.124.146.254 track,balance    eth2
ISP2    2       2       main            eth1            130.252.99.254  track,balance    eth2
ISP3    3       3       main            eth3            16.105.78.254   track,balance    eth2</pre><p><code class="filename">/etc/shorewall/masq</code>:</p><pre class="programlisting">#INTERFACE       SUBNET            ADDRESS
eth0             130.252.99.27     206.124.146.176
eth3             130.252.99.27     16.105.78.4
eth1             206.124.146.176   130.252.99.27
eth3             206.124.146.176   16.105.78.4
eth0             16.106.78.4       206.124.146.176
eth1             16.106.78.4       130.252.99.27
eth0             eth2              206.124.146.176
eth1             eth2              130.252.99.27
eth3             eth2              16.105.78.4</pre></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="Local"></a>Приложения, работающие в системе файрвола</h3></div></div></div><p>Иногда возникают неполадки с приложениями, работающими в системе файрвола. Это часто имеет место, для для внешних интерфейсов в файле /etc/shorewall/interfaces указана опция <span class="bold"><strong>routefilter</strong></span> (см. <a class="link" href="#Martians" title="Марсианские пакеты">выше</a>). В этом случае рекомендуется связать приложение с определенным локальным IP-адресом вместо 0.</p><p>Примеры:</p><div class="itemizedlist"><ul type="disc"><li><p>Squid: В файле <code class="filename">squid.conf</code> задайте <span class="bold"><strong>tcp_outgoing_address</strong></span> равным IP-адресу интерфейса, на котором будет работать Squid.</p></li><li><p>Для OpenVPN задайте опцию <span class="bold"><strong>local</strong></span>(<span class="bold"><strong>--local</strong></span> в командной строке с IP-адресом, на котором должен принимать соединения сервер.</p></li></ul></div></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h3 class="title"><a id="route_rules"></a>/etc/shorewall/route_rules</h3></div></div></div><p>Файл <code class="filename">/etc/shorewall/route_rules</code> добавлен в Shorewall в версии 3.2.0. Файл <code class="filename">route_rules</code> позволяет направлять определенный трафик через конкретного провайдера, как и записи из файла <code class="filename">tcrules</code> . Разница между этими двумя файлами состоит в том что записи в <code class="filename">route_rules</code> никак не связаны с Netfilter.</p><div class="warning" style="margin-left: 0.5in; margin-right: 0.5in;"><h3 class="title">Warning</h3><p>В Shorewall версий ниже 3.4.0 записи из файла <code class="filename">/etc/shorewall/route_rules</code> необратимо изменяют маршрутизацию в системе, то есть эти изменения не отменяются при вызове команды <span class="command"><strong>shorewall stop</strong></span> или <span class="command"><strong>shorewall clear</strong></span>. Для того чтобы восстановить исходные маршруты, может потребоваться перезапустить сеть. Обычно это делает команда <span class="command"><strong>/etc/init.d/network restart</strong></span> или <span class="command"><strong>/etc/init.d/networking restart</strong></span>. Обратитесь к документации по сети вашего дистрибутива.</p><p>Также обратите внимание на <a class="link" href="#Undo" title="Warning">предупреждение в разделе <span class="emphasis"><em>Какие функции выполняет запись в файле providers</em></span></a>.</p></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h4 class="title"><a id="Routing_rules"></a>Правила маршрутизации</h4></div></div></div><p>Правила маршрутизации управляются ядром Linux. Их можно просмотреть командой <span class="command"><strong>ip rule ls</strong></span> . При маршрутизации пакета правила обрабатываются в указанном порядке, пока не будет найден маршрут пакета.</p><pre class="programlisting">gateway:~ # <span class="command"><strong>ip rule ls</strong></span>
0:      from all lookup local                &lt;=== Локальные IP-адреса (система файрвола)
10001:  from all fwmark 0x1 lookup Blarg     &lt;=== Это и следующее правило генерируются 
10002:  from all fwmark 0x2 lookup Comcast        записями 'MARK' из /etc/shorewall/providers.
20000:  from 206.124.146.176 lookup Blarg    &lt;=== Это и следующее правило не генерируются, если
20256:  from 24.12.22.33 lookup Comcast         указана опция 'loose'; они основаны на выводе 'ip addr ls'
32766:  from all lookup main                 &lt;=== Это таблица маршрутизации, показанная в выводе 'iproute -n'
32767:  from all lookup default              &lt;=== Эта таблица обычно пуста
gateway:~ #</pre><p>В этом примере настроены два провайдера:  Blarg и Comcast, с метками MARK 1 и 2 соответственно.</p></div><div class="section" lang="en" xml:lang="en"><div class="titlepage"><div><div><h4 class="title"><a id="route_rules_columns"></a>Файл route_rules</h4></div></div></div><p>Далее описаны столбцы файла:</p><div class="variablelist"><dl><dt><span class="term">SOURCE (Необязательный)</span></dt><dd><p>IP-адрес (подсеть или хост), с которыми совпадает исходный IP-адрес пакета. Может указываться как имя интерфейса, за которым следует необязательная часть из ":" и адреса. Если указано устройство 'lo', то пакет должен исходить из системы файрвола.</p></dd><dt><span class="term">DEST (Необязательный)</span></dt><dd><p>IP-адрес (подсеть или хост), с которыми совпадает целевой IP-адрес пакета.</p><p>Если опущен SOURCE или DEST, то в укажите в одном из этих полей "-". Необходимо задать хотя бы одно из полей SOURCE или DEST.</p></dd><dt><span class="term">PROVIDER</span></dt><dd><p>Провайдер, через которого должен проходить трафик. Может быть задан как имя провайдера или его номер.</p></dd><dt><span class="term">PRIORITY</span></dt><dd><p>Приоритет правила, определяющий порядок обработки правил.</p><p>1000-1999: перед правилами Shorewall, генерируемыми на основе меток 'MARK'</p><p>11000- 11999: после правил 'MARK', но перед правилами Shorewall, генерируемыми для интерфейсов провайдеров.</p><p>26000-26999: после интерфейсов провайдеров, но перед правилом 'default'.</p><p>Правила с одинаковым приоритетом обрабатываются в том порядке, как они указаны в файле.</p></dd></dl></div><p>Пример 1: Направить весь трафик, приходящий на eth1, через Comcast.</p><pre class="programlisting">#SOURCE            DEST      PROVIDER        PRIORITY
eth1               -         Comcast         1000</pre><p>С этим правилом вывод <span class="command"><strong>ip rule ls</strong></span> будет следующим.</p><pre class="programlisting">gateway:~ # <span class="command"><strong>ip rule ls</strong></span>
0:      from all lookup local
1000:   from all iif eth1 lookup Comcast
10001:  from all fwmark 0x1 lookup Blarg
10002:  from all fwmark 0x2 lookup Comcast
20000:  from 206.124.146.176 lookup Blarg
20256:  from 24.12.22.33 lookup Comcast
32766:  from all lookup main
32767:  from all lookup default
gateway:~ #</pre><p>Обратите внимание, что приоритет 1000 приводит к тому, что проверка на <code class="filename">eth1</code> осуществляется перед проверкой fwmark.</p><p>Пример 2: Используется OpenVPN (маршрутизируемая конфигурация /tunX) в сочетании с несколькими провайдерами. В этом случае необходимо настроить правило, согласно которому трафик OpenVPN будет направляться обратно через интерфейс tunX, а не через какого-либо из провайдеров. 10.8.0.0/24 - это подсеть, выбранная для OpenVPN (сервер 10.8.0.0 255.255.255.0).</p><pre class="programlisting">#SOURCE                 DEST            PROVIDER        PRIORITY
-                       10.8.0.0/24     main            1000</pre></div></div></div></div></body></html>