Оглавление

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(номер может быть любым). Вся процедура проста:

Connect to the server

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

Сервер на Linux

cli># ssh -w5:5 root@p2p_server
srv># ifconfig tun5 10.0.1.1 netmask 255.255.255.252   # Выполняется в оболочке сервера

Сервер на FreeBSD

cli># ssh -w5:5 root@p2p_server
srv># 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 (сеть Б)

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

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

шлюз Б на Linux

gateA># ssh -w5:5 root@gateB
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 root@gateB                          # Создаем устройство 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                # Смотри NAT
gateA># sysctl net.inet.ip.fw.enable=1
В итоге имеет две частные сети, прозрачно соединенные через SSH VPN. Перенаправление IP и настройки NAT необходимы только если шлюзы не являются шлюзами по умолчанию (в этом случае клиент не будет знать, куда пересылать ответы).
Оглавление