VPN-туннель средствами ssh

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску

Задача

Есть сервер c локальной сетью, в которую бы мы хотели включить удалённую машину.

Можно поднять openvpn и прочие сервисы, но проще всего создать VPN средствами openssh.

На сервере есть бридж br0, в который "воткнуты" eth1 и wlan1, с адресом 192.168.0.1/24, при подключении клиент будет в этой сети иметь адрес 192.168.0.66.

Подготовка

Устанавливаем необходимые пакеты

клиент

apt-get install uml-utilities openssh-client

сервер

apt-get install uml-utilities openssh-server bridge-utils

Настройка

сервер

sshd

Разрешим туннелирование в конфиге /etc/ssh/sshd_config:

PermitTunnel yes

и перезапустим сервис

sudo invoke-rc.d ssh restart

interfaces

Чтобы каждый раз вручную не создавать интерфейсы, просто пропишем их в /etc/network/interfaces:

# ssh tunnel iface
auto tap8
iface tap8 inet manual
    pre-up tunctl -u user -t $IFACE
    post-down tunctl -d $IFACE
    up ifconfig $IFACE 0.0.0.0 up
    down ifconfig $IFACE down
# Параметром -u для tunctl следует указать пользователя, под которым будем логиниться на сервере

 
# bridge
auto br0
iface br0 inet static
    address 192.168.0.1
    network 192.168.0.0
    netmask 255.255.255.0
    broadcast 192.168.0.255
    bridge-stp off
    bridge-ports eth1 wlan1 tap8

в bridge-ports указываются интерфейсы, которые будут объединены в бридж. Если бридж не нужен, tap-интерфейс можно настроить аналогично клиенту (см. ниже).

Поднимаем:

sudo ifup tap8 br0

(в дальнейшем они будут стартовать при загрузке системы)

клиент

interfaces

# ssh tunnel iface
auto tap7
iface tap7 inet static
    pre-up tunctl -u user -t $IFACE
    post-down tunctl -d $IFACE
    address 192.168.0.6
    netmask 255.255.255.0

Параметром -u для tunctl следует указать пользователя, от которого будет запускаться ssh с клиентской стороны.

Поднимаем:

sudo ifup tap7


Подключаемся

ssh -o Tunnel=Ethernet -w7:8 user@server

в параметре -w указываем локальный:удалённый номер tap-интерфейса


Если всё в порядке и работает, можно засунуть примерно такой скрипт в пользовательский cron:

#!/bin/sh

connect() 
{
    srv=$1
    ping -W 1 -c 3 -q -I tap7 192.168.0.1 2>/dev/null ||
        ssh -NTCf -o ServerAliveInterval=10 -o Tunnel=Ethernet -w7:8 $srv
}

connect user@server

Минусы

  • Не цепляется адрес через dhcp
  • Нельзя использовать tap интерфейс с отличным от цифрового индентификатором

См. также