VPN с помощью PPP и SSH

Материал из SysadminWiki.ru
Перейти к: навигация, поиск

Вводное слово смотреть в статье Создание vpn туннеля.

Эта статья является переработкой статьи Скота Бронсона (Scott Bronson) VPN PPP-SSH Mini-HOWTO со значительным сокращением (теории и отступлений) и небольшими дополнениями.

Общие настройки для сервера и клиента

- Проверяем, поддерживает ли наше ядро протокол ppp. Проверяем и для сервера и для клиента. Для этого смотрим подключенные модули:

# lsmod

- Если нет, то нужно подключить. Смотрим есть ли у нас эти модули:

# find /lib/modules -name *ppp*
/lib/modules/2.4.22-std-up-alt22/kernel/drivers/net/ppp_async.o
/lib/modules/2.4.22-std-up-alt22/kernel/drivers/net/ppp_deflate.o
/lib/modules/2.4.22-std-up-alt22/kernel/drivers/net/ppp_generic.o
...

видим, что есть. Подключаем:

# modprobe ppp_deflate
# modprobe ppp_async
# modprobe ppp_generic

- Для подключения этих модулей при загрузке компьютера, добавляем в конец файла /etc/modules:

ppp_deflate
ppp_async
ppp_generic

- Так же на обоих компьютерах должны быть установлены пакеты ppp и ssh. Проверяем:

# rpm -qa | grep ppp
ppp-2.4.2-alt6
# rpm -qa | grep ssh
openssh-clients-3.6.1p2-alt6
openssh-server-3.6.1p2-alt6
openssh-3.6.1p2-alt6

В Debian можно проверить одной командой:

# dpkg -l ppp ssh

Видим, что всё нормально, но, если не установлено, то устанавливаем:

# apt-get install ppp

- Так как vpn туннель слегка сужает канал, то могут возникнуть проблемы с почтовой программой. Если такое случилось, то уменьшим максимальный размер пакетов для внешней сетевой карты (у меня eth1):

# ifconfig eth1 mtu 1350

И пропишем эту команду в автозагрузку /etc/rc.d/rc:

ifconfig eth1 mtu 1350

- Далее будем отдельно настраивать сервер и клиент отдельно.


Настройка сервера

- Добавляем пользователя vpn

server# adduser -p vpn

- Проверяем, что завели пользователя корректно. С клиентской машины выполняем:

client# ssh vpn@teo.mynetwork.ru
vpn@teo.mynetwork.ru password:

- Чтобы не нужно было каждый раз набирать пароль, настроим RSA аутентификацию. Создадим публичный ключ root'a на клиенте (пароль пустой):

client# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
...

- Скопируем содержимое файла id_rsa.pub (публичная часть ключа, одна строка) на сервер в файл /home/vpn/.ssh/authorized_keys:

server# cd ~vpn
server# mkdir .ssh
server# chown root.vpn .ssh
server# chmod 755 .ssh
server# cd .ssh
server# touch authorized_keys
server# chown root.vpn authorized_keys
server# chmod 644 authorized_keys

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

- Проверяем работоспособность. На клиенте выполняем:

client# ssh vpn@teo.mynetwork.ru

Должен пустить без запроса пароля.

- Теперь нам нужно, зайдя пользователем vpn, запустить pppd от имени root'a. Для этого используем утилиту sudo. Добавляем в конец файла /etc/sudoers:

Cmnd_Alias VPN=/usr/sbin/pppd
vpn ALL=NOPASSWD: VPN

- Проверяем:

server# su - vpn
server$ sudo /usr/sbin/pppd noauth
~Ъ}#ю!}!}!} }4}"}&} } } } }%}&JoУ`}

Появление всякого мусора в течении ~30 сек говорит о том, что pppd запущен нормально. Прервать можно, нажав Ctrl+C.

- Чтобы остальные пользователи нашей сети могли пользоваться туннелем, добавляем маршрут и заносим его в файл /etc/ppp/ip-up.local, который исполняется при ppp подключении. В этот файл будем добавлять маршруты для каждного туннеля.

server# route add -net 10.9.0.0/24 gw 10.9.0.2
server# touch /etc/ppp/ip-up.local
server# chmod +x /etc/ppp/ip-up.local

/sbin/route add -net 10.9.0.0/24 gw 10.9.0.2

- Сервер не обязательно должен быть шлюзом всей нашей сети. Сейчас мы его сделали шлюзом к подсети 10.9.0.0 и на общесетевом шлюзе нужно будет прописать соответствующий маршрут.

Настройка клиента

- Т.к. ssh и ppp уже установлены, то здесь осталось лишь запустить скрипт для соединения. Создаём /etc/ppp/vpn_up.sh:

#!/bin/sh
# This script initiates a ppp-ssh vpn connection.

SERVER_HOSTNAME=teo.mynetwork.ru
SERVER_USERNAME=vpn
SERVER_IFIPADDR=10.0.0.2
CLIENT_IFIPADDR=10.9.0.2
ROUTE_ADD='route add -net 10.0.0.0/24 gw 10.0.0.2'

#
# The rest of this file should not need to be changed.
#

PATH=/usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/bin/X11/:

#
# required commands...
#

PPPD=/usr/sbin/pppd
SSH=/usr/bin/ssh

if ! test -f $PPPD ; then echo "can't find $PPPD"; exit 3; fi
if ! test -f $SSH ; then echo "can't find $SSH"; exit 4; fi

case "$1" in
  start)
    echo -n "Starting vpn to $SERVER_HOSTNAME: "
     ${PPPD} updetach noauth passive pty "${SSH} ${LOCAL_SSH_OPTS} ${SERVER_HOSTNAME}    -l${SERVER_USERNAME} -o Batchmode=yes sudo ${PPPD} nodetach notty noauth" ipparam vpn ${CLIENT_IFIPADDR}:${SERVER_IFIPADDR}
    echo "connected."
     ${ROUTE_ADD}
  ;;

  stop)
   echo -n "Stopping vpn to $SERVER_HOSTNAME: "
   PID=`ps ax | grep ppp | grep -v passive | grep -v grep | awk '{print $1}'`
   if [ "${PID}" != "" ]; then
     kill $PID
     echo "disconnected."
     else
     echo "Failed to find PID for the connection"
    fi
  ;;

  config)
     echo "SERVER_HOSTNAME=$SERVER_HOSTNAME"
     echo "SERVER_USERNAME=$SERVER_USERNAME"
     echo "SERVER_IFIPADDR=$SERVER_IFIPADDR"
     echo "CLIENT_IFIPADDR=$CLIENT_IFIPADDR"
  ;;

  *)
   echo "Usage: vpn_up {start|stop|config}"
   exit 1
  ;;
esac

exit 0

Обратим внимание, что с клиентской стороны маршрут добавляется только в подсеть 10.0.0.0/24. Если хотим сделать доступными и другие подсети, то для каждой нужно добавить соответствующий маршрут. Тогда скрипт будет выглядеть следующим образом:

...
ROUTE_ADD='route add -net 10.0.0.0/24 gw 10.0.0.2'
ROUTE_ADD2='route add -net 10.0.10.0/24 gw 10.0.0.2'
...
     ${ROUTE_ADD}
     ${ROUTE_ADD2}
...

- Делаем скрипт исполняемым:

client# chmod +x /etc/ppp/vpn_up.sh

- Проверяем:

client# /etc/ppp/vpn_up.sh start

Using interface ppp0
Connect: ppp0 <--> /dev/pts/2
Deflate (15) compression enabled
local IP address 10.9.0.2
remote IP address 10.0.0.2

- Прекратить соединение можно соответствующей командой:

client# /etc/ppp/vpn_up.sh stop

Stopping vpn to teo.mynetwork.ru: Killed by signal 15.
Terminated

которая уберёт соответствующие маршруты с клиентской стороны. Сервер через некоторое время тоже удалит маршруты связанные с этим соединением.

- Поднимаем туннель при загрузке компьютера. Добавляем в конец файла /etc/rc.d/rc.local:

/etc/ppp/vpn_up.sh start

На этом всё.


См. также

Создание vpn туннеля - Общая информация по созданию VPN с перечислением нескольких способов.

Терминальное подключение к серверу Linux с помощью ключей ssh без паролей

Cсылки