@ Карта сайта News Автора!

Bog BOS: Реализация VPN с помощью PPP через SSH

Последние изменения:
2024.11.22: sysadmin: systemd-journald (централизованное хранение)
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост

Последнее изменение файла: 2009.06.11
Скопировано с www.bog.pp.ru: 2024.12.02

Bog BOS: Реализация VPN с помощью PPP через SSH

В статье описывается метод объединение сетей по закрытому каналу с помощью протокола PPP в сессии SSH с использованием выделенного канала (или Интернет). Суть метода состоит в установлении SSH соединения между реальными интерфейсами (аутентификация и шифрование) и запуске PPP серверов на обоих концах канала с созданием виртуального канала (маршрутизация сетей). Не подходит, если ожидается большой поток UDP (скорость сильно падает и очень большая загрузка ЦП). Рекомендуется ознакомиться с предварительными сведениями о VPN.

Последовательность действий:

Исходные сети и предварительная подготовка

Пусть нам предстоит объединенить сети 192.168.0.0/23 и 10.101.0.0/16 с помощью программных маршрутизаторов на основе CentOS 5 и CentOS 4. Маршрутизаторы соединены выделенным каналом с окончаниями Ethernet. Первый маршрутизатор имеет интерфейс локальной сети eth1 (192.168.1.96) и интерфейс выделенного канала eth2 (192.168.179.6), будущий интерфейс ppp0 (192.168.254.253). Второй маршрутизатор имеет интерфейс локальной сети eth2 (10.101.0.6) и интерфейс выделенного канала eth4 (192.168.4.6), будущий интерфейс ppp0 (192.168.254.254). Предполагается, что узлы соединяемых сетей настроены на использование 192.168.1.96 (или 10.101.0.6) в качестве шлюза по умолчанию.

Предварительная подготовка заключается в планировании работ и некоторых подготовительных действиях:

Создание выделенных пользователей

Для создания SSH соединения желательно использовать выделенных пользователей с ограниченными правами:

Настройка выделенного ssh-сервера на приёмном конце

Для нашей SSH сессии желательно использовать выделенный SSH сервер, настроенный более жёстко, чем обычный. В частности, соединение будет осуществляться только по ассиметричным ключам, выделенному пользователю будет закрыт обычный вход в систему. Этот сервер запускается на нестандартном порту, обслуживает только пользователя vpnuser1, /etc/ssh/sshd_config_vpn1:

Port 23
ListenAddress 192.168.179.6
AllowUsers vpnuser1
AllowTcpForwarding no
ChallengeResponseAuthentication no
ClientAliveInterval 20
Compression yes
GatewayPorts no
HostbasedAuthentication no
IgnoreRhosts yes
IgnoreUserKnownHosts yes
TCPKeepAlive yes
LogLevel INFO
PasswordAuthentication no
PermitEmptyPasswords no
PermitUserEnvironment no
PermitRootLogin no
PrintMotd no
Protocol 2
PubkeyAuthentication yes
UseDNS no
RhostsRSAAuthentication no
RSAAuthentication no
SkeyAuthentication no
StrictModes yes
#Subsystem       sftp    /usr/libexec/openssh/sftp-server
SyslogFacility AUTHPRIV
UsePAM no
X11Forwarding no
X11UseLocalhost no

Создаём сервис ssh_vpn1 по образу и подобию сервиса ssh

Настройка ppp (маршрутизация на шлюзах)

Настройка sudo на обоих шлюзах

Наш непривилегированный пользователь vpnuser1 должен иметь возможность запускать сервер pppd на обоих шлюзах (в автоматическом режиме только на приёмном конце). Для предоставления ему таких полномочий используем подсистему sudo, /etc/sudoers (используется exempt_group, т.к. NOPASSWD не работает; обязательно использовать visudo):

клиент (CentOS 4)
Defaults    mail_always
Defaults    path_info
Defaults    !requiretty
Defaults    root_sudo
Defaults    exempt_group = vpn
Defaults    !lecture
vpnuser1    имя-хоста-клиента = /usr/sbin/pppd

сервер (CentOS 5)
Defaults    mail_always
Defaults    path_info
Defaults    !requiretty
Defaults    !root_sudo
Defaults    exempt_group = vpn
Defaults    lecture = never
vpnuser1    имя-хоста-клиента = /usr/sbin/pppd

Ручной запуск VPN

Необходимо протестировать работу VPN при ручном запуске:

Автоматизация соединения

После того, как мы убедились в работоспособности VPN, обеспечим возможность автоматического соединения при загрузке ОС, создав новую службу vpn1, например из службы syslog, /etc/init.d/vpn1 (права доступа на выполнение):

#!/bin/bash
#
# vpn1        Starts PPP over SSH (vpn1)
#
#
# chkconfig: 2345 13 87
# description: Starts PPP over SSH (vpn1)
### BEGIN INIT INFO
# Provides: $vpn1
# Required-Start: $network $local_fs
# Required-Stop: $network $local_fs
# Default-Start:  2 3 4 5
# Default-Stop: 0 1 6
### END INIT INFO

# Source function library.
. /etc/init.d/functions

RETVAL=0

umask 077

start() {
        echo -n $"Starting vpn1: "
        daemon /usr/sbin/pppd updetach noauth pty /etc/ppp/vpn1
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/vpn1
        return $RETVAL
}
stop() {
        echo -n $"Shutting down vpn1: "
        killproc ppp0
        echo
        RETVAL=$?
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/vpn1
        return $RETVAL
}
rhstatus() {
        status vpn1
}
restart() {
        stop
        start
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  status)
        rhstatus
        ;;
  restart|reload)
        restart
        ;;
  condrestart)
        [ -f /var/lock/subsys/vpn1 ] &∓ restart || :
        ;;
  *)
        echo $"Usage: $0 {start|stop|status|restart|condrestart}"
        exit 1
esac

exit $?

Созданный нами сервис необходимо опробовать командой "service vpn1 start" (опробовать также stop и status) и добавить в процесс автоматического запуска при загрузке ОС: "chkconfig --add vpn1".

Обработка неудачного соединения и падений канала

Для обработки неудачных соединений (например, если клиентский шлюз загрузился раньше серверного) и падений выделенного канала необходимо написать скрипт, проверяющий наличие соединения /etc/ppp/vpn1_restart.sh (u+x) и вызывать его с помощью cron, например, каждые 5 минут:

#!/bin/bash
if [ `/sbin/ip r|grep 192.168.254.254|wc -l` -lt 1 ]
then
  /etc/init.d/vpn1 start
fi

SELinux

В Fedore 10 начали ограничивать доступ к портам и системным функциям

semanage port -a -t pppd_t -p tcp номер-порта
ещё штук 20 ограничений - плюнул и перевёл в режим Permissive

Ссылки

@ Карта сайта News Автора!

Bog BOS: Реализация VPN с помощью PPP через SSH

Последние изменения:
2024.11.22: sysadmin: systemd-journald (централизованное хранение)
2024.11.11: sysadmin: Linux: пространства имён
2024.11.06: sysadmin: настройка TCP/IP в Linux: виртуальный интерфейс и виртуальный мост



Copyright © 1996-2024 Sergey E. Bogomolov; www.bog.pp.ru