Настройка приватного туннеля через SSH
В связи с очередным переходом на режим удаленной работы возникла необходимость воспользоваться сервисом, который доступен только в сети офиса. Полноценного доступа из внешней сети в наш офис никогда не было, т.к. всегда хватало пробросов портов для SSH. Настраивать проброс большого количества портов через ssh в этой ситуации не удобно. Поэтому сделал ip-ip тунель и настроил маршрутизацию в офис через него.
Это все заметки основанные на базе записи в ArchWiki.
Подготовка “серверной” стороны
Настройка ssh
В первую очередь надо настроить SSH-сервер. Надо разрешить ему создавать туннель и дать права на управление сетевыми интерфейсами. Можно создать специального пользователя и группу для него, но здесь будет упрощенный вариант c пользователем root. Пользователю root разрешим вход по ключу.
В конфиге ssh /etc/ssh/sshd_config
надо установить такие параметры:
...
PermitTunnel yes
PermitRootLogin prohibit-password
...
После перезапустить ssh сервер:
systemctl restart sshd
Ещё надо не забыть разместить отпечаток своего ключа у пользователя root.
Если что, то на клиентской машине надо взять содержимое из ~/.ssh/id_ed25519.pub
(или своего типа ключа) и поместить его на сервере в /root/.ssh/authorized_key
.
Настройка сетевого туннеля
Будет создан туннель с номером 5.
Создаем файл /etc/systemd/network/tunnel-over-ssh.netdev
:
[NetDev]
Name=tun5
Kind=tun
[Tun]
User=root
Group=root
Создаем файл /etc/systemd/network/tunnel-over-ssh.network
:
[Match]
Name=tun5
[Address]
Address=192.168.244.1/24
После перезапускаем юнит systemd-networkd.service
systemctl restart systemd-networkd.service
Подключение к серверу
Если вкратце то так:
sudo ssh -fN -w5:5 \
-o ServerAliveInterval=30 \
-o ServerAliveCountMax=5 \
-o TCPKeepAlive=yes \
-o PermitLocalCommand=yes \
-o LocalCommand="sudo ip addr add 192.168.244.2 peer 192.168.244.1/24 dev tun5;sudo ip link set up dev tun5;sudo ip route add 10.43.0.0/24 dev tun5" \
-i ~/.ssh/id_ed25519 \
-l root \
-p 5022 \
my.server.com
Саму команду ssh запускаем через sudo, чтобы были права на создание туннеля.
А теперь подробнее по опциям создаваемого подключения:
- -f переводит команду в фоновое выполнение
- -N позволяет продолжить выполнение без явной команды на удаленном сервере
- -w форвардинг между туннелями - локальным:удаленным. И там и там используем 5
- ServerAliveInterval, ServerAliveCountMax и TCPKeepAlive позволяют поддерживать и вовремя завершать подключение, если клиент находится за NAT
- PermitLocalCommand позволяет выполнить команду на клиенте после подключения
- LocalCommand команда, которую надо выполнить
- -i путь до ключа, который использовать для подключения
- -l пользователь, под которым подключаться
- -p порт, на который надо подключаться
Описание выполняемых команд:
Команда sudo ip addr add 192.168.244.2 peer 192.168.244.1/24 dev tun5
добавляет туннелю локальный и удаленный адреса.
Команда sudo ip link set up dev tun5
поднимает туннель, т.к. ssh просто его
создает, но не включает.
Команда sudo ip route add 10.43.0.0/24 dev tun5
добавляет маршрут в сеть офиса.