VPN-туннель средствами ssh
Задача
Есть сервер 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 dk -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.66
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
- Плохо работает http over ipv6 (настроен на сервере через туннельброкера)