<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>http://www.qbsd.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nordwind</id>
	<title>OpenBSD-Wiki - Вклад участника [ru]</title>
	<link rel="self" type="application/atom+xml" href="http://www.qbsd.ru/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Nordwind"/>
	<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php/%D0%A1%D0%BB%D1%83%D0%B6%D0%B5%D0%B1%D0%BD%D0%B0%D1%8F:%D0%92%D0%BA%D0%BB%D0%B0%D0%B4/Nordwind"/>
	<updated>2026-05-02T20:24:09Z</updated>
	<subtitle>Вклад участника</subtitle>
	<generator>MediaWiki 1.35.2</generator>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Rsync&amp;diff=251</id>
		<title>Алгоритм Rsync</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Rsync&amp;diff=251"/>
		<updated>2013-07-15T13:02:26Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Поиск сигнатур */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Для чего он нужен?==&lt;br /&gt;
&lt;br /&gt;
Современные средства и протоколы удалённого копирования файлов (например, http, ftp, rcp), каждый раз полностью пересылают данные, несмотря на возможно уже существующею старую версию этих данных. Хотя и возможно воссоздать только изменения, например, с помощью утилиты diff, если существует старая копия наряду с новой, и тем самым пересылать только изменения, но в практике это не всегда удобно и часто приводит к ошибкам.&lt;br /&gt;
&lt;br /&gt;
Задачи алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
# Он должен работать с произвольными данными, не только с обычным текстом.&lt;br /&gt;
# Размер передаваемых данных должен быть примерно равен размеру diff файла.&lt;br /&gt;
# Он должен быстро работать с большими файлами.&lt;br /&gt;
# Алгоритм не должен иметь какие-либо предварительные знания о статусе этих файлов, но должен эффективно находить их возможные сходства.&lt;br /&gt;
# Использовать мало ресурсов. &lt;br /&gt;
&lt;br /&gt;
Представим, что у нас имеются файлы &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, и мы хотим обновить &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; таким образом, чтобы его содержимое было идентично содержимому файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;. Самый простой и очевидный способ — это скопировать &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Теперь представим, что эти файлы находятся на двух разных машинах, соединённых медленным каналом связи, например, с помощью &amp;lt;tt&amp;gt;dialup&amp;lt;/tt&amp;gt; модема. Если файл &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; большой, копирование &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; будет происходить очень медленно. Чтобы сделать это быстрее, мы можем сжать &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, перед тем как пересылать его. Но обычный коэффициент сжатия колеблется от 2 до 4, что так же не подойдёт для нашей медленной связи.&lt;br /&gt;
&lt;br /&gt;
Предположим, что файлы &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; почти одинаковы (возможно, оба были получены из одного общего файла). Для увеличения производительности копирования мы можем воспользоваться преимуществом их сходства. Обычное решение этой проблемы заключается в том, чтобы пересылать только изменения между файлами &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; и затем использовать их для реконструкции фала &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Но проблема в том, что для получения этих изменений необходимо иметь возможность чтения обоих файлов. Поэтому нам нужно иметь оба файла на одной из сторон нашего соединения. В противном случае, этот алгоритм использоваться не может. Для решения этой проблемы и был разработан алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Общий алгоритм&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
На двух разных компьютерах &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; и &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039;, соединённых медленным каналом связи (например, через модем), находятся два файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Структура алгоритма:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; отсылает некоторые данные &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; на компьютер &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; &lt;br /&gt;
# &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; сравнивает эти данные с файлом &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и отсылает некоторые данные &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; на компьютер &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; &lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; создаёт копию файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; на основе файла &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, данных &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Главный вопрос в том, какую форму примут данные &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;, как компьютер &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; будет использовать &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; для сопоставления с файлом &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, и как &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; будет реконструировать &amp;#039;&amp;#039;A&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; разбивает файл &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; на блоки длиной &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039; (последний блок может быть меньше &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039;байт) и вычисляет две сигнатуры &amp;#039;&amp;#039;&amp;#039;Rb&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;Sb&amp;#039;&amp;#039;&amp;#039; для каждого блока, после чего пересылает эти сигнатуры к &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039;. &lt;br /&gt;
# &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; вычисляет сигнатуры &amp;#039;&amp;#039;Ra&amp;#039;&amp;#039; для блоков длиной &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039; для каждого байтового смещения. После чего сравнивает их с &amp;#039;&amp;#039;&amp;#039;Rb&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
# Для блоков, чьи &amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039; сигнатуры совпали, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; вычисляет &amp;#039;&amp;#039;&amp;#039;Sa&amp;#039;&amp;#039;&amp;#039; и сравнивает с &amp;#039;&amp;#039;&amp;#039;Sb&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
# Если &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; сигнатуры совпадают, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; отсылает уведомление с номером совпавшего блока, в противном случае &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; пересылает один байт. &lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; получает номера совпавших блоков из &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; или одиночные байты из файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и на основе этих данных создаёт копию файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Важно понимать, что ключом алгоритма является создание двух сигнатур — быстрой и стойкой. Быстрая (&amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;) используется как фильтр (на компьютере &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; она вычисляется для каждого байтового смещения!). Стойкая (&amp;#039;&amp;#039;S&amp;#039;&amp;#039;) используется для более точной проверки.&lt;br /&gt;
[[File:http://www.openbsd.pw/files/openbsd_ru/docs/images/rsync.gif|link=http://www.openbsd.pw/files/openbsd_ru/docs/images/rsync.gif|Алгоритм rsync]] &lt;br /&gt;
Алгоритм rsync&lt;br /&gt;
&lt;br /&gt;
== Стойкая сигнатура ==&lt;br /&gt;
&lt;br /&gt;
Стойкая сигнатура может не быть быстрой, так как вычисляется только при совпадении простой, быстрой сигнатуры. Главным свойством стойкой сигнатуры должна быть минимальная вероятность отказа, иначе говоря, наличие одной и той же сигнатуры для двух разных блоков.&lt;br /&gt;
&lt;br /&gt;
Существует множество алгоритмов с такими свойствами, возможно, наиболее известный — это алгоритм хеширования &amp;#039;&amp;#039;Message Digest&amp;#039;&amp;#039;. Он часто используется в криптографических программах.&lt;br /&gt;
&lt;br /&gt;
== Быстрая сигнатура ==&lt;br /&gt;
&lt;br /&gt;
Быстрая сигнатура очень важна для эффективности алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;. Она работает как фильтр, предотвращая вычисление стойкой сигнатуры. Основная задача быстрой сигнатуры — это максимально быстрое её вычисление для каждого байтового смещения в файле.&lt;br /&gt;
&lt;br /&gt;
Первоначально для создания быстрой сигнатуры в &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt; было опробовано простое склеивание первых и последних 4 байт блока. Хотя такой алгоритм, в принципе, работал, но был выявлен его серьёзный недостаток. Для определённых типов данных, например, для &amp;lt;tt&amp;gt;tar&amp;lt;/tt&amp;gt; файла, он слишком часто создавал одинаковые сигнатуры для разных частей файла, что приводило к многократному вычислению стойкой сигнатуры и, как следствие, падению производительности всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
Это привело к необходимости выбора нового алгоритма для вычисления быстрой сигнатуры, значение которого зависело бы от всех байт блока, но при этом вычисление оставалось таким же простым и быстрым. Им стал алгоритм, похожий на &amp;lt;tt&amp;gt;adler32 от Марка Адлера. &amp;lt;tt&amp;gt;Adler32&amp;lt;/tt&amp;gt; — алгоритм расчёта контрольных сумм, похожий на довольно распространённый алгоритм CRC32, но при этом более быстрый.&lt;br /&gt;
&lt;br /&gt;
== Поиск сигнатур ==&lt;br /&gt;
&lt;br /&gt;
Для эффективности поиска используется хеширование быстрой сигнатуры и трехуровневый поиск. Ключом хеш-функции является значение 32-x битной сигнатуры, а значением — сумма двух её (16-ти битных) половин.&lt;br /&gt;
&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Файл:search.gif |Поиск сигнатур&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
&lt;br /&gt;
На первом уровне формируется хеш-таблица размером в 2^16 элементов. Ключом хеш-функции является быстрая 32 битная сигнатура. Для каждой пары быстрой и стойкой сигнатуры, полученной от Beta, вычисляется 16 битный хеш 32 битной сигнатуры, после чего все это сортируется согласно 16 битному хешу. Каждый элемент хеш-таблицы указывает на первый элемент сортированных сигнатур, хеш значения которых совпадают, либо хранит в себе NULL, если сигнатур с таким хешом нет. Номер элемента хеш-таблицы соответствует значению хеш-функции, а именно сумме двух половин быстрой 32 битной сигнатуры.&lt;br /&gt;
&lt;br /&gt;
Затем для каждого байтового смещения вычисляется быстрая 32 битная сигнатура и 16 битное хеш-значение. Если элемент хеш-таблицы для этого хеш-значения не равен NULL, алгоритм поиска переходит на следующий уровень.&lt;br /&gt;
&lt;br /&gt;
На втором уровне происходит линейный поиск по сортированному списку сигнатур, начиная с элемента, указанного в хеш-таблице. Мы ищем быструю 32 битную сигнатуру, чьё значение совпадает с необходимым нам значением. Поиск прекращается при первом же несовпадении 16 битной сигнатуры. Если мы нашли такую 32 битную сигнатуру, алгоритм переходит на следующий уровень.&lt;br /&gt;
&lt;br /&gt;
На третьем уровне происходит вычисление стойкой сигнатуры для текущего смещения в файле и сравнение его со значением стойкой сигнатуры в сортированном списке. При совпадении предполагается, что мы нашли блок в файле &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, который есть в файле &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;. Фактически, блоки могут быть различны, но вероятность этого очень мала.&lt;br /&gt;
&lt;br /&gt;
При совпадении блоков &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; отсылает &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; данные из файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; между текущим смещением и предыдущим совпадением, а также индекс совпавшего блока, который есть в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;. Эти данные отсылаются сразу же при нахождении совпадения.&lt;br /&gt;
&lt;br /&gt;
Если совпадения найдено не было для текущего смещения в файле &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, вычисляется быстрая сигнатура для следующего байтового смещения и процедура поиска повторяется. При совпадении смещение увеличивается на размер совпавшего блока, и поиск продолжается.&lt;br /&gt;
&lt;br /&gt;
== Реконструкция файла ==&lt;br /&gt;
&lt;br /&gt;
Одна из простых частей алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt; — реконструкция файла. После того, как компьютер &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; отсылает сигнатуры, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; присылает байты из файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; или сообщения, которые содержат номера совпавших блоков.&lt;br /&gt;
&lt;br /&gt;
Для реконструкции файла &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; нам необходимо последовательно вписывать полученные байты в файл и при получении сообщения о совпавшем блоке вписывать целый блок из старого файла. Реконструкция не производится непосредственно в старом файле, так как нам необходим произвольный доступ к старым данным. Для реконструкции создаётся временный файл, который затем переименовывается.&lt;br /&gt;
&lt;br /&gt;
== Конвейерная обработка ==&lt;br /&gt;
&lt;br /&gt;
Важным фактором быстродействия является задержка между пересылаемыми файлами. Обычно используемые протоколы передачи данных, такие как &amp;lt;tt&amp;gt;ftp&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;rcp&amp;lt;/tt&amp;gt; или &amp;lt;tt&amp;gt;rdist&amp;lt;/tt&amp;gt; обрабатывают каждый файл как отдельную операцию, тем самым ожидая подтверждения о доставке текущего файла, перед тем как обрабатывать следующий.&lt;br /&gt;
&lt;br /&gt;
При использовании большого количества маленьких файлов (например, обычное зеркалирование Web-сайта) для пересылки через Internet, это время ожидания может сыграть роковую роль. Чтобы избежать этого, мы можем пересылать, не ожидая подтверждения. Этот метод также известен, как конвейерная обработка.&lt;br /&gt;
&lt;br /&gt;
Схема конвейерной обработки&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Файл:pipe.gif |Схема конвейерной обработки&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Процесс разбивается на 3 части — &amp;lt;tt&amp;gt;Generator&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;Sender&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt;. &amp;lt;tt&amp;gt;Generator&amp;lt;/tt&amp;gt; запускается на компьютере &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; и генерирует сигнатуры для всех файлов, которые необходимо переслать, и отсылает эти сигнатуры к &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039;. &amp;lt;tt&amp;gt;Sender&amp;lt;/tt&amp;gt;, запущенный на &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; получает сигнатуры и отсылает сообщения о совпавших блоках или целые байты &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039;. &amp;lt;tt&amp;gt;Receiver&amp;lt;/tt&amp;gt;, запущенный на &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039;, реконструирует файл, после чего он связывается с &amp;lt;tt&amp;gt;Generator&amp;lt;/tt&amp;gt;, чтобы сообщить об успешной передачи файла, либо передать ему, что определённый файл необходимо обработать заново.&lt;br /&gt;
&lt;br /&gt;
== Заключение ==&lt;br /&gt;
&lt;br /&gt;
Алгоритм rsync предоставляет эффективное решение проблемы удалённого обновления файлов. Метод двух сигнатур, используемый в алгоритме, позволяет эффективно находить совпадения на любом смещении файла. Алгоритм гарантирует точность передачи, подтверждая подлинность блока стойкой сигнатурой.&lt;br /&gt;
Используемая литература&lt;br /&gt;
&lt;br /&gt;
# [http://rsync.samba.org/tech_report/ Rsync technical report]. Andrew Tridgell и Paul Mackerras. 1998г.&lt;br /&gt;
# [http://www.samba.org/~tridge/phd_thesis.pdf Efficient Algorithms for Sorting and Synchronization]. Andrew Tridgell. 2000г.&lt;br /&gt;
# [http://www.gzip.org/zlib/zlib_tech.html Zlib Technical Details]. Jean-loup Gailly и Mark Adler.&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Rsync&amp;diff=250</id>
		<title>Алгоритм Rsync</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Rsync&amp;diff=250"/>
		<updated>2013-07-10T15:39:03Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Быстрая сигнатура */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Для чего он нужен?==&lt;br /&gt;
&lt;br /&gt;
Современные средства и протоколы удалённого копирования файлов (например, http, ftp, rcp), каждый раз полностью пересылают данные, несмотря на возможно уже существующею старую версию этих данных. Хотя и возможно воссоздать только изменения, например, с помощью утилиты diff, если существует старая копия наряду с новой, и тем самым пересылать только изменения, но в практике это не всегда удобно и часто приводит к ошибкам.&lt;br /&gt;
&lt;br /&gt;
Задачи алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
# Он должен работать с произвольными данными, не только с обычным текстом.&lt;br /&gt;
# Размер передаваемых данных должен быть примерно равен размеру diff файла.&lt;br /&gt;
# Он должен быстро работать с большими файлами.&lt;br /&gt;
# Алгоритм не должен иметь какие-либо предварительные знания о статусе этих файлов, но должен эффективно находить их возможные сходства.&lt;br /&gt;
# Использовать мало ресурсов. &lt;br /&gt;
&lt;br /&gt;
Представим, что у нас имеются файлы &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, и мы хотим обновить &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; таким образом, чтобы его содержимое было идентично содержимому файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;. Самый простой и очевидный способ — это скопировать &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Теперь представим, что эти файлы находятся на двух разных машинах, соединённых медленным каналом связи, например, с помощью &amp;lt;tt&amp;gt;dialup&amp;lt;/tt&amp;gt; модема. Если файл &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; большой, копирование &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; будет происходить очень медленно. Чтобы сделать это быстрее, мы можем сжать &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, перед тем как пересылать его. Но обычный коэффициент сжатия колеблется от 2 до 4, что так же не подойдёт для нашей медленной связи.&lt;br /&gt;
&lt;br /&gt;
Предположим, что файлы &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; почти одинаковы (возможно, оба были получены из одного общего файла). Для увеличения производительности копирования мы можем воспользоваться преимуществом их сходства. Обычное решение этой проблемы заключается в том, чтобы пересылать только изменения между файлами &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; и затем использовать их для реконструкции фала &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Но проблема в том, что для получения этих изменений необходимо иметь возможность чтения обоих файлов. Поэтому нам нужно иметь оба файла на одной из сторон нашего соединения. В противном случае, этот алгоритм использоваться не может. Для решения этой проблемы и был разработан алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Общий алгоритм&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
На двух разных компьютерах &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; и &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039;, соединённых медленным каналом связи (например, через модем), находятся два файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Структура алгоритма:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; отсылает некоторые данные &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; на компьютер &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; &lt;br /&gt;
# &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; сравнивает эти данные с файлом &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и отсылает некоторые данные &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; на компьютер &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; &lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; создаёт копию файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; на основе файла &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, данных &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Главный вопрос в том, какую форму примут данные &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;, как компьютер &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; будет использовать &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; для сопоставления с файлом &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, и как &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; будет реконструировать &amp;#039;&amp;#039;A&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; разбивает файл &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; на блоки длиной &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039; (последний блок может быть меньше &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039;байт) и вычисляет две сигнатуры &amp;#039;&amp;#039;&amp;#039;Rb&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;Sb&amp;#039;&amp;#039;&amp;#039; для каждого блока, после чего пересылает эти сигнатуры к &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039;. &lt;br /&gt;
# &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; вычисляет сигнатуры &amp;#039;&amp;#039;Ra&amp;#039;&amp;#039; для блоков длиной &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039; для каждого байтового смещения. После чего сравнивает их с &amp;#039;&amp;#039;&amp;#039;Rb&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
# Для блоков, чьи &amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039; сигнатуры совпали, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; вычисляет &amp;#039;&amp;#039;&amp;#039;Sa&amp;#039;&amp;#039;&amp;#039; и сравнивает с &amp;#039;&amp;#039;&amp;#039;Sb&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
# Если &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; сигнатуры совпадают, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; отсылает уведомление с номером совпавшего блока, в противном случае &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; пересылает один байт. &lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; получает номера совпавших блоков из &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; или одиночные байты из файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и на основе этих данных создаёт копию файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Важно понимать, что ключом алгоритма является создание двух сигнатур — быстрой и стойкой. Быстрая (&amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;) используется как фильтр (на компьютере &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; она вычисляется для каждого байтового смещения!). Стойкая (&amp;#039;&amp;#039;S&amp;#039;&amp;#039;) используется для более точной проверки.&lt;br /&gt;
[[File:http://www.openbsd.pw/files/openbsd_ru/docs/images/rsync.gif|link=http://www.openbsd.pw/files/openbsd_ru/docs/images/rsync.gif|Алгоритм rsync]] &lt;br /&gt;
Алгоритм rsync&lt;br /&gt;
&lt;br /&gt;
== Стойкая сигнатура ==&lt;br /&gt;
&lt;br /&gt;
Стойкая сигнатура может не быть быстрой, так как вычисляется только при совпадении простой, быстрой сигнатуры. Главным свойством стойкой сигнатуры должна быть минимальная вероятность отказа, иначе говоря, наличие одной и той же сигнатуры для двух разных блоков.&lt;br /&gt;
&lt;br /&gt;
Существует множество алгоритмов с такими свойствами, возможно, наиболее известный — это алгоритм хеширования &amp;#039;&amp;#039;Message Digest&amp;#039;&amp;#039;. Он часто используется в криптографических программах.&lt;br /&gt;
&lt;br /&gt;
== Быстрая сигнатура ==&lt;br /&gt;
&lt;br /&gt;
Быстрая сигнатура очень важна для эффективности алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;. Она работает как фильтр, предотвращая вычисление стойкой сигнатуры. Основная задача быстрой сигнатуры — это максимально быстрое её вычисление для каждого байтового смещения в файле.&lt;br /&gt;
&lt;br /&gt;
Первоначально для создания быстрой сигнатуры в &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt; было опробовано простое склеивание первых и последних 4 байт блока. Хотя такой алгоритм, в принципе, работал, но был выявлен его серьёзный недостаток. Для определённых типов данных, например, для &amp;lt;tt&amp;gt;tar&amp;lt;/tt&amp;gt; файла, он слишком часто создавал одинаковые сигнатуры для разных частей файла, что приводило к многократному вычислению стойкой сигнатуры и, как следствие, падению производительности всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
Это привело к необходимости выбора нового алгоритма для вычисления быстрой сигнатуры, значение которого зависело бы от всех байт блока, но при этом вычисление оставалось таким же простым и быстрым. Им стал алгоритм, похожий на &amp;lt;tt&amp;gt;adler32 от Марка Адлера. &amp;lt;tt&amp;gt;Adler32&amp;lt;/tt&amp;gt; — алгоритм расчёта контрольных сумм, похожий на довольно распространённый алгоритм CRC32, но при этом более быстрый.&lt;br /&gt;
&lt;br /&gt;
== Поиск сигнатур ==&lt;br /&gt;
&lt;br /&gt;
Для эффективности поиска используется хеширование быстрой сигнатуры и трехуровневый поиск. Ключом хеш-функции является значение 32-x битной сигнатуры, а значением — сумма двух её (16-ти битных) половин.&lt;br /&gt;
&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
&amp;lt;gallery&amp;gt;&lt;br /&gt;
Файл:Example.jpg|Описание1&lt;br /&gt;
Файл:Example.jpg|Описание2&lt;br /&gt;
&amp;lt;/gallery&amp;gt;&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
&lt;br /&gt;
На первом уровне формируется хеш-таблица размером в 2^16 элементов. Ключом хеш-функции является быстрая 32 битная сигнатура. Для каждой пары быстрой и стойкой сигнатуры, полученной от Beta, вычисляется 16 битный хеш 32 битной сигнатуры, после чего все это сортируется согласно 16 битному хешу. Каждый элемент хеш-таблицы указывает на первый элемент сортированных сигнатур, хеш значения которых совпадают, либо хранит в себе NULL, если сигнатур с таким хешом нет. Номер элемента хеш-таблицы соответствует значению хеш-функции, а именно сумме двух половин быстрой 32 битной сигнатуры.&lt;br /&gt;
&lt;br /&gt;
Затем для каждого байтового смещения вычисляется быстрая 32 битная сигнатура и 16 битное хеш-значение. Если элемент хеш-таблицы для этого хеш-значения не равен NULL, алгоритм поиска переходит на следующий уровень.&lt;br /&gt;
&lt;br /&gt;
На втором уровне происходит линейный поиск по сортированному списку сигнатур, начиная с элемента, указанного в хеш-таблице. Мы ищем быструю 32 битную сигнатуру, чьё значение совпадает с необходимым нам значением. Поиск прекращается при первом же несовпадении 16 битной сигнатуры. Если мы нашли такую 32 битную сигнатуру, алгоритм переходит на следующий уровень.&lt;br /&gt;
&lt;br /&gt;
На третьем уровне происходит вычисление стойкой сигнатуры для текущего смещения в файле и сравнение его со значением стойкой сигнатуры в сортированном списке. При совпадении предполагается, что мы нашли блок в файле A, который есть в файле B. Фактически, блоки могут быть различны, но вероятность этого очень мала.&lt;br /&gt;
&lt;br /&gt;
При совпадении блоков Alpha отсылает Beta данные из файла A между текущим смещением и предыдущим совпадением, а также индекс совпавшего блока, который есть в B. Эти данные отсылаются сразу же при нахождении совпадения.&lt;br /&gt;
&lt;br /&gt;
Если совпадения найдено не было для текущего смещения в файле A, вычисляется быстрая сигнатура для следующего байтового смещения и процедура поиска повторяется. При совпадении смещение увеличивается на размер совпавшего блока, и поиск продолжается.&lt;br /&gt;
Реконструкция файла&lt;br /&gt;
Одна из простых частей алгоритма rsync — реконструкция файла. После того, как компьютер Beta отсылает сигнатуры, Alpha присылает байты из файла A или сообщения, которые содержат номера совпавших блоков.&lt;br /&gt;
&lt;br /&gt;
Для реконструкции файла B нам необходимо последовательно вписывать полученные байты в файл и при получении сообщения о совпавшем блоке вписывать целый блок из старого файла. Реконструкция не производится непосредственно в старом файле, так как нам необходим произвольный доступ к старым данным. Для реконструкции создаётся временный файл, который затем переименовывается.&lt;br /&gt;
Конвейерная обработка&lt;br /&gt;
Важным фактором быстродействия является задержка между пересылаемыми файлами. Обычно используемые протоколы передачи данных, такие как ftp, rcp или rdist обрабатывают каждый файл как отдельную операцию, тем самым ожидая подтверждения о доставке текущего файла, перед тем как обрабатывать следующий.&lt;br /&gt;
&lt;br /&gt;
При использовании большого количества маленьких файлов (например, обычное зеркалирование Web сайта) для пересылки через Internet, это время ожидания может сыграть роковую роль. Чтобы избежать этого, мы можем пересылать, не ожидая подтверждения. Этот метод также известен, как конвейерная обработка.&lt;br /&gt;
Схема конвейерной обработки&lt;br /&gt;
Схема конвейерной обработки&lt;br /&gt;
&lt;br /&gt;
Процесс разбивается на 3 части — Generator, Sender и Receiver. Generator запускается на компьютере Beta и генерирует сигнатуры для всех файлов, которые необходимо переслать, и отсылает эти сигнатуры к Alpha. Sender, запущенный на Alpha получает сигнатуры и отсылает сообщения о совпавших блоках или целые байты Beta. Receiver, запущенный на Beta, реконструирует файл, после чего он связывается с Generator, чтобы сообщить об успешной передачи файла, либо передать ему, что определённый файл необходимо обработать заново.&lt;br /&gt;
Заключение&lt;br /&gt;
Алгоритм rsync предоставляет эффективное решение проблемы удалённого обновления файлов. Метод двух сигнатур, используемый в алгоритме, позволяет эффективно находить совпадения на любом смещении файла. Алгоритм гарантирует точность передачи, подтверждая подлинность блока стойкой сигнатурой.&lt;br /&gt;
Используемая литература&lt;br /&gt;
&lt;br /&gt;
    Rsync technical report. Andrew Tridgell и Paul Mackerras. 1998г.&lt;br /&gt;
    Efficient Algorithms for Sorting and Synchronization. Andrew Tridgell. 2000г.&lt;br /&gt;
    Zlib Technical Details. Jean-loup Gailly и Mark Adler.&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Rsync&amp;diff=249</id>
		<title>Алгоритм Rsync</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Rsync&amp;diff=249"/>
		<updated>2013-07-10T14:53:16Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Алгоритм */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Для чего он нужен?==&lt;br /&gt;
&lt;br /&gt;
Современные средства и протоколы удалённого копирования файлов (например, http, ftp, rcp), каждый раз полностью пересылают данные, несмотря на возможно уже существующею старую версию этих данных. Хотя и возможно воссоздать только изменения, например, с помощью утилиты diff, если существует старая копия наряду с новой, и тем самым пересылать только изменения, но в практике это не всегда удобно и часто приводит к ошибкам.&lt;br /&gt;
&lt;br /&gt;
Задачи алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
# Он должен работать с произвольными данными, не только с обычным текстом.&lt;br /&gt;
# Размер передаваемых данных должен быть примерно равен размеру diff файла.&lt;br /&gt;
# Он должен быстро работать с большими файлами.&lt;br /&gt;
# Алгоритм не должен иметь какие-либо предварительные знания о статусе этих файлов, но должен эффективно находить их возможные сходства.&lt;br /&gt;
# Использовать мало ресурсов. &lt;br /&gt;
&lt;br /&gt;
Представим, что у нас имеются файлы &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, и мы хотим обновить &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; таким образом, чтобы его содержимое было идентично содержимому файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;. Самый простой и очевидный способ — это скопировать &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Теперь представим, что эти файлы находятся на двух разных машинах, соединённых медленным каналом связи, например, с помощью &amp;lt;tt&amp;gt;dialup&amp;lt;/tt&amp;gt; модема. Если файл &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; большой, копирование &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; будет происходить очень медленно. Чтобы сделать это быстрее, мы можем сжать &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, перед тем как пересылать его. Но обычный коэффициент сжатия колеблется от 2 до 4, что так же не подойдёт для нашей медленной связи.&lt;br /&gt;
&lt;br /&gt;
Предположим, что файлы &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; почти одинаковы (возможно, оба были получены из одного общего файла). Для увеличения производительности копирования мы можем воспользоваться преимуществом их сходства. Обычное решение этой проблемы заключается в том, чтобы пересылать только изменения между файлами &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; и затем использовать их для реконструкции фала &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Но проблема в том, что для получения этих изменений необходимо иметь возможность чтения обоих файлов. Поэтому нам нужно иметь оба файла на одной из сторон нашего соединения. В противном случае, этот алгоритм использоваться не может. Для решения этой проблемы и был разработан алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Общий алгоритм&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
На двух разных компьютерах &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; и &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039;, соединённых медленным каналом связи (например, через модем), находятся два файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Структура алгоритма:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; отсылает некоторые данные &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; на компьютер &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; &lt;br /&gt;
# &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; сравнивает эти данные с файлом &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и отсылает некоторые данные &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; на компьютер &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; &lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; создаёт копию файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; на основе файла &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, данных &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Главный вопрос в том, какую форму примут данные &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;, как компьютер &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; будет использовать &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; для сопоставления с файлом &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, и как &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; будет реконструировать &amp;#039;&amp;#039;A&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; разбивает файл &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; на блоки длиной &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039; (последний блок может быть меньше &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039;байт) и вычисляет две сигнатуры &amp;#039;&amp;#039;&amp;#039;Rb&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;Sb&amp;#039;&amp;#039;&amp;#039; для каждого блока, после чего пересылает эти сигнатуры к &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039;. &lt;br /&gt;
# &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; вычисляет сигнатуры &amp;#039;&amp;#039;Ra&amp;#039;&amp;#039; для блоков длиной &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039; для каждого байтового смещения. После чего сравнивает их с &amp;#039;&amp;#039;&amp;#039;Rb&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
# Для блоков, чьи &amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039; сигнатуры совпали, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; вычисляет &amp;#039;&amp;#039;&amp;#039;Sa&amp;#039;&amp;#039;&amp;#039; и сравнивает с &amp;#039;&amp;#039;&amp;#039;Sb&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
# Если &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; сигнатуры совпадают, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; отсылает уведомление с номером совпавшего блока, в противном случае &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; пересылает один байт. &lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; получает номера совпавших блоков из &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; или одиночные байты из файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и на основе этих данных создаёт копию файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Важно понимать, что ключом алгоритма является создание двух сигнатур — быстрой и стойкой. Быстрая (&amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;) используется как фильтр (на компьютере &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; она вычисляется для каждого байтового смещения!). Стойкая (&amp;#039;&amp;#039;S&amp;#039;&amp;#039;) используется для более точной проверки.&lt;br /&gt;
[[File:http://www.openbsd.pw/files/openbsd_ru/docs/images/rsync.gif|link=http://www.openbsd.pw/files/openbsd_ru/docs/images/rsync.gif|Алгоритм rsync]] &lt;br /&gt;
Алгоритм rsync&lt;br /&gt;
&lt;br /&gt;
== Стойкая сигнатура ==&lt;br /&gt;
&lt;br /&gt;
Стойкая сигнатура может не быть быстрой, так как вычисляется только при совпадении простой, быстрой сигнатуры. Главным свойством стойкой сигнатуры должна быть минимальная вероятность отказа, иначе говоря, наличие одной и той же сигнатуры для двух разных блоков.&lt;br /&gt;
&lt;br /&gt;
Существует множество алгоритмов с такими свойствами, возможно, наиболее известный — это алгоритм хеширования &amp;#039;&amp;#039;Message Digest&amp;#039;&amp;#039;. Он часто используется в криптографических программах.&lt;br /&gt;
&lt;br /&gt;
== Быстрая сигнатура ==&lt;br /&gt;
&lt;br /&gt;
Быстрая сигнатура очень важна для эффективности алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;. Она работает как фильтр, предотвращая вычисление стойкой сигнатуры. Основная задача быстрой сигнатуры — это максимально быстрое её вычисление для каждого байтового смещения в файле.&lt;br /&gt;
&lt;br /&gt;
Первоначально для создания быстрой сигнатуры в &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt; было опробовано простое склеивание первых и последних 4 байт блока. Хотя такой алгоритм, в принципе, работал, но был выявлен его серьёзный недостаток. Для определённых типов данных, например, для &amp;lt;tt&amp;gt;tar&amp;lt;/tt&amp;gt; файла, он слишком часто создавал одинаковые сигнатуры для разных частей файла, что приводило к многократному вычислению стойкой сигнатуры и, как следствие, падению производительности всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
Это привело к необходимости выбора нового алгоритма для вычисления быстрой сигнатуры, значение которого зависело бы от всех байт блока, но при этом вычисление оставалось таким же простым и быстрым. Им стал алгоритм, похожий на adler32 от Марка Адлера. Adler32 — алгоритм расчёта контрольных сумм, похожий на довольно распространённый алгоритм CRC32, но при этом более быстрый.&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
Для эффективности поиска используется хеширование быстрой сигнатуры и трехуровневый поиск. Ключом хеш-функции является значение 32 битной сигнатуры, а значением — сумма двух её (16 битных) половин.&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
&lt;br /&gt;
На первом уровне формируется хеш-таблица размером в 2^16 элементов. Ключом хеш-функции является быстрая 32 битная сигнатура. Для каждой пары быстрой и стойкой сигнатуры, полученной от Beta, вычисляется 16 битный хеш 32 битной сигнатуры, после чего все это сортируется согласно 16 битному хешу. Каждый элемент хеш-таблицы указывает на первый элемент сортированных сигнатур, хеш значения которых совпадают, либо хранит в себе NULL, если сигнатур с таким хешом нет. Номер элемента хеш-таблицы соответствует значению хеш-функции, а именно сумме двух половин быстрой 32 битной сигнатуры.&lt;br /&gt;
&lt;br /&gt;
Затем для каждого байтового смещения вычисляется быстрая 32 битная сигнатура и 16 битное хеш-значение. Если элемент хеш-таблицы для этого хеш-значения не равен NULL, алгоритм поиска переходит на следующий уровень.&lt;br /&gt;
&lt;br /&gt;
На втором уровне происходит линейный поиск по сортированному списку сигнатур, начиная с элемента, указанного в хеш-таблице. Мы ищем быструю 32 битную сигнатуру, чьё значение совпадает с необходимым нам значением. Поиск прекращается при первом же несовпадении 16 битной сигнатуры. Если мы нашли такую 32 битную сигнатуру, алгоритм переходит на следующий уровень.&lt;br /&gt;
&lt;br /&gt;
На третьем уровне происходит вычисление стойкой сигнатуры для текущего смещения в файле и сравнение его со значением стойкой сигнатуры в сортированном списке. При совпадении предполагается, что мы нашли блок в файле A, который есть в файле B. Фактически, блоки могут быть различны, но вероятность этого очень мала.&lt;br /&gt;
&lt;br /&gt;
При совпадении блоков Alpha отсылает Beta данные из файла A между текущим смещением и предыдущим совпадением, а также индекс совпавшего блока, который есть в B. Эти данные отсылаются сразу же при нахождении совпадения.&lt;br /&gt;
&lt;br /&gt;
Если совпадения найдено не было для текущего смещения в файле A, вычисляется быстрая сигнатура для следующего байтового смещения и процедура поиска повторяется. При совпадении смещение увеличивается на размер совпавшего блока, и поиск продолжается.&lt;br /&gt;
Реконструкция файла&lt;br /&gt;
Одна из простых частей алгоритма rsync — реконструкция файла. После того, как компьютер Beta отсылает сигнатуры, Alpha присылает байты из файла A или сообщения, которые содержат номера совпавших блоков.&lt;br /&gt;
&lt;br /&gt;
Для реконструкции файла B нам необходимо последовательно вписывать полученные байты в файл и при получении сообщения о совпавшем блоке вписывать целый блок из старого файла. Реконструкция не производится непосредственно в старом файле, так как нам необходим произвольный доступ к старым данным. Для реконструкции создаётся временный файл, который затем переименовывается.&lt;br /&gt;
Конвейерная обработка&lt;br /&gt;
Важным фактором быстродействия является задержка между пересылаемыми файлами. Обычно используемые протоколы передачи данных, такие как ftp, rcp или rdist обрабатывают каждый файл как отдельную операцию, тем самым ожидая подтверждения о доставке текущего файла, перед тем как обрабатывать следующий.&lt;br /&gt;
&lt;br /&gt;
При использовании большого количества маленьких файлов (например, обычное зеркалирование Web сайта) для пересылки через Internet, это время ожидания может сыграть роковую роль. Чтобы избежать этого, мы можем пересылать, не ожидая подтверждения. Этот метод также известен, как конвейерная обработка.&lt;br /&gt;
Схема конвейерной обработки&lt;br /&gt;
Схема конвейерной обработки&lt;br /&gt;
&lt;br /&gt;
Процесс разбивается на 3 части — Generator, Sender и Receiver. Generator запускается на компьютере Beta и генерирует сигнатуры для всех файлов, которые необходимо переслать, и отсылает эти сигнатуры к Alpha. Sender, запущенный на Alpha получает сигнатуры и отсылает сообщения о совпавших блоках или целые байты Beta. Receiver, запущенный на Beta, реконструирует файл, после чего он связывается с Generator, чтобы сообщить об успешной передачи файла, либо передать ему, что определённый файл необходимо обработать заново.&lt;br /&gt;
Заключение&lt;br /&gt;
Алгоритм rsync предоставляет эффективное решение проблемы удалённого обновления файлов. Метод двух сигнатур, используемый в алгоритме, позволяет эффективно находить совпадения на любом смещении файла. Алгоритм гарантирует точность передачи, подтверждая подлинность блока стойкой сигнатурой.&lt;br /&gt;
Используемая литература&lt;br /&gt;
&lt;br /&gt;
    Rsync technical report. Andrew Tridgell и Paul Mackerras. 1998г.&lt;br /&gt;
    Efficient Algorithms for Sorting and Synchronization. Andrew Tridgell. 2000г.&lt;br /&gt;
    Zlib Technical Details. Jean-loup Gailly и Mark Adler.&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Rsync&amp;diff=248</id>
		<title>Алгоритм Rsync</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Rsync&amp;diff=248"/>
		<updated>2013-07-10T14:46:31Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Для чего он нужен?==&lt;br /&gt;
&lt;br /&gt;
Современные средства и протоколы удалённого копирования файлов (например, http, ftp, rcp), каждый раз полностью пересылают данные, несмотря на возможно уже существующею старую версию этих данных. Хотя и возможно воссоздать только изменения, например, с помощью утилиты diff, если существует старая копия наряду с новой, и тем самым пересылать только изменения, но в практике это не всегда удобно и часто приводит к ошибкам.&lt;br /&gt;
&lt;br /&gt;
Задачи алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
# Он должен работать с произвольными данными, не только с обычным текстом.&lt;br /&gt;
# Размер передаваемых данных должен быть примерно равен размеру diff файла.&lt;br /&gt;
# Он должен быстро работать с большими файлами.&lt;br /&gt;
# Алгоритм не должен иметь какие-либо предварительные знания о статусе этих файлов, но должен эффективно находить их возможные сходства.&lt;br /&gt;
# Использовать мало ресурсов. &lt;br /&gt;
&lt;br /&gt;
Представим, что у нас имеются файлы &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, и мы хотим обновить &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; таким образом, чтобы его содержимое было идентично содержимому файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;. Самый простой и очевидный способ — это скопировать &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Теперь представим, что эти файлы находятся на двух разных машинах, соединённых медленным каналом связи, например, с помощью &amp;lt;tt&amp;gt;dialup&amp;lt;/tt&amp;gt; модема. Если файл &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; большой, копирование &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; будет происходить очень медленно. Чтобы сделать это быстрее, мы можем сжать &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, перед тем как пересылать его. Но обычный коэффициент сжатия колеблется от 2 до 4, что так же не подойдёт для нашей медленной связи.&lt;br /&gt;
&lt;br /&gt;
Предположим, что файлы &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; почти одинаковы (возможно, оба были получены из одного общего файла). Для увеличения производительности копирования мы можем воспользоваться преимуществом их сходства. Обычное решение этой проблемы заключается в том, чтобы пересылать только изменения между файлами &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; и затем использовать их для реконструкции фала &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Но проблема в том, что для получения этих изменений необходимо иметь возможность чтения обоих файлов. Поэтому нам нужно иметь оба файла на одной из сторон нашего соединения. В противном случае, этот алгоритм использоваться не может. Для решения этой проблемы и был разработан алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Общий алгоритм&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
На двух разных компьютерах &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; и &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039;, соединённых медленным каналом связи (например, через модем), находятся два файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Структура алгоритма:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; отсылает некоторые данные &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; на компьютер &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; &lt;br /&gt;
# &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; сравнивает эти данные с файлом &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и отсылает некоторые данные &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; на компьютер &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; &lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; создаёт копию файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; на основе файла &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, данных &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Главный вопрос в том, какую форму примут данные &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;, как компьютер &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; будет использовать &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; для сопоставления с файлом &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, и как &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; будет реконструировать &amp;#039;&amp;#039;A&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;Алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; разбивает файл &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; на блоки длиной &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039; (последний блок может быть меньше &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039;байт) и вычисляет две сигнатуры &amp;#039;&amp;#039;&amp;#039;Rb&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;Sb&amp;#039;&amp;#039;&amp;#039; для каждого блока, после чего пересылает эти сигнатуры к &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039;. &lt;br /&gt;
# &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; вычисляет сигнатуры &amp;#039;&amp;#039;Ra&amp;#039;&amp;#039; для блоков длиной &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039; для каждого байтового смещения. После чего сравнивает их с &amp;#039;&amp;#039;&amp;#039;Rb&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
# Для блоков, чьи &amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039; сигнатуры совпали, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; вычисляет &amp;#039;&amp;#039;&amp;#039;Sa&amp;#039;&amp;#039;&amp;#039; и сравнивает с &amp;#039;&amp;#039;&amp;#039;Sb&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
# Если &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; сигнатуры совпадают, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; отсылает уведомление с номером совпавшего блока, в противном случае &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; пересылает один байт. &lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; получает номера совпавших блоков из &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; или одиночные байты из файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и на основе этих данных создаёт копию файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Важно понимать, что ключом алгоритма является создание двух сигнатур — быстрой и стойкой. Быстрая (&amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;) используется как фильтр (на компьютере &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; она вычисляется для каждого байтового смещения!). Стойкая (&amp;#039;&amp;#039;S&amp;#039;&amp;#039;) используется для более точной проверки.&lt;br /&gt;
[[File:rsync.gif|link=http://www.openbsd.pw/files/openbsd_ru/docs/images/rsync.gif|Алгоритм rsync]] &lt;br /&gt;
Алгоритм rsync&lt;br /&gt;
&lt;br /&gt;
== Стойкая сигнатура ==&lt;br /&gt;
&lt;br /&gt;
Стойкая сигнатура может не быть быстрой, так как вычисляется только при совпадении простой, быстрой сигнатуры. Главным свойством стойкой сигнатуры должна быть минимальная вероятность отказа, иначе говоря, наличие одной и той же сигнатуры для двух разных блоков.&lt;br /&gt;
&lt;br /&gt;
Существует множество алгоритмов с такими свойствами, возможно, наиболее известный — это алгоритм хеширования &amp;#039;&amp;#039;Message Digest&amp;#039;&amp;#039;. Он часто используется в криптографических программах.&lt;br /&gt;
&lt;br /&gt;
== Быстрая сигнатура ==&lt;br /&gt;
&lt;br /&gt;
Быстрая сигнатура очень важна для эффективности алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;. Она работает как фильтр, предотвращая вычисление стойкой сигнатуры. Основная задача быстрой сигнатуры — это максимально быстрое её вычисление для каждого байтового смещения в файле.&lt;br /&gt;
&lt;br /&gt;
Первоначально для создания быстрой сигнатуры в &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt; было опробовано простое склеивание первых и последних 4 байт блока. Хотя такой алгоритм, в принципе, работал, но был выявлен его серьёзный недостаток. Для определённых типов данных, например, для &amp;lt;tt&amp;gt;tar&amp;lt;/tt&amp;gt; файла, он слишком часто создавал одинаковые сигнатуры для разных частей файла, что приводило к многократному вычислению стойкой сигнатуры и, как следствие, падению производительности всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
Это привело к необходимости выбора нового алгоритма для вычисления быстрой сигнатуры, значение которого зависело бы от всех байт блока, но при этом вычисление оставалось таким же простым и быстрым. Им стал алгоритм, похожий на adler32 от Марка Адлера. Adler32 — алгоритм расчёта контрольных сумм, похожий на довольно распространённый алгоритм CRC32, но при этом более быстрый.&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
Для эффективности поиска используется хеширование быстрой сигнатуры и трехуровневый поиск. Ключом хеш-функции является значение 32 битной сигнатуры, а значением — сумма двух её (16 битных) половин.&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
&lt;br /&gt;
На первом уровне формируется хеш-таблица размером в 2^16 элементов. Ключом хеш-функции является быстрая 32 битная сигнатура. Для каждой пары быстрой и стойкой сигнатуры, полученной от Beta, вычисляется 16 битный хеш 32 битной сигнатуры, после чего все это сортируется согласно 16 битному хешу. Каждый элемент хеш-таблицы указывает на первый элемент сортированных сигнатур, хеш значения которых совпадают, либо хранит в себе NULL, если сигнатур с таким хешом нет. Номер элемента хеш-таблицы соответствует значению хеш-функции, а именно сумме двух половин быстрой 32 битной сигнатуры.&lt;br /&gt;
&lt;br /&gt;
Затем для каждого байтового смещения вычисляется быстрая 32 битная сигнатура и 16 битное хеш-значение. Если элемент хеш-таблицы для этого хеш-значения не равен NULL, алгоритм поиска переходит на следующий уровень.&lt;br /&gt;
&lt;br /&gt;
На втором уровне происходит линейный поиск по сортированному списку сигнатур, начиная с элемента, указанного в хеш-таблице. Мы ищем быструю 32 битную сигнатуру, чьё значение совпадает с необходимым нам значением. Поиск прекращается при первом же несовпадении 16 битной сигнатуры. Если мы нашли такую 32 битную сигнатуру, алгоритм переходит на следующий уровень.&lt;br /&gt;
&lt;br /&gt;
На третьем уровне происходит вычисление стойкой сигнатуры для текущего смещения в файле и сравнение его со значением стойкой сигнатуры в сортированном списке. При совпадении предполагается, что мы нашли блок в файле A, который есть в файле B. Фактически, блоки могут быть различны, но вероятность этого очень мала.&lt;br /&gt;
&lt;br /&gt;
При совпадении блоков Alpha отсылает Beta данные из файла A между текущим смещением и предыдущим совпадением, а также индекс совпавшего блока, который есть в B. Эти данные отсылаются сразу же при нахождении совпадения.&lt;br /&gt;
&lt;br /&gt;
Если совпадения найдено не было для текущего смещения в файле A, вычисляется быстрая сигнатура для следующего байтового смещения и процедура поиска повторяется. При совпадении смещение увеличивается на размер совпавшего блока, и поиск продолжается.&lt;br /&gt;
Реконструкция файла&lt;br /&gt;
Одна из простых частей алгоритма rsync — реконструкция файла. После того, как компьютер Beta отсылает сигнатуры, Alpha присылает байты из файла A или сообщения, которые содержат номера совпавших блоков.&lt;br /&gt;
&lt;br /&gt;
Для реконструкции файла B нам необходимо последовательно вписывать полученные байты в файл и при получении сообщения о совпавшем блоке вписывать целый блок из старого файла. Реконструкция не производится непосредственно в старом файле, так как нам необходим произвольный доступ к старым данным. Для реконструкции создаётся временный файл, который затем переименовывается.&lt;br /&gt;
Конвейерная обработка&lt;br /&gt;
Важным фактором быстродействия является задержка между пересылаемыми файлами. Обычно используемые протоколы передачи данных, такие как ftp, rcp или rdist обрабатывают каждый файл как отдельную операцию, тем самым ожидая подтверждения о доставке текущего файла, перед тем как обрабатывать следующий.&lt;br /&gt;
&lt;br /&gt;
При использовании большого количества маленьких файлов (например, обычное зеркалирование Web сайта) для пересылки через Internet, это время ожидания может сыграть роковую роль. Чтобы избежать этого, мы можем пересылать, не ожидая подтверждения. Этот метод также известен, как конвейерная обработка.&lt;br /&gt;
Схема конвейерной обработки&lt;br /&gt;
Схема конвейерной обработки&lt;br /&gt;
&lt;br /&gt;
Процесс разбивается на 3 части — Generator, Sender и Receiver. Generator запускается на компьютере Beta и генерирует сигнатуры для всех файлов, которые необходимо переслать, и отсылает эти сигнатуры к Alpha. Sender, запущенный на Alpha получает сигнатуры и отсылает сообщения о совпавших блоках или целые байты Beta. Receiver, запущенный на Beta, реконструирует файл, после чего он связывается с Generator, чтобы сообщить об успешной передачи файла, либо передать ему, что определённый файл необходимо обработать заново.&lt;br /&gt;
Заключение&lt;br /&gt;
Алгоритм rsync предоставляет эффективное решение проблемы удалённого обновления файлов. Метод двух сигнатур, используемый в алгоритме, позволяет эффективно находить совпадения на любом смещении файла. Алгоритм гарантирует точность передачи, подтверждая подлинность блока стойкой сигнатурой.&lt;br /&gt;
Используемая литература&lt;br /&gt;
&lt;br /&gt;
    Rsync technical report. Andrew Tridgell и Paul Mackerras. 1998г.&lt;br /&gt;
    Efficient Algorithms for Sorting and Synchronization. Andrew Tridgell. 2000г.&lt;br /&gt;
    Zlib Technical Details. Jean-loup Gailly и Mark Adler.&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Rsync&amp;diff=247</id>
		<title>Алгоритм Rsync</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Rsync&amp;diff=247"/>
		<updated>2013-07-10T14:44:54Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Для чего он нужен? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Для чего он нужен?==&lt;br /&gt;
&lt;br /&gt;
Современные средства и протоколы удалённого копирования файлов (например, http, ftp, rcp), каждый раз полностью пересылают данные, несмотря на возможно уже существующею старую версию этих данных. Хотя и возможно воссоздать только изменения, например, с помощью утилиты diff, если существует старая копия наряду с новой, и тем самым пересылать только изменения, но в практике это не всегда удобно и часто приводит к ошибкам.&lt;br /&gt;
&lt;br /&gt;
Задачи алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
# Он должен работать с произвольными данными, не только с обычным текстом.&lt;br /&gt;
# Размер передаваемых данных должен быть примерно равен размеру diff файла.&lt;br /&gt;
# Он должен быстро работать с большими файлами.&lt;br /&gt;
# Алгоритм не должен иметь какие-либо предварительные знания о статусе этих файлов, но должен эффективно находить их возможные сходства.&lt;br /&gt;
# Использовать мало ресурсов. &lt;br /&gt;
&lt;br /&gt;
Представим, что у нас имеются файлы &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, и мы хотим обновить &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; таким образом, чтобы его содержимое было идентично содержимому файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;. Самый простой и очевидный способ — это скопировать &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Теперь представим, что эти файлы находятся на двух разных машинах, соединённых медленным каналом связи, например, с помощью &amp;lt;tt&amp;gt;dialup&amp;lt;/tt&amp;gt; модема. Если файл &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; большой, копирование &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; будет происходить очень медленно. Чтобы сделать это быстрее, мы можем сжать &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, перед тем как пересылать его. Но обычный коэффициент сжатия колеблется от 2 до 4, что так же не подойдёт для нашей медленной связи.&lt;br /&gt;
&lt;br /&gt;
Предположим, что файлы &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; почти одинаковы (возможно, оба были получены из одного общего файла). Для увеличения производительности копирования мы можем воспользоваться преимуществом их сходства. Обычное решение этой проблемы заключается в том, чтобы пересылать только изменения между файлами &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; и затем использовать их для реконструкции фала &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Но проблема в том, что для получения этих изменений необходимо иметь возможность чтения обоих файлов. Поэтому нам нужно иметь оба файла на одной из сторон нашего соединения. В противном случае, этот алгоритм использоваться не может. Для решения этой проблемы и был разработан алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;=== Общий алгоритм ===&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
На двух разных компьютерах &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; и &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039;, соединённых медленным каналом связи (например, через модем), находятся два файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Структура алгоритма:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; отсылает некоторые данные &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; на компьютер &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; &lt;br /&gt;
# &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; сравнивает эти данные с файлом &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и отсылает некоторые данные &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; на компьютер &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; &lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; создаёт копию файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; на основе файла &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, данных &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Главный вопрос в том, какую форму примут данные &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;, как компьютер &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; будет использовать &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; для сопоставления с файлом &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, и как &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; будет реконструировать &amp;#039;&amp;#039;A&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;=== Алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt; ===&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; разбивает файл &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; на блоки длиной &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039; (последний блок может быть меньше &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039;байт) и вычисляет две сигнатуры &amp;#039;&amp;#039;&amp;#039;Rb&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;Sb&amp;#039;&amp;#039;&amp;#039; для каждого блока, после чего пересылает эти сигнатуры к &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039;. &lt;br /&gt;
# &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; вычисляет сигнатуры &amp;#039;&amp;#039;Ra&amp;#039;&amp;#039; для блоков длиной &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039; для каждого байтового смещения. После чего сравнивает их с &amp;#039;&amp;#039;&amp;#039;Rb&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
# Для блоков, чьи &amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039; сигнатуры совпали, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; вычисляет &amp;#039;&amp;#039;&amp;#039;Sa&amp;#039;&amp;#039;&amp;#039; и сравнивает с &amp;#039;&amp;#039;&amp;#039;Sb&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
# Если &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; сигнатуры совпадают, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; отсылает уведомление с номером совпавшего блока, в противном случае &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; пересылает один байт. &lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; получает номера совпавших блоков из &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; или одиночные байты из файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и на основе этих данных создаёт копию файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Важно понимать, что ключом алгоритма является создание двух сигнатур — быстрой и стойкой. Быстрая (&amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;) используется как фильтр (на компьютере &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; она вычисляется для каждого байтового смещения!). Стойкая (&amp;#039;&amp;#039;S&amp;#039;&amp;#039;) используется для более точной проверки.&lt;br /&gt;
[[File:rsync.gif|link=http://www.openbsd.pw/files/openbsd_ru/docs/images/rsync.gif|Алгоритм rsync]] &lt;br /&gt;
Алгоритм rsync&lt;br /&gt;
&lt;br /&gt;
== Стойкая сигнатура ==&lt;br /&gt;
&lt;br /&gt;
Стойкая сигнатура может не быть быстрой, так как вычисляется только при совпадении простой, быстрой сигнатуры. Главным свойством стойкой сигнатуры должна быть минимальная вероятность отказа, иначе говоря, наличие одной и той же сигнатуры для двух разных блоков.&lt;br /&gt;
&lt;br /&gt;
Существует множество алгоритмов с такими свойствами, возможно, наиболее известный — это алгоритм хеширования &amp;#039;&amp;#039;Message Digest&amp;#039;&amp;#039;. Он часто используется в криптографических программах.&lt;br /&gt;
&lt;br /&gt;
== Быстрая сигнатура ==&lt;br /&gt;
&lt;br /&gt;
Быстрая сигнатура очень важна для эффективности алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;. Она работает как фильтр, предотвращая вычисление стойкой сигнатуры. Основная задача быстрой сигнатуры — это максимально быстрое её вычисление для каждого байтового смещения в файле.&lt;br /&gt;
&lt;br /&gt;
Первоначально для создания быстрой сигнатуры в &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt; было опробовано простое склеивание первых и последних 4 байт блока. Хотя такой алгоритм, в принципе, работал, но был выявлен его серьёзный недостаток. Для определённых типов данных, например, для &amp;lt;tt&amp;gt;tar&amp;lt;/tt&amp;gt; файла, он слишком часто создавал одинаковые сигнатуры для разных частей файла, что приводило к многократному вычислению стойкой сигнатуры и, как следствие, падению производительности всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
Это привело к необходимости выбора нового алгоритма для вычисления быстрой сигнатуры, значение которого зависело бы от всех байт блока, но при этом вычисление оставалось таким же простым и быстрым. Им стал алгоритм, похожий на adler32 от Марка Адлера. Adler32 — алгоритм расчёта контрольных сумм, похожий на довольно распространённый алгоритм CRC32, но при этом более быстрый.&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
Для эффективности поиска используется хеширование быстрой сигнатуры и трехуровневый поиск. Ключом хеш-функции является значение 32 битной сигнатуры, а значением — сумма двух её (16 битных) половин.&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
&lt;br /&gt;
На первом уровне формируется хеш-таблица размером в 2^16 элементов. Ключом хеш-функции является быстрая 32 битная сигнатура. Для каждой пары быстрой и стойкой сигнатуры, полученной от Beta, вычисляется 16 битный хеш 32 битной сигнатуры, после чего все это сортируется согласно 16 битному хешу. Каждый элемент хеш-таблицы указывает на первый элемент сортированных сигнатур, хеш значения которых совпадают, либо хранит в себе NULL, если сигнатур с таким хешом нет. Номер элемента хеш-таблицы соответствует значению хеш-функции, а именно сумме двух половин быстрой 32 битной сигнатуры.&lt;br /&gt;
&lt;br /&gt;
Затем для каждого байтового смещения вычисляется быстрая 32 битная сигнатура и 16 битное хеш-значение. Если элемент хеш-таблицы для этого хеш-значения не равен NULL, алгоритм поиска переходит на следующий уровень.&lt;br /&gt;
&lt;br /&gt;
На втором уровне происходит линейный поиск по сортированному списку сигнатур, начиная с элемента, указанного в хеш-таблице. Мы ищем быструю 32 битную сигнатуру, чьё значение совпадает с необходимым нам значением. Поиск прекращается при первом же несовпадении 16 битной сигнатуры. Если мы нашли такую 32 битную сигнатуру, алгоритм переходит на следующий уровень.&lt;br /&gt;
&lt;br /&gt;
На третьем уровне происходит вычисление стойкой сигнатуры для текущего смещения в файле и сравнение его со значением стойкой сигнатуры в сортированном списке. При совпадении предполагается, что мы нашли блок в файле A, который есть в файле B. Фактически, блоки могут быть различны, но вероятность этого очень мала.&lt;br /&gt;
&lt;br /&gt;
При совпадении блоков Alpha отсылает Beta данные из файла A между текущим смещением и предыдущим совпадением, а также индекс совпавшего блока, который есть в B. Эти данные отсылаются сразу же при нахождении совпадения.&lt;br /&gt;
&lt;br /&gt;
Если совпадения найдено не было для текущего смещения в файле A, вычисляется быстрая сигнатура для следующего байтового смещения и процедура поиска повторяется. При совпадении смещение увеличивается на размер совпавшего блока, и поиск продолжается.&lt;br /&gt;
Реконструкция файла&lt;br /&gt;
Одна из простых частей алгоритма rsync — реконструкция файла. После того, как компьютер Beta отсылает сигнатуры, Alpha присылает байты из файла A или сообщения, которые содержат номера совпавших блоков.&lt;br /&gt;
&lt;br /&gt;
Для реконструкции файла B нам необходимо последовательно вписывать полученные байты в файл и при получении сообщения о совпавшем блоке вписывать целый блок из старого файла. Реконструкция не производится непосредственно в старом файле, так как нам необходим произвольный доступ к старым данным. Для реконструкции создаётся временный файл, который затем переименовывается.&lt;br /&gt;
Конвейерная обработка&lt;br /&gt;
Важным фактором быстродействия является задержка между пересылаемыми файлами. Обычно используемые протоколы передачи данных, такие как ftp, rcp или rdist обрабатывают каждый файл как отдельную операцию, тем самым ожидая подтверждения о доставке текущего файла, перед тем как обрабатывать следующий.&lt;br /&gt;
&lt;br /&gt;
При использовании большого количества маленьких файлов (например, обычное зеркалирование Web сайта) для пересылки через Internet, это время ожидания может сыграть роковую роль. Чтобы избежать этого, мы можем пересылать, не ожидая подтверждения. Этот метод также известен, как конвейерная обработка.&lt;br /&gt;
Схема конвейерной обработки&lt;br /&gt;
Схема конвейерной обработки&lt;br /&gt;
&lt;br /&gt;
Процесс разбивается на 3 части — Generator, Sender и Receiver. Generator запускается на компьютере Beta и генерирует сигнатуры для всех файлов, которые необходимо переслать, и отсылает эти сигнатуры к Alpha. Sender, запущенный на Alpha получает сигнатуры и отсылает сообщения о совпавших блоках или целые байты Beta. Receiver, запущенный на Beta, реконструирует файл, после чего он связывается с Generator, чтобы сообщить об успешной передачи файла, либо передать ему, что определённый файл необходимо обработать заново.&lt;br /&gt;
Заключение&lt;br /&gt;
Алгоритм rsync предоставляет эффективное решение проблемы удалённого обновления файлов. Метод двух сигнатур, используемый в алгоритме, позволяет эффективно находить совпадения на любом смещении файла. Алгоритм гарантирует точность передачи, подтверждая подлинность блока стойкой сигнатурой.&lt;br /&gt;
Используемая литература&lt;br /&gt;
&lt;br /&gt;
    Rsync technical report. Andrew Tridgell и Paul Mackerras. 1998г.&lt;br /&gt;
    Efficient Algorithms for Sorting and Synchronization. Andrew Tridgell. 2000г.&lt;br /&gt;
    Zlib Technical Details. Jean-loup Gailly и Mark Adler.&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Rsync&amp;diff=246</id>
		<title>Алгоритм Rsync</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%90%D0%BB%D0%B3%D0%BE%D1%80%D0%B8%D1%82%D0%BC_Rsync&amp;diff=246"/>
		<updated>2013-07-10T14:42:46Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: Новая страница: «==Для чего он нужен?==  Современные средства и протоколы удалённого копирования файлов (на…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==Для чего он нужен?==&lt;br /&gt;
&lt;br /&gt;
Современные средства и протоколы удалённого копирования файлов (например, http, ftp, rcp), каждый раз полностью пересылают данные, несмотря на возможно уже существующею старую версию этих данных. Хотя и возможно воссоздать только изменения, например, с помощью утилиты diff, если существует старая копия наряду с новой, и тем самым пересылать только изменения, но в практике это не всегда удобно и часто приводит к ошибкам.&lt;br /&gt;
&lt;br /&gt;
Задачи алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
# Он должен работать с произвольными данными, не только с обычным текстом.&lt;br /&gt;
# Размер передаваемых данных должен быть примерно равен размеру diff файла.&lt;br /&gt;
# Он должен быстро работать с большими файлами.&lt;br /&gt;
# Алгоритм не должен иметь какие-либо предварительные знания о статусе этих файлов, но должен эффективно находить их возможные сходства.&lt;br /&gt;
# Использовать мало ресурсов. &lt;br /&gt;
&lt;br /&gt;
Представим, что у нас имеются файлы &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, и мы хотим обновить &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; таким образом, чтобы его содержимое было идентично содержимому файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;. Самый простой и очевидный способ — это скопировать &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Теперь представим, что эти файлы находятся на двух разных машинах, соединённых медленным каналом связи, например, с помощью &amp;lt;tt&amp;gt;dialup&amp;lt;/tt&amp;gt; модема. Если файл &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; большой, копирование &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; в &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; будет происходить очень медленно. Чтобы сделать это быстрее, мы можем сжать &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, перед тем как пересылать его. Но обычный коэффициент сжатия колеблется от 2 до 4, что так же не подойдёт для нашей медленной связи.&lt;br /&gt;
&lt;br /&gt;
Предположим, что файлы &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; почти одинаковы (возможно, оба были получены из одного общего файла). Для увеличения производительности копирования мы можем воспользоваться преимуществом их сходства. Обычное решение этой проблемы заключается в том, чтобы пересылать только изменения между файлами &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; и затем использовать их для реконструкции фала &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Но проблема в том, что для получения этих изменений необходимо иметь возможность чтения обоих файлов. Поэтому нам нужно иметь оба файла на одной из сторон нашего соединения. В противном случае, этот алгоритм использоваться не может. Для решения этой проблемы и был разработан алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Алгоритм ==&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;=== Общий алгоритм ===&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
На двух разных компьютерах &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; и &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039;, соединённых медленным каналом связи (например, через модем), находятся два файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
Структура алгоритма:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; отсылает некоторые данные &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; на компьютер &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; &lt;br /&gt;
# &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; сравнивает эти данные с файлом &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и отсылает некоторые данные &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; на компьютер &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; &lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; создаёт копию файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; на основе файла &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, данных &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;D&amp;#039;&amp;#039;&amp;#039; &lt;br /&gt;
&lt;br /&gt;
Главный вопрос в том, какую форму примут данные &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039;, как компьютер &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; будет использовать &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; для сопоставления с файлом &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, и как &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; будет реконструировать &amp;#039;&amp;#039;A&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
&amp;#039;&amp;#039;&amp;#039;=== Алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt; ===&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Алгоритм &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; разбивает файл &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; на блоки длиной &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039; (последний блок может быть меньше &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039;байт) и вычисляет две сигнатуры &amp;#039;&amp;#039;&amp;#039;Rb&amp;#039;&amp;#039;&amp;#039; и &amp;#039;&amp;#039;&amp;#039;Sb&amp;#039;&amp;#039;&amp;#039; для каждого блока, после чего пересылает эти сигнатуры к &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039;. &lt;br /&gt;
# &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; вычисляет сигнатуры &amp;#039;&amp;#039;Ra&amp;#039;&amp;#039; для блоков длиной &amp;#039;&amp;#039;&amp;#039;L&amp;#039;&amp;#039;&amp;#039; для каждого байтового смещения. После чего сравнивает их с &amp;#039;&amp;#039;&amp;#039;Rb&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
# Для блоков, чьи &amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039; сигнатуры совпали, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; вычисляет &amp;#039;&amp;#039;&amp;#039;Sa&amp;#039;&amp;#039;&amp;#039; и сравнивает с &amp;#039;&amp;#039;&amp;#039;Sb&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
# Если &amp;#039;&amp;#039;&amp;#039;S&amp;#039;&amp;#039;&amp;#039; сигнатуры совпадают, &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; отсылает уведомление с номером совпавшего блока, в противном случае &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; пересылает один байт. &lt;br /&gt;
# &amp;#039;&amp;#039;Beta&amp;#039;&amp;#039; получает номера совпавших блоков из &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; или одиночные байты из файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и на основе этих данных создаёт копию файла &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;. &lt;br /&gt;
&lt;br /&gt;
Важно понимать, что ключом алгоритма является создание двух сигнатур — быстрой и стойкой. Быстрая (&amp;#039;&amp;#039;&amp;#039;R&amp;#039;&amp;#039;&amp;#039;) используется как фильтр (на компьютере &amp;#039;&amp;#039;Alpha&amp;#039;&amp;#039; она вычисляется для каждого байтового смещения!). Стойкая (&amp;#039;&amp;#039;S&amp;#039;&amp;#039;) используется для более точной проверки.&lt;br /&gt;
[[File:rsync.gif|link=http://www.openbsd.pw/files/openbsd_ru/docs/images/rsync.gif|Алгоритм rsync]] &lt;br /&gt;
Алгоритм rsync&lt;br /&gt;
&lt;br /&gt;
== Стойкая сигнатура ==&lt;br /&gt;
&lt;br /&gt;
Стойкая сигнатура может не быть быстрой, так как вычисляется только при совпадении простой, быстрой сигнатуры. Главным свойством стойкой сигнатуры должна быть минимальная вероятность отказа, иначе говоря, наличие одной и той же сигнатуры для двух разных блоков.&lt;br /&gt;
&lt;br /&gt;
Существует множество алгоритмов с такими свойствами, возможно, наиболее известный — это алгоритм хеширования &amp;#039;&amp;#039;Message Digest&amp;#039;&amp;#039;. Он часто используется в криптографических программах.&lt;br /&gt;
&lt;br /&gt;
== Быстрая сигнатура ==&lt;br /&gt;
&lt;br /&gt;
Быстрая сигнатура очень важна для эффективности алгоритма &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt;. Она работает как фильтр, предотвращая вычисление стойкой сигнатуры. Основная задача быстрой сигнатуры — это максимально быстрое её вычисление для каждого байтового смещения в файле.&lt;br /&gt;
&lt;br /&gt;
Первоначально для создания быстрой сигнатуры в &amp;lt;tt&amp;gt;rsync&amp;lt;/tt&amp;gt; было опробовано простое склеивание первых и последних 4 байт блока. Хотя такой алгоритм, в принципе, работал, но был выявлен его серьёзный недостаток. Для определённых типов данных, например, для &amp;lt;tt&amp;gt;tar&amp;lt;/tt&amp;gt; файла, он слишком часто создавал одинаковые сигнатуры для разных частей файла, что приводило к многократному вычислению стойкой сигнатуры и, как следствие, падению производительности всего алгоритма.&lt;br /&gt;
&lt;br /&gt;
Это привело к необходимости выбора нового алгоритма для вычисления быстрой сигнатуры, значение которого зависело бы от всех байт блока, но при этом вычисление оставалось таким же простым и быстрым. Им стал алгоритм, похожий на adler32 от Марка Адлера. Adler32 — алгоритм расчёта контрольных сумм, похожий на довольно распространённый алгоритм CRC32, но при этом более быстрый.&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
Для эффективности поиска используется хеширование быстрой сигнатуры и трехуровневый поиск. Ключом хеш-функции является значение 32 битной сигнатуры, а значением — сумма двух её (16 битных) половин.&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
Поиск сигнатур&lt;br /&gt;
&lt;br /&gt;
На первом уровне формируется хеш-таблица размером в 2^16 элементов. Ключом хеш-функции является быстрая 32 битная сигнатура. Для каждой пары быстрой и стойкой сигнатуры, полученной от Beta, вычисляется 16 битный хеш 32 битной сигнатуры, после чего все это сортируется согласно 16 битному хешу. Каждый элемент хеш-таблицы указывает на первый элемент сортированных сигнатур, хеш значения которых совпадают, либо хранит в себе NULL, если сигнатур с таким хешом нет. Номер элемента хеш-таблицы соответствует значению хеш-функции, а именно сумме двух половин быстрой 32 битной сигнатуры.&lt;br /&gt;
&lt;br /&gt;
Затем для каждого байтового смещения вычисляется быстрая 32 битная сигнатура и 16 битное хеш-значение. Если элемент хеш-таблицы для этого хеш-значения не равен NULL, алгоритм поиска переходит на следующий уровень.&lt;br /&gt;
&lt;br /&gt;
На втором уровне происходит линейный поиск по сортированному списку сигнатур, начиная с элемента, указанного в хеш-таблице. Мы ищем быструю 32 битную сигнатуру, чьё значение совпадает с необходимым нам значением. Поиск прекращается при первом же несовпадении 16 битной сигнатуры. Если мы нашли такую 32 битную сигнатуру, алгоритм переходит на следующий уровень.&lt;br /&gt;
&lt;br /&gt;
На третьем уровне происходит вычисление стойкой сигнатуры для текущего смещения в файле и сравнение его со значением стойкой сигнатуры в сортированном списке. При совпадении предполагается, что мы нашли блок в файле A, который есть в файле B. Фактически, блоки могут быть различны, но вероятность этого очень мала.&lt;br /&gt;
&lt;br /&gt;
При совпадении блоков Alpha отсылает Beta данные из файла A между текущим смещением и предыдущим совпадением, а также индекс совпавшего блока, который есть в B. Эти данные отсылаются сразу же при нахождении совпадения.&lt;br /&gt;
&lt;br /&gt;
Если совпадения найдено не было для текущего смещения в файле A, вычисляется быстрая сигнатура для следующего байтового смещения и процедура поиска повторяется. При совпадении смещение увеличивается на размер совпавшего блока, и поиск продолжается.&lt;br /&gt;
Реконструкция файла&lt;br /&gt;
Одна из простых частей алгоритма rsync — реконструкция файла. После того, как компьютер Beta отсылает сигнатуры, Alpha присылает байты из файла A или сообщения, которые содержат номера совпавших блоков.&lt;br /&gt;
&lt;br /&gt;
Для реконструкции файла B нам необходимо последовательно вписывать полученные байты в файл и при получении сообщения о совпавшем блоке вписывать целый блок из старого файла. Реконструкция не производится непосредственно в старом файле, так как нам необходим произвольный доступ к старым данным. Для реконструкции создаётся временный файл, который затем переименовывается.&lt;br /&gt;
Конвейерная обработка&lt;br /&gt;
Важным фактором быстродействия является задержка между пересылаемыми файлами. Обычно используемые протоколы передачи данных, такие как ftp, rcp или rdist обрабатывают каждый файл как отдельную операцию, тем самым ожидая подтверждения о доставке текущего файла, перед тем как обрабатывать следующий.&lt;br /&gt;
&lt;br /&gt;
При использовании большого количества маленьких файлов (например, обычное зеркалирование Web сайта) для пересылки через Internet, это время ожидания может сыграть роковую роль. Чтобы избежать этого, мы можем пересылать, не ожидая подтверждения. Этот метод также известен, как конвейерная обработка.&lt;br /&gt;
Схема конвейерной обработки&lt;br /&gt;
Схема конвейерной обработки&lt;br /&gt;
&lt;br /&gt;
Процесс разбивается на 3 части — Generator, Sender и Receiver. Generator запускается на компьютере Beta и генерирует сигнатуры для всех файлов, которые необходимо переслать, и отсылает эти сигнатуры к Alpha. Sender, запущенный на Alpha получает сигнатуры и отсылает сообщения о совпавших блоках или целые байты Beta. Receiver, запущенный на Beta, реконструирует файл, после чего он связывается с Generator, чтобы сообщить об успешной передачи файла, либо передать ему, что определённый файл необходимо обработать заново.&lt;br /&gt;
Заключение&lt;br /&gt;
Алгоритм rsync предоставляет эффективное решение проблемы удалённого обновления файлов. Метод двух сигнатур, используемый в алгоритме, позволяет эффективно находить совпадения на любом смещении файла. Алгоритм гарантирует точность передачи, подтверждая подлинность блока стойкой сигнатурой.&lt;br /&gt;
Используемая литература&lt;br /&gt;
&lt;br /&gt;
    Rsync technical report. Andrew Tridgell и Paul Mackerras. 1998г.&lt;br /&gt;
    Efficient Algorithms for Sorting and Synchronization. Andrew Tridgell. 2000г.&lt;br /&gt;
    Zlib Technical Details. Jean-loup Gailly и Mark Adler.&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=OpenSSH_%D0%BC%D0%B8%D0%BD%D0%B8-%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE&amp;diff=245</id>
		<title>OpenSSH мини-руководство</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=OpenSSH_%D0%BC%D0%B8%D0%BD%D0%B8-%D1%80%D1%83%D0%BA%D0%BE%D0%B2%D0%BE%D0%B4%D1%81%D1%82%D0%B2%D0%BE&amp;diff=245"/>
		<updated>2013-06-14T17:07:05Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
Генерируем пару ключей (секретный и публичный):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% ssh-keygen -t rsa&lt;br /&gt;
Generating public/private rsa key pair.&lt;br /&gt;
Enter file in which to save the key (/home/andrushock/.ssh/id_rsa):&lt;br /&gt;
Enter passphrase (empty for no passphrase):&lt;br /&gt;
Enter same passphrase again:&lt;br /&gt;
Your identification has been saved in /home/andrushock/.ssh/id_rsa.&lt;br /&gt;
Your public key has been saved in /home/andrushock/.ssh/id_rsa.pub.&lt;br /&gt;
The key fingerprint is:&lt;br /&gt;
25:95:5b: a6:d7:26:b6:f5:f9:a7:49:d4:a8:2a:0d:7d andrushock@midian&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Проверяем корректность прав доступа к директории &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;.ssh&amp;lt;/span&amp;gt; и RSA-ключам:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% ls -la .ssh | egrep -v &amp;#039;total|\.\.&amp;#039;&lt;br /&gt;
drwx------ 2 andrushock wsrc 512 Oct 19 20:42 ./&lt;br /&gt;
-rw------- 1 andrushock wsrc 1743 Jun 11 03:35 id_rsa&lt;br /&gt;
-rw-r--r-- 1 andrushock wsrc 413 Jun 11 03:35 id_rsa.pub&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Добавляем публичный ключ в список авторизованных ключей на удаленной системе:&lt;br /&gt;
&lt;br /&gt;
 % ssh user@host «cat &amp;gt;&amp;gt; .ssh/authorized_keys» &amp;lt; .ssh/id_rsa.pub&lt;br /&gt;
&lt;br /&gt;
В случае, если подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;.ssh&amp;lt;/span&amp;gt; и файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;.ssh/authorized_keys&amp;lt;/span&amp;gt; на удаленной системе не существуют:&lt;br /&gt;
&lt;br /&gt;
 % ssh user@host «mkdir -m 700 .ssh; umask 077; cat &amp;gt; .ssh/authorized_keys» &amp;lt; .ssh/id_rsa.pub&lt;br /&gt;
&lt;br /&gt;
Для сохранения парольных фраз к приватным ключам запускаем [http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-agent&amp;amp;apropos=0&amp;amp;sektion=1&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html ssh-agent(1)]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% eval `/usr/bin/ssh-agent`&lt;br /&gt;
Agent pid 3855&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
С помощью [http://www.openbsd.org/cgi-bin/man.cgi?query=ssh-add&amp;amp;apropos=0&amp;amp;sektion=1&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html ssh-add(1)] добавляем в память агента парольную фразу от нашего ключа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% ssh-add&lt;br /&gt;
Enter passphrase for /home/andrushock/.ssh/id_rsa:&lt;br /&gt;
Identity added: /home/andrushock/.ssh/id_rsa (/home/andrushock/.ssh/id_rsa)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для проверки просматриваем отпечаток секретного ключа:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% ssh-add -l&lt;br /&gt;
2048 25:95:5b: a6:d7:26:b6:f5:f9:a7:49:d4:a8:2a:0d:7d /home/andrushock/.ssh/id_rsa (RSA)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выполняем вход на удаленный сервер без ввода пароля и парольной фразы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% ssh user@host&lt;br /&gt;
OpenBSD 3.7-current (GENERIC) #1: Mon Aug 1 00:37:53 MSD 2005&lt;br /&gt;
&lt;br /&gt;
Welcome to OpenBSD: The proactively secure Unix-like operating system.&lt;br /&gt;
&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример использования функций оболочки для упрощения беспарольной аутентификации:&lt;br /&gt;
&lt;br /&gt;
 % vi .profile&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;bash&amp;quot;&amp;gt;&lt;br /&gt;
ssh_agent_start() {&lt;br /&gt;
 id1=$HOME/.ssh/identity&lt;br /&gt;
 id2=$HOME/.ssh/id_dsa&lt;br /&gt;
 id3=$HOME/.ssh/id_rsa&lt;br /&gt;
 if [ ! «$SSH_AGENT_PID» ] &amp;amp;&amp;amp; [ -f $id1 -o -f $id2 -o -f $id3 ]; then&lt;br /&gt;
 eval `/usr/bin/ssh-agent -s`&lt;br /&gt;
 /usr/bin/ssh-add &amp;lt; /dev/null&lt;br /&gt;
 export SSH_AGENT_SHELL=$$&lt;br /&gt;
 fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ssh_agent_stop() {&lt;br /&gt;
 if [ «$SSH_AGENT_PID» -a &amp;quot;$SSH_AGENT_SHELL&amp;quot;x = &amp;quot;$$&amp;quot;x ]; then&lt;br /&gt;
 /usr/bin/ssh-add -D &amp;lt; /dev/null&lt;br /&gt;
 eval `/usr/bin/ssh-agent -sk`&lt;br /&gt;
 fi&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
ssh_agent_start&lt;br /&gt;
trap ssh_agent_stop 0 1&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0_IP_%D0%BA_MAC_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_bridge(4)_%D0%B8_pf(4)&amp;diff=244</id>
		<title>Привязка IP к MAC с помощью bridge(4) и pf(4)</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0_IP_%D0%BA_MAC_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_bridge(4)_%D0%B8_pf(4)&amp;diff=244"/>
		<updated>2013-06-14T17:06:23Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство &amp;quot;шаг за шагом&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Пример предоставления клиентам доступа к ресурсам сети с привязкой IP к MAC с помощью &amp;lt;tt&amp;gt;bridge&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;pf&amp;lt;/tt&amp;gt;. В данном случае для создания моста достаточно одного внутреннего сетевого интерфейса &amp;lt;tt&amp;gt;ral0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Сервер. IP: 192.168.2.1&lt;br /&gt;
    Клиент 1. Hostname: evol, IP: 192.168.2.2, MAC: 00:0f:ea:91:43:f6&lt;br /&gt;
    Клиент 2. Hostname: aurora, IP: 192.168.2.3, MAC: 00:80:c8:2c:47:a1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Включаем перенаправление IPv4-пакетов между сетевыми интерфейсами:&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.inet.ip.forwarding=1&lt;br /&gt;
&lt;br /&gt;
Добавляем соответствующую запись в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/sysctl.conf&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/sysctl.conf&lt;br /&gt;
 net.inet.ip.forwarding=1&lt;br /&gt;
&lt;br /&gt;
Редактируем &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/bridgename.bridge0&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/bridgename.bridge0&lt;br /&gt;
add ral0&lt;br /&gt;
blocknonip ral0&lt;br /&gt;
link0&lt;br /&gt;
-discover ral0&lt;br /&gt;
-learn ral0&lt;br /&gt;
flushall&lt;br /&gt;
static ral0 00:0f: ea:91:43:f6&lt;br /&gt;
static ral0 00:80:c8:2c:47:a1&lt;br /&gt;
up&lt;br /&gt;
rulefile /etc/bridge.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Редактируем &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/bridge.conf&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/bridge.conf&lt;br /&gt;
pass in on ral0 src 00:0f: ea:91:43:f6 tag evol&lt;br /&gt;
pass in on ral0 src 00:80:c8:2c:47:a1 tag aurora&lt;br /&gt;
block in on ral0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создаем и поднимаем псевдоустройство &amp;lt;tt&amp;gt;bridge&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig bridge0 create&lt;br /&gt;
 # sh /etc/netstart bridge0&lt;br /&gt;
&lt;br /&gt;
Для проверки смотрим информацию о бридже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# brconfig bridge0&lt;br /&gt;
bridge0: flags=1041&amp;lt;UP,RUNNING,LINK0&amp;gt;&lt;br /&gt;
 Configuration:&lt;br /&gt;
 priority 32768 hellotime 2 fwddelay 15 maxage 20&lt;br /&gt;
 Interfaces:&lt;br /&gt;
 ral0 flags=4&amp;lt;BLOCKNONIP&amp;gt;&lt;br /&gt;
 port 2 ifpriority 128 ifcost 55&lt;br /&gt;
 pass in on ral0 src 00:0f: ea:91:43:f6 tag evol&lt;br /&gt;
 pass in on ral0 src 00:80:c8:2c:47:a1 tag aurora&lt;br /&gt;
 block in on ral0&lt;br /&gt;
 Addresses (max cache: 100, timeout: 240):&lt;br /&gt;
 00:80:c8:2c:47:a1 ral0 1 flags=1&amp;lt;STATIC&amp;gt;&lt;br /&gt;
 00:0f: ea:91:43:f6 ral0 1 flags=1&amp;lt;STATIC&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Редактируем &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/pf.conf&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/pf.conf&lt;br /&gt;
ext_if = «vr0»&lt;br /&gt;
int_if = «ral0»&lt;br /&gt;
&lt;br /&gt;
evol = «192.168.2.2»&lt;br /&gt;
aurora = «192.168.2.3»&lt;br /&gt;
&lt;br /&gt;
nat on $ext_if inet from { $evol, $aurora } to any -&amp;gt; ($ext_if)&lt;br /&gt;
&lt;br /&gt;
block in quick on $int_if from ! $evol to any tagged evol&lt;br /&gt;
block in quick on $int_if from ! $aurora to any tagged aurora&lt;br /&gt;
&lt;br /&gt;
block return&lt;br /&gt;
&lt;br /&gt;
pass quick on { lo, $int_if } inet all&lt;br /&gt;
pass quick on $ext_if inet all keep state&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перезагружаем набор рулесетов файервола:&lt;br /&gt;
&lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
Дополнительную информацию можно получить, прочитав статью «[[Настройка Ethernet Bridge]]», а также из справочных man-страниц: [http://www.openbsd.org/cgi-bin/man.cgi?query=bridge&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html bridge(4)], [http://www.openbsd.org/cgi-bin/man.cgi?query=pf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html pf(4)], [http://www.openbsd.org/cgi-bin/man.cgi?query=ifconfig&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html ifconfig(8)], [http://www.openbsd.org/cgi-bin/man.cgi?query=netstart&amp;amp;sektion=8&amp;amp;apropos=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386 netstart(8)].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=243</id>
		<title>OpenBSD-Wiki:Текущие события</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=243"/>
		<updated>2013-06-14T17:05:36Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Устаревшее */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Актуальное ==&lt;br /&gt;
Собрано всё, что применимо к текущему релизу.&lt;br /&gt;
&lt;br /&gt;
* [[Введение в OpenBSD]]&lt;br /&gt;
* [[Аппаратное обеспечение и вопросы]]&lt;br /&gt;
* [[Деликатное проникновение в частную сеть]]&lt;br /&gt;
* [[IPsec между OpenBSD и Linux Ubuntu]]&lt;br /&gt;
* [[OpenSSH мини-руководство]]&lt;br /&gt;
* [[OpenSSH: настройки, секреты, трюки и советы]]&lt;br /&gt;
* [[OpenSSL: 101 прием работы]]&lt;br /&gt;
* [[RSA/DSA аутентификация в OpenSSH]]&lt;br /&gt;
* [[VPN на базе SSH]]&lt;br /&gt;
* [[Использование файла mk.conf]]&lt;br /&gt;
* [[Использование сетевой файловой системы NFS]]&lt;br /&gt;
* [[Написание OpenBSD Loadable Kernel Modules (LKM)]]&lt;br /&gt;
* [[Настройка sendmail]]&lt;br /&gt;
* [[Настройка PPPoE-сервера]]&lt;br /&gt;
* [[Настройка PPPoE-клиента с помощью pppoe(8)]]&lt;br /&gt;
* [[Новое IPSec howto]]&lt;br /&gt;
* [[Русификация OpenBSD 5.x]]&lt;br /&gt;
* [[Русификация OpenBSD]]&lt;br /&gt;
* [[Русификация консоли OpenBSD]]&lt;br /&gt;
* [[Создание загрузочной флешки]]&lt;br /&gt;
* [[Перечень Интернет ресурсов о OpenBSD]]&lt;br /&gt;
* [[Описание переменных sysctl]]&lt;br /&gt;
* [[Сборник советов с OpenBSD101.com]]&lt;br /&gt;
&lt;br /&gt;
=== Переводы ===&lt;br /&gt;
* [[C2k10-marco]]&lt;br /&gt;
* [[C2k10-guenther]]&lt;br /&gt;
* [[C2k10-ajacoutot]]&lt;br /&gt;
* [[C2k10-henning]]&lt;br /&gt;
* [[C2k10-tedu]]&lt;br /&gt;
&lt;br /&gt;
== Устаревшее ==&lt;br /&gt;
Данная информация сохранена для архивных версий.&lt;br /&gt;
&lt;br /&gt;
* [[Зеркалирование данных с помощью ccd]]&lt;br /&gt;
* [[Использование Bluetooth в OpenBSD]]&lt;br /&gt;
* [[Настройка GPRS]]&lt;br /&gt;
* [[Настройка Ethernet Bridge]]&lt;br /&gt;
* [[Привязка IP к MAC с помощью bridge(4) и pf(4)]]&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
&lt;br /&gt;
* [[Резервная копия Wiki]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_Ethernet_Bridge&amp;diff=242</id>
		<title>Настройка Ethernet Bridge</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_Ethernet_Bridge&amp;diff=242"/>
		<updated>2013-06-14T17:04:27Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
Использование Ethernet Bridge позволяет объединить несколько сегментов Ethernet в один логический сегмент. При этом допустимо использование правил фильтрации &amp;lt;tt&amp;gt;pf&amp;lt;/tt&amp;gt;, что позволяет превратить OpenBSD в прозрачный IP фильтр.&lt;br /&gt;
&lt;br /&gt;
Чтобы настроить OpenBSD в качестве Ethernet Bridge, нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
* Сконфигурировать ядро OpenBSD, включив в него псевдоустройство &amp;lt;tt&amp;gt;&amp;quot;bridge&amp;quot;&amp;lt;/tt&amp;gt;. Файл конфигурации ядра должен содержать строку &amp;lt;tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;quot;pseudo-device bridge&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
* Создать файл конфигурации &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/bridgename.bridge0&amp;lt;/span&amp;gt;, содержащий команды конфигурации Bridge, например:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
add rl0&lt;br /&gt;
add fxp0&lt;br /&gt;
up&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
В данном случае мы объявляем интерфейсы &amp;lt;tt&amp;gt;fxp0&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;rl0&amp;lt;/tt&amp;gt; одним логическим Ethernet сегментом. Подробнее о командах конфигурирования Bridge можно прочитать в [http://www.openbsd.org/cgi-bin/man.cgi?query=ifconfig&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html ifconfig(8)]. При использовании нескольких логических сегментов следует создать файл конфигурации для каждого псевдоустройства bridge.&lt;br /&gt;
&lt;br /&gt;
* Создать файлы конфигурации сетевых интерфейсов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/hostname.fxp0&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 inet 194.226.170.3 255.255.255.0 NONE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/hostname.rl0&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 up&lt;br /&gt;
&lt;br /&gt;
Подробнее о файлах конфигурации сетевых интерфейсов можно прочитать в [http://www.openbsd.org/cgi-bin/man.cgi?query=hostname.if&amp;amp;sektion=5&amp;amp;arch=i386&amp;amp;apropos=0&amp;amp;manpath=OpenBSD+Current hostname.if(5)]&lt;br /&gt;
&lt;br /&gt;
Обратите внимание, что в данном случае IP адрес присваивается только одному интерфейсу. Допускается также создание Bridge, не имеющего своего IP адреса.&lt;br /&gt;
&lt;br /&gt;
* Перезагрузить машину. &lt;br /&gt;
&lt;br /&gt;
Ethernet Bridge также позволяет с помощью протокола &amp;lt;tt&amp;gt;Ethernet-over-IP&amp;lt;/tt&amp;gt; объединить в один логический сегмент сети, физически находящиеся далеко друг от друга. Рассмотрим следующий пример:&lt;br /&gt;
&lt;br /&gt;
: Хост &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, адрес 81.1.212.10, внутренний интерфейс &amp;#039;&amp;#039;&amp;#039;em0&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
: Хост &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, адрес 81.1.226.48, внутренний интерфейс &amp;#039;&amp;#039;&amp;#039;rl0&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Чтобы объединить сегменты интерфейса &amp;lt;tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;em0&amp;#039;&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt; хоста &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;lt;tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;rl0&amp;#039;&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt; хоста &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; в один логический Ethernet сегмент, нужно подать следующие команды:&lt;br /&gt;
&lt;br /&gt;
Для хоста &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.inet.etherip.allow=1&lt;br /&gt;
 # ifconfig gif0 tunnel 81.1.212.10 81.1.226.48&lt;br /&gt;
 # ifconfig bridge0 create&lt;br /&gt;
 # brconfig bridge0 add em0 add gif0 up&lt;br /&gt;
&lt;br /&gt;
Для хоста &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.inet.etherip.allow=1&lt;br /&gt;
 # ifconfig gif0 tunnel 81.1.226.48 81.1.212.10&lt;br /&gt;
 # ifconfig bridge0 create&lt;br /&gt;
 # brconfig bridge0 add rl0 add gif0 up&lt;br /&gt;
&lt;br /&gt;
Замечания&lt;br /&gt;
&lt;br /&gt;
* При использовании OpenBSD Packet Filter пакет, проходящий через Bridge, попадает под проверку PF два раза: при входе на одном интерфейсе и при выходе на другом. Чтобы производить &amp;lt;tt&amp;gt;keep-state&amp;lt;/tt&amp;gt; фильтрацию, нам необходимо разрешить все входящие и исходящие пакеты на одном интерфейсе, а на другом производить фильтрацию. Пример правил:&lt;br /&gt;
&lt;br /&gt;
 # фильтрация производится на rl0, поэтому пропускаем все пакеты на rl1&lt;br /&gt;
 pass quick on rl1&lt;br /&gt;
 &lt;br /&gt;
 # по умолчанию мы блокируем все пакеты и пропускаем только&lt;br /&gt;
 # icmp запросы с получившимися keep-state ответами в обе стороны.&lt;br /&gt;
 block on rl0&lt;br /&gt;
 pass on rl0 inet proto icmp icmp-type echoreq code 0 keep state&lt;br /&gt;
&lt;br /&gt;
* При использовании &amp;lt;tt&amp;gt;pf&amp;lt;/tt&amp;gt; для фильтрации пакетов, проходящих через Bridge, действуют только правила для входящих пакетов.&lt;br /&gt;
* Если во время работы Bridge производится перенос какого-нибудь компьютера (или другого устройства, имеющего свой Ethernet адрес) с одного Ethernet сегмента на другой, следует выполнить команду&lt;br /&gt;
&lt;br /&gt;
 # brconfig bridge0 flush&lt;br /&gt;
&lt;br /&gt;
(где &amp;lt;tt&amp;gt;bridge0&amp;lt;/tt&amp;gt; - псевдоинтерфейс Bridge, к которому относится Ethernet сегмент, где раньше находился компьютер). &lt;br /&gt;
&lt;br /&gt;
Смотрите также по данной теме пошаговое [[Привязка IP к MAC с помощью bridge(4) и pf(4)|руководство]], в котором рассматривается привязка IP к MAC с помощью &amp;lt;tt&amp;gt;bridge&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;pf&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_Ethernet_Bridge&amp;diff=241</id>
		<title>Настройка Ethernet Bridge</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_Ethernet_Bridge&amp;diff=241"/>
		<updated>2013-06-14T16:54:24Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: Новая страница: «: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]  Использование Ethernet Bridge позволяет об…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
Использование Ethernet Bridge позволяет объединить несколько сегментов Ethernet в один логический сегмент. При этом допустимо использование правил фильтрации &amp;lt;tt&amp;gt;pf&amp;lt;/tt&amp;gt;, что позволяет превратить OpenBSD в прозрачный IP фильтр.&lt;br /&gt;
&lt;br /&gt;
Чтобы настроить OpenBSD в качестве Ethernet Bridge, нужно выполнить следующие шаги:&lt;br /&gt;
&lt;br /&gt;
# Сконфигурировать ядро OpenBSD, включив в него псевдоустройство &amp;lt;tt&amp;gt;&amp;quot;bridge&amp;quot;&amp;lt;/tt&amp;gt;. Файл конфигурации ядра должен содержать строку &amp;lt;tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;&amp;quot;pseudo-device bridge&amp;quot;&amp;#039;&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
# Создать файл конфигурации &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/bridgename.bridge0&amp;lt;/span&amp;gt;, содержащий команды конфигурации Bridge, например:&lt;br /&gt;
&lt;br /&gt;
 add rl0&lt;br /&gt;
 add fxp0&lt;br /&gt;
 up&lt;br /&gt;
&lt;br /&gt;
В данном случае мы объявляем интерфейсы &amp;lt;tt&amp;gt;fxp0&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;rl0&amp;lt;/tt&amp;gt; одним логическим Ethernet сегментом. Подробнее о командах конфигурирования Bridge можно прочитать в [http://www.openbsd.org/cgi-bin/man.cgi?query=ifconfig&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html ifconfig(8)]. При использовании нескольких логических сегментов следует создать файл конфигурации для каждого псевдоустройства bridge.&lt;br /&gt;
&lt;br /&gt;
# Создать файлы конфигурации сетевых интерфейсов:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/hostname.fxp0&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 inet 194.226.170.3 255.255.255.0 NONE&lt;br /&gt;
&lt;br /&gt;
&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/hostname.rl0&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 up&lt;br /&gt;
&lt;br /&gt;
* Подробнее о файлах конфигурации сетевых интерфейсов можно прочитать в [http://www.openbsd.org/cgi-bin/man.cgi?query=hostname.if&amp;amp;sektion=5&amp;amp;arch=i386&amp;amp;apropos=0&amp;amp;manpath=OpenBSD+Current hostname.if(5)]&lt;br /&gt;
&lt;br /&gt;
* Обратите внимание, что в данном случае IP адрес присваивается только одному интерфейсу. Допускается также создание Bridge, не имеющего своего IP адреса.&lt;br /&gt;
&lt;br /&gt;
# Перезагрузить машину. &lt;br /&gt;
&lt;br /&gt;
Ethernet Bridge также позволяет с помощью протокола &amp;lt;tt&amp;gt;Ethernet-over-IP&amp;lt;/tt&amp;gt; объединить в один логический сегмент сети, физически находящиеся далеко друг от друга. Рассмотрим следующий пример:&lt;br /&gt;
&lt;br /&gt;
* Хост &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;, адрес 81.1.212.10, внутренний интерфейс &amp;#039;&amp;#039;&amp;#039;em0&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
* Хост &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;, адрес 81.1.226.48, внутренний интерфейс &amp;#039;&amp;#039;&amp;#039;rl0&amp;#039;&amp;#039;&amp;#039;&lt;br /&gt;
&lt;br /&gt;
Чтобы объединить сегменты интерфейса &amp;lt;tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;em0&amp;#039;&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt; хоста &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039; и &amp;lt;tt&amp;gt;&amp;#039;&amp;#039;&amp;#039;rl0&amp;#039;&amp;#039;&amp;#039;&amp;lt;/tt&amp;gt; хоста &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039; в один логический Ethernet сегмент, нужно подать следующие команды:&lt;br /&gt;
&lt;br /&gt;
Для хоста &amp;#039;&amp;#039;&amp;#039;A&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.inet.etherip.allow=1&lt;br /&gt;
 # ifconfig gif0 tunnel 81.1.212.10 81.1.226.48&lt;br /&gt;
 # ifconfig bridge0 create&lt;br /&gt;
 # brconfig bridge0 add em0 add gif0 up&lt;br /&gt;
&lt;br /&gt;
Для хоста &amp;#039;&amp;#039;&amp;#039;B&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.inet.etherip.allow=1&lt;br /&gt;
 # ifconfig gif0 tunnel 81.1.226.48 81.1.212.10&lt;br /&gt;
 # ifconfig bridge0 create&lt;br /&gt;
 # brconfig bridge0 add rl0 add gif0 up&lt;br /&gt;
&lt;br /&gt;
Замечания&lt;br /&gt;
&lt;br /&gt;
* При использовании OpenBSD Packet Filter пакет, проходящий через Bridge, попадает под проверку PF два раза: при входе на одном интерфейсе и при выходе на другом. Чтобы производить &amp;lt;tt&amp;gt;keep-state&amp;lt;/tt&amp;gt; фильтрацию, нам необходимо разрешить все входящие и исходящие пакеты на одном интерфейсе, а на другом производить фильтрацию. Пример правил:&lt;br /&gt;
&lt;br /&gt;
 # фильтрация производится на rl0, поэтому пропускаем все пакеты на rl1&lt;br /&gt;
 pass quick on rl1&lt;br /&gt;
 &lt;br /&gt;
 # по умолчанию мы блокируем все пакеты и пропускаем только&lt;br /&gt;
 # icmp запросы с получившимися keep-state ответами в обе стороны.&lt;br /&gt;
 block on rl0&lt;br /&gt;
 pass on rl0 inet proto icmp icmp-type echoreq code 0 keep state&lt;br /&gt;
&lt;br /&gt;
* При использовании &amp;lt;tt&amp;gt;pf&amp;lt;/tt&amp;gt; для фильтрации пакетов, проходящих через Bridge, действуют только правила для входящих пакетов.&lt;br /&gt;
* Если во время работы Bridge производится перенос какого-нибудь компьютера (или другого устройства, имеющего свой Ethernet адрес) с одного Ethernet сегмента на другой, следует выполнить команду&lt;br /&gt;
&lt;br /&gt;
 # brconfig bridge0 flush&lt;br /&gt;
&lt;br /&gt;
(где &amp;lt;tt&amp;gt;bridge0&amp;lt;/tt&amp;gt; - псевдоинтерфейс Bridge, к которому относится Ethernet сегмент, где раньше находился компьютер). &lt;br /&gt;
&lt;br /&gt;
Смотрите также по данной теме пошаговое [[Привязка IP к MAC с помощью bridge(4) и pf(4)|руководство]], в котором рассматривается привязка IP к MAC с помощью &amp;lt;tt&amp;gt;bridge&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;pf&amp;lt;/tt&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=240</id>
		<title>OpenBSD-Wiki:Текущие события</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=240"/>
		<updated>2013-06-14T16:16:48Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Устаревшее */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Актуальное ==&lt;br /&gt;
Собрано всё, что применимо к текущему релизу.&lt;br /&gt;
&lt;br /&gt;
* [[Введение в OpenBSD]]&lt;br /&gt;
* [[Аппаратное обеспечение и вопросы]]&lt;br /&gt;
* [[Деликатное проникновение в частную сеть]]&lt;br /&gt;
* [[IPsec между OpenBSD и Linux Ubuntu]]&lt;br /&gt;
* [[OpenSSH мини-руководство]]&lt;br /&gt;
* [[OpenSSH: настройки, секреты, трюки и советы]]&lt;br /&gt;
* [[OpenSSL: 101 прием работы]]&lt;br /&gt;
* [[RSA/DSA аутентификация в OpenSSH]]&lt;br /&gt;
* [[VPN на базе SSH]]&lt;br /&gt;
* [[Использование файла mk.conf]]&lt;br /&gt;
* [[Использование сетевой файловой системы NFS]]&lt;br /&gt;
* [[Написание OpenBSD Loadable Kernel Modules (LKM)]]&lt;br /&gt;
* [[Настройка sendmail]]&lt;br /&gt;
* [[Настройка PPPoE-сервера]]&lt;br /&gt;
* [[Настройка PPPoE-клиента с помощью pppoe(8)]]&lt;br /&gt;
* [[Новое IPSec howto]]&lt;br /&gt;
* [[Русификация OpenBSD 5.x]]&lt;br /&gt;
* [[Русификация OpenBSD]]&lt;br /&gt;
* [[Русификация консоли OpenBSD]]&lt;br /&gt;
* [[Создание загрузочной флешки]]&lt;br /&gt;
* [[Перечень Интернет ресурсов о OpenBSD]]&lt;br /&gt;
* [[Описание переменных sysctl]]&lt;br /&gt;
* [[Сборник советов с OpenBSD101.com]]&lt;br /&gt;
&lt;br /&gt;
=== Переводы ===&lt;br /&gt;
* [[C2k10-marco]]&lt;br /&gt;
* [[C2k10-guenther]]&lt;br /&gt;
* [[C2k10-ajacoutot]]&lt;br /&gt;
* [[C2k10-henning]]&lt;br /&gt;
* [[C2k10-tedu]]&lt;br /&gt;
&lt;br /&gt;
== Устаревшее ==&lt;br /&gt;
Данная информация сохранена для архивных версий.&lt;br /&gt;
&lt;br /&gt;
* [[Зеркалирование данных с помощью ccd]]&lt;br /&gt;
* [[Использование Bluetooth в OpenBSD]]&lt;br /&gt;
* [[Настройка GPRS]]&lt;br /&gt;
* [[Привязка IP к MAC с помощью bridge(4) и pf(4)]]&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
&lt;br /&gt;
* [[Резервная копия Wiki]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0_IP_%D0%BA_MAC_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_bridge(4)_%D0%B8_pf(4)&amp;diff=239</id>
		<title>Привязка IP к MAC с помощью bridge(4) и pf(4)</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0_IP_%D0%BA_MAC_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_bridge(4)_%D0%B8_pf(4)&amp;diff=239"/>
		<updated>2013-06-14T16:14:07Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Мини-руководство &amp;quot;шаг за шагом&amp;quot; */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство &amp;quot;шаг за шагом&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Пример предоставления клиентам доступа к ресурсам сети с привязкой IP к MAC с помощью &amp;lt;tt&amp;gt;bridge&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;pf&amp;lt;/tt&amp;gt;. В данном случае для создания моста достаточно одного внутреннего сетевого интерфейса &amp;lt;tt&amp;gt;ral0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Сервер. IP: 192.168.2.1&lt;br /&gt;
    Клиент 1. Hostname: evol, IP: 192.168.2.2, MAC: 00:0f:ea:91:43:f6&lt;br /&gt;
    Клиент 2. Hostname: aurora, IP: 192.168.2.3, MAC: 00:80:c8:2c:47:a1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Включаем перенаправление IPv4-пакетов между сетевыми интерфейсами:&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.inet.ip.forwarding=1&lt;br /&gt;
&lt;br /&gt;
Добавляем соответствующую запись в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/sysctl.conf&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/sysctl.conf&lt;br /&gt;
 net.inet.ip.forwarding=1&lt;br /&gt;
&lt;br /&gt;
Редактируем &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/bridgename.bridge0&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/bridgename.bridge0&lt;br /&gt;
add ral0&lt;br /&gt;
blocknonip ral0&lt;br /&gt;
link0&lt;br /&gt;
-discover ral0&lt;br /&gt;
-learn ral0&lt;br /&gt;
flushall&lt;br /&gt;
static ral0 00:0f: ea:91:43:f6&lt;br /&gt;
static ral0 00:80:c8:2c:47:a1&lt;br /&gt;
up&lt;br /&gt;
rulefile /etc/bridge.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Редактируем &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/bridge.conf&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/bridge.conf&lt;br /&gt;
pass in on ral0 src 00:0f: ea:91:43:f6 tag evol&lt;br /&gt;
pass in on ral0 src 00:80:c8:2c:47:a1 tag aurora&lt;br /&gt;
block in on ral0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создаем и поднимаем псевдоустройство &amp;lt;tt&amp;gt;bridge&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig bridge0 create&lt;br /&gt;
 # sh /etc/netstart bridge0&lt;br /&gt;
&lt;br /&gt;
Для проверки смотрим информацию о бридже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# brconfig bridge0&lt;br /&gt;
bridge0: flags=1041&amp;lt;UP,RUNNING,LINK0&amp;gt;&lt;br /&gt;
 Configuration:&lt;br /&gt;
 priority 32768 hellotime 2 fwddelay 15 maxage 20&lt;br /&gt;
 Interfaces:&lt;br /&gt;
 ral0 flags=4&amp;lt;BLOCKNONIP&amp;gt;&lt;br /&gt;
 port 2 ifpriority 128 ifcost 55&lt;br /&gt;
 pass in on ral0 src 00:0f: ea:91:43:f6 tag evol&lt;br /&gt;
 pass in on ral0 src 00:80:c8:2c:47:a1 tag aurora&lt;br /&gt;
 block in on ral0&lt;br /&gt;
 Addresses (max cache: 100, timeout: 240):&lt;br /&gt;
 00:80:c8:2c:47:a1 ral0 1 flags=1&amp;lt;STATIC&amp;gt;&lt;br /&gt;
 00:0f: ea:91:43:f6 ral0 1 flags=1&amp;lt;STATIC&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Редактируем &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/pf.conf&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/pf.conf&lt;br /&gt;
ext_if = «vr0»&lt;br /&gt;
int_if = «ral0»&lt;br /&gt;
&lt;br /&gt;
evol = «192.168.2.2»&lt;br /&gt;
aurora = «192.168.2.3»&lt;br /&gt;
&lt;br /&gt;
nat on $ext_if inet from { $evol, $aurora } to any -&amp;gt; ($ext_if)&lt;br /&gt;
&lt;br /&gt;
block in quick on $int_if from ! $evol to any tagged evol&lt;br /&gt;
block in quick on $int_if from ! $aurora to any tagged aurora&lt;br /&gt;
&lt;br /&gt;
block return&lt;br /&gt;
&lt;br /&gt;
pass quick on { lo, $int_if } inet all&lt;br /&gt;
pass quick on $ext_if inet all keep state&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перезагружаем набор рулесетов файервола:&lt;br /&gt;
&lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
Дополнительную информацию можно получить, прочитав статью «Настройка Ethernet Bridge», а также из справочных man-страниц: [http://www.openbsd.org/cgi-bin/man.cgi?query=bridge&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html bridge(4)], [http://www.openbsd.org/cgi-bin/man.cgi?query=pf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html pf(4)], [http://www.openbsd.org/cgi-bin/man.cgi?query=ifconfig&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html ifconfig(8)], [http://www.openbsd.org/cgi-bin/man.cgi?query=netstart&amp;amp;sektion=8&amp;amp;apropos=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386 netstart(8)].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0_IP_%D0%BA_MAC_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_bridge(4)_%D0%B8_pf(4)&amp;diff=238</id>
		<title>Привязка IP к MAC с помощью bridge(4) и pf(4)</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9F%D1%80%D0%B8%D0%B2%D1%8F%D0%B7%D0%BA%D0%B0_IP_%D0%BA_MAC_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_bridge(4)_%D0%B8_pf(4)&amp;diff=238"/>
		<updated>2013-06-14T16:13:05Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: Новая страница: «: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]  == Мини-руководство &amp;quot;шаг за шагом&amp;quot; ==  П…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство &amp;quot;шаг за шагом&amp;quot; ==&lt;br /&gt;
&lt;br /&gt;
Пример предоставления клиентам доступа к ресурсам сети с привязкой IP к MAC с помощью &amp;lt;tt&amp;gt;bridge&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;pf&amp;lt;/tt&amp;gt;. В данном случае для создания моста достаточно одного внутреннего сетевого интерфейса &amp;lt;tt&amp;gt;ral0&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Сервер. IP: 192.168.2.1&lt;br /&gt;
    Клиент 1. Hostname: evol, IP: 192.168.2.2, MAC: 00:0f:ea:91:43:f6&lt;br /&gt;
    Клиент 2. Hostname: aurora, IP: 192.168.2.3, MAC: 00:80:c8:2c:47:a1 &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Включаем перенаправление IPv4-пакетов между сетевыми интерфейсами:&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w net.inet.ip.forwarding=1&lt;br /&gt;
&lt;br /&gt;
Добавляем соответствующую запись в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/sysctl.conf&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/sysctl.conf&lt;br /&gt;
 net.inet.ip.forwarding=1&lt;br /&gt;
&lt;br /&gt;
Редактируем &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/bridgename.bridge0&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/bridgename.bridge0&lt;br /&gt;
add ral0&lt;br /&gt;
blocknonip ral0&lt;br /&gt;
link0&lt;br /&gt;
-discover ral0&lt;br /&gt;
-learn ral0&lt;br /&gt;
flushall&lt;br /&gt;
static ral0 00:0f: ea:91:43:f6&lt;br /&gt;
static ral0 00:80:c8:2c:47:a1&lt;br /&gt;
up&lt;br /&gt;
rulefile /etc/bridge.conf&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Редактируем &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/bridge.conf&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/bridge.conf&lt;br /&gt;
pass in on ral0 src 00:0f: ea:91:43:f6 tag evol&lt;br /&gt;
pass in on ral0 src 00:80:c8:2c:47:a1 tag aurora&lt;br /&gt;
block in on ral0&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создаем и поднимаем псевдоустройство &amp;lt;tt&amp;gt;bridge&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
# ifconfig bridge0 create&lt;br /&gt;
# sh /etc/netstart bridge0&lt;br /&gt;
&lt;br /&gt;
Для проверки смотрим информацию о бридже:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# brconfig bridge0&lt;br /&gt;
bridge0: flags=1041&amp;lt;UP,RUNNING,LINK0&amp;gt;&lt;br /&gt;
 Configuration:&lt;br /&gt;
 priority 32768 hellotime 2 fwddelay 15 maxage 20&lt;br /&gt;
 Interfaces:&lt;br /&gt;
 ral0 flags=4&amp;lt;BLOCKNONIP&amp;gt;&lt;br /&gt;
 port 2 ifpriority 128 ifcost 55&lt;br /&gt;
 pass in on ral0 src 00:0f: ea:91:43:f6 tag evol&lt;br /&gt;
 pass in on ral0 src 00:80:c8:2c:47:a1 tag aurora&lt;br /&gt;
 block in on ral0&lt;br /&gt;
 Addresses (max cache: 100, timeout: 240):&lt;br /&gt;
 00:80:c8:2c:47:a1 ral0 1 flags=1&amp;lt;STATIC&amp;gt;&lt;br /&gt;
 00:0f: ea:91:43:f6 ral0 1 flags=1&amp;lt;STATIC&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Редактируем &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/pf.conf&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/pf.conf&lt;br /&gt;
ext_if = «vr0»&lt;br /&gt;
int_if = «ral0»&lt;br /&gt;
&lt;br /&gt;
evol = «192.168.2.2»&lt;br /&gt;
aurora = «192.168.2.3»&lt;br /&gt;
&lt;br /&gt;
nat on $ext_if inet from { $evol, $aurora } to any -&amp;gt; ($ext_if)&lt;br /&gt;
&lt;br /&gt;
block in quick on $int_if from ! $evol to any tagged evol&lt;br /&gt;
block in quick on $int_if from ! $aurora to any tagged aurora&lt;br /&gt;
&lt;br /&gt;
block return&lt;br /&gt;
&lt;br /&gt;
pass quick on { lo, $int_if } inet all&lt;br /&gt;
pass quick on $ext_if inet all keep state&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Перезагружаем набор рулесетов файервола:&lt;br /&gt;
&lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
Дополнительную информацию можно получить, прочитав статью «Настройка Ethernet Bridge», а также из справочных man-страниц: [http://www.openbsd.org/cgi-bin/man.cgi?query=bridge&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html bridge(4)], [http://www.openbsd.org/cgi-bin/man.cgi?query=pf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html pf(4)], [http://www.openbsd.org/cgi-bin/man.cgi?query=ifconfig&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html ifconfig(8)], [http://www.openbsd.org/cgi-bin/man.cgi?query=netstart&amp;amp;sektion=8&amp;amp;apropos=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386 netstart(8)].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_pppoe(8)&amp;diff=237</id>
		<title>Настройка PPPoE-клиента с помощью pppoe(8)</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_pppoe(8)&amp;diff=237"/>
		<updated>2013-06-14T14:23:51Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
Пример настройки PPPoE-клиента. Предположим, что &amp;lt;tt&amp;gt;vr0&amp;lt;/tt&amp;gt; - это сетевой интерфейс, на котором будет работать клиент, выданы логин &amp;lt;tt&amp;gt;&amp;quot;test&amp;quot;&amp;lt;/tt&amp;gt; и пароль &amp;lt;tt&amp;gt;&amp;quot;qwe123&amp;quot;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перейдем к настройке PPP. Обратите внимание, что в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/ppp/ppp.conf&amp;lt;/span&amp;gt; cтроки, оканчивающиеся на «&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;», вводятся без отступа в начале строки. Остальные строки должны быть введены с отступом, как показано в примере.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/ppp/ppp.conf&lt;br /&gt;
default:&lt;br /&gt;
  Set log Phase Chat LCP IPCP CCP tun command&lt;br /&gt;
  Disable ipv6cp&lt;br /&gt;
&lt;br /&gt;
pppoe:&lt;br /&gt;
  set device &amp;quot;!/usr/sbin/pppoe -i vr0&amp;quot;&lt;br /&gt;
  set mtu max 1492&lt;br /&gt;
  set mru max 1492&lt;br /&gt;
  set speed sync&lt;br /&gt;
  disable acfcomp protocomp&lt;br /&gt;
  deny acfcomp&lt;br /&gt;
  set authname test&lt;br /&gt;
  set authkey qwe123&lt;br /&gt;
  add! default HISADDR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выставляем корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/ppp/ppp.conf&lt;br /&gt;
&lt;br /&gt;
Устанавливаем соединение:&lt;br /&gt;
&lt;br /&gt;
 # ppp -ddial pppoe&lt;br /&gt;
&lt;br /&gt;
Если тестирование прошло успешно, можно настроить автоматическое поднятие PPPoE-соединения при старте системы:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/hostname.tun0&lt;br /&gt;
 !/usr/sbin/ppp -ddial pppoe&lt;br /&gt;
&lt;br /&gt;
Статья основана на материалах, предоставленных Гнединым Алексеем aka Goblin.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=236</id>
		<title>OpenBSD-Wiki:Текущие события</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=236"/>
		<updated>2013-06-14T14:20:47Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Актуальное */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Актуальное ==&lt;br /&gt;
Собрано всё, что применимо к текущему релизу.&lt;br /&gt;
&lt;br /&gt;
* [[Введение в OpenBSD]]&lt;br /&gt;
* [[Аппаратное обеспечение и вопросы]]&lt;br /&gt;
* [[Деликатное проникновение в частную сеть]]&lt;br /&gt;
* [[IPsec между OpenBSD и Linux Ubuntu]]&lt;br /&gt;
* [[OpenSSH мини-руководство]]&lt;br /&gt;
* [[OpenSSH: настройки, секреты, трюки и советы]]&lt;br /&gt;
* [[OpenSSL: 101 прием работы]]&lt;br /&gt;
* [[RSA/DSA аутентификация в OpenSSH]]&lt;br /&gt;
* [[VPN на базе SSH]]&lt;br /&gt;
* [[Использование файла mk.conf]]&lt;br /&gt;
* [[Использование сетевой файловой системы NFS]]&lt;br /&gt;
* [[Написание OpenBSD Loadable Kernel Modules (LKM)]]&lt;br /&gt;
* [[Настройка sendmail]]&lt;br /&gt;
* [[Настройка PPPoE-сервера]]&lt;br /&gt;
* [[Настройка PPPoE-клиента с помощью pppoe(8)]]&lt;br /&gt;
* [[Новое IPSec howto]]&lt;br /&gt;
* [[Русификация OpenBSD 5.x]]&lt;br /&gt;
* [[Русификация OpenBSD]]&lt;br /&gt;
* [[Русификация консоли OpenBSD]]&lt;br /&gt;
* [[Создание загрузочной флешки]]&lt;br /&gt;
* [[Перечень Интернет ресурсов о OpenBSD]]&lt;br /&gt;
* [[Описание переменных sysctl]]&lt;br /&gt;
* [[Сборник советов с OpenBSD101.com]]&lt;br /&gt;
&lt;br /&gt;
=== Переводы ===&lt;br /&gt;
* [[C2k10-marco]]&lt;br /&gt;
* [[C2k10-guenther]]&lt;br /&gt;
* [[C2k10-ajacoutot]]&lt;br /&gt;
* [[C2k10-henning]]&lt;br /&gt;
* [[C2k10-tedu]]&lt;br /&gt;
&lt;br /&gt;
== Устаревшее ==&lt;br /&gt;
Данная информация сохранена для архивных версий.&lt;br /&gt;
&lt;br /&gt;
* [[Зеркалирование данных с помощью ccd]]&lt;br /&gt;
* [[Использование Bluetooth в OpenBSD]]&lt;br /&gt;
* [[Настройка GPRS]]&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
&lt;br /&gt;
* [[Резервная копия Wiki]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_pppoe(8)&amp;diff=235</id>
		<title>Настройка PPPoE-клиента с помощью pppoe(8)</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_pppoe(8)&amp;diff=235"/>
		<updated>2013-06-14T14:19:31Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример настройки PPPoE-клиента. Предположим, что &amp;lt;tt&amp;gt;vr0&amp;lt;/tt&amp;gt; - это сетевой интерфейс, на котором будет работать клиент, выданы логин &amp;lt;tt&amp;gt;&amp;quot;test&amp;quot;&amp;lt;/tt&amp;gt; и пароль &amp;lt;tt&amp;gt;&amp;quot;qwe123&amp;quot;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перейдем к настройке PPP. Обратите внимание, что в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/ppp/ppp.conf&amp;lt;/span&amp;gt; cтроки, оканчивающиеся на «&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;», вводятся без отступа в начале строки. Остальные строки должны быть введены с отступом, как показано в примере.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/ppp/ppp.conf&lt;br /&gt;
default:&lt;br /&gt;
  Set log Phase Chat LCP IPCP CCP tun command&lt;br /&gt;
  Disable ipv6cp&lt;br /&gt;
&lt;br /&gt;
pppoe:&lt;br /&gt;
  set device &amp;quot;!/usr/sbin/pppoe -i vr0&amp;quot;&lt;br /&gt;
  set mtu max 1492&lt;br /&gt;
  set mru max 1492&lt;br /&gt;
  set speed sync&lt;br /&gt;
  disable acfcomp protocomp&lt;br /&gt;
  deny acfcomp&lt;br /&gt;
  set authname test&lt;br /&gt;
  set authkey qwe123&lt;br /&gt;
  add! default HISADDR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выставляем корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/ppp/ppp.conf&lt;br /&gt;
&lt;br /&gt;
Устанавливаем соединение:&lt;br /&gt;
&lt;br /&gt;
 # ppp -ddial pppoe&lt;br /&gt;
&lt;br /&gt;
Если тестирование прошло успешно, можно настроить автоматическое поднятие PPPoE-соединения при старте системы:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/hostname.tun0&lt;br /&gt;
 !/usr/sbin/ppp -ddial pppoe&lt;br /&gt;
&lt;br /&gt;
Статья основана на материалах, предоставленных Гнединым Алексеем aka Goblin.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_pppoe(8)&amp;diff=234</id>
		<title>Настройка PPPoE-клиента с помощью pppoe(8)</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D0%BA%D0%BB%D0%B8%D0%B5%D0%BD%D1%82%D0%B0_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_pppoe(8)&amp;diff=234"/>
		<updated>2013-06-14T14:18:40Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: Новая страница: «:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]  Пример настройки PPPoE-клиента. Предпол…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
Пример настройки PPPoE-клиента. Предположим, что &amp;lt;tt&amp;gt;vr0&amp;lt;/tt&amp;gt; - это сетевой интерфейс, на котором будет работать клиент, выданы логин &amp;lt;tt&amp;gt;&amp;quot;test&amp;quot;&amp;lt;/tt&amp;gt; и пароль &amp;lt;tt&amp;gt;&amp;quot;qwe123&amp;quot;&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Перейдем к настройке PPP. Обратите внимание, что в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/ppp/ppp.conf&amp;lt;/span&amp;gt; cтроки, оканчивающиеся на «&amp;lt;big&amp;gt;&amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039;&amp;lt;/big&amp;gt;», вводятся без отступа в начале строки. Остальные строки должны быть введены с отступом, как показано в примере.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/ppp/ppp.conf&lt;br /&gt;
default:&lt;br /&gt;
  Set log Phase Chat LCP IPCP CCP tun command&lt;br /&gt;
  Disable ipv6cp&lt;br /&gt;
&lt;br /&gt;
pppoe:&lt;br /&gt;
  set device &amp;quot;!/usr/sbin/pppoe -i vr0&amp;quot;&lt;br /&gt;
  set mtu max 1492&lt;br /&gt;
  set mru max 1492&lt;br /&gt;
  set speed sync&lt;br /&gt;
  disable acfcomp protocomp&lt;br /&gt;
  deny acfcomp&lt;br /&gt;
  set authname test&lt;br /&gt;
  set authkey qwe123&lt;br /&gt;
  add! default HISADDR&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выставляем корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/ppp/ppp.conf&lt;br /&gt;
&lt;br /&gt;
Устанавливаем соединение:&lt;br /&gt;
&lt;br /&gt;
 # ppp -ddial pppoe&lt;br /&gt;
&lt;br /&gt;
Если тестирование прошло успешно, можно настроить автоматическое поднятие PPPoE-соединения при старте системы:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/hostname.tun0&lt;br /&gt;
 !/usr/sbin/ppp -ddial pppoe&lt;br /&gt;
&lt;br /&gt;
Статья основана на материалах, предоставленных Гнединым Алексеем aka Goblin.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=233</id>
		<title>OpenBSD-Wiki:Текущие события</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=233"/>
		<updated>2013-06-14T13:56:42Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Актуальное */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Актуальное ==&lt;br /&gt;
Собрано всё, что применимо к текущему релизу.&lt;br /&gt;
&lt;br /&gt;
* [[Введение в OpenBSD]]&lt;br /&gt;
* [[Аппаратное обеспечение и вопросы]]&lt;br /&gt;
* [[Деликатное проникновение в частную сеть]]&lt;br /&gt;
* [[IPsec между OpenBSD и Linux Ubuntu]]&lt;br /&gt;
* [[OpenSSH мини-руководство]]&lt;br /&gt;
* [[OpenSSH: настройки, секреты, трюки и советы]]&lt;br /&gt;
* [[OpenSSL: 101 прием работы]]&lt;br /&gt;
* [[RSA/DSA аутентификация в OpenSSH]]&lt;br /&gt;
* [[VPN на базе SSH]]&lt;br /&gt;
* [[Использование файла mk.conf]]&lt;br /&gt;
* [[Использование сетевой файловой системы NFS]]&lt;br /&gt;
* [[Написание OpenBSD Loadable Kernel Modules (LKM)]]&lt;br /&gt;
* [[Настройка sendmail]]&lt;br /&gt;
* [[Настройка PPPoE-сервера]]&lt;br /&gt;
* [[Новое IPSec howto]]&lt;br /&gt;
* [[Русификация OpenBSD 5.x]]&lt;br /&gt;
* [[Русификация OpenBSD]]&lt;br /&gt;
* [[Русификация консоли OpenBSD]]&lt;br /&gt;
* [[Создание загрузочной флешки]]&lt;br /&gt;
* [[Перечень Интернет ресурсов о OpenBSD]]&lt;br /&gt;
* [[Описание переменных sysctl]]&lt;br /&gt;
* [[Сборник советов с OpenBSD101.com]]&lt;br /&gt;
&lt;br /&gt;
=== Переводы ===&lt;br /&gt;
* [[C2k10-marco]]&lt;br /&gt;
* [[C2k10-guenther]]&lt;br /&gt;
* [[C2k10-ajacoutot]]&lt;br /&gt;
* [[C2k10-henning]]&lt;br /&gt;
* [[C2k10-tedu]]&lt;br /&gt;
&lt;br /&gt;
== Устаревшее ==&lt;br /&gt;
Данная информация сохранена для архивных версий.&lt;br /&gt;
&lt;br /&gt;
* [[Зеркалирование данных с помощью ccd]]&lt;br /&gt;
* [[Использование Bluetooth в OpenBSD]]&lt;br /&gt;
* [[Настройка GPRS]]&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
&lt;br /&gt;
* [[Резервная копия Wiki]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=232</id>
		<title>Настройка PPPoE-сервера</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=232"/>
		<updated>2013-06-14T13:54:30Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Мини-руководство «шаг за шагом» */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
Пример создания PPPoE-сервера. Предположим, &amp;lt;tt&amp;gt;vr0&amp;lt;/tt&amp;gt; — это сетевой интерфейс, на котором будет работать сервер.&lt;br /&gt;
&lt;br /&gt;
Перейдем к настройке PPP. Обратите внимание, что в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/ppp/ppp.conf&amp;lt;/span&amp;gt; cтроки, оканчивающиеся на «&amp;#039;&amp;#039;&amp;#039;&amp;lt;big&amp;gt;:&amp;lt;/big&amp;gt;&amp;#039;&amp;#039;&amp;#039;», вводятся без отступа в начале строки. Остальные строки должны быть введены с отступом, как показано в примере.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/ppp/ppp.conf&lt;br /&gt;
default:&lt;br /&gt;
  Set log Phase Chat LCP IPCP CCP tun command&lt;br /&gt;
  Disable ipv6cp&lt;br /&gt;
&lt;br /&gt;
pppoe1:&lt;br /&gt;
  set device &amp;quot;!/usr/sbin/pppoe -i vr0&amp;quot;&lt;br /&gt;
  set mtu max 1492&lt;br /&gt;
  set mru max 1492&lt;br /&gt;
  set speed sync&lt;br /&gt;
  disable acfcomp protocomp&lt;br /&gt;
  deny acfcomp&lt;br /&gt;
  set ifaddr 192.168.1.1 192.168.1.32-192.168.1.63 255.255.255.255&lt;br /&gt;
  enable chap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание или изменение учетных записей пользователей производится за счет редактирования файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/ppp/ppp.secret&amp;lt;/span&amp;gt;. Если IP-адрес должен быть динамическим, тогда вместо поля &amp;lt;tt&amp;gt;ip_address&amp;lt;/tt&amp;gt; нужно поставить знак звездочки («&amp;#039;&amp;#039;&amp;#039;&amp;lt;big&amp;gt;*&amp;lt;/big&amp;gt;&amp;#039;&amp;#039;&amp;#039;»). Поле &amp;lt;tt&amp;gt;label&amp;lt;/tt&amp;gt; является необязательным. Например:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/ppp/ppp.secret&lt;br /&gt;
 # user password ip_address label&lt;br /&gt;
 user1 secret123 192.168.1.40 sidorov&lt;br /&gt;
 user2 123qwe *&lt;br /&gt;
&lt;br /&gt;
Выставляем корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/ppp/ppp.{conf, secret}&lt;br /&gt;
&lt;br /&gt;
Запуск:&lt;br /&gt;
&lt;br /&gt;
 # pppoe -p pppoe1 -i vr0 -s &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Если тестирование прошло успешно, можно настроить автоматический запуск при старте системы:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.local&lt;br /&gt;
 /usr/sbin/pppoe -p pppoe1 -i vr0 -s &amp;amp; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
Статья основана на материалах, предоставленных Гнединым Алексеем aka Goblin.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=231</id>
		<title>Настройка PPPoE-сервера</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=231"/>
		<updated>2013-06-14T13:50:04Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Мини-руководство «шаг за шагом» */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
Пример создания PPPoE-сервера. Предположим, &amp;lt;tt&amp;gt;vr0&amp;lt;/tt&amp;gt; — это сетевой интерфейс, на котором будет работать сервер.&lt;br /&gt;
&lt;br /&gt;
Перейдем к настройке PPP. Обратите внимание, что в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/ppp/ppp.conf&amp;lt;/span&amp;gt; cтроки, оканчивающиеся на &amp;#039;&amp;#039;&amp;#039;:&amp;#039;&amp;#039;&amp;#039;, вводятся без отступа в начале строки. Остальные строки должны быть введены с отступом, как показано в примере.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/ppp/ppp.conf&lt;br /&gt;
default:&lt;br /&gt;
  Set log Phase Chat LCP IPCP CCP tun command&lt;br /&gt;
  Disable ipv6cp&lt;br /&gt;
&lt;br /&gt;
pppoe1:&lt;br /&gt;
  set device &amp;quot;!/usr/sbin/pppoe -i vr0&amp;quot;&lt;br /&gt;
  set mtu max 1492&lt;br /&gt;
  set mru max 1492&lt;br /&gt;
  set speed sync&lt;br /&gt;
  disable acfcomp protocomp&lt;br /&gt;
  deny acfcomp&lt;br /&gt;
  set ifaddr 192.168.1.1 192.168.1.32-192.168.1.63 255.255.255.255&lt;br /&gt;
  enable chap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание или изменение учетных записей пользователей производится за счет редактирования файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/ppp/ppp.secret&amp;lt;/span&amp;gt;. Если IP-адрес должен быть динамическим, тогда вместо поля &amp;lt;tt&amp;gt;ip_address&amp;lt;/tt&amp;gt; нужно поставить знак звездочки (&amp;#039;&amp;#039;&amp;#039;*&amp;#039;&amp;#039;&amp;#039;). Поле &amp;lt;tt&amp;gt;label&amp;lt;/tt&amp;gt; является необязательным. Например:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/ppp/ppp.secret&lt;br /&gt;
 # user password ip_address label&lt;br /&gt;
 user1 secret123 192.168.1.40 sidorov&lt;br /&gt;
 user2 123qwe *&lt;br /&gt;
&lt;br /&gt;
Выставляем корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/ppp/ppp.{conf, secret}&lt;br /&gt;
&lt;br /&gt;
Запуск:&lt;br /&gt;
&lt;br /&gt;
 # pppoe -p pppoe1 -i vr0 -s &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Если тестирование прошло успешно, можно настроить автоматический запуск при старте системы:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.local&lt;br /&gt;
 /usr/sbin/pppoe -p pppoe1 -i vr0 -s &amp;amp; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
Статья основана на материалах, предоставленных Гнединым Алексеем aka Goblin.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=230</id>
		<title>Настройка PPPoE-сервера</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=230"/>
		<updated>2013-06-14T13:46:41Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Мини-руководство «шаг за шагом» */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
Пример создания PPPoE-сервера. Предположим, &amp;lt;tt&amp;gt;vr0&amp;lt;/tt&amp;gt; — это сетевой интерфейс, на котором будет работать сервер.&lt;br /&gt;
&lt;br /&gt;
Перейдем к настройке PPP. Обратите внимание, что в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/ppp/ppp.conf&amp;lt;/span&amp;gt; cтроки, оканчивающиеся на &amp;lt;nowiki&amp;gt;``:&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;, вводятся без отступа в начале строки. Остальные строки должны быть введены с отступом, как показано в примере.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/ppp/ppp.conf&lt;br /&gt;
default:&lt;br /&gt;
  Set log Phase Chat LCP IPCP CCP tun command&lt;br /&gt;
  Disable ipv6cp&lt;br /&gt;
&lt;br /&gt;
pppoe1:&lt;br /&gt;
  set device &amp;quot;!/usr/sbin/pppoe -i vr0&amp;quot;&lt;br /&gt;
  set mtu max 1492&lt;br /&gt;
  set mru max 1492&lt;br /&gt;
  set speed sync&lt;br /&gt;
  disable acfcomp protocomp&lt;br /&gt;
  deny acfcomp&lt;br /&gt;
  set ifaddr 192.168.1.1 192.168.1.32-192.168.1.63 255.255.255.255&lt;br /&gt;
  enable chap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание или изменение учетных записей пользователей производится за счет редактирования файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/ppp/ppp.secret&amp;lt;/span&amp;gt;. Если IP-адрес должен быть динамическим, тогда вместо поля &amp;lt;tt&amp;gt;ip_address&amp;lt;/tt&amp;gt; нужно поставить знак звездочки (&amp;lt;nowiki&amp;gt;``*&amp;#039;&amp;#039;&amp;lt;/nowiki&amp;gt;). Поле &amp;lt;tt&amp;gt;label&amp;lt;/tt&amp;gt; является необязательным. Например:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/ppp/ppp.secret&lt;br /&gt;
 # user password ip_address label&lt;br /&gt;
 user1 secret123 192.168.1.40 sidorov&lt;br /&gt;
 user2 123qwe *&lt;br /&gt;
&lt;br /&gt;
Выставляем корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/ppp/ppp.{conf, secret}&lt;br /&gt;
&lt;br /&gt;
Запуск:&lt;br /&gt;
&lt;br /&gt;
 # pppoe -p pppoe1 -i vr0 -s &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Если тестирование прошло успешно, можно настроить автоматический запуск при старте системы:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.local&lt;br /&gt;
 /usr/sbin/pppoe -p pppoe1 -i vr0 -s &amp;amp; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
Статья основана на материалах, предоставленных Гнединым Алексеем aka Goblin.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=229</id>
		<title>Настройка PPPoE-сервера</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_PPPoE-%D1%81%D0%B5%D1%80%D0%B2%D0%B5%D1%80%D0%B0&amp;diff=229"/>
		<updated>2013-06-14T13:40:33Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: Новая страница: «: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]  == Мини-руководство «шаг за шагом» ==  …»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
Пример создания PPPoE-сервера. Предположим, &amp;lt;tt&amp;gt;vr0&amp;lt;/tt&amp;gt; — это сетевой интерфейс, на котором будет работать сервер.&lt;br /&gt;
&lt;br /&gt;
Перейдем к настройке PPP. Обратите внимание, что в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/ppp/ppp.conf&amp;lt;/span&amp;gt; cтроки, оканчивающиеся на ``:&amp;#039;&amp;#039;, вводятся без отступа в начале строки. Остальные строки должны быть введены с отступом, как показано в примере.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/ppp/ppp.conf&lt;br /&gt;
default:&lt;br /&gt;
  Set log Phase Chat LCP IPCP CCP tun command&lt;br /&gt;
  Disable ipv6cp&lt;br /&gt;
&lt;br /&gt;
pppoe1:&lt;br /&gt;
  set device &amp;quot;!/usr/sbin/pppoe -i vr0&amp;quot;&lt;br /&gt;
  set mtu max 1492&lt;br /&gt;
  set mru max 1492&lt;br /&gt;
  set speed sync&lt;br /&gt;
  disable acfcomp protocomp&lt;br /&gt;
  deny acfcomp&lt;br /&gt;
  set ifaddr 192.168.1.1 192.168.1.32-192.168.1.63 255.255.255.255&lt;br /&gt;
  enable chap&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создание или изменение учетных записей пользователей производится за счет редактирования файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/ppp/ppp.secret&amp;lt;/span&amp;gt;. Если IP-адрес должен быть динамическим, тогда вместо поля &amp;lt;tt&amp;gt;ip_address&amp;lt;/tt&amp;gt; нужно поставить знак звездочки (``*&amp;#039;&amp;#039;). Поле &amp;lt;tt&amp;gt;label&amp;lt;/tt&amp;gt; является необязательным. Например:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/ppp/ppp.secret&lt;br /&gt;
 # user password ip_address label&lt;br /&gt;
 user1 secret123 192.168.1.40 sidorov&lt;br /&gt;
 user2 123qwe *&lt;br /&gt;
&lt;br /&gt;
Выставляем корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/ppp/ppp.{conf, secret}&lt;br /&gt;
&lt;br /&gt;
Запуск:&lt;br /&gt;
&lt;br /&gt;
 # pppoe -p pppoe1 -i vr0 -s &amp;amp;&lt;br /&gt;
&lt;br /&gt;
Если тестирование прошло успешно, можно настроить автоматический запуск при старте системы:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.local&lt;br /&gt;
 /usr/sbin/pppoe -p pppoe1 -i vr0 -s &amp;amp; &amp;gt;/dev/null 2&amp;gt;&amp;amp;1&lt;br /&gt;
&lt;br /&gt;
Статья основана на материалах, предоставленных Гнединым Алексеем aka Goblin.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=228</id>
		<title>OpenBSD-Wiki:Текущие события</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=228"/>
		<updated>2013-06-14T13:32:02Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Актуальное */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Актуальное ==&lt;br /&gt;
Собрано всё, что применимо к текущему релизу.&lt;br /&gt;
&lt;br /&gt;
* [[Введение в OpenBSD]]&lt;br /&gt;
* [[Аппаратное обеспечение и вопросы]]&lt;br /&gt;
* [[Деликатное проникновение в частную сеть]]&lt;br /&gt;
* [[IPsec между OpenBSD и Linux Ubuntu]]&lt;br /&gt;
* [[OpenSSH мини-руководство]]&lt;br /&gt;
* [[OpenSSH: настройки, секреты, трюки и советы]]&lt;br /&gt;
* [[OpenSSL: 101 прием работы]]&lt;br /&gt;
* [[RSA/DSA аутентификация в OpenSSH]]&lt;br /&gt;
* [[VPN на базе SSH]]&lt;br /&gt;
* [[Использование файла mk.conf]]&lt;br /&gt;
* [[Использование сетевой файловой системы NFS]]&lt;br /&gt;
* [[Написание OpenBSD Loadable Kernel Modules (LKM)]]&lt;br /&gt;
* [[Настройка sendmail]]&lt;br /&gt;
* [[Новое IPSec howto]]&lt;br /&gt;
* [[Русификация OpenBSD 5.x]]&lt;br /&gt;
* [[Русификация OpenBSD]]&lt;br /&gt;
* [[Русификация консоли OpenBSD]]&lt;br /&gt;
* [[Создание загрузочной флешки]]&lt;br /&gt;
* [[Перечень Интернет ресурсов о OpenBSD]]&lt;br /&gt;
* [[Описание переменных sysctl]]&lt;br /&gt;
* [[Сборник советов с OpenBSD101.com]]&lt;br /&gt;
&lt;br /&gt;
=== Переводы ===&lt;br /&gt;
* [[C2k10-marco]]&lt;br /&gt;
* [[C2k10-guenther]]&lt;br /&gt;
* [[C2k10-ajacoutot]]&lt;br /&gt;
* [[C2k10-henning]]&lt;br /&gt;
* [[C2k10-tedu]]&lt;br /&gt;
&lt;br /&gt;
== Устаревшее ==&lt;br /&gt;
Данная информация сохранена для архивных версий.&lt;br /&gt;
&lt;br /&gt;
* [[Зеркалирование данных с помощью ccd]]&lt;br /&gt;
* [[Использование Bluetooth в OpenBSD]]&lt;br /&gt;
* [[Настройка GPRS]]&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
&lt;br /&gt;
* [[Резервная копия Wiki]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_NFS&amp;diff=227</id>
		<title>Использование сетевой файловой системы NFS</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_NFS&amp;diff=227"/>
		<updated>2013-06-14T13:31:02Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Мини-руководство «шаг за шагом» */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
В файле [http://www.openbsd.org/cgi-bin/man.cgi?query=exports&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html exports(5)] перечисляем каталоги, которые должны быть предоставлены для общего доступа через NFS, а также задаем права доступа к ним:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/exports&lt;br /&gt;
 /export -alldirs -ro -network=192.168.2.0 -mask=255.255.255.0&lt;br /&gt;
 /usr/src /usr/ports -maproot=root 192.168.2.3&lt;br /&gt;
&lt;br /&gt;
Последовательно загружаем [http://www.openbsd.org/cgi-bin/man.cgi?query=portmap&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html portmap(8)], [http://www.openbsd.org/cgi-bin/man.cgi?query=nfsd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html nfsd(8)], [http://www.openbsd.org/cgi-bin/man.cgi?query=mountd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html mountd(8)]:&lt;br /&gt;
&lt;br /&gt;
 # portmap&lt;br /&gt;
 # nfsd -tun 4&lt;br /&gt;
 # touch /var/db/mountdtab&lt;br /&gt;
 # mountd&lt;br /&gt;
&lt;br /&gt;
Для того чтобы &amp;lt;tt&amp;gt;mountd&amp;lt;/tt&amp;gt; смог перечитать &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/exports&amp;lt;/span&amp;gt;, следует отправить ему сигнал &amp;#039;&amp;#039;&amp;#039;SIGHUP&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/mountd.pid`&lt;br /&gt;
&lt;br /&gt;
Проверить корректность работы RPC-служб можно с помощью следующей команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% rpcinfo -p 192.168.2.1&lt;br /&gt;
   program vers proto   port&lt;br /&gt;
    100000    2   tcp    111  portmapper&lt;br /&gt;
    100000    2   udp    111  portmapper&lt;br /&gt;
    100003    2   udp   2049  nfs&lt;br /&gt;
    100003    3   udp   2049  nfs&lt;br /&gt;
    100003    2   tcp   2049  nfs&lt;br /&gt;
    100003    3   tcp   2049  nfs&lt;br /&gt;
    100005    1   udp    772  mountd&lt;br /&gt;
    100005    3   udp    772  mountd&lt;br /&gt;
    100005    1   tcp    804  mountd&lt;br /&gt;
    100005    3   tcp    804  mountd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот таким образом можно получить список экспортируемых общих ресурсов:&lt;br /&gt;
&lt;br /&gt;
 % showmount -e&lt;br /&gt;
 Exports list on localhost:&lt;br /&gt;
 /export 192.168.2.0&lt;br /&gt;
 /usr/src 192.168.2.3&lt;br /&gt;
 /usr/ports 192.168.2.3&lt;br /&gt;
&lt;br /&gt;
В [http://www.openbsd.org/cgi-bin/man.cgi?query=rc.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html rc.conf(8)] прописываем автозапуск служб NFS:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.conf&lt;br /&gt;
 nfs_server=YES&lt;br /&gt;
 portmap=YES&lt;br /&gt;
 nfsd_flags=&amp;quot;-tun 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Конфигурирование клиента NFS заключается в выполнении следующих шагов. В первую очередь изменяем значение переменной [http://www.openbsd.org/cgi-bin/man.cgi?query=sysctl&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html sysctl(8)]:&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w vfs.nfs.iothreads=4&lt;br /&gt;
&lt;br /&gt;
Добавляем соответствующую запись в [http://www.openbsd.org/cgi-bin/man.cgi?query=sysctl.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html sysctl.conf(5)]:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/sysctl.conf&lt;br /&gt;
 vfs.nfs.iothreads=4&lt;br /&gt;
&lt;br /&gt;
Задаем опции монтирования общих ресурсов NFS в [http://www.openbsd.org/cgi-bin/man.cgi?query=fstab&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html fstab(5)]:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/fstab&lt;br /&gt;
 192.168.2.1:/export /mnt nfs ro, nodev, nosuid, tcp, soft, intr 0 0&lt;br /&gt;
 192.168.2.1:/usr/src /usr/src nfs rw, noauto, nodev, nosuid, soft, intr 0 0&lt;br /&gt;
 192.168.2.1:/usr/ports /usr/ports nfs rw, noauto, nodev, nosuid, soft, intr 0 0&lt;br /&gt;
&lt;br /&gt;
Пример монтирования удаленной файловой системы:&lt;br /&gt;
&lt;br /&gt;
 # mount /usr/ports&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_NFS&amp;diff=226</id>
		<title>Использование сетевой файловой системы NFS</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%98%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D1%81%D0%B5%D1%82%D0%B5%D0%B2%D0%BE%D0%B9_%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%D0%BE%D0%B9_%D1%81%D0%B8%D1%81%D1%82%D0%B5%D0%BC%D1%8B_NFS&amp;diff=226"/>
		<updated>2013-06-14T13:27:20Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: Новая страница: «: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]  == Мини-руководство «шаг за шагом» ==  …»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
В файле [exports(5)http://www.openbsd.org/cgi-bin/man.cgi?query=exports&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html] перечисляем каталоги, которые должны быть предоставлены для общего доступа через NFS, а также задаем права доступа к ним:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/exports&lt;br /&gt;
 /export -alldirs -ro -network=192.168.2.0 -mask=255.255.255.0&lt;br /&gt;
 /usr/src /usr/ports -maproot=root 192.168.2.3&lt;br /&gt;
&lt;br /&gt;
Последовательно загружаем [portmap(8) http://www.openbsd.org/cgi-bin/man.cgi?query=portmap&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html], [nfsd(8) http://www.openbsd.org/cgi-bin/man.cgi?query=nfsd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html], [mountd(8) http://www.openbsd.org/cgi-bin/man.cgi?query=mountd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html]:&lt;br /&gt;
&lt;br /&gt;
 # portmap&lt;br /&gt;
 # nfsd -tun 4&lt;br /&gt;
 # touch /var/db/mountdtab&lt;br /&gt;
 # mountd&lt;br /&gt;
&lt;br /&gt;
Для того чтобы &amp;lt;tt&amp;gt;mountd&amp;lt;/tt&amp;gt; смог перечитать &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/exports&amp;lt;/span&amp;gt;, следует отправить ему сигнал &amp;#039;&amp;#039;&amp;#039;SIGHUP&amp;#039;&amp;#039;&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/mountd.pid`&lt;br /&gt;
&lt;br /&gt;
Проверить корректность работы RPC-служб можно с помощью следующей команды:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% rpcinfo -p 192.168.2.1&lt;br /&gt;
   program vers proto   port&lt;br /&gt;
    100000    2   tcp    111  portmapper&lt;br /&gt;
    100000    2   udp    111  portmapper&lt;br /&gt;
    100003    2   udp   2049  nfs&lt;br /&gt;
    100003    3   udp   2049  nfs&lt;br /&gt;
    100003    2   tcp   2049  nfs&lt;br /&gt;
    100003    3   tcp   2049  nfs&lt;br /&gt;
    100005    1   udp    772  mountd&lt;br /&gt;
    100005    3   udp    772  mountd&lt;br /&gt;
    100005    1   tcp    804  mountd&lt;br /&gt;
    100005    3   tcp    804  mountd&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Вот таким образом можно получить список экспортируемых общих ресурсов:&lt;br /&gt;
&lt;br /&gt;
 % showmount -e&lt;br /&gt;
 Exports list on localhost:&lt;br /&gt;
 /export 192.168.2.0&lt;br /&gt;
 /usr/src 192.168.2.3&lt;br /&gt;
 /usr/ports 192.168.2.3&lt;br /&gt;
&lt;br /&gt;
В [rc.conf(8) http://www.openbsd.org/cgi-bin/man.cgi?query=rc.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html] прописываем автозапуск служб NFS:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.conf&lt;br /&gt;
 nfs_server=YES&lt;br /&gt;
 portmap=YES&lt;br /&gt;
 nfsd_flags=&amp;quot;-tun 4&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Конфигурирование клиента NFS заключается в выполнении следующих шагов. В первую очередь изменяем значение переменной [sysctl(8) http://www.openbsd.org/cgi-bin/man.cgi?query=sysctl&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html]:&lt;br /&gt;
&lt;br /&gt;
 # sysctl -w vfs.nfs.iothreads=4&lt;br /&gt;
&lt;br /&gt;
Добавляем соответствующую запись в [sysctl.conf(5) http://www.openbsd.org/cgi-bin/man.cgi?query=sysctl.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html]:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/sysctl.conf&lt;br /&gt;
 vfs.nfs.iothreads=4&lt;br /&gt;
&lt;br /&gt;
Задаем опции монтирования общих ресурсов NFS в [fstab(5) http://www.openbsd.org/cgi-bin/man.cgi?query=fstab&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html]:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/fstab&lt;br /&gt;
 192.168.2.1:/export /mnt nfs ro, nodev, nosuid, tcp, soft, intr 0 0&lt;br /&gt;
 192.168.2.1:/usr/src /usr/src nfs rw, noauto, nodev, nosuid, soft, intr 0 0&lt;br /&gt;
 192.168.2.1:/usr/ports /usr/ports nfs rw, noauto, nodev, nosuid, soft, intr 0 0&lt;br /&gt;
&lt;br /&gt;
Пример монтирования удаленной файловой системы:&lt;br /&gt;
&lt;br /&gt;
 # mount /usr/ports&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=209</id>
		<title>OpenBSD-Wiki:Текущие события</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=209"/>
		<updated>2013-06-05T14:55:12Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Актуальное */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Актуальное ==&lt;br /&gt;
Собрано всё, что применимо к текущему релизу.&lt;br /&gt;
&lt;br /&gt;
* [[Введение в OpenBSD]]&lt;br /&gt;
* [[Аппаратное обеспечение и вопросы]]&lt;br /&gt;
* [[Деликатное проникновение в частную сеть]]&lt;br /&gt;
* [[IPsec между OpenBSD и Linux Ubuntu]]&lt;br /&gt;
* [[OpenSSH мини-руководство]]&lt;br /&gt;
* [[OpenSSH: настройки, секреты, трюки и советы]]&lt;br /&gt;
* [[OpenSSL: 101 прием работы]]&lt;br /&gt;
* [[RSA/DSA аутентификация в OpenSSH]]&lt;br /&gt;
* [[VPN на базе SSH]]&lt;br /&gt;
* [[Использование файла mk.conf]]&lt;br /&gt;
* [[Написание OpenBSD Loadable Kernel Modules (LKM)]]&lt;br /&gt;
* [[Настройка sendmail]]&lt;br /&gt;
* [[Новое IPSec howto]]&lt;br /&gt;
* [[Русификация OpenBSD 5.x]]&lt;br /&gt;
* [[Русификация OpenBSD]]&lt;br /&gt;
* [[Русификация консоли OpenBSD]]&lt;br /&gt;
* [[Создание загрузочной флешки]]&lt;br /&gt;
* [[Перечень Интернет ресурсов о OpenBSD]]&lt;br /&gt;
* [[Описание переменных sysctl]]&lt;br /&gt;
* [[Сборник советов с OpenBSD101.com]]&lt;br /&gt;
&lt;br /&gt;
=== Переводы ===&lt;br /&gt;
* [[C2k10-marco]]&lt;br /&gt;
* [[C2k10-guenther]]&lt;br /&gt;
* [[C2k10-ajacoutot]]&lt;br /&gt;
* [[C2k10-henning]]&lt;br /&gt;
* [[C2k10-tedu]]&lt;br /&gt;
&lt;br /&gt;
== Устаревшее ==&lt;br /&gt;
Данная информация сохранена для архивных версий.&lt;br /&gt;
&lt;br /&gt;
* [[Зеркалирование данных с помощью ccd]]&lt;br /&gt;
* [[Использование Bluetooth в OpenBSD]]&lt;br /&gt;
* [[Настройка GPRS]]&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
&lt;br /&gt;
* [[Резервная копия Wiki]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=VPN_%D0%BD%D0%B0_%D0%B1%D0%B0%D0%B7%D0%B5_SSH&amp;diff=208</id>
		<title>VPN на базе SSH</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=VPN_%D0%BD%D0%B0_%D0%B1%D0%B0%D0%B7%D0%B5_SSH&amp;diff=208"/>
		<updated>2013-06-05T14:53:13Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Мини-руководство «шаг за шагом» */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
Для примера возьмем два сервера: &amp;lt;tt&amp;gt;srv1&amp;lt;/tt&amp;gt; с IP-адресами 212.34.XX.YY и 192.168.2.1 подключен к сегменту внутренней сети 192.168.2.0/24, а &amp;lt;tt&amp;gt;srv2&amp;lt;/tt&amp;gt; с 213.167.XX.YY и 192.168.1.1 шефствует над подопечными из 192.168.1.0/24. Настроим VPN-туннель средствами OpenSSH, в котором будут использоваться адреса 10.0.0.1 и 10.0.0.2. Для наглядности сценарий можно представить следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (10.0.0.1) 212.34.XX.YY            213.167.XX.YY (10.0.0.2)&lt;br /&gt;
192.168.2.0/24 — srv1 — [ internet ] — srv2 — 192.168.1.0/24&lt;br /&gt;
                192.168.2.1               192.168.1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ключевые элементы сетевой конфигурации рассмотрены, теперь приступаем к настройкам. Логинимся на &amp;lt;tt&amp;gt;srv1&amp;lt;/tt&amp;gt; и правим главный конфигурационный файл [http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html sshd(8)]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srv1# vi /etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
# Разрешаем туннелирование layer-3&lt;br /&gt;
# &lt;br /&gt;
PermitTunnel point-to-point&lt;br /&gt;
&lt;br /&gt;
# VPN на базе OpenSSH требует привилегий суперпользователя,&lt;br /&gt;
# поэтому аутентификацию под учетной записью root разрешаем&lt;br /&gt;
# только с доверенных хостов&lt;br /&gt;
# &lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
Match Host 213.167.XX.YY,192.168.2.*,127.0.0.1&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По окончании настроек не забываем отправить демону сигнал SIGHUP, чтобы он смог перечитать свой конфиг:&lt;br /&gt;
&lt;br /&gt;
 srv1# kill -HUP `sed q /var/run/sshd.pid`&lt;br /&gt;
&lt;br /&gt;
Далее разрешаем прохождение пакетов на используемых туннельных псевдоустройствах [http://www.openbsd.org/cgi-bin/man.cgi?query=tun&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html tun(4)] (на &amp;lt;tt&amp;gt;tun0&amp;lt;/tt&amp;gt; у меня висит OpenVPN, &amp;lt;tt&amp;gt;tun1&amp;lt;/tt&amp;gt; — для OpenSSH):&lt;br /&gt;
&lt;br /&gt;
 srv1# vi /etc/pf.conf&lt;br /&gt;
 pass quick on { tun0, tun1 } inet all&lt;br /&gt;
&lt;br /&gt;
Загружаем правила из конфига:&lt;br /&gt;
&lt;br /&gt;
 srv1# pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
Создаем интерфейс &amp;lt;tt&amp;gt;tun1&amp;lt;/tt&amp;gt; и назначаем ему IP-адрес:&lt;br /&gt;
&lt;br /&gt;
 srv1# ifconfig tun1 create&lt;br /&gt;
 srv1# ifconfig tun1 10.0.0.1 10.0.0.2 netmask 255.255.255.252&lt;br /&gt;
&lt;br /&gt;
При помощи команды [http://www.openbsd.org/cgi-bin/man.cgi?query=ifconfig&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html ifconfig(8)] проверяем его состояние:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srv1% ifconfig tun1&lt;br /&gt;
tun1: flags=51&amp;lt;UP,POINTOPOINT,RUNNING&amp;gt; mtu 1500&lt;br /&gt;
        groups: tun&lt;br /&gt;
        inet 10.0.0.1 --&amp;gt; 10.0.0.2 netmask 255.255.255.252&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не забываем добавить в таблицу маршрутизации удаленную подсеть:&lt;br /&gt;
&lt;br /&gt;
 srv1# route add 192.168.1.0/24 10.0.0.2&lt;br /&gt;
&lt;br /&gt;
Второй сервер выступает в роли SSH-клиента, поэтому процедура конфигурирования здесь чуть проще:&lt;br /&gt;
&lt;br /&gt;
 srv2# echo &amp;#039;Tunnel point-to-point&amp;#039; &amp;gt;&amp;gt; /etc/ssh/ssh_config&lt;br /&gt;
&lt;br /&gt;
Остальные настройки и действия практически идентичны описанным выше: правим и активируем рулесеты файервола, поднимаем &amp;lt;tt&amp;gt;tun1&amp;lt;/tt&amp;gt;, присваиваем ему сетевой адрес (обратите внимание, порядок следования IP-адресов изменен) и добавляем статический маршрут:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srv2# vi /etc/pf.conf&lt;br /&gt;
pass quick on { tun0, tun1 } inet all&lt;br /&gt;
&lt;br /&gt;
srv2# pfctl -f /etc/pf.conf&lt;br /&gt;
srv2# ifconfig tun1 create&lt;br /&gt;
srv2# ifconfig tun1 10.0.0.2 10.0.0.1 netmask 255.255.255.252&lt;br /&gt;
srv2# route add 192.168.2.0/24 10.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И, наконец, самый ответственный момент: устанавливаем защищенное соединение между двумя сетями:&lt;br /&gt;
&lt;br /&gt;
 srv2# ssh -f -w 1:1 212.34.XX.YY true&lt;br /&gt;
&lt;br /&gt;
Чтобы снизить накладные расходы, к списку аргументов имеет смысл добавить ключи «-o Compression=yes -x -a -n» (сжимать передаваемые данные, отключить пересылку пакетов X11, запретить аутентификацию с помощью агента и направить &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/dev/null&amp;lt;/span&amp;gt; на стандартный входной поток [http://www.openbsd.org/cgi-bin/man.cgi?query=stdin&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html stdin(4))]. Теперь проверим доступность удаленного узла, находящегося «за первым сервером»:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srv2% ping 192.168.2.101&lt;br /&gt;
PING 192.168.2.101 (192.168.2.101): 56 data bytes&lt;br /&gt;
64 bytes from 192.168.2.101: icmp_seq=0 ttl=127 time=2.508 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если все ОК, можно дальше развивать предложенную схему, упрощая или, наоборот, усложняя настройки. Например, применить беспарольную аутентификацию на базе ключей, создать конфигурационный файл для автоматического создания псевдоустройства &amp;lt;tt&amp;gt;tun1&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 srv2# echo &amp;#039;10.0.0.2 10.0.0.1 netmask 255.255.255.252&amp;#039; &amp;gt; /etc/hostname.tun1&lt;br /&gt;
&lt;br /&gt;
Занести необходимые статические маршруты и запуск «&amp;#039;&amp;#039;&amp;#039;ssh -f -w&amp;#039;&amp;#039;&amp;#039;» в один из сценариев начальной загрузки (&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt;) или в отдельный скрипт, чтобы все выполнялось одной командой, без дополнительных телодвижений. Чтобы использовать OpenSSH на уровне OSI 2, в качестве значения директив &amp;lt;tt&amp;gt;PermitTunnel&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;Tunnel&amp;lt;/tt&amp;gt; следует использовать &amp;lt;tt&amp;gt;ethernet&amp;lt;/tt&amp;gt;, а затем объединить в мост внешний сетевой интерфейс и псевдоустройство &amp;lt;tt&amp;gt;tunX&amp;lt;/tt&amp;gt; (см. [http://www.openbsd.org/cgi-bin/man.cgi?query=bridge&amp;amp;sektion=4&amp;amp;apropos=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386 bridge(4)]).&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, с помощью OpenSSH возможно построение не только Site-to-Site VPN (межсайтовое подключение, в котором два маршрутизатора создают туннель в интернете), но и Client-to-Site (VPN-подключение удаленного доступа для проводных и беспроводных клиентов).&lt;br /&gt;
&lt;br /&gt;
Данное пошаговое руководство основано на статье «Волшебные криптотуннели», опубликованной в июльском номере журнала [http://www.xakep.ru/magazine/xa/115/132/1.asp «Хакер»] за 2008 год. Авторы оригинальной статьи: Андрей Матвеев и Сергей Яремчук.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=VPN_%D0%BD%D0%B0_%D0%B1%D0%B0%D0%B7%D0%B5_SSH&amp;diff=207</id>
		<title>VPN на базе SSH</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=VPN_%D0%BD%D0%B0_%D0%B1%D0%B0%D0%B7%D0%B5_SSH&amp;diff=207"/>
		<updated>2013-06-05T14:49:55Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Мини-руководство «шаг за шагом» */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
Для примера возьмем два сервера: &amp;lt;tt&amp;gt;srv1&amp;lt;/tt&amp;gt; с IP-адресами 212.34.XX.YY и 192.168.2.1 подключен к сегменту внутренней сети 192.168.2.0/24, а &amp;lt;tt&amp;gt;srv2&amp;lt;/tt&amp;gt; с 213.167.XX.YY и 192.168.1.1 шефствует над подопечными из 192.168.1.0/24. Настроим VPN-туннель средствами OpenSSH, в котором будут использоваться адреса 10.0.0.1 и 10.0.0.2. Для наглядности сценарий можно представить следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (10.0.0.1) 212.34.XX.YY            213.167.XX.YY (10.0.0.2)&lt;br /&gt;
192.168.2.0/24 — srv1 — [ internet ] — srv2 — 192.168.1.0/24&lt;br /&gt;
                192.168.2.1               192.168.1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ключевые элементы сетевой конфигурации рассмотрены, теперь приступаем к настройкам. Логинимся на &amp;lt;tt&amp;gt;srv1&amp;lt;/tt&amp;gt; и правим главный конфигурационный файл [http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html sshd(8)]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srv1# vi /etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
# Разрешаем туннелирование layer-3&lt;br /&gt;
# &lt;br /&gt;
PermitTunnel point-to-point&lt;br /&gt;
&lt;br /&gt;
# VPN на базе OpenSSH требует привилегий суперпользователя,&lt;br /&gt;
# поэтому аутентификацию под учетной записью root разрешаем&lt;br /&gt;
# только с доверенных хостов&lt;br /&gt;
# &lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
Match Host 213.167.XX.YY,192.168.2.*,127.0.0.1&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По окончании настроек не забываем отправить демону сигнал SIGHUP, чтобы он смог перечитать свой конфиг:&lt;br /&gt;
&lt;br /&gt;
 srv1# kill -HUP `sed q /var/run/sshd.pid`&lt;br /&gt;
&lt;br /&gt;
Далее разрешаем прохождение пакетов на используемых туннельных псевдоустройствах [http://www.openbsd.org/cgi-bin/man.cgi?query=tun&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html tun(4)] (на &amp;lt;tt&amp;gt;tun0&amp;lt;/tt&amp;gt; у меня висит OpenVPN, &amp;lt;tt&amp;gt;tun1&amp;lt;/tt&amp;gt; — для OpenSSH):&lt;br /&gt;
&lt;br /&gt;
 srv1# vi /etc/pf.conf&lt;br /&gt;
 pass quick on { tun0, tun1 } inet all&lt;br /&gt;
&lt;br /&gt;
Загружаем правила из конфига:&lt;br /&gt;
&lt;br /&gt;
 srv1# pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
Создаем интерфейс &amp;lt;tt&amp;gt;tun1&amp;lt;/tt&amp;gt; и назначаем ему IP-адрес:&lt;br /&gt;
&lt;br /&gt;
 srv1# ifconfig tun1 create&lt;br /&gt;
 srv1# ifconfig tun1 10.0.0.1 10.0.0.2 netmask 255.255.255.252&lt;br /&gt;
&lt;br /&gt;
При помощи команды [http://www.openbsd.org/cgi-bin/man.cgi?query=ifconfig&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html ifconfig(8)] проверяем его состояние:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srv1% ifconfig tun1&lt;br /&gt;
tun1: flags=51&amp;lt;UP,POINTOPOINT,RUNNING&amp;gt; mtu 1500&lt;br /&gt;
        groups: tun&lt;br /&gt;
        inet 10.0.0.1 --&amp;gt; 10.0.0.2 netmask 255.255.255.252&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не забываем добавить в таблицу маршрутизации удаленную подсеть:&lt;br /&gt;
&lt;br /&gt;
 srv1# route add 192.168.1.0/24 10.0.0.2&lt;br /&gt;
&lt;br /&gt;
Второй сервер выступает в роли SSH-клиента, поэтому процедура конфигурирования здесь чуть проще:&lt;br /&gt;
&lt;br /&gt;
 srv2# echo &amp;#039;Tunnel point-to-point&amp;#039; &amp;gt;&amp;gt; /etc/ssh/ssh_config&lt;br /&gt;
&lt;br /&gt;
Остальные настройки и действия практически идентичны описанным выше: правим и активируем рулесеты файервола, поднимаем &amp;lt;tt&amp;gt;tun1&amp;lt;/tt&amp;gt;, присваиваем ему сетевой адрес (обратите внимание, порядок следования IP-адресов изменен) и добавляем статический маршрут:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srv2# vi /etc/pf.conf&lt;br /&gt;
pass quick on { tun0, tun1 } inet all&lt;br /&gt;
&lt;br /&gt;
srv2# pfctl -f /etc/pf.conf&lt;br /&gt;
srv2# ifconfig tun1 create&lt;br /&gt;
srv2# ifconfig tun1 10.0.0.2 10.0.0.1 netmask 255.255.255.252&lt;br /&gt;
srv2# route add 192.168.2.0/24 10.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И, наконец, самый ответственный момент: устанавливаем защищенное соединение между двумя сетями:&lt;br /&gt;
&lt;br /&gt;
 srv2# ssh -f -w 1:1 212.34.XX.YY true&lt;br /&gt;
&lt;br /&gt;
Чтобы снизить накладные расходы, к списку аргументов имеет смысл добавить ключи «-o Compression=yes -x -a -n» (сжимать передаваемые данные, отключить пересылку пакетов X11, запретить аутентификацию с помощью агента и направить &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/dev/null&amp;lt;/span&amp;gt; на стандартный входной поток [http://www.openbsd.org/cgi-bin/man.cgi?query=stdin&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html stdin(4))]. Теперь проверим доступность удаленного узла, находящегося «за первым сервером»:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srv2% ping 192.168.2.101&lt;br /&gt;
PING 192.168.2.101 (192.168.2.101): 56 data bytes&lt;br /&gt;
64 bytes from 192.168.2.101: icmp_seq=0 ttl=127 time=2.508 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если все ОК, можно дальше развивать предложенную схему, упрощая или, наоборот, усложняя настройки. Например, применить беспарольную аутентификацию на базе ключей, создать конфигурационный файл для автоматического создания псевдоустройства &amp;lt;tt&amp;gt;tun1&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 srv2# echo &amp;#039;10.0.0.2 10.0.0.1 netmask 255.255.255.252&amp;#039; &amp;gt; /etc/hostname.tun1&lt;br /&gt;
&lt;br /&gt;
Занести необходимые статические маршруты и запуск «ssh -f -w» в один из сценариев начальной загрузки (&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt;) или в отдельный скрипт, чтобы все выполнялось одной командой, без дополнительных телодвижений. Чтобы использовать OpenSSH на уровне OSI 2, в качестве значения директив &amp;lt;tt&amp;gt;PermitTunnel&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;Tunnel&amp;lt;/tt&amp;gt; следует использовать &amp;lt;tt&amp;gt;ethernet&amp;lt;/tt&amp;gt;, а затем объединить в мост внешний сетевой интерфейс и псевдоустройство &amp;lt;tt&amp;gt;tunX&amp;lt;/tt&amp;gt; (см. [http://www.openbsd.org/cgi-bin/man.cgi?query=bridge&amp;amp;sektion=4&amp;amp;apropos=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386 bridge(4)]).&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, с помощью OpenSSH возможно построение не только Site-to-Site VPN (межсайтовое подключение, в котором два маршрутизатора создают туннель в интернете), но и Client-to-Site (VPN-подключение удаленного доступа для проводных и беспроводных клиентов).&lt;br /&gt;
&lt;br /&gt;
Данное пошаговое руководство основано на статье «Волшебные криптотуннели», опубликованной в июльском номере журнала [http://www.xakep.ru/magazine/xa/115/132/1.asp «Хакер»] за 2008 год. Авторы оригинальной статьи: Андрей Матвеев и Сергей Яремчук.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=VPN_%D0%BD%D0%B0_%D0%B1%D0%B0%D0%B7%D0%B5_SSH&amp;diff=206</id>
		<title>VPN на базе SSH</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=VPN_%D0%BD%D0%B0_%D0%B1%D0%B0%D0%B7%D0%B5_SSH&amp;diff=206"/>
		<updated>2013-06-05T14:39:23Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: Новая страница: «:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]  == Мини-руководство «шаг за шагом» ==  Д…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
Для примера возьмем два сервера: &amp;lt;tt&amp;gt;srv1&amp;lt;/tt&amp;gt; с IP-адресами 212.34.XX.YY и 192.168.2.1 подключен к сегменту внутренней сети 192.168.2.0/24, а &amp;lt;tt&amp;gt;srv2&amp;lt;/tt&amp;gt; с 213.167.XX.YY и 192.168.1.1 шефствует над подопечными из 192.168.1.0/24. Настроим VPN-туннель средствами OpenSSH, в котором будут использоваться адреса 10.0.0.1 и 10.0.0.2. Для наглядности сценарий можно представить следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
     (10.0.0.1) 212.34.XX.YY            213.167.XX.YY (10.0.0.2)&lt;br /&gt;
192.168.2.0/24 — srv1 — [ internet ] — srv2 — 192.168.1.0/24&lt;br /&gt;
                192.168.2.1               192.168.1.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Ключевые элементы сетевой конфигурации рассмотрены, теперь приступаем к настройкам. Логинимся на &amp;lt;tt&amp;gt;srv1&amp;lt;/tt&amp;gt; и правим главный конфигурационный файл sshd(8):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srv1# vi /etc/ssh/sshd_config&lt;br /&gt;
&lt;br /&gt;
# Разрешаем туннелирование layer-3&lt;br /&gt;
# &lt;br /&gt;
PermitTunnel point-to-point&lt;br /&gt;
&lt;br /&gt;
# VPN на базе OpenSSH требует привилегий суперпользователя,&lt;br /&gt;
# поэтому аутентификацию под учетной записью root разрешаем&lt;br /&gt;
# только с доверенных хостов&lt;br /&gt;
# &lt;br /&gt;
PermitRootLogin no&lt;br /&gt;
Match Host 213.167.XX.YY,192.168.2.*,127.0.0.1&lt;br /&gt;
 PermitRootLogin yes&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
По окончании настроек не забываем отправить демону сигнал SIGHUP, чтобы он смог перечитать свой конфиг:&lt;br /&gt;
&lt;br /&gt;
 srv1# kill -HUP `sed q /var/run/sshd.pid`&lt;br /&gt;
&lt;br /&gt;
Далее разрешаем прохождение пакетов на используемых туннельных псевдоустройствах tun(4) (на tun0 у меня висит OpenVPN, tun1 — для OpenSSH):&lt;br /&gt;
&lt;br /&gt;
 srv1# vi /etc/pf.conf&lt;br /&gt;
 pass quick on { tun0, tun1 } inet all&lt;br /&gt;
&lt;br /&gt;
Загружаем правила из конфига:&lt;br /&gt;
&lt;br /&gt;
 srv1# pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
Создаем интерфейс tun1 и назначаем ему IP-адрес:&lt;br /&gt;
&lt;br /&gt;
 srv1# ifconfig tun1 create&lt;br /&gt;
 srv1# ifconfig tun1 10.0.0.1 10.0.0.2 netmask 255.255.255.252&lt;br /&gt;
&lt;br /&gt;
При помощи команды ifconfig(8) проверяем его состояние:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srv1% ifconfig tun1&lt;br /&gt;
tun1: flags=51&amp;lt;UP,POINTOPOINT,RUNNING&amp;gt; mtu 1500&lt;br /&gt;
        groups: tun&lt;br /&gt;
        inet 10.0.0.1 --&amp;gt; 10.0.0.2 netmask 255.255.255.252&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не забываем добавить в таблицу маршрутизации удаленную подсеть:&lt;br /&gt;
&lt;br /&gt;
 srv1# route add 192.168.1.0/24 10.0.0.2&lt;br /&gt;
&lt;br /&gt;
Второй сервер выступает в роли SSH-клиента, поэтому процедура конфигурирования здесь чуть проще:&lt;br /&gt;
&lt;br /&gt;
 srv2# echo &amp;#039;Tunnel point-to-point&amp;#039; &amp;gt;&amp;gt; /etc/ssh/ssh_config&lt;br /&gt;
&lt;br /&gt;
Остальные настройки и действия практически идентичны описанным выше: правим и активируем рулесеты файервола, поднимаем tun1, присваиваем ему сетевой адрес (обратите внимание, порядок следования IP-адресов изменен) и добавляем статический маршрут:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srv2# vi /etc/pf.conf&lt;br /&gt;
pass quick on { tun0, tun1 } inet all&lt;br /&gt;
&lt;br /&gt;
srv2# pfctl -f /etc/pf.conf&lt;br /&gt;
srv2# ifconfig tun1 create&lt;br /&gt;
srv2# ifconfig tun1 10.0.0.2 10.0.0.1 netmask 255.255.255.252&lt;br /&gt;
srv2# route add 192.168.2.0/24 10.0.0.1&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И, наконец, самый ответственный момент: устанавливаем защищенное соединение между двумя сетями:&lt;br /&gt;
&lt;br /&gt;
 srv2# ssh -f -w 1:1 212.34.XX.YY true&lt;br /&gt;
&lt;br /&gt;
Чтобы снизить накладные расходы, к списку аргументов имеет смысл добавить ключи «-o Compression=yes -x -a -n» (сжимать передаваемые данные, отключить пересылку пакетов X11, запретить аутентификацию с помощью агента и направить /dev/null на стандартный входной поток stdin(4)). Теперь проверим доступность удаленного узла, находящегося «за первым сервером»:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
srv2% ping 192.168.2.101&lt;br /&gt;
PING 192.168.2.101 (192.168.2.101): 56 data bytes&lt;br /&gt;
64 bytes from 192.168.2.101: icmp_seq=0 ttl=127 time=2.508 ms&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если все ОК, можно дальше развивать предложенную схему, упрощая или, наоборот, усложняя настройки. Например, применить беспарольную аутентификацию на базе ключей, создать конфигурационный файл для автоматического создания псевдоустройства tun1:&lt;br /&gt;
&lt;br /&gt;
 srv2# echo &amp;#039;10.0.0.2 10.0.0.1 netmask 255.255.255.252&amp;#039; &amp;gt; /etc/hostname.tun1&lt;br /&gt;
&lt;br /&gt;
Занести необходимые статические маршруты и запуск «ssh -f -w» в один из сценариев начальной загрузки (/etc/rc.local) или в отдельный скрипт, чтобы все выполнялось одной командой, без дополнительных телодвижений. Чтобы использовать OpenSSH на уровне OSI 2, в качестве значения директив PermitTunnel и Tunnel следует использовать ethernet, а затем объединить в мост внешний сетевой интерфейс и псевдоустройство tunX (см. bridge(4)).&lt;br /&gt;
&lt;br /&gt;
Стоит отметить, с помощью OpenSSH возможно построение не только Site-to-Site VPN (межсайтовое подключение, в котором два маршрутизатора создают туннель в интернете), но и Client-to-Site (VPN-подключение удаленного доступа для проводных и беспроводных клиентов).&lt;br /&gt;
&lt;br /&gt;
Данное пошаговое руководство основано на статье «Волшебные криптотуннели», опубликованной в июльском номере журнала [http://www.xakep.ru/magazine/xa/115/132/1.asp «Хакер»] за 2008 год. Авторы оригинальной статьи: Андрей Матвеев и Сергей Яремчук.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=205</id>
		<title>OpenBSD-Wiki:Текущие события</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=205"/>
		<updated>2013-06-05T14:12:02Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Актуальное */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Актуальное ==&lt;br /&gt;
Собрано всё, что применимо к текущему релизу.&lt;br /&gt;
&lt;br /&gt;
* [[Введение в OpenBSD]]&lt;br /&gt;
* [[Аппаратное обеспечение и вопросы]]&lt;br /&gt;
* [[Деликатное проникновение в частную сеть]]&lt;br /&gt;
* [[IPsec между OpenBSD и Linux Ubuntu]]&lt;br /&gt;
* [[OpenSSH мини-руководство]]&lt;br /&gt;
* [[OpenSSH: настройки, секреты, трюки и советы]]&lt;br /&gt;
* [[RSA/DSA аутентификация в OpenSSH]]&lt;br /&gt;
* [[Использование файла mk.conf]]&lt;br /&gt;
* [[Написание OpenBSD Loadable Kernel Modules (LKM)]]&lt;br /&gt;
* [[Настройка sendmail]]&lt;br /&gt;
* [[Новое IPSec howto]]&lt;br /&gt;
* [[OpenSSL: 101 прием работы]]&lt;br /&gt;
* [[Русификация OpenBSD 5.x]]&lt;br /&gt;
* [[Русификация OpenBSD]]&lt;br /&gt;
* [[Русификация консоли OpenBSD]]&lt;br /&gt;
* [[Создание загрузочной флешки]]&lt;br /&gt;
* [[Перечень Интернет ресурсов о OpenBSD]]&lt;br /&gt;
* [[Описание переменных sysctl]]&lt;br /&gt;
* [[Сборник советов с OpenBSD101.com]]&lt;br /&gt;
&lt;br /&gt;
=== Переводы ===&lt;br /&gt;
* [[C2k10-marco]]&lt;br /&gt;
* [[C2k10-guenther]]&lt;br /&gt;
* [[C2k10-ajacoutot]]&lt;br /&gt;
* [[C2k10-henning]]&lt;br /&gt;
* [[C2k10-tedu]]&lt;br /&gt;
&lt;br /&gt;
== Устаревшее ==&lt;br /&gt;
Данная информация сохранена для архивных версий.&lt;br /&gt;
&lt;br /&gt;
* [[Зеркалирование данных с помощью ccd]]&lt;br /&gt;
* [[Использование Bluetooth в OpenBSD]]&lt;br /&gt;
* [[Настройка GPRS]]&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
&lt;br /&gt;
* [[Резервная копия Wiki]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=OpenSSL:_101_%D0%BF%D1%80%D0%B8%D0%B5%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B&amp;diff=204</id>
		<title>OpenSSL: 101 прием работы</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=OpenSSL:_101_%D0%BF%D1%80%D0%B8%D0%B5%D0%BC_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D1%8B&amp;diff=204"/>
		<updated>2013-06-05T14:09:34Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: Новая страница: «:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]  == Мини-руководство «шаг за шагом» ==  П…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
Пример шифрования файла симметричным алгоритмом &amp;lt;tt&amp;gt;des3&amp;lt;/tt&amp;gt; с помощью &amp;lt;tt&amp;gt;openssl enc&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% openssl enc -des3 -e -in plain.txt -out enc.txt&lt;br /&gt;
enter des-ede3-cbc encryption password:&lt;br /&gt;
Verifying — enter des-ede3-cbc encryption password:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Расшифровать файл можно, заменив ключ &amp;#039;-e&amp;#039; ключом &amp;#039;-d&amp;#039;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% openssl enc -des3 -d -in enc.txt -out plain.txt&lt;br /&gt;
enter des-ede3-cbc decryption password:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Для того, чтобы собеседник мог передать нам файл в зашифрованном виде, а мы бы смогли его расшифровать, стоит воспользоваться ассиметричной криптографией, сгенерировав пару RSA-ключей (публичный и приватный):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% openssl genrsa -out rsaprivatekey.pem -des3 2048&lt;br /&gt;
Generating RSA private key, 2048 bit long modulus&lt;br /&gt;
……………..+++&lt;br /&gt;
…………….+++&lt;br /&gt;
e is 65537 (0x10001)&lt;br /&gt;
Enter pass phrase for rsaprivatekey.pem:&lt;br /&gt;
Verifying — Enter pass phrase for rsaprivatekey.pem:&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Выставляем корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 % chmod 600 rsaprivatekey.pem&lt;br /&gt;
&lt;br /&gt;
Получить соответствующий закрытому публичный ключ можно с помощью openssl rsa:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% openssl rsa -in rsaprivatekey.pem -pubout -out rsapublickey.pem&lt;br /&gt;
Enter pass phrase for rsaprivatekey.pem:&lt;br /&gt;
writing RSA key&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Публичный ключ мы передаем собеседнику. Он шифрует файл на нем, используя &amp;lt;tt&amp;gt;openssl rsautl&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 % openssl rsautl -encrypt -pubin -inkey rsapublickey.pem -in plain.txt -out cipher.txt&lt;br /&gt;
&lt;br /&gt;
Мы получаем файл, расшифровываем его, используя свой секретный ключ:&lt;br /&gt;
&lt;br /&gt;
 % openssl rsault -decrypt -inkey rsaprivatekey.pem -in cipher.txt -out plain.txt&lt;br /&gt;
&lt;br /&gt;
Кроме шифрования, можно также подписывать файлы, предоставляя гарантии, что данный файл послан лично нами, и давая возможность проверить его аутентичность:&lt;br /&gt;
&lt;br /&gt;
 % openssl dgst -sha1 -sign rsaprivatekey.pem -out sign.txt myfile.tar.gz&lt;br /&gt;
&lt;br /&gt;
Все, что нужно получателю файла — это проверить подпись, используя наш публичный ключ:&lt;br /&gt;
&lt;br /&gt;
 % openssl dgst -sha1 -verify rsapublickey.pem -signature sign.txt myfile.tar.gz&lt;br /&gt;
 Verified OK.&lt;br /&gt;
&lt;br /&gt;
Вычислить контрольную сумму файла можно с помощью &amp;lt;tt&amp;gt;openssl dgst&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 % openssl dgst -md5 myfile.tar.gz&lt;br /&gt;
 MD5(myfile.tar.gz) =65b36f8d54b8bab0a787cbd4a8dd8aef&lt;br /&gt;
&lt;br /&gt;
Чтобы быстро сгенерировать пароль, WEP или IPsec-ключи, можно воспользоваться &amp;lt;tt&amp;gt;openssl rand&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 % openssl rand -base64 45&lt;br /&gt;
 0JZmfHQL3WI7PTUYcq1w8yQ8wFE3mB7Wd7vdAYd2A6x0cTHmVYqI/Su3o5qh&lt;br /&gt;
&lt;br /&gt;
Если нужно найти соответствие пароля его md5-шифру, можно использовать &amp;lt;tt&amp;gt;openssl passwd&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 % openssl passwd −1 mypassword&lt;br /&gt;
 $1$OsmexMtO$0CtV.Lb6nhGOSGKM8jKNO.&lt;br /&gt;
&lt;br /&gt;
Пример подписи почтового сообщения своим сертификатом:&lt;br /&gt;
&lt;br /&gt;
 % openssl smime -sign -signer server.crt -inkey server.key \&lt;br /&gt;
 -in message.txt -text | mail mailbox@domain.ru&lt;br /&gt;
&lt;br /&gt;
А теперь еще зашифруем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
% openssl smime -encrypt -in message.txt -signer server.crt \&lt;br /&gt;
 -inkey server.key -text | openssl smime -encrypt \&lt;br /&gt;
 -des3 myserver.crt -out mail.msg | mail mailbox@domain.ru&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Чтобы протестировать работу сетевого сервиса, который работает через SSL, выполним:&lt;br /&gt;
&lt;br /&gt;
 % openssl s_client -connect myserver:443&lt;br /&gt;
&lt;br /&gt;
Статья основана на материалах, предоставленных Антоном Карповым [http://www.toxahost.ru/ www.toxahost.ru].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=203</id>
		<title>OpenBSD-Wiki:Текущие события</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=203"/>
		<updated>2013-06-05T14:01:20Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Устаревшее */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Актуальное ==&lt;br /&gt;
Собрано всё, что применимо к текущему релизу.&lt;br /&gt;
&lt;br /&gt;
* [[Введение в OpenBSD]]&lt;br /&gt;
* [[Аппаратное обеспечение и вопросы]]&lt;br /&gt;
* [[Деликатное проникновение в частную сеть]]&lt;br /&gt;
* [[IPsec между OpenBSD и Linux Ubuntu]]&lt;br /&gt;
* [[OpenSSH мини-руководство]]&lt;br /&gt;
* [[OpenSSH: настройки, секреты, трюки и советы]]&lt;br /&gt;
* [[RSA/DSA аутентификация в OpenSSH]]&lt;br /&gt;
* [[Использование файла mk.conf]]&lt;br /&gt;
* [[Написание OpenBSD Loadable Kernel Modules (LKM)]]&lt;br /&gt;
* [[Настройка sendmail]]&lt;br /&gt;
* [[Новое IPSec howto]]&lt;br /&gt;
* [[Русификация OpenBSD 5.x]]&lt;br /&gt;
* [[Русификация OpenBSD]]&lt;br /&gt;
* [[Русификация консоли OpenBSD]]&lt;br /&gt;
* [[Создание загрузочной флешки]]&lt;br /&gt;
* [[Перечень Интернет ресурсов о OpenBSD]]&lt;br /&gt;
* [[Описание переменных sysctl]]&lt;br /&gt;
* [[Сборник советов с OpenBSD101.com]]&lt;br /&gt;
&lt;br /&gt;
=== Переводы ===&lt;br /&gt;
* [[C2k10-marco]]&lt;br /&gt;
* [[C2k10-guenther]]&lt;br /&gt;
* [[C2k10-ajacoutot]]&lt;br /&gt;
* [[C2k10-henning]]&lt;br /&gt;
* [[C2k10-tedu]]&lt;br /&gt;
&lt;br /&gt;
== Устаревшее ==&lt;br /&gt;
Данная информация сохранена для архивных версий.&lt;br /&gt;
&lt;br /&gt;
* [[Зеркалирование данных с помощью ccd]]&lt;br /&gt;
* [[Использование Bluetooth в OpenBSD]]&lt;br /&gt;
* [[Настройка GPRS]]&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
&lt;br /&gt;
* [[Резервная копия Wiki]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%97%D0%B5%D1%80%D0%BA%D0%B0%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_ccd&amp;diff=202</id>
		<title>Зеркалирование данных с помощью ccd</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%97%D0%B5%D1%80%D0%BA%D0%B0%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_ccd&amp;diff=202"/>
		<updated>2013-06-05T13:58:21Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Мини-руководство «шаг за шагом» */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
OpenBSD установлена на sd0. Требуется подключить sd1 и производить автоматическое копирование данных с sd0. Для этих целей будем использовать ccd(4). На разделы ccd(4) следует перенести &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/home&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/var&amp;lt;/span&amp;gt; и &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr&amp;lt;/span&amp;gt;. Перенести корневую файловую систему нельзя, поскольку ядро не поддерживает загрузку с этого типа устройств. Рекомендуется остановить запущенные процессы и при наличии локального доступа к машине выполнять все операции в однопользовательском режиме.&lt;br /&gt;
&lt;br /&gt;
Текущая система:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -h&lt;br /&gt;
Filesystem Size Used Avail Capacity Mounted on&lt;br /&gt;
/dev/sd0a 490M 27.6M 438M 6 % /&lt;br /&gt;
/dev/sd0d 38.4G 4.0M 36.5G 0 % /home&lt;br /&gt;
/dev/sd0e 982M 6.0K 933M 0 % /tmp&lt;br /&gt;
/dev/sd0f 17.5G 821M 15.9G 5 % /usr&lt;br /&gt;
/dev/sd0g 9.6G 7.1M 9.1G 0 % /var&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Уже сейчас можно составить конфиг для создания устройств ccd(4) при загрузке системы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/ccd.conf&lt;br /&gt;
ccd0 16 CCDF_MIRROR /dev/sd0d /dev/sd1d&lt;br /&gt;
ccd1 16 CCDF_MIRROR /dev/sd0g /dev/sd1g&lt;br /&gt;
ccd2 16 CCDF_MIRROR /dev/sd0f /dev/sd1f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предварительно делаем бэкап &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/home&amp;lt;/span&amp;gt; и &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/var&amp;lt;/span&amp;gt; в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/dump&amp;lt;/span&amp;gt;, иначе данные на дисках будут утеряны:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mkdir /usr/dump&lt;br /&gt;
# dump -a -f /usr/dump/var.dump /var&lt;br /&gt;
# dump -a -f /usr/dump/home.dump /home&lt;br /&gt;
# umount -f /var&lt;br /&gt;
# umount -f /home&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После размонтирования необходимо внести соответствующие изменения в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/fstab&amp;lt;/span&amp;gt; (старые записи больше не понадобятся):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/fstab&lt;br /&gt;
/dev/sd0a / ffs rw 1 1&lt;br /&gt;
/dev/ccd1e /home ffs rw, nodev, nosuid 1 2&lt;br /&gt;
/dev/sd0e /tmp ffs rw, nodev, nosuid 1 2&lt;br /&gt;
/dev/ccd2e /usr ffs rw, nodev 1 2&lt;br /&gt;
/dev/ccd0e /var ffs rw, nodev, nosuid 1 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создаем два устройства ccd(4) (для &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/home&amp;lt;/span&amp;gt; и &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/var&amp;lt;/span&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 # ccdconfig ccd0 16 CCDF_MIRROR /dev/sd0d /dev/sd1d&lt;br /&gt;
 # ccdconfig ccd1 16 CCDF_MIRROR /dev/sd0g /dev/sd1g&lt;br /&gt;
&lt;br /&gt;
Для каждого из созданных устройств меняем тип раздела «с» на &amp;lt;tt&amp;gt;unused&amp;lt;/tt&amp;gt; и создаем одну большую партицию «e» с типом 4.2BSD на весь диск:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# disklabel -E ccd0&lt;br /&gt;
&amp;gt; m c&lt;br /&gt;
&amp;gt; [4.2BSD] unused&lt;br /&gt;
&amp;gt; a e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И для ccd1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# disklabel -E ccd1&lt;br /&gt;
&amp;gt; m c&lt;br /&gt;
&amp;gt; [4.2BSD] unused&lt;br /&gt;
&amp;gt; a e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создаем файловые системы:&lt;br /&gt;
&lt;br /&gt;
 # newfs ccd0e&lt;br /&gt;
 # newfs ccd1e&lt;br /&gt;
&lt;br /&gt;
Снова монтируем /&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/var&amp;lt;/span&amp;gt; и &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/home&amp;lt;/span&amp;gt;, но уже как устройства ccd(4). Восстанавливаем данные из резервной копии:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mount /var&lt;br /&gt;
# cd /var &amp;amp;&amp;amp; restore -r -f /usr/dump/var.dump&lt;br /&gt;
# mount /home&lt;br /&gt;
# cd /home &amp;amp;&amp;amp; restore -r -f /usr/dump/home.dump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подготавливаем бэкап &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # mkdir /home/dump&lt;br /&gt;
 # dump -a -f /home/dump/usr.dump /usr&lt;br /&gt;
&lt;br /&gt;
Перегружаемся в &amp;lt;tt&amp;gt;single user mode&amp;lt;/tt&amp;gt; (удаленно размонтировать &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr&amp;lt;/span&amp;gt; нельзя). Делаем с ccd2 то же самое, что делали ранее с ccd0 и ccd1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ccdconfig ccd2 16 CCDF_MIRROR /dev/sd0f /dev/sd1f&lt;br /&gt;
# disklabel -E ccd2&lt;br /&gt;
&amp;gt; m c&lt;br /&gt;
&amp;gt; [4.2BSD] unused&lt;br /&gt;
&amp;gt; a e&lt;br /&gt;
&lt;br /&gt;
# newfs ccd2e&lt;br /&gt;
# mount /usr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создаем ccd0 и монтируем &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/home&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ccdconfig ccd0 16 CCDF_MIRROR /dev/sd0d /dev/sd1d&lt;br /&gt;
 # mount /home&lt;br /&gt;
&lt;br /&gt;
Возвращаем данные на &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # cd /usr &amp;amp;&amp;amp; restore -r -f /home/dump/usr.dump&lt;br /&gt;
&lt;br /&gt;
Перезагружаемся:&lt;br /&gt;
&lt;br /&gt;
 # reboot&lt;br /&gt;
&lt;br /&gt;
В итоге получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -h&lt;br /&gt;
Filesystem Size Used Avail Capacity Mounted on&lt;br /&gt;
/dev/sd0a 490M 27.6M 438M 6 % /&lt;br /&gt;
/dev/ccd1e 38.4G 4.0M 36.5G 0 % /home&lt;br /&gt;
/dev/sd0e 982M 6.0K 933M 0 % /tmp&lt;br /&gt;
/dev/ccd2e 17.5G 815M 15.9G 5 % /usr&lt;br /&gt;
/dev/ccd0e 9.6G 7.1M 9.1G 0 % /var&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья основана на материалах, предоставленных Антоном Карповым [http://www.toxahost.ru/ www.toxahost.ru].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%97%D0%B5%D1%80%D0%BA%D0%B0%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_ccd&amp;diff=201</id>
		<title>Зеркалирование данных с помощью ccd</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%97%D0%B5%D1%80%D0%BA%D0%B0%D0%BB%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5_%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85_%D1%81_%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E_ccd&amp;diff=201"/>
		<updated>2013-06-05T13:56:09Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: Новая страница: «:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]  == Мини-руководство «шаг за шагом» ==  Ope…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Мини-руководство «шаг за шагом» ==&lt;br /&gt;
&lt;br /&gt;
OpenBSD установлена на sd0. Требуется подключить sd1 и производить автоматическое копирование данных с sd0. Для этих целей будем использовать ccd(4). На разделы ccd(4) следует перенести &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/home&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/var&amp;lt;/span&amp;gt; и &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr&amp;lt;/span&amp;gt;. Перенести корневую файловую систему нельзя, поскольку ядро не поддерживает загрузку с этого типа устройств. Рекомендуется остановить запущенные процессы и при наличии локального доступа к машине выполнять все операции в однопользовательском режиме.&lt;br /&gt;
&lt;br /&gt;
Текущая система:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -h&lt;br /&gt;
Filesystem Size Used Avail Capacity Mounted on&lt;br /&gt;
/dev/sd0a 490M 27.6M 438M 6 % /&lt;br /&gt;
/dev/sd0d 38.4G 4.0M 36.5G 0 % /home&lt;br /&gt;
/dev/sd0e 982M 6.0K 933M 0 % /tmp&lt;br /&gt;
/dev/sd0f 17.5G 821M 15.9G 5 % /usr&lt;br /&gt;
/dev/sd0g 9.6G 7.1M 9.1G 0 % /var&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Уже сейчас можно составить конфиг для создания устройств ccd(4) при загрузке системы:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/ccd.conf&lt;br /&gt;
ccd0 16 CCDF_MIRROR /dev/sd0d /dev/sd1d&lt;br /&gt;
ccd1 16 CCDF_MIRROR /dev/sd0g /dev/sd1g&lt;br /&gt;
ccd2 16 CCDF_MIRROR /dev/sd0f /dev/sd1f&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Предварительно делаем бэкап &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/home&amp;lt;/span&amp;gt; и &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/var&amp;lt;/span&amp;gt; в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/dump&amp;lt;/span&amp;gt;, иначе данные на дисках будут утеряны:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mkdir /usr/dump&lt;br /&gt;
# dump -a -f /usr/dump/var.dump /var&lt;br /&gt;
# dump -a -f /usr/dump/home.dump /home&lt;br /&gt;
# umount -f /var&lt;br /&gt;
# umount -f /home&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После размонтирования необходимо внести соответствующие изменения в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/fstab&amp;lt;/span&amp;gt; (старые записи больше не понадобятся):&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# vi /etc/fstab&lt;br /&gt;
/dev/sd0a / ffs rw 1 1&lt;br /&gt;
/dev/ccd1e /home ffs rw, nodev, nosuid 1 2&lt;br /&gt;
/dev/sd0e /tmp ffs rw, nodev, nosuid 1 2&lt;br /&gt;
/dev/ccd2e /usr ffs rw, nodev 1 2&lt;br /&gt;
/dev/ccd0e /var ffs rw, nodev, nosuid 1 2&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создаем два устройства ccd(4) (для &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/home&amp;lt;/span&amp;gt; и &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/var&amp;lt;/span&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 # ccdconfig ccd0 16 CCDF_MIRROR /dev/sd0d /dev/sd1d&lt;br /&gt;
 # ccdconfig ccd1 16 CCDF_MIRROR /dev/sd0g /dev/sd1g&lt;br /&gt;
&lt;br /&gt;
Для каждого из созданных устройств меняем тип раздела «с» на &amp;lt;tt&amp;gt;unused&amp;lt;/tt&amp;gt; и создаем одну большую партицию «e» с типом 4.2BSD на весь диск:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# disklabel -E ccd0&lt;br /&gt;
&amp;gt; m c&lt;br /&gt;
&amp;gt; [4.2BSD] unused&lt;br /&gt;
&amp;gt; a e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
И для ccd1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# disklabel -E ccd1&lt;br /&gt;
&amp;gt; m c&lt;br /&gt;
&amp;gt; [4.2BSD] unused&lt;br /&gt;
&amp;gt; a e&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создаем файловые системы:&lt;br /&gt;
&lt;br /&gt;
 # newfs ccd0e&lt;br /&gt;
 # newfs ccd1e&lt;br /&gt;
&lt;br /&gt;
Снова монтируем /&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/var&amp;lt;/span&amp;gt; и &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/home&amp;lt;/span&amp;gt;, но уже как устройства ccd(4). Восстанавливаем данные из резервной копии:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mount /var&lt;br /&gt;
# cd /var &amp;amp;&amp;amp; restore -r -f /usr/dump/var.dump&lt;br /&gt;
# mount /home&lt;br /&gt;
# cd /home &amp;amp;&amp;amp; restore -r -f /usr/dump/home.dump&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Подготавливаем бэкап /&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # mkdir /home/dump&lt;br /&gt;
 # dump -a -f /home/dump/usr.dump /usr&lt;br /&gt;
&lt;br /&gt;
Перегружаемся в &amp;lt;tt&amp;gt;single user mode&amp;lt;/tt&amp;gt; (удаленно размонтировать /&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr&amp;lt;/span&amp;gt; нельзя). Делаем с ccd2 то же самое, что делали ранее с ccd0 и ccd1:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# ccdconfig ccd2 16 CCDF_MIRROR /dev/sd0f /dev/sd1f&lt;br /&gt;
# disklabel -E ccd2&lt;br /&gt;
&amp;gt; m c&lt;br /&gt;
&amp;gt; [4.2BSD] unused&lt;br /&gt;
&amp;gt; a e&lt;br /&gt;
&lt;br /&gt;
# newfs ccd2e&lt;br /&gt;
# mount /usr&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Создаем ccd0 и монтируем &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/home&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ccdconfig ccd0 16 CCDF_MIRROR /dev/sd0d /dev/sd1d&lt;br /&gt;
 # mount /home&lt;br /&gt;
&lt;br /&gt;
Возвращаем данные на &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # cd /usr &amp;amp;&amp;amp; restore -r -f /home/dump/usr.dump&lt;br /&gt;
&lt;br /&gt;
Перезагружаемся:&lt;br /&gt;
&lt;br /&gt;
 # reboot&lt;br /&gt;
&lt;br /&gt;
В итоге получаем:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# df -h&lt;br /&gt;
Filesystem Size Used Avail Capacity Mounted on&lt;br /&gt;
/dev/sd0a 490M 27.6M 438M 6 % /&lt;br /&gt;
/dev/ccd1e 38.4G 4.0M 36.5G 0 % /home&lt;br /&gt;
/dev/sd0e 982M 6.0K 933M 0 % /tmp&lt;br /&gt;
/dev/ccd2e 17.5G 815M 15.9G 5 % /usr&lt;br /&gt;
/dev/ccd0e 9.6G 7.1M 9.1G 0 % /var&lt;br /&gt;
&amp;lt;/pre&lt;br /&gt;
&lt;br /&gt;
Статья основана на материалах, предоставленных Антоном Карповым [http://www.toxahost.ru/ www.toxahost.ru].&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=200</id>
		<title>Деликатное проникновение в частную сеть</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=200"/>
		<updated>2013-06-05T12:14:36Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Инсталляция на стороне клиента */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Статья [http://www.xakep.ru/magazine/xa/110/156/1.asp опубликована] в февральском номере журнала Хакер за 2008 год. Автор оригинального текста: Andrey Matveev (andrey at openbsd dot ru). &lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Когда речь заходит о необходимости предоставления авторизированному пользователю доступа к защищенным ресурсам частной сети, на ум сразу приходят примеры построения VPN на базе IPSec, PPTP, L2TP и SSL. Однако если требуется в кратчайшие сроки развернуть бесплатное, кроссплатформенное, полнофункциональное ПО с гибкими возможностями конфигурирования и относительно простой установкой, не требующей вмешательства в ядро ОС, то из всех доступных решений выбор невольно падает на OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Поем дифирамбы OpenVPN ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN является реализацией технологии VPN с использованием протокола SSL/TLS. С его помощью можно поднять надежный, достаточно быстрый и в то же время защищенный от прослушивания и вмешательства злоумышленников криптотуннель поверх общедоступной сети, такой, как Интернет. В двух словах схему работы этого приложения можно описать следующим образом: любой сетевой трафик, посылаемый или принимаемый для сетевого адаптера, инкапсулируется в зашифрованный пакет и доставляется в другой конечный пункт туннеля OpenVPN, где данные расшифровываются и попадают в удаленную сеть.&lt;br /&gt;
К числу основных преимуществ применения OpenVPN стоит отнести:&lt;br /&gt;
&lt;br /&gt;
* высокая переносимость между платформами – пакет работает на Windows 2000/XP/2003/Vista, Linux, Free/Net/OpenBSD, Mac OS X и Solaris;&lt;br /&gt;
* поддержка режимов маршрутизации (routed) и моста (bridged), другими словами, нам под силу туннелировать как IP-пакеты, так и Ethernet-фреймы;&lt;br /&gt;
* для транспорта можно использовать UDP/TCP;&lt;br /&gt;
* клиентские хосты могут иметь статические и динамические IP-адреса;&lt;br /&gt;
* туннели можно создавать поверх NAT;&lt;br /&gt;
* работа через межсетевые экраны, в которых реализован контроль состояния соединений (достигается за счет отправки через определенные промежутки времени echo-запросов);&lt;br /&gt;
* ассиметричное шифрование с использованием статических ключей и SSL/TLS сертификатов;&lt;br /&gt;
* встроенные меры безопасности для предотвращения DoS-атак и повторного проигрывания злоумышленником последовательности записанных пакетов;&lt;br /&gt;
* адаптивная компрессия передаваемых данных;&lt;br /&gt;
* способность &amp;quot;проталкивать&amp;quot; маршруты для клиента;&lt;br /&gt;
* использование всех механизмов шифрования, встроенных в библиотеку OpenSSL;&lt;br /&gt;
* работа в chroot-окружении;&lt;br /&gt;
* поддержка мультипоточной библиотеки pthread (положительно влияет на быстродействие при динамическом обмене SSL/TLS ключами). &lt;br /&gt;
&lt;br /&gt;
Как видишь, список возможностей впечатляет, но в отличие от других SSL VPN, достоинством которых считается безклиентская установка (соединение SSL VPN устанавливается через браузер), для OpenVPN необходим специальный клиент (поговорим об этом ниже).&lt;br /&gt;
&lt;br /&gt;
== Увертюра к основному действию ==&lt;br /&gt;
&lt;br /&gt;
Предположим, одним прекрасным солнечным утром твое высокое начальство впечатлилось идеей создания виртуальной частной сети, и теперь перед тобой стоит задача поднять VPN-сервер для служащих, которым требуется работать с корпоративными ресурсами, находясь вне стен офиса (это могут быть надомные, командировочные сотрудники или просто фрилансеры).&lt;br /&gt;
Функции шлюза компании, выпускающего сотрудников в Интернет, выполняет компьютер с тремя сетевыми картами (213.167.XX.YY, 192.168.1.1, 192.168.2.1) под управлением… хотя это не так важно, настройки в поддерживаемых операционках будут отличаться минимально. В моем случае на сервере заказчика была установлена OpenBSD 3.9. Что касается корпоративной внутренней сети, то она состоит из двух участков: проводного (192.168.1.0/24) и беспроводного (192.168.2.0/24). После рекогносцировки на местности переходим к установке OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Серверная инсталляция ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN без труда можно найти в любом репозитарии или дереве портов:&lt;br /&gt;
&lt;br /&gt;
 # cd /usr/ports/net/openvpn&lt;br /&gt;
 # make install clean&lt;br /&gt;
&lt;br /&gt;
В случае установки из исходных кодов в некоторых системах может понадобиться отключить поддержку реализации потоков выполнения и указать местоположение библиотек и заголовочных файлов &amp;lt;tt&amp;gt;lzo&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ./configure --disable-pthread --with-lzo-lib=/usr/local/lib \&lt;br /&gt;
 --with-lzoheaders=/usr/local/include&lt;br /&gt;
 # make&lt;br /&gt;
 # make install&lt;br /&gt;
&lt;br /&gt;
Для проверки с помощью следующих команд можно посмотреть, какие дайджесты (применяются для аутентификации каждой получаемой UDP-датаграммы) и алгоритмы шифрования доступны:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-digests&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-ciphers&lt;br /&gt;
&lt;br /&gt;
Чтобы обеспечить дополнительный уровень защиты и избежать возможный ущерб при взломе, нужно дать указание демону OpenVPN работать с правами непривилегированного пользователя в chroot’ной среде — среде с измененным корневым каталогом. Первый шаг для этого — добавить в систему группу &amp;lt;tt&amp;gt;_openvpn&amp;lt;/tt&amp;gt; и одноименного пользователя:&lt;br /&gt;
&lt;br /&gt;
 # groupadd -g 500 _openvpn&lt;br /&gt;
 # useradd -u 500 -g 500 -c &amp;#039;OpenVPN Server&amp;#039; -s /sbin/nologin \&lt;br /&gt;
 -d /var/openvpn -m _openvpn&lt;br /&gt;
&lt;br /&gt;
Проверяем правильность выполнения двух последних команд:&lt;br /&gt;
&lt;br /&gt;
 # grep 500 /etc/passwd&lt;br /&gt;
 _openvpn:*:500:500:OpenVPN Server:/var/openvpn:/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
== Золотые ключики и подарочные сертификаты ==&lt;br /&gt;
&lt;br /&gt;
Думаю, ни для кого не секрет, что сертификаты открытых ключей предоставляют удобный и надежный способ аутентификации пользователей, поэтому не будем сейчас тратить время на теоретическую часть и перейдем непосредственно к процедуре генерирования надлежащих сертификатов.&lt;br /&gt;
Создаем директорию, где будут лежать конфигурационные файлы, скрипты и сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/openvpn/keys&lt;br /&gt;
&lt;br /&gt;
Копируем комплект скриптов easy-rsa, предназначенный для упрощения создания сертификатов, которые предъявляются в процессе аутентификации для подтверждения валидности клиентов. Теперь о монстроидальных командах &amp;lt;tt&amp;gt;openssl&amp;lt;/tt&amp;gt; можно забыть.&lt;br /&gt;
&lt;br /&gt;
 # cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Далее следует экспортировать переменные KEY_*, они необходимы для работы build-* скриптов:&lt;br /&gt;
&lt;br /&gt;
 # cd /etc/openvpn/easy-rsa&lt;br /&gt;
 # . ./vars&lt;br /&gt;
&lt;br /&gt;
Инициализируем директорию /etc/openvpn/easy-rsa/keys:&lt;br /&gt;
&lt;br /&gt;
 # ./clean-all&lt;br /&gt;
&lt;br /&gt;
Создаем корневой и серверный сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # ./build-ca&lt;br /&gt;
 # ./build-key-server server&lt;br /&gt;
&lt;br /&gt;
Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, выполняем:&lt;br /&gt;
 &lt;br /&gt;
 # ./build-dh&lt;br /&gt;
&lt;br /&gt;
Снизить вероятность успешного проведения DoS-атаки на сервер OpenVPN можно за счет использования клиентом и сервером статического ключа HMAC (так называемый &amp;lt;tt&amp;gt;shared secret&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --genkey --secret keys/ta.key&lt;br /&gt;
&lt;br /&gt;
Перемещаем все созданные файлы в подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;keys&amp;lt;/span&amp;gt; и выставляем для них корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # cd keys/&lt;br /&gt;
 # mv ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys&lt;br /&gt;
 # chown -R root:wheel /etc/openvpn&lt;br /&gt;
 # chmod 700 /etc/openvpn/keys&lt;br /&gt;
 # chmod 644 /etc/openvpn/keys/{ca.crt,dh1024.pem,server.crt}&lt;br /&gt;
 # chmod 600 /etc/openvpn/keys/{server.key,ta.key}&lt;br /&gt;
&lt;br /&gt;
Процедура создания клиентских сертификатов практически аналогична соответствующей процедуре для сервера:&lt;br /&gt;
&lt;br /&gt;
 # ./build-key client1&lt;br /&gt;
 # mkdir -p /home/vpn/client1&lt;br /&gt;
 # mv client1.crt client1.key /home/vpn/client1&lt;br /&gt;
 # cp /etc/openvpn/keys/{ca.crt,ta.key} /home/vpn/client1&lt;br /&gt;
&lt;br /&gt;
Теперь подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client1&amp;lt;/span&amp;gt; следует перенести на винч или флешку «географически изолированного» сотрудника.&lt;br /&gt;
&lt;br /&gt;
== Щепетильное конфигурирование ==&lt;br /&gt;
&lt;br /&gt;
Конфигурация сервера OpenVPN хранится в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/openvpn/server.conf&amp;lt;/span&amp;gt;. Ниже приведен пример подобного конфига. Все опции детально прокомментированы, поэтому сложностей возникнуть не должно. При настройке старайся «не срезать углы» — за один шаг добавляй/изменяй что-то одно и сразу же тестируй. Все действия в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;server.conf&amp;lt;/span&amp;gt; желательно фиксировать в локальном cvs-репозитории, чтобы можно было быстро просмотреть историю изменений и вернуться к рабочей ревизии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/openvpn/server.conf&lt;br /&gt;
 ; Работаем в режиме демона&lt;br /&gt;
 daemon openvpn&lt;br /&gt;
 ; Указываем местоположение файла с уникальным идентификатором процесса сервера&lt;br /&gt;
 ; OpenVPN&lt;br /&gt;
 writepid /var/openvpn/pid&lt;br /&gt;
 ; Определяем файл, содержащий список текущих клиентских соединений&lt;br /&gt;
 status /var/openvpn/status 10&lt;br /&gt;
 ; Внешний IP-адрес нашего сервера&lt;br /&gt;
 local 213.167.XX.YY&lt;br /&gt;
 ; Используемый порт&lt;br /&gt;
 port 1194&lt;br /&gt;
 ; Для транспорта по умолчанию применяется протокол UDP. Это вполне резонный&lt;br /&gt;
 ; подход. Во-первых, благодаря меньшему размеру заголовков и отсутствию&lt;br /&gt;
 ; встроенной функции подтверждения доставки пакетов, производительность UDP&lt;br /&gt;
 ; значительно выше. А во-вторых, при использовании UDP общая надежность не&lt;br /&gt;
 ; снижается, так как OpenVPN шифрует исходные пакеты, обеспечивая проверку&lt;br /&gt;
 ; ошибок и повторную передачу. В связи с этим TCP рекомендуется применять&lt;br /&gt;
 ; только в тех случаях, когда UDP не работает, например, если брандмауэр&lt;br /&gt;
 ; блокирует весь UDP-трафик.&lt;br /&gt;
 proto udp&lt;br /&gt;
 ; Выбираем тип виртуального устройства туннеля (tun, tap или null)&lt;br /&gt;
 dev tun0&lt;br /&gt;
 ; Включаем компрессию передаваемых данных&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 ; Указываем абсолютные пути к созданным сертификатам и ключам&lt;br /&gt;
 ca /etc/openvpn/keys/ca.crt&lt;br /&gt;
 cert /etc/openvpn/keys/server.crt&lt;br /&gt;
 key /etc/openvpn/keys/server.key&lt;br /&gt;
 dh /etc/openvpn/keys/dh1024.pem&lt;br /&gt;
 ; Значение 0 следует использовать на сервере, 1 - на клиенте&lt;br /&gt;
 tls-auth /etc/openvpn/keys/ta.key 0&lt;br /&gt;
 ; Для большинства сетей подойдет режим маршрутизатора (routed). Да, в этом&lt;br /&gt;
 ; случае широковещательный трафик отсутствует, соответственно, не будут работать&lt;br /&gt;
 ; некоторые протоколы, которые его используют, например NetBIOS поверх TCP. Но&lt;br /&gt;
 ; последнее нивелируется развертыванием WINS-сервера, либо подключением сетевых&lt;br /&gt;
 ; дисков/созданием ярлыков на расшаренные ресурсы&lt;br /&gt;
 server 192.168.3.0 255.255.255.0&lt;br /&gt;
 ; Проталкиваем подключенным клиентам статические маршруты, чтобы они могли&lt;br /&gt;
 ; получить доступ к ресурсам проводной и беспроводной сети&lt;br /&gt;
 push &amp;quot;route 192.168.1.0 255.255.255.0&amp;quot;&lt;br /&gt;
 push &amp;quot;route 192.168.2.0 255.255.255.0&amp;quot;&lt;br /&gt;
 ; Не позволяем соединению разорваться при простое&lt;br /&gt;
 keepalive 10 120&lt;br /&gt;
 ; Алгоритмы, используемые для аутентификации и шифрования пакетов&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Максимальное число одновременно подключенных VPN-пользователей&lt;br /&gt;
 max-clients 10&lt;br /&gt;
 ; Задаем файл журналирования событий и уровень детализации журнала, отображаем&lt;br /&gt;
 ; не более 20 экземпляров одного сообщения (остальные отбрасываем)&lt;br /&gt;
 log-append /var/log/openvpn.log&lt;br /&gt;
 verb 3&lt;br /&gt;
 mute 20&lt;br /&gt;
 ; Пользователь и группа, с правами которых работает демон&lt;br /&gt;
 user _openvpn&lt;br /&gt;
 group _openvpn&lt;br /&gt;
 ; Эти опции предотвращают доступ к некоторым ресурсам (например,&lt;br /&gt;
 ; tun-устройству) при перезапуске демона (рекомендуется применять только при&lt;br /&gt;
 ; снижении привилегий)&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 ; Сажаем демона в chroot-окружение&lt;br /&gt;
 chroot /var/empty&lt;br /&gt;
&lt;br /&gt;
Чтобы не вбивать директивы вручную, можно воспользоваться примером конфига, любезно предоставленным разработчиками:&lt;br /&gt;
 &lt;br /&gt;
 # cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Поднимаем виртуальный интерфейс &amp;lt;tt&amp;gt;tun0&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # echo &amp;quot;up&amp;quot; &amp;gt; /etc/hostname.tun0&lt;br /&gt;
 # sh /etc/netstart tun0&lt;br /&gt;
&lt;br /&gt;
Запускаем сервер OpenVPN командой:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
&lt;br /&gt;
Для автоматической загрузки OpenVPN достаточно прописать эту строчку в стартовый сценарий &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt;, например, так:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.local&lt;br /&gt;
 if [ -x /usr/local/sbin/openvpn ]; then&lt;br /&gt;
    echo -n &amp;#039; openvpn&amp;#039;; /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Далее смотрим в логи, чтобы убедиться в успешной загрузке нашего демона:&lt;br /&gt;
&lt;br /&gt;
 # tail /var/log/openvpn.log&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 IFCONFIG POOL: base=192.168.3.4 size=62&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 Initialization Sequence Completed&lt;br /&gt;
&lt;br /&gt;
Чтобы проверить состояние псевдоустройства туннелирования, можно воспользоваться утилитой &amp;lt;tt&amp;gt;ifconfig&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig tun0&lt;br /&gt;
 tun0: flags=8051&amp;lt;UP,POINTOPOINT,RUNNING,MULTICAST&amp;gt; mtu 1500&lt;br /&gt;
 groups: tun&lt;br /&gt;
 inet 192.168.3.1 --&amp;gt; 192.168.3.2 netmask 0xffffffff&lt;br /&gt;
&lt;br /&gt;
Для корректной работы сервера OpenVPN необходимо разрешить прохождение любого трафика через интерфейс OpenVPN, а также входящие подключения на внешний адрес сервера порт &amp;lt;tt&amp;gt;1194/udp&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 pass quick on { lo tun0 $int_if } inet&lt;br /&gt;
 pass in on $ext_if inet proto udp from any to $ext_if port 1194 \&lt;br /&gt;
 keep state&lt;br /&gt;
&lt;br /&gt;
Перезагружаем набор рулесетов файервола:&lt;br /&gt;
&lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
== Инсталляция на стороне клиента ==&lt;br /&gt;
&lt;br /&gt;
Итак, VPN-сервер работает и готов принимать подключения. Развертывание VPN-клиентов для VPN-подключений удаленного доступа состоит из двух действий: установка программы [http://openvpn.se/files/install_packages/openvpn-2.0.9-gui-1.0.3-install.exe OpenVPN GUI] и правка конфигурационного файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client*.ovpn&amp;lt;/span&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 C:\Program Files\OpenVPN\config\mycompany_client1.ovpn&lt;br /&gt;
 ; Работаем в режиме клиента&lt;br /&gt;
 client&lt;br /&gt;
 dev tun&lt;br /&gt;
 ; Указываем IP-адрес и порт VPN-сервера&lt;br /&gt;
 remote 213.167.XX.YY 1194&lt;br /&gt;
 proto udp&lt;br /&gt;
 resolv-retry infinite&lt;br /&gt;
 nobind&lt;br /&gt;
 pull&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 verb 3&lt;br /&gt;
 ; Я предпочитаю хранить crt и key файлы на флешке&lt;br /&gt;
 ca &amp;quot;f:\\vpn\\mycompany\\ca.crt&amp;quot;&lt;br /&gt;
 cert &amp;quot;f:\\vpn\\mycompany\\client1.crt&amp;quot;&lt;br /&gt;
 key &amp;quot;f:\\vpn\\mycompany\\client1.key&amp;quot;&lt;br /&gt;
 tls-auth &amp;quot;f:\\vpn\\mycompany\\ta.key&amp;quot; 1&lt;br /&gt;
 ns-cert-type server&lt;br /&gt;
 ; Нижеследующие алгоритмы должны совпадать с теми, что заданы на сервере&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Без этих двух директив Vista-клиенты не смогут получать маршруты от сервера&lt;br /&gt;
 ; route-method exe&lt;br /&gt;
 ; route-delay 2&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения к VPN-серверу достаточно в трее щелкнуть правой кнопкой мыши на значке с красными мониторчиками, выбрать конфиг &amp;lt;tt&amp;gt;mycompany_client1&amp;lt;/tt&amp;gt; и нажать Connect.&lt;br /&gt;
&lt;br /&gt;
== Аутентификационный шлюз на базе pf и authpf ==&lt;br /&gt;
&lt;br /&gt;
В BSD-системах, используя связку пакетного фильтра pf и авторизационного шелла authpf, можно контролировать доступ клиентов, подключающихся к VPN-службе и корпоративной сети. Схема работы такой конструкции довольно проста: пользователь логинится по ssh, и, в зависимости от введенных данных (имя и пароль), на сервере вступают в силу персональные правила файервола, в данном случае разрешающие прохождение UDP-пакетов к порту 1194.&lt;br /&gt;
Но прежде, чем производить настройку &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, необходимо переопределить некоторые дефолтные значения переменных демона [http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html sshd(8)]. Так мы усложним потенциальному злоумышленнику успешное проведение атаки с целью перехвата и подмены ssh-сессии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/ssh/sshd_config&lt;br /&gt;
 # Работаем с использованием протоколов IPv4 и ssh2&lt;br /&gt;
 AddressFamily inet&lt;br /&gt;
 Protocol 2&lt;br /&gt;
 # Ожидаем подключения по всем доступным сетевым интерфейсам&lt;br /&gt;
 ListenAddress 0.0.0.0&lt;br /&gt;
 # Запрещаем регистрацию root&amp;#039;а и применение пустых паролей&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 PermitEmptyPasswords no&lt;br /&gt;
 # За счет использования протокола ssh2 и этих двух опций усложняем проведение&lt;br /&gt;
 # атак типа ARP- и IP-spoofing&lt;br /&gt;
 ClientAliveInterval 15&lt;br /&gt;
 ClientAliveCountMax 3&lt;br /&gt;
 # Отключаем DNS-резолвинг&lt;br /&gt;
 UseDNS no&lt;br /&gt;
 # Определяем списки контроля доступом&lt;br /&gt;
 AllowGroups wheel users authpf&lt;br /&gt;
&lt;br /&gt;
Для того чтобы внесенные изменения вступили в силу, необходимо дать указание демону перечитать свой конфиг:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `sed q /var/run/sshd.pid`&lt;br /&gt;
&lt;br /&gt;
Authpf представляет собой псевдооболочку, которая назначается пользователю системы в качестве &amp;lt;tt&amp;gt;login shell&amp;lt;/tt&amp;gt; (примечание: запись «&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/sbin/authpf&amp;lt;/span&amp;gt;» в файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/shells&amp;lt;/span&amp;gt; добавлять не следует). При авторизации пользователя по ssh к текущим правилам фильтра пакетов с помощью так называемых якорей &amp;lt;tt&amp;gt;(anchors)&amp;lt;/tt&amp;gt; будут присоединены правила, указанные в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/authpf.rules&amp;lt;/span&amp;gt;, либо в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/users/$USER&amp;lt;/span&amp;gt;. В добавляемых правилах допускается использование зарезервированных макросов &amp;lt;tt&amp;gt;$user_id&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;$user_ip&amp;lt;/tt&amp;gt;, за счет которых будет происходить автоматическая подстановка имени и IP-адреса подключившегося пользователя (значения макросов считываются из переменных окружения ssh автоматически).&lt;br /&gt;
В конец файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;[http://www.openbsd.org/cgi-bin/man.cgi?query=login.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html login.conf(5)]&amp;lt;/span&amp;gt; заносим сведения о новом классе &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, пользователи которого в качестве стандартного шелла будут получать authpf:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/login.conf&lt;br /&gt;
 authpf:\&lt;br /&gt;
   :shell=/usr/sbin/authpf:\&lt;br /&gt;
   :tc=default:&lt;br /&gt;
&lt;br /&gt;
С помощью штатной утилиты [http://www.openbsd.org/cgi-bin/man.cgi?query=cap_mkdb&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html cap_mkdb(1)] обновляем хэшированную базу данных &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/login.conf.db&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # cap_mkdb /etc/login.conf&lt;br /&gt;
&lt;br /&gt;
Мы не будем переопределять умолчальные значения директив &amp;lt;tt&amp;gt;anchor&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;table&amp;lt;/tt&amp;gt;, поэтому файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;authpf.conf&amp;lt;/span&amp;gt; оставляем пустым:&lt;br /&gt;
&lt;br /&gt;
 # echo -n &amp;gt; /etc/authpf/authpf.conf&lt;br /&gt;
&lt;br /&gt;
Подготавливаем приветственное сообщение authpf.message (аналог /etc/motd):&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/authpf.message&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
Создаем нового пользователя, который принадлежит классу authpf, входит в группу authpf и в качестве оболочки получает /usr/sbin/authpf:&lt;br /&gt;
&lt;br /&gt;
 # useradd -m -c &amp;#039;authpf vpn user&amp;#039; -g authpf -L authpf \&lt;br /&gt;
 -s /usr/sbin/authpf client1&lt;br /&gt;
 # passwd client1&lt;br /&gt;
&lt;br /&gt;
Рисуем правило файервола, разрешающее пользователю client1 доступ к серверу OpenVPN:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/authpf/users/client1&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/users/client1/authpf.rules&lt;br /&gt;
 pass in log quick on fxp0 inet proto udp from $user_ip to fxp0 \&lt;br /&gt;
 port 1194 keep state&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения механизма якорей добавим следующие записи в [http://www.openbsd.org/cgi-bin/man.cgi?query=pf.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html pf.conf(5)]:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 nat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 rdr-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 binat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 pass in log on $ext_if inet proto tcp to fxp0 port ssh keep state&lt;br /&gt;
 ...&lt;br /&gt;
 anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
И перезагрузим набор рулесетов файервола:&lt;br /&gt;
 &lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
На стороне клиента открываем любой ssh-клиент, например, Putty или SecureCRT, создаем новую сессию, указываем IP-адрес сервера и имя пользователя. Если все настроено правильно, после успешной авторизации правила файервола на сервере для этого пользователя изменятся, и он получит доступ к VPN-службе.&lt;br /&gt;
&lt;br /&gt;
 # f:\vpn\putty&amp;gt; plink.exe -pw mypassword client1@213.167.XX.YY&lt;br /&gt;
 Hello client1. You are authenticated from host &amp;quot;77.41.XX.YY&amp;quot;&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
А чтобы постоянно не вводить пароль, можно настроить аутентификацию на базе публичного ключа.&lt;br /&gt;
&lt;br /&gt;
== Эндшпиль ==&lt;br /&gt;
&lt;br /&gt;
Эта статья включает полный набор пошаговых действий, необходимых для внедрения базового VPN-решения удаленного доступа, используя BSD-систему в качестве VPN-сервера и WinXP/Vista в качестве VPN-клиента. Развернув в 3-4 компаниях подобную конфигурацию, ты сможешь не с пустыми кредиткой и кошельком ехать в Египет греть пятки. Удачи.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=199</id>
		<title>OpenBSD-Wiki:Текущие события</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=199"/>
		<updated>2013-06-05T12:09:52Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Актуальное */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Актуальное ==&lt;br /&gt;
Собрано всё, что применимо к текущему релизу.&lt;br /&gt;
&lt;br /&gt;
* [[Введение в OpenBSD]]&lt;br /&gt;
* [[Аппаратное обеспечение и вопросы]]&lt;br /&gt;
* [[Деликатное проникновение в частную сеть]]&lt;br /&gt;
* [[IPsec между OpenBSD и Linux Ubuntu]]&lt;br /&gt;
* [[OpenSSH мини-руководство]]&lt;br /&gt;
* [[OpenSSH: настройки, секреты, трюки и советы]]&lt;br /&gt;
* [[RSA/DSA аутентификация в OpenSSH]]&lt;br /&gt;
* [[Использование файла mk.conf]]&lt;br /&gt;
* [[Написание OpenBSD Loadable Kernel Modules (LKM)]]&lt;br /&gt;
* [[Настройка sendmail]]&lt;br /&gt;
* [[Новое IPSec howto]]&lt;br /&gt;
* [[Русификация OpenBSD 5.x]]&lt;br /&gt;
* [[Русификация OpenBSD]]&lt;br /&gt;
* [[Русификация консоли OpenBSD]]&lt;br /&gt;
* [[Создание загрузочной флешки]]&lt;br /&gt;
* [[Перечень Интернет ресурсов о OpenBSD]]&lt;br /&gt;
* [[Описание переменных sysctl]]&lt;br /&gt;
* [[Сборник советов с OpenBSD101.com]]&lt;br /&gt;
&lt;br /&gt;
=== Переводы ===&lt;br /&gt;
* [[C2k10-marco]]&lt;br /&gt;
* [[C2k10-guenther]]&lt;br /&gt;
* [[C2k10-ajacoutot]]&lt;br /&gt;
* [[C2k10-henning]]&lt;br /&gt;
* [[C2k10-tedu]]&lt;br /&gt;
&lt;br /&gt;
== Устаревшее ==&lt;br /&gt;
Данная информация сохранена для архивных версий.&lt;br /&gt;
&lt;br /&gt;
* [[Использование Bluetooth в OpenBSD]]&lt;br /&gt;
* [[Настройка GPRS]]&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
&lt;br /&gt;
* [[Резервная копия Wiki]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=198</id>
		<title>Деликатное проникновение в частную сеть</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=198"/>
		<updated>2013-06-05T12:06:55Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Щепетильное конфигурирование */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Статья [http://www.xakep.ru/magazine/xa/110/156/1.asp опубликована] в февральском номере журнала Хакер за 2008 год. Автор оригинального текста: Andrey Matveev (andrey at openbsd dot ru). &lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Когда речь заходит о необходимости предоставления авторизированному пользователю доступа к защищенным ресурсам частной сети, на ум сразу приходят примеры построения VPN на базе IPSec, PPTP, L2TP и SSL. Однако если требуется в кратчайшие сроки развернуть бесплатное, кроссплатформенное, полнофункциональное ПО с гибкими возможностями конфигурирования и относительно простой установкой, не требующей вмешательства в ядро ОС, то из всех доступных решений выбор невольно падает на OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Поем дифирамбы OpenVPN ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN является реализацией технологии VPN с использованием протокола SSL/TLS. С его помощью можно поднять надежный, достаточно быстрый и в то же время защищенный от прослушивания и вмешательства злоумышленников криптотуннель поверх общедоступной сети, такой, как Интернет. В двух словах схему работы этого приложения можно описать следующим образом: любой сетевой трафик, посылаемый или принимаемый для сетевого адаптера, инкапсулируется в зашифрованный пакет и доставляется в другой конечный пункт туннеля OpenVPN, где данные расшифровываются и попадают в удаленную сеть.&lt;br /&gt;
К числу основных преимуществ применения OpenVPN стоит отнести:&lt;br /&gt;
&lt;br /&gt;
* высокая переносимость между платформами – пакет работает на Windows 2000/XP/2003/Vista, Linux, Free/Net/OpenBSD, Mac OS X и Solaris;&lt;br /&gt;
* поддержка режимов маршрутизации (routed) и моста (bridged), другими словами, нам под силу туннелировать как IP-пакеты, так и Ethernet-фреймы;&lt;br /&gt;
* для транспорта можно использовать UDP/TCP;&lt;br /&gt;
* клиентские хосты могут иметь статические и динамические IP-адреса;&lt;br /&gt;
* туннели можно создавать поверх NAT;&lt;br /&gt;
* работа через межсетевые экраны, в которых реализован контроль состояния соединений (достигается за счет отправки через определенные промежутки времени echo-запросов);&lt;br /&gt;
* ассиметричное шифрование с использованием статических ключей и SSL/TLS сертификатов;&lt;br /&gt;
* встроенные меры безопасности для предотвращения DoS-атак и повторного проигрывания злоумышленником последовательности записанных пакетов;&lt;br /&gt;
* адаптивная компрессия передаваемых данных;&lt;br /&gt;
* способность &amp;quot;проталкивать&amp;quot; маршруты для клиента;&lt;br /&gt;
* использование всех механизмов шифрования, встроенных в библиотеку OpenSSL;&lt;br /&gt;
* работа в chroot-окружении;&lt;br /&gt;
* поддержка мультипоточной библиотеки pthread (положительно влияет на быстродействие при динамическом обмене SSL/TLS ключами). &lt;br /&gt;
&lt;br /&gt;
Как видишь, список возможностей впечатляет, но в отличие от других SSL VPN, достоинством которых считается безклиентская установка (соединение SSL VPN устанавливается через браузер), для OpenVPN необходим специальный клиент (поговорим об этом ниже).&lt;br /&gt;
&lt;br /&gt;
== Увертюра к основному действию ==&lt;br /&gt;
&lt;br /&gt;
Предположим, одним прекрасным солнечным утром твое высокое начальство впечатлилось идеей создания виртуальной частной сети, и теперь перед тобой стоит задача поднять VPN-сервер для служащих, которым требуется работать с корпоративными ресурсами, находясь вне стен офиса (это могут быть надомные, командировочные сотрудники или просто фрилансеры).&lt;br /&gt;
Функции шлюза компании, выпускающего сотрудников в Интернет, выполняет компьютер с тремя сетевыми картами (213.167.XX.YY, 192.168.1.1, 192.168.2.1) под управлением… хотя это не так важно, настройки в поддерживаемых операционках будут отличаться минимально. В моем случае на сервере заказчика была установлена OpenBSD 3.9. Что касается корпоративной внутренней сети, то она состоит из двух участков: проводного (192.168.1.0/24) и беспроводного (192.168.2.0/24). После рекогносцировки на местности переходим к установке OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Серверная инсталляция ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN без труда можно найти в любом репозитарии или дереве портов:&lt;br /&gt;
&lt;br /&gt;
 # cd /usr/ports/net/openvpn&lt;br /&gt;
 # make install clean&lt;br /&gt;
&lt;br /&gt;
В случае установки из исходных кодов в некоторых системах может понадобиться отключить поддержку реализации потоков выполнения и указать местоположение библиотек и заголовочных файлов &amp;lt;tt&amp;gt;lzo&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ./configure --disable-pthread --with-lzo-lib=/usr/local/lib \&lt;br /&gt;
 --with-lzoheaders=/usr/local/include&lt;br /&gt;
 # make&lt;br /&gt;
 # make install&lt;br /&gt;
&lt;br /&gt;
Для проверки с помощью следующих команд можно посмотреть, какие дайджесты (применяются для аутентификации каждой получаемой UDP-датаграммы) и алгоритмы шифрования доступны:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-digests&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-ciphers&lt;br /&gt;
&lt;br /&gt;
Чтобы обеспечить дополнительный уровень защиты и избежать возможный ущерб при взломе, нужно дать указание демону OpenVPN работать с правами непривилегированного пользователя в chroot’ной среде — среде с измененным корневым каталогом. Первый шаг для этого — добавить в систему группу &amp;lt;tt&amp;gt;_openvpn&amp;lt;/tt&amp;gt; и одноименного пользователя:&lt;br /&gt;
&lt;br /&gt;
 # groupadd -g 500 _openvpn&lt;br /&gt;
 # useradd -u 500 -g 500 -c &amp;#039;OpenVPN Server&amp;#039; -s /sbin/nologin \&lt;br /&gt;
 -d /var/openvpn -m _openvpn&lt;br /&gt;
&lt;br /&gt;
Проверяем правильность выполнения двух последних команд:&lt;br /&gt;
&lt;br /&gt;
 # grep 500 /etc/passwd&lt;br /&gt;
 _openvpn:*:500:500:OpenVPN Server:/var/openvpn:/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
== Золотые ключики и подарочные сертификаты ==&lt;br /&gt;
&lt;br /&gt;
Думаю, ни для кого не секрет, что сертификаты открытых ключей предоставляют удобный и надежный способ аутентификации пользователей, поэтому не будем сейчас тратить время на теоретическую часть и перейдем непосредственно к процедуре генерирования надлежащих сертификатов.&lt;br /&gt;
Создаем директорию, где будут лежать конфигурационные файлы, скрипты и сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/openvpn/keys&lt;br /&gt;
&lt;br /&gt;
Копируем комплект скриптов easy-rsa, предназначенный для упрощения создания сертификатов, которые предъявляются в процессе аутентификации для подтверждения валидности клиентов. Теперь о монстроидальных командах &amp;lt;tt&amp;gt;openssl&amp;lt;/tt&amp;gt; можно забыть.&lt;br /&gt;
&lt;br /&gt;
 # cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Далее следует экспортировать переменные KEY_*, они необходимы для работы build-* скриптов:&lt;br /&gt;
&lt;br /&gt;
 # cd /etc/openvpn/easy-rsa&lt;br /&gt;
 # . ./vars&lt;br /&gt;
&lt;br /&gt;
Инициализируем директорию /etc/openvpn/easy-rsa/keys:&lt;br /&gt;
&lt;br /&gt;
 # ./clean-all&lt;br /&gt;
&lt;br /&gt;
Создаем корневой и серверный сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # ./build-ca&lt;br /&gt;
 # ./build-key-server server&lt;br /&gt;
&lt;br /&gt;
Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, выполняем:&lt;br /&gt;
 &lt;br /&gt;
 # ./build-dh&lt;br /&gt;
&lt;br /&gt;
Снизить вероятность успешного проведения DoS-атаки на сервер OpenVPN можно за счет использования клиентом и сервером статического ключа HMAC (так называемый &amp;lt;tt&amp;gt;shared secret&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --genkey --secret keys/ta.key&lt;br /&gt;
&lt;br /&gt;
Перемещаем все созданные файлы в подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;keys&amp;lt;/span&amp;gt; и выставляем для них корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # cd keys/&lt;br /&gt;
 # mv ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys&lt;br /&gt;
 # chown -R root:wheel /etc/openvpn&lt;br /&gt;
 # chmod 700 /etc/openvpn/keys&lt;br /&gt;
 # chmod 644 /etc/openvpn/keys/{ca.crt,dh1024.pem,server.crt}&lt;br /&gt;
 # chmod 600 /etc/openvpn/keys/{server.key,ta.key}&lt;br /&gt;
&lt;br /&gt;
Процедура создания клиентских сертификатов практически аналогична соответствующей процедуре для сервера:&lt;br /&gt;
&lt;br /&gt;
 # ./build-key client1&lt;br /&gt;
 # mkdir -p /home/vpn/client1&lt;br /&gt;
 # mv client1.crt client1.key /home/vpn/client1&lt;br /&gt;
 # cp /etc/openvpn/keys/{ca.crt,ta.key} /home/vpn/client1&lt;br /&gt;
&lt;br /&gt;
Теперь подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client1&amp;lt;/span&amp;gt; следует перенести на винч или флешку «географически изолированного» сотрудника.&lt;br /&gt;
&lt;br /&gt;
== Щепетильное конфигурирование ==&lt;br /&gt;
&lt;br /&gt;
Конфигурация сервера OpenVPN хранится в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/openvpn/server.conf&amp;lt;/span&amp;gt;. Ниже приведен пример подобного конфига. Все опции детально прокомментированы, поэтому сложностей возникнуть не должно. При настройке старайся «не срезать углы» — за один шаг добавляй/изменяй что-то одно и сразу же тестируй. Все действия в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;server.conf&amp;lt;/span&amp;gt; желательно фиксировать в локальном cvs-репозитории, чтобы можно было быстро просмотреть историю изменений и вернуться к рабочей ревизии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/openvpn/server.conf&lt;br /&gt;
 ; Работаем в режиме демона&lt;br /&gt;
 daemon openvpn&lt;br /&gt;
 ; Указываем местоположение файла с уникальным идентификатором процесса сервера&lt;br /&gt;
 ; OpenVPN&lt;br /&gt;
 writepid /var/openvpn/pid&lt;br /&gt;
 ; Определяем файл, содержащий список текущих клиентских соединений&lt;br /&gt;
 status /var/openvpn/status 10&lt;br /&gt;
 ; Внешний IP-адрес нашего сервера&lt;br /&gt;
 local 213.167.XX.YY&lt;br /&gt;
 ; Используемый порт&lt;br /&gt;
 port 1194&lt;br /&gt;
 ; Для транспорта по умолчанию применяется протокол UDP. Это вполне резонный&lt;br /&gt;
 ; подход. Во-первых, благодаря меньшему размеру заголовков и отсутствию&lt;br /&gt;
 ; встроенной функции подтверждения доставки пакетов, производительность UDP&lt;br /&gt;
 ; значительно выше. А во-вторых, при использовании UDP общая надежность не&lt;br /&gt;
 ; снижается, так как OpenVPN шифрует исходные пакеты, обеспечивая проверку&lt;br /&gt;
 ; ошибок и повторную передачу. В связи с этим TCP рекомендуется применять&lt;br /&gt;
 ; только в тех случаях, когда UDP не работает, например, если брандмауэр&lt;br /&gt;
 ; блокирует весь UDP-трафик.&lt;br /&gt;
 proto udp&lt;br /&gt;
 ; Выбираем тип виртуального устройства туннеля (tun, tap или null)&lt;br /&gt;
 dev tun0&lt;br /&gt;
 ; Включаем компрессию передаваемых данных&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 ; Указываем абсолютные пути к созданным сертификатам и ключам&lt;br /&gt;
 ca /etc/openvpn/keys/ca.crt&lt;br /&gt;
 cert /etc/openvpn/keys/server.crt&lt;br /&gt;
 key /etc/openvpn/keys/server.key&lt;br /&gt;
 dh /etc/openvpn/keys/dh1024.pem&lt;br /&gt;
 ; Значение 0 следует использовать на сервере, 1 - на клиенте&lt;br /&gt;
 tls-auth /etc/openvpn/keys/ta.key 0&lt;br /&gt;
 ; Для большинства сетей подойдет режим маршрутизатора (routed). Да, в этом&lt;br /&gt;
 ; случае широковещательный трафик отсутствует, соответственно, не будут работать&lt;br /&gt;
 ; некоторые протоколы, которые его используют, например NetBIOS поверх TCP. Но&lt;br /&gt;
 ; последнее нивелируется развертыванием WINS-сервера, либо подключением сетевых&lt;br /&gt;
 ; дисков/созданием ярлыков на расшаренные ресурсы&lt;br /&gt;
 server 192.168.3.0 255.255.255.0&lt;br /&gt;
 ; Проталкиваем подключенным клиентам статические маршруты, чтобы они могли&lt;br /&gt;
 ; получить доступ к ресурсам проводной и беспроводной сети&lt;br /&gt;
 push &amp;quot;route 192.168.1.0 255.255.255.0&amp;quot;&lt;br /&gt;
 push &amp;quot;route 192.168.2.0 255.255.255.0&amp;quot;&lt;br /&gt;
 ; Не позволяем соединению разорваться при простое&lt;br /&gt;
 keepalive 10 120&lt;br /&gt;
 ; Алгоритмы, используемые для аутентификации и шифрования пакетов&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Максимальное число одновременно подключенных VPN-пользователей&lt;br /&gt;
 max-clients 10&lt;br /&gt;
 ; Задаем файл журналирования событий и уровень детализации журнала, отображаем&lt;br /&gt;
 ; не более 20 экземпляров одного сообщения (остальные отбрасываем)&lt;br /&gt;
 log-append /var/log/openvpn.log&lt;br /&gt;
 verb 3&lt;br /&gt;
 mute 20&lt;br /&gt;
 ; Пользователь и группа, с правами которых работает демон&lt;br /&gt;
 user _openvpn&lt;br /&gt;
 group _openvpn&lt;br /&gt;
 ; Эти опции предотвращают доступ к некоторым ресурсам (например,&lt;br /&gt;
 ; tun-устройству) при перезапуске демона (рекомендуется применять только при&lt;br /&gt;
 ; снижении привилегий)&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 ; Сажаем демона в chroot-окружение&lt;br /&gt;
 chroot /var/empty&lt;br /&gt;
&lt;br /&gt;
Чтобы не вбивать директивы вручную, можно воспользоваться примером конфига, любезно предоставленным разработчиками:&lt;br /&gt;
 &lt;br /&gt;
 # cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Поднимаем виртуальный интерфейс &amp;lt;tt&amp;gt;tun0&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # echo &amp;quot;up&amp;quot; &amp;gt; /etc/hostname.tun0&lt;br /&gt;
 # sh /etc/netstart tun0&lt;br /&gt;
&lt;br /&gt;
Запускаем сервер OpenVPN командой:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
&lt;br /&gt;
Для автоматической загрузки OpenVPN достаточно прописать эту строчку в стартовый сценарий &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt;, например, так:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.local&lt;br /&gt;
 if [ -x /usr/local/sbin/openvpn ]; then&lt;br /&gt;
    echo -n &amp;#039; openvpn&amp;#039;; /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Далее смотрим в логи, чтобы убедиться в успешной загрузке нашего демона:&lt;br /&gt;
&lt;br /&gt;
 # tail /var/log/openvpn.log&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 IFCONFIG POOL: base=192.168.3.4 size=62&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 Initialization Sequence Completed&lt;br /&gt;
&lt;br /&gt;
Чтобы проверить состояние псевдоустройства туннелирования, можно воспользоваться утилитой &amp;lt;tt&amp;gt;ifconfig&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig tun0&lt;br /&gt;
 tun0: flags=8051&amp;lt;UP,POINTOPOINT,RUNNING,MULTICAST&amp;gt; mtu 1500&lt;br /&gt;
 groups: tun&lt;br /&gt;
 inet 192.168.3.1 --&amp;gt; 192.168.3.2 netmask 0xffffffff&lt;br /&gt;
&lt;br /&gt;
Для корректной работы сервера OpenVPN необходимо разрешить прохождение любого трафика через интерфейс OpenVPN, а также входящие подключения на внешний адрес сервера порт &amp;lt;tt&amp;gt;1194/udp&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 pass quick on { lo tun0 $int_if } inet&lt;br /&gt;
 pass in on $ext_if inet proto udp from any to $ext_if port 1194 \&lt;br /&gt;
 keep state&lt;br /&gt;
&lt;br /&gt;
Перезагружаем набор рулесетов файервола:&lt;br /&gt;
&lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
== Инсталляция на стороне клиента ==&lt;br /&gt;
&lt;br /&gt;
Итак, VPN-сервер работает и готов принимать подключения. Развертывание VPN-клиентов для VPN-подключений удаленного доступа состоит из двух действий: установка программы OpenVPN GUI и правка конфигурационного файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client*.ovpn&amp;lt;/span&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 C:\Program Files\OpenVPN\config\mycompany_client1.ovpn&lt;br /&gt;
 ; Работаем в режиме клиента&lt;br /&gt;
 client&lt;br /&gt;
 dev tun&lt;br /&gt;
 ; Указываем IP-адрес и порт VPN-сервера&lt;br /&gt;
 remote 213.167.XX.YY 1194&lt;br /&gt;
 proto udp&lt;br /&gt;
 resolv-retry infinite&lt;br /&gt;
 nobind&lt;br /&gt;
 pull&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 verb 3&lt;br /&gt;
 ; Я предпочитаю хранить crt и key файлы на флешке&lt;br /&gt;
 ca &amp;quot;f:\\vpn\\mycompany\\ca.crt&amp;quot;&lt;br /&gt;
 cert &amp;quot;f:\\vpn\\mycompany\\client1.crt&amp;quot;&lt;br /&gt;
 key &amp;quot;f:\\vpn\\mycompany\\client1.key&amp;quot;&lt;br /&gt;
 tls-auth &amp;quot;f:\\vpn\\mycompany\\ta.key&amp;quot; 1&lt;br /&gt;
 ns-cert-type server&lt;br /&gt;
 ; Нижеследующие алгоритмы должны совпадать с теми, что заданы на сервере&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Без этих двух директив Vista-клиенты не смогут получать маршруты от сервера&lt;br /&gt;
 ; route-method exe&lt;br /&gt;
 ; route-delay 2&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения к VPN-серверу достаточно в трее щелкнуть правой кнопкой мыши на значке с красными мониторчиками, выбрать конфиг &amp;lt;tt&amp;gt;mycompany_client1&amp;lt;/tt&amp;gt; и нажать Connect.&lt;br /&gt;
&lt;br /&gt;
== Аутентификационный шлюз на базе pf и authpf ==&lt;br /&gt;
&lt;br /&gt;
В BSD-системах, используя связку пакетного фильтра pf и авторизационного шелла authpf, можно контролировать доступ клиентов, подключающихся к VPN-службе и корпоративной сети. Схема работы такой конструкции довольно проста: пользователь логинится по ssh, и, в зависимости от введенных данных (имя и пароль), на сервере вступают в силу персональные правила файервола, в данном случае разрешающие прохождение UDP-пакетов к порту 1194.&lt;br /&gt;
Но прежде, чем производить настройку &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, необходимо переопределить некоторые дефолтные значения переменных демона [http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html sshd(8)]. Так мы усложним потенциальному злоумышленнику успешное проведение атаки с целью перехвата и подмены ssh-сессии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/ssh/sshd_config&lt;br /&gt;
 # Работаем с использованием протоколов IPv4 и ssh2&lt;br /&gt;
 AddressFamily inet&lt;br /&gt;
 Protocol 2&lt;br /&gt;
 # Ожидаем подключения по всем доступным сетевым интерфейсам&lt;br /&gt;
 ListenAddress 0.0.0.0&lt;br /&gt;
 # Запрещаем регистрацию root&amp;#039;а и применение пустых паролей&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 PermitEmptyPasswords no&lt;br /&gt;
 # За счет использования протокола ssh2 и этих двух опций усложняем проведение&lt;br /&gt;
 # атак типа ARP- и IP-spoofing&lt;br /&gt;
 ClientAliveInterval 15&lt;br /&gt;
 ClientAliveCountMax 3&lt;br /&gt;
 # Отключаем DNS-резолвинг&lt;br /&gt;
 UseDNS no&lt;br /&gt;
 # Определяем списки контроля доступом&lt;br /&gt;
 AllowGroups wheel users authpf&lt;br /&gt;
&lt;br /&gt;
Для того чтобы внесенные изменения вступили в силу, необходимо дать указание демону перечитать свой конфиг:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `sed q /var/run/sshd.pid`&lt;br /&gt;
&lt;br /&gt;
Authpf представляет собой псевдооболочку, которая назначается пользователю системы в качестве &amp;lt;tt&amp;gt;login shell&amp;lt;/tt&amp;gt; (примечание: запись «&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/sbin/authpf&amp;lt;/span&amp;gt;» в файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/shells&amp;lt;/span&amp;gt; добавлять не следует). При авторизации пользователя по ssh к текущим правилам фильтра пакетов с помощью так называемых якорей &amp;lt;tt&amp;gt;(anchors)&amp;lt;/tt&amp;gt; будут присоединены правила, указанные в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/authpf.rules&amp;lt;/span&amp;gt;, либо в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/users/$USER&amp;lt;/span&amp;gt;. В добавляемых правилах допускается использование зарезервированных макросов &amp;lt;tt&amp;gt;$user_id&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;$user_ip&amp;lt;/tt&amp;gt;, за счет которых будет происходить автоматическая подстановка имени и IP-адреса подключившегося пользователя (значения макросов считываются из переменных окружения ssh автоматически).&lt;br /&gt;
В конец файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;[http://www.openbsd.org/cgi-bin/man.cgi?query=login.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html login.conf(5)]&amp;lt;/span&amp;gt; заносим сведения о новом классе &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, пользователи которого в качестве стандартного шелла будут получать authpf:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/login.conf&lt;br /&gt;
 authpf:\&lt;br /&gt;
   :shell=/usr/sbin/authpf:\&lt;br /&gt;
   :tc=default:&lt;br /&gt;
&lt;br /&gt;
С помощью штатной утилиты [http://www.openbsd.org/cgi-bin/man.cgi?query=cap_mkdb&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html cap_mkdb(1)] обновляем хэшированную базу данных &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/login.conf.db&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # cap_mkdb /etc/login.conf&lt;br /&gt;
&lt;br /&gt;
Мы не будем переопределять умолчальные значения директив &amp;lt;tt&amp;gt;anchor&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;table&amp;lt;/tt&amp;gt;, поэтому файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;authpf.conf&amp;lt;/span&amp;gt; оставляем пустым:&lt;br /&gt;
&lt;br /&gt;
 # echo -n &amp;gt; /etc/authpf/authpf.conf&lt;br /&gt;
&lt;br /&gt;
Подготавливаем приветственное сообщение authpf.message (аналог /etc/motd):&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/authpf.message&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
Создаем нового пользователя, который принадлежит классу authpf, входит в группу authpf и в качестве оболочки получает /usr/sbin/authpf:&lt;br /&gt;
&lt;br /&gt;
 # useradd -m -c &amp;#039;authpf vpn user&amp;#039; -g authpf -L authpf \&lt;br /&gt;
 -s /usr/sbin/authpf client1&lt;br /&gt;
 # passwd client1&lt;br /&gt;
&lt;br /&gt;
Рисуем правило файервола, разрешающее пользователю client1 доступ к серверу OpenVPN:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/authpf/users/client1&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/users/client1/authpf.rules&lt;br /&gt;
 pass in log quick on fxp0 inet proto udp from $user_ip to fxp0 \&lt;br /&gt;
 port 1194 keep state&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения механизма якорей добавим следующие записи в [http://www.openbsd.org/cgi-bin/man.cgi?query=pf.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html pf.conf(5)]:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 nat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 rdr-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 binat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 pass in log on $ext_if inet proto tcp to fxp0 port ssh keep state&lt;br /&gt;
 ...&lt;br /&gt;
 anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
И перезагрузим набор рулесетов файервола:&lt;br /&gt;
 &lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
На стороне клиента открываем любой ssh-клиент, например, Putty или SecureCRT, создаем новую сессию, указываем IP-адрес сервера и имя пользователя. Если все настроено правильно, после успешной авторизации правила файервола на сервере для этого пользователя изменятся, и он получит доступ к VPN-службе.&lt;br /&gt;
&lt;br /&gt;
 # f:\vpn\putty&amp;gt; plink.exe -pw mypassword client1@213.167.XX.YY&lt;br /&gt;
 Hello client1. You are authenticated from host &amp;quot;77.41.XX.YY&amp;quot;&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
А чтобы постоянно не вводить пароль, можно настроить аутентификацию на базе публичного ключа.&lt;br /&gt;
&lt;br /&gt;
== Эндшпиль ==&lt;br /&gt;
&lt;br /&gt;
Эта статья включает полный набор пошаговых действий, необходимых для внедрения базового VPN-решения удаленного доступа, используя BSD-систему в качестве VPN-сервера и WinXP/Vista в качестве VPN-клиента. Развернув в 3-4 компаниях подобную конфигурацию, ты сможешь не с пустыми кредиткой и кошельком ехать в Египет греть пятки. Удачи.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=197</id>
		<title>Деликатное проникновение в частную сеть</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=197"/>
		<updated>2013-06-05T12:04:43Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Золотые ключики и подарочные сертификаты */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Статья [http://www.xakep.ru/magazine/xa/110/156/1.asp опубликована] в февральском номере журнала Хакер за 2008 год. Автор оригинального текста: Andrey Matveev (andrey at openbsd dot ru). &lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Когда речь заходит о необходимости предоставления авторизированному пользователю доступа к защищенным ресурсам частной сети, на ум сразу приходят примеры построения VPN на базе IPSec, PPTP, L2TP и SSL. Однако если требуется в кратчайшие сроки развернуть бесплатное, кроссплатформенное, полнофункциональное ПО с гибкими возможностями конфигурирования и относительно простой установкой, не требующей вмешательства в ядро ОС, то из всех доступных решений выбор невольно падает на OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Поем дифирамбы OpenVPN ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN является реализацией технологии VPN с использованием протокола SSL/TLS. С его помощью можно поднять надежный, достаточно быстрый и в то же время защищенный от прослушивания и вмешательства злоумышленников криптотуннель поверх общедоступной сети, такой, как Интернет. В двух словах схему работы этого приложения можно описать следующим образом: любой сетевой трафик, посылаемый или принимаемый для сетевого адаптера, инкапсулируется в зашифрованный пакет и доставляется в другой конечный пункт туннеля OpenVPN, где данные расшифровываются и попадают в удаленную сеть.&lt;br /&gt;
К числу основных преимуществ применения OpenVPN стоит отнести:&lt;br /&gt;
&lt;br /&gt;
* высокая переносимость между платформами – пакет работает на Windows 2000/XP/2003/Vista, Linux, Free/Net/OpenBSD, Mac OS X и Solaris;&lt;br /&gt;
* поддержка режимов маршрутизации (routed) и моста (bridged), другими словами, нам под силу туннелировать как IP-пакеты, так и Ethernet-фреймы;&lt;br /&gt;
* для транспорта можно использовать UDP/TCP;&lt;br /&gt;
* клиентские хосты могут иметь статические и динамические IP-адреса;&lt;br /&gt;
* туннели можно создавать поверх NAT;&lt;br /&gt;
* работа через межсетевые экраны, в которых реализован контроль состояния соединений (достигается за счет отправки через определенные промежутки времени echo-запросов);&lt;br /&gt;
* ассиметричное шифрование с использованием статических ключей и SSL/TLS сертификатов;&lt;br /&gt;
* встроенные меры безопасности для предотвращения DoS-атак и повторного проигрывания злоумышленником последовательности записанных пакетов;&lt;br /&gt;
* адаптивная компрессия передаваемых данных;&lt;br /&gt;
* способность &amp;quot;проталкивать&amp;quot; маршруты для клиента;&lt;br /&gt;
* использование всех механизмов шифрования, встроенных в библиотеку OpenSSL;&lt;br /&gt;
* работа в chroot-окружении;&lt;br /&gt;
* поддержка мультипоточной библиотеки pthread (положительно влияет на быстродействие при динамическом обмене SSL/TLS ключами). &lt;br /&gt;
&lt;br /&gt;
Как видишь, список возможностей впечатляет, но в отличие от других SSL VPN, достоинством которых считается безклиентская установка (соединение SSL VPN устанавливается через браузер), для OpenVPN необходим специальный клиент (поговорим об этом ниже).&lt;br /&gt;
&lt;br /&gt;
== Увертюра к основному действию ==&lt;br /&gt;
&lt;br /&gt;
Предположим, одним прекрасным солнечным утром твое высокое начальство впечатлилось идеей создания виртуальной частной сети, и теперь перед тобой стоит задача поднять VPN-сервер для служащих, которым требуется работать с корпоративными ресурсами, находясь вне стен офиса (это могут быть надомные, командировочные сотрудники или просто фрилансеры).&lt;br /&gt;
Функции шлюза компании, выпускающего сотрудников в Интернет, выполняет компьютер с тремя сетевыми картами (213.167.XX.YY, 192.168.1.1, 192.168.2.1) под управлением… хотя это не так важно, настройки в поддерживаемых операционках будут отличаться минимально. В моем случае на сервере заказчика была установлена OpenBSD 3.9. Что касается корпоративной внутренней сети, то она состоит из двух участков: проводного (192.168.1.0/24) и беспроводного (192.168.2.0/24). После рекогносцировки на местности переходим к установке OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Серверная инсталляция ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN без труда можно найти в любом репозитарии или дереве портов:&lt;br /&gt;
&lt;br /&gt;
 # cd /usr/ports/net/openvpn&lt;br /&gt;
 # make install clean&lt;br /&gt;
&lt;br /&gt;
В случае установки из исходных кодов в некоторых системах может понадобиться отключить поддержку реализации потоков выполнения и указать местоположение библиотек и заголовочных файлов &amp;lt;tt&amp;gt;lzo&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ./configure --disable-pthread --with-lzo-lib=/usr/local/lib \&lt;br /&gt;
 --with-lzoheaders=/usr/local/include&lt;br /&gt;
 # make&lt;br /&gt;
 # make install&lt;br /&gt;
&lt;br /&gt;
Для проверки с помощью следующих команд можно посмотреть, какие дайджесты (применяются для аутентификации каждой получаемой UDP-датаграммы) и алгоритмы шифрования доступны:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-digests&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-ciphers&lt;br /&gt;
&lt;br /&gt;
Чтобы обеспечить дополнительный уровень защиты и избежать возможный ущерб при взломе, нужно дать указание демону OpenVPN работать с правами непривилегированного пользователя в chroot’ной среде — среде с измененным корневым каталогом. Первый шаг для этого — добавить в систему группу &amp;lt;tt&amp;gt;_openvpn&amp;lt;/tt&amp;gt; и одноименного пользователя:&lt;br /&gt;
&lt;br /&gt;
 # groupadd -g 500 _openvpn&lt;br /&gt;
 # useradd -u 500 -g 500 -c &amp;#039;OpenVPN Server&amp;#039; -s /sbin/nologin \&lt;br /&gt;
 -d /var/openvpn -m _openvpn&lt;br /&gt;
&lt;br /&gt;
Проверяем правильность выполнения двух последних команд:&lt;br /&gt;
&lt;br /&gt;
 # grep 500 /etc/passwd&lt;br /&gt;
 _openvpn:*:500:500:OpenVPN Server:/var/openvpn:/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
== Золотые ключики и подарочные сертификаты ==&lt;br /&gt;
&lt;br /&gt;
Думаю, ни для кого не секрет, что сертификаты открытых ключей предоставляют удобный и надежный способ аутентификации пользователей, поэтому не будем сейчас тратить время на теоретическую часть и перейдем непосредственно к процедуре генерирования надлежащих сертификатов.&lt;br /&gt;
Создаем директорию, где будут лежать конфигурационные файлы, скрипты и сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/openvpn/keys&lt;br /&gt;
&lt;br /&gt;
Копируем комплект скриптов easy-rsa, предназначенный для упрощения создания сертификатов, которые предъявляются в процессе аутентификации для подтверждения валидности клиентов. Теперь о монстроидальных командах &amp;lt;tt&amp;gt;openssl&amp;lt;/tt&amp;gt; можно забыть.&lt;br /&gt;
&lt;br /&gt;
 # cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Далее следует экспортировать переменные KEY_*, они необходимы для работы build-* скриптов:&lt;br /&gt;
&lt;br /&gt;
 # cd /etc/openvpn/easy-rsa&lt;br /&gt;
 # . ./vars&lt;br /&gt;
&lt;br /&gt;
Инициализируем директорию /etc/openvpn/easy-rsa/keys:&lt;br /&gt;
&lt;br /&gt;
 # ./clean-all&lt;br /&gt;
&lt;br /&gt;
Создаем корневой и серверный сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # ./build-ca&lt;br /&gt;
 # ./build-key-server server&lt;br /&gt;
&lt;br /&gt;
Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, выполняем:&lt;br /&gt;
 &lt;br /&gt;
 # ./build-dh&lt;br /&gt;
&lt;br /&gt;
Снизить вероятность успешного проведения DoS-атаки на сервер OpenVPN можно за счет использования клиентом и сервером статического ключа HMAC (так называемый &amp;lt;tt&amp;gt;shared secret&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --genkey --secret keys/ta.key&lt;br /&gt;
&lt;br /&gt;
Перемещаем все созданные файлы в подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;keys&amp;lt;/span&amp;gt; и выставляем для них корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # cd keys/&lt;br /&gt;
 # mv ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys&lt;br /&gt;
 # chown -R root:wheel /etc/openvpn&lt;br /&gt;
 # chmod 700 /etc/openvpn/keys&lt;br /&gt;
 # chmod 644 /etc/openvpn/keys/{ca.crt,dh1024.pem,server.crt}&lt;br /&gt;
 # chmod 600 /etc/openvpn/keys/{server.key,ta.key}&lt;br /&gt;
&lt;br /&gt;
Процедура создания клиентских сертификатов практически аналогична соответствующей процедуре для сервера:&lt;br /&gt;
&lt;br /&gt;
 # ./build-key client1&lt;br /&gt;
 # mkdir -p /home/vpn/client1&lt;br /&gt;
 # mv client1.crt client1.key /home/vpn/client1&lt;br /&gt;
 # cp /etc/openvpn/keys/{ca.crt,ta.key} /home/vpn/client1&lt;br /&gt;
&lt;br /&gt;
Теперь подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client1&amp;lt;/span&amp;gt; следует перенести на винч или флешку «географически изолированного» сотрудника.&lt;br /&gt;
&lt;br /&gt;
== Щепетильное конфигурирование ==&lt;br /&gt;
&lt;br /&gt;
Конфигурация сервера OpenVPN хранится в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/openvpn/server.conf&amp;lt;/span&amp;gt;. Ниже приведен пример подобного конфига. Все опции детально прокомментированы, поэтому сложностей возникнуть не должно. При настройке старайся «не срезать углы» — за один шаг добавляй/изменяй что-то одно и сразу же тестируй. Все действия в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;server.conf&amp;lt;/span&amp;gt; желательно фиксировать в локальном cvs-репозитории, чтобы можно было быстро просмотреть историю изменений и вернуться к рабочей ревизии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/openvpn/server.conf&lt;br /&gt;
 ; Работаем в режиме демона&lt;br /&gt;
 daemon openvpn&lt;br /&gt;
 ; Указываем местоположение файла с уникальным идентификатором процесса сервера&lt;br /&gt;
 ; OpenVPN&lt;br /&gt;
 writepid /var/openvpn/pid&lt;br /&gt;
 ; Определяем файл, содержащий список текущих клиентских соединений&lt;br /&gt;
 status /var/openvpn/status 10&lt;br /&gt;
 ; Внешний IP-адрес нашего сервера&lt;br /&gt;
 local 213.167.XX.YY&lt;br /&gt;
 ; Используемый порт&lt;br /&gt;
 port 1194&lt;br /&gt;
 ; Для транспорта по умолчанию применяется протокол UDP. Это вполне резонный&lt;br /&gt;
 ; подход. Во-первых, благодаря меньшему размеру заголовков и отсутствию&lt;br /&gt;
 ; встроенной функции подтверждения доставки пакетов, производительность UDP&lt;br /&gt;
 ; значительно выше. А во-вторых, при использовании UDP общая надежность не&lt;br /&gt;
 ; снижается, так как OpenVPN шифрует исходные пакеты, обеспечивая проверку&lt;br /&gt;
 ; ошибок и повторную передачу. В связи с этим TCP рекомендуется применять&lt;br /&gt;
 ; только в тех случаях, когда UDP не работает, например, если брандмауэр&lt;br /&gt;
 ; блокирует весь UDP-трафик.&lt;br /&gt;
 proto udp&lt;br /&gt;
 ; Выбираем тип виртуального устройства туннеля (tun, tap или null)&lt;br /&gt;
 dev tun0&lt;br /&gt;
 ; Включаем компрессию передаваемых данных&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 ; Указываем абсолютные пути к созданным сертификатам и ключам&lt;br /&gt;
 ca /etc/openvpn/keys/ca.crt&lt;br /&gt;
 cert /etc/openvpn/keys/server.crt&lt;br /&gt;
 key /etc/openvpn/keys/server.key&lt;br /&gt;
 dh /etc/openvpn/keys/dh1024.pem&lt;br /&gt;
 ; Значение 0 следует использовать на сервере, 1 - на клиенте&lt;br /&gt;
 tls-auth /etc/openvpn/keys/ta.key 0&lt;br /&gt;
 ; Для большинства сетей подойдет режим маршрутизатора (routed). Да, в этом&lt;br /&gt;
 ; случае широковещательный трафик отсутствует, соответственно, не будут работать&lt;br /&gt;
 ; некоторые протоколы, которые его используют, например NetBIOS поверх TCP. Но&lt;br /&gt;
 ; последнее нивелируется развертыванием WINS-сервера, либо подключением сетевых&lt;br /&gt;
 ; дисков/созданием ярлыков на расшаренные ресурсы&lt;br /&gt;
 server 192.168.3.0 255.255.255.0&lt;br /&gt;
 ; Проталкиваем подключенным клиентам статические маршруты, чтобы они могли&lt;br /&gt;
 ; получить доступ к ресурсам проводной и беспроводной сети&lt;br /&gt;
 push &amp;quot;route 192.168.1.0 255.255.255.0&amp;quot;&lt;br /&gt;
 push &amp;quot;route 192.168.2.0 255.255.255.0&amp;quot;&lt;br /&gt;
 ; Не позволяем соединению разорваться при простое&lt;br /&gt;
 keepalive 10 120&lt;br /&gt;
 ; Алгоритмы, используемые для аутентификации и шифрования пакетов&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Максимальное число одновременно подключенных VPN-пользователей&lt;br /&gt;
 max-clients 10&lt;br /&gt;
 ; Задаем файл журналирования событий и уровень детализации журнала, отображаем&lt;br /&gt;
 ; не более 20 экземпляров одного сообщения (остальные отбрасываем)&lt;br /&gt;
 log-append /var/log/openvpn.log&lt;br /&gt;
 verb 3&lt;br /&gt;
 mute 20&lt;br /&gt;
 ; Пользователь и группа, с правами которых работает демон&lt;br /&gt;
 user _openvpn&lt;br /&gt;
 group _openvpn&lt;br /&gt;
 ; Эти опции предотвращают доступ к некоторым ресурсам (например,&lt;br /&gt;
 ; tun-устройству) при перезапуске демона (рекомендуется применять только при&lt;br /&gt;
 ; снижении привилегий)&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 ; Сажаем демона в chroot-окружение&lt;br /&gt;
 chroot /var/empty&lt;br /&gt;
&lt;br /&gt;
Чтобы не вбивать директивы вручную, можно воспользоваться примером конфига, любезно предоставленным разработчиками:&lt;br /&gt;
 &lt;br /&gt;
 # cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Поднимаем виртуальный интерфейс tun0:&lt;br /&gt;
&lt;br /&gt;
 # echo &amp;quot;up&amp;quot; &amp;gt; /etc/hostname.tun0&lt;br /&gt;
 # sh /etc/netstart tun0&lt;br /&gt;
&lt;br /&gt;
Запускаем сервер OpenVPN командой:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
&lt;br /&gt;
Для автоматической загрузки OpenVPN достаточно прописать эту строчку в стартовый сценарий &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt;, например, так:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.local&lt;br /&gt;
 if [ -x /usr/local/sbin/openvpn ]; then&lt;br /&gt;
    echo -n &amp;#039; openvpn&amp;#039;; /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Далее смотрим в логи, чтобы убедиться в успешной загрузке нашего демона:&lt;br /&gt;
&lt;br /&gt;
 # tail /var/log/openvpn.log&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 IFCONFIG POOL: base=192.168.3.4 size=62&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 Initialization Sequence Completed&lt;br /&gt;
&lt;br /&gt;
Чтобы проверить состояние псевдоустройства туннелирования, можно воспользоваться утилитой &amp;lt;tt&amp;gt;ifconfig&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig tun0&lt;br /&gt;
 tun0: flags=8051&amp;lt;UP,POINTOPOINT,RUNNING,MULTICAST&amp;gt; mtu 1500&lt;br /&gt;
 groups: tun&lt;br /&gt;
 inet 192.168.3.1 --&amp;gt; 192.168.3.2 netmask 0xffffffff&lt;br /&gt;
&lt;br /&gt;
Для корректной работы сервера OpenVPN необходимо разрешить прохождение любого трафика через интерфейс OpenVPN, а также входящие подключения на внешний адрес сервера порт 1194/udp:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 pass quick on { lo tun0 $int_if } inet&lt;br /&gt;
 pass in on $ext_if inet proto udp from any to $ext_if port 1194 \&lt;br /&gt;
 keep state&lt;br /&gt;
&lt;br /&gt;
Перезагружаем набор рулесетов файервола:&lt;br /&gt;
&lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
== Инсталляция на стороне клиента ==&lt;br /&gt;
&lt;br /&gt;
Итак, VPN-сервер работает и готов принимать подключения. Развертывание VPN-клиентов для VPN-подключений удаленного доступа состоит из двух действий: установка программы OpenVPN GUI и правка конфигурационного файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client*.ovpn&amp;lt;/span&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 C:\Program Files\OpenVPN\config\mycompany_client1.ovpn&lt;br /&gt;
 ; Работаем в режиме клиента&lt;br /&gt;
 client&lt;br /&gt;
 dev tun&lt;br /&gt;
 ; Указываем IP-адрес и порт VPN-сервера&lt;br /&gt;
 remote 213.167.XX.YY 1194&lt;br /&gt;
 proto udp&lt;br /&gt;
 resolv-retry infinite&lt;br /&gt;
 nobind&lt;br /&gt;
 pull&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 verb 3&lt;br /&gt;
 ; Я предпочитаю хранить crt и key файлы на флешке&lt;br /&gt;
 ca &amp;quot;f:\\vpn\\mycompany\\ca.crt&amp;quot;&lt;br /&gt;
 cert &amp;quot;f:\\vpn\\mycompany\\client1.crt&amp;quot;&lt;br /&gt;
 key &amp;quot;f:\\vpn\\mycompany\\client1.key&amp;quot;&lt;br /&gt;
 tls-auth &amp;quot;f:\\vpn\\mycompany\\ta.key&amp;quot; 1&lt;br /&gt;
 ns-cert-type server&lt;br /&gt;
 ; Нижеследующие алгоритмы должны совпадать с теми, что заданы на сервере&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Без этих двух директив Vista-клиенты не смогут получать маршруты от сервера&lt;br /&gt;
 ; route-method exe&lt;br /&gt;
 ; route-delay 2&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения к VPN-серверу достаточно в трее щелкнуть правой кнопкой мыши на значке с красными мониторчиками, выбрать конфиг &amp;lt;tt&amp;gt;mycompany_client1&amp;lt;/tt&amp;gt; и нажать Connect.&lt;br /&gt;
&lt;br /&gt;
== Аутентификационный шлюз на базе pf и authpf ==&lt;br /&gt;
&lt;br /&gt;
В BSD-системах, используя связку пакетного фильтра pf и авторизационного шелла authpf, можно контролировать доступ клиентов, подключающихся к VPN-службе и корпоративной сети. Схема работы такой конструкции довольно проста: пользователь логинится по ssh, и, в зависимости от введенных данных (имя и пароль), на сервере вступают в силу персональные правила файервола, в данном случае разрешающие прохождение UDP-пакетов к порту 1194.&lt;br /&gt;
Но прежде, чем производить настройку &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, необходимо переопределить некоторые дефолтные значения переменных демона [http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html sshd(8)]. Так мы усложним потенциальному злоумышленнику успешное проведение атаки с целью перехвата и подмены ssh-сессии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/ssh/sshd_config&lt;br /&gt;
 # Работаем с использованием протоколов IPv4 и ssh2&lt;br /&gt;
 AddressFamily inet&lt;br /&gt;
 Protocol 2&lt;br /&gt;
 # Ожидаем подключения по всем доступным сетевым интерфейсам&lt;br /&gt;
 ListenAddress 0.0.0.0&lt;br /&gt;
 # Запрещаем регистрацию root&amp;#039;а и применение пустых паролей&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 PermitEmptyPasswords no&lt;br /&gt;
 # За счет использования протокола ssh2 и этих двух опций усложняем проведение&lt;br /&gt;
 # атак типа ARP- и IP-spoofing&lt;br /&gt;
 ClientAliveInterval 15&lt;br /&gt;
 ClientAliveCountMax 3&lt;br /&gt;
 # Отключаем DNS-резолвинг&lt;br /&gt;
 UseDNS no&lt;br /&gt;
 # Определяем списки контроля доступом&lt;br /&gt;
 AllowGroups wheel users authpf&lt;br /&gt;
&lt;br /&gt;
Для того чтобы внесенные изменения вступили в силу, необходимо дать указание демону перечитать свой конфиг:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `sed q /var/run/sshd.pid`&lt;br /&gt;
&lt;br /&gt;
Authpf представляет собой псевдооболочку, которая назначается пользователю системы в качестве &amp;lt;tt&amp;gt;login shell&amp;lt;/tt&amp;gt; (примечание: запись «&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/sbin/authpf&amp;lt;/span&amp;gt;» в файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/shells&amp;lt;/span&amp;gt; добавлять не следует). При авторизации пользователя по ssh к текущим правилам фильтра пакетов с помощью так называемых якорей &amp;lt;tt&amp;gt;(anchors)&amp;lt;/tt&amp;gt; будут присоединены правила, указанные в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/authpf.rules&amp;lt;/span&amp;gt;, либо в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/users/$USER&amp;lt;/span&amp;gt;. В добавляемых правилах допускается использование зарезервированных макросов &amp;lt;tt&amp;gt;$user_id&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;$user_ip&amp;lt;/tt&amp;gt;, за счет которых будет происходить автоматическая подстановка имени и IP-адреса подключившегося пользователя (значения макросов считываются из переменных окружения ssh автоматически).&lt;br /&gt;
В конец файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;[http://www.openbsd.org/cgi-bin/man.cgi?query=login.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html login.conf(5)]&amp;lt;/span&amp;gt; заносим сведения о новом классе &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, пользователи которого в качестве стандартного шелла будут получать authpf:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/login.conf&lt;br /&gt;
 authpf:\&lt;br /&gt;
   :shell=/usr/sbin/authpf:\&lt;br /&gt;
   :tc=default:&lt;br /&gt;
&lt;br /&gt;
С помощью штатной утилиты [http://www.openbsd.org/cgi-bin/man.cgi?query=cap_mkdb&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html cap_mkdb(1)] обновляем хэшированную базу данных &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/login.conf.db&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # cap_mkdb /etc/login.conf&lt;br /&gt;
&lt;br /&gt;
Мы не будем переопределять умолчальные значения директив &amp;lt;tt&amp;gt;anchor&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;table&amp;lt;/tt&amp;gt;, поэтому файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;authpf.conf&amp;lt;/span&amp;gt; оставляем пустым:&lt;br /&gt;
&lt;br /&gt;
 # echo -n &amp;gt; /etc/authpf/authpf.conf&lt;br /&gt;
&lt;br /&gt;
Подготавливаем приветственное сообщение authpf.message (аналог /etc/motd):&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/authpf.message&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
Создаем нового пользователя, который принадлежит классу authpf, входит в группу authpf и в качестве оболочки получает /usr/sbin/authpf:&lt;br /&gt;
&lt;br /&gt;
 # useradd -m -c &amp;#039;authpf vpn user&amp;#039; -g authpf -L authpf \&lt;br /&gt;
 -s /usr/sbin/authpf client1&lt;br /&gt;
 # passwd client1&lt;br /&gt;
&lt;br /&gt;
Рисуем правило файервола, разрешающее пользователю client1 доступ к серверу OpenVPN:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/authpf/users/client1&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/users/client1/authpf.rules&lt;br /&gt;
 pass in log quick on fxp0 inet proto udp from $user_ip to fxp0 \&lt;br /&gt;
 port 1194 keep state&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения механизма якорей добавим следующие записи в [http://www.openbsd.org/cgi-bin/man.cgi?query=pf.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html pf.conf(5)]:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 nat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 rdr-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 binat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 pass in log on $ext_if inet proto tcp to fxp0 port ssh keep state&lt;br /&gt;
 ...&lt;br /&gt;
 anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
И перезагрузим набор рулесетов файервола:&lt;br /&gt;
 &lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
На стороне клиента открываем любой ssh-клиент, например, Putty или SecureCRT, создаем новую сессию, указываем IP-адрес сервера и имя пользователя. Если все настроено правильно, после успешной авторизации правила файервола на сервере для этого пользователя изменятся, и он получит доступ к VPN-службе.&lt;br /&gt;
&lt;br /&gt;
 # f:\vpn\putty&amp;gt; plink.exe -pw mypassword client1@213.167.XX.YY&lt;br /&gt;
 Hello client1. You are authenticated from host &amp;quot;77.41.XX.YY&amp;quot;&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
А чтобы постоянно не вводить пароль, можно настроить аутентификацию на базе публичного ключа.&lt;br /&gt;
&lt;br /&gt;
== Эндшпиль ==&lt;br /&gt;
&lt;br /&gt;
Эта статья включает полный набор пошаговых действий, необходимых для внедрения базового VPN-решения удаленного доступа, используя BSD-систему в качестве VPN-сервера и WinXP/Vista в качестве VPN-клиента. Развернув в 3-4 компаниях подобную конфигурацию, ты сможешь не с пустыми кредиткой и кошельком ехать в Египет греть пятки. Удачи.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=196</id>
		<title>Деликатное проникновение в частную сеть</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=196"/>
		<updated>2013-06-05T12:03:00Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Статья [http://www.xakep.ru/magazine/xa/110/156/1.asp опубликована] в февральском номере журнала Хакер за 2008 год. Автор оригинального текста: Andrey Matveev (andrey at openbsd dot ru). &lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Когда речь заходит о необходимости предоставления авторизированному пользователю доступа к защищенным ресурсам частной сети, на ум сразу приходят примеры построения VPN на базе IPSec, PPTP, L2TP и SSL. Однако если требуется в кратчайшие сроки развернуть бесплатное, кроссплатформенное, полнофункциональное ПО с гибкими возможностями конфигурирования и относительно простой установкой, не требующей вмешательства в ядро ОС, то из всех доступных решений выбор невольно падает на OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Поем дифирамбы OpenVPN ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN является реализацией технологии VPN с использованием протокола SSL/TLS. С его помощью можно поднять надежный, достаточно быстрый и в то же время защищенный от прослушивания и вмешательства злоумышленников криптотуннель поверх общедоступной сети, такой, как Интернет. В двух словах схему работы этого приложения можно описать следующим образом: любой сетевой трафик, посылаемый или принимаемый для сетевого адаптера, инкапсулируется в зашифрованный пакет и доставляется в другой конечный пункт туннеля OpenVPN, где данные расшифровываются и попадают в удаленную сеть.&lt;br /&gt;
К числу основных преимуществ применения OpenVPN стоит отнести:&lt;br /&gt;
&lt;br /&gt;
* высокая переносимость между платформами – пакет работает на Windows 2000/XP/2003/Vista, Linux, Free/Net/OpenBSD, Mac OS X и Solaris;&lt;br /&gt;
* поддержка режимов маршрутизации (routed) и моста (bridged), другими словами, нам под силу туннелировать как IP-пакеты, так и Ethernet-фреймы;&lt;br /&gt;
* для транспорта можно использовать UDP/TCP;&lt;br /&gt;
* клиентские хосты могут иметь статические и динамические IP-адреса;&lt;br /&gt;
* туннели можно создавать поверх NAT;&lt;br /&gt;
* работа через межсетевые экраны, в которых реализован контроль состояния соединений (достигается за счет отправки через определенные промежутки времени echo-запросов);&lt;br /&gt;
* ассиметричное шифрование с использованием статических ключей и SSL/TLS сертификатов;&lt;br /&gt;
* встроенные меры безопасности для предотвращения DoS-атак и повторного проигрывания злоумышленником последовательности записанных пакетов;&lt;br /&gt;
* адаптивная компрессия передаваемых данных;&lt;br /&gt;
* способность &amp;quot;проталкивать&amp;quot; маршруты для клиента;&lt;br /&gt;
* использование всех механизмов шифрования, встроенных в библиотеку OpenSSL;&lt;br /&gt;
* работа в chroot-окружении;&lt;br /&gt;
* поддержка мультипоточной библиотеки pthread (положительно влияет на быстродействие при динамическом обмене SSL/TLS ключами). &lt;br /&gt;
&lt;br /&gt;
Как видишь, список возможностей впечатляет, но в отличие от других SSL VPN, достоинством которых считается безклиентская установка (соединение SSL VPN устанавливается через браузер), для OpenVPN необходим специальный клиент (поговорим об этом ниже).&lt;br /&gt;
&lt;br /&gt;
== Увертюра к основному действию ==&lt;br /&gt;
&lt;br /&gt;
Предположим, одним прекрасным солнечным утром твое высокое начальство впечатлилось идеей создания виртуальной частной сети, и теперь перед тобой стоит задача поднять VPN-сервер для служащих, которым требуется работать с корпоративными ресурсами, находясь вне стен офиса (это могут быть надомные, командировочные сотрудники или просто фрилансеры).&lt;br /&gt;
Функции шлюза компании, выпускающего сотрудников в Интернет, выполняет компьютер с тремя сетевыми картами (213.167.XX.YY, 192.168.1.1, 192.168.2.1) под управлением… хотя это не так важно, настройки в поддерживаемых операционках будут отличаться минимально. В моем случае на сервере заказчика была установлена OpenBSD 3.9. Что касается корпоративной внутренней сети, то она состоит из двух участков: проводного (192.168.1.0/24) и беспроводного (192.168.2.0/24). После рекогносцировки на местности переходим к установке OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Серверная инсталляция ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN без труда можно найти в любом репозитарии или дереве портов:&lt;br /&gt;
&lt;br /&gt;
 # cd /usr/ports/net/openvpn&lt;br /&gt;
 # make install clean&lt;br /&gt;
&lt;br /&gt;
В случае установки из исходных кодов в некоторых системах может понадобиться отключить поддержку реализации потоков выполнения и указать местоположение библиотек и заголовочных файлов &amp;lt;tt&amp;gt;lzo&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ./configure --disable-pthread --with-lzo-lib=/usr/local/lib \&lt;br /&gt;
 --with-lzoheaders=/usr/local/include&lt;br /&gt;
 # make&lt;br /&gt;
 # make install&lt;br /&gt;
&lt;br /&gt;
Для проверки с помощью следующих команд можно посмотреть, какие дайджесты (применяются для аутентификации каждой получаемой UDP-датаграммы) и алгоритмы шифрования доступны:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-digests&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-ciphers&lt;br /&gt;
&lt;br /&gt;
Чтобы обеспечить дополнительный уровень защиты и избежать возможный ущерб при взломе, нужно дать указание демону OpenVPN работать с правами непривилегированного пользователя в chroot’ной среде — среде с измененным корневым каталогом. Первый шаг для этого — добавить в систему группу &amp;lt;tt&amp;gt;_openvpn&amp;lt;/tt&amp;gt; и одноименного пользователя:&lt;br /&gt;
&lt;br /&gt;
 # groupadd -g 500 _openvpn&lt;br /&gt;
 # useradd -u 500 -g 500 -c &amp;#039;OpenVPN Server&amp;#039; -s /sbin/nologin \&lt;br /&gt;
 -d /var/openvpn -m _openvpn&lt;br /&gt;
&lt;br /&gt;
Проверяем правильность выполнения двух последних команд:&lt;br /&gt;
&lt;br /&gt;
 # grep 500 /etc/passwd&lt;br /&gt;
 _openvpn:*:500:500:OpenVPN Server:/var/openvpn:/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
== Золотые ключики и подарочные сертификаты ==&lt;br /&gt;
&lt;br /&gt;
Думаю, ни для кого не секрет, что сертификаты открытых ключей предоставляют удобный и надежный способ аутентификации пользователей, поэтому не будем сейчас тратить время на теоретическую часть и перейдем непосредственно к процедуре генерирования надлежащих сертификатов.&lt;br /&gt;
Создаем директорию, где будут лежать конфигурационные файлы, скрипты и сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/openvpn/keys&lt;br /&gt;
&lt;br /&gt;
Копируем комплект скриптов easy-rsa, предназначенный для упрощения создания сертификатов, которые предъявляются в процессе аутентификации для подтверждения валидности клиентов. Теперь о монстроидальных командах openssl можно забыть.&lt;br /&gt;
&lt;br /&gt;
 # cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Далее следует экспортировать переменные KEY_*, они необходимы для работы build-* скриптов:&lt;br /&gt;
&lt;br /&gt;
 # cd /etc/openvpn/easy-rsa&lt;br /&gt;
 # . ./vars&lt;br /&gt;
&lt;br /&gt;
Инициализируем директорию /etc/openvpn/easy-rsa/keys:&lt;br /&gt;
&lt;br /&gt;
 # ./clean-all&lt;br /&gt;
&lt;br /&gt;
Создаем корневой и серверный сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # ./build-ca&lt;br /&gt;
 # ./build-key-server server&lt;br /&gt;
&lt;br /&gt;
Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, выполняем:&lt;br /&gt;
 &lt;br /&gt;
 # ./build-dh&lt;br /&gt;
&lt;br /&gt;
Снизить вероятность успешного проведения DoS-атаки на сервер OpenVPN можно за счет использования клиентом и сервером статического ключа HMAC (так называемый shared secret):&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --genkey --secret keys/ta.key&lt;br /&gt;
&lt;br /&gt;
Перемещаем все созданные файлы в подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;keys&amp;lt;/span&amp;gt; и выставляем для них корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # cd keys/&lt;br /&gt;
 # mv ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys&lt;br /&gt;
 # chown -R root:wheel /etc/openvpn&lt;br /&gt;
 # chmod 700 /etc/openvpn/keys&lt;br /&gt;
 # chmod 644 /etc/openvpn/keys/{ca.crt,dh1024.pem,server.crt}&lt;br /&gt;
 # chmod 600 /etc/openvpn/keys/{server.key,ta.key}&lt;br /&gt;
&lt;br /&gt;
Процедура создания клиентских сертификатов практически аналогична соответствующей процедуре для сервера:&lt;br /&gt;
&lt;br /&gt;
 # ./build-key client1&lt;br /&gt;
 # mkdir -p /home/vpn/client1&lt;br /&gt;
 # mv client1.crt client1.key /home/vpn/client1&lt;br /&gt;
 # cp /etc/openvpn/keys/{ca.crt,ta.key} /home/vpn/client1&lt;br /&gt;
&lt;br /&gt;
Теперь подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client1&amp;lt;/span&amp;gt; следует перенести на винч или флешку «географически изолированного» сотрудника.&lt;br /&gt;
&lt;br /&gt;
== Щепетильное конфигурирование ==&lt;br /&gt;
&lt;br /&gt;
Конфигурация сервера OpenVPN хранится в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/openvpn/server.conf&amp;lt;/span&amp;gt;. Ниже приведен пример подобного конфига. Все опции детально прокомментированы, поэтому сложностей возникнуть не должно. При настройке старайся «не срезать углы» — за один шаг добавляй/изменяй что-то одно и сразу же тестируй. Все действия в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;server.conf&amp;lt;/span&amp;gt; желательно фиксировать в локальном cvs-репозитории, чтобы можно было быстро просмотреть историю изменений и вернуться к рабочей ревизии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/openvpn/server.conf&lt;br /&gt;
 ; Работаем в режиме демона&lt;br /&gt;
 daemon openvpn&lt;br /&gt;
 ; Указываем местоположение файла с уникальным идентификатором процесса сервера&lt;br /&gt;
 ; OpenVPN&lt;br /&gt;
 writepid /var/openvpn/pid&lt;br /&gt;
 ; Определяем файл, содержащий список текущих клиентских соединений&lt;br /&gt;
 status /var/openvpn/status 10&lt;br /&gt;
 ; Внешний IP-адрес нашего сервера&lt;br /&gt;
 local 213.167.XX.YY&lt;br /&gt;
 ; Используемый порт&lt;br /&gt;
 port 1194&lt;br /&gt;
 ; Для транспорта по умолчанию применяется протокол UDP. Это вполне резонный&lt;br /&gt;
 ; подход. Во-первых, благодаря меньшему размеру заголовков и отсутствию&lt;br /&gt;
 ; встроенной функции подтверждения доставки пакетов, производительность UDP&lt;br /&gt;
 ; значительно выше. А во-вторых, при использовании UDP общая надежность не&lt;br /&gt;
 ; снижается, так как OpenVPN шифрует исходные пакеты, обеспечивая проверку&lt;br /&gt;
 ; ошибок и повторную передачу. В связи с этим TCP рекомендуется применять&lt;br /&gt;
 ; только в тех случаях, когда UDP не работает, например, если брандмауэр&lt;br /&gt;
 ; блокирует весь UDP-трафик.&lt;br /&gt;
 proto udp&lt;br /&gt;
 ; Выбираем тип виртуального устройства туннеля (tun, tap или null)&lt;br /&gt;
 dev tun0&lt;br /&gt;
 ; Включаем компрессию передаваемых данных&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 ; Указываем абсолютные пути к созданным сертификатам и ключам&lt;br /&gt;
 ca /etc/openvpn/keys/ca.crt&lt;br /&gt;
 cert /etc/openvpn/keys/server.crt&lt;br /&gt;
 key /etc/openvpn/keys/server.key&lt;br /&gt;
 dh /etc/openvpn/keys/dh1024.pem&lt;br /&gt;
 ; Значение 0 следует использовать на сервере, 1 - на клиенте&lt;br /&gt;
 tls-auth /etc/openvpn/keys/ta.key 0&lt;br /&gt;
 ; Для большинства сетей подойдет режим маршрутизатора (routed). Да, в этом&lt;br /&gt;
 ; случае широковещательный трафик отсутствует, соответственно, не будут работать&lt;br /&gt;
 ; некоторые протоколы, которые его используют, например NetBIOS поверх TCP. Но&lt;br /&gt;
 ; последнее нивелируется развертыванием WINS-сервера, либо подключением сетевых&lt;br /&gt;
 ; дисков/созданием ярлыков на расшаренные ресурсы&lt;br /&gt;
 server 192.168.3.0 255.255.255.0&lt;br /&gt;
 ; Проталкиваем подключенным клиентам статические маршруты, чтобы они могли&lt;br /&gt;
 ; получить доступ к ресурсам проводной и беспроводной сети&lt;br /&gt;
 push &amp;quot;route 192.168.1.0 255.255.255.0&amp;quot;&lt;br /&gt;
 push &amp;quot;route 192.168.2.0 255.255.255.0&amp;quot;&lt;br /&gt;
 ; Не позволяем соединению разорваться при простое&lt;br /&gt;
 keepalive 10 120&lt;br /&gt;
 ; Алгоритмы, используемые для аутентификации и шифрования пакетов&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Максимальное число одновременно подключенных VPN-пользователей&lt;br /&gt;
 max-clients 10&lt;br /&gt;
 ; Задаем файл журналирования событий и уровень детализации журнала, отображаем&lt;br /&gt;
 ; не более 20 экземпляров одного сообщения (остальные отбрасываем)&lt;br /&gt;
 log-append /var/log/openvpn.log&lt;br /&gt;
 verb 3&lt;br /&gt;
 mute 20&lt;br /&gt;
 ; Пользователь и группа, с правами которых работает демон&lt;br /&gt;
 user _openvpn&lt;br /&gt;
 group _openvpn&lt;br /&gt;
 ; Эти опции предотвращают доступ к некоторым ресурсам (например,&lt;br /&gt;
 ; tun-устройству) при перезапуске демона (рекомендуется применять только при&lt;br /&gt;
 ; снижении привилегий)&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 ; Сажаем демона в chroot-окружение&lt;br /&gt;
 chroot /var/empty&lt;br /&gt;
&lt;br /&gt;
Чтобы не вбивать директивы вручную, можно воспользоваться примером конфига, любезно предоставленным разработчиками:&lt;br /&gt;
 &lt;br /&gt;
 # cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Поднимаем виртуальный интерфейс tun0:&lt;br /&gt;
&lt;br /&gt;
 # echo &amp;quot;up&amp;quot; &amp;gt; /etc/hostname.tun0&lt;br /&gt;
 # sh /etc/netstart tun0&lt;br /&gt;
&lt;br /&gt;
Запускаем сервер OpenVPN командой:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
&lt;br /&gt;
Для автоматической загрузки OpenVPN достаточно прописать эту строчку в стартовый сценарий &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt;, например, так:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.local&lt;br /&gt;
 if [ -x /usr/local/sbin/openvpn ]; then&lt;br /&gt;
    echo -n &amp;#039; openvpn&amp;#039;; /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Далее смотрим в логи, чтобы убедиться в успешной загрузке нашего демона:&lt;br /&gt;
&lt;br /&gt;
 # tail /var/log/openvpn.log&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 IFCONFIG POOL: base=192.168.3.4 size=62&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 Initialization Sequence Completed&lt;br /&gt;
&lt;br /&gt;
Чтобы проверить состояние псевдоустройства туннелирования, можно воспользоваться утилитой &amp;lt;tt&amp;gt;ifconfig&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig tun0&lt;br /&gt;
 tun0: flags=8051&amp;lt;UP,POINTOPOINT,RUNNING,MULTICAST&amp;gt; mtu 1500&lt;br /&gt;
 groups: tun&lt;br /&gt;
 inet 192.168.3.1 --&amp;gt; 192.168.3.2 netmask 0xffffffff&lt;br /&gt;
&lt;br /&gt;
Для корректной работы сервера OpenVPN необходимо разрешить прохождение любого трафика через интерфейс OpenVPN, а также входящие подключения на внешний адрес сервера порт 1194/udp:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 pass quick on { lo tun0 $int_if } inet&lt;br /&gt;
 pass in on $ext_if inet proto udp from any to $ext_if port 1194 \&lt;br /&gt;
 keep state&lt;br /&gt;
&lt;br /&gt;
Перезагружаем набор рулесетов файервола:&lt;br /&gt;
&lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
== Инсталляция на стороне клиента ==&lt;br /&gt;
&lt;br /&gt;
Итак, VPN-сервер работает и готов принимать подключения. Развертывание VPN-клиентов для VPN-подключений удаленного доступа состоит из двух действий: установка программы OpenVPN GUI и правка конфигурационного файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client*.ovpn&amp;lt;/span&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 C:\Program Files\OpenVPN\config\mycompany_client1.ovpn&lt;br /&gt;
 ; Работаем в режиме клиента&lt;br /&gt;
 client&lt;br /&gt;
 dev tun&lt;br /&gt;
 ; Указываем IP-адрес и порт VPN-сервера&lt;br /&gt;
 remote 213.167.XX.YY 1194&lt;br /&gt;
 proto udp&lt;br /&gt;
 resolv-retry infinite&lt;br /&gt;
 nobind&lt;br /&gt;
 pull&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 verb 3&lt;br /&gt;
 ; Я предпочитаю хранить crt и key файлы на флешке&lt;br /&gt;
 ca &amp;quot;f:\\vpn\\mycompany\\ca.crt&amp;quot;&lt;br /&gt;
 cert &amp;quot;f:\\vpn\\mycompany\\client1.crt&amp;quot;&lt;br /&gt;
 key &amp;quot;f:\\vpn\\mycompany\\client1.key&amp;quot;&lt;br /&gt;
 tls-auth &amp;quot;f:\\vpn\\mycompany\\ta.key&amp;quot; 1&lt;br /&gt;
 ns-cert-type server&lt;br /&gt;
 ; Нижеследующие алгоритмы должны совпадать с теми, что заданы на сервере&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Без этих двух директив Vista-клиенты не смогут получать маршруты от сервера&lt;br /&gt;
 ; route-method exe&lt;br /&gt;
 ; route-delay 2&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения к VPN-серверу достаточно в трее щелкнуть правой кнопкой мыши на значке с красными мониторчиками, выбрать конфиг &amp;lt;tt&amp;gt;mycompany_client1&amp;lt;/tt&amp;gt; и нажать Connect.&lt;br /&gt;
&lt;br /&gt;
== Аутентификационный шлюз на базе pf и authpf ==&lt;br /&gt;
&lt;br /&gt;
В BSD-системах, используя связку пакетного фильтра pf и авторизационного шелла authpf, можно контролировать доступ клиентов, подключающихся к VPN-службе и корпоративной сети. Схема работы такой конструкции довольно проста: пользователь логинится по ssh, и, в зависимости от введенных данных (имя и пароль), на сервере вступают в силу персональные правила файервола, в данном случае разрешающие прохождение UDP-пакетов к порту 1194.&lt;br /&gt;
Но прежде, чем производить настройку &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, необходимо переопределить некоторые дефолтные значения переменных демона [http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html sshd(8)]. Так мы усложним потенциальному злоумышленнику успешное проведение атаки с целью перехвата и подмены ssh-сессии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/ssh/sshd_config&lt;br /&gt;
 # Работаем с использованием протоколов IPv4 и ssh2&lt;br /&gt;
 AddressFamily inet&lt;br /&gt;
 Protocol 2&lt;br /&gt;
 # Ожидаем подключения по всем доступным сетевым интерфейсам&lt;br /&gt;
 ListenAddress 0.0.0.0&lt;br /&gt;
 # Запрещаем регистрацию root&amp;#039;а и применение пустых паролей&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 PermitEmptyPasswords no&lt;br /&gt;
 # За счет использования протокола ssh2 и этих двух опций усложняем проведение&lt;br /&gt;
 # атак типа ARP- и IP-spoofing&lt;br /&gt;
 ClientAliveInterval 15&lt;br /&gt;
 ClientAliveCountMax 3&lt;br /&gt;
 # Отключаем DNS-резолвинг&lt;br /&gt;
 UseDNS no&lt;br /&gt;
 # Определяем списки контроля доступом&lt;br /&gt;
 AllowGroups wheel users authpf&lt;br /&gt;
&lt;br /&gt;
Для того чтобы внесенные изменения вступили в силу, необходимо дать указание демону перечитать свой конфиг:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `sed q /var/run/sshd.pid`&lt;br /&gt;
&lt;br /&gt;
Authpf представляет собой псевдооболочку, которая назначается пользователю системы в качестве &amp;lt;tt&amp;gt;login shell&amp;lt;/tt&amp;gt; (примечание: запись «&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/sbin/authpf&amp;lt;/span&amp;gt;» в файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/shells&amp;lt;/span&amp;gt; добавлять не следует). При авторизации пользователя по ssh к текущим правилам фильтра пакетов с помощью так называемых якорей &amp;lt;tt&amp;gt;(anchors)&amp;lt;/tt&amp;gt; будут присоединены правила, указанные в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/authpf.rules&amp;lt;/span&amp;gt;, либо в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/users/$USER&amp;lt;/span&amp;gt;. В добавляемых правилах допускается использование зарезервированных макросов &amp;lt;tt&amp;gt;$user_id&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;$user_ip&amp;lt;/tt&amp;gt;, за счет которых будет происходить автоматическая подстановка имени и IP-адреса подключившегося пользователя (значения макросов считываются из переменных окружения ssh автоматически).&lt;br /&gt;
В конец файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;[http://www.openbsd.org/cgi-bin/man.cgi?query=login.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html login.conf(5)]&amp;lt;/span&amp;gt; заносим сведения о новом классе &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, пользователи которого в качестве стандартного шелла будут получать authpf:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/login.conf&lt;br /&gt;
 authpf:\&lt;br /&gt;
   :shell=/usr/sbin/authpf:\&lt;br /&gt;
   :tc=default:&lt;br /&gt;
&lt;br /&gt;
С помощью штатной утилиты [http://www.openbsd.org/cgi-bin/man.cgi?query=cap_mkdb&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html cap_mkdb(1)] обновляем хэшированную базу данных &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/login.conf.db&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # cap_mkdb /etc/login.conf&lt;br /&gt;
&lt;br /&gt;
Мы не будем переопределять умолчальные значения директив &amp;lt;tt&amp;gt;anchor&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;table&amp;lt;/tt&amp;gt;, поэтому файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;authpf.conf&amp;lt;/span&amp;gt; оставляем пустым:&lt;br /&gt;
&lt;br /&gt;
 # echo -n &amp;gt; /etc/authpf/authpf.conf&lt;br /&gt;
&lt;br /&gt;
Подготавливаем приветственное сообщение authpf.message (аналог /etc/motd):&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/authpf.message&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
Создаем нового пользователя, который принадлежит классу authpf, входит в группу authpf и в качестве оболочки получает /usr/sbin/authpf:&lt;br /&gt;
&lt;br /&gt;
 # useradd -m -c &amp;#039;authpf vpn user&amp;#039; -g authpf -L authpf \&lt;br /&gt;
 -s /usr/sbin/authpf client1&lt;br /&gt;
 # passwd client1&lt;br /&gt;
&lt;br /&gt;
Рисуем правило файервола, разрешающее пользователю client1 доступ к серверу OpenVPN:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/authpf/users/client1&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/users/client1/authpf.rules&lt;br /&gt;
 pass in log quick on fxp0 inet proto udp from $user_ip to fxp0 \&lt;br /&gt;
 port 1194 keep state&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения механизма якорей добавим следующие записи в [http://www.openbsd.org/cgi-bin/man.cgi?query=pf.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html pf.conf(5)]:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 nat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 rdr-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 binat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 pass in log on $ext_if inet proto tcp to fxp0 port ssh keep state&lt;br /&gt;
 ...&lt;br /&gt;
 anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
И перезагрузим набор рулесетов файервола:&lt;br /&gt;
 &lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
На стороне клиента открываем любой ssh-клиент, например, Putty или SecureCRT, создаем новую сессию, указываем IP-адрес сервера и имя пользователя. Если все настроено правильно, после успешной авторизации правила файервола на сервере для этого пользователя изменятся, и он получит доступ к VPN-службе.&lt;br /&gt;
&lt;br /&gt;
 # f:\vpn\putty&amp;gt; plink.exe -pw mypassword client1@213.167.XX.YY&lt;br /&gt;
 Hello client1. You are authenticated from host &amp;quot;77.41.XX.YY&amp;quot;&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
А чтобы постоянно не вводить пароль, можно настроить аутентификацию на базе публичного ключа.&lt;br /&gt;
&lt;br /&gt;
== Эндшпиль ==&lt;br /&gt;
&lt;br /&gt;
Эта статья включает полный набор пошаговых действий, необходимых для внедрения базового VPN-решения удаленного доступа, используя BSD-систему в качестве VPN-сервера и WinXP/Vista в качестве VPN-клиента. Развернув в 3-4 компаниях подобную конфигурацию, ты сможешь не с пустыми кредиткой и кошельком ехать в Египет греть пятки. Удачи.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=195</id>
		<title>Деликатное проникновение в частную сеть</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=195"/>
		<updated>2013-06-05T12:02:09Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Серверная инсталляция */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Статья [http://www.xakep.ru/magazine/xa/110/156/1.asp опубликована] в февральском номере журнала Хакер за 2008 год. Автор оригинального текста: Andrey Matveev (andrey at openbsd dot ru). &lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Когда речь заходит о необходимости предоставления авторизированному пользователю доступа к защищенным ресурсам частной сети, на ум сразу приходят примеры построения VPN на базе IPSec, PPTP, L2TP и SSL. Однако если требуется в кратчайшие сроки развернуть бесплатное, кроссплатформенное, полнофункциональное ПО с гибкими возможностями конфигурирования и относительно простой установкой, не требующей вмешательства в ядро ОС, то из всех доступных решений выбор невольно падает на OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Поем дифирамбы OpenVPN ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN является реализацией технологии VPN с использованием протокола SSL/TLS. С его помощью можно поднять надежный, достаточно быстрый и в то же время защищенный от прослушивания и вмешательства злоумышленников криптотуннель поверх общедоступной сети, такой, как Интернет. В двух словах схему работы этого приложения можно описать следующим образом: любой сетевой трафик, посылаемый или принимаемый для сетевого адаптера, инкапсулируется в зашифрованный пакет и доставляется в другой конечный пункт туннеля OpenVPN, где данные расшифровываются и попадают в удаленную сеть.&lt;br /&gt;
К числу основных преимуществ применения OpenVPN стоит отнести:&lt;br /&gt;
&lt;br /&gt;
* высокая переносимость между платформами – пакет работает на Windows 2000/XP/2003/Vista, Linux, Free/Net/OpenBSD, Mac OS X и Solaris;&lt;br /&gt;
* поддержка режимов маршрутизации (routed) и моста (bridged), другими словами, нам под силу туннелировать как IP-пакеты, так и Ethernet-фреймы;&lt;br /&gt;
* для транспорта можно использовать UDP/TCP;&lt;br /&gt;
* клиентские хосты могут иметь статические и динамические IP-адреса;&lt;br /&gt;
* туннели можно создавать поверх NAT;&lt;br /&gt;
* работа через межсетевые экраны, в которых реализован контроль состояния соединений (достигается за счет отправки через определенные промежутки времени echo-запросов);&lt;br /&gt;
* ассиметричное шифрование с использованием статических ключей и SSL/TLS сертификатов;&lt;br /&gt;
* встроенные меры безопасности для предотвращения DoS-атак и повторного проигрывания злоумышленником последовательности записанных пакетов;&lt;br /&gt;
* адаптивная компрессия передаваемых данных;&lt;br /&gt;
* способность &amp;quot;проталкивать&amp;quot; маршруты для клиента;&lt;br /&gt;
* использование всех механизмов шифрования, встроенных в библиотеку OpenSSL;&lt;br /&gt;
* работа в chroot-окружении;&lt;br /&gt;
* поддержка мультипоточной библиотеки pthread (положительно влияет на быстродействие при динамическом обмене SSL/TLS ключами). &lt;br /&gt;
&lt;br /&gt;
Как видишь, список возможностей впечатляет, но в отличие от других SSL VPN, достоинством которых считается безклиентская установка (соединение SSL VPN устанавливается через браузер), для OpenVPN необходим специальный клиент (поговорим об этом ниже).&lt;br /&gt;
&lt;br /&gt;
== Увертюра к основному действию ==&lt;br /&gt;
&lt;br /&gt;
Предположим, одним прекрасным солнечным утром твое высокое начальство впечатлилось идеей создания виртуальной частной сети, и теперь перед тобой стоит задача поднять VPN-сервер для служащих, которым требуется работать с корпоративными ресурсами, находясь вне стен офиса (это могут быть надомные, командировочные сотрудники или просто фрилансеры).&lt;br /&gt;
Функции шлюза компании, выпускающего сотрудников в Интернет, выполняет компьютер с тремя сетевыми картами (213.167.XX.YY, 192.168.1.1, 192.168.2.1) под управлением… хотя это не так важно, настройки в поддерживаемых операционках будут отличаться минимально. В моем случае на сервере заказчика была установлена OpenBSD 3.9. Что касается корпоративной внутренней сети, то она состоит из двух участков: проводного (192.168.1.0/24) и беспроводного (192.168.2.0/24). После рекогносцировки на местности переходим к установке OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Серверная инсталляция ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN без труда можно найти в любом репозитарии или дереве портов:&lt;br /&gt;
&lt;br /&gt;
 # cd /usr/ports/net/openvpn&lt;br /&gt;
 # make install clean&lt;br /&gt;
&lt;br /&gt;
В случае установки из исходных кодов в некоторых системах может понадобиться отключить поддержку реализации потоков выполнения и указать местоположение библиотек и заголовочных файлов &amp;lt;tt&amp;gt;lzo&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ./configure --disable-pthread --with-lzo-lib=/usr/local/lib \&lt;br /&gt;
 --with-lzoheaders=/usr/local/include&lt;br /&gt;
 # make&lt;br /&gt;
 # make install&lt;br /&gt;
&lt;br /&gt;
Для проверки с помощью следующих команд можно посмотреть, какие дайджесты (применяются для аутентификации каждой получаемой UDP-датаграммы) и алгоритмы шифрования доступны:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-digests&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-ciphers&lt;br /&gt;
&lt;br /&gt;
Чтобы обеспечить дополнительный уровень защиты и избежать возможный ущерб при взломе, нужно дать указание демону OpenVPN работать с правами непривилегированного пользователя в chroot’ной среде — среде с измененным корневым каталогом. Первый шаг для этого — добавить в систему группу &amp;lt;tt&amp;gt;_openvpn&amp;lt;/tt&amp;gt; и одноименного пользователя:&lt;br /&gt;
&lt;br /&gt;
 # groupadd -g 500 _openvpn&lt;br /&gt;
 # useradd -u 500 -g 500 -c &amp;#039;OpenVPN Server&amp;#039; -s /sbin/nologin \&lt;br /&gt;
 -d /var/openvpn -m _openvpn&lt;br /&gt;
&lt;br /&gt;
Проверяем правильность выполнения двух последних команд:&lt;br /&gt;
&lt;br /&gt;
 # grep 500 /etc/passwd&lt;br /&gt;
 _openvpn:*:500:500:OpenVPN Server:/var/openvpn:/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
== Золотые ключики и подарочные сертификаты ==&lt;br /&gt;
&lt;br /&gt;
Думаю, ни для кого не секрет, что сертификаты открытых ключей предоставляют удобный и надежный способ аутентификации пользователей, поэтому не будем сейчас тратить время на теоретическую часть и перейдем непосредственно к процедуре генерирования надлежащих сертификатов.&lt;br /&gt;
Создаем директорию, где будут лежать конфигурационные файлы, скрипты и сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/openvpn/keys&lt;br /&gt;
&lt;br /&gt;
Копируем комплект скриптов easy-rsa, предназначенный для упрощения создания сертификатов, которые предъявляются в процессе аутентификации для подтверждения валидности клиентов. Теперь о монстроидальных командах openssl можно забыть.&lt;br /&gt;
&lt;br /&gt;
 # cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Далее следует экспортировать переменные KEY_*, они необходимы для работы build-* скриптов:&lt;br /&gt;
&lt;br /&gt;
 # cd /etc/openvpn/easy-rsa&lt;br /&gt;
 # . ./vars&lt;br /&gt;
&lt;br /&gt;
Инициализируем директорию /etc/openvpn/easy-rsa/keys:&lt;br /&gt;
&lt;br /&gt;
 # ./clean-all&lt;br /&gt;
&lt;br /&gt;
Создаем корневой и серверный сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # ./build-ca&lt;br /&gt;
 # ./build-key-server server&lt;br /&gt;
&lt;br /&gt;
Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, выполняем:&lt;br /&gt;
 &lt;br /&gt;
 # ./build-dh&lt;br /&gt;
&lt;br /&gt;
Снизить вероятность успешного проведения DoS-атаки на сервер OpenVPN можно за счет использования клиентом и сервером статического ключа HMAC (так называемый shared secret):&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --genkey --secret keys/ta.key&lt;br /&gt;
&lt;br /&gt;
Перемещаем все созданные файлы в подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;keys&amp;lt;/span&amp;gt; и выставляем для них корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # cd keys/&lt;br /&gt;
 # mv ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys&lt;br /&gt;
 # chown -R root:wheel /etc/openvpn&lt;br /&gt;
 # chmod 700 /etc/openvpn/keys&lt;br /&gt;
 # chmod 644 /etc/openvpn/keys/{ca.crt,dh1024.pem,server.crt}&lt;br /&gt;
 # chmod 600 /etc/openvpn/keys/{server.key,ta.key}&lt;br /&gt;
&lt;br /&gt;
Процедура создания клиентских сертификатов практически аналогична соответствующей процедуре для сервера:&lt;br /&gt;
&lt;br /&gt;
 # ./build-key client1&lt;br /&gt;
 # mkdir -p /home/vpn/client1&lt;br /&gt;
 # mv client1.crt client1.key /home/vpn/client1&lt;br /&gt;
 # cp /etc/openvpn/keys/{ca.crt,ta.key} /home/vpn/client1&lt;br /&gt;
&lt;br /&gt;
Теперь подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client1&amp;lt;/span&amp;gt; следует перенести на винч или флешку «географически изолированного» сотрудника.&lt;br /&gt;
&lt;br /&gt;
== Щепетильное конфигурирование ==&lt;br /&gt;
&lt;br /&gt;
Конфигурация сервера OpenVPN хранится в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/openvpn/server.conf&amp;lt;/span&amp;gt;. Ниже приведен пример подобного конфига. Все опции детально прокомментированы, поэтому сложностей возникнуть не должно. При настройке старайся «не срезать углы» — за один шаг добавляй/изменяй что-то одно и сразу же тестируй. Все действия в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;server.conf&amp;lt;/span&amp;gt; желательно фиксировать в локальном cvs-репозитории, чтобы можно было быстро просмотреть историю изменений и вернуться к рабочей ревизии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/openvpn/server.conf&lt;br /&gt;
 ; Работаем в режиме демона&lt;br /&gt;
 daemon openvpn&lt;br /&gt;
 ; Указываем местоположение файла с уникальным идентификатором процесса сервера&lt;br /&gt;
 ; OpenVPN&lt;br /&gt;
 writepid /var/openvpn/pid&lt;br /&gt;
 ; Определяем файл, содержащий список текущих клиентских соединений&lt;br /&gt;
 status /var/openvpn/status 10&lt;br /&gt;
 ; Внешний IP-адрес нашего сервера&lt;br /&gt;
 local 213.167.XX.YY&lt;br /&gt;
 ; Используемый порт&lt;br /&gt;
 port 1194&lt;br /&gt;
 ; Для транспорта по умолчанию применяется протокол UDP. Это вполне резонный&lt;br /&gt;
 ; подход. Во-первых, благодаря меньшему размеру заголовков и отсутствию&lt;br /&gt;
 ; встроенной функции подтверждения доставки пакетов, производительность UDP&lt;br /&gt;
 ; значительно выше. А во-вторых, при использовании UDP общая надежность не&lt;br /&gt;
 ; снижается, так как OpenVPN шифрует исходные пакеты, обеспечивая проверку&lt;br /&gt;
 ; ошибок и повторную передачу. В связи с этим TCP рекомендуется применять&lt;br /&gt;
 ; только в тех случаях, когда UDP не работает, например, если брандмауэр&lt;br /&gt;
 ; блокирует весь UDP-трафик.&lt;br /&gt;
 proto udp&lt;br /&gt;
 ; Выбираем тип виртуального устройства туннеля (tun, tap или null)&lt;br /&gt;
 dev tun0&lt;br /&gt;
 ; Включаем компрессию передаваемых данных&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 ; Указываем абсолютные пути к созданным сертификатам и ключам&lt;br /&gt;
 ca /etc/openvpn/keys/ca.crt&lt;br /&gt;
 cert /etc/openvpn/keys/server.crt&lt;br /&gt;
 key /etc/openvpn/keys/server.key&lt;br /&gt;
 dh /etc/openvpn/keys/dh1024.pem&lt;br /&gt;
 ; Значение 0 следует использовать на сервере, 1 - на клиенте&lt;br /&gt;
 tls-auth /etc/openvpn/keys/ta.key 0&lt;br /&gt;
 ; Для большинства сетей подойдет режим маршрутизатора (routed). Да, в этом&lt;br /&gt;
 ; случае широковещательный трафик отсутствует, соответственно, не будут работать&lt;br /&gt;
 ; некоторые протоколы, которые его используют, например NetBIOS поверх TCP. Но&lt;br /&gt;
 ; последнее нивелируется развертыванием WINS-сервера, либо подключением сетевых&lt;br /&gt;
 ; дисков/созданием ярлыков на расшаренные ресурсы&lt;br /&gt;
 server 192.168.3.0 255.255.255.0&lt;br /&gt;
 ; Проталкиваем подключенным клиентам статические маршруты, чтобы они могли&lt;br /&gt;
 ; получить доступ к ресурсам проводной и беспроводной сети&lt;br /&gt;
 push &amp;quot;route 192.168.1.0 255.255.255.0&amp;quot;&lt;br /&gt;
 push &amp;quot;route 192.168.2.0 255.255.255.0&amp;quot;&lt;br /&gt;
 ; Не позволяем соединению разорваться при простое&lt;br /&gt;
 keepalive 10 120&lt;br /&gt;
 ; Алгоритмы, используемые для аутентификации и шифрования пакетов&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Максимальное число одновременно подключенных VPN-пользователей&lt;br /&gt;
 max-clients 10&lt;br /&gt;
 ; Задаем файл журналирования событий и уровень детализации журнала, отображаем&lt;br /&gt;
 ; не более 20 экземпляров одного сообщения (остальные отбрасываем)&lt;br /&gt;
 log-append /var/log/openvpn.log&lt;br /&gt;
 verb 3&lt;br /&gt;
 mute 20&lt;br /&gt;
 ; Пользователь и группа, с правами которых работает демон&lt;br /&gt;
 user _openvpn&lt;br /&gt;
 group _openvpn&lt;br /&gt;
 ; Эти опции предотвращают доступ к некоторым ресурсам (например,&lt;br /&gt;
 ; tun-устройству) при перезапуске демона (рекомендуется применять только при&lt;br /&gt;
 ; снижении привилегий)&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 ; Сажаем демона в chroot-окружение&lt;br /&gt;
 chroot /var/empty&lt;br /&gt;
&lt;br /&gt;
Чтобы не вбивать директивы вручную, можно воспользоваться примером конфига, любезно предоставленным разработчиками:&lt;br /&gt;
 &lt;br /&gt;
 # cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Поднимаем виртуальный интерфейс tun0:&lt;br /&gt;
&lt;br /&gt;
 # echo &amp;quot;up&amp;quot; &amp;gt; /etc/hostname.tun0&lt;br /&gt;
 # sh /etc/netstart tun0&lt;br /&gt;
&lt;br /&gt;
Запускаем сервер OpenVPN командой:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
&lt;br /&gt;
Для автоматической загрузки OpenVPN достаточно прописать эту строчку в стартовый сценарий &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt;, например, так:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.local&lt;br /&gt;
 if [ -x /usr/local/sbin/openvpn ]; then&lt;br /&gt;
    echo -n &amp;#039; openvpn&amp;#039;; /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Далее смотрим в логи, чтобы убедиться в успешной загрузке нашего демона:&lt;br /&gt;
&lt;br /&gt;
 # tail /var/log/openvpn.log&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 IFCONFIG POOL: base=192.168.3.4 size=62&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 Initialization Sequence Completed&lt;br /&gt;
&lt;br /&gt;
Чтобы проверить состояние псевдоустройства туннелирования, можно воспользоваться утилитой &amp;lt;tt&amp;gt;ifconfig&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig tun0&lt;br /&gt;
 tun0: flags=8051&amp;lt;UP,POINTOPOINT,RUNNING,MULTICAST&amp;gt; mtu 1500&lt;br /&gt;
 groups: tun&lt;br /&gt;
 inet 192.168.3.1 --&amp;gt; 192.168.3.2 netmask 0xffffffff&lt;br /&gt;
&lt;br /&gt;
Для корректной работы сервера OpenVPN необходимо разрешить прохождение любого трафика через интерфейс OpenVPN, а также входящие подключения на внешний адрес сервера порт 1194/udp:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 pass quick on { lo tun0 $int_if } inet&lt;br /&gt;
 pass in on $ext_if inet proto udp from any to $ext_if port 1194 \&lt;br /&gt;
 keep state&lt;br /&gt;
&lt;br /&gt;
Перезагружаем набор рулесетов файервола:&lt;br /&gt;
&lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
== Инсталляция на стороне клиента ==&lt;br /&gt;
&lt;br /&gt;
Итак, VPN-сервер работает и готов принимать подключения. Развертывание VPN-клиентов для VPN-подключений удаленного доступа состоит из двух действий: установка программы OpenVPN GUI и правка конфигурационного файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client*.ovpn&amp;lt;/span&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 C:\Program Files\OpenVPN\config\mycompany_client1.ovpn&lt;br /&gt;
 ; Работаем в режиме клиента&lt;br /&gt;
 client&lt;br /&gt;
 dev tun&lt;br /&gt;
 ; Указываем IP-адрес и порт VPN-сервера&lt;br /&gt;
 remote 213.167.XX.YY 1194&lt;br /&gt;
 proto udp&lt;br /&gt;
 resolv-retry infinite&lt;br /&gt;
 nobind&lt;br /&gt;
 pull&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 verb 3&lt;br /&gt;
 ; Я предпочитаю хранить crt и key файлы на флешке&lt;br /&gt;
 ca &amp;quot;f:\\vpn\\mycompany\\ca.crt&amp;quot;&lt;br /&gt;
 cert &amp;quot;f:\\vpn\\mycompany\\client1.crt&amp;quot;&lt;br /&gt;
 key &amp;quot;f:\\vpn\\mycompany\\client1.key&amp;quot;&lt;br /&gt;
 tls-auth &amp;quot;f:\\vpn\\mycompany\\ta.key&amp;quot; 1&lt;br /&gt;
 ns-cert-type server&lt;br /&gt;
 ; Нижеследующие алгоритмы должны совпадать с теми, что заданы на сервере&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Без этих двух директив Vista-клиенты не смогут получать маршруты от сервера&lt;br /&gt;
 ; route-method exe&lt;br /&gt;
 ; route-delay 2&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения к VPN-серверу достаточно в трее щелкнуть правой кнопкой мыши на значке с красными мониторчиками, выбрать конфиг &amp;lt;tt&amp;gt;mycompany_client1&amp;lt;/tt&amp;gt; и нажать Connect.&lt;br /&gt;
&lt;br /&gt;
== Аутентификационный шлюз на базе pf и authpf ==&lt;br /&gt;
&lt;br /&gt;
В BSD-системах, используя связку пакетного фильтра pf и авторизационного шелла authpf, можно контролировать доступ клиентов, подключающихся к VPN-службе и корпоративной сети. Схема работы такой конструкции довольно проста: пользователь логинится по ssh, и, в зависимости от введенных данных (имя и пароль), на сервере вступают в силу персональные правила файервола, в данном случае разрешающие прохождение UDP-пакетов к порту 1194.&lt;br /&gt;
Но прежде, чем производить настройку &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, необходимо переопределить некоторые дефолтные значения переменных демона [http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html sshd(8)]. Так мы усложним потенциальному злоумышленнику успешное проведение атаки с целью перехвата и подмены ssh-сессии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/ssh/sshd_config&lt;br /&gt;
 # Работаем с использованием протоколов IPv4 и ssh2&lt;br /&gt;
 AddressFamily inet&lt;br /&gt;
 Protocol 2&lt;br /&gt;
 # Ожидаем подключения по всем доступным сетевым интерфейсам&lt;br /&gt;
 ListenAddress 0.0.0.0&lt;br /&gt;
 # Запрещаем регистрацию root&amp;#039;а и применение пустых паролей&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 PermitEmptyPasswords no&lt;br /&gt;
 # За счет использования протокола ssh2 и этих двух опций усложняем проведение&lt;br /&gt;
 # атак типа ARP- и IP-spoofing&lt;br /&gt;
 ClientAliveInterval 15&lt;br /&gt;
 ClientAliveCountMax 3&lt;br /&gt;
 # Отключаем DNS-резолвинг&lt;br /&gt;
 UseDNS no&lt;br /&gt;
 # Определяем списки контроля доступом&lt;br /&gt;
 AllowGroups wheel users authpf&lt;br /&gt;
&lt;br /&gt;
Для того чтобы внесенные изменения вступили в силу, необходимо дать указание демону перечитать свой конфиг:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `sed q /var/run/sshd.pid`&lt;br /&gt;
&lt;br /&gt;
Authpf представляет собой псевдооболочку, которая назначается пользователю системы в качестве &amp;lt;tt&amp;gt;login shell&amp;lt;/tt&amp;gt; (примечание: запись «&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/sbin/authpf&amp;lt;/span&amp;gt;» в файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/shells&amp;lt;/span&amp;gt; добавлять не следует). При авторизации пользователя по ssh к текущим правилам фильтра пакетов с помощью так называемых якорей &amp;lt;tt&amp;gt;(anchors)&amp;lt;/tt&amp;gt; будут присоединены правила, указанные в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/authpf.rules&amp;lt;/span&amp;gt;, либо в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/users/$USER&amp;lt;/span&amp;gt;. В добавляемых правилах допускается использование зарезервированных макросов &amp;lt;tt&amp;gt;$user_id&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;$user_ip&amp;lt;/tt&amp;gt;, за счет которых будет происходить автоматическая подстановка имени и IP-адреса подключившегося пользователя (значения макросов считываются из переменных окружения ssh автоматически).&lt;br /&gt;
В конец файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;[http://www.openbsd.org/cgi-bin/man.cgi?query=login.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html login.conf(5)]&amp;lt;/span&amp;gt; заносим сведения о новом классе &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, пользователи которого в качестве стандартного шелла будут получать authpf:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/login.conf&lt;br /&gt;
 authpf:\&lt;br /&gt;
   :shell=/usr/sbin/authpf:\&lt;br /&gt;
   :tc=default:&lt;br /&gt;
&lt;br /&gt;
С помощью штатной утилиты [http://www.openbsd.org/cgi-bin/man.cgi?query=cap_mkdb&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html cap_mkdb(1)] обновляем хэшированную базу данных &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/login.conf.db&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # cap_mkdb /etc/login.conf&lt;br /&gt;
&lt;br /&gt;
Мы не будем переопределять умолчальные значения директив &amp;lt;tt&amp;gt;anchor&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;table&amp;lt;/tt&amp;gt;, поэтому файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;authpf.conf&amp;lt;/span&amp;gt; оставляем пустым:&lt;br /&gt;
&lt;br /&gt;
 # echo -n &amp;gt; /etc/authpf/authpf.conf&lt;br /&gt;
&lt;br /&gt;
Подготавливаем приветственное сообщение authpf.message (аналог /etc/motd):&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/authpf.message&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
Создаем нового пользователя, который принадлежит классу authpf, входит в группу authpf и в качестве оболочки получает /usr/sbin/authpf:&lt;br /&gt;
&lt;br /&gt;
 # useradd -m -c &amp;#039;authpf vpn user&amp;#039; -g authpf -L authpf \&lt;br /&gt;
 -s /usr/sbin/authpf client1&lt;br /&gt;
 # passwd client1&lt;br /&gt;
&lt;br /&gt;
Рисуем правило файервола, разрешающее пользователю client1 доступ к серверу OpenVPN:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/authpf/users/client1&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/users/client1/authpf.rules&lt;br /&gt;
 pass in log quick on fxp0 inet proto udp from $user_ip to fxp0 \&lt;br /&gt;
 port 1194 keep state&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения механизма якорей добавим следующие записи в [http://www.openbsd.org/cgi-bin/man.cgi?query=pf.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html pf.conf(5)]:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 nat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 rdr-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 binat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 pass in log on $ext_if inet proto tcp to fxp0 port ssh keep state&lt;br /&gt;
 ...&lt;br /&gt;
 anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
И перезагрузим набор рулесетов файервола:&lt;br /&gt;
 &lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
На стороне клиента открываем любой ssh-клиент, например, Putty или SecureCRT, создаем новую сессию, указываем IP-адрес сервера и имя пользователя. Если все настроено правильно, после успешной авторизации правила файервола на сервере для этого пользователя изменятся, и он получит доступ к VPN-службе.&lt;br /&gt;
&lt;br /&gt;
 # f:\vpn\putty&amp;gt; plink.exe -pw mypassword client1@213.167.XX.YY&lt;br /&gt;
 Hello client1. You are authenticated from host &amp;quot;77.41.XX.YY&amp;quot;&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
А чтобы постоянно не вводить пароль, можно настроить аутентификацию на базе публичного ключа.&lt;br /&gt;
&lt;br /&gt;
== Эндшпиль ==&lt;br /&gt;
&lt;br /&gt;
Эта статья включает полный набор пошаговых действий, необходимых для внедрения базового VPN-решения удаленного доступа, используя BSD-систему в качестве VPN-сервера и WinXP/Vista в качестве VPN-клиента. Развернув в 3-4 компаниях подобную конфигурацию, ты сможешь не с пустыми кредиткой и кошельком ехать в Египет греть пятки. Удачи.&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=194</id>
		<title>Деликатное проникновение в частную сеть</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=194"/>
		<updated>2013-06-05T12:01:04Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Серверная инсталляция */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Статья [http://www.xakep.ru/magazine/xa/110/156/1.asp опубликована] в февральском номере журнала Хакер за 2008 год. Автор оригинального текста: Andrey Matveev (andrey at openbsd dot ru). &lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Когда речь заходит о необходимости предоставления авторизированному пользователю доступа к защищенным ресурсам частной сети, на ум сразу приходят примеры построения VPN на базе IPSec, PPTP, L2TP и SSL. Однако если требуется в кратчайшие сроки развернуть бесплатное, кроссплатформенное, полнофункциональное ПО с гибкими возможностями конфигурирования и относительно простой установкой, не требующей вмешательства в ядро ОС, то из всех доступных решений выбор невольно падает на OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Поем дифирамбы OpenVPN ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN является реализацией технологии VPN с использованием протокола SSL/TLS. С его помощью можно поднять надежный, достаточно быстрый и в то же время защищенный от прослушивания и вмешательства злоумышленников криптотуннель поверх общедоступной сети, такой, как Интернет. В двух словах схему работы этого приложения можно описать следующим образом: любой сетевой трафик, посылаемый или принимаемый для сетевого адаптера, инкапсулируется в зашифрованный пакет и доставляется в другой конечный пункт туннеля OpenVPN, где данные расшифровываются и попадают в удаленную сеть.&lt;br /&gt;
К числу основных преимуществ применения OpenVPN стоит отнести:&lt;br /&gt;
&lt;br /&gt;
* высокая переносимость между платформами – пакет работает на Windows 2000/XP/2003/Vista, Linux, Free/Net/OpenBSD, Mac OS X и Solaris;&lt;br /&gt;
* поддержка режимов маршрутизации (routed) и моста (bridged), другими словами, нам под силу туннелировать как IP-пакеты, так и Ethernet-фреймы;&lt;br /&gt;
* для транспорта можно использовать UDP/TCP;&lt;br /&gt;
* клиентские хосты могут иметь статические и динамические IP-адреса;&lt;br /&gt;
* туннели можно создавать поверх NAT;&lt;br /&gt;
* работа через межсетевые экраны, в которых реализован контроль состояния соединений (достигается за счет отправки через определенные промежутки времени echo-запросов);&lt;br /&gt;
* ассиметричное шифрование с использованием статических ключей и SSL/TLS сертификатов;&lt;br /&gt;
* встроенные меры безопасности для предотвращения DoS-атак и повторного проигрывания злоумышленником последовательности записанных пакетов;&lt;br /&gt;
* адаптивная компрессия передаваемых данных;&lt;br /&gt;
* способность &amp;quot;проталкивать&amp;quot; маршруты для клиента;&lt;br /&gt;
* использование всех механизмов шифрования, встроенных в библиотеку OpenSSL;&lt;br /&gt;
* работа в chroot-окружении;&lt;br /&gt;
* поддержка мультипоточной библиотеки pthread (положительно влияет на быстродействие при динамическом обмене SSL/TLS ключами). &lt;br /&gt;
&lt;br /&gt;
Как видишь, список возможностей впечатляет, но в отличие от других SSL VPN, достоинством которых считается безклиентская установка (соединение SSL VPN устанавливается через браузер), для OpenVPN необходим специальный клиент (поговорим об этом ниже).&lt;br /&gt;
&lt;br /&gt;
== Увертюра к основному действию ==&lt;br /&gt;
&lt;br /&gt;
Предположим, одним прекрасным солнечным утром твое высокое начальство впечатлилось идеей создания виртуальной частной сети, и теперь перед тобой стоит задача поднять VPN-сервер для служащих, которым требуется работать с корпоративными ресурсами, находясь вне стен офиса (это могут быть надомные, командировочные сотрудники или просто фрилансеры).&lt;br /&gt;
Функции шлюза компании, выпускающего сотрудников в Интернет, выполняет компьютер с тремя сетевыми картами (213.167.XX.YY, 192.168.1.1, 192.168.2.1) под управлением… хотя это не так важно, настройки в поддерживаемых операционках будут отличаться минимально. В моем случае на сервере заказчика была установлена OpenBSD 3.9. Что касается корпоративной внутренней сети, то она состоит из двух участков: проводного (192.168.1.0/24) и беспроводного (192.168.2.0/24). После рекогносцировки на местности переходим к установке OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Серверная инсталляция ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN без труда можно найти в любом репозитарии или дереве портов:&lt;br /&gt;
&lt;br /&gt;
 # cd /usr/ports/net/openvpn&lt;br /&gt;
 # make install clean&lt;br /&gt;
&lt;br /&gt;
В случае установки из исходных кодов в некоторых системах может понадобиться отключить поддержку реализации потоков выполнения и указать местоположение библиотек и заголовочных файлов &amp;lt;tt&amp;gt;lzo&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ./configure --disable-pthread --with-lzo-lib=/usr/local/lib \&lt;br /&gt;
 --with-lzoheaders=/usr/local/include&lt;br /&gt;
 # make&lt;br /&gt;
 # make install&lt;br /&gt;
&lt;br /&gt;
Для проверки с помощью следующих команд можно посмотреть, какие дайджесты (применяются для аутентификации каждой получаемой UDP-датаграммы) и алгоритмы шифрования доступны:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-digests&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-ciphers&lt;br /&gt;
&lt;br /&gt;
Чтобы обеспечить дополнительный уровень защиты и избежать возможный ущерб при взломе, нужно дать указание демону OpenVPN работать с правами непривилегированного пользователя в chroot’ной среде — среде с измененным корневым каталогом. Первый шаг для этого — добавить в систему группу _openvpn и одноименного пользователя:&lt;br /&gt;
&lt;br /&gt;
 # groupadd -g 500 _openvpn&lt;br /&gt;
 # useradd -u 500 -g 500 -c &amp;#039;OpenVPN Server&amp;#039; -s /sbin/nologin \&lt;br /&gt;
 -d /var/openvpn -m _openvpn&lt;br /&gt;
&lt;br /&gt;
Проверяем правильность выполнения двух последних команд:&lt;br /&gt;
&lt;br /&gt;
 # grep 500 /etc/passwd&lt;br /&gt;
 _openvpn:*:500:500:OpenVPN Server:/var/openvpn:/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
== Золотые ключики и подарочные сертификаты ==&lt;br /&gt;
&lt;br /&gt;
Думаю, ни для кого не секрет, что сертификаты открытых ключей предоставляют удобный и надежный способ аутентификации пользователей, поэтому не будем сейчас тратить время на теоретическую часть и перейдем непосредственно к процедуре генерирования надлежащих сертификатов.&lt;br /&gt;
Создаем директорию, где будут лежать конфигурационные файлы, скрипты и сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/openvpn/keys&lt;br /&gt;
&lt;br /&gt;
Копируем комплект скриптов easy-rsa, предназначенный для упрощения создания сертификатов, которые предъявляются в процессе аутентификации для подтверждения валидности клиентов. Теперь о монстроидальных командах openssl можно забыть.&lt;br /&gt;
&lt;br /&gt;
 # cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Далее следует экспортировать переменные KEY_*, они необходимы для работы build-* скриптов:&lt;br /&gt;
&lt;br /&gt;
 # cd /etc/openvpn/easy-rsa&lt;br /&gt;
 # . ./vars&lt;br /&gt;
&lt;br /&gt;
Инициализируем директорию /etc/openvpn/easy-rsa/keys:&lt;br /&gt;
&lt;br /&gt;
 # ./clean-all&lt;br /&gt;
&lt;br /&gt;
Создаем корневой и серверный сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # ./build-ca&lt;br /&gt;
 # ./build-key-server server&lt;br /&gt;
&lt;br /&gt;
Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, выполняем:&lt;br /&gt;
 &lt;br /&gt;
 # ./build-dh&lt;br /&gt;
&lt;br /&gt;
Снизить вероятность успешного проведения DoS-атаки на сервер OpenVPN можно за счет использования клиентом и сервером статического ключа HMAC (так называемый shared secret):&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --genkey --secret keys/ta.key&lt;br /&gt;
&lt;br /&gt;
Перемещаем все созданные файлы в подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;keys&amp;lt;/span&amp;gt; и выставляем для них корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # cd keys/&lt;br /&gt;
 # mv ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys&lt;br /&gt;
 # chown -R root:wheel /etc/openvpn&lt;br /&gt;
 # chmod 700 /etc/openvpn/keys&lt;br /&gt;
 # chmod 644 /etc/openvpn/keys/{ca.crt,dh1024.pem,server.crt}&lt;br /&gt;
 # chmod 600 /etc/openvpn/keys/{server.key,ta.key}&lt;br /&gt;
&lt;br /&gt;
Процедура создания клиентских сертификатов практически аналогична соответствующей процедуре для сервера:&lt;br /&gt;
&lt;br /&gt;
 # ./build-key client1&lt;br /&gt;
 # mkdir -p /home/vpn/client1&lt;br /&gt;
 # mv client1.crt client1.key /home/vpn/client1&lt;br /&gt;
 # cp /etc/openvpn/keys/{ca.crt,ta.key} /home/vpn/client1&lt;br /&gt;
&lt;br /&gt;
Теперь подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client1&amp;lt;/span&amp;gt; следует перенести на винч или флешку «географически изолированного» сотрудника.&lt;br /&gt;
&lt;br /&gt;
== Щепетильное конфигурирование ==&lt;br /&gt;
&lt;br /&gt;
Конфигурация сервера OpenVPN хранится в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/openvpn/server.conf&amp;lt;/span&amp;gt;. Ниже приведен пример подобного конфига. Все опции детально прокомментированы, поэтому сложностей возникнуть не должно. При настройке старайся «не срезать углы» — за один шаг добавляй/изменяй что-то одно и сразу же тестируй. Все действия в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;server.conf&amp;lt;/span&amp;gt; желательно фиксировать в локальном cvs-репозитории, чтобы можно было быстро просмотреть историю изменений и вернуться к рабочей ревизии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/openvpn/server.conf&lt;br /&gt;
 ; Работаем в режиме демона&lt;br /&gt;
 daemon openvpn&lt;br /&gt;
 ; Указываем местоположение файла с уникальным идентификатором процесса сервера&lt;br /&gt;
 ; OpenVPN&lt;br /&gt;
 writepid /var/openvpn/pid&lt;br /&gt;
 ; Определяем файл, содержащий список текущих клиентских соединений&lt;br /&gt;
 status /var/openvpn/status 10&lt;br /&gt;
 ; Внешний IP-адрес нашего сервера&lt;br /&gt;
 local 213.167.XX.YY&lt;br /&gt;
 ; Используемый порт&lt;br /&gt;
 port 1194&lt;br /&gt;
 ; Для транспорта по умолчанию применяется протокол UDP. Это вполне резонный&lt;br /&gt;
 ; подход. Во-первых, благодаря меньшему размеру заголовков и отсутствию&lt;br /&gt;
 ; встроенной функции подтверждения доставки пакетов, производительность UDP&lt;br /&gt;
 ; значительно выше. А во-вторых, при использовании UDP общая надежность не&lt;br /&gt;
 ; снижается, так как OpenVPN шифрует исходные пакеты, обеспечивая проверку&lt;br /&gt;
 ; ошибок и повторную передачу. В связи с этим TCP рекомендуется применять&lt;br /&gt;
 ; только в тех случаях, когда UDP не работает, например, если брандмауэр&lt;br /&gt;
 ; блокирует весь UDP-трафик.&lt;br /&gt;
 proto udp&lt;br /&gt;
 ; Выбираем тип виртуального устройства туннеля (tun, tap или null)&lt;br /&gt;
 dev tun0&lt;br /&gt;
 ; Включаем компрессию передаваемых данных&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 ; Указываем абсолютные пути к созданным сертификатам и ключам&lt;br /&gt;
 ca /etc/openvpn/keys/ca.crt&lt;br /&gt;
 cert /etc/openvpn/keys/server.crt&lt;br /&gt;
 key /etc/openvpn/keys/server.key&lt;br /&gt;
 dh /etc/openvpn/keys/dh1024.pem&lt;br /&gt;
 ; Значение 0 следует использовать на сервере, 1 - на клиенте&lt;br /&gt;
 tls-auth /etc/openvpn/keys/ta.key 0&lt;br /&gt;
 ; Для большинства сетей подойдет режим маршрутизатора (routed). Да, в этом&lt;br /&gt;
 ; случае широковещательный трафик отсутствует, соответственно, не будут работать&lt;br /&gt;
 ; некоторые протоколы, которые его используют, например NetBIOS поверх TCP. Но&lt;br /&gt;
 ; последнее нивелируется развертыванием WINS-сервера, либо подключением сетевых&lt;br /&gt;
 ; дисков/созданием ярлыков на расшаренные ресурсы&lt;br /&gt;
 server 192.168.3.0 255.255.255.0&lt;br /&gt;
 ; Проталкиваем подключенным клиентам статические маршруты, чтобы они могли&lt;br /&gt;
 ; получить доступ к ресурсам проводной и беспроводной сети&lt;br /&gt;
 push &amp;quot;route 192.168.1.0 255.255.255.0&amp;quot;&lt;br /&gt;
 push &amp;quot;route 192.168.2.0 255.255.255.0&amp;quot;&lt;br /&gt;
 ; Не позволяем соединению разорваться при простое&lt;br /&gt;
 keepalive 10 120&lt;br /&gt;
 ; Алгоритмы, используемые для аутентификации и шифрования пакетов&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Максимальное число одновременно подключенных VPN-пользователей&lt;br /&gt;
 max-clients 10&lt;br /&gt;
 ; Задаем файл журналирования событий и уровень детализации журнала, отображаем&lt;br /&gt;
 ; не более 20 экземпляров одного сообщения (остальные отбрасываем)&lt;br /&gt;
 log-append /var/log/openvpn.log&lt;br /&gt;
 verb 3&lt;br /&gt;
 mute 20&lt;br /&gt;
 ; Пользователь и группа, с правами которых работает демон&lt;br /&gt;
 user _openvpn&lt;br /&gt;
 group _openvpn&lt;br /&gt;
 ; Эти опции предотвращают доступ к некоторым ресурсам (например,&lt;br /&gt;
 ; tun-устройству) при перезапуске демона (рекомендуется применять только при&lt;br /&gt;
 ; снижении привилегий)&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 ; Сажаем демона в chroot-окружение&lt;br /&gt;
 chroot /var/empty&lt;br /&gt;
&lt;br /&gt;
Чтобы не вбивать директивы вручную, можно воспользоваться примером конфига, любезно предоставленным разработчиками:&lt;br /&gt;
 &lt;br /&gt;
 # cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Поднимаем виртуальный интерфейс tun0:&lt;br /&gt;
&lt;br /&gt;
 # echo &amp;quot;up&amp;quot; &amp;gt; /etc/hostname.tun0&lt;br /&gt;
 # sh /etc/netstart tun0&lt;br /&gt;
&lt;br /&gt;
Запускаем сервер OpenVPN командой:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
&lt;br /&gt;
Для автоматической загрузки OpenVPN достаточно прописать эту строчку в стартовый сценарий &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt;, например, так:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.local&lt;br /&gt;
 if [ -x /usr/local/sbin/openvpn ]; then&lt;br /&gt;
    echo -n &amp;#039; openvpn&amp;#039;; /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Далее смотрим в логи, чтобы убедиться в успешной загрузке нашего демона:&lt;br /&gt;
&lt;br /&gt;
 # tail /var/log/openvpn.log&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 IFCONFIG POOL: base=192.168.3.4 size=62&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 Initialization Sequence Completed&lt;br /&gt;
&lt;br /&gt;
Чтобы проверить состояние псевдоустройства туннелирования, можно воспользоваться утилитой &amp;lt;tt&amp;gt;ifconfig&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig tun0&lt;br /&gt;
 tun0: flags=8051&amp;lt;UP,POINTOPOINT,RUNNING,MULTICAST&amp;gt; mtu 1500&lt;br /&gt;
 groups: tun&lt;br /&gt;
 inet 192.168.3.1 --&amp;gt; 192.168.3.2 netmask 0xffffffff&lt;br /&gt;
&lt;br /&gt;
Для корректной работы сервера OpenVPN необходимо разрешить прохождение любого трафика через интерфейс OpenVPN, а также входящие подключения на внешний адрес сервера порт 1194/udp:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 pass quick on { lo tun0 $int_if } inet&lt;br /&gt;
 pass in on $ext_if inet proto udp from any to $ext_if port 1194 \&lt;br /&gt;
 keep state&lt;br /&gt;
&lt;br /&gt;
Перезагружаем набор рулесетов файервола:&lt;br /&gt;
&lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
== Инсталляция на стороне клиента ==&lt;br /&gt;
&lt;br /&gt;
Итак, VPN-сервер работает и готов принимать подключения. Развертывание VPN-клиентов для VPN-подключений удаленного доступа состоит из двух действий: установка программы OpenVPN GUI и правка конфигурационного файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client*.ovpn&amp;lt;/span&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 C:\Program Files\OpenVPN\config\mycompany_client1.ovpn&lt;br /&gt;
 ; Работаем в режиме клиента&lt;br /&gt;
 client&lt;br /&gt;
 dev tun&lt;br /&gt;
 ; Указываем IP-адрес и порт VPN-сервера&lt;br /&gt;
 remote 213.167.XX.YY 1194&lt;br /&gt;
 proto udp&lt;br /&gt;
 resolv-retry infinite&lt;br /&gt;
 nobind&lt;br /&gt;
 pull&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 verb 3&lt;br /&gt;
 ; Я предпочитаю хранить crt и key файлы на флешке&lt;br /&gt;
 ca &amp;quot;f:\\vpn\\mycompany\\ca.crt&amp;quot;&lt;br /&gt;
 cert &amp;quot;f:\\vpn\\mycompany\\client1.crt&amp;quot;&lt;br /&gt;
 key &amp;quot;f:\\vpn\\mycompany\\client1.key&amp;quot;&lt;br /&gt;
 tls-auth &amp;quot;f:\\vpn\\mycompany\\ta.key&amp;quot; 1&lt;br /&gt;
 ns-cert-type server&lt;br /&gt;
 ; Нижеследующие алгоритмы должны совпадать с теми, что заданы на сервере&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Без этих двух директив Vista-клиенты не смогут получать маршруты от сервера&lt;br /&gt;
 ; route-method exe&lt;br /&gt;
 ; route-delay 2&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения к VPN-серверу достаточно в трее щелкнуть правой кнопкой мыши на значке с красными мониторчиками, выбрать конфиг &amp;lt;tt&amp;gt;mycompany_client1&amp;lt;/tt&amp;gt; и нажать Connect.&lt;br /&gt;
&lt;br /&gt;
== Аутентификационный шлюз на базе pf и authpf ==&lt;br /&gt;
&lt;br /&gt;
В BSD-системах, используя связку пакетного фильтра pf и авторизационного шелла authpf, можно контролировать доступ клиентов, подключающихся к VPN-службе и корпоративной сети. Схема работы такой конструкции довольно проста: пользователь логинится по ssh, и, в зависимости от введенных данных (имя и пароль), на сервере вступают в силу персональные правила файервола, в данном случае разрешающие прохождение UDP-пакетов к порту 1194.&lt;br /&gt;
Но прежде, чем производить настройку &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, необходимо переопределить некоторые дефолтные значения переменных демона [http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html sshd(8)]. Так мы усложним потенциальному злоумышленнику успешное проведение атаки с целью перехвата и подмены ssh-сессии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/ssh/sshd_config&lt;br /&gt;
 # Работаем с использованием протоколов IPv4 и ssh2&lt;br /&gt;
 AddressFamily inet&lt;br /&gt;
 Protocol 2&lt;br /&gt;
 # Ожидаем подключения по всем доступным сетевым интерфейсам&lt;br /&gt;
 ListenAddress 0.0.0.0&lt;br /&gt;
 # Запрещаем регистрацию root&amp;#039;а и применение пустых паролей&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 PermitEmptyPasswords no&lt;br /&gt;
 # За счет использования протокола ssh2 и этих двух опций усложняем проведение&lt;br /&gt;
 # атак типа ARP- и IP-spoofing&lt;br /&gt;
 ClientAliveInterval 15&lt;br /&gt;
 ClientAliveCountMax 3&lt;br /&gt;
 # Отключаем DNS-резолвинг&lt;br /&gt;
 UseDNS no&lt;br /&gt;
 # Определяем списки контроля доступом&lt;br /&gt;
 AllowGroups wheel users authpf&lt;br /&gt;
&lt;br /&gt;
Для того чтобы внесенные изменения вступили в силу, необходимо дать указание демону перечитать свой конфиг:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `sed q /var/run/sshd.pid`&lt;br /&gt;
&lt;br /&gt;
Authpf представляет собой псевдооболочку, которая назначается пользователю системы в качестве &amp;lt;tt&amp;gt;login shell&amp;lt;/tt&amp;gt; (примечание: запись «&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/sbin/authpf&amp;lt;/span&amp;gt;» в файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/shells&amp;lt;/span&amp;gt; добавлять не следует). При авторизации пользователя по ssh к текущим правилам фильтра пакетов с помощью так называемых якорей &amp;lt;tt&amp;gt;(anchors)&amp;lt;/tt&amp;gt; будут присоединены правила, указанные в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/authpf.rules&amp;lt;/span&amp;gt;, либо в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/users/$USER&amp;lt;/span&amp;gt;. В добавляемых правилах допускается использование зарезервированных макросов &amp;lt;tt&amp;gt;$user_id&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;$user_ip&amp;lt;/tt&amp;gt;, за счет которых будет происходить автоматическая подстановка имени и IP-адреса подключившегося пользователя (значения макросов считываются из переменных окружения ssh автоматически).&lt;br /&gt;
В конец файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;[http://www.openbsd.org/cgi-bin/man.cgi?query=login.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html login.conf(5)]&amp;lt;/span&amp;gt; заносим сведения о новом классе &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, пользователи которого в качестве стандартного шелла будут получать authpf:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/login.conf&lt;br /&gt;
 authpf:\&lt;br /&gt;
   :shell=/usr/sbin/authpf:\&lt;br /&gt;
   :tc=default:&lt;br /&gt;
&lt;br /&gt;
С помощью штатной утилиты [http://www.openbsd.org/cgi-bin/man.cgi?query=cap_mkdb&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html cap_mkdb(1)] обновляем хэшированную базу данных &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/login.conf.db&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # cap_mkdb /etc/login.conf&lt;br /&gt;
&lt;br /&gt;
Мы не будем переопределять умолчальные значения директив &amp;lt;tt&amp;gt;anchor&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;table&amp;lt;/tt&amp;gt;, поэтому файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;authpf.conf&amp;lt;/span&amp;gt; оставляем пустым:&lt;br /&gt;
&lt;br /&gt;
 # echo -n &amp;gt; /etc/authpf/authpf.conf&lt;br /&gt;
&lt;br /&gt;
Подготавливаем приветственное сообщение authpf.message (аналог /etc/motd):&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/authpf.message&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
Создаем нового пользователя, который принадлежит классу authpf, входит в группу authpf и в качестве оболочки получает /usr/sbin/authpf:&lt;br /&gt;
&lt;br /&gt;
 # useradd -m -c &amp;#039;authpf vpn user&amp;#039; -g authpf -L authpf \&lt;br /&gt;
 -s /usr/sbin/authpf client1&lt;br /&gt;
 # passwd client1&lt;br /&gt;
&lt;br /&gt;
Рисуем правило файервола, разрешающее пользователю client1 доступ к серверу OpenVPN:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/authpf/users/client1&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/users/client1/authpf.rules&lt;br /&gt;
 pass in log quick on fxp0 inet proto udp from $user_ip to fxp0 \&lt;br /&gt;
 port 1194 keep state&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения механизма якорей добавим следующие записи в [http://www.openbsd.org/cgi-bin/man.cgi?query=pf.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html pf.conf(5)]:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 nat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 rdr-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 binat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 pass in log on $ext_if inet proto tcp to fxp0 port ssh keep state&lt;br /&gt;
 ...&lt;br /&gt;
 anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
И перезагрузим набор рулесетов файервола:&lt;br /&gt;
 &lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
На стороне клиента открываем любой ssh-клиент, например, Putty или SecureCRT, создаем новую сессию, указываем IP-адрес сервера и имя пользователя. Если все настроено правильно, после успешной авторизации правила файервола на сервере для этого пользователя изменятся, и он получит доступ к VPN-службе.&lt;br /&gt;
&lt;br /&gt;
 # f:\vpn\putty&amp;gt; plink.exe -pw mypassword client1@213.167.XX.YY&lt;br /&gt;
 Hello client1. You are authenticated from host &amp;quot;77.41.XX.YY&amp;quot;&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
А чтобы постоянно не вводить пароль, можно настроить аутентификацию на базе публичного ключа.&lt;br /&gt;
&lt;br /&gt;
== Эндшпиль ==&lt;br /&gt;
&lt;br /&gt;
Эта статья включает полный набор пошаговых действий, необходимых для внедрения базового VPN-решения удаленного доступа, используя BSD-систему в качестве VPN-сервера и WinXP/Vista в качестве VPN-клиента. Развернув в 3-4 компаниях подобную конфигурацию, ты сможешь не с пустыми кредиткой и кошельком ехать в Египет греть пятки. Удачи.&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=193</id>
		<title>Деликатное проникновение в частную сеть</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=193"/>
		<updated>2013-06-05T11:59:26Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
Статья [http://www.xakep.ru/magazine/xa/110/156/1.asp опубликована] в февральском номере журнала Хакер за 2008 год. Автор оригинального текста: Andrey Matveev (andrey at openbsd dot ru). &lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Когда речь заходит о необходимости предоставления авторизированному пользователю доступа к защищенным ресурсам частной сети, на ум сразу приходят примеры построения VPN на базе IPSec, PPTP, L2TP и SSL. Однако если требуется в кратчайшие сроки развернуть бесплатное, кроссплатформенное, полнофункциональное ПО с гибкими возможностями конфигурирования и относительно простой установкой, не требующей вмешательства в ядро ОС, то из всех доступных решений выбор невольно падает на OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Поем дифирамбы OpenVPN ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN является реализацией технологии VPN с использованием протокола SSL/TLS. С его помощью можно поднять надежный, достаточно быстрый и в то же время защищенный от прослушивания и вмешательства злоумышленников криптотуннель поверх общедоступной сети, такой, как Интернет. В двух словах схему работы этого приложения можно описать следующим образом: любой сетевой трафик, посылаемый или принимаемый для сетевого адаптера, инкапсулируется в зашифрованный пакет и доставляется в другой конечный пункт туннеля OpenVPN, где данные расшифровываются и попадают в удаленную сеть.&lt;br /&gt;
К числу основных преимуществ применения OpenVPN стоит отнести:&lt;br /&gt;
&lt;br /&gt;
* высокая переносимость между платформами – пакет работает на Windows 2000/XP/2003/Vista, Linux, Free/Net/OpenBSD, Mac OS X и Solaris;&lt;br /&gt;
* поддержка режимов маршрутизации (routed) и моста (bridged), другими словами, нам под силу туннелировать как IP-пакеты, так и Ethernet-фреймы;&lt;br /&gt;
* для транспорта можно использовать UDP/TCP;&lt;br /&gt;
* клиентские хосты могут иметь статические и динамические IP-адреса;&lt;br /&gt;
* туннели можно создавать поверх NAT;&lt;br /&gt;
* работа через межсетевые экраны, в которых реализован контроль состояния соединений (достигается за счет отправки через определенные промежутки времени echo-запросов);&lt;br /&gt;
* ассиметричное шифрование с использованием статических ключей и SSL/TLS сертификатов;&lt;br /&gt;
* встроенные меры безопасности для предотвращения DoS-атак и повторного проигрывания злоумышленником последовательности записанных пакетов;&lt;br /&gt;
* адаптивная компрессия передаваемых данных;&lt;br /&gt;
* способность &amp;quot;проталкивать&amp;quot; маршруты для клиента;&lt;br /&gt;
* использование всех механизмов шифрования, встроенных в библиотеку OpenSSL;&lt;br /&gt;
* работа в chroot-окружении;&lt;br /&gt;
* поддержка мультипоточной библиотеки pthread (положительно влияет на быстродействие при динамическом обмене SSL/TLS ключами). &lt;br /&gt;
&lt;br /&gt;
Как видишь, список возможностей впечатляет, но в отличие от других SSL VPN, достоинством которых считается безклиентская установка (соединение SSL VPN устанавливается через браузер), для OpenVPN необходим специальный клиент (поговорим об этом ниже).&lt;br /&gt;
&lt;br /&gt;
== Увертюра к основному действию ==&lt;br /&gt;
&lt;br /&gt;
Предположим, одним прекрасным солнечным утром твое высокое начальство впечатлилось идеей создания виртуальной частной сети, и теперь перед тобой стоит задача поднять VPN-сервер для служащих, которым требуется работать с корпоративными ресурсами, находясь вне стен офиса (это могут быть надомные, командировочные сотрудники или просто фрилансеры).&lt;br /&gt;
Функции шлюза компании, выпускающего сотрудников в Интернет, выполняет компьютер с тремя сетевыми картами (213.167.XX.YY, 192.168.1.1, 192.168.2.1) под управлением… хотя это не так важно, настройки в поддерживаемых операционках будут отличаться минимально. В моем случае на сервере заказчика была установлена OpenBSD 3.9. Что касается корпоративной внутренней сети, то она состоит из двух участков: проводного (192.168.1.0/24) и беспроводного (192.168.2.0/24). После рекогносцировки на местности переходим к установке OpenVPN.&lt;br /&gt;
&lt;br /&gt;
== Серверная инсталляция ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN без труда можно найти в любом репозитарии или дереве портов:&lt;br /&gt;
&lt;br /&gt;
 # cd /usr/ports/net/openvpn&lt;br /&gt;
 # make install clean&lt;br /&gt;
&lt;br /&gt;
В случае установки из исходных кодов в некоторых системах может понадобиться отключить поддержку реализации потоков выполнения и указать местоположение библиотек и заголовочных файлов lzo:&lt;br /&gt;
&lt;br /&gt;
 # ./configure --disable-pthread --with-lzo-lib=/usr/local/lib \&lt;br /&gt;
 --with-lzoheaders=/usr/local/include&lt;br /&gt;
 # make&lt;br /&gt;
 # make install&lt;br /&gt;
&lt;br /&gt;
Для проверки с помощью следующих команд можно посмотреть, какие дайджесты (применяются для аутентификации каждой получаемой UDP-датаграммы) и алгоритмы шифрования доступны:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-digests&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-ciphers&lt;br /&gt;
&lt;br /&gt;
Чтобы обеспечить дополнительный уровень защиты и избежать возможный ущерб при взломе, нужно дать указание демону OpenVPN работать с правами непривилегированного пользователя в chroot’ной среде — среде с измененным корневым каталогом. Первый шаг для этого — добавить в систему группу _openvpn и одноименного пользователя:&lt;br /&gt;
&lt;br /&gt;
 # groupadd -g 500 _openvpn&lt;br /&gt;
 # useradd -u 500 -g 500 -c &amp;#039;OpenVPN Server&amp;#039; -s /sbin/nologin \&lt;br /&gt;
 -d /var/openvpn -m _openvpn&lt;br /&gt;
&lt;br /&gt;
Проверяем правильность выполнения двух последних команд:&lt;br /&gt;
&lt;br /&gt;
 # grep 500 /etc/passwd&lt;br /&gt;
 _openvpn:*:500:500:OpenVPN Server:/var/openvpn:/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
== Золотые ключики и подарочные сертификаты ==&lt;br /&gt;
&lt;br /&gt;
Думаю, ни для кого не секрет, что сертификаты открытых ключей предоставляют удобный и надежный способ аутентификации пользователей, поэтому не будем сейчас тратить время на теоретическую часть и перейдем непосредственно к процедуре генерирования надлежащих сертификатов.&lt;br /&gt;
Создаем директорию, где будут лежать конфигурационные файлы, скрипты и сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/openvpn/keys&lt;br /&gt;
&lt;br /&gt;
Копируем комплект скриптов easy-rsa, предназначенный для упрощения создания сертификатов, которые предъявляются в процессе аутентификации для подтверждения валидности клиентов. Теперь о монстроидальных командах openssl можно забыть.&lt;br /&gt;
&lt;br /&gt;
 # cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Далее следует экспортировать переменные KEY_*, они необходимы для работы build-* скриптов:&lt;br /&gt;
&lt;br /&gt;
 # cd /etc/openvpn/easy-rsa&lt;br /&gt;
 # . ./vars&lt;br /&gt;
&lt;br /&gt;
Инициализируем директорию /etc/openvpn/easy-rsa/keys:&lt;br /&gt;
&lt;br /&gt;
 # ./clean-all&lt;br /&gt;
&lt;br /&gt;
Создаем корневой и серверный сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # ./build-ca&lt;br /&gt;
 # ./build-key-server server&lt;br /&gt;
&lt;br /&gt;
Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, выполняем:&lt;br /&gt;
 &lt;br /&gt;
 # ./build-dh&lt;br /&gt;
&lt;br /&gt;
Снизить вероятность успешного проведения DoS-атаки на сервер OpenVPN можно за счет использования клиентом и сервером статического ключа HMAC (так называемый shared secret):&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --genkey --secret keys/ta.key&lt;br /&gt;
&lt;br /&gt;
Перемещаем все созданные файлы в подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;keys&amp;lt;/span&amp;gt; и выставляем для них корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # cd keys/&lt;br /&gt;
 # mv ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys&lt;br /&gt;
 # chown -R root:wheel /etc/openvpn&lt;br /&gt;
 # chmod 700 /etc/openvpn/keys&lt;br /&gt;
 # chmod 644 /etc/openvpn/keys/{ca.crt,dh1024.pem,server.crt}&lt;br /&gt;
 # chmod 600 /etc/openvpn/keys/{server.key,ta.key}&lt;br /&gt;
&lt;br /&gt;
Процедура создания клиентских сертификатов практически аналогична соответствующей процедуре для сервера:&lt;br /&gt;
&lt;br /&gt;
 # ./build-key client1&lt;br /&gt;
 # mkdir -p /home/vpn/client1&lt;br /&gt;
 # mv client1.crt client1.key /home/vpn/client1&lt;br /&gt;
 # cp /etc/openvpn/keys/{ca.crt,ta.key} /home/vpn/client1&lt;br /&gt;
&lt;br /&gt;
Теперь подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client1&amp;lt;/span&amp;gt; следует перенести на винч или флешку «географически изолированного» сотрудника.&lt;br /&gt;
&lt;br /&gt;
== Щепетильное конфигурирование ==&lt;br /&gt;
&lt;br /&gt;
Конфигурация сервера OpenVPN хранится в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/openvpn/server.conf&amp;lt;/span&amp;gt;. Ниже приведен пример подобного конфига. Все опции детально прокомментированы, поэтому сложностей возникнуть не должно. При настройке старайся «не срезать углы» — за один шаг добавляй/изменяй что-то одно и сразу же тестируй. Все действия в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;server.conf&amp;lt;/span&amp;gt; желательно фиксировать в локальном cvs-репозитории, чтобы можно было быстро просмотреть историю изменений и вернуться к рабочей ревизии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/openvpn/server.conf&lt;br /&gt;
 ; Работаем в режиме демона&lt;br /&gt;
 daemon openvpn&lt;br /&gt;
 ; Указываем местоположение файла с уникальным идентификатором процесса сервера&lt;br /&gt;
 ; OpenVPN&lt;br /&gt;
 writepid /var/openvpn/pid&lt;br /&gt;
 ; Определяем файл, содержащий список текущих клиентских соединений&lt;br /&gt;
 status /var/openvpn/status 10&lt;br /&gt;
 ; Внешний IP-адрес нашего сервера&lt;br /&gt;
 local 213.167.XX.YY&lt;br /&gt;
 ; Используемый порт&lt;br /&gt;
 port 1194&lt;br /&gt;
 ; Для транспорта по умолчанию применяется протокол UDP. Это вполне резонный&lt;br /&gt;
 ; подход. Во-первых, благодаря меньшему размеру заголовков и отсутствию&lt;br /&gt;
 ; встроенной функции подтверждения доставки пакетов, производительность UDP&lt;br /&gt;
 ; значительно выше. А во-вторых, при использовании UDP общая надежность не&lt;br /&gt;
 ; снижается, так как OpenVPN шифрует исходные пакеты, обеспечивая проверку&lt;br /&gt;
 ; ошибок и повторную передачу. В связи с этим TCP рекомендуется применять&lt;br /&gt;
 ; только в тех случаях, когда UDP не работает, например, если брандмауэр&lt;br /&gt;
 ; блокирует весь UDP-трафик.&lt;br /&gt;
 proto udp&lt;br /&gt;
 ; Выбираем тип виртуального устройства туннеля (tun, tap или null)&lt;br /&gt;
 dev tun0&lt;br /&gt;
 ; Включаем компрессию передаваемых данных&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 ; Указываем абсолютные пути к созданным сертификатам и ключам&lt;br /&gt;
 ca /etc/openvpn/keys/ca.crt&lt;br /&gt;
 cert /etc/openvpn/keys/server.crt&lt;br /&gt;
 key /etc/openvpn/keys/server.key&lt;br /&gt;
 dh /etc/openvpn/keys/dh1024.pem&lt;br /&gt;
 ; Значение 0 следует использовать на сервере, 1 - на клиенте&lt;br /&gt;
 tls-auth /etc/openvpn/keys/ta.key 0&lt;br /&gt;
 ; Для большинства сетей подойдет режим маршрутизатора (routed). Да, в этом&lt;br /&gt;
 ; случае широковещательный трафик отсутствует, соответственно, не будут работать&lt;br /&gt;
 ; некоторые протоколы, которые его используют, например NetBIOS поверх TCP. Но&lt;br /&gt;
 ; последнее нивелируется развертыванием WINS-сервера, либо подключением сетевых&lt;br /&gt;
 ; дисков/созданием ярлыков на расшаренные ресурсы&lt;br /&gt;
 server 192.168.3.0 255.255.255.0&lt;br /&gt;
 ; Проталкиваем подключенным клиентам статические маршруты, чтобы они могли&lt;br /&gt;
 ; получить доступ к ресурсам проводной и беспроводной сети&lt;br /&gt;
 push &amp;quot;route 192.168.1.0 255.255.255.0&amp;quot;&lt;br /&gt;
 push &amp;quot;route 192.168.2.0 255.255.255.0&amp;quot;&lt;br /&gt;
 ; Не позволяем соединению разорваться при простое&lt;br /&gt;
 keepalive 10 120&lt;br /&gt;
 ; Алгоритмы, используемые для аутентификации и шифрования пакетов&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Максимальное число одновременно подключенных VPN-пользователей&lt;br /&gt;
 max-clients 10&lt;br /&gt;
 ; Задаем файл журналирования событий и уровень детализации журнала, отображаем&lt;br /&gt;
 ; не более 20 экземпляров одного сообщения (остальные отбрасываем)&lt;br /&gt;
 log-append /var/log/openvpn.log&lt;br /&gt;
 verb 3&lt;br /&gt;
 mute 20&lt;br /&gt;
 ; Пользователь и группа, с правами которых работает демон&lt;br /&gt;
 user _openvpn&lt;br /&gt;
 group _openvpn&lt;br /&gt;
 ; Эти опции предотвращают доступ к некоторым ресурсам (например,&lt;br /&gt;
 ; tun-устройству) при перезапуске демона (рекомендуется применять только при&lt;br /&gt;
 ; снижении привилегий)&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 ; Сажаем демона в chroot-окружение&lt;br /&gt;
 chroot /var/empty&lt;br /&gt;
&lt;br /&gt;
Чтобы не вбивать директивы вручную, можно воспользоваться примером конфига, любезно предоставленным разработчиками:&lt;br /&gt;
 &lt;br /&gt;
 # cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Поднимаем виртуальный интерфейс tun0:&lt;br /&gt;
&lt;br /&gt;
 # echo &amp;quot;up&amp;quot; &amp;gt; /etc/hostname.tun0&lt;br /&gt;
 # sh /etc/netstart tun0&lt;br /&gt;
&lt;br /&gt;
Запускаем сервер OpenVPN командой:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
&lt;br /&gt;
Для автоматической загрузки OpenVPN достаточно прописать эту строчку в стартовый сценарий &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt;, например, так:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.local&lt;br /&gt;
 if [ -x /usr/local/sbin/openvpn ]; then&lt;br /&gt;
    echo -n &amp;#039; openvpn&amp;#039;; /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Далее смотрим в логи, чтобы убедиться в успешной загрузке нашего демона:&lt;br /&gt;
&lt;br /&gt;
 # tail /var/log/openvpn.log&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 IFCONFIG POOL: base=192.168.3.4 size=62&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 Initialization Sequence Completed&lt;br /&gt;
&lt;br /&gt;
Чтобы проверить состояние псевдоустройства туннелирования, можно воспользоваться утилитой &amp;lt;tt&amp;gt;ifconfig&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig tun0&lt;br /&gt;
 tun0: flags=8051&amp;lt;UP,POINTOPOINT,RUNNING,MULTICAST&amp;gt; mtu 1500&lt;br /&gt;
 groups: tun&lt;br /&gt;
 inet 192.168.3.1 --&amp;gt; 192.168.3.2 netmask 0xffffffff&lt;br /&gt;
&lt;br /&gt;
Для корректной работы сервера OpenVPN необходимо разрешить прохождение любого трафика через интерфейс OpenVPN, а также входящие подключения на внешний адрес сервера порт 1194/udp:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 pass quick on { lo tun0 $int_if } inet&lt;br /&gt;
 pass in on $ext_if inet proto udp from any to $ext_if port 1194 \&lt;br /&gt;
 keep state&lt;br /&gt;
&lt;br /&gt;
Перезагружаем набор рулесетов файервола:&lt;br /&gt;
&lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
== Инсталляция на стороне клиента ==&lt;br /&gt;
&lt;br /&gt;
Итак, VPN-сервер работает и готов принимать подключения. Развертывание VPN-клиентов для VPN-подключений удаленного доступа состоит из двух действий: установка программы OpenVPN GUI и правка конфигурационного файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client*.ovpn&amp;lt;/span&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 C:\Program Files\OpenVPN\config\mycompany_client1.ovpn&lt;br /&gt;
 ; Работаем в режиме клиента&lt;br /&gt;
 client&lt;br /&gt;
 dev tun&lt;br /&gt;
 ; Указываем IP-адрес и порт VPN-сервера&lt;br /&gt;
 remote 213.167.XX.YY 1194&lt;br /&gt;
 proto udp&lt;br /&gt;
 resolv-retry infinite&lt;br /&gt;
 nobind&lt;br /&gt;
 pull&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 verb 3&lt;br /&gt;
 ; Я предпочитаю хранить crt и key файлы на флешке&lt;br /&gt;
 ca &amp;quot;f:\\vpn\\mycompany\\ca.crt&amp;quot;&lt;br /&gt;
 cert &amp;quot;f:\\vpn\\mycompany\\client1.crt&amp;quot;&lt;br /&gt;
 key &amp;quot;f:\\vpn\\mycompany\\client1.key&amp;quot;&lt;br /&gt;
 tls-auth &amp;quot;f:\\vpn\\mycompany\\ta.key&amp;quot; 1&lt;br /&gt;
 ns-cert-type server&lt;br /&gt;
 ; Нижеследующие алгоритмы должны совпадать с теми, что заданы на сервере&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Без этих двух директив Vista-клиенты не смогут получать маршруты от сервера&lt;br /&gt;
 ; route-method exe&lt;br /&gt;
 ; route-delay 2&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения к VPN-серверу достаточно в трее щелкнуть правой кнопкой мыши на значке с красными мониторчиками, выбрать конфиг &amp;lt;tt&amp;gt;mycompany_client1&amp;lt;/tt&amp;gt; и нажать Connect.&lt;br /&gt;
&lt;br /&gt;
== Аутентификационный шлюз на базе pf и authpf ==&lt;br /&gt;
&lt;br /&gt;
В BSD-системах, используя связку пакетного фильтра pf и авторизационного шелла authpf, можно контролировать доступ клиентов, подключающихся к VPN-службе и корпоративной сети. Схема работы такой конструкции довольно проста: пользователь логинится по ssh, и, в зависимости от введенных данных (имя и пароль), на сервере вступают в силу персональные правила файервола, в данном случае разрешающие прохождение UDP-пакетов к порту 1194.&lt;br /&gt;
Но прежде, чем производить настройку &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, необходимо переопределить некоторые дефолтные значения переменных демона [http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html sshd(8)]. Так мы усложним потенциальному злоумышленнику успешное проведение атаки с целью перехвата и подмены ssh-сессии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/ssh/sshd_config&lt;br /&gt;
 # Работаем с использованием протоколов IPv4 и ssh2&lt;br /&gt;
 AddressFamily inet&lt;br /&gt;
 Protocol 2&lt;br /&gt;
 # Ожидаем подключения по всем доступным сетевым интерфейсам&lt;br /&gt;
 ListenAddress 0.0.0.0&lt;br /&gt;
 # Запрещаем регистрацию root&amp;#039;а и применение пустых паролей&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 PermitEmptyPasswords no&lt;br /&gt;
 # За счет использования протокола ssh2 и этих двух опций усложняем проведение&lt;br /&gt;
 # атак типа ARP- и IP-spoofing&lt;br /&gt;
 ClientAliveInterval 15&lt;br /&gt;
 ClientAliveCountMax 3&lt;br /&gt;
 # Отключаем DNS-резолвинг&lt;br /&gt;
 UseDNS no&lt;br /&gt;
 # Определяем списки контроля доступом&lt;br /&gt;
 AllowGroups wheel users authpf&lt;br /&gt;
&lt;br /&gt;
Для того чтобы внесенные изменения вступили в силу, необходимо дать указание демону перечитать свой конфиг:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `sed q /var/run/sshd.pid`&lt;br /&gt;
&lt;br /&gt;
Authpf представляет собой псевдооболочку, которая назначается пользователю системы в качестве &amp;lt;tt&amp;gt;login shell&amp;lt;/tt&amp;gt; (примечание: запись «&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/sbin/authpf&amp;lt;/span&amp;gt;» в файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/shells&amp;lt;/span&amp;gt; добавлять не следует). При авторизации пользователя по ssh к текущим правилам фильтра пакетов с помощью так называемых якорей &amp;lt;tt&amp;gt;(anchors)&amp;lt;/tt&amp;gt; будут присоединены правила, указанные в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/authpf.rules&amp;lt;/span&amp;gt;, либо в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/users/$USER&amp;lt;/span&amp;gt;. В добавляемых правилах допускается использование зарезервированных макросов &amp;lt;tt&amp;gt;$user_id&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;$user_ip&amp;lt;/tt&amp;gt;, за счет которых будет происходить автоматическая подстановка имени и IP-адреса подключившегося пользователя (значения макросов считываются из переменных окружения ssh автоматически).&lt;br /&gt;
В конец файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;[http://www.openbsd.org/cgi-bin/man.cgi?query=login.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html login.conf(5)]&amp;lt;/span&amp;gt; заносим сведения о новом классе &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, пользователи которого в качестве стандартного шелла будут получать authpf:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/login.conf&lt;br /&gt;
 authpf:\&lt;br /&gt;
   :shell=/usr/sbin/authpf:\&lt;br /&gt;
   :tc=default:&lt;br /&gt;
&lt;br /&gt;
С помощью штатной утилиты [http://www.openbsd.org/cgi-bin/man.cgi?query=cap_mkdb&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html cap_mkdb(1)] обновляем хэшированную базу данных &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/login.conf.db&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # cap_mkdb /etc/login.conf&lt;br /&gt;
&lt;br /&gt;
Мы не будем переопределять умолчальные значения директив &amp;lt;tt&amp;gt;anchor&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;table&amp;lt;/tt&amp;gt;, поэтому файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;authpf.conf&amp;lt;/span&amp;gt; оставляем пустым:&lt;br /&gt;
&lt;br /&gt;
 # echo -n &amp;gt; /etc/authpf/authpf.conf&lt;br /&gt;
&lt;br /&gt;
Подготавливаем приветственное сообщение authpf.message (аналог /etc/motd):&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/authpf.message&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
Создаем нового пользователя, который принадлежит классу authpf, входит в группу authpf и в качестве оболочки получает /usr/sbin/authpf:&lt;br /&gt;
&lt;br /&gt;
 # useradd -m -c &amp;#039;authpf vpn user&amp;#039; -g authpf -L authpf \&lt;br /&gt;
 -s /usr/sbin/authpf client1&lt;br /&gt;
 # passwd client1&lt;br /&gt;
&lt;br /&gt;
Рисуем правило файервола, разрешающее пользователю client1 доступ к серверу OpenVPN:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/authpf/users/client1&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/users/client1/authpf.rules&lt;br /&gt;
 pass in log quick on fxp0 inet proto udp from $user_ip to fxp0 \&lt;br /&gt;
 port 1194 keep state&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения механизма якорей добавим следующие записи в [http://www.openbsd.org/cgi-bin/man.cgi?query=pf.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html pf.conf(5)]:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 nat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 rdr-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 binat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 pass in log on $ext_if inet proto tcp to fxp0 port ssh keep state&lt;br /&gt;
 ...&lt;br /&gt;
 anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
И перезагрузим набор рулесетов файервола:&lt;br /&gt;
 &lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
На стороне клиента открываем любой ssh-клиент, например, Putty или SecureCRT, создаем новую сессию, указываем IP-адрес сервера и имя пользователя. Если все настроено правильно, после успешной авторизации правила файервола на сервере для этого пользователя изменятся, и он получит доступ к VPN-службе.&lt;br /&gt;
&lt;br /&gt;
 # f:\vpn\putty&amp;gt; plink.exe -pw mypassword client1@213.167.XX.YY&lt;br /&gt;
 Hello client1. You are authenticated from host &amp;quot;77.41.XX.YY&amp;quot;&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
А чтобы постоянно не вводить пароль, можно настроить аутентификацию на базе публичного ключа.&lt;br /&gt;
&lt;br /&gt;
== Эндшпиль ==&lt;br /&gt;
&lt;br /&gt;
Эта статья включает полный набор пошаговых действий, необходимых для внедрения базового VPN-решения удаленного доступа, используя BSD-систему в качестве VPN-сервера и WinXP/Vista в качестве VPN-клиента. Развернув в 3-4 компаниях подобную конфигурацию, ты сможешь не с пустыми кредиткой и кошельком ехать в Египет греть пятки. Удачи.&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=192</id>
		<title>Деликатное проникновение в частную сеть</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%94%D0%B5%D0%BB%D0%B8%D0%BA%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%BD%D0%B8%D0%BA%D0%BD%D0%BE%D0%B2%D0%B5%D0%BD%D0%B8%D0%B5_%D0%B2_%D1%87%D0%B0%D1%81%D1%82%D0%BD%D1%83%D1%8E_%D1%81%D0%B5%D1%82%D1%8C&amp;diff=192"/>
		<updated>2013-06-05T11:57:27Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: Новая страница: «:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru] &amp;lt;br /&amp;gt;  Статья [http://www.xakep.ru/magazine/xa/110/156/1.asp о…»&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Статья [http://www.xakep.ru/magazine/xa/110/156/1.asp опубликована] в февральском номере журнала Хакер за 2008 год. Автор оригинального текста: Andrey Matveev (andrey at openbsd dot ru). &lt;br /&gt;
&lt;br /&gt;
== Введение ==&lt;br /&gt;
&lt;br /&gt;
Когда речь заходит о необходимости предоставления авторизированному пользователю доступа к защищенным ресурсам частной сети, на ум сразу приходят примеры построения VPN на базе IPSec, PPTP, L2TP и SSL. Однако если требуется в кратчайшие сроки развернуть бесплатное, кроссплатформенное, полнофункциональное ПО с гибкими возможностями конфигурирования и относительно простой установкой, не требующей вмешательства в ядро ОС, то из всех доступных решений выбор невольно падает на OpenVPN.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Поем дифирамбы OpenVPN ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN является реализацией технологии VPN с использованием протокола SSL/TLS. С его помощью можно поднять надежный, достаточно быстрый и в то же время защищенный от прослушивания и вмешательства злоумышленников криптотуннель поверх общедоступной сети, такой, как Интернет. В двух словах схему работы этого приложения можно описать следующим образом: любой сетевой трафик, посылаемый или принимаемый для сетевого адаптера, инкапсулируется в зашифрованный пакет и доставляется в другой конечный пункт туннеля OpenVPN, где данные расшифровываются и попадают в удаленную сеть.&lt;br /&gt;
К числу основных преимуществ применения OpenVPN стоит отнести:&lt;br /&gt;
&lt;br /&gt;
* высокая переносимость между платформами – пакет работает на Windows 2000/XP/2003/Vista, Linux, Free/Net/OpenBSD, Mac OS X и Solaris;&lt;br /&gt;
* поддержка режимов маршрутизации (routed) и моста (bridged), другими словами, нам под силу туннелировать как IP-пакеты, так и Ethernet-фреймы;&lt;br /&gt;
* для транспорта можно использовать UDP/TCP;&lt;br /&gt;
* клиентские хосты могут иметь статические и динамические IP-адреса;&lt;br /&gt;
* туннели можно создавать поверх NAT;&lt;br /&gt;
* работа через межсетевые экраны, в которых реализован контроль состояния соединений (достигается за счет отправки через определенные промежутки времени echo-запросов);&lt;br /&gt;
* ассиметричное шифрование с использованием статических ключей и SSL/TLS сертификатов;&lt;br /&gt;
* встроенные меры безопасности для предотвращения DoS-атак и повторного проигрывания злоумышленником последовательности записанных пакетов;&lt;br /&gt;
* адаптивная компрессия передаваемых данных;&lt;br /&gt;
* способность &amp;quot;проталкивать&amp;quot; маршруты для клиента;&lt;br /&gt;
* использование всех механизмов шифрования, встроенных в библиотеку OpenSSL;&lt;br /&gt;
* работа в chroot-окружении;&lt;br /&gt;
* поддержка мультипоточной библиотеки pthread (положительно влияет на быстродействие при динамическом обмене SSL/TLS ключами). &lt;br /&gt;
&lt;br /&gt;
Как видишь, список возможностей впечатляет, но в отличие от других SSL VPN, достоинством которых считается безклиентская установка (соединение SSL VPN устанавливается через браузер), для OpenVPN необходим специальный клиент (поговорим об этом ниже).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Увертюра к основному действию ==&lt;br /&gt;
&lt;br /&gt;
Предположим, одним прекрасным солнечным утром твое высокое начальство впечатлилось идеей создания виртуальной частной сети, и теперь перед тобой стоит задача поднять VPN-сервер для служащих, которым требуется работать с корпоративными ресурсами, находясь вне стен офиса (это могут быть надомные, командировочные сотрудники или просто фрилансеры).&lt;br /&gt;
Функции шлюза компании, выпускающего сотрудников в Интернет, выполняет компьютер с тремя сетевыми картами (213.167.XX.YY, 192.168.1.1, 192.168.2.1) под управлением… хотя это не так важно, настройки в поддерживаемых операционках будут отличаться минимально. В моем случае на сервере заказчика была установлена OpenBSD 3.9. Что касается корпоративной внутренней сети, то она состоит из двух участков: проводного (192.168.1.0/24) и беспроводного (192.168.2.0/24). После рекогносцировки на местности переходим к установке OpenVPN.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Серверная инсталляция ==&lt;br /&gt;
&lt;br /&gt;
OpenVPN без труда можно найти в любом репозитарии или дереве портов:&lt;br /&gt;
&lt;br /&gt;
 # cd /usr/ports/net/openvpn&lt;br /&gt;
 # make install clean&lt;br /&gt;
&lt;br /&gt;
В случае установки из исходных кодов в некоторых системах может понадобиться отключить поддержку реализации потоков выполнения и указать местоположение библиотек и заголовочных файлов lzo:&lt;br /&gt;
&lt;br /&gt;
 # ./configure --disable-pthread --with-lzo-lib=/usr/local/lib \&lt;br /&gt;
 --with-lzoheaders=/usr/local/include&lt;br /&gt;
 # make&lt;br /&gt;
 # make install&lt;br /&gt;
&lt;br /&gt;
Для проверки с помощью следующих команд можно посмотреть, какие дайджесты (применяются для аутентификации каждой получаемой UDP-датаграммы) и алгоритмы шифрования доступны:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-digests&lt;br /&gt;
 # /usr/local/sbin/openvpn --show-ciphers&lt;br /&gt;
&lt;br /&gt;
Чтобы обеспечить дополнительный уровень защиты и избежать возможный ущерб при взломе, нужно дать указание демону OpenVPN работать с правами непривилегированного пользователя в chroot’ной среде — среде с измененным корневым каталогом. Первый шаг для этого — добавить в систему группу _openvpn и одноименного пользователя:&lt;br /&gt;
&lt;br /&gt;
 # groupadd -g 500 _openvpn&lt;br /&gt;
 # useradd -u 500 -g 500 -c &amp;#039;OpenVPN Server&amp;#039; -s /sbin/nologin \&lt;br /&gt;
 -d /var/openvpn -m _openvpn&lt;br /&gt;
&lt;br /&gt;
Проверяем правильность выполнения двух последних команд:&lt;br /&gt;
&lt;br /&gt;
 # grep 500 /etc/passwd&lt;br /&gt;
 _openvpn:*:500:500:OpenVPN Server:/var/openvpn:/sbin/nologin&lt;br /&gt;
&lt;br /&gt;
== Золотые ключики и подарочные сертификаты ==&lt;br /&gt;
&lt;br /&gt;
Думаю, ни для кого не секрет, что сертификаты открытых ключей предоставляют удобный и надежный способ аутентификации пользователей, поэтому не будем сейчас тратить время на теоретическую часть и перейдем непосредственно к процедуре генерирования надлежащих сертификатов.&lt;br /&gt;
Создаем директорию, где будут лежать конфигурационные файлы, скрипты и сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/openvpn/keys&lt;br /&gt;
&lt;br /&gt;
Копируем комплект скриптов easy-rsa, предназначенный для упрощения создания сертификатов, которые предъявляются в процессе аутентификации для подтверждения валидности клиентов. Теперь о монстроидальных командах openssl можно забыть.&lt;br /&gt;
&lt;br /&gt;
 # cp -r /usr/local/share/examples/openvpn/easy-rsa /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Далее следует экспортировать переменные KEY_*, они необходимы для работы build-* скриптов:&lt;br /&gt;
&lt;br /&gt;
 # cd /etc/openvpn/easy-rsa&lt;br /&gt;
 # . ./vars&lt;br /&gt;
&lt;br /&gt;
Инициализируем директорию /etc/openvpn/easy-rsa/keys:&lt;br /&gt;
&lt;br /&gt;
 # ./clean-all&lt;br /&gt;
&lt;br /&gt;
Создаем корневой и серверный сертификаты:&lt;br /&gt;
&lt;br /&gt;
 # ./build-ca&lt;br /&gt;
 # ./build-key-server server&lt;br /&gt;
&lt;br /&gt;
Для создания файла параметров Диффи-Хэлмана, предназначенного для обеспечения более надежной защиты данных при установке соединения клиента с сервером, выполняем:&lt;br /&gt;
 &lt;br /&gt;
 # ./build-dh&lt;br /&gt;
&lt;br /&gt;
Снизить вероятность успешного проведения DoS-атаки на сервер OpenVPN можно за счет использования клиентом и сервером статического ключа HMAC (так называемый shared secret):&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --genkey --secret keys/ta.key&lt;br /&gt;
&lt;br /&gt;
Перемещаем все созданные файлы в подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;keys&amp;lt;/span&amp;gt; и выставляем для них корректные права доступа:&lt;br /&gt;
&lt;br /&gt;
 # cd keys/&lt;br /&gt;
 # mv ca.crt dh1024.pem server.crt server.key ta.key /etc/openvpn/keys&lt;br /&gt;
 # chown -R root:wheel /etc/openvpn&lt;br /&gt;
 # chmod 700 /etc/openvpn/keys&lt;br /&gt;
 # chmod 644 /etc/openvpn/keys/{ca.crt,dh1024.pem,server.crt}&lt;br /&gt;
 # chmod 600 /etc/openvpn/keys/{server.key,ta.key}&lt;br /&gt;
&lt;br /&gt;
Процедура создания клиентских сертификатов практически аналогична соответствующей процедуре для сервера:&lt;br /&gt;
&lt;br /&gt;
 # ./build-key client1&lt;br /&gt;
 # mkdir -p /home/vpn/client1&lt;br /&gt;
 # mv client1.crt client1.key /home/vpn/client1&lt;br /&gt;
 # cp /etc/openvpn/keys/{ca.crt,ta.key} /home/vpn/client1&lt;br /&gt;
&lt;br /&gt;
Теперь подкаталог &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client1&amp;lt;/span&amp;gt; следует перенести на винч или флешку «географически изолированного» сотрудника.&lt;br /&gt;
&lt;br /&gt;
== Щепетильное конфигурирование ==&lt;br /&gt;
&lt;br /&gt;
Конфигурация сервера OpenVPN хранится в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/openvpn/server.conf&amp;lt;/span&amp;gt;. Ниже приведен пример подобного конфига. Все опции детально прокомментированы, поэтому сложностей возникнуть не должно. При настройке старайся «не срезать углы» — за один шаг добавляй/изменяй что-то одно и сразу же тестируй. Все действия в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;server.conf&amp;lt;/span&amp;gt; желательно фиксировать в локальном cvs-репозитории, чтобы можно было быстро просмотреть историю изменений и вернуться к рабочей ревизии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/openvpn/server.conf&lt;br /&gt;
 ; Работаем в режиме демона&lt;br /&gt;
 daemon openvpn&lt;br /&gt;
 ; Указываем местоположение файла с уникальным идентификатором процесса сервера&lt;br /&gt;
 ; OpenVPN&lt;br /&gt;
 writepid /var/openvpn/pid&lt;br /&gt;
 ; Определяем файл, содержащий список текущих клиентских соединений&lt;br /&gt;
 status /var/openvpn/status 10&lt;br /&gt;
 ; Внешний IP-адрес нашего сервера&lt;br /&gt;
 local 213.167.XX.YY&lt;br /&gt;
 ; Используемый порт&lt;br /&gt;
 port 1194&lt;br /&gt;
 ; Для транспорта по умолчанию применяется протокол UDP. Это вполне резонный&lt;br /&gt;
 ; подход. Во-первых, благодаря меньшему размеру заголовков и отсутствию&lt;br /&gt;
 ; встроенной функции подтверждения доставки пакетов, производительность UDP&lt;br /&gt;
 ; значительно выше. А во-вторых, при использовании UDP общая надежность не&lt;br /&gt;
 ; снижается, так как OpenVPN шифрует исходные пакеты, обеспечивая проверку&lt;br /&gt;
 ; ошибок и повторную передачу. В связи с этим TCP рекомендуется применять&lt;br /&gt;
 ; только в тех случаях, когда UDP не работает, например, если брандмауэр&lt;br /&gt;
 ; блокирует весь UDP-трафик.&lt;br /&gt;
 proto udp&lt;br /&gt;
 ; Выбираем тип виртуального устройства туннеля (tun, tap или null)&lt;br /&gt;
 dev tun0&lt;br /&gt;
 ; Включаем компрессию передаваемых данных&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 ; Указываем абсолютные пути к созданным сертификатам и ключам&lt;br /&gt;
 ca /etc/openvpn/keys/ca.crt&lt;br /&gt;
 cert /etc/openvpn/keys/server.crt&lt;br /&gt;
 key /etc/openvpn/keys/server.key&lt;br /&gt;
 dh /etc/openvpn/keys/dh1024.pem&lt;br /&gt;
 ; Значение 0 следует использовать на сервере, 1 - на клиенте&lt;br /&gt;
 tls-auth /etc/openvpn/keys/ta.key 0&lt;br /&gt;
 ; Для большинства сетей подойдет режим маршрутизатора (routed). Да, в этом&lt;br /&gt;
 ; случае широковещательный трафик отсутствует, соответственно, не будут работать&lt;br /&gt;
 ; некоторые протоколы, которые его используют, например NetBIOS поверх TCP. Но&lt;br /&gt;
 ; последнее нивелируется развертыванием WINS-сервера, либо подключением сетевых&lt;br /&gt;
 ; дисков/созданием ярлыков на расшаренные ресурсы&lt;br /&gt;
 server 192.168.3.0 255.255.255.0&lt;br /&gt;
 ; Проталкиваем подключенным клиентам статические маршруты, чтобы они могли&lt;br /&gt;
 ; получить доступ к ресурсам проводной и беспроводной сети&lt;br /&gt;
 push &amp;quot;route 192.168.1.0 255.255.255.0&amp;quot;&lt;br /&gt;
 push &amp;quot;route 192.168.2.0 255.255.255.0&amp;quot;&lt;br /&gt;
 ; Не позволяем соединению разорваться при простое&lt;br /&gt;
 keepalive 10 120&lt;br /&gt;
 ; Алгоритмы, используемые для аутентификации и шифрования пакетов&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Максимальное число одновременно подключенных VPN-пользователей&lt;br /&gt;
 max-clients 10&lt;br /&gt;
 ; Задаем файл журналирования событий и уровень детализации журнала, отображаем&lt;br /&gt;
 ; не более 20 экземпляров одного сообщения (остальные отбрасываем)&lt;br /&gt;
 log-append /var/log/openvpn.log&lt;br /&gt;
 verb 3&lt;br /&gt;
 mute 20&lt;br /&gt;
 ; Пользователь и группа, с правами которых работает демон&lt;br /&gt;
 user _openvpn&lt;br /&gt;
 group _openvpn&lt;br /&gt;
 ; Эти опции предотвращают доступ к некоторым ресурсам (например,&lt;br /&gt;
 ; tun-устройству) при перезапуске демона (рекомендуется применять только при&lt;br /&gt;
 ; снижении привилегий)&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 ; Сажаем демона в chroot-окружение&lt;br /&gt;
 chroot /var/empty&lt;br /&gt;
&lt;br /&gt;
Чтобы не вбивать директивы вручную, можно воспользоваться примером конфига, любезно предоставленным разработчиками:&lt;br /&gt;
 &lt;br /&gt;
 # cp /usr/local/share/examples/openvpn/sample-config-files/server.conf /etc/openvpn&lt;br /&gt;
&lt;br /&gt;
Поднимаем виртуальный интерфейс tun0:&lt;br /&gt;
&lt;br /&gt;
 # echo &amp;quot;up&amp;quot; &amp;gt; /etc/hostname.tun0&lt;br /&gt;
 # sh /etc/netstart tun0&lt;br /&gt;
&lt;br /&gt;
Запускаем сервер OpenVPN командой:&lt;br /&gt;
&lt;br /&gt;
 # /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
&lt;br /&gt;
Для автоматической загрузки OpenVPN достаточно прописать эту строчку в стартовый сценарий &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt;, например, так:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/rc.local&lt;br /&gt;
 if [ -x /usr/local/sbin/openvpn ]; then&lt;br /&gt;
    echo -n &amp;#039; openvpn&amp;#039;; /usr/local/sbin/openvpn --config /etc/openvpn/server.conf&lt;br /&gt;
 fi&lt;br /&gt;
&lt;br /&gt;
Далее смотрим в логи, чтобы убедиться в успешной загрузке нашего демона:&lt;br /&gt;
&lt;br /&gt;
 # tail /var/log/openvpn.log&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 IFCONFIG POOL: base=192.168.3.4 size=62&lt;br /&gt;
 Sun Dec  2 15:31:37 2007 Initialization Sequence Completed&lt;br /&gt;
&lt;br /&gt;
Чтобы проверить состояние псевдоустройства туннелирования, можно воспользоваться утилитой &amp;lt;tt&amp;gt;ifconfig&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # ifconfig tun0&lt;br /&gt;
 tun0: flags=8051&amp;lt;UP,POINTOPOINT,RUNNING,MULTICAST&amp;gt; mtu 1500&lt;br /&gt;
 groups: tun&lt;br /&gt;
 inet 192.168.3.1 --&amp;gt; 192.168.3.2 netmask 0xffffffff&lt;br /&gt;
&lt;br /&gt;
Для корректной работы сервера OpenVPN необходимо разрешить прохождение любого трафика через интерфейс OpenVPN, а также входящие подключения на внешний адрес сервера порт 1194/udp:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 pass quick on { lo tun0 $int_if } inet&lt;br /&gt;
 pass in on $ext_if inet proto udp from any to $ext_if port 1194 \&lt;br /&gt;
 keep state&lt;br /&gt;
&lt;br /&gt;
Перезагружаем набор рулесетов файервола:&lt;br /&gt;
&lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
== Инсталляция на стороне клиента ==&lt;br /&gt;
&lt;br /&gt;
Итак, VPN-сервер работает и готов принимать подключения. Развертывание VPN-клиентов для VPN-подключений удаленного доступа состоит из двух действий: установка программы OpenVPN GUI и правка конфигурационного файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;client*.ovpn&amp;lt;/span&amp;gt;.&lt;br /&gt;
 &lt;br /&gt;
 C:\Program Files\OpenVPN\config\mycompany_client1.ovpn&lt;br /&gt;
 ; Работаем в режиме клиента&lt;br /&gt;
 client&lt;br /&gt;
 dev tun&lt;br /&gt;
 ; Указываем IP-адрес и порт VPN-сервера&lt;br /&gt;
 remote 213.167.XX.YY 1194&lt;br /&gt;
 proto udp&lt;br /&gt;
 resolv-retry infinite&lt;br /&gt;
 nobind&lt;br /&gt;
 pull&lt;br /&gt;
 comp-lzo&lt;br /&gt;
 persist-key&lt;br /&gt;
 persist-tun&lt;br /&gt;
 verb 3&lt;br /&gt;
 ; Я предпочитаю хранить crt и key файлы на флешке&lt;br /&gt;
 ca &amp;quot;f:\\vpn\\mycompany\\ca.crt&amp;quot;&lt;br /&gt;
 cert &amp;quot;f:\\vpn\\mycompany\\client1.crt&amp;quot;&lt;br /&gt;
 key &amp;quot;f:\\vpn\\mycompany\\client1.key&amp;quot;&lt;br /&gt;
 tls-auth &amp;quot;f:\\vpn\\mycompany\\ta.key&amp;quot; 1&lt;br /&gt;
 ns-cert-type server&lt;br /&gt;
 ; Нижеследующие алгоритмы должны совпадать с теми, что заданы на сервере&lt;br /&gt;
 auth SHA1&lt;br /&gt;
 cipher AES-256-CBC&lt;br /&gt;
 ; Без этих двух директив Vista-клиенты не смогут получать маршруты от сервера&lt;br /&gt;
 ; route-method exe&lt;br /&gt;
 ; route-delay 2&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения к VPN-серверу достаточно в трее щелкнуть правой кнопкой мыши на значке с красными мониторчиками, выбрать конфиг &amp;lt;tt&amp;gt;mycompany_client1&amp;lt;/tt&amp;gt; и нажать Connect.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Аутентификационный шлюз на базе pf и authpf ==&lt;br /&gt;
&lt;br /&gt;
В BSD-системах, используя связку пакетного фильтра pf и авторизационного шелла authpf, можно контролировать доступ клиентов, подключающихся к VPN-службе и корпоративной сети. Схема работы такой конструкции довольно проста: пользователь логинится по ssh, и, в зависимости от введенных данных (имя и пароль), на сервере вступают в силу персональные правила файервола, в данном случае разрешающие прохождение UDP-пакетов к порту 1194.&lt;br /&gt;
Но прежде, чем производить настройку &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, необходимо переопределить некоторые дефолтные значения переменных демона [http://www.openbsd.org/cgi-bin/man.cgi?query=sshd&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html sshd(8)]. Так мы усложним потенциальному злоумышленнику успешное проведение атаки с целью перехвата и подмены ssh-сессии.&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/ssh/sshd_config&lt;br /&gt;
 # Работаем с использованием протоколов IPv4 и ssh2&lt;br /&gt;
 AddressFamily inet&lt;br /&gt;
 Protocol 2&lt;br /&gt;
 # Ожидаем подключения по всем доступным сетевым интерфейсам&lt;br /&gt;
 ListenAddress 0.0.0.0&lt;br /&gt;
 # Запрещаем регистрацию root&amp;#039;а и применение пустых паролей&lt;br /&gt;
 PermitRootLogin no&lt;br /&gt;
 PermitEmptyPasswords no&lt;br /&gt;
 # За счет использования протокола ssh2 и этих двух опций усложняем проведение&lt;br /&gt;
 # атак типа ARP- и IP-spoofing&lt;br /&gt;
 ClientAliveInterval 15&lt;br /&gt;
 ClientAliveCountMax 3&lt;br /&gt;
 # Отключаем DNS-резолвинг&lt;br /&gt;
 UseDNS no&lt;br /&gt;
 # Определяем списки контроля доступом&lt;br /&gt;
 AllowGroups wheel users authpf&lt;br /&gt;
&lt;br /&gt;
Для того чтобы внесенные изменения вступили в силу, необходимо дать указание демону перечитать свой конфиг:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `sed q /var/run/sshd.pid`&lt;br /&gt;
&lt;br /&gt;
Authpf представляет собой псевдооболочку, которая назначается пользователю системы в качестве &amp;lt;tt&amp;gt;login shell&amp;lt;/tt&amp;gt; (примечание: запись «&amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/sbin/authpf&amp;lt;/span&amp;gt;» в файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/shells&amp;lt;/span&amp;gt; добавлять не следует). При авторизации пользователя по ssh к текущим правилам фильтра пакетов с помощью так называемых якорей &amp;lt;tt&amp;gt;(anchors)&amp;lt;/tt&amp;gt; будут присоединены правила, указанные в файле &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/authpf.rules&amp;lt;/span&amp;gt;, либо в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/authpf/users/$USER&amp;lt;/span&amp;gt;. В добавляемых правилах допускается использование зарезервированных макросов &amp;lt;tt&amp;gt;$user_id&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;$user_ip&amp;lt;/tt&amp;gt;, за счет которых будет происходить автоматическая подстановка имени и IP-адреса подключившегося пользователя (значения макросов считываются из переменных окружения ssh автоматически).&lt;br /&gt;
В конец файла &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;[http://www.openbsd.org/cgi-bin/man.cgi?query=login.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html login.conf(5)]&amp;lt;/span&amp;gt; заносим сведения о новом классе &amp;lt;tt&amp;gt;authpf&amp;lt;/tt&amp;gt;, пользователи которого в качестве стандартного шелла будут получать authpf:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/login.conf&lt;br /&gt;
 authpf:\&lt;br /&gt;
   :shell=/usr/sbin/authpf:\&lt;br /&gt;
   :tc=default:&lt;br /&gt;
&lt;br /&gt;
С помощью штатной утилиты [http://www.openbsd.org/cgi-bin/man.cgi?query=cap_mkdb&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html cap_mkdb(1)] обновляем хэшированную базу данных &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/login.conf.db&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # cap_mkdb /etc/login.conf&lt;br /&gt;
&lt;br /&gt;
Мы не будем переопределять умолчальные значения директив &amp;lt;tt&amp;gt;anchor&amp;lt;/tt&amp;gt; и &amp;lt;tt&amp;gt;table&amp;lt;/tt&amp;gt;, поэтому файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;authpf.conf&amp;lt;/span&amp;gt; оставляем пустым:&lt;br /&gt;
&lt;br /&gt;
 # echo -n &amp;gt; /etc/authpf/authpf.conf&lt;br /&gt;
&lt;br /&gt;
Подготавливаем приветственное сообщение authpf.message (аналог /etc/motd):&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/authpf.message&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
Создаем нового пользователя, который принадлежит классу authpf, входит в группу authpf и в качестве оболочки получает /usr/sbin/authpf:&lt;br /&gt;
&lt;br /&gt;
 # useradd -m -c &amp;#039;authpf vpn user&amp;#039; -g authpf -L authpf \&lt;br /&gt;
 -s /usr/sbin/authpf client1&lt;br /&gt;
 # passwd client1&lt;br /&gt;
&lt;br /&gt;
Рисуем правило файервола, разрешающее пользователю client1 доступ к серверу OpenVPN:&lt;br /&gt;
&lt;br /&gt;
 # mkdir -p /etc/authpf/users/client1&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/authpf/users/client1/authpf.rules&lt;br /&gt;
 pass in log quick on fxp0 inet proto udp from $user_ip to fxp0 \&lt;br /&gt;
 port 1194 keep state&lt;br /&gt;
&lt;br /&gt;
Теперь для подключения механизма якорей добавим следующие записи в [http://www.openbsd.org/cgi-bin/man.cgi?query=pf.conf&amp;amp;apropos=0&amp;amp;sektion=0&amp;amp;manpath=OpenBSD+Current&amp;amp;arch=i386&amp;amp;format=html pf.conf(5)]:&lt;br /&gt;
&lt;br /&gt;
 # vi /etc/pf.conf&lt;br /&gt;
 nat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 rdr-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 binat-anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
 ...&lt;br /&gt;
 pass in log on $ext_if inet proto tcp to fxp0 port ssh keep state&lt;br /&gt;
 ...&lt;br /&gt;
 anchor &amp;quot;authpf/*&amp;quot;&lt;br /&gt;
&lt;br /&gt;
И перезагрузим набор рулесетов файервола:&lt;br /&gt;
 &lt;br /&gt;
 # pfctl -f /etc/pf.conf&lt;br /&gt;
&lt;br /&gt;
На стороне клиента открываем любой ssh-клиент, например, Putty или SecureCRT, создаем новую сессию, указываем IP-адрес сервера и имя пользователя. Если все настроено правильно, после успешной авторизации правила файервола на сервере для этого пользователя изменятся, и он получит доступ к VPN-службе.&lt;br /&gt;
&lt;br /&gt;
 # f:\vpn\putty&amp;gt; plink.exe -pw mypassword client1@213.167.XX.YY&lt;br /&gt;
 Hello client1. You are authenticated from host &amp;quot;77.41.XX.YY&amp;quot;&lt;br /&gt;
 This service is for authorised VPN-clients only. Please play nice.&lt;br /&gt;
&lt;br /&gt;
А чтобы постоянно не вводить пароль, можно настроить аутентификацию на базе публичного ключа.&lt;br /&gt;
&lt;br /&gt;
== Эндшпиль ==&lt;br /&gt;
&lt;br /&gt;
Эта статья включает полный набор пошаговых действий, необходимых для внедрения базового VPN-решения удаленного доступа, используя BSD-систему в качестве VPN-сервера и WinXP/Vista в качестве VPN-клиента. Развернув в 3-4 компаниях подобную конфигурацию, ты сможешь не с пустыми кредиткой и кошельком ехать в Египет греть пятки. Удачи.&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_sendmail&amp;diff=186</id>
		<title>Настройка sendmail</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_sendmail&amp;diff=186"/>
		<updated>2013-06-03T12:32:43Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Как заставить sendmail использовать /etc/hosts */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка TLS и SSL ==&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 8.11, sendmail поддерживает защиту ESMTP соединения с помощью расширения STARTTLS (RFC 2487). Для настройки TLS прежде всего нужно создать SSL сертификат и секретный DSA-ключ для шифрования:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mkdir -m 700 /etc/mail/certs&lt;br /&gt;
# openssl dsaparam 1024 -out dsa1024.pem&lt;br /&gt;
# openssl req -x509 -nodes -days 365 -newkey dsa: dsa1024.pem \&lt;br /&gt;
 -out /etc/mail/certs/mycert.pem -keyout /etc/mail/certs/mykey.pem&lt;br /&gt;
# rm -f dsa1024.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если у вас уже есть ключ шифрования, то для создания сертификата следует подать команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# openssl req -x509 -new -days 365 -key /etc/mail/certs/mykey.pem \&lt;br /&gt;
-out /etc/mail/certs/mycert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;#039;&amp;#039;-days&amp;#039;&amp;#039; позволяет указать количество дней, в течение которых сертификат будет действительным. Чтобы проверить созданный сертификат, можно воспользоваться следующей командой:&lt;br /&gt;
&lt;br /&gt;
 # openssl x509 -in /etc/mail/certs/mycert.pem -text&lt;br /&gt;
&lt;br /&gt;
Если вы не планируете использовать TLS для авторизации (не путать с [[#Настройка SMTP авторизации|SMTP авторизацией]]) или используете сертификат, подписанный самим собой, следует создать symlink:&lt;br /&gt;
&lt;br /&gt;
 # ln -s /etc/mail/certs/mycert.pem /etc/mail/certs/CAcert.pem&lt;br /&gt;
&lt;br /&gt;
В противном случае следует поместить сертификат авторизации в файл  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/mail/certs/CAcert.pem&amp;lt;/span&amp;gt; Не забудьте установить права, запрещающие чтение/запись файлов сертификатов и ключей простым пользователям:&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/mail/certs/*&lt;br /&gt;
&lt;br /&gt;
Теперь следует настроить sendmail. В .mc файле конфигурации нужно добавить следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define(`CERT_DIR&amp;#039;, `MAIL_SETTINGS_DIR`&amp;#039;certs&amp;#039;)dnl&lt;br /&gt;
define(`confCACERT_PATH&amp;#039;, `CERT_DIR&amp;#039;)dnl&lt;br /&gt;
define(`confCACERT&amp;#039;, `CERT_DIR/CAcert.pem&amp;#039;)dnl&lt;br /&gt;
define(`confSERVER_CERT&amp;#039;, `CERT_DIR/mycert.pem&amp;#039;)dnl&lt;br /&gt;
define(`confSERVER_KEY&amp;#039;, `CERT_DIR/mykey.pem&amp;#039;)dnl&lt;br /&gt;
define(`confCLIENT_CERT&amp;#039;, `CERT_DIR/mycert.pem&amp;#039;)dnl&lt;br /&gt;
define(`confCLIENT_KEY&amp;#039;, `CERT_DIR/mykey.pem&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После добавления вышеуказанных строк в файл конфигурации следует пересобрать его с помощью m4 (см. файл  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/share/sendmail/README&amp;lt;/span&amp;gt;) и рестартовать уже запущенный sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
Для проверки настроек TLS можно воспользоваться командой telnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# telnet localhost smtp&lt;br /&gt;
Trying 127.0.0.1…&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is &amp;#039;^]&amp;#039;.&lt;br /&gt;
220 form.home.lan ESMTP Sendmail 8.13.1/8.13.1; Wed, 17 Nov 2004 13:42:08 +0600&lt;br /&gt;
(NOVT)&lt;br /&gt;
EHLO localhost&lt;br /&gt;
250-form.home.lan Hello root@localhost.home.lan [127.0.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-SIZE&lt;br /&gt;
250-DSN&lt;br /&gt;
250-ETRN&lt;br /&gt;
250-AUTH PLAIN&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250-DELIVERBY&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При правильной настройке в ответе сервера на команду «EHLO» должна присутствовать строка «250-STARTTLS». Смотрите также по данной теме  &lt;br /&gt;
[http://www.openbsd.pw/files/www.openbsd.org/cgi-bin/man.cgi@query=starttls&amp;amp;sektion=8 starttls(8)],  &lt;br /&gt;
[http://www.openbsd.pw/files/www.openbsd.org/cgi-bin/man.cgi@query=ssl&amp;amp;sektion=8 ssl(8)],  &lt;br /&gt;
[http://www.sendmail.org/~ca/email/starttls.html http://www.sendmail.org/~ca/email/starttls.html],   &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/share/sendmail/README&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для того чтобы научить sendmail работать по SSL (без использования STARTTLS), нужно создать и добавить в .mc файл сертификат и ключ для шифрования, как описано выше, а также добавить следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DAEMON_OPTIONS(`Name=MTA&amp;#039;)dnl&lt;br /&gt;
DAEMON_OPTIONS(`Port=465, Name=MTA-SSL, M=s&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не забудьте перезапустить sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
Для проверки можно воспользоваться командой openssl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# openssl s_client -connect localhost:465&lt;br /&gt;
CONNECTED(00000004)&lt;br /&gt;
&lt;br /&gt;
[…]&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
SSL handshake has read 1409 bytes and written 288 bytes&lt;br /&gt;
---&lt;br /&gt;
New, TLSv1/SSLv3, Cipher is DHE-DSS-AES256-SHA&lt;br /&gt;
Server public key is 1024 bit&lt;br /&gt;
SSL-Session:&lt;br /&gt;
    Protocol  : TLSv1&lt;br /&gt;
    Cipher    : DHE-DSS-AES256-SHA&lt;br /&gt;
    Session-ID:&lt;br /&gt;
28CAD859854BC30F61B0013DF835E69CDB0037D82FD741F9C7A56DD1E25B655&lt;br /&gt;
    Session-ID-ctx:&lt;br /&gt;
    Master-Key:&lt;br /&gt;
F5BA53F5C0659E3E12D1057FE8D4AEA8177A868169B35949793ABECED7870A29FF4B3AFB9D479EA86618185D5192B837&lt;br /&gt;
    Key-Arg   : None&lt;br /&gt;
    Start Time: 1119252698&lt;br /&gt;
    Timeout   : 300 (sec)&lt;br /&gt;
    Verify return code: 18 (self signed certificate)&lt;br /&gt;
---&lt;br /&gt;
220 cvs.openbsd.ru ESMTP Sendmail 8.12.11/8.12.11; Mon, 20 Jun 2005 11:37:06 +0400 (MSD)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка SMTP авторизации ==&lt;br /&gt;
&lt;br /&gt;
Для настройки авторизации следует пересобрать sendmail с поддержкой SASL. Для этого следует установить пакет &amp;#039;&amp;#039;cyrus-sasl2&amp;#039;&amp;#039; или порт &amp;#039;&amp;#039;security/cyrus-sasl2&amp;#039;&amp;#039;. Для включения поддержки SASL нам потребуется перекомпилировать sendmail следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# echo WANT_SMTPAUTH=yes &amp;gt;&amp;gt; /etc/mk.conf&lt;br /&gt;
# cd /usr/src/gnu/usr.sbin/sendmail&lt;br /&gt;
# make cleandir&lt;br /&gt;
# make obj&lt;br /&gt;
# make depend&lt;br /&gt;
# make&lt;br /&gt;
# make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно воспользоваться набором site.tar.gz и пересобрать sendmail, установив настройку SENDMAIL_SASL=Yes в mk.conf.&lt;br /&gt;
&lt;br /&gt;
Далее следует создать файл конфигурации SASL для sendmail ( &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/local/lib/sasl2/Sendmail.conf&amp;lt;/span&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 pwcheck_method: saslauthd&lt;br /&gt;
&lt;br /&gt;
Добавляем в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt; строки для запуска saslauthd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if [ -x /usr/local/sbin/saslauthd ]; then&lt;br /&gt;
 echo -n &amp;#039; saslauthd&amp;#039;; /usr/local/sbin/saslauthd -a getpwent&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь остается только включить поддержку авторизации в .mc файле конфигурации sendmail:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dnl&lt;br /&gt;
dnl Эту опцию следует включить, чтобы запретить авторизацию с помощью&lt;br /&gt;
dnl механизмов PLAIN и LOGIN по незащищенному соединению&lt;br /&gt;
dnl (без использования TLS).&lt;br /&gt;
dnl&lt;br /&gt;
define(`confAUTH_OPTIONS&amp;#039;, `p&amp;#039;)dnl&lt;br /&gt;
dnl&lt;br /&gt;
dnl Список допустимых механизмов авторизации. Для всех механизмов,&lt;br /&gt;
dnl кроме PLAIN и LOGIN, невозможна авторизация по системному файлу&lt;br /&gt;
dnl паролей. Для них следует использовать sasldb или другие способы&lt;br /&gt;
dnl авторизации (см. документацию sasl2).&lt;br /&gt;
dnl&lt;br /&gt;
define(`confAUTH_MECHANISMS&amp;#039;, `DIGEST-MD5 CRAM-MD5 PLAIN LOGIN&amp;#039;)dnl&lt;br /&gt;
dnl&lt;br /&gt;
dnl Список механизмов, авторизация по которым разрешает использовать&lt;br /&gt;
dnl сервер для пересылки почты (relaying).&lt;br /&gt;
dnl&lt;br /&gt;
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 PLAIN LOGIN&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не забудьте перезапустить sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
Для проверки настройки авторизации можно воспользоваться командой telnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# telnet localhost smtp&lt;br /&gt;
Trying 127.0.0.1…&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is &amp;#039;^]&amp;#039;.&lt;br /&gt;
220 form.home.lan ESMTP Sendmail 8.13.1/8.13.1; Wed, 17 Nov 2004 13:42:08 +0600&lt;br /&gt;
(NOVT)&lt;br /&gt;
EHLO localhost&lt;br /&gt;
250-form.home.lan Hello root@localhost.home.lan [127.0.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-SIZE&lt;br /&gt;
250-DSN&lt;br /&gt;
250-ETRN&lt;br /&gt;
250-AUTH DIGEST-MD5 CRAM-MD5&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250-DELIVERBY&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При правильной настройке в ответе сервера на команду «EHLO» должна присутствовать строка «250-AUTH». В случае если в файле конфигурации запрещено использование PLAIN авторизации по незащищенному соединению, вместо команды telnet следует использовать команду openssl:&lt;br /&gt;
&lt;br /&gt;
 # openssl s_client -starttls smtp -connect localhost: smtp&lt;br /&gt;
&lt;br /&gt;
Смотрите также  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/share/sendmail/README&amp;lt;/span&amp;gt;, [[#Настройка TLS и SSL|Настройка TLS и SSL]].&lt;br /&gt;
&lt;br /&gt;
== Настройка sendmail как SMTP клиента с авторизацией ==&lt;br /&gt;
&lt;br /&gt;
В случае, когда sendmail выступает в роли клиента, демон saslauthd не требуется. В файл конфигурации необходимо внести следующие изменения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define(`SMART_HOST&amp;#039;, `smtp: smtp.domain.ru&amp;#039;)dnl&lt;br /&gt;
define(`confAUTH_MECHANISMS&amp;#039;, `DIGEST-MD5 CRAM-MD5 PLAIN LOGIN&amp;#039;)dnl&lt;br /&gt;
FEATURE(`authinfo&amp;#039;, `hash /etc/mail/authinfo&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указываем SMTP-сервер, имя и пароль пользователя, а также метод аутентификации в отдельном файле  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/mail/authinfo&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 AuthInfo: smtp.domain.ru «U:username@domain.ru» «P:mypassword» «M:CRAM-MD5»&lt;br /&gt;
&lt;br /&gt;
Создаем хэшированную базу данных  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/mail/authinfo.db&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # makemap hash /etc/mail/authinfo &amp;lt; /etc/mail/authinfo&lt;br /&gt;
&lt;br /&gt;
== Как заставить sendmail использовать /etc/hosts ==&lt;br /&gt;
&lt;br /&gt;
По умолчанию sendmail использует в первую очередь DNS. Чтобы заставить его сначала смотреть  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/hosts&amp;lt;/span&amp;gt;, нужно создать файл  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/mail/service.switch&amp;lt;/span&amp;gt; и прописать в нем следующую строку:&lt;br /&gt;
&lt;br /&gt;
 hosts files dns&lt;br /&gt;
&lt;br /&gt;
После этого достаточно перезапустить sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
== Хранение писем в Maildir ==&lt;br /&gt;
&lt;br /&gt;
По умолчанию sendmail использует mail.local в качестве локального агента доставки почты. При этом почта доставляется в формате стандартного BSD mailbox. Чтобы доставлять почту в Maildir, нам потребуется установить альтернативный агент доставки mail.buhal, который можно скачать [http://pdp-11.org.ru/~form/openbsd/files/sys/mail.buhal-1.0.tar.gz отсюда].&lt;br /&gt;
&lt;br /&gt;
Сначала нужно собрать и установить mail.buhal:&lt;br /&gt;
&lt;br /&gt;
 # make depend &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;
&lt;br /&gt;
Далее следует указать mail.buhal в файле конфигурации sendmail в качестве локального агента доставки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define(`LOCAL_MAILER_PATH&amp;#039;, `/usr/libexec/mail.buhal&amp;#039;)dnl&lt;br /&gt;
MODIFY_MAILER_FLAGS(`LOCAL&amp;#039;, `-m&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь достаточно перекомпилировать файл конфигурации и перезапустить sendmail.&lt;br /&gt;
&lt;br /&gt;
В портах OpenBSD, в категории mail, есть программы  &amp;#039;&amp;#039;procmail&amp;#039;&amp;#039; и &amp;#039;&amp;#039;maildrop&amp;#039;&amp;#039;, которые также поддерживают формат Maildir и дополнительные расширения данного формата.&lt;br /&gt;
&lt;br /&gt;
== Использование procmail в качестве LDA ==&lt;br /&gt;
&lt;br /&gt;
После установки procmail из портов или пакетов, необходимо создать глобальный конфигурационный файл. Пример конфигурации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Секция общих настроек.&lt;br /&gt;
# &lt;br /&gt;
DROPPRIVS=yes&lt;br /&gt;
COMSAT=no&lt;br /&gt;
VERBOSE=off&lt;br /&gt;
SHELL=/bin/sh&lt;br /&gt;
PATH=/bin:/usr/bin:/usr/local/bin&lt;br /&gt;
LOCKFILE=$HOME/.lockmail&lt;br /&gt;
LOGFILE=$HOME/procmail.log&lt;br /&gt;
&lt;br /&gt;
# Складываем почту в формате Maildir.&lt;br /&gt;
# &lt;br /&gt;
MAILDIR=$HOME/Maildir/&lt;br /&gt;
DEFAULT=$MAILDIR&lt;br /&gt;
&lt;br /&gt;
# Входящую корреспонденцию можно резервировать в файлы формата mbox.&lt;br /&gt;
# &lt;br /&gt;
#: 0 c&lt;br /&gt;
# /var/mail/$LOGNAME&lt;br /&gt;
&lt;br /&gt;
# Либо передавать в хранилище на другом хосте.&lt;br /&gt;
# &lt;br /&gt;
#: 0 c&lt;br /&gt;
# ! mail@mx2.domain.ru&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее необходимо изменить локальный агент доставки (LDA) с mail.local на procmail:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FEATURE(local_procmail)dnl&lt;br /&gt;
MAILER(local)dnl&lt;br /&gt;
MAILER(smtp)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь достаточно перекомпилировать файл конфигурации и перезапустить sendmail.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_sendmail&amp;diff=185</id>
		<title>Настройка sendmail</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_sendmail&amp;diff=185"/>
		<updated>2013-06-03T12:31:20Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Настройка sendmail как SMTP клиента с авторизацией */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка TLS и SSL ==&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 8.11, sendmail поддерживает защиту ESMTP соединения с помощью расширения STARTTLS (RFC 2487). Для настройки TLS прежде всего нужно создать SSL сертификат и секретный DSA-ключ для шифрования:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mkdir -m 700 /etc/mail/certs&lt;br /&gt;
# openssl dsaparam 1024 -out dsa1024.pem&lt;br /&gt;
# openssl req -x509 -nodes -days 365 -newkey dsa: dsa1024.pem \&lt;br /&gt;
 -out /etc/mail/certs/mycert.pem -keyout /etc/mail/certs/mykey.pem&lt;br /&gt;
# rm -f dsa1024.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если у вас уже есть ключ шифрования, то для создания сертификата следует подать команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# openssl req -x509 -new -days 365 -key /etc/mail/certs/mykey.pem \&lt;br /&gt;
-out /etc/mail/certs/mycert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;#039;&amp;#039;-days&amp;#039;&amp;#039; позволяет указать количество дней, в течение которых сертификат будет действительным. Чтобы проверить созданный сертификат, можно воспользоваться следующей командой:&lt;br /&gt;
&lt;br /&gt;
 # openssl x509 -in /etc/mail/certs/mycert.pem -text&lt;br /&gt;
&lt;br /&gt;
Если вы не планируете использовать TLS для авторизации (не путать с [[#Настройка SMTP авторизации|SMTP авторизацией]]) или используете сертификат, подписанный самим собой, следует создать symlink:&lt;br /&gt;
&lt;br /&gt;
 # ln -s /etc/mail/certs/mycert.pem /etc/mail/certs/CAcert.pem&lt;br /&gt;
&lt;br /&gt;
В противном случае следует поместить сертификат авторизации в файл  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/mail/certs/CAcert.pem&amp;lt;/span&amp;gt; Не забудьте установить права, запрещающие чтение/запись файлов сертификатов и ключей простым пользователям:&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/mail/certs/*&lt;br /&gt;
&lt;br /&gt;
Теперь следует настроить sendmail. В .mc файле конфигурации нужно добавить следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define(`CERT_DIR&amp;#039;, `MAIL_SETTINGS_DIR`&amp;#039;certs&amp;#039;)dnl&lt;br /&gt;
define(`confCACERT_PATH&amp;#039;, `CERT_DIR&amp;#039;)dnl&lt;br /&gt;
define(`confCACERT&amp;#039;, `CERT_DIR/CAcert.pem&amp;#039;)dnl&lt;br /&gt;
define(`confSERVER_CERT&amp;#039;, `CERT_DIR/mycert.pem&amp;#039;)dnl&lt;br /&gt;
define(`confSERVER_KEY&amp;#039;, `CERT_DIR/mykey.pem&amp;#039;)dnl&lt;br /&gt;
define(`confCLIENT_CERT&amp;#039;, `CERT_DIR/mycert.pem&amp;#039;)dnl&lt;br /&gt;
define(`confCLIENT_KEY&amp;#039;, `CERT_DIR/mykey.pem&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После добавления вышеуказанных строк в файл конфигурации следует пересобрать его с помощью m4 (см. файл  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/share/sendmail/README&amp;lt;/span&amp;gt;) и рестартовать уже запущенный sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
Для проверки настроек TLS можно воспользоваться командой telnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# telnet localhost smtp&lt;br /&gt;
Trying 127.0.0.1…&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is &amp;#039;^]&amp;#039;.&lt;br /&gt;
220 form.home.lan ESMTP Sendmail 8.13.1/8.13.1; Wed, 17 Nov 2004 13:42:08 +0600&lt;br /&gt;
(NOVT)&lt;br /&gt;
EHLO localhost&lt;br /&gt;
250-form.home.lan Hello root@localhost.home.lan [127.0.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-SIZE&lt;br /&gt;
250-DSN&lt;br /&gt;
250-ETRN&lt;br /&gt;
250-AUTH PLAIN&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250-DELIVERBY&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При правильной настройке в ответе сервера на команду «EHLO» должна присутствовать строка «250-STARTTLS». Смотрите также по данной теме  &lt;br /&gt;
[http://www.openbsd.pw/files/www.openbsd.org/cgi-bin/man.cgi@query=starttls&amp;amp;sektion=8 starttls(8)],  &lt;br /&gt;
[http://www.openbsd.pw/files/www.openbsd.org/cgi-bin/man.cgi@query=ssl&amp;amp;sektion=8 ssl(8)],  &lt;br /&gt;
[http://www.sendmail.org/~ca/email/starttls.html http://www.sendmail.org/~ca/email/starttls.html],   &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/share/sendmail/README&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для того чтобы научить sendmail работать по SSL (без использования STARTTLS), нужно создать и добавить в .mc файл сертификат и ключ для шифрования, как описано выше, а также добавить следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DAEMON_OPTIONS(`Name=MTA&amp;#039;)dnl&lt;br /&gt;
DAEMON_OPTIONS(`Port=465, Name=MTA-SSL, M=s&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не забудьте перезапустить sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
Для проверки можно воспользоваться командой openssl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# openssl s_client -connect localhost:465&lt;br /&gt;
CONNECTED(00000004)&lt;br /&gt;
&lt;br /&gt;
[…]&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
SSL handshake has read 1409 bytes and written 288 bytes&lt;br /&gt;
---&lt;br /&gt;
New, TLSv1/SSLv3, Cipher is DHE-DSS-AES256-SHA&lt;br /&gt;
Server public key is 1024 bit&lt;br /&gt;
SSL-Session:&lt;br /&gt;
    Protocol  : TLSv1&lt;br /&gt;
    Cipher    : DHE-DSS-AES256-SHA&lt;br /&gt;
    Session-ID:&lt;br /&gt;
28CAD859854BC30F61B0013DF835E69CDB0037D82FD741F9C7A56DD1E25B655&lt;br /&gt;
    Session-ID-ctx:&lt;br /&gt;
    Master-Key:&lt;br /&gt;
F5BA53F5C0659E3E12D1057FE8D4AEA8177A868169B35949793ABECED7870A29FF4B3AFB9D479EA86618185D5192B837&lt;br /&gt;
    Key-Arg   : None&lt;br /&gt;
    Start Time: 1119252698&lt;br /&gt;
    Timeout   : 300 (sec)&lt;br /&gt;
    Verify return code: 18 (self signed certificate)&lt;br /&gt;
---&lt;br /&gt;
220 cvs.openbsd.ru ESMTP Sendmail 8.12.11/8.12.11; Mon, 20 Jun 2005 11:37:06 +0400 (MSD)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка SMTP авторизации ==&lt;br /&gt;
&lt;br /&gt;
Для настройки авторизации следует пересобрать sendmail с поддержкой SASL. Для этого следует установить пакет &amp;#039;&amp;#039;cyrus-sasl2&amp;#039;&amp;#039; или порт &amp;#039;&amp;#039;security/cyrus-sasl2&amp;#039;&amp;#039;. Для включения поддержки SASL нам потребуется перекомпилировать sendmail следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# echo WANT_SMTPAUTH=yes &amp;gt;&amp;gt; /etc/mk.conf&lt;br /&gt;
# cd /usr/src/gnu/usr.sbin/sendmail&lt;br /&gt;
# make cleandir&lt;br /&gt;
# make obj&lt;br /&gt;
# make depend&lt;br /&gt;
# make&lt;br /&gt;
# make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно воспользоваться набором site.tar.gz и пересобрать sendmail, установив настройку SENDMAIL_SASL=Yes в mk.conf.&lt;br /&gt;
&lt;br /&gt;
Далее следует создать файл конфигурации SASL для sendmail ( &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/local/lib/sasl2/Sendmail.conf&amp;lt;/span&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 pwcheck_method: saslauthd&lt;br /&gt;
&lt;br /&gt;
Добавляем в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt; строки для запуска saslauthd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if [ -x /usr/local/sbin/saslauthd ]; then&lt;br /&gt;
 echo -n &amp;#039; saslauthd&amp;#039;; /usr/local/sbin/saslauthd -a getpwent&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь остается только включить поддержку авторизации в .mc файле конфигурации sendmail:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dnl&lt;br /&gt;
dnl Эту опцию следует включить, чтобы запретить авторизацию с помощью&lt;br /&gt;
dnl механизмов PLAIN и LOGIN по незащищенному соединению&lt;br /&gt;
dnl (без использования TLS).&lt;br /&gt;
dnl&lt;br /&gt;
define(`confAUTH_OPTIONS&amp;#039;, `p&amp;#039;)dnl&lt;br /&gt;
dnl&lt;br /&gt;
dnl Список допустимых механизмов авторизации. Для всех механизмов,&lt;br /&gt;
dnl кроме PLAIN и LOGIN, невозможна авторизация по системному файлу&lt;br /&gt;
dnl паролей. Для них следует использовать sasldb или другие способы&lt;br /&gt;
dnl авторизации (см. документацию sasl2).&lt;br /&gt;
dnl&lt;br /&gt;
define(`confAUTH_MECHANISMS&amp;#039;, `DIGEST-MD5 CRAM-MD5 PLAIN LOGIN&amp;#039;)dnl&lt;br /&gt;
dnl&lt;br /&gt;
dnl Список механизмов, авторизация по которым разрешает использовать&lt;br /&gt;
dnl сервер для пересылки почты (relaying).&lt;br /&gt;
dnl&lt;br /&gt;
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 PLAIN LOGIN&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не забудьте перезапустить sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
Для проверки настройки авторизации можно воспользоваться командой telnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# telnet localhost smtp&lt;br /&gt;
Trying 127.0.0.1…&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is &amp;#039;^]&amp;#039;.&lt;br /&gt;
220 form.home.lan ESMTP Sendmail 8.13.1/8.13.1; Wed, 17 Nov 2004 13:42:08 +0600&lt;br /&gt;
(NOVT)&lt;br /&gt;
EHLO localhost&lt;br /&gt;
250-form.home.lan Hello root@localhost.home.lan [127.0.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-SIZE&lt;br /&gt;
250-DSN&lt;br /&gt;
250-ETRN&lt;br /&gt;
250-AUTH DIGEST-MD5 CRAM-MD5&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250-DELIVERBY&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При правильной настройке в ответе сервера на команду «EHLO» должна присутствовать строка «250-AUTH». В случае если в файле конфигурации запрещено использование PLAIN авторизации по незащищенному соединению, вместо команды telnet следует использовать команду openssl:&lt;br /&gt;
&lt;br /&gt;
 # openssl s_client -starttls smtp -connect localhost: smtp&lt;br /&gt;
&lt;br /&gt;
Смотрите также  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/share/sendmail/README&amp;lt;/span&amp;gt;, [[#Настройка TLS и SSL|Настройка TLS и SSL]].&lt;br /&gt;
&lt;br /&gt;
== Настройка sendmail как SMTP клиента с авторизацией ==&lt;br /&gt;
&lt;br /&gt;
В случае, когда sendmail выступает в роли клиента, демон saslauthd не требуется. В файл конфигурации необходимо внести следующие изменения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define(`SMART_HOST&amp;#039;, `smtp: smtp.domain.ru&amp;#039;)dnl&lt;br /&gt;
define(`confAUTH_MECHANISMS&amp;#039;, `DIGEST-MD5 CRAM-MD5 PLAIN LOGIN&amp;#039;)dnl&lt;br /&gt;
FEATURE(`authinfo&amp;#039;, `hash /etc/mail/authinfo&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указываем SMTP-сервер, имя и пароль пользователя, а также метод аутентификации в отдельном файле  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/mail/authinfo&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 AuthInfo: smtp.domain.ru «U:username@domain.ru» «P:mypassword» «M:CRAM-MD5»&lt;br /&gt;
&lt;br /&gt;
Создаем хэшированную базу данных  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/mail/authinfo.db&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 # makemap hash /etc/mail/authinfo &amp;lt; /etc/mail/authinfo&lt;br /&gt;
&lt;br /&gt;
== Как заставить sendmail использовать /etc/hosts ==&lt;br /&gt;
&lt;br /&gt;
По умолчанию sendmail использует в первую очередь DNS. Чтобы заставить его сначала смотреть &amp;lt;tt&amp;gt;/etc/hosts&amp;lt;/tt&amp;gt;, нужно создать файл &amp;lt;tt&amp;gt;/etc/mail/service.switch&amp;lt;/tt&amp;gt; и прописать в нем следующую строку:&lt;br /&gt;
&lt;br /&gt;
 hosts files dns&lt;br /&gt;
&lt;br /&gt;
После этого достаточно перезапустить sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Хранение писем в Maildir ==&lt;br /&gt;
&lt;br /&gt;
По умолчанию sendmail использует mail.local в качестве локального агента доставки почты. При этом почта доставляется в формате стандартного BSD mailbox. Чтобы доставлять почту в Maildir, нам потребуется установить альтернативный агент доставки mail.buhal, который можно скачать [http://pdp-11.org.ru/~form/openbsd/files/sys/mail.buhal-1.0.tar.gz отсюда].&lt;br /&gt;
&lt;br /&gt;
Сначала нужно собрать и установить mail.buhal:&lt;br /&gt;
&lt;br /&gt;
 # make depend &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;
&lt;br /&gt;
Далее следует указать mail.buhal в файле конфигурации sendmail в качестве локального агента доставки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define(`LOCAL_MAILER_PATH&amp;#039;, `/usr/libexec/mail.buhal&amp;#039;)dnl&lt;br /&gt;
MODIFY_MAILER_FLAGS(`LOCAL&amp;#039;, `-m&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь достаточно перекомпилировать файл конфигурации и перезапустить sendmail.&lt;br /&gt;
&lt;br /&gt;
В портах OpenBSD, в категории mail, есть программы  &amp;#039;&amp;#039;procmail&amp;#039;&amp;#039; и &amp;#039;&amp;#039;maildrop&amp;#039;&amp;#039;, которые также поддерживают формат Maildir и дополнительные расширения данного формата.&lt;br /&gt;
&lt;br /&gt;
== Использование procmail в качестве LDA ==&lt;br /&gt;
&lt;br /&gt;
После установки procmail из портов или пакетов, необходимо создать глобальный конфигурационный файл. Пример конфигурации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Секция общих настроек.&lt;br /&gt;
# &lt;br /&gt;
DROPPRIVS=yes&lt;br /&gt;
COMSAT=no&lt;br /&gt;
VERBOSE=off&lt;br /&gt;
SHELL=/bin/sh&lt;br /&gt;
PATH=/bin:/usr/bin:/usr/local/bin&lt;br /&gt;
LOCKFILE=$HOME/.lockmail&lt;br /&gt;
LOGFILE=$HOME/procmail.log&lt;br /&gt;
&lt;br /&gt;
# Складываем почту в формате Maildir.&lt;br /&gt;
# &lt;br /&gt;
MAILDIR=$HOME/Maildir/&lt;br /&gt;
DEFAULT=$MAILDIR&lt;br /&gt;
&lt;br /&gt;
# Входящую корреспонденцию можно резервировать в файлы формата mbox.&lt;br /&gt;
# &lt;br /&gt;
#: 0 c&lt;br /&gt;
# /var/mail/$LOGNAME&lt;br /&gt;
&lt;br /&gt;
# Либо передавать в хранилище на другом хосте.&lt;br /&gt;
# &lt;br /&gt;
#: 0 c&lt;br /&gt;
# ! mail@mx2.domain.ru&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее необходимо изменить локальный агент доставки (LDA) с mail.local на procmail:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FEATURE(local_procmail)dnl&lt;br /&gt;
MAILER(local)dnl&lt;br /&gt;
MAILER(smtp)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь достаточно перекомпилировать файл конфигурации и перезапустить sendmail.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_sendmail&amp;diff=184</id>
		<title>Настройка sendmail</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_sendmail&amp;diff=184"/>
		<updated>2013-06-03T12:29:45Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Настройка SMTP авторизации */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка TLS и SSL ==&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 8.11, sendmail поддерживает защиту ESMTP соединения с помощью расширения STARTTLS (RFC 2487). Для настройки TLS прежде всего нужно создать SSL сертификат и секретный DSA-ключ для шифрования:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mkdir -m 700 /etc/mail/certs&lt;br /&gt;
# openssl dsaparam 1024 -out dsa1024.pem&lt;br /&gt;
# openssl req -x509 -nodes -days 365 -newkey dsa: dsa1024.pem \&lt;br /&gt;
 -out /etc/mail/certs/mycert.pem -keyout /etc/mail/certs/mykey.pem&lt;br /&gt;
# rm -f dsa1024.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если у вас уже есть ключ шифрования, то для создания сертификата следует подать команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# openssl req -x509 -new -days 365 -key /etc/mail/certs/mykey.pem \&lt;br /&gt;
-out /etc/mail/certs/mycert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;#039;&amp;#039;-days&amp;#039;&amp;#039; позволяет указать количество дней, в течение которых сертификат будет действительным. Чтобы проверить созданный сертификат, можно воспользоваться следующей командой:&lt;br /&gt;
&lt;br /&gt;
 # openssl x509 -in /etc/mail/certs/mycert.pem -text&lt;br /&gt;
&lt;br /&gt;
Если вы не планируете использовать TLS для авторизации (не путать с [[#Настройка SMTP авторизации|SMTP авторизацией]]) или используете сертификат, подписанный самим собой, следует создать symlink:&lt;br /&gt;
&lt;br /&gt;
 # ln -s /etc/mail/certs/mycert.pem /etc/mail/certs/CAcert.pem&lt;br /&gt;
&lt;br /&gt;
В противном случае следует поместить сертификат авторизации в файл  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/mail/certs/CAcert.pem&amp;lt;/span&amp;gt; Не забудьте установить права, запрещающие чтение/запись файлов сертификатов и ключей простым пользователям:&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/mail/certs/*&lt;br /&gt;
&lt;br /&gt;
Теперь следует настроить sendmail. В .mc файле конфигурации нужно добавить следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define(`CERT_DIR&amp;#039;, `MAIL_SETTINGS_DIR`&amp;#039;certs&amp;#039;)dnl&lt;br /&gt;
define(`confCACERT_PATH&amp;#039;, `CERT_DIR&amp;#039;)dnl&lt;br /&gt;
define(`confCACERT&amp;#039;, `CERT_DIR/CAcert.pem&amp;#039;)dnl&lt;br /&gt;
define(`confSERVER_CERT&amp;#039;, `CERT_DIR/mycert.pem&amp;#039;)dnl&lt;br /&gt;
define(`confSERVER_KEY&amp;#039;, `CERT_DIR/mykey.pem&amp;#039;)dnl&lt;br /&gt;
define(`confCLIENT_CERT&amp;#039;, `CERT_DIR/mycert.pem&amp;#039;)dnl&lt;br /&gt;
define(`confCLIENT_KEY&amp;#039;, `CERT_DIR/mykey.pem&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После добавления вышеуказанных строк в файл конфигурации следует пересобрать его с помощью m4 (см. файл  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/share/sendmail/README&amp;lt;/span&amp;gt;) и рестартовать уже запущенный sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
Для проверки настроек TLS можно воспользоваться командой telnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# telnet localhost smtp&lt;br /&gt;
Trying 127.0.0.1…&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is &amp;#039;^]&amp;#039;.&lt;br /&gt;
220 form.home.lan ESMTP Sendmail 8.13.1/8.13.1; Wed, 17 Nov 2004 13:42:08 +0600&lt;br /&gt;
(NOVT)&lt;br /&gt;
EHLO localhost&lt;br /&gt;
250-form.home.lan Hello root@localhost.home.lan [127.0.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-SIZE&lt;br /&gt;
250-DSN&lt;br /&gt;
250-ETRN&lt;br /&gt;
250-AUTH PLAIN&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250-DELIVERBY&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При правильной настройке в ответе сервера на команду «EHLO» должна присутствовать строка «250-STARTTLS». Смотрите также по данной теме  &lt;br /&gt;
[http://www.openbsd.pw/files/www.openbsd.org/cgi-bin/man.cgi@query=starttls&amp;amp;sektion=8 starttls(8)],  &lt;br /&gt;
[http://www.openbsd.pw/files/www.openbsd.org/cgi-bin/man.cgi@query=ssl&amp;amp;sektion=8 ssl(8)],  &lt;br /&gt;
[http://www.sendmail.org/~ca/email/starttls.html http://www.sendmail.org/~ca/email/starttls.html],   &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/share/sendmail/README&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для того чтобы научить sendmail работать по SSL (без использования STARTTLS), нужно создать и добавить в .mc файл сертификат и ключ для шифрования, как описано выше, а также добавить следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DAEMON_OPTIONS(`Name=MTA&amp;#039;)dnl&lt;br /&gt;
DAEMON_OPTIONS(`Port=465, Name=MTA-SSL, M=s&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не забудьте перезапустить sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
Для проверки можно воспользоваться командой openssl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# openssl s_client -connect localhost:465&lt;br /&gt;
CONNECTED(00000004)&lt;br /&gt;
&lt;br /&gt;
[…]&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
SSL handshake has read 1409 bytes and written 288 bytes&lt;br /&gt;
---&lt;br /&gt;
New, TLSv1/SSLv3, Cipher is DHE-DSS-AES256-SHA&lt;br /&gt;
Server public key is 1024 bit&lt;br /&gt;
SSL-Session:&lt;br /&gt;
    Protocol  : TLSv1&lt;br /&gt;
    Cipher    : DHE-DSS-AES256-SHA&lt;br /&gt;
    Session-ID:&lt;br /&gt;
28CAD859854BC30F61B0013DF835E69CDB0037D82FD741F9C7A56DD1E25B655&lt;br /&gt;
    Session-ID-ctx:&lt;br /&gt;
    Master-Key:&lt;br /&gt;
F5BA53F5C0659E3E12D1057FE8D4AEA8177A868169B35949793ABECED7870A29FF4B3AFB9D479EA86618185D5192B837&lt;br /&gt;
    Key-Arg   : None&lt;br /&gt;
    Start Time: 1119252698&lt;br /&gt;
    Timeout   : 300 (sec)&lt;br /&gt;
    Verify return code: 18 (self signed certificate)&lt;br /&gt;
---&lt;br /&gt;
220 cvs.openbsd.ru ESMTP Sendmail 8.12.11/8.12.11; Mon, 20 Jun 2005 11:37:06 +0400 (MSD)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка SMTP авторизации ==&lt;br /&gt;
&lt;br /&gt;
Для настройки авторизации следует пересобрать sendmail с поддержкой SASL. Для этого следует установить пакет &amp;#039;&amp;#039;cyrus-sasl2&amp;#039;&amp;#039; или порт &amp;#039;&amp;#039;security/cyrus-sasl2&amp;#039;&amp;#039;. Для включения поддержки SASL нам потребуется перекомпилировать sendmail следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# echo WANT_SMTPAUTH=yes &amp;gt;&amp;gt; /etc/mk.conf&lt;br /&gt;
# cd /usr/src/gnu/usr.sbin/sendmail&lt;br /&gt;
# make cleandir&lt;br /&gt;
# make obj&lt;br /&gt;
# make depend&lt;br /&gt;
# make&lt;br /&gt;
# make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно воспользоваться набором site.tar.gz и пересобрать sendmail, установив настройку SENDMAIL_SASL=Yes в mk.conf.&lt;br /&gt;
&lt;br /&gt;
Далее следует создать файл конфигурации SASL для sendmail ( &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/local/lib/sasl2/Sendmail.conf&amp;lt;/span&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 pwcheck_method: saslauthd&lt;br /&gt;
&lt;br /&gt;
Добавляем в &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/rc.local&amp;lt;/span&amp;gt; строки для запуска saslauthd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if [ -x /usr/local/sbin/saslauthd ]; then&lt;br /&gt;
 echo -n &amp;#039; saslauthd&amp;#039;; /usr/local/sbin/saslauthd -a getpwent&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь остается только включить поддержку авторизации в .mc файле конфигурации sendmail:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dnl&lt;br /&gt;
dnl Эту опцию следует включить, чтобы запретить авторизацию с помощью&lt;br /&gt;
dnl механизмов PLAIN и LOGIN по незащищенному соединению&lt;br /&gt;
dnl (без использования TLS).&lt;br /&gt;
dnl&lt;br /&gt;
define(`confAUTH_OPTIONS&amp;#039;, `p&amp;#039;)dnl&lt;br /&gt;
dnl&lt;br /&gt;
dnl Список допустимых механизмов авторизации. Для всех механизмов,&lt;br /&gt;
dnl кроме PLAIN и LOGIN, невозможна авторизация по системному файлу&lt;br /&gt;
dnl паролей. Для них следует использовать sasldb или другие способы&lt;br /&gt;
dnl авторизации (см. документацию sasl2).&lt;br /&gt;
dnl&lt;br /&gt;
define(`confAUTH_MECHANISMS&amp;#039;, `DIGEST-MD5 CRAM-MD5 PLAIN LOGIN&amp;#039;)dnl&lt;br /&gt;
dnl&lt;br /&gt;
dnl Список механизмов, авторизация по которым разрешает использовать&lt;br /&gt;
dnl сервер для пересылки почты (relaying).&lt;br /&gt;
dnl&lt;br /&gt;
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 PLAIN LOGIN&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не забудьте перезапустить sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
Для проверки настройки авторизации можно воспользоваться командой telnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# telnet localhost smtp&lt;br /&gt;
Trying 127.0.0.1…&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is &amp;#039;^]&amp;#039;.&lt;br /&gt;
220 form.home.lan ESMTP Sendmail 8.13.1/8.13.1; Wed, 17 Nov 2004 13:42:08 +0600&lt;br /&gt;
(NOVT)&lt;br /&gt;
EHLO localhost&lt;br /&gt;
250-form.home.lan Hello root@localhost.home.lan [127.0.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-SIZE&lt;br /&gt;
250-DSN&lt;br /&gt;
250-ETRN&lt;br /&gt;
250-AUTH DIGEST-MD5 CRAM-MD5&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250-DELIVERBY&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При правильной настройке в ответе сервера на команду «EHLO» должна присутствовать строка «250-AUTH». В случае если в файле конфигурации запрещено использование PLAIN авторизации по незащищенному соединению, вместо команды telnet следует использовать команду openssl:&lt;br /&gt;
&lt;br /&gt;
 # openssl s_client -starttls smtp -connect localhost: smtp&lt;br /&gt;
&lt;br /&gt;
Смотрите также  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/share/sendmail/README&amp;lt;/span&amp;gt;, [[#Настройка TLS и SSL|Настройка TLS и SSL]].&lt;br /&gt;
&lt;br /&gt;
== Настройка sendmail как SMTP клиента с авторизацией ==&lt;br /&gt;
&lt;br /&gt;
В случае, когда sendmail выступает в роли клиента, демон saslauthd не требуется. В файл конфигурации необходимо внести следующие изменения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define(`SMART_HOST&amp;#039;, `smtp: smtp.domain.ru&amp;#039;)dnl&lt;br /&gt;
define(`confAUTH_MECHANISMS&amp;#039;, `DIGEST-MD5 CRAM-MD5 PLAIN LOGIN&amp;#039;)dnl&lt;br /&gt;
FEATURE(`authinfo&amp;#039;, `hash /etc/mail/authinfo&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указываем SMTP-сервер, имя и пароль пользователя, а также метод аутентификации в отдельном файле &amp;lt;tt&amp;gt;/etc/mail/authinfo&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 AuthInfo: smtp.domain.ru «U:username@domain.ru» «P:mypassword» «M:CRAM-MD5»&lt;br /&gt;
&lt;br /&gt;
Создаем хэшированную базу данных /etc/mail/authinfo.db:&lt;br /&gt;
&lt;br /&gt;
 # makemap hash /etc/mail/authinfo &amp;lt; /etc/mail/authinfo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Как заставить sendmail использовать /etc/hosts ==&lt;br /&gt;
&lt;br /&gt;
По умолчанию sendmail использует в первую очередь DNS. Чтобы заставить его сначала смотреть &amp;lt;tt&amp;gt;/etc/hosts&amp;lt;/tt&amp;gt;, нужно создать файл &amp;lt;tt&amp;gt;/etc/mail/service.switch&amp;lt;/tt&amp;gt; и прописать в нем следующую строку:&lt;br /&gt;
&lt;br /&gt;
 hosts files dns&lt;br /&gt;
&lt;br /&gt;
После этого достаточно перезапустить sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Хранение писем в Maildir ==&lt;br /&gt;
&lt;br /&gt;
По умолчанию sendmail использует mail.local в качестве локального агента доставки почты. При этом почта доставляется в формате стандартного BSD mailbox. Чтобы доставлять почту в Maildir, нам потребуется установить альтернативный агент доставки mail.buhal, который можно скачать [http://pdp-11.org.ru/~form/openbsd/files/sys/mail.buhal-1.0.tar.gz отсюда].&lt;br /&gt;
&lt;br /&gt;
Сначала нужно собрать и установить mail.buhal:&lt;br /&gt;
&lt;br /&gt;
 # make depend &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;
&lt;br /&gt;
Далее следует указать mail.buhal в файле конфигурации sendmail в качестве локального агента доставки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define(`LOCAL_MAILER_PATH&amp;#039;, `/usr/libexec/mail.buhal&amp;#039;)dnl&lt;br /&gt;
MODIFY_MAILER_FLAGS(`LOCAL&amp;#039;, `-m&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь достаточно перекомпилировать файл конфигурации и перезапустить sendmail.&lt;br /&gt;
&lt;br /&gt;
В портах OpenBSD, в категории mail, есть программы  &amp;#039;&amp;#039;procmail&amp;#039;&amp;#039; и &amp;#039;&amp;#039;maildrop&amp;#039;&amp;#039;, которые также поддерживают формат Maildir и дополнительные расширения данного формата.&lt;br /&gt;
&lt;br /&gt;
== Использование procmail в качестве LDA ==&lt;br /&gt;
&lt;br /&gt;
После установки procmail из портов или пакетов, необходимо создать глобальный конфигурационный файл. Пример конфигурации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Секция общих настроек.&lt;br /&gt;
# &lt;br /&gt;
DROPPRIVS=yes&lt;br /&gt;
COMSAT=no&lt;br /&gt;
VERBOSE=off&lt;br /&gt;
SHELL=/bin/sh&lt;br /&gt;
PATH=/bin:/usr/bin:/usr/local/bin&lt;br /&gt;
LOCKFILE=$HOME/.lockmail&lt;br /&gt;
LOGFILE=$HOME/procmail.log&lt;br /&gt;
&lt;br /&gt;
# Складываем почту в формате Maildir.&lt;br /&gt;
# &lt;br /&gt;
MAILDIR=$HOME/Maildir/&lt;br /&gt;
DEFAULT=$MAILDIR&lt;br /&gt;
&lt;br /&gt;
# Входящую корреспонденцию можно резервировать в файлы формата mbox.&lt;br /&gt;
# &lt;br /&gt;
#: 0 c&lt;br /&gt;
# /var/mail/$LOGNAME&lt;br /&gt;
&lt;br /&gt;
# Либо передавать в хранилище на другом хосте.&lt;br /&gt;
# &lt;br /&gt;
#: 0 c&lt;br /&gt;
# ! mail@mx2.domain.ru&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее необходимо изменить локальный агент доставки (LDA) с mail.local на procmail:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FEATURE(local_procmail)dnl&lt;br /&gt;
MAILER(local)dnl&lt;br /&gt;
MAILER(smtp)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь достаточно перекомпилировать файл конфигурации и перезапустить sendmail.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_sendmail&amp;diff=183</id>
		<title>Настройка sendmail</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=%D0%9D%D0%B0%D1%81%D1%82%D1%80%D0%BE%D0%B9%D0%BA%D0%B0_sendmail&amp;diff=183"/>
		<updated>2013-06-03T12:26:45Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Настройка TLS и SSL */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;:Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&amp;lt;br /&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка TLS и SSL ==&lt;br /&gt;
&lt;br /&gt;
Начиная с версии 8.11, sendmail поддерживает защиту ESMTP соединения с помощью расширения STARTTLS (RFC 2487). Для настройки TLS прежде всего нужно создать SSL сертификат и секретный DSA-ключ для шифрования:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# mkdir -m 700 /etc/mail/certs&lt;br /&gt;
# openssl dsaparam 1024 -out dsa1024.pem&lt;br /&gt;
# openssl req -x509 -nodes -days 365 -newkey dsa: dsa1024.pem \&lt;br /&gt;
 -out /etc/mail/certs/mycert.pem -keyout /etc/mail/certs/mykey.pem&lt;br /&gt;
# rm -f dsa1024.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Если у вас уже есть ключ шифрования, то для создания сертификата следует подать команду:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# openssl req -x509 -new -days 365 -key /etc/mail/certs/mykey.pem \&lt;br /&gt;
-out /etc/mail/certs/mycert.pem&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Параметр &amp;#039;&amp;#039;-days&amp;#039;&amp;#039; позволяет указать количество дней, в течение которых сертификат будет действительным. Чтобы проверить созданный сертификат, можно воспользоваться следующей командой:&lt;br /&gt;
&lt;br /&gt;
 # openssl x509 -in /etc/mail/certs/mycert.pem -text&lt;br /&gt;
&lt;br /&gt;
Если вы не планируете использовать TLS для авторизации (не путать с [[#Настройка SMTP авторизации|SMTP авторизацией]]) или используете сертификат, подписанный самим собой, следует создать symlink:&lt;br /&gt;
&lt;br /&gt;
 # ln -s /etc/mail/certs/mycert.pem /etc/mail/certs/CAcert.pem&lt;br /&gt;
&lt;br /&gt;
В противном случае следует поместить сертификат авторизации в файл  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/etc/mail/certs/CAcert.pem&amp;lt;/span&amp;gt; Не забудьте установить права, запрещающие чтение/запись файлов сертификатов и ключей простым пользователям:&lt;br /&gt;
&lt;br /&gt;
 # chmod 600 /etc/mail/certs/*&lt;br /&gt;
&lt;br /&gt;
Теперь следует настроить sendmail. В .mc файле конфигурации нужно добавить следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define(`CERT_DIR&amp;#039;, `MAIL_SETTINGS_DIR`&amp;#039;certs&amp;#039;)dnl&lt;br /&gt;
define(`confCACERT_PATH&amp;#039;, `CERT_DIR&amp;#039;)dnl&lt;br /&gt;
define(`confCACERT&amp;#039;, `CERT_DIR/CAcert.pem&amp;#039;)dnl&lt;br /&gt;
define(`confSERVER_CERT&amp;#039;, `CERT_DIR/mycert.pem&amp;#039;)dnl&lt;br /&gt;
define(`confSERVER_KEY&amp;#039;, `CERT_DIR/mykey.pem&amp;#039;)dnl&lt;br /&gt;
define(`confCLIENT_CERT&amp;#039;, `CERT_DIR/mycert.pem&amp;#039;)dnl&lt;br /&gt;
define(`confCLIENT_KEY&amp;#039;, `CERT_DIR/mykey.pem&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
После добавления вышеуказанных строк в файл конфигурации следует пересобрать его с помощью m4 (см. файл  &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/share/sendmail/README&amp;lt;/span&amp;gt;) и рестартовать уже запущенный sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
Для проверки настроек TLS можно воспользоваться командой telnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# telnet localhost smtp&lt;br /&gt;
Trying 127.0.0.1…&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is &amp;#039;^]&amp;#039;.&lt;br /&gt;
220 form.home.lan ESMTP Sendmail 8.13.1/8.13.1; Wed, 17 Nov 2004 13:42:08 +0600&lt;br /&gt;
(NOVT)&lt;br /&gt;
EHLO localhost&lt;br /&gt;
250-form.home.lan Hello root@localhost.home.lan [127.0.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-SIZE&lt;br /&gt;
250-DSN&lt;br /&gt;
250-ETRN&lt;br /&gt;
250-AUTH PLAIN&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250-DELIVERBY&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При правильной настройке в ответе сервера на команду «EHLO» должна присутствовать строка «250-STARTTLS». Смотрите также по данной теме  &lt;br /&gt;
[http://www.openbsd.pw/files/www.openbsd.org/cgi-bin/man.cgi@query=starttls&amp;amp;sektion=8 starttls(8)],  &lt;br /&gt;
[http://www.openbsd.pw/files/www.openbsd.org/cgi-bin/man.cgi@query=ssl&amp;amp;sektion=8 ssl(8)],  &lt;br /&gt;
[http://www.sendmail.org/~ca/email/starttls.html http://www.sendmail.org/~ca/email/starttls.html],   &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/usr/share/sendmail/README&amp;lt;/span&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Для того чтобы научить sendmail работать по SSL (без использования STARTTLS), нужно создать и добавить в .mc файл сертификат и ключ для шифрования, как описано выше, а также добавить следующие строки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
DAEMON_OPTIONS(`Name=MTA&amp;#039;)dnl&lt;br /&gt;
DAEMON_OPTIONS(`Port=465, Name=MTA-SSL, M=s&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не забудьте перезапустить sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
Для проверки можно воспользоваться командой openssl:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# openssl s_client -connect localhost:465&lt;br /&gt;
CONNECTED(00000004)&lt;br /&gt;
&lt;br /&gt;
[…]&lt;br /&gt;
&lt;br /&gt;
---&lt;br /&gt;
SSL handshake has read 1409 bytes and written 288 bytes&lt;br /&gt;
---&lt;br /&gt;
New, TLSv1/SSLv3, Cipher is DHE-DSS-AES256-SHA&lt;br /&gt;
Server public key is 1024 bit&lt;br /&gt;
SSL-Session:&lt;br /&gt;
    Protocol  : TLSv1&lt;br /&gt;
    Cipher    : DHE-DSS-AES256-SHA&lt;br /&gt;
    Session-ID:&lt;br /&gt;
28CAD859854BC30F61B0013DF835E69CDB0037D82FD741F9C7A56DD1E25B655&lt;br /&gt;
    Session-ID-ctx:&lt;br /&gt;
    Master-Key:&lt;br /&gt;
F5BA53F5C0659E3E12D1057FE8D4AEA8177A868169B35949793ABECED7870A29FF4B3AFB9D479EA86618185D5192B837&lt;br /&gt;
    Key-Arg   : None&lt;br /&gt;
    Start Time: 1119252698&lt;br /&gt;
    Timeout   : 300 (sec)&lt;br /&gt;
    Verify return code: 18 (self signed certificate)&lt;br /&gt;
---&lt;br /&gt;
220 cvs.openbsd.ru ESMTP Sendmail 8.12.11/8.12.11; Mon, 20 Jun 2005 11:37:06 +0400 (MSD)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Настройка SMTP авторизации ==&lt;br /&gt;
&lt;br /&gt;
Для настройки авторизации следует пересобрать sendmail с поддержкой SASL. Для этого следует установить пакет &amp;#039;&amp;#039;cyrus-sasl2&amp;#039;&amp;#039; или порт &amp;#039;&amp;#039;security/cyrus-sasl2&amp;#039;&amp;#039;. Для включения поддержки SASL нам потребуется перекомпилировать sendmail следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# echo WANT_SMTPAUTH=yes &amp;gt;&amp;gt; /etc/mk.conf&lt;br /&gt;
# cd /usr/src/gnu/usr.sbin/sendmail&lt;br /&gt;
# make cleandir&lt;br /&gt;
# make obj&lt;br /&gt;
# make depend&lt;br /&gt;
# make&lt;br /&gt;
# make install&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Также можно воспользоваться набором site.tar.gz и пересобрать sendmail, установив настройку SENDMAIL_SASL=Yes в mk.conf.&lt;br /&gt;
&lt;br /&gt;
Далее следует создать файл конфигурации SASL для sendmail (&amp;lt;tt&amp;gt;/usr/local/lib/sasl2/Sendmail.conf&amp;lt;/tt&amp;gt;):&lt;br /&gt;
&lt;br /&gt;
 pwcheck_method: saslauthd&lt;br /&gt;
&lt;br /&gt;
Добавляем в &amp;lt;tt&amp;gt;/etc/rc.local&amp;lt;/tt&amp;gt; строки для запуска saslauthd:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
if [ -x /usr/local/sbin/saslauthd ]; then&lt;br /&gt;
 echo -n &amp;#039; saslauthd&amp;#039;; /usr/local/sbin/saslauthd -a getpwent&lt;br /&gt;
fi&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь остается только включить поддержку авторизации в .mc файле конфигурации sendmail:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
dnl&lt;br /&gt;
dnl Эту опцию следует включить, чтобы запретить авторизацию с помощью&lt;br /&gt;
dnl механизмов PLAIN и LOGIN по незащищенному соединению&lt;br /&gt;
dnl (без использования TLS).&lt;br /&gt;
dnl&lt;br /&gt;
define(`confAUTH_OPTIONS&amp;#039;, `p&amp;#039;)dnl&lt;br /&gt;
dnl&lt;br /&gt;
dnl Список допустимых механизмов авторизации. Для всех механизмов,&lt;br /&gt;
dnl кроме PLAIN и LOGIN, невозможна авторизация по системному файлу&lt;br /&gt;
dnl паролей. Для них следует использовать sasldb или другие способы&lt;br /&gt;
dnl авторизации (см. документацию sasl2).&lt;br /&gt;
dnl&lt;br /&gt;
define(`confAUTH_MECHANISMS&amp;#039;, `DIGEST-MD5 CRAM-MD5 PLAIN LOGIN&amp;#039;)dnl&lt;br /&gt;
dnl&lt;br /&gt;
dnl Список механизмов, авторизация по которым разрешает использовать&lt;br /&gt;
dnl сервер для пересылки почты (relaying).&lt;br /&gt;
dnl&lt;br /&gt;
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 PLAIN LOGIN&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Не забудьте перезапустить sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
Для проверки настройки авторизации можно воспользоваться командой telnet:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# telnet localhost smtp&lt;br /&gt;
Trying 127.0.0.1…&lt;br /&gt;
Connected to localhost.&lt;br /&gt;
Escape character is &amp;#039;^]&amp;#039;.&lt;br /&gt;
220 form.home.lan ESMTP Sendmail 8.13.1/8.13.1; Wed, 17 Nov 2004 13:42:08 +0600&lt;br /&gt;
(NOVT)&lt;br /&gt;
EHLO localhost&lt;br /&gt;
250-form.home.lan Hello root@localhost.home.lan [127.0.0.1], pleased to meet you&lt;br /&gt;
250-ENHANCEDSTATUSCODES&lt;br /&gt;
250-PIPELINING&lt;br /&gt;
250-8BITMIME&lt;br /&gt;
250-SIZE&lt;br /&gt;
250-DSN&lt;br /&gt;
250-ETRN&lt;br /&gt;
250-AUTH DIGEST-MD5 CRAM-MD5&lt;br /&gt;
250-STARTTLS&lt;br /&gt;
250-DELIVERBY&lt;br /&gt;
250 HELP&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
При правильной настройке в ответе сервера на команду «EHLO» должна присутствовать строка «250-AUTH». В случае если в файле конфигурации запрещено использование PLAIN авторизации по незащищенному соединению, вместо команды telnet следует использовать команду openssl:&lt;br /&gt;
&lt;br /&gt;
 # openssl s_client -starttls smtp -connect localhost: smtp&lt;br /&gt;
&lt;br /&gt;
Смотрите также &amp;lt;tt&amp;gt;/usr/share/sendmail/README&amp;lt;/tt&amp;gt;, [[#Настройка TLS и SSL|Настройка TLS и SSL]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Настройка sendmail как SMTP клиента с авторизацией ==&lt;br /&gt;
&lt;br /&gt;
В случае, когда sendmail выступает в роли клиента, демон saslauthd не требуется. В файл конфигурации необходимо внести следующие изменения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define(`SMART_HOST&amp;#039;, `smtp: smtp.domain.ru&amp;#039;)dnl&lt;br /&gt;
define(`confAUTH_MECHANISMS&amp;#039;, `DIGEST-MD5 CRAM-MD5 PLAIN LOGIN&amp;#039;)dnl&lt;br /&gt;
FEATURE(`authinfo&amp;#039;, `hash /etc/mail/authinfo&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Указываем SMTP-сервер, имя и пароль пользователя, а также метод аутентификации в отдельном файле &amp;lt;tt&amp;gt;/etc/mail/authinfo&amp;lt;/tt&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
 AuthInfo: smtp.domain.ru «U:username@domain.ru» «P:mypassword» «M:CRAM-MD5»&lt;br /&gt;
&lt;br /&gt;
Создаем хэшированную базу данных /etc/mail/authinfo.db:&lt;br /&gt;
&lt;br /&gt;
 # makemap hash /etc/mail/authinfo &amp;lt; /etc/mail/authinfo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Как заставить sendmail использовать /etc/hosts ==&lt;br /&gt;
&lt;br /&gt;
По умолчанию sendmail использует в первую очередь DNS. Чтобы заставить его сначала смотреть &amp;lt;tt&amp;gt;/etc/hosts&amp;lt;/tt&amp;gt;, нужно создать файл &amp;lt;tt&amp;gt;/etc/mail/service.switch&amp;lt;/tt&amp;gt; и прописать в нем следующую строку:&lt;br /&gt;
&lt;br /&gt;
 hosts files dns&lt;br /&gt;
&lt;br /&gt;
После этого достаточно перезапустить sendmail:&lt;br /&gt;
&lt;br /&gt;
 # kill -HUP `head −1 /var/run/sendmail.pid`&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Хранение писем в Maildir ==&lt;br /&gt;
&lt;br /&gt;
По умолчанию sendmail использует mail.local в качестве локального агента доставки почты. При этом почта доставляется в формате стандартного BSD mailbox. Чтобы доставлять почту в Maildir, нам потребуется установить альтернативный агент доставки mail.buhal, который можно скачать [http://pdp-11.org.ru/~form/openbsd/files/sys/mail.buhal-1.0.tar.gz отсюда].&lt;br /&gt;
&lt;br /&gt;
Сначала нужно собрать и установить mail.buhal:&lt;br /&gt;
&lt;br /&gt;
 # make depend &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;br /&gt;
&lt;br /&gt;
Далее следует указать mail.buhal в файле конфигурации sendmail в качестве локального агента доставки:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
define(`LOCAL_MAILER_PATH&amp;#039;, `/usr/libexec/mail.buhal&amp;#039;)dnl&lt;br /&gt;
MODIFY_MAILER_FLAGS(`LOCAL&amp;#039;, `-m&amp;#039;)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь достаточно перекомпилировать файл конфигурации и перезапустить sendmail.&lt;br /&gt;
&lt;br /&gt;
В портах OpenBSD, в категории mail, есть программы  &amp;#039;&amp;#039;procmail&amp;#039;&amp;#039; и &amp;#039;&amp;#039;maildrop&amp;#039;&amp;#039;, которые также поддерживают формат Maildir и дополнительные расширения данного формата.&lt;br /&gt;
&lt;br /&gt;
== Использование procmail в качестве LDA ==&lt;br /&gt;
&lt;br /&gt;
После установки procmail из портов или пакетов, необходимо создать глобальный конфигурационный файл. Пример конфигурации:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Секция общих настроек.&lt;br /&gt;
# &lt;br /&gt;
DROPPRIVS=yes&lt;br /&gt;
COMSAT=no&lt;br /&gt;
VERBOSE=off&lt;br /&gt;
SHELL=/bin/sh&lt;br /&gt;
PATH=/bin:/usr/bin:/usr/local/bin&lt;br /&gt;
LOCKFILE=$HOME/.lockmail&lt;br /&gt;
LOGFILE=$HOME/procmail.log&lt;br /&gt;
&lt;br /&gt;
# Складываем почту в формате Maildir.&lt;br /&gt;
# &lt;br /&gt;
MAILDIR=$HOME/Maildir/&lt;br /&gt;
DEFAULT=$MAILDIR&lt;br /&gt;
&lt;br /&gt;
# Входящую корреспонденцию можно резервировать в файлы формата mbox.&lt;br /&gt;
# &lt;br /&gt;
#: 0 c&lt;br /&gt;
# /var/mail/$LOGNAME&lt;br /&gt;
&lt;br /&gt;
# Либо передавать в хранилище на другом хосте.&lt;br /&gt;
# &lt;br /&gt;
#: 0 c&lt;br /&gt;
# ! mail@mx2.domain.ru&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее необходимо изменить локальный агент доставки (LDA) с mail.local на procmail:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
FEATURE(local_procmail)dnl&lt;br /&gt;
MAILER(local)dnl&lt;br /&gt;
MAILER(smtp)dnl&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь достаточно перекомпилировать файл конфигурации и перезапустить sendmail.&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=182</id>
		<title>OpenBSD-Wiki:Текущие события</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=OpenBSD-Wiki:%D0%A2%D0%B5%D0%BA%D1%83%D1%89%D0%B8%D0%B5_%D1%81%D0%BE%D0%B1%D1%8B%D1%82%D0%B8%D1%8F&amp;diff=182"/>
		<updated>2013-06-02T10:12:50Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Актуальное */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Актуальное ==&lt;br /&gt;
Собрано всё, что применимо к текущему релизу.&lt;br /&gt;
&lt;br /&gt;
* [[Введение в OpenBSD]]&lt;br /&gt;
* [[Аппаратное обеспечение и вопросы]]&lt;br /&gt;
* [[IPsec между OpenBSD и Linux Ubuntu]]&lt;br /&gt;
* [[OpenSSH мини-руководство]]&lt;br /&gt;
* [[OpenSSH: настройки, секреты, трюки и советы]]&lt;br /&gt;
* [[RSA/DSA аутентификация в OpenSSH]]&lt;br /&gt;
* [[Использование файла mk.conf]]&lt;br /&gt;
* [[Написание OpenBSD Loadable Kernel Modules (LKM)]]&lt;br /&gt;
* [[Настройка sendmail]]&lt;br /&gt;
* [[Новое IPSec howto]]&lt;br /&gt;
* [[Русификация OpenBSD 5.x]]&lt;br /&gt;
* [[Русификация OpenBSD]]&lt;br /&gt;
* [[Русификация консоли OpenBSD]]&lt;br /&gt;
* [[Создание загрузочной флешки]]&lt;br /&gt;
* [[Перечень Интернет ресурсов о OpenBSD]]&lt;br /&gt;
* [[Описание переменных sysctl]]&lt;br /&gt;
* [[Сборник советов с OpenBSD101.com]]&lt;br /&gt;
&lt;br /&gt;
=== Переводы ===&lt;br /&gt;
* [[C2k10-marco]]&lt;br /&gt;
* [[C2k10-guenther]]&lt;br /&gt;
* [[C2k10-ajacoutot]]&lt;br /&gt;
* [[C2k10-henning]]&lt;br /&gt;
* [[C2k10-tedu]]&lt;br /&gt;
&lt;br /&gt;
== Устаревшее ==&lt;br /&gt;
Данная информация сохранена для архивных версий.&lt;br /&gt;
&lt;br /&gt;
* [[Использование Bluetooth в OpenBSD]]&lt;br /&gt;
* [[Настройка GPRS]]&lt;br /&gt;
&lt;br /&gt;
== Прочее ==&lt;br /&gt;
&lt;br /&gt;
* [[Резервная копия Wiki]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
	<entry>
		<id>http://www.qbsd.ru/index.php?title=RSA/DSA_%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D0%B2_OpenSSH&amp;diff=181</id>
		<title>RSA/DSA аутентификация в OpenSSH</title>
		<link rel="alternate" type="text/html" href="http://www.qbsd.ru/index.php?title=RSA/DSA_%D0%B0%D1%83%D1%82%D0%B5%D0%BD%D1%82%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D1%86%D0%B8%D1%8F_%D0%B2_OpenSSH&amp;diff=181"/>
		<updated>2013-06-02T10:10:04Z</updated>

		<summary type="html">&lt;p&gt;Nordwind: /* Что это такое? */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;: Данная статья 100 % копипаст с [http://www.openbsd.ru www.openbsd.ru]&lt;br /&gt;
&lt;br /&gt;
== Что это такое? ==&lt;br /&gt;
&lt;br /&gt;
OpenSSH — замена стандартных уязвимых протоколов, таких как &amp;lt;tt&amp;gt;telnet&amp;lt;/tt&amp;gt; или &amp;lt;tt&amp;gt;rsh&amp;lt;/tt&amp;gt;. OpenSSH использует шифрованный канал для передачи данных. В нем могут быть задействованы алгоритмы аутентификации RSA или DSA.&lt;br /&gt;
&lt;br /&gt;
Эти протоколы основаны на базе специально созданной паре ключей, а именно публичном и приватном ключах. Это асимметричные алгоритмы шифрования, то есть мы можем зашифровать информацию одним ключом, а расшифровать другим, в отличие, например от DES, где используется один и тот же ключ для шифрования и расшифровки информации.&lt;br /&gt;
&lt;br /&gt;
Первым делом следует сгенеровать пару ключей. Опцией -t мы задаём тип ключа. Доступны следующие типы ключей: &amp;#039;&amp;#039;&amp;#039;rsa&amp;#039;&amp;#039;&amp;#039;, &amp;#039;&amp;#039;&amp;#039;dsa&amp;#039;&amp;#039;&amp;#039; для протокола SSH 2 и &amp;#039;&amp;#039;&amp;#039;rsa1&amp;#039;&amp;#039;&amp;#039; для SSH 1.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh-keygen -t dsa&lt;br /&gt;
Generating public/private dsa key pair.&lt;br /&gt;
Enter file in which to save the key (/home/dfa/.ssh/id_dsa):&lt;br /&gt;
Enter passphrase (empty for no passphrase):&lt;br /&gt;
Enter same passphrase again:&lt;br /&gt;
Your identification has been saved in /home/dfa/.ssh/id_dsa.&lt;br /&gt;
Your public key has been saved in /home/dfa/.ssh/id_dsa.pub.&lt;br /&gt;
The key fingerprint is:&lt;br /&gt;
27:33:40:91:0f:81:df:0a:87:f5:58:60:bb:28:c8:ad dfa@zinc&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Далее, если необходимо, указываем место, куда сохранить ключ, по умолчанию предлагается &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;/home/$USER/.ssh/id_dsa&amp;lt;/span&amp;gt;. Если ввести пароль, наш приватный ключ будет зашифрован, и для того чтобы позднее воспользоваться этим ключом, нам необходимо будет вводить данный пароль. Публичный ключ имеет суффикс &amp;#039;&amp;#039;&amp;#039;.pub&amp;#039;&amp;#039;&amp;#039;.&lt;br /&gt;
&lt;br /&gt;
При использовании беспарольной аутентификации любой, кто имеет доступ к приватному ключу, может беспрепятственно проникнуть на удалённую машину, для которой этот ключ используется.&lt;br /&gt;
&lt;br /&gt;
Публичный ключ не представляет угрозу для безопасности, мы можем пересылать его по &amp;lt;tt&amp;gt;email&amp;lt;/tt&amp;gt; или по &amp;lt;tt&amp;gt;ftp&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Далее рассмотрим способ аутентификации, при котором приватный ключ будет зашифрован паролем, и нам не нужно будет каждый раз вводить его при соединении, за нас это будет делать [[#Парольная аутентификация с использованием ssh-agent|&amp;lt;tt&amp;gt;ssh-agent&amp;lt;/tt&amp;gt;]], занимающийся кэшированием дешифрованных личных ключей.&lt;br /&gt;
&lt;br /&gt;
== Беспарольная аутентификация ==&lt;br /&gt;
&lt;br /&gt;
После успешной генерации ключей необходимо скопировать публичный ключ на удалённую машину в файл &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;~/.ssh/authorized_keys&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ scp ~/.ssh/id_dsa.pub cvs.openbsd.ru:~/.ssh/authorized_keys&lt;br /&gt;
dfa@cvs.openbsd.ru password:&lt;br /&gt;
id_dsa.pub 100 % |***************************|   598 00:00&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пример файла конфигурации клиента &amp;lt;span style=&amp;quot;color:green;&amp;quot;&amp;gt;~/.ssh/config&amp;lt;/span&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Host cvs.openbsd.ru&lt;br /&gt;
IdentityFile ~/.ssh/id_dsa&lt;br /&gt;
RSAAuthentication yes&lt;br /&gt;
&lt;br /&gt;
Host anoncvs.ca.openbsd.org&lt;br /&gt;
Compression no&lt;br /&gt;
&lt;br /&gt;
Host *&lt;br /&gt;
Cipher blowfish&lt;br /&gt;
Compression yes&lt;br /&gt;
EscapeChar ~&lt;br /&gt;
Port 22&lt;br /&gt;
Protocol 2,1&lt;br /&gt;
User dfa&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пробуем присоединиться к удалённой машине &amp;lt;tt&amp;gt;cvs.openbsd.ru&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh cvs.openbsd.ru&lt;br /&gt;
OpenBSD 3.0-current (RUOBSD) #19: Sat Dec 1 11:57:43 NOVT 2001&lt;br /&gt;
&lt;br /&gt;
Welcome to OpenBSD: The proactively secure Unix-like operating system.&lt;br /&gt;
&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Парольная аутентификация с использованием &amp;lt;tt&amp;gt;ssh-agent&amp;lt;/tt&amp;gt; ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;ssh-agent&amp;lt;/tt&amp;gt; — специальная программа-демон, которая разработана для протоколов аутентификации RSA/DSA и применяется для хранения парольной фразы приватного ключа. Используя эту программу, вы можете соединяться с удалённой машиной, не набирая пароль, и при этом ваши приватные ключи остаются защищёнными. Клиент &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; поддерживает &amp;lt;tt&amp;gt;ssh-agent&amp;lt;/tt&amp;gt; и может взаимодействовать с ней.&lt;br /&gt;
&lt;br /&gt;
Ключи и их пароли добавляются к &amp;lt;tt&amp;gt;ssh-agent&amp;lt;/tt&amp;gt; только один раз, используя &amp;lt;tt&amp;gt;ssh-add&amp;lt;/tt&amp;gt;, и далее &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; будет обращаться к &amp;lt;tt&amp;gt;ssh-agent&amp;lt;/tt&amp;gt; для определения парольной фразы для данного приватного ключа.&lt;br /&gt;
&lt;br /&gt;
При запуске &amp;lt;tt&amp;gt;ssh-agent&amp;lt;/tt&amp;gt;, в зависимости от вашего $SHELL, выводит команды для установки переменных окружения:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
 $ ssh-agent&lt;br /&gt;
 SSH_AUTH_SOCK=/tmp/ssh-jyw17290/agent.17290; export SSH_AUTH_SOCK;&lt;br /&gt;
 SSH_AGENT_PID=8809; export SSH_AGENT_PID;&lt;br /&gt;
 echo Agent pid 8809;&lt;br /&gt;
 $&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;tt&amp;gt;ssh-agent&amp;lt;/tt&amp;gt; открывает сокет для взаимодействия с &amp;lt;tt&amp;gt;ssh&amp;lt;/tt&amp;gt; и сообщает об этом через переменную окружения $SSH_AUTH_SOCK, а также сообщает свой уникальный идентификатор процесса, который установлен в переменной окружения $SSH_AGENT_PID и выводится командой &amp;lt;tt&amp;gt;echo&amp;lt;/tt&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Правильный запуск &amp;lt;tt&amp;gt;ssh-agent&amp;lt;/tt&amp;gt;, используя встроенную в оболочку команду eval, выполняется следующим образом:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ eval `ssh-agent`&lt;br /&gt;
Agent pid 17522&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Или можно задать программу, использующую ssh, как аргумент ssh-agent. В данном случае — это командный интерпретатор ksh:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh-agent /bin/ksh&lt;br /&gt;
$ env | grep SSH&lt;br /&gt;
SSH_AUTH_SOCK=/tmp/ssh-SAe17087/agent.17087&lt;br /&gt;
SSH_AGENT_PID=20652&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Теперь, используя ssh-add, необходимо добавить ключ и парольную фразу к нему:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh-add ~/.ssh/id_dsa&lt;br /&gt;
Enter passphrase for /home/dfa/.ssh/id_dsa:&lt;br /&gt;
Identity added: /home/dfa/.ssh/id_dsa (/home/user/.ssh/id_dsa)&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Пробуем присоединиться к удалённой машине &amp;lt;tt&amp;gt;cvs.openbsd.ru&amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
$ ssh cvs.openbsd.ru&lt;br /&gt;
OpenBSD 3.0-current (RUOBSD) #19: Sat Dec 1 11:57:43 NOVT 2001&lt;br /&gt;
&lt;br /&gt;
Welcome to OpenBSD: The proactively secure Unix-like operating system.&lt;br /&gt;
&lt;br /&gt;
$&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Категория:Howto]]&lt;/div&gt;</summary>
		<author><name>Nordwind</name></author>
	</entry>
</feed>