|
Bog BOS: Реализация VPN с помощью PPP через SSH |
Последние изменения: |
Последнее изменение файла: 2009.06.11
Скопировано с www.bog.pp.ru: 2024.11.23
В статье описывается метод объединение сетей по закрытому каналу с помощью протокола 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 соединения желательно использовать выделенных пользователей с ограниченными правами:
Host vpn1 HostName 192.168.179.6 Port 23 PreferredAuthentications publickey Protocol 2 IdentityFile ~/.ssh/vpn
Для нашей 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
Наш непривилегированный пользователь 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, обеспечим возможность автоматического соединения при загрузке ОС, создав новую службу 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
В Fedore 10 начали ограничивать доступ к портам и системным функциям
semanage port -a -t pppd_t -p tcp номер-порта ещё штук 20 ограничений - плюнул и перевёл в режим Permissive
|
Bog BOS: Реализация VPN с помощью PPP через SSH |
Последние изменения: |