VPN-туннель средствами ssh: различия между версиями

Материал из Linux Wiki
Перейти к навигацииПерейти к поиску
м
 
(не показано 7 промежуточных версий этого же участника)
Строка 1: Строка 1:
= Задача =
== Задача ==


Есть сервер c локальной сетью, в которую бы мы хотели включить удалённую машину.  
Есть сервер c локальной сетью, в которую бы мы хотели включить удалённую машину.  
Строка 5: Строка 5:
Можно поднять openvpn и прочие сервисы, но проще всего создать VPN средствами openssh.
Можно поднять openvpn и прочие сервисы, но проще всего создать VPN средствами openssh.


= Подготовка =
На сервере есть бридж 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:
Строка 36: Строка 38:
</source>
</source>


=== interfaces ===
==== interfaces ====


Чтобы каждый раз вручную не создавать интерфейсы, просто пропишем их в /etc/network/interfaces:
Чтобы каждый раз вручную не создавать интерфейсы, просто пропишем их в /etc/network/interfaces:
Строка 44: Строка 46:
auto tap8
auto tap8
iface tap8 inet manual
iface tap8 inet manual
     pre-up tunctl -u dk -t $IFACE
     pre-up tunctl -u user -t $IFACE
     post-down tunctl -d $IFACE
     post-down tunctl -d $IFACE
     up ifconfig $IFACE 0.0.0.0 up
     up ifconfig $IFACE 0.0.0.0 up
Строка 72: Строка 74:
(в дальнейшем они будут стартовать при загрузке системы)
(в дальнейшем они будут стартовать при загрузке системы)


== клиент ==
=== клиент ===


=== interfaces ===
==== interfaces ====


<source lang=bash>
<source lang=bash>
Строка 82: Строка 84:
     pre-up tunctl -u user -t $IFACE
     pre-up tunctl -u user -t $IFACE
     post-down tunctl -d $IFACE
     post-down tunctl -d $IFACE
     address 192.168.0.66
     address 192.168.0.6
     netmask 255.255.255.0
     netmask 255.255.255.0
</source>
</source>
Строка 95: Строка 97:




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


<source lang=bash>
<source lang=bash>
ssh -o Tunnel=Ethernet -w7:8 user@server
ssh -o Tunnel=Ethernet -w7:8 user@server
</source>
</source>
в параметре -w указываем локальный:удалённый номер tap-интерфейса


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


= Минусы =
Если всё в порядке и работает, можно засунуть примерно такой скрипт в пользовательский cron:
<source lang=bash>
#!/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
</source>
 
== Минусы ==


* Не цепляется адрес через dhcp
* Не цепляется адрес через dhcp
* Плохо работает http over ipv6 (настроен на сервере через туннельброкера)
 
* Нельзя использовать tap интерфейс с отличным от цифрового индентификатором
 
== См. также ==
 
* [http://manpages.ubuntu.com/interfaces.5.html man interfaces]
* [http://manpages.ubuntu.com/ssh.1.html man ssh]
* [http://manpages.ubuntu.com/ssh_config.5.html man ssh_config]
 
 
[[Category:Сеть]]

Текущая версия на 09:59, 4 августа 2014

Задача

Есть сервер 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 интерфейс с отличным от цифрового индентификатором

См. также