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