artem
11.04.2018
611

Основные сценарии использования SSH-туннелей

Сценарий 1: есть доступ по SSH на хост в удалённой сети, требуется настроить в этой сети множество устройств через web-интерфейс

Например, есть доступ по SSH к серверу телефонии клиента, требуется вручную настроить 20+ телефонов и/или VoIP-шлюзов (использование провижининга по какой-либо причине неприемлемо). Схема ниже:

Схема подключения

Вместо настройки проброса порта для каждого устройства, можно на время настройки сделать SSH-туннель к серверу клиента и добавить на своём хосте маршруты в подсети клиента через SSH-туннель (здесь и далее предполагается, что подключение по SSH производится с хоста под управлением ОС Linux).

 

Настройки на удалённом хосте (все команды, приведённые ниже для удалённого и для локального хоста, нужно выполнять с правами суперпользователя):

# Установите в файле /etc/ssh/sshd_config опцию “PermitTunnel yes”, затем перезапустите SSH-сервер для применения настроек
service sshd restart
 
# Включите форвардинг пакетов
sysctl -w net.ipv4.ip_forward=1
 
# Добавьте в iptables правила, пропускающие соединения из туннеля в локальную сеть
# (в рамках данного примера в качестве транзитной подсети будет использоваться 10.255.255.0/30, VPN-интерфейс на обоих концах будет tun7)
iptables -P FORWARD DROP
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i tun7 -o eth0 -s 10.255.255.2 -j ACCEPT
 
# Также нужно натировать соединения, приходящие через туннель, т.к. остальные хосты в локальной сети ничего не будут знать о подсети 10.255.255.0/30
iptables -t nat -A POSTROUTING -o eth0 -s 10.255.255.2 -j MASQUERADE

Настройки на локальном хосте:

# Установите SSH-соединение с удалённым хостом с созданием туннеля
ssh -w 7:7 remote-server.example.com
 
# Назначьте IP-адрес своему концу туннеля
ifconfig tun7 up 10.255.255.2 pointopoint 10.255.255.1
 
# Создайте маршруты в подсети клиента через туннель (здесь 192.168.101.0/24 и 192.168.201.0/24)
ip route add 192.168.101.0/24 via 10.255.255.1
ip route add 192.168.201.0/24 via 10.255.255.1
 

Связь с удалёнными подсетями пока не будет работать, т.к. нужно ещё назначить IP-адрес концу туннеля на удалённом хосте:

ifconfig tun7 up 10.255.255.1 pointopoint 10.255.255.2

Если все действия выполнены правильно, на локальном хосте должен быть доступ в удалённые подсети через SSH-туннель, на web-интерфейсы устройств можно заходить по их адресам в удалённой сети без всяких пробросов.
Когда созданный SSH-туннель больше не будет нужен, обязательно отмените все изменения на удалённом хосте:

# Установите в файле /etc/ssh/sshd_config опцию “PermitTunnel no”, и снова перезапустите SSH-сервер
service sshd restart
 
# Выключите форвардинг пакетов
sysctl -w net.ipv4.ip_forward=0
 
# Удалите добавленные ранее правила iptables

На локальном хосте достаточно просто разорвать SSH-соединение, через которое настроен туннель.

 

ПРИМЕЧАНИЕ: с помощью описанного приёма можно также получить доступ к web-интерфейсам, которые не работают при обращении к ним через проброс порта по SSH из-за адреса 127.0.0.1 в запрошенном URL (такие устройства встречаются очень редко, но это случается).

 

Сценарий 2: есть доступ по SSH на хост в удалённой сети, требуется скачать и поставить на хост какие-либо пакеты из интернета, но хост находится за файрволом, запрещающим доступ в интернет

Желательно решать подобные вопросы через отдел ИТ клиента, но с этим могут возникнуть самые различные проблемы. С помощью SSH-туннеля можно временно выпустить удалённый хост в интернет через свой собственный хост. В данном примере доступ на удалённый хост по SSH осуществляется через проброс порта:

Схема подключения

Реализация похожа на предыдущий сценарий, но форвардинг и правила iptables теперь нужно добавлять на локальном хосте.

 

