VPN через SSH

С версии 4.3, OpenSSH поддерживает устройства tun/tap, позволяющие создавать шифрованный туннель, что может быть весьма полезно в случае удаленного администрирования. Это очень похоже на OpenVPN, основанный на TLS. Плюс протокола SSH в том, что для реализации не нужно устанавливать и настраивать дополнительный софт. Из минусов, низкая производительность на медленных линиях.

Шифрованный туннель создается на основе одного TCP соединения, что весьма удобно, для быстрого поднятия простого VPN, на IP.

В конфигурационном файле sshd_conf, должны стоять следующие опции:

PermitRootLogin yes
PermitTunnel yes

Одно P2P (peer to peer - точка точка) соединение

Попробуем соединить два хоста p2p_client и p2p_server. Соединение инициирует p2p_client к p2p_server, при этом он должен обладать правами root. Конечные адреса туннеля 10.0.0.1 (сервер) и 10.0.0.2 (клиент), кроме того мы создаем устройство tun5 ( номер может быть любым ). Вся процедура проста:

  • Подключиться по SSH используя опцию -w
  • Сконфигурировать IP адреса туннеля, ssh сервер - ssh клиент

Конфигурация SSH сервера

Подключение инициирует ssh клиент, все команды выполняются на сервере.

Сервер на Linux
cli># ssh -w5:5 [email protected]_server
srv># ifconfig tun5 10.0.1.1 netmask 255.255.255.252   # Выполняется в оболочке сервера
Сервер на FreeBSD
cliуте# ssh -w5:5 [email protected]_server
sуrvук# ifconfig tun5 10.0.1.1 10.0.1.2                  # Выполняется в системной оболочке сервера

Конфигурирование SSH клиента

Команды выполняемые на ssh клиенте:

cli># ifconfig tun5 10.0.1.2 netmask 255.255.255.252   # SSH клиент на Linux
cli># ifconfig tun5 10.0.1.2 10.0.1.1                  # SSH клиент на FreeBSD

Теперь хосты соединены и могут обмениваться информацией, используя IP адреса туннеля.

Соединение двух сетей

Более полезная возможность SSH, соединение двух сетей, используя два шлюза. Предположим, есть две сети, сеть А с адресом 192.168.51.0/24 и сеть Б с адресом 192.168.16.0/24. Процедура идентична вышеописанной, за исключением того, что нужно будет добавить маршрут.
192.168.51.0/24 (сеть A)|шлюз A <-> шлюз Б|192.168.16.0/24 (сеть Б)

  • Подключится через SSH с опцией -w.
  • Настройка IP адреса SSH туннеля, делается единожды, на сервере и на клиенте.
  • Добавить маршрут для обоих сетей.
  • Если нужно, включить NAT на внутреннем интерфейсе шлюза.

Подключение из сети А к сети сети Б

Соединение начинается со шлюза А, команды выполняются на шлюзе Б.

шлюз Б на Linux
gateA># ssh -w5:5 [email protected]
gateB># ifconfig tun5 10.0.1.1 netmask 255.255.255.252 # Выполняется в оболочке шлюза Б
gateB># route add -net 192.168.51.0 netmask 255.255.255.0 dev tun5
gateB># echo 1 > /proc/sys/net/ipv4/ip_forward        # Необходимо только если шлюз не Default Gateway
gateB># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
шлюз Б на FreeBSD
gateA># ssh -w5:5 [email protected]                          # Создаем устройство tun5
gateB># ifconfig tun5 10.0.1.1 10.0.1.2               # Выполняется на шлюзе Б
gateB># route add 192.168.51.0/24 10.0.1.2
gateB># sysctl net.inet.ip.forwarding=1               # Необходимо только если шлюз не Default Gateway
gateB># natd -s -m -u -dynamic -n fxp0                # Смотрим NAT
gateA># sysctl net.inet.ip.fw.enable=1

Настройка шлюза А

Команды выполняемые на шлюзе А:

шлюз A на Linux
gateA># ifconfig tun5 10.0.1.2 netmask 255.255.255.252
gateA># route add -net 192.168.16.0 netmask 255.255.255.0 dev tun5
gateA># echo 1 > /proc/sys/net/ipv4/ip_forward
gateA># iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
шлюз A на FreeBSD
gateA># ifconfig tun5 10.0.1.2 10.0.1.1
gateA># route add 192.168.16.0/24 10.0.1.2
gateA># sysctl net.inet.ip.forwarding=1
gateA># natd -s -m -u -dynamic -n fxp0                
gateA># sysctl net.inet.ip.fw.enable=1

В итоге имеет две частные сети, прозрачно соединенные в VPN через SSH. Перенаправление IP и настройки NAT необходимы только если шлюзы не являются шлюзами по умолчанию (в этом случае клиент не будет знать, куда пересылать ответы).