VPN-туннель средствами ssh: различия между версиями
Lazyklimm (обсуждение | вклад) м (скрипт для автоконнекта) |
Lazyklimm (обсуждение | вклад) м |
||
Строка 1: | Строка 1: | ||
= Задача = | == Задача == | ||
Есть сервер c локальной сетью, в которую бы мы хотели включить удалённую машину. | Есть сервер c локальной сетью, в которую бы мы хотели включить удалённую машину. | ||
Строка 7: | Строка 7: | ||
На сервере есть бридж br0, в который "воткнуты" eth1 и wlan1, с адресом 192.168.0.1/24, при подключении клиент будет в этой сети иметь адрес 192.168.0.66. | На сервере есть бридж br0, в который "воткнуты" eth1 и wlan1, с адресом 192.168.0.1/24, при подключении клиент будет в этой сети иметь адрес 192.168.0.66. | ||
= Подготовка = | == Подготовка == | ||
== Устанавливаем необходимые пакеты == | === Устанавливаем необходимые пакеты === | ||
=== клиент === | ==== клиент ==== | ||
<source lang=bash> | <source lang=bash> | ||
apt-get install uml-utilities openssh-client | apt-get install uml-utilities openssh-client | ||
</source> | </source> | ||
. | . | ||
=== сервер === | ==== сервер ==== | ||
<source lang=bash> | <source lang=bash> | ||
apt-get install uml-utilities openssh-server bridge-utils | apt-get install uml-utilities openssh-server bridge-utils | ||
</source> | </source> | ||
= Настройка = | == Настройка == | ||
== сервер == | === сервер === | ||
=== sshd === | ==== sshd ==== | ||
Разрешим туннелирование в конфиге /etc/ssh/sshd_config: | Разрешим туннелирование в конфиге /etc/ssh/sshd_config: | ||
Строка 38: | Строка 38: | ||
</source> | </source> | ||
=== interfaces === | ==== interfaces ==== | ||
Чтобы каждый раз вручную не создавать интерфейсы, просто пропишем их в /etc/network/interfaces: | Чтобы каждый раз вручную не создавать интерфейсы, просто пропишем их в /etc/network/interfaces: | ||
Строка 74: | Строка 74: | ||
(в дальнейшем они будут стартовать при загрузке системы) | (в дальнейшем они будут стартовать при загрузке системы) | ||
== клиент == | === клиент === | ||
=== interfaces === | ==== interfaces ==== | ||
<source lang=bash> | <source lang=bash> | ||
Строка 97: | Строка 97: | ||
= Подключаемся = | == Подключаемся == | ||
<source lang=bash> | <source lang=bash> | ||
Строка 119: | Строка 119: | ||
</source> | </source> | ||
= См. также = | == Минусы == | ||
* Не цепляется адрес через dhcp | |||
* Плохо работает http over ipv6 (настроен на сервере через туннельброкера) | |||
== См. также == | |||
* [http://manpages.ubuntu.com/interfaces.5.html man interfaces] | * [http://manpages.ubuntu.com/interfaces.5.html man interfaces] | ||
Строка 125: | Строка 130: | ||
* [http://manpages.ubuntu.com/ssh_config.5.html man ssh_config] | * [http://manpages.ubuntu.com/ssh_config.5.html man ssh_config] | ||
[[Category:Сеть]] | [[Category:Сеть]] |
Версия 11:46, 24 января 2012
Задача
Есть сервер 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 (настроен на сервере через туннельброкера)