Настройки на удалённом хосте (все команды, приведённые ниже для удалённого и для локального хоста, нужно выполнять с правами суперпользователя):

# Установите в файле /etc/ssh/sshd_config опцию “PermitTunnel yes”, затем перезапустите SSH-сервер для применения настроек
service sshd restart

Настройки на локальном хосте:

# Включите форвардинг пакетов
sysctl -w net.ipv4.ip_forward=1
 
# Добавьте в iptables правила, пропускающие соединения из туннеля в интернет
# (в качестве транзитной подсети будет также использоваться 10.255.255.0/30, VPN-интерфейс на обоих концах будет tun7)
iptables -P FORWARD DROP
iptables -A FORWARD -m state –state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i tun7 -o eth0 -s 10.255.255.1 -j ACCEPT
 
# Включите натирование для соединений из туннеля
iptables -t nat -A POSTROUTING -o eth0 -s 10.255.255.1 -j MASQUERADE
 
# Установите SSH-соединение с удалённым хостом с созданием туннеля
ssh -w 7:7 remote-server.example.com
 
# Назначьте IP-адрес своему концу туннеля
ifconfig tun7 up 10.255.255.2 pointopoint 10.255.255.1 

Снова настройки на удалённом хосте:

# Назначьте IP-адрес удалённому концу туннеля
ifconfig tun7 up 10.255.255.1 pointopoint 10.255.255.2 

Далее самый ответственный момент – чтобы удалённый хост получил полный доступ в интернет через SSH-туннель, нужно будет заменить его шлюз по умолчанию на 10.255.255.2. Естественно перед этим нужно, как минимум, добавить маршрут к IP-адресу, с которого Вы подключаетесь по SSH, через шлюз в подсети удалённого сервера, чтобы тут же не потерять доступ к нему. Обратите внимание на то, что удалённый сервер потеряет доступ ко всем локальным и удалённым подсетям, к которым у него был доступ через шлюз в локальной сети. Обязательно добавьте маршруты через шлюз в локальной сети во все подсети, в которых есть клиенты данного сервера, чтобы сохранить их работоспособность (напримет подсеть 192.168.201.0/24 из предыдущего сценария).
Ниже приведены все измения в таблице маршрутов удялённого хоста, с учётом того, что его шлюзом по умолчанию является 192.168.101.1 и подключение по SSH осуществляется с IP-адреса 1.2.3.4 (обязательно проверьте, с какого именно IP-адреса сервер получает пакеты от вашего хоста, с помощью команды who).

ip route add 1.2.3.4 via 192.168.101.1
ip route add 192.168.201.0/24 via 192.168.101.1
ip route del default; ip route add default via 10.255.255.2

Если все действия выполнены правильно, на удалённом хосте теперь должен быть доступ в интернет через SSH-туннель, можно установить на нём все необходимые пакеты (если хост использует DNS-серверы в локальной сети, желательно поменять их на публичные). После этого нужно обязательно отменить все внесённые изменения.
На удалённом хосте:

# Установите в файле /etc/ssh/sshd_config опцию “PermitTunnel no”, и перезапустите SSH-сервер
service sshd restart
 
# Верните маршрут по умолчанию и удалите добавленные маршруты
ip route del default; ip route add default via 192.168.101.1
ip route del 1.2.3.4
ip route del 192.168.201.0/24
 
# Верните DNS-серверы, если меняли их

На локальном хосте:

# Выключите форвардинг пакетов
sysctl -w net.ipv4.ip_forward=0
 
# Удалите добавленные правила iptables и разорвите SSH-соединение

 
avatar
  Подписаться  
Уведомление о

Остались вопросы?

Я - Першин Артём, менеджер компании Voxlink. Хотите уточнить детали или готовы оставить заявку? Укажите номер телефона, я перезвоню в течение 3-х секунд.

VoIP оборудование

ближайшие курсы

ближайшие Вебинары

ONLINE

Why Choose HUGE?

Unlimited pre-designed elements

Each and every design element is designed for retina ready display on all kind of devices

User friendly interface and design

Each and every design element is designed for retina ready display on all kind of devices

100% editable layered PSD files

Each and every design element is designed for retina ready display on all kind of devices

Created using shape layers

Each and every design element is designed for retina ready display on all kind of devices