Соединение 2 локальных сетей с помощью ppp over ssh (ssh ppp network vpn)
Голованов Сергей;[email protected]>
Date: Mon, 14 Jul 2004 13:01:37 +0000 (UTC)
Когда понадобилось соединить 2 локалки без пересборки ядра, я перечитал
много документации. Статья на opennet.ru "Создание VPN GRE тунеля в
Linux" подвигла меня на подобное творение, но про ppp over ssh, т. е.
vpn , но с шифрованием.
Просмотрев много статей по созданию тунелей я к своему удивлению не
нашел ничего о том как быстро и без проблем создать шифрованный тунель
между двумя машинами (сетями) через интернет. И вот решил написать.
Буду предельно краток...
И так, ДАНО:
1. Сеть 192.168.1.0/24 (255.255.255.0) В которой есть машина подключенная
к интернет. Со стороны локальной сети машина имеет IP: 192.168.1.1 (на eth1)
а со стороны инета имеет IP: 100.200.300.400 (на eth0) Назовем эту машину ALPHA.
2. Сеть 192.168.2.0/24 (255.255.255.0) В которой есть машина подключенная
к интернет. Со стороны локальной сети машина имеет IP: 192.168.2.1 (на eth1)
а со стороны инета имеет IP: 400.300.200.100 (на eth0) Назовем эту машину BETTA.
Цель: Надо организовать шифрованный тунель между машинами ALPHA и BETTA,
чтобы компьютеры одной сети имели доступ к компьютерам в другой сети.
Считаем, что ssh и pppd уже установлен в обоих системах.
На машине ALPHA делаем:
1. Заводим пользователя vpn-user: adduser vpn-user.
Заходим ручками в etc/passwd и приводим строку про этого пользователя к виду:
vpn-user:*:520:520::/home/vpn:/usr/sbin/pppd
2. Настраиваем pppd: в /etc/ppp/options пишем:
ipcp-accept-local
ipcp-accept-remote
proxyarp
noauth
3. Добавляем в etc/crontab строчку:
* * * * * root /sbin/route add -net 192.168.2.0 gw 192.168.2.19 netmask 255.255.255.0 2>/dev/null
4. Настраиваем ssh:
В /etc/ssh/sshd_config кроме прочих опций надо чтоб было:
PubkeyAuthentication yes
Остальное - по вкусу.
На машине BETTA делаем:
1. Настраиваем /etc/ppp/options:
lock
noauth
2. Делаем su -
И: ssh 100.200.300.400 (для появления файла known_hosts)
ssh-keygen -t rsa -f /etc/ssh/vpn-identity
После этого берем /etc/ssh/vpn-identity.pub и копируем его на машину ALPHA
в каталог /home/vpn/.ssh в файл с именем authorized_keys.
3. Качаем программку pry-redir:
http://uncensored.citadel.org/pub/unix/pty-redir-0.1.tar.gz
Распаковываем, делаем make, складываем то, что получилось в /usr/sbin
4. Пишем например такое:
/etc/init.d/vpnd:
#!/bin/sh
#
# vpnd: Starts the ppp over ssh tunnel
#
# Version: @(#) /etc/init.d/vpnd 1.0
#
#########
# Source function library.
. /etc/init.d/functions
prog=VPND
USERNAME=vpn-user
IDENTITY=/etc/ssh/identify.vpn
CRYPTO=blowfish
LOCK_DIR=/var/run
VPN_EXTERNAL=100.200.300.400
VPN_INTERNAL=192.168.1.19
#PPP_OPTIONS=" mtu 1200 mru 1200"
PTY_REDIR=/usr/sbin/pty-redir
PPPD=/usr/sbin/pppd
ROUTE=/sbin/route
SSH=/usr/bin/ssh
start() {
echo -n $"Starting $prog: "
$PTY_REDIR $SSH -t -e none -o 'Batchmode yes' -c $CRYPTO -i $IDENTITY -l $USERNAME $VPN_EXTERNAL > /tmp/vpn-device
sleep 10
$PPPD `cat /tmp/vpn-device` 192.168.2.19:$VPN_INTERNAL # $PPP_OPTIONS
ret=$?
sleep 10
$ROUTE add -net 192.168.1.0 gw $VPN_INTERNAL netmask 255.255.255.0
[ $ret -eq 0 ] && echo_success; touch $LOCK_DIR/vpnd.pid
echo
return $ret
}
stop() {
echo -n $"Shutting down $prog: "
killall pppd
ret=$?
[ $ret -eq 0 ] && rm -f $LOCK_DIR/vpnd.pid
echo
return $ret
}
restart() {
echo $"Restarting $prog:"
stop
start
}
rhstatus() {
echo $"Status of $prog:"
status pppd
}
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
restart
;;
status)
rhstatus
;;
*)
echo $"*** Usage: $prog {start|stop|status|restart}"
exit 1
esac
exit $?
Вроде все. Для rh делаем service vpnd start.
Должно работать.
|