- Туннель через ssh linux
- Шифрование HTTP-трафика
- Перенаправление сеансов X и VNC
- Обратные SSH-туннели
- Заключение
- Создание SSH-туннеля. Часть 1 из 4
- Проброс локального соединения на удаленную машину
- Проброс удаленного соединения на локальную машину
- Примеры проброса соединения
- Проброс локального соединения на удаленную машину
- Проброс удаленного соединения на локальную машину
Туннель через ssh linux
Библиотека сайта rus-linux.net
-N — не выполнять команд на удаленной машине
-p 22 — подключаться на внешний порт 22. Я обычно использую другой внешний порт, чтобы избавиться от атак «кулхацкеров» на мой SSH-сервер
bob@mylinuxserver.xxx — имя_пользователя@имя_сервера (или IP-адрес)
-L 2110:localhost:110 — информация о привязке портов. Означает следующее: порт_клиента:имя_сервера:порт_сервера. В данном примере мы перенаправляем 110 порт сервера на 2110 порт вашей машины
Хотите еще немного примеров?
Проброс POP3 и SMTP через SSH:
ssh -N -p 2022 bob@mylinuxserver.xxx -L 2110:localhost:110 -L 2025:localhost:25
Проброс Google Talk через SSH (ключ -g позволяет удаленным машинам подключаться к проброшенным локальным портам):
ssh -g -p 2022 -N bob@mylinuxserver.xxx 5223:talk.google.com:5223
Практически все, что передается в виде простого текста, можно обезопасить с помощью SSH-туннелей
Шифрование HTTP-трафика
Еще одна вещь, понятная без лишних слов. Но если в вашей компании действует какая-либо политика относительно ИТ, проверьте, не нарушаете ли вы ее. Я пускаю HTTP-трафик через SSH в тех случаях, когда не доверяю точке доступа. Под Android я использую приложение SSHTunnel, а на ноутбуке — такую команду:
ssh -D 5222 bob@mylinuxserver.xxx -N
После подключения настройте свой браузер или другую программу, способную использовать прокси на адрес localhost:5222. Таким образом будет создан динамический проброс порта и весь трафик пойдет через SSH-сервер, одновременно шифруясь и обходя фильтрование по содержимому
Перенаправление сеансов X и VNC
Припоминаете, что вы добавили » X11Forwarding yes » в sshd_config? Это-то и позволяет пробрасывать сеансы X.
ssh -X -p 2022 bob@mylinuxserver.xxx
Вы угадали, -X пробрасывает X. Но учтите, что это работает только на клиентских машинах с Linux. Если вы вдруг оказались вынуждены работать в Microsoft Windows, а вам нужен SSH-туннель, просто установите пакет Cygwin/X ( http://x.cygwin.com/ ). Я лично не пробовал с ним работать, но, насколько я понимаю, он предоставляет возможность запускать удаленные X-приложения, находясь в Windows.
При пробросе сеансов VNC будьте внимательны. Если на клиенте, с котрого вы подключаете туннель, работает VNC-сервер, скажем, на порту 5900, удостоверьтесь, что вы не указали этот порт в качестве перенаправляемого, иначе вы подключитесь к самому себе. Вообще же VNC пробрасывается точно так же, как и любой другой сервис:
ssh -p 2022 bob@mylinuxserver.xxx -L 5900:localhost:5900
В данном примере вы подключаетесь по SSH на внешний порт 2022 сервера mylinuxserver.com от имени пользователя bob. Локальный порт 5900 пробрасывается на порт 5900 на сервере. После установления соединения вы можете открыть свой VNC-клиент и направить его на localhost:0 для подключения к удаленной машине. Если вы пробросили порт 5901, указывайте «localhost:1» и так далее.
Обратные SSH-туннели
Ну, вот и настало время для моей любимой разновидности SSH-туннелей. Разумеется, получать доступ к какому-либо сервису через SSH — это здорово, «гонять» веб-трафик по зашифрованным SSH-туннелям — тоже, но самое приятное удивление можно испытать от обратных туннелей. Как я уже говорил ранее, ими приходится пользоваться в ситуации, когда имеется машина без SSH-сервера, а вы испытываете необходимость получить к ней доступ в дальнейшем (через несколько минут, часов или дней), но при этом не хотите или не можете воспользоваться VPN. Вам следует соединиться с SSH-сервером с этой машины, а затем установить обратный SSH-туннель, подключившись к этому соединению. Для чего я это применяю? Время от времени — для того, чтобы поработать с удаленным сервером или просто для того, чтобы помочь друзьям и родственникам по VNC через SSH. В последнем случае они запускают Putty с сохраненными настройками сеанса и подключаются к моему SSH-серверу от имени пользователя, не имеющего никаких прав. После создания туннеля я могу зайти по VNC на их машины. И все, им не нужно настраивать файервол или разбираться с LogMeIn или другими подобными сайтами.
Итак, для создания обратного SSH-туннеля необходимо выполнить следущие действия:
ssh -R remoteport:localhost:22 username@servername
И вот вам обратный туннель! Вуаля!
Для любителей наглядности пользователи daddoo и nerdboy4200 с канала #linuxjournal подготовили схему последовательностей сообщений с помощью пакета mscgen ( http://www.mcternan.me.uk/mscgen/ ). Да, это пакет с открытым исходным кодом и он обладает потрясающими возможностями. Я попробовал свои силы и создал схему для этой заметки, но то, что за короткое время сделали daddoo и nerdboy, заставило меня устыдиться [своей неумелости — прим. пер.].
Заключение
Ну, вот вы и получили начальные знания в области SSH-туннелей. Не забывайте, что это лишь азы, на самом же деле область применения этих туннелей ограничена лишь вашим воображением. Позднее я опишу настройку файла ssh_config на стороне клиента для сохранения индивидуальных параметров соединений. Но об этом — в следующий раз.
Создание 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)