- Создание SSH-туннеля. Часть 1 из 4
- Проброс локального соединения на удаленную машину
- Проброс удаленного соединения на локальную машину
- Примеры проброса соединения
- Проброс локального соединения на удаленную машину
- Проброс удаленного соединения на локальную машину
- Configuring SSH Tunnels in Oracle Linux
- Objectives
- What Do You Need?
- Configuring SSH Tunneling
- Configuring SSH dynamic port forwarding
- Configuring SSH local port forwarding
- Video Demonstration
- More Learning Resources
Создание SSH-туннеля. Часть 1 из 4
SSH туннель — это туннель, создаваемый посредством SSH соединения и используемый для шифрования туннелированных данных. Используется для того, чтобы обезопасить передачу данных в интернете. Особенность состоит в том, что незашифрованный трафик какого-либо протокола шифруется на одном конце SSH соединения и расшифровывается на другом.
Строго говоря, SSH-туннели не являются полноценными туннелями и это название следует рассматривать как сложившееся в профессиональной среде устойчивое наименование. Официальное название технологии — SSH Port Forwarding — это опциональная возможность протокола SSH, которая позволяет передать TCP-пакет с одной стороны SSH-соединения на другую и произвести в процессе передачи трансляцию IP-заголовка по заранее определенному правилу.
Понять, как работает SSH туннель очень просто: если представить его в виде point-to-point соединения. Так же как и в PPP, любой пакет, попавший в один конец соединения, будет передан и получен на другом конце туннеля. Дальше, в зависимости от адреса получателя, заданного в IP заголовке, пакет будет либо обработан принимающей стороной туннеля (если пакет предназначается непосредственно ей), либо смаршрутизирован дальше в сеть (если адресатом является другой узел сети).
За TCP Port Forwarding отвечает опция AllowTcpForwarding в файле конфигурации SSH-сервера. По умолчанию она имеет значение yes , так что дополнительные настройки не нужны.
Проброс локального соединения на удаленную машину
$ ssh -L [ЛокальныйАдрес:]ЛокальныйПорт:АдресНазначения:ПортНазначения Пользователь@УдаленныйСервер \_____________ _____________/ \_____________ _____________/ \______ _____/ \/ \/ \/ точка входа пункт назначения точка выхода
После этого все соединения на ЛокальныйАдрес:ЛокальныйПорт будут перебрасываться удаленному серверу, который будет соединяться с АдресНазначения:ПортНазначения от своего имени.
Проброс удаленного соединения на локальную машину
Для совершения обратного действия нужно выполнить команду с ключом -R :
$ ssh -R [УдаленныйАдрес:]УдаленныйПорт:АдресНазначения:ПортНазначения Пользователь@УдаленныйСервер \_____________ _____________/ \_____________ _____________/ \/ \/ точка выхода — хост, где точка входа пункт назначения выполняется эта команда
Команда работает также, как и в вышеописанном случае, только соединения перебрасываются с удаленной машины на локальную.
Для OpenSSH точка входа всегда совпадает с локальным интерфейсом 127.0.0.1 , поэтому его можно опустить, сразу начиная команду с порта точки входа.
Примеры проброса соединения
У меня физический компьютер с двумя виртуальными машинами. На физической машине — Windows 10 и установлены web-сервер Apache и сервер БД MySQL. На виртуальной машине ssh-server — Ubuntu 18.04 и установлен SSH-сервер. На виртуальной машине web-server — Ubuntu 18.04 и установлен web-сервер Apache и сервер БД MySQL.
- Физическая машина TKMCOMP , ОС Windows 10, ip-адрес 192.168.110.2
- Виртуальная машина ssh-server , ОС Ubuntu 18.04, ip-адрес 192.168.110.8
- Виртуальная машина web-server , ОС Ubuntu 18.04, ip-адрес 192.168.110.12
Все машины находятся в одной локальной сети — для удобства проведения экспериментов с построением туннелей. Хотя с практической точки зрения нужен компьютер с белым ip-адресом и с установленным ssh-сервером — который будет посредником между двумя компьютерами с серыми ip-адресами.
На виртуальной машине web-server работает web-сервер Apache — если на физическом компьютере открыть в браузере страницу http://192.168.110.12 , то увидим дефолтную страницу Apache:
На физической машине TKMCOMP тоже работает web-сервер Apache — если открыть в браузере страницу http://127.0.0.1 , то увидим вывод php-функции phpinfo() :
На виртуальной машине ssh-server необходимо открыть порт для ssh-соединений. У меня это — 2222:
$ sudo ufw allow 2222/tcp Правило добавлено Правило добавлено (v6)
$ sudo ufw status verbose Состояние: активен Журналирование: on (low) По умолчанию: deny (входящие), allow (исходящие), disabled (маршрутизированные) В Действие Из ---------------------------------------------------- 2222/tcp ALLOW IN Anywhere 2222/tcp (v6) ALLOW IN Anywhere (v6)
Проброс локального соединения на удаленную машину
Открываем на физической машине PowerShell и выполняем команду:
> ssh -p 2222 -L 127.0.0.1:8080:192.168.110.12:80 evgeniy@192.168.110.8
- точка входа в туннель — физическая машина TKMCOMP , интерфейс localhost
- точка выхода из туннеля — виртуальная машина ssh-server , интерфейс localhost
- пункт назначения tcp-пакетов — виртуальная машина web-server
Теперь у нас есть туннель от 192.168.110.2 до 192.168.110.8: пакеты от физической машины попадают в туннель и будут получены виртуальной машиной ssh-server . А поскольку пункт назначения 192.168.110.12 — пакеты будут направлены дальше в сеть, к виртуальной машине web-server .
На физической машине открываем в браузере страницу http://127.0.0.1:8080 — и видим дефолтную страницу Apache:
Проброс удаленного соединения на локальную машину
Открываем на физической машине PowerShell и выполняем команду:
> ssh -p 2222 -R 127.0.0.1:8080:127.0.0.1:80 evgeniy@192.168.110.8
- точка входа в туннель — виртуальная машина ssh-server , интерфейс localhost
- точка выхода из туннеля — физическая машина TKMCOMP , интерфейс localhost
- пункт назначения tcp-пакетов — физическая машина TKMCOMP (пакеты предназначены ей)
Теперь у нас есть туннель от 192.168.110.8 до 192.168.110.2: пакеты от виртуальной машины ssh-server попадут в туннель и будут получены физической машиной. Откроем на виртуальной машине ssh-server браузер и наберем в адресной строке http://192.168.110.8:8080 или http://127.0.01:8080 . Мы видим вывод функции phpinfo() от web-сервера физической машины:
Однако, если мы откроем браузер на виртуальной машине web-server и наберем в адресной строке http://192.168.110.8:8080 — то ничего не увидим:
Пакеты от виртуальной машины web-server придут на сетевой интерфейс enp0s3 ( 192.168.110.8 ) виртуальной машины ssh-server . А перенаправляются в туннель только те пакеты, которые пришли на интерфейс обратной петли loopback ( 127.0.0.1 ). Чтобы это исправить, нужно изменить настройки ssh-сервера — отредактировать файл конфигурации /etc/ssh/sshd_config :
$ sudo systemctl restart ssh
Но это очень радикальный путь, лучше использовать опцию -g в команде создания туннеля. Она действует аналогично GatewayPorts , но уменьшает риск забыть об этой настройке ssh-сервера, когда в ней уже не будет необходимости.
Обновляем страницу http://192.168.110.8:8080 на виртуальной машине web-server :
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
- 1С:Предприятие (31)
- API (29)
- Bash (43)
- CLI (99)
- CMS (139)
- CSS (50)
- Frontend (75)
- HTML (66)
- JavaScript (150)
- Laravel (72)
- Linux (143)
- MySQL (76)
- PHP (125)
- React.js (66)
- SSH (27)
- Ubuntu (66)
- Web-разработка (509)
- WordPress (73)
- Yii2 (69)
- БазаДанных (95)
- Битрикс (66)
- Блог (29)
- Верстка (43)
- ИнтернетМагаз… (84)
- КаталогТоваров (87)
- Класс (30)
- Клиент (27)
- Ключ (28)
- Команда (68)
- Компонент (60)
- Конфигурация (59)
- Корзина (32)
- ЛокальнаяСеть (28)
- Модуль (34)
- Навигация (31)
- Настройка (137)
- ПанельУправле… (29)
- Плагин (33)
- Пользователь (26)
- Практика (99)
- Сервер (74)
- Событие (27)
- Теория (104)
- Установка (65)
- Файл (47)
- Форма (58)
- Фреймворк (192)
- Функция (36)
- ШаблонСайта (68)
Configuring SSH Tunnels in Oracle Linux
This tutorial provides step by step procedures to configure SSH tunnels for network traffic. SSH tunnels or SSH forwarding encapsulates specific TCP traffic and enables it to traverse the network through an SSH connection. This tutorial is targeted at users of Oracle Linux 8 or later.
Objectives
This tutorial teaches you how to configure the following types of SSH tunneling:
What Do You Need?
- A remote SSH system with the some configured services, such as web services, VNC services, Cockpit, etc to be used by remote clients.
- A client system with appropriate software installed, such as a desktop viewer to use VNC services.
Configuring SSH Tunneling
Note: When using the free lab environment, see Oracle Linux Lab Basics for connection and other usage instructions.
Configuring SSH dynamic port forwarding
Dynamic port forwarding enables communications across a range of ports by making SSH act as a SOCKS proxy server.
Note: Unless instructed otherwise, you must run all the commands in this section from your SSH client desktop.
- If you are currently connected to ol8-server in a terminal window, type exit to disconnect from the instance. Alternatively, open a new tab for a separate terminal window.
- Open an ssh connection to ol8-server while using the -D option and specifying a port number to use locally. The -D option indicates that the connection uses dynamic port forwarding.
- -N prevents the execution of remote commands.
- -f indicates that the connection is forked into the background.
- sleep specifies a waiting period in seconds that the tunnel waits for a connection before the tunnel closes.
curl -w '\n' --socks5 localhost:8080 ifconfig.me
By using the dynamic port forwarding service, you can redirect or forward TCP traffic from one system to another over a secure connection. This service functions as a rudimentary VPN. Thus, you can configure a local web browser to use the SOCKS proxy for forwarded browsing. Or, as an alternative, you can configure SOCKS proxy settings by defining a variable as follows, and then retest with the curl command.
export _proxy="socks5://localhost:8080" curl -w '\n' ifconfig.me
Other mechanisms can be used to force all TCP traffic through your SSH connection. However, these are beyond the scope of this tutorial. In addition, alternative methods might be preferable than using SSH tunnels for this purpose.
Configuring SSH local port forwarding
Local port forwarding over SSH maps a local port on the client system to a remote port on the server system. This configuration enables you to access services on the remote system that are otherwise inaccessible because the services might be running behind a firewall or might not be listening on a public network interface.
Cockpit is a good example of such a service. Typically, if you want to run the Cockpit web console for a system that is connected to the Internet, the service would be exposed on a public facing network, which is not advisable.
For this demonstration, the ol8-server is configured for security as follows:
- The instance is preconfigured to run the Cockpit service.
- The instance is running a firewall service.
- The Cockpit port is not open.
Note: Unless instructed otherwise, all the commands must be typed from your SSH client desktop.
- If you are currently connected to the ol8-server in a terminal window, type exit to disconnect from the instance. Alternatively, open a new tab for a separate terminal window.
- Verify the inaccessibility of the Cockpit service. On a browser, open the Cockpit web console to ol8-server through its IP address. Note that the connection does not succeed. http://:9090/ The connection does not succeed.
- On the terminal window, open an SSH connection to ol8-server by using local port forwarding. The -L option maps a port on the local host to a port on the server.
ssh -L 9090:localhost:9090 oracle@
- -N prevents the execution of remote commands.
- -f indicates that the connection is forked into the background.
- sleep specifies a waiting period in seconds that the tunnel waits for a connection before the tunnel closes.
By using the Cockpit web console, you can remotely manage the instance even though the service itself is not exposed on any public facing network.
Video Demonstration
The video tutorial Using SSH Tunnels With Oracle Linux 8 gives more examples for configuring different types of SSH tunnels. Note that while the lab exercises demonstrated SSH tunneling by using the Cockpit service, this video uses VNC and web services for its examples. All of them together show how, through SSH port forwarding, you can access and avail of a remote system’s services.
More Learning Resources
Explore other labs on docs.oracle.com/learn or access more free learning content on the Oracle Learning YouTube channel. Additionally, visit education.oracle.com/learning-explorer to become an Oracle Learning Explorer.
For product documentation, visit Oracle Help Center.
Configuring SSH Tunnels in Oracle Linux
Copyright © 2021, Oracle and/or its affiliates.