VPN с помощью PPP и SSH
Вводное слово смотреть в статье Создание 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сылки
- http://www.opennet.ru/docs/HOWTO/mini/ppp-ssh/index.html - VPN PPP-SSH Mini-HOWTO by Scott Bronson
- http://www.opennet.ru/docs/HOWTO/VPN-HOWTO/index.html - VPN HOWTO by Matthew D. Wilson