VPN на базе SSH
- Данная статья 100 % копипаст с www.openbsd.ru
Мини-руководство «шаг за шагом»
Для примера возьмем два сервера: srv1 с IP-адресами 212.34.XX.YY и 192.168.2.1 подключен к сегменту внутренней сети 192.168.2.0/24, а srv2 с 213.167.XX.YY и 192.168.1.1 шефствует над подопечными из 192.168.1.0/24. Настроим VPN-туннель средствами OpenSSH, в котором будут использоваться адреса 10.0.0.1 и 10.0.0.2. Для наглядности сценарий можно представить следующим образом:
(10.0.0.1) 212.34.XX.YY 213.167.XX.YY (10.0.0.2) 192.168.2.0/24 — srv1 — [ internet ] — srv2 — 192.168.1.0/24 192.168.2.1 192.168.1.1
Ключевые элементы сетевой конфигурации рассмотрены, теперь приступаем к настройкам. Логинимся на srv1 и правим главный конфигурационный файл sshd(8):
srv1# vi /etc/ssh/sshd_config # Разрешаем туннелирование layer-3 # PermitTunnel point-to-point # VPN на базе OpenSSH требует привилегий суперпользователя, # поэтому аутентификацию под учетной записью root разрешаем # только с доверенных хостов # PermitRootLogin no Match Host 213.167.XX.YY,192.168.2.*,127.0.0.1 PermitRootLogin yes
По окончании настроек не забываем отправить демону сигнал SIGHUP, чтобы он смог перечитать свой конфиг:
srv1# kill -HUP `sed q /var/run/sshd.pid`
Далее разрешаем прохождение пакетов на используемых туннельных псевдоустройствах tun(4) (на tun0 у меня висит OpenVPN, tun1 — для OpenSSH):
srv1# vi /etc/pf.conf pass quick on { tun0, tun1 } inet all
Загружаем правила из конфига:
srv1# pfctl -f /etc/pf.conf
Создаем интерфейс tun1 и назначаем ему IP-адрес:
srv1# ifconfig tun1 create srv1# ifconfig tun1 10.0.0.1 10.0.0.2 netmask 255.255.255.252
При помощи команды ifconfig(8) проверяем его состояние:
srv1% ifconfig tun1 tun1: flags=51<UP,POINTOPOINT,RUNNING> mtu 1500 groups: tun inet 10.0.0.1 --> 10.0.0.2 netmask 255.255.255.252
Не забываем добавить в таблицу маршрутизации удаленную подсеть:
srv1# route add 192.168.1.0/24 10.0.0.2
Второй сервер выступает в роли SSH-клиента, поэтому процедура конфигурирования здесь чуть проще:
srv2# echo 'Tunnel point-to-point' >> /etc/ssh/ssh_config
Остальные настройки и действия практически идентичны описанным выше: правим и активируем рулесеты файервола, поднимаем tun1, присваиваем ему сетевой адрес (обратите внимание, порядок следования IP-адресов изменен) и добавляем статический маршрут:
srv2# vi /etc/pf.conf pass quick on { tun0, tun1 } inet all srv2# pfctl -f /etc/pf.conf srv2# ifconfig tun1 create srv2# ifconfig tun1 10.0.0.2 10.0.0.1 netmask 255.255.255.252 srv2# route add 192.168.2.0/24 10.0.0.1
И, наконец, самый ответственный момент: устанавливаем защищенное соединение между двумя сетями:
srv2# ssh -f -w 1:1 212.34.XX.YY true
Чтобы снизить накладные расходы, к списку аргументов имеет смысл добавить ключи «-o Compression=yes -x -a -n» (сжимать передаваемые данные, отключить пересылку пакетов X11, запретить аутентификацию с помощью агента и направить /dev/null на стандартный входной поток stdin(4)). Теперь проверим доступность удаленного узла, находящегося «за первым сервером»:
srv2% ping 192.168.2.101 PING 192.168.2.101 (192.168.2.101): 56 data bytes 64 bytes from 192.168.2.101: icmp_seq=0 ttl=127 time=2.508 ms
Если все ОК, можно дальше развивать предложенную схему, упрощая или, наоборот, усложняя настройки. Например, применить беспарольную аутентификацию на базе ключей, создать конфигурационный файл для автоматического создания псевдоустройства tun1:
srv2# echo '10.0.0.2 10.0.0.1 netmask 255.255.255.252' > /etc/hostname.tun1
Занести необходимые статические маршруты и запуск «ssh -f -w» в один из сценариев начальной загрузки (/etc/rc.local) или в отдельный скрипт, чтобы все выполнялось одной командой, без дополнительных телодвижений. Чтобы использовать OpenSSH на уровне OSI 2, в качестве значения директив PermitTunnel и Tunnel следует использовать ethernet, а затем объединить в мост внешний сетевой интерфейс и псевдоустройство tunX (см. bridge(4)).
Стоит отметить, с помощью OpenSSH возможно построение не только Site-to-Site VPN (межсайтовое подключение, в котором два маршрутизатора создают туннель в интернете), но и Client-to-Site (VPN-подключение удаленного доступа для проводных и беспроводных клиентов).
Данное пошаговое руководство основано на статье «Волшебные криптотуннели», опубликованной в июльском номере журнала «Хакер» за 2008 год. Авторы оригинальной статьи: Андрей Матвеев и Сергей Яремчук.