HOWTO: VPN

версия 0.2, 7 августа 1997


Содержание
1. Что нового?
2. Разное
2.1. Copyright
2.2. Авторские права
2.3. Моя ответственность
2.4. Ваша ответственность
2.5. Благодарности
2.6. Состояние этого документа
2.7. Сопутствующая документация
3. Введение
3.1. Термины
4. Процедура
4.1. Планирование
4.2. Что вам понадобится
4.3. Сборка и установка
4.4. Настройка других подсистем
4.5. Заводим псевдо-пользователя для VPN
4.6. Создаем ключ ssh для вызывающей стороны
4.7. Настраиваем автоматическую авторизацию на отвечающей стороне
4.8. Усиляем меры безопасности ssh на обеих сторонах.
4.9. Разрешаем запуск ppp и route для обеих сторон.
4.10. Пишем скрипты
5. Что же на самом деле происходит?
6. Делаем это вручную
6.1. Заходим в систему
6.2. Запускаем ppp
6.3. И второй тоже
6.4. Переназначаем Pty
6.5. Как дела на устройстве?
6.6. Настройка таблицы маршрутов
7. Подстройка
7.1. Подстройка конфигурации
7.2. Пропускная способность и загруженность систем
8. Анализ уязвимости

1. Что нового?

Проблема с "отсутствует контролирующий tty" ('no controlling tty problem') -> флаг -o 'BatchMode yes' - указал Zot O'Connor <[email protected]>

Предупреждение о ядре 2.0.30 - указал mag


2. Разное

"HOWTO: VPN" - это подборка информации о настройке Виртуальной Частной Сети (Virtual Protected Network) в Linux (и, частично, в других Uni*-ах).


2.1. Copyright

This document is part of the Linux HOWTO project. The copyright notice is the following: Unless otherwise stated, Linux HOWTO documents are copyrighted by their respective authors. Linux HOWTO documents may be reproduced and distributed in whole or in part, in any medium physical or electronic, as long as this copyright notice is retained on all copies. Commercial redistribution is allowed and encouraged; however, the author would like to be notified of any such distributions. All translations, derivative works, or aggregate works incorporating any Linux HOWTO documents must be covered under this copyright notice. That is, you may not produce a derivative work from a HOWTO and impose additional restrictions on its distribution. Exceptions to these rules may be granted under certain conditions; please contact the Linux HOWTO coordinator at the address given below. In short, we wish to promote dissemination of this information through as many channels as possible. However, we do wish to retain copyright on the HOWTO documents, and would like to be notified of any plans to redistribute the HOWTOs. If you have questions, please contact Tim Bynum, the Linux HOWTO coordinator, at [email protected] via email.


2.2. Авторские права

Авторские права на русский перевод этого текста принадлежат © 2000 SWSoft Pte Ltd. Все права зарезервированы.

Этот документ является частью проекта Linux HOWTO.

Авторские права на документы Linux HOWTO принадлежат их авторам, если явно не указано иное. Документы Linux HOWTO, а также их переводы, могут быть воспроизведены и распространены полностью или частично на любом носителе, физическом или электронном, при условии сохранения этой заметки об авторских правах на всех копиях. Коммерческое распространение разрешается и поощряется; но, так или иначе, автор текста и автор перевода желали бы знать о таких дистрибутивах.

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

Мы бы хотели распространить эту информацию по всем возможным каналам. Но при этом сохранить авторские права и быть уведомленными о всех планах распространения HOWTO. Если у вас возникли вопросы, пожалуйста, обратитесь к координатору проекта Linux HOWTO по электронной почте: или к координатору русского перевода Linux HOWTO компании SWSoft Pte Ltd. по адресу


2.3. Моя ответственность

Как всегда: автор не несет никакой ответственности за ущерб любого рода. Более подробно описано в соответствующей главе GNU GPL 0.1.1


2.4. Ваша ответственность

Здесь мы имеем дело с системой безопасности: вы не будете защищены, если у вас плохо настроена система безопасности, и подобные ей вещи.


2.5. Благодарности

Спасибо всем, кто писал утилиты, использованные здесь.

Спасибо <[email protected]> за то, что указал на проблему с "отсутствием контролирующего tty", и предоставил ее решение.


2.6. Состояние этого документа

Этот документ находится в стадии начальной разработки. Вам потребуется знание администрирования IP - как минимум, знание firewall, ppp и ssh. Это вам понадобится при настройке VPN в любом случае. Я просто решил записать мои мысли, чтобы просто не забыть их. Возможно в моей системе есть дырки. Если честно - я настраивал все это на стандартных машинах-маршрутизаторах, а не на firewall - так проще.


2.7. Сопутствующая документация

  • The Linux Firewall-HOWTO /usr/doc/HOWTO/Firewall-HOWTO

  • The Linux PPP-HOWTO /usr/doc/HOWTO/PPP-HOWTO.gz

  • Документация к ssh (/usr/doc/ssh/*)

  • Руководство Сетевого Администратора Linux

  • Специальные Публикации "Компьютеры и Безопасность" NIST http://csrc.ncsl.nist.gov/nistpubs/

  • Список рассылки "Firewall" ([email protected])


3. Введение

В наше время firewall все чаще и чаще используется в Интернете и частных сетях. В связи с этим построение надежных Виртуальных Частных Сетей VPN очень важно. Здесь сосредоточил весь свой опыт в этой области. Я приветствую любые отзывы/критику/предложения по этому поводу.


3.1. Термины

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


4. Процедура

4.1. Планирование

Перед тем, как вы начнете настраивать свою систему, вы должны уточнить детали, касающиеся сети. Я предполагаю, что у вас имеются две интрасети, каждая из которых защищена от внешней сети своим firewall. Соответственно, у вас имеются, как минимум, два сетевых интерфейса на каждом firewall. Возьмите листок бумаги и карандаш, и запишите их IP-адреса и маски. Вам потребуется также еще один IP-адрес на каждый firewall из сетевого пространства, создаваемого вами в VPN. Эти адреса не должны входить в пространство ни одной из существующих сетей. Я предлагаю вам использовать "частные" адреса. Вот их список:

  • 10.0.0.0 - 10.255.255.255

  • 172.16.0.0 - 172.31.255.255

  • 192.168.0.0 - 192.168.255.255

Например, у вас может быть такая конфигурация: Две крепости firewall называются fellini и polanski. На каждом из них имеется интернет-интерфейс (-out), интранет-интерфейс (-in), и vpn-интерфейс (-vpn). Адреса и маски:

  • fellini-out: 193.6.34.12 255.255.255.0

  • fellini-in: 193.6.35.12 255.255.255.0

  • fellini-vpn: 192.168.0.1 point-to-point

  • polanski-out: 193.6.36.12 255.255.255.0

  • polanski-in: 193.6.37.12 255.255.255.0

  • polanski-vpn: 192.168.0.2 point-to-point

Итак, план у нас есть.


4.2. Что вам понадобится

Вам понадобится

  • Linux firewall

  • ядро

  • самая минимальная конфигурация

  • ipfwadm

  • fwtk

  • Утилиты VPN

  • ssh

  • pppd

  • sudo

  • pty-redir

Текущие версии:

  • ядро: 2.0.29 Используйте стабильное ядро, оно должно быть новее 2.0.20, в более ранних была ошибка ping'o'death. В настоящий момент существует ядро 2.0.30, но в нем есть пара ошибок. Если вы хотите, чтобы у вас работал новый более быстрый код работы с сетью, используйте препатч. 3-ий работает прекрасно.

  • базовая система: Я предпочитаю Debian. Но, каждому свое. Вы совсем не хотите использовать большие пакеты, и конечно никогда не думали о sendmail. Вам абсолютно не нужен telnet, ftp, и 'r'-команды (это необходимо только другим unix-ам).

  • ipfwadm: У меня версия 2.3.0

  • fwtk: У меня версия 1.3

  • ssh: 1.2.20 или новее. С более ранними версиями были проблемы с суб-протоколом.

  • pppd: Я использовал 2.2.0f для испытания, но я не уверен в его безопасности, поэтому я убрал у него флаг seteuid, и использовал для его запуска sudo.

  • sudo: 1.5.2 - самая новая из известных мне версий

  • pty-redir: Написан мной. Возьмите его по адресу ftp://ftp.vein.hu/ssa/contrib/mag/pty-redir-0.1.tar.gz. Номер версии - 0.1. Если с ним возникли проблемы - пишите мне.


4.3. Сборка и установка

Соберите или установите уже собранные утилиты. Прочитайте документацию к каждой из них. Прочитайте "Howto: Firewall". Теперь у нас есть утилиты.


4.4. Настройка других подсистем

Настройте необходимые вам правила firewall, и т.п.. Вам надо будет разрешить трафик ssh между двумя машинами. Это означает, что вам надо разрешить вызывающей машине соединение с портом 22 на отвечающей. Запустите sshd на отвечающей машине, и проверьте, можете ли вы соединиться с ней с вызывающей. Этот шаг я не проверял - если возникнут проблемы, пишите.


4.5. Заводим псевдо-пользователя для VPN

Создайте на отвечающей машине псевдо-пользователя для VPN, используя свою любимую утилиту (vi, mkdir, chown, chmod). Вы можете создать его и на вызывающей машине, но, я думаю, вы будете устанавливать соединение при загрузке системы, поэтому хватит и root-а. Кто-нибудь сможет указать мне на проблемы с использованием root на вызывающей машине?


4.6. Создаем ключ ssh для вызывающей стороны

Используйте программу ssh-keygen. Установите пустой пароль, если вы хотите автоматически устанавливать соединение с VPN.


4.7. Настраиваем автоматическую авторизацию на отвечающей стороне

Скопируйте только что созданный ключ на отвечающую машину в каталог .ssh/authorized_keys и установите следующие разрешения:

drwx------ 2 slave slave 1024 Apr 7 23:49 ./
drwx------ 4 slave slave 1024 Apr 24 14:05 ../
-rwx------ 1 slave slave 328 Apr 7 03:04 authorized_keys
-rw------- 1 slave slave 660 Apr 14 15:23 known_hosts
-rw------- 1 slave slave 512 Apr 21 10:03 random_seed  

Первая строка - это каталог ~slave/.ssh, вторая - ~slave.


4.8. Усиляем меры безопасности ssh на обеих сторонах.

Усилить - значит указать в sshd_conf следующее:

PermitRootLogin no
IgnoreRhosts yes
StrictModes yes
QuietMode no
FascistLogging yes
KeepAlive yes
RhostsAuthentication no
RhostsRSAAuthentication no
RSAAuthentication yes
PasswordAuthentication no
PermitEmptyPasswords no 

Парольная авторизация выключена, поэтому вход возможен только при использовании авторизованных ключей. (Вы, конечно, выключили telnet и 'r'-команды).


4.9. Разрешаем запуск ppp и route для обеих сторон.

В моем случае на вызывающей стороне работает root - ничего делать не надо. На отвечающей добавьте следующие строки в файл /etc/sudoers:

Cmnd_Alias VPN=/usr/sbin/pppd,/usr/local/vpn/route
slave ALL=NOPASSWD: VPN  

Как вы видите, я использую скрипты для запуска ppp и настройки таблицы маршрутов на отвечающей машине.


4.10. Пишем скрипты

На вызывающей стороне я написал настоящий init-скрипт:


#! /bin/sh


PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11/:
PPPAPP=/home/slave/ppp
ROUTEAPP=/home/slave/route
PPPD=/usr/sbin/pppd
NAME=VPN
REDIR=/usr/local/bin/pty-redir
SSH=/usr/bin/ssh
MYPPPIP=192.168.0.1
TARGETIP=192.168.0.2
TARGETNET=193.6.37.0
MYNET=193.6.35.0
SLAVEWALL=polanski-out
SLAVEACC=slave

test -f $PPPD || exit 0

set -e

case "$1" in
  start)
	echo setting up vpn
	echo Установка связи с VPN
        $REDIR $SSH -o 'Batchmode yes' -t -l $SLAVEACC $SLAVEWALL sudo $PPPAPP >/tmp/device
	TTYNAME=`cat /tmp/device`
echo tty is $TTYNAME
	sleep 10s
	if [ ! -z $TTYNAME ]
	then
	$PPPD $TTYNAME ${MYPPPIP}:${TARGETIP}
	else
		echo ОШИБКА!
		logger "Соединение VPN установить не удалось"
	fi
	sleep 5s
	route add -net $TARGETNET gw $TARGETIP
	$SSH -o 'Batchmode yes' -l $SLAVEACC $SLAVEWALL sudo $ROUTEAPP
    ;;
  stop)
	ps -ax | grep "ssh -t -l $SLAVEACC " | grep -v grep | awk '{print $1}' | xargs kill
    ;;
  *)
    # echo "Usage: /etc/init.d/$NAME {start|stop|reload}"
    echo "Usage: /etc/init.d/$NAME {start|stop}"
    echo "Использование: /etc/init.d/$NAME {start|stop}"
    exit 1
    ;;
esac

exit 0

На отвечающей потребовался только скрипт, добаляющий строку в таблицу маршрутизации (/usr/local/vpn/route):

#!/bin/bash
/sbin/route add -net 193.6.35.0 gw 192.168.0.1  

а в файл .ppprc я записал следующее:

passive  


5. Что же на самом деле происходит?

Вызывающая сторона заходит в отвечающую, запускает pppd и переназначает все на локальный pty. Для этого он проделывает следующее:

  • создает новое pty

  • соединяется с отвечающей машиной при помощи ssh

  • запускает на отвечающей машине pppd

  • запускает pppd на этом новом локальном pty

  • настраивает таблицу маршрутов на обеих машинах.

Существуют небольшие задержки, поэтому используется 'sleep 10s'.


6. Делаем это вручную

6.1. Заходим в систему

Вы ведь уже попробовали, работает ли ssh? Если отвечающая машина не позволяет вам войти в систему, читайте системные журналы. Возможно проблема состоит в неправильных правах на файлы, или неправильно настроен sshd.


6.2. Запускаем ppp

Зайдите в отвечающую машину и выполните команду: sudo /usr/sbin/pppd passive

Вы должны увидеть на экране мусор. Если это так - это хорошо. Если нет - значит возникла проблема с sudo, или с pppd. Посмотрите на текст ошибки, просмотрите журналы, файлы /etc/ppp/options и .ppprc . Если все нормально - запишите слово 'passive' в файл .ppprc, и попытайтесь снова. Чтобы избавиться от мусора, нажмите Enter,'~' и 'ˆZ'. После этого вы получите приглашение командной строки вызывающей машины - дайте команду kill %1. Читайте главу "Подстройка", если хотите подробнее узнать о специальных символах.


6.3. И второй тоже

Теперь команда ssh -l slave polanski sudo /usr/sbin/pppd

должна работать, и вы снова увидите тот же самый мусор.


6.4. Переназначаем Pty

Попробуйте переназначить сразу все командой /usr/local/bin/pty-redir /usr/bin/ssh -l slave polanski sudo /usr/sbin/pppd

Красивая длинная команда, не так ли? Вы должны использовать полный путь к программе ssh, так как программа переназначения pty позволяет только такую форму - это сделано из соображений безопасности. Теперь у вас есть имя устройства - его вам сказала программа. Предположим, что это /dev/ttyp0. Вы можете использовать команду ps, чтобы узнать, что же случилось. Ищите 'p0'


6.5. Как дела на устройстве?

Попробуйте дать команду /usr/sbin/pppd /dev/ttyp0 local 192.168.0.1:192.168.0.2

чтобы установить соединение. Проверьте наличие интерфейса при помощи команды ifconfig. Проверьте сеть при помощи ping.


6.6. Настройка таблицы маршрутов

Настройте таблицу маршрутов на вызывающей и отвечающей машине. После этого у вас должна работать команда ping с любой машины в одной сети на любую машину в другой. Задайте дополнительные правила firewall. Теперь у вас есть VPN, и вы можете настроить все правила, учитывая связь двух интрасетей.


7. Подстройка

7.1. Подстройка конфигурации

Как я уже говорил, это HOWTO - набор записок на тему "Как я настраивал VPN". В этой конфигурации есть вещи, с которыми я не экспериментировал. Все встанет на свое место, когда я все испытаю, или кто-то скажет мне "это должно работать так-то". Самое главное - соединение, которое использует ppp, до сих пор не является 8-битным. Я думаю, что надо что-то сделать с конфигурацией ssh или pty. На данный момент ssh использует символ "тильда" (~) в качестве служебного. Это может привести к замедлению или разрыву соединения - каждое сочетание символов Enter-~ будет вызывать системное приглашение ssh. В документации к ssh сказано: <В большинстве случаев отключение служебного символа даст полностью прозрачное соединение, как будто используется tty.> Соответствующий флаг ssh - '-e', вы можете устанавливать его в конфигурационном файле.


7.2. Пропускная способность и загруженность систем

Все виртуальное всегда использует реальные ресурсы. VPN требует пропускной способности канала и вычислительных ресурсов. Цель- установить баланс между ними. Вы можете достичь его, подобрав настройку флага '-C' или опции 'CompressionLevel'. Вы даже можете использовать другой компрессор-шифрователь, но я бы этого не рекомендовал. Заметьте, что время прохождения может уменьшиться при увеличении степени компрессирования. Творите, выдумывайте, пробуйте.


8. Анализ уязвимости

Я попытаюсь описать незащищенные места этой настройки, и VPN вообще. Все комментарии горячо приветствуются.

  • sudo: Да, я использую sudo. Но я все же считаю, что это надежнее, чем устанавливать биты setuid. Эти биты до сих пор являются спорной вещью в Linux. Ждем совместимости с рекомендациями POSIX.6 <http://www.xarius.demon.co.uk/software/posix6/>. Что может быть хуже запуска скриптов при помощи sudo? Брррр. Есть какие-нибудь идеи?

  • pppd: У него тоже есть флаг suid root. Его можно настроить при помощи пользовательского файла .ppprc. Он может вызвать переполнения буферов. Результат: защитите псевдо-пользовательский вход на отвечающей машине настолько, насколько возможно.

  • ssh: Знайте, что у ssh версий ранее 1.2.20 есть проблемы с системой защиты. Что может быть хуже - пользователи на обеих машинах открыты, две программы используют sudo. Это все потому, что я отказался от пароля на секретном ключе вызывающей машины в пользу автоматического установления связи с VPN.

  • firewall: Если неправильно настроить правила firewall на одной из машин, вы откроете снаружи доступ к обеим сетям. Я рекомендую использовать IP-маскарадинг (неправильная настройка маршрутов встречается реже), и хорошо следить за VPN-интерфейсами.