Обратный ssh туннель windows

Вы можете использовать встроенный OpenSSH сервер в Windows для проброса портов через SSH-туннель (SSH туннелирования). Перенаправление портов в SSH позволяет туннелировать (пробрасывать) порты приложений с локального компьютера на удаленный сервер и наоборот. Проброс портов через SSH туннель широко используется в среде Linux/Unix, а теперь вы можете воспользоваться этим возможностями и в Windows. В этом примере мы покажем, как пробросить RDP подключение через OpenSSH на хосте Windows Server.

Содержание:

  • Для чего нужны SSH-туннели?
  • Защищенный доступ к RDP через SSH туннель (local TCP forwarding)
  • SSH туннель в Windows с помощью Putty
  • Переброс удаленного порта на локальную машину (Remote TCP forwarding)

Для чего нужны SSH-туннели?

SSH-туннель обеспечивает защищенное шифрованный TCP соединение локальных хостом и удалённым сервером SSH. SSH Port Forwarding позволяет туннелировать поверх SSH подключение к локальному порту на локальном компьютере к любому TCP порту на удаленном сервере (или наоборот)

Порт форвардинг в SSH-туннелях применяются для:

  • Обхода межсетевых экранов;
  • Открытия бэкдоров в частные сети;
  • Организации простых VPN/прокси сценариев для безопасного удаленного подключения;
  • Защиты трафика устаревших приложений (протоколов), которые передают данные в открытом тексте (без шифрования).

Вы можете перенаправить в SSH туннель только TCP трафик/порт (UDP и ICMP протоколы не поддерживаются).

Проброс портов через SSH туннель можно использовать в сценариях, когда нужно подключиться к удаленному компьютеру, который защищен межсетевым экраном. Например, у вас имеется сервер c Windows, на котором наружу открыт только SSH порт (TCP 22). Все остальные порты блокируются аппаратным межсетевым экраном или Windows Defender Firewall Windows. Ваша задача подключиться к рабочему столу этого Windows сервера с помощью клиента RDP. Казалось бы, невозможная задача, т.к. порт RDP 3389 блокируется брандмауэром. Однако вы можете получить доступ к любому открытому порты на удаленном хосте через SSH-тунель.

Чаще всего используются следующие сценарии проброса через SSH:

  • Local TCP forwarding — проброс локального порта на удаленный сервер;
  • Remote TCP forwarding — проброс удаленного порта на локальный компьютер;
  • Двойной SSH туннель – позволяет соединить между собой через SSH сервер компьютеры без выделенных белых IP адресов или находящиеся за NAT (если не подходит решение с OpenVPN)

Защищенный доступ к RDP через SSH туннель (local TCP forwarding)

В этом режиме вы создаете на своем компьютере локальный TCP порт, подключения к которому перенаправляются через SSH туннель на указанный порт удаленного сервера. В этом примере мы создадим локальный порт 8888, при подключении к которому выполняется перенаправление на RDP порт 3389 на удаленном компьютере. Общая схема подключения выглядит так:

Windows OpenSSH - тунерирование RDP через SSH в Windows 10 / Windows Server 2018

Для проброса портов нам потребуется SSH клиент. Можно использовать сторонний клиент (например, Putty), но я буду использовать встроенный SSH клиент в Windows. Чтобы установить клиенте OpenSSH, выполните в консоли PowerShell команду:

Get-WindowsCapability -Online | ? Name -like 'OpenSSH.Client*'

Чтобы создать SSH туннель с удаленным компьютером 192.168.1.90, выполните команду:

ssh -L 8888:192.168.1.90:3389 [email protected]

В этом примере используется формат
LOCAL_PORT:DESTINATION:DESTINATION_PORT
и
USER@DEST_SERVER_IP
(имя пользователя и адрес удаленного SSH сервера)

Чтобы SSH туннель работал в фоновом режиме, нужно добавит параметр f.

ssh - локальное перенаправление портов в windows

Теперь, чтобы подключится к удаленному компьютеру по RDP через SSH туннель, вам запустить RDP-клиент (mstsc.exe) и подключиться на локальный порт 8888 своего компьютера:

127.0.0.1:8888

rdp на локальный порт

Выполните аутентификацию на удаленном компьютере и можете спокойно работать в RDP-сессии. С помощью команды Get-NetTCPConnection или утилиты TCPView вы можете убедиться, что RDP подключение установлено локально (RDP подключение инициировано запущенным локально SSH сервером):

Get-NetTCPConnection -State Established|where {$_.localport -eq "3389"}|fl

проброс rdp порт 3389 через ssh туннель

При этом порт TCP/3389 на сервере не доступен с удаленного компьютера. Вы можете проверить доступность порта с помощью командлета Test-NetConnection:

Test-NetConnection 192.168.1.90 -port 3389

TcpTestSucceeded       : False

Test-NetConnection проверить доступность порта

Обратите внимание, что если вы перенаправляете таким образом незашифрованный трафик приложения, то по сети он передается в зашифрованном виде. Трафик шифруется на одном конце SSH соединения и расшифровывается на другом.

Другие компьютеры в вашей локальной сети смогут одновременно подключиться к удаленному RDP серверу Windows, даже если у них полностью заблокирован прямой доступ к удаленному серверу (как по SSH, так и по RDP). Для этого, они должны подключиться RDP клиентом к порту 8888 на компьютере, на котором создан SSH туннель:

mstsc.exe /v 10.10.1.220:8888

ssh порт форвардин для RDP в Windows в локальной сети

Защита RDP подключения с помощью SSH туннеля может быть хорошей альтернативой VPN для доступа к публичным Windows хостам в Интернете. В этом случае вам не нужно открывать прямой доступ к порту RDP/3389 из Интернета к хосту Windows. Достаточно открыть только порт SSH/22, что защитит вас от атак подбора пароля по RDP и эксплуатации 0-day RDP уязвимостей.

Для автоматического ввода пароля для подключения к SSH можно использовать утилиту sshpass. Ее можно запустить через подсистему WSL2 для Windows.

Установите sshpass в Ubuntu WSL:

$ sudo apt-get -y install ssphass

Запустите клиент Remote Desktop Connection (mstsc.exe) и сохраните в Windows RDP файл с настройками подключения:

Computer : localhost:8888
User name : remoteusername

Для автоматического подключения к удаленном RDP хосту с сохранённым паролем SSH, используйте такой bat файл:

start /min wsl sshpass -p "password" ssh -L 8888:192.168.31.90:3389 [email protected]
powershell sleep 5
start mstsc C:\rdp\localhost-33389.rdp

Или (предпочтительно) настройте SSH аутентификацию по ключам.

SSH туннель в Windows с помощью Putty

Рассмотрим, как настроить SSH туннель в Windows с помощью популярного SSH клиента Putty.

  1. Запустите PuTTY и перейдите в раздел Connection -> SSH -> Tunnels;
  2. В поле Source port укажите локального порта (в нашем примере это 8888);
  3. Укажите IP адрес сервера SSH и порт на удаленном хосте, на который нужно выполнить переадресацию:
    192.168.31.90:3389
  4. Выберите Local в качестве Destination и нажмите Add;
    добавить ssh тунель в putty

  5. Чтобы не открывать shell удаленного хоста при подключении через туннель, включите опцию Don’t start a shell or command at all в разделе SSH;
    putty не запускать shell при старте ssh тунеля

  6. Вернитесь на вкладку Session, укажите имя или IP адрес удаленного SSH хоста и порт подключения (по умолчанию порт 22). Чтобы сохранить настройки подключения, укажите имя сессии в поле Saved Session и нажмите Save;
    сохранить сессию в putty

  7. Теперь вы можете запустить сохраненный SSH туннель в Putty прямо и панели задач Windows.

Переброс удаленного порта на локальную машину (Remote TCP forwarding)

Есть еще один вариант применения SSH туннеля – remote TCP forwarding. Через SSH туннель вы можете открыть доступ удаленному серверу к локальному порту на вашем компьютере или порту на другом компьютере в вашей локальной сети. Например, вы хотите, чтобы внешний сервер (192.168.1.90) получил доступ к вашему Интранет сайту (не опубликованному в Интернете). Для создания обратного туннеля, используйте такую команду:

ssh -R 8080:internalwebsever:80 [email protected]

Теперь, чтобы на удаленном SSH сервер получить доступ к веб серверу internalwebsever достаточно в браузере набрать адрес
http://localhost:8080
.

С помощью SSH туннелей вы можете строить целые цепочки для форвардинга портов. Включить или отключить SSH туннелирование можно в конфигурационном файле OpenSSH (sshd_config) с помощью директив:

AllowStreamLocalForwarding yes
AllowTcpForwarding remote
PermitTunnel no

Данные опции неприменимы для текущей версии OpenSSH в Windows.

SSH reverse tunneling is a powerful tool that enables secure remote access to systems or services that are behind firewalls or NATs (Network Address Translation). It is often used to provide external access to local systems and services without modifying the network’s security settings. In this detailed guide, we will break down SSH reverse tunneling, explain its applications, highlight security practices, and discuss alternatives. We will then discuss how Pinggy uses SSH reverse tunneling to share applications and services from localhost.

SSH Reverse Tunnelling

What is SSH Reverse Tunneling?

SSH (Secure Shell) reverse tunneling allows an external machine to connect to a local machine, even if that local machine is behind a firewall or doesn’t have a public-facing IP address. Unlike typical SSH port forwarding, where traffic to a port in the local system is forwarded outward to a remote system, reverse tunneling sends traffic from the remote system back to your local machine.

This technique is especially useful for:

  • Forwarding traffic from a remote system to a local system which is behind a NAT
  • Bypassing firewall restrictions
  • Accessing services on a local machine from a remote location
  • Enabling remote debugging or testing of applications
  • Managing IoT devices, servers, or databases from anywhere

How SSH Reverse Tunneling Works?

The basic principle of reverse SSH tunneling is to create a connection from a remote machine (which could be a server in the cloud) to your local machine using SSH, forwarding a port from the remote system back to a service running on your local system.

  • Command Syntax:

    ssh -R [remote-port]:[hostname]:[port] [user]@[remote-host]
    
    • -R: Defines the reverse tunnel
    • [remote-port]: The port on the remote machine that forwards traffic
    • [hostname]:[port]: The host and port where the local machine will forward the traffic to. Here hostname can simply be localhost to forward the traffic to a service running in this local system itself.
    • [user]@[remote-host]: Remote SSH server credentials

For example:

ssh -R 8080:localhost:3000 user@remote-server.com

In this example, any traffic to remote-server.com:8080 will be forwarded to port 3000 on your local machine, allowing a user to connect to the remote server to access your locally hosted service.

How to Set Up SSH Reverse Tunneling

Setting up SSH reverse tunneling allows you to securely forward traffic from a remote server back to your local machine. The steps may vary depending on your operating system. Here’s a guide for Linux, macOS, and Windows.


For Linux

Step 1: Ensure SSH is Installed

Most Linux distributions come with SSH pre-installed. If it’s not installed, you can add it using the following commands:

For Ubuntu/Debian:

sudo apt update
sudo apt install openssh-client

Step 2: Set Up SSH on the Remote Server

Ensure that SSH is installed and configured to allow reverse tunneling on the remote server. You’ll need to edit the SSH configuration file to allow this feature:

  1. Open the SSH configuration file on the remote server:

    sudo nano /etc/ssh/sshd_config
    
  2. Find the line that says GatewayPorts and set it to yes:

  3. Restart the SSH service to apply changes:

    sudo systemctl restart sshd
    

Step 3: Run the SSH Reverse Tunnel Command:

To create a reverse tunnel, use the following command:

ssh -R [remote-port]:localhost:[local-port] [user]@[remote-host]
  • [remote-port]: The port on the remote server you want to forward.
  • [local-port]: The port on your local machine that receives the forwarded traffic.
  • [user]@[remote-host]: Your SSH credentials.

Example:

ssh -R 8080:localhost:3000 user@remote-server.com

This will forward traffic from 8080 on the remote server to port 3000 on your local machine.


For macOS

Step 1: Ensure SSH is Installed

macOS typically comes with SSH pre-installed. However, if it’s missing, you can install it using Homebrew:

Step 2: Set Up SSH on the Remote Server

Follow the same steps as in the Linux section to configure SSH on the remote server:

  1. Edit /etc/ssh/sshd_config to allow reverse tunneling:
sudo nano /etc/ssh/sshd_config
  1. Set GatewayPorts to yes and restart the SSH service:
sudo systemctl restart sshd

Step 3: Run the SSH Reverse Tunnel Command

The same SSH reverse tunneling command applies to macOS:

ssh -R [remote-port]:localhost:[local-port] [user]@[remote-host]

For example, if you want to forward port 8080 on the remote server to port 3000 on your local machine:

ssh -R 8080:localhost:3000 user@remote-server.com

For Windows

You can set up SSH reverse tunneling on Windows using either OpenSSH (included in Windows 10 and later) or PuTTY.

Option 1: Using OpenSSH (Windows 10 and Later)

Step 1: Install OpenSSH (if not already installed)

To check if OpenSSH is installed, open PowerShell and run:

If OpenSSH is missing, install it from Settings > Apps > Optional Features > Add a Feature, then search for OpenSSH Client.

Step 2: Set Up SSH on the Remote Server

Configure SSH on the remote server by editing the /etc/ssh/sshd_config file as shown in the Linux section, enabling GatewayPorts.

Step 3: Run the SSH Reverse Tunnel Command

Once OpenSSH is ready, you can use the same SSH command as on Linux and macOS:

ssh -R [remote-port]:localhost:[local-port] [user]@[remote-host]

Example:

ssh -R 8080:localhost:3000 user@remote-server.com

Option 2: Using PuTTY

If you prefer a graphical interface, use PuTTY for setting up the reverse tunnel.

Step 1: Download and Install PuTTY

You can download PuTTY from the official site:

PuTTY Download.

Step 2: Configure Reverse Tunneling in PuTTY

  1. Open PuTTY and enter the remote server’s IP in the Host Name field.
  2. Navigate to Connection > SSH > Tunnels.
  3. Under Source Port, enter the remote port you want to forward (e.g., 8080).
  4. Under Destination, enter localhost:[local-port] (e.g., localhost:3000).
  5. Select Remote.
  6. Click Add, then Open to establish the connection.

Step 4: Access the Tunnel (All Platforms)

Once the reverse tunnel is set up, any traffic directed to the remote server (e.g., remote-server.com:8080) will be forwarded to your local machine’s port (e.g., localhost:3000).


Optional Step: Persistent Tunnels

If you want the reverse tunnel to persist across SSH session drops or server reboots, use tools like autossh or add the reverse tunnel command to a startup script.

Common Use Cases for SSH Reverse Tunneling

1. Remote IoT Device Control

Imagine you have a Raspberry Pi running at home that controls various IoT devices (e.g., sensors, cameras).

Managing-IOT devices-using-ssh reverse-tunnelling

SSH reverse tunneling enables you to control and access the Raspberry Pi securely from your office or anywhere else:

  • Setup: SSH into a remote server with a reverse tunnel command:
ssh -R 9000:localhost:22 user@remote-server.com

Here, port 9000 on the remote server forwards to port 22 (SSH) on the Raspberry Pi, allowing you to SSH into your Pi through the server:
ssh -p 9000 user@remote-server.com

2. Remote Database Access

Accessing databases like MySQL that are behind a firewall can be challenging. SSH reverse tunneling allows developers to securely connect to the database from an external location without exposing the database to the public internet.

  • Example: To access a MySQL database running on localhost:3306 of a local server, you could run:
ssh -R 3307:localhost:3306 user@remote-server.com

Now, the MySQL service can be accessed remotely at remote-server.com:3307 as though it were running locally.

3. Game Hosting and Network Restrictions

Some online multiplayer games may require open ports to host sessions, which can be blocked by NAT or firewall rules. SSH reverse tunneling provides an alternative by forwarding traffic from an external server to your local machine:

  • Setup: If a game server runs on localhost:25565, use reverse tunneling to allow friends to connect:
ssh -R 4000:localhost:25565 user@remote-server.com

Now others can join your game via remote-server.com:4000.

4. Troubleshooting and Common Issues

  • Connection Failures: If your SSH connection fails, ensure that the remote server allows reverse tunneling (check sshd_config for the setting GatewayPorts).
  • Authentication Issues: SSH key issues are common. Ensure that your SSH key is added to the agent using ssh-add and use the -i flag to specify the key if necessary.
  • Port Conflicts: If the remote server’s port is already in use, specify a different port or check which process is occupying the port using lsof -i.

Security Best Practices for SSH Reverse Tunneling

While SSH reverse tunneling is secure, it’s important to follow best practices to prevent unauthorized access:

  1. Use SSH keys: Disable password-based authentication on your SSH server and only allow access through public/private key pairs for better security.
    PasswordAuthentication no
    in the sshd_config file.

  2. Passphrase-Protected Keys: Always protect your private keys with a passphrase to avoid them being compromised in the case of theft.

  3. Restrict Access: Limit which users and IP addresses can access the reverse tunnel by using firewall rules or specifying allowed users in sshd_config:
    AllowUsers user@ip-address

  4. Monitoring: Regularly audit SSH connections and logs to ensure that only authorized users are accessing the tunnel.

Alternatives to SSH Reverse Tunneling

While SSH reverse tunneling is a powerful tool, there are alternatives that might be more suitable in some situations:

  • VPN (Virtual Private Network): A VPN creates a secure tunnel for all network traffic between your machine and a remote network. This can be more scalable and easier to manage if you need access to multiple services or machines on a remote network.

  • Tunneling tools: Tools such Pinggy,

    Tailscale, etc., are specialized for sharing services such as web applications, games, etc., allowing you to expose local servers to the internet with a public URL.

Each method has its trade-offs depending on your needs, but SSH reverse tunneling excels in providing secure, flexible access to individual services.

How Pinggy Uses SSH Reverse Tunneling

Now that we’ve explored SSH reverse tunneling in detail, let’s look at Pinggy, a service that leverages reverse tunneling to make it easier for developers and users to expose their local services to the internet.

Pinggy provides a simple interface to create secure SSH reverse tunnels without the need for maintaining your own public-facing SSH server. It generates a public URL that routes traffic to your local machine, making it ideal for tasks like webhook testing, remote collaboration, and exposing IoT devices.

Here’s how you can set up an SSH reverse tunnel with Pinggy:

Basic Tunnel Setup: You can use the following command to create a reverse tunnel with Pinggy:

ssh -p 443 -R0:localhost:3000 a.pinggy.io
  1. This command does several parts:
  • It connects to Pinggy’s public server on port 443 (commonly open in firewalls).
  • The -R0:localhost:3000 option creates a reverse tunnel that forwards traffic from the generated public URL to localhost:3000 on your machine, where your local service is running.
  1. Public URL Generation: After running the command, Pinggy provides a public URL (e.g., https://yourapp.a.pinggy.link). You can share this URL with others, and any requests to this URL will be forwarded to your local machine’s service.

Proxy and Firewall Compatibility: If your network blocks traditional SSH traffic, Pinggy offers an

App that can create a tunnel over SSL. Additional tools like ncat and openssl to tunnel traffic through HTTPS or SSL, ensuring the tunnel remains operational even in restrictive environments. For example:

ssh -p443 -R0:localhost:4000 -o ProxyCommand="ncat --proxy-type http --proxy 192.168.2.2:3128 %h %p" a.pinggy.io

Advantages of Pinggy for SSH Reverse Tunneling

  • Pinggy removes the complexity of managing SSH servers and firewalls. With a single command, developers can expose their local applications and obtain a public URL for sharing.

  • Pinggy offers security features such as IP whitelisting, HTTP basic authentication, etc., to protect the tunnel from unauthorized access.

  • Pinggy’s tunneling over HTTPS and SSL ensures that even in restrictive environments, your local services can be accessed remotely.

  • Pinggy is perfect for testing webhooks or exposing IoT devices, allowing external services or collaborators to interact with your local machine without additional network setup.

Conclusion

SSH reverse tunneling is a highly flexible and secure way to expose local services to the internet, especially in environments with restrictive firewalls or NATs. It’s an essential tool for developers, system administrators, and anyone needing remote access to local systems.

Pinggy builds on the power of SSH reverse tunneling, providing a user-friendly platform that simplifies tunnel setup and management. Whether you’re building and testing APIs, debugging mobile apps in real-time, or managing remote environments, Pinggy simplifies connectivity while prioritizing secure access.

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

Любые важные данные следует передавать по защищенным каналам информации. Но это не всегда легко реализовать, особенно когда пользователю нужно совершить срочные операции на удаленном сервере, а подключиться к интернету можно только через публичный незащищенный Wi-Fi. В таком случае используют SSH-туннелирование, устанавливающее защищенный канал связи между локальным рабочим узлом и удаленным сервером. С помощью него можно не только передавать или редактировать файлы дистанционно, но и запускать GUI-приложения, делать бэкап, передавать пароли и даже организовывать потоковое вещание.

Как устроены SSH-туннели

Создание, условия применения и польза для сисадминов

Ситуация, когда требуется срочный доступ к домашнему компьютеру или внутренней корпоративной сети, знакома каждому. К сожалению, качество и безопасность общественных сетей часто оставляют желать лучшего. Важную информацию по таким сетям лучше не передавать. Кроме того, для организации доступа часто требуется внешнее ПО (Team Viewer и другие). Для системного администрирования существует способ использования публичных сетей и при этом создания безопасного подключения к необходимым узлам без использования того же VPN. Речь о SSH-туннелировании.

SSH (от англ. Secure Shell — «безопасная оболочка») — сетевой протокол, который используется для удаленного управления ОС и проксировании TCP-соединений. Выполняет шифрование всего трафика (сюда же относятся пароли и другие важные для корпоративной безопасности данные). SSH-серверы работают с большинством сетевых операционных систем, представленных на рынке.

Подключиться по этому протоколу можно практически к любому серверу. Для организации безопасного соединения можно использовать так называемые SSH-туннели. Но с точки зрения терминологии — это не те туннели, о которых обычно идет речь, когда говорят о системном администрировании. Само наименование, SSH tunnel, сформировалось среди сисадминов для простоты обозначения технологии — SSH Port Forwarding (проброса портов). В ней реализовано сразу несколько возможностей сетевого протокола SSH, а именно — передача TCP-пакетов и трансляция IP-заголовка во время передачи информации при условии существования заранее заданного правила.

Главное отличие SSH tunnels от их аналогов с VPN — передача информации не происходит в любом направлении. Такой канал связи имеет одну точку входа и работает исключительно с TCP-пакетами. Создание SSH-туннелей скорее напоминает проброс портов поверх протокола, нежели туннелирование в чистом виде.

Как создать SSH-туннель и настроить его параметры

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

Создание ключа и установление соединения с удаленным сервером занимает несколько минут.

Создание SSH-ключа в Linux (Ubuntu)/MacOS. Пошаговая инструкция:

1. Для создания ключа требуется ввести следующую команду:

ssh-keygen -t rsa

2. После введения команды на экране управляющей консоли появится диалог:

Enter file in which to save the key (/home/user/.ssh/id_rsa):

3. Чтобы дополнительно защитить соединение, система предложит пользователю придумать и ввести специальное кодовое слово (фразу).

Enter passphrase (empty for no passphrase):

4. Разумеется, пункт № 3 можно пропустить, нажав Enter. То же самое следует сделать, отвечая на следующий вопрос.

5. Завершив создание двух типов ключей (публичного и закрытого), можно переходить к установке связи по SSH. На консоли появится сообщение:

Your identification has been saved in /home/user/.ssh/id_rsa.
Your public key has been saved in /home/user/.ssh/id_rsa.pub.
The key fingerprint is:
476:b2:a8:7f:08:b4:c0:af:81:25:7e:21:48:01:0e:98 user@localhost

The key's randomart image is:

+---[RSA 2048]----+
 |      ..o   o    |
 |      .. * * = . |
 |     .  o O o B .|
 |    . .  + = = o |
 |     oo S o = . .|
 |    .. B . = . . |
 |   .  B   o =  ..|
 |  . .o.o.. o .. .|
 |   .oooE    o.   |
 +----[SHA256]-----+

6. На следующем этапе в терминале необходимо ввести команду, которая покажет открытый ключ:

cat ~/.ssh/id_rsa.pub

7. Публичный ключ необходимо ввести в панели управления. Внимательно проверяйте корректность введения ключа.

8. Остается последний этап. Для создания SSH-туннеля к удаленному серверу достаточно выполнить одну команду:

ssh root@HOST

Параметр HOST ― публичный IP-адрес сервера.

Добавим, что введение дополнительных паролей не требуется. А при использовании сервера Selectel можно использовать свой скрипт (bash) для быстрой настройки.

Для удобства пользователей ОС Windows 10 можно создать SSH-туннель в эмуляторе под Windows (MinGW64).

Инструкция для создания SSH-туннеля в Windows 10 выглядит аналогичным образом:

1. Для генерации пары ключей используется команда:

ssh-keygen -t rsa

2. Желательно защитить приватный ключ паролем (или нажать Enter, если он не нужен):

3. Ключи сгенерированы:

4. Открытый ключ хранится в файле ~/.ssh/id_rsa.pub. Приватный ключ находится в файле id_rsa и должен храниться в секрете:

5. Чтобы посмотреть содержимое публичного ключа, используется команда:

cat ~/.ssh/id_rsa.pub

6. Этот ключ (всю строку, начинающуюся с ssh-rsa) необходимо вставить в панели управления Selectel, в поле Операционная система / SSH-ключ выбранного сервера. При установке ОС он будет скопирован в файл .ssh/authorized_keys. При смене ключа в панели управления Selectel текущий образ ОС будет пересоздан, а данные на сервере — утеряны.

7. Для подключения к серверу по SSH используется команда:

ssh root@84.38.187.48 (IP-адрес сервера будет другим).

8. При первом подключении утилита SSH сообщает о неизвестном хосте и спрашивает, уверены ли вы, что доверяете ему. Если ответ положительный (следует ответить yes), IP-адрес и открытый сертификат этого сервера будут добавлены в файл ~/.ssh/known_hosts на локальной машине:

9. Если ранее при генерации пары ключей был задан пароль, утилита SSH попросит ввести его:

10. После ввода пароля и нажатия Enter устанавливается зашифрованное соединение с сервером:

Еще один вариант, как можно использовать этот тип соединения, — создание канала связи по протоколу RDP. Этот вариант подходит, когда пользователь не может подключиться к узлу из-за отсутствия доступа к нему из сети. Зато у него есть доступ к маршрутизатору. Этого достаточно, чтобы использовать данный тип туннелирования.

Параметры канала связи устанавливает инициатор подключения. На втором конце канала связи всегда расположен целевой сервер. Так, клиентом может оказаться VPS-сервер, а точкой выхода — компьютер сисадмина. Точка входа может быть создана с любой стороны туннеля: именно через нее принимаются подключения. Обратная сторона туннеля — точка выхода — способна лишь на маршрутизацию пакетов информации с учетом установленных правил. Отдельная опция — соединение с удаленной машиной, на которой запущен модуль Docker (SSH Docker). Подробнее об этом мы расскажем в следующих публикациях.

Аналогичным образом проходит процесс установки соединения с определенным сервером. В качестве примера возьмем целевой сервер с адресом 192.168.0.105. При этом для пользователя доступен только маршрутизатор (192.168.0.1). В качестве точки входа прописывается 127.0.0.1:3389. Кроме того, задается правило трансляции, определяющее узел, принимающий данные на выходе из SSH-туннеля. В нашем случае в качестве правила указывается 192.168.0.105:3389. Проследите, чтобы указанный адрес действительно существовал, иначе вам не удастся подключиться к целевому серверу.

После того, как вы зададите исходные данные, появится TCP-сокет, который создает служба SSH. Этот локальный сокет следит за тем, когда начнутся подключения на порт 3389. Точкой назначения прописывается localhost (127.0.0.1). Отметим, что RDP-клиент не владеет информацией о настоящем назначении получателя пакета. Клиент только открывает динамический порт, чтобы отправить пакет данных, у которого задан адрес назначения (точка входа) и источника (127.0.0.1:61256).

Пакет с информацией следует от входной точки SSH tunnel на его противоположный конец. Адрес трансляции поменяется. Теперь там значится 192.168.0.105:3389. На следующем этапе SSH-сервер просто поставит свой адрес вместо адреса источника. Вся информация, которая передается внутри канала, будет отправлена поверх протокола. А RDP-клиент оперирует исключительно локальным сокетом. Важно, что вся информация внутри туннеля защищена — она шифруется. Но соединение между SSH- и RDP-серверами остается обычным. Разумеется, этот фактор стоит учитывать, если пользователь работает с небезопасными протоколами.

SSH Proxy: как организовать доступ к любой системе (обращение к проксируемому серверу)

С помощью SSH-туннеля можно воспользоваться домашней (или корпоративной) сетью, даже используя ненадежный бесплатный Wi-Fi. Для этого пользователю потребуется запустить SSH-прокси, а затем по аналогичному принципу создать туннель в целевую сеть (например, можно подключиться к домашней сети).

Важно, чтобы приложения, которые потребуются инициатору подключения для работы, поддерживали SOCKS-прокси. С помощью туннеля сетевые службы станут доступны для удаленной работы. Другой вариант: пользователь сможет выйти в интернет, используя домашнее подключение, но сидя при этом в другом конце мира и используя публичную сеть. Вся передаваемая через туннель информация будет зашифрована.

Это не единственный способ практического применения SSH-туннелирования. Один из самых популярных кейсов — SSH Proxy — открывает доступ к желаемой системе, если она доступна для удаленного сервера. При этом для туннелирования через прокси-сервер потребуется ввести всего одну команду:

localhost:~$ ssh -D 8888 user@remoteserver

localhost:~$ netstat -pan | grep 8888
 tcp        0      0 127.0.0.1:8888       0.0.0.0:*               LISTEN      23880/ssh

Команда выше показывает, что пользователь запускает SOCKS-прокси. Портом для работы назначается 8888. Кроме того, необходимо проверить, активен ли этот TCP-порт (используется режим прослушивания). Служба работает исключительно на localhost (127.0.0.1). Если немного видоизменить команду, то можно прослушивать все интерфейсы (в том числе ethernet или Wi-Fi). Это позволяет приложениям подключаться к прокси-серверу через SSH-прокси:

localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserver

Чтобы браузер работал корректно, необходимы настройки. Например, чтобы запустить Chrome с активированным SOCKS-прокси, потребуется команда:

localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"

Она создает SOCKS-прокси, а также инициирует туннелирование DNS-запросов. Утилита tcpdump проверяет, видны DNS-запросы или нет.

Кроме браузеров, многие современные приложения работают с SOCKS-прокси: достаточно изменить их параметры, чтобы активировать прокси-сервер. Отдельно применяются инструменты, которые помогают приложениям использовать эту важную функцию — к примеру, proxychains позволяет запустить через SOCKS-прокси Microsoft RDP.

Зачем нужны динамические SSH tunnels

Динамический SSH tunnel отличается от рассмотренных выше типов соединений. Он открывает локальный TCP-сокет для его использования в качестве SOCKS4/SOCKS5 прокси. Обычно его применяют, когда требуется VPN, а его развертывание невозможно. Такой тип SSH-туннеля также отвечает необходимым требованиям безопасности.

Кроме того, создание динамического туннеля удобно, когда пользователю необходимо выйти в интернет однократно:

ssh -D 1080 user@vps.example.com

SOCKS-прокси работает через порт 1080.

Помимо этого, динамический туннель не предусматривает открытие дополнительных портов во внешнюю сеть. Весь трафик будет проходить исключительно через SSH-соединение, скрывая тем самым характер интернет-деятельности пользователя.

Команды и практическое применения функций SSH-туннелей

Рассмотрим несколько практических примеров применения SSH-туннелирования.

Проброс (перенаправление) портов — Port Forwarding

Чтобы осуществить проброс портов, потребуется создание SSH tunnel. Для этого в локальной системе открывается порт, а для создания канала связи пользователь должен выбрать порт на другом конце туннеля:

localhost:~$ ssh  -L 9999:127.0.0.1:80 user@remoteserver

Команда устанавливает прослушку на порт 9999. Порт 80 используется для проброса. Для Port Forwarding также используются прокси-серверы или TCP-службы.

Автоматизация копирования публичного (открытого) ключа

Традиционно пользователю приходится копировать открытые ключи вручную. SSH-протокол существенно ускоряет этот процесс:

localhost:~$ ssh-copy-id user@remoteserver

Эта команда выполняет копирование публичного ключа по умолчанию или из директории ~/.ssh/id_rsa.pub в ~/.ssh/authorized_keys (она находится на удаленном сервере).

Обратный SSH-туннель (SSH reverse tunnel)

Очевидно, что SSH tunnel можно создать и в обратном направлении. Достаточно подключить прослушивающий порт к другому локальному порту:

localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserver

Данный туннель работает следующий образом: от порта 1999 к remoteserver, а уже после этого обращается к порту 902 на локальном клиенте.

Удаленное выполнение команд с помощью SSH

SSH-команда позволяет создать интерфейс для работы с командами на удаленном хосте. Они прописываются в качестве последнего параметра:

localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php

После скачивания лога grep можно запустить на удаленной стороне.

Копирование, функция rsync-копирования (rsync через SSH)

Чтобы создать дубликат папки на удаленном сервере, достаточно сначала сжать папку с помощью bzip2, а после извлечь поток bzip2 на другой стороне. Команда для этой операции следующая:

localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"

Для регулярных бэкапов важной информации используется rsync:

localhost:~$ rsync -az /home/testuser/data proglibserver:backup/

Функция rsync позволяет копировать отличия, сравнивая информацию в разных временных точках. Таким образом, можно восстановить важные данные в случае неудачного сеанса передачи.

GUI-приложения: удаленный запуск через SSH

SSH-туннель поддерживает функцию, позволяющую запускать GUI-приложения удаленно:

localhost:~$ ssh -X remoteserver vmware

Отметим: несмотря на то, что GUI выполняется на удаленном сервере, окно отображается на локальном рабочем столе. В примере для работы запущена консоль виртуальной машины VMware Workstation. Но для успешной реализации команды требуются пакеты X11 и YES для X11Forwarding в файле sshd_config.

Редактирование текстовых файлов

Метод редактирования файлов одной командой предусматривает создание файла в /tmp, а затем копирование в заданную директорию:

localhost:~$ vim scp://user@remoteserver//etc/hosts

Прыжки по хостам

Туннелирование предусматривает переход через несколько хостов, если пользователь сталкивается с сегментацией сети:

localhost:~$ ssh -J host1,host2,host3 user@host4.internal

Параметр -J использует переадресацию для установления сеанса с каждым следующим хостом в цепочке. При этом рабочий сеанс полностью зашифрован — от localhost и до host4.

Фильтрация трафика с помощью iptables

Утилита iptables позволяет устанавливать правила для блокировки или разрешения прохождения трафика: INPUT, FORWARD и OUTPUT. В случае если пользователь не задал никаких правил, этот межсетевой экран будет выполнять заданную по умолчанию фильтрацию. Для установления связи с целевым сервером утилита сравнит IP-адрес инициатора подключения с тем списком, что есть в правилах INPUT, а затем либо даст доступ к серверу, либо запретит его.

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

Реализация SSH tunnels в Windows

Возможности туннелирования доступны и для тех, кто использует Windows 10: под эту ОС существует ряд SSH-клиентов. Один из самых применяемых — PuTTY. Запуск сервера под Windows — более сложная задача, которая требует от пользователя специализированной квалификации.

PuTTY настраивается достаточно просто: для этого во вкладке Connection открываем SSH Tunnels, где необходимо прописать базовые настройки соединения — Source port (точка входа), Destination (назначение); радиопереключатели Local — Remote — Dynamic определяют тип будущего канала связи. Адрес целевого узла указывается в другом разделе — Session.

Открытия дополнительных портов или развертывания VPN не требуется.

Безопасны ли SSH-туннели

Как мы уже отмечали, одна из их задач — создание безопасного соединения с удаленной машиной. Однако не стоит забывать о «побочных эффектах» таких туннелей. Кроме соединения с удаленным сервером, пользователь получает консоль, которая открывается на сервере.

Если пользователь забудет о своем подключении, то может выполнить те команды, которые изначально были предназначены к выполнению на локальном узле. Чтобы избежать подобной ошибки (особенно если пользователь имеет права суперпользователя), при запуске канала связи следует указывать параметр -N:

ssh -N -L -g 3389:192.168.0.105:3389 user@rt.example.com

Кроме того, не стоит использовать при подключении к удаленной машине аккаунт суперпользователя, для этих целей подойдет учетная запись с обычными правами. И не забывайте про то, что по завершении работы требуется удалить SSH-туннель.

Время на прочтение13 мин

Количество просмотров249K

Практические примеры SSH, которые выведут на новый уровень ваши навыки удалённого системного администратора. Команды и советы помогут не только использовать SSH, но и более грамотно перемещаться по сети.

Знание нескольких трюков ssh полезно любому системному администратору, сетевому инженеру или специалисту по безопасности.

Практические примеры SSH

  1. SSH socks-прокси
  2. Туннель SSH (переадресация портов)
  3. SSH-туннель на третий хост
  4. Обратный SSH-туннель
  5. Обратный прокси SSH
  6. Установка VPN по SSH
  7. Копирование ключа SSH (ssh-copy-id)
  8. Удалённое выполнение команд (неинтерактивно)
  9. Удалённый перехват пакетов и просмотр в Wireshark
  10. Копирование локальной папки на удалённый сервер по SSH
  11. Удалённые приложения GUI с переадресацией SSH X11
  12. Удалённое копирование файлов с помощью rsync и SSH
  13. SSH через сеть Tor
  14. SSH к инстансу EC2
  15. Редактирование текстовых файлов с помощью VIM через ssh/scp
  16. Монтирование удалённого SSH как локальной папки с SSHFS
  17. Мультиплексирование SSH с помощью ControlPath
  18. Потоковое видео по SSH с помощью VLC и SFTP
  19. Двухфакторная аутентификация
  20. Прыжки по хостам с SSH и -J
  21. Блокировка попыток брутфорса SSH с помощью iptables
  22. SSH Escape для изменения переадресации портов

Сначала основы

Разбор командной строки SSH

В следующем примере используются обычные параметры, часто встречающиеся при подключении к удалённому серверу SSH.

localhost:~$ ssh -v -p 22 -C neo@remoteserver

  • -v: вывод отладочной информации особенно полезен при анализе проблем аутентификации. Можно использовать несколько раз для вывода дополнительной информации.
  • - p 22: порт для подключения к удалённому серверу SSH. 22 не обязательно указывать, потому что это значение по умолчанию, но если протокол на каком-то другом порту, то указываем его с помощью параметра -p. Порт прослушивания указывается в файле sshd_config в формате Port 2222.
  • -C: сжатие для соединения. Если у вас медленный канал или вы просматриваете много текста, это может ускорить связь.
  • neo@: строка перед символом @ обозначает имя пользователя для аутентификации на удалённом сервере. Если не указать его, то по умолчанию будет использоваться имя пользователя учётной записи, в которую вы вошли в данный момент (~$ whoami). Пользователя также можно указать параметром -l.
  • remoteserver: имя хоста, к которому подключается ssh, это может быть полное доменное имя, IP-адрес или любой хост в локальном файле hosts. Для подключения к хосту, который поддерживает и IPv4, и IPv6, можно добавить в командную строку параметр -4 или -6 для правильного резолвинга.

Все вышеперечисленные параметры являются необязательными, кроме remoteserver.

Использование файла конфигурации

Хотя многие знакомы с файлом sshd_config, есть ещё файл конфигурации клиента для команды ssh. Значение по умолчанию ~/.ssh/config, но его можно определить как параметр для опции -F.

Host *
     Port 2222

Host remoteserver
     HostName remoteserver.thematrix.io
     User neo
     Port 2112
     IdentityFile /home/test/.ssh/remoteserver.private_key

В приведённом выше примерном файле конфигурации ssh две записи хоста. Первая обозначает все хосты, для всех применяется параметр конфигурации Port 2222. Вторая говорит, что для хоста remoteserver следует использовать другое имя пользователя, порт, FQDN и IdentityFile.

Файл конфигурации может сэкономить много времени на ввод символов, позволяя автоматически применять продвинутую конфигурацию при подключении к конкретным хостам.

Копирование файлов по SSH с помощью SCP

SSH-клиент поставляется с двумя другими очень удобными инструментами для копирования файлов по зашифрованному ssh-соединению. Ниже см. пример стандартного использования команд scp и sftp. Обратите внимание, что многие параметры для ssh применяются и в этих командах.

localhost:~$ scp mypic.png neo@remoteserver:/media/data/mypic_2.png

В этом примере файл mypic.png скопирован на remoteserver в папку /media/data и переименован в mypic_2.png.

Не забывайте о разнице в параметре порта. На этом попадаются многие, кто запускает scp из командной строки. Здесь параметр порта -P, а не -p, как в ssh-клиенте! Вы забудете, но не волнуйтесь, все забывают.

Для тех, кто знаком с консольным ftp, многие из команд похожи в sftp. Вы можете сделать push, put и ls, как сердце пожелает.

sftp neo@remoteserver

Практические примеры

Во многих из этих примеров можно достичь результата разными методами. Как и во всех наших учебниках и примерах, предпочтение отдаётся практическим примерам, которые просто делают своё дело.

1. SSH socks-прокси

Функция SSH Proxy под номером 1 по уважительной причине. Она более мощная, чем многие предполагают, и даёт вам доступ к любой системе, к которой имеет доступ удалённый сервер, используя практически любое приложение. Клиент ssh может туннелировать трафик через прокси-сервер SOCKS одной простой командой. Важно понимать, что трафик к удалённым системам будет исходить от удалённого сервера, так будет указано в логах веб-сервера.

localhost:~$ ssh -D 8888 user@remoteserver

localhost:~$ netstat -pan | grep 8888
tcp        0      0 127.0.0.1:8888       0.0.0.0:*               LISTEN      23880/ssh

Здесь мы запускаем socks-прокси на TCP-порту 8888, вторая команда проверяет, что порт активен в режиме прослушивания. 127.0.0.1 указывает, что служба работает только на localhost. Мы можем применить немного другую команду для прослушивания всех интерфейсов, включая ethernet или wifi, это позволит другим приложениям (браузерам и т д.) в нашей сети подключаться к прокси-сервису через ssh socks-прокси.

localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserver

Теперь можем настроить браузер для подключения к socks-прокси. В Firefox выберите Настройки | Основные | Параметры сети. Укажите IP-адрес и порт для подключения.

Обратите внимание на опцию в нижней части формы, чтобы DNS-запросы браузера тоже шли через прокси SOCKS. Если используете прокси-сервер для шифрования веб-трафика в локальной сети, то наверняка захотите выбрать эту опцию, чтобы DNS-запросы туннелировались через SSH-соединение.

Активация socks-прокси в Chrome

Запуск Chrome с определёнными параметрами командной строки активирует socks-прокси, а также туннелирование DNS-запросов из браузера. Доверяй, но проверяй. Используйте tcpdump для проверки, что DNS-запросы больше не видны.

localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"

Использование других приложений с прокси

Имейте в виду, что многие другие приложения тоже могут использовать socks-прокси. Веб-браузер просто самое популярное из них. У некоторых приложений есть параметры конфигурации для активации прокси-сервера. Другим нужно немного помочь вспомогательной программой. Например, proxychains позволяет запустить через socks-прокси Microsoft RDP и др.

localhost:~$ proxychains rdesktop $RemoteWindowsServer

Параметры конфигурации socks-прокси задаются в файле конфигурации proxychains.

Подсказка: если используете удалённый рабочий стол из Linux на Windows? Попробуйте клиент FreeRDP. Это более современная реализация, чем rdesktop, с гораздо более плавным взаимодействием.

Вариант использования SSH через socks-прокси

Вы сидите в кафе или гостинице — и вынуждены использовать довольно ненадёжный WiFi. С ноутбука локально запускаем ssh-прокси и устанавливаем ssh-туннель в домашнюю сеть на локальный Rasberry Pi. Используя браузер или другие приложения, настроенные для socks-прокси, мы можем получить доступ к любым сетевым службам в нашей домашней сети или выйти в интернет через домашнее подключение. Всё между вашим ноутбуком и домашним сервером (через Wi-Fi и интернет до дома) зашифровано в туннеле SSH.

2. Туннель SSH (переадресация портов)

В простейшей форме SSH-туннель просто открывает порт в вашей локальной системе, который подключается к другому порту на другом конце туннеля.

localhost:~$ ssh  -L 9999:127.0.0.1:80 user@remoteserver

Разберём параметр -L. Его можно представить как локальную сторону прослушивания. Таким образом, в примере выше порт 9999 прослушивается на стороне localhost и переадресуется через порт 80 на remoteserver. Обратите внимание, что 127.0.0.1 относится к localhost на удалённом сервере!

Поднимемся на ступеньку. В следующем примере порты прослушивания связываются с другими узлами локальной сети.

localhost:~$ ssh  -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserver

В этих примерах мы подключаемся к порту на веб-сервере, но это может быть прокси-сервер или любая другая служба TCP.

3. SSH-туннель на сторонний хост

Мы можем использовать те же параметры для подключения туннеля с удалённого сервера к другой службе, запущенной на третьей системе.

localhost:~$ ssh  -L 0.0.0.0:9999:10.10.10.10:80 user@remoteserver

В данном примере мы перенаправляем туннель от remoteserver к веб-серверу, работающему на 10.10.10.10. Трафик с remoteserver к 10.10.10.10 уже не в SSH-туннеле. Веб-сервер на 10.10.10.10 будет считать remoteserver источником веб-запросов.

4. Обратный SSH-туннель

Здесь настроим прослушивающий порт на удалённом сервере, который будет подключаться обратно к локальному порту на нашем localhost (или другой системе).

localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserver

В этой SSH-сессии устанавливается соединение с порта 1999 на remoteserver к порту 902 на нашем локальном клиенте.

5. Обратный прокси SSH

В этом случае мы устанавливаем socks-прокси на нашем ssh-соединении, однако прокси слушает на удалённом конце сервера. Подключения к этому удалённому прокси теперь появляются из туннеля как трафик с нашего localhost.

localhost:~$ ssh -v -R 0.0.0.0:1999 192.168.1.100 user@remoteserver

Устранение проблем с удалёнными SSH-туннелями

Если у вас возникли проблемы с работой удалённых опций SSH, проверьте с помощью netstat, к каким ещё интерфейсам подключён порт прослушивания. Хотя мы в примерах указали 0.0.0.0, но если значение GatewayPorts в sshd_config установлено в значение no, то листенер будет привязан только к localhost (127.0.0.1).

Предупреждение безопасности

Обратите внимание, что при открытии туннелей и socks-прокси внутренние сетевые ресурсы могут быть доступны ненадёжным сетям (например, интернету!). Это может быть серьёзной угрозой безопасности, поэтому убедитесь, что вы понимаете, что представляет собой слушатель и к чему у него есть доступ.

6. Установка VPN по SSH

Общий термин среди спецов по методам атаки (пентестеры и проч.) — это «точка опоры в сети». После установления соединения в одной системе эта система становится шлюзом для дальнейшего доступа к сети. Точка опоры, которая позволяет двигаться вширь.

Для такой точки опоры мы можем использовать SSH-прокси и proxychains, однако есть некоторые ограничения. Например, не получится работать напрямую с сокетами, поэтому мы не сможем сканировать порты внутри сети через Nmap SYN.

Используя этот более продвинутый вариант VPN, подключение снижается до уровня 3. Затем мы можем просто направить трафик через туннель, используя стандартную сетевую маршрутизацию.

Метод использует ssh, iptables, tun interfaces и маршрутизацию.

Сначала нужно задать эти параметры в sshd_config. Поскольку мы вносим изменения в интерфейсы и удалённой, и клиентской системы, нам нужны права root с обеих сторон.

PermitRootLogin yes
PermitTunnel yes

Затем установим ssh-соединение, используя параметр, который запрашивает инициализацию tun-устройств.

localhost:~# ssh -v -w any root@remoteserver

Теперь у нас должно быть устройство tun при показе интерфейсов (# ip a). Следующий шаг добавит IP-адреса к туннельным интерфейсам.

Сторона клиента SSH:

localhost:~# ip addr add 10.10.10.2/32 peer 10.10.10.10 dev tun0
localhost:~# ip tun0 up

Сторона сервера SSH:

remoteserver:~# ip addr add 10.10.10.10/32 peer 10.10.10.2 dev tun0
remoteserver:~# ip tun0 up

Теперь у нас прямой маршрут к другому хосту (route -n и ping 10.10.10.10).

Можно маршрутизировать любую подсеть через хост на другой стороне.

localhost:~# route add -net 10.10.10.0 netmask 255.255.255.0 dev tun0

На удалённой стороне необходимо включить ip_forward и iptables.

remoteserver:~# echo 1 > /proc/sys/net/ipv4/ip_forward
remoteserver:~# iptables -t nat -A POSTROUTING -s 10.10.10.2 -o enp7s0 -j MASQUERADE

Бум! VPN через туннель SSH на сетевом уровне 3. Вот это уже победа.

Если возникают какие-то проблемы, используйте tcpdump и ping, чтобы установить причину. Поскольку мы играем на уровне 3, то наши пакеты icmp пойдут через этот туннель.

7. Копирование ключа SSH (ssh-copy-id)

Тут есть несколько способов, но эта команда экономит время, чтобы не копировать файлы вручную. Она просто копирует ~/.ssh/id_rsa.pub (или ключ по умолчанию) с вашей системы в ~/.ssh/authorized_keys на удалённом сервере.

localhost:~$ ssh-copy-id user@remoteserver

8. Удалённое выполнение команд (неинтерактивно)

Команду ssh можно связать с другими командам для обычного удобного интерфейса. Просто добавьте команду, которую хотите запустить на удалённом хосте, в качестве последнего параметра в кавычках.

localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php

В данном примере grep выполняется на локальной системе после того, как лог скачался по ssh-каналу. Если файл большой, удобнее запустить grep на удалённой стороне, просто заключив обе команды в двойные кавычки.

Другой пример выполняет ту же самую функцию, что и ssh-copy-id из примера 7.

localhost:~$ cat ~/.ssh/id_rsa.pub | ssh remoteserver 'cat >> .ssh/authorized_keys'

9. Удалённый перехват пакетов и просмотр в Wireshark

Я взял один из наших примеров по tcpdump. Используйте его для удалённого перехвата пакетов с выдачей результата непосредственно в GUI локального Wireshark.

:~$ ssh root@remoteserver 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k -i -

10. Копирование локальной папки на удалённый сервер по SSH

Красивый трюк, который сжимает папку с помощью bzip2 (это параметр -j в команде tar), а затем извлекает поток bzip2 на другой стороне, создавая на удалённом сервере дубликат папки.

localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"

11. Удалённые приложения GUI с переадресацией SSH X11

Если на клиенте и удалённом сервере установлены «иксы», то можно удалённо выполнить команду GUI, с окном на вашем локальном рабочем столе. Эта функция существует давным давно, но по-прежнему очень полезна. Запустите удалённый веб-браузер или даже консоль VMWawre Workstation, как я делаю в этом примере.

localhost:~$ ssh -X remoteserver vmware

Требуется строка X11Forwarding yes в файле sshd_config.

12. Удалённое копирование файлов с помощью rsync и SSH

rsync во многом удобнее scp, если требуется периодическое резервное копирование каталога, большого количества файлов или очень больших файлов. Здесь есть функция восстановления после сбоя передачи и копирования только изменённых файлов, что сохраняет трафик и время.

В этом примере используется сжатие gzip (-z) и режим архивирования (-a), который включает рекурсивное копирование.

:~$ rsync -az /home/testuser/data remoteserver:backup/

13. SSH через сеть Tor

Анонимная сеть Tor может туннелировать SSH-трафик с помощью команды torsocks. Следующая команда прокинет ssh-прокси через Tor.

localhost:~$ torsocks ssh myuntracableuser@remoteserver

Torsocks будет использовать для прокси порт 9050 на localhost. Как всегда при использовании Tor необходимо серьёзно проверять, какой трафик туннелируется и другие проблемы операционной безопасности (opsec). Куда идут ваши DNS-запросы?

14. SSH к инстансу EC2

Для подключения к инстансу EC2 необходим закрытый ключ. Скачайте его (расширение .pem) из панели управления Amazon EC2 и измените разрешения (chmod 400 my-ec2-ssh-key.pem). Храните ключ в надёжном месте или поместите его в свою папку ~/.ssh/.

localhost:~$ ssh -i ~/.ssh/my-ec2-key.pem ubuntu@my-ec2-public

Параметр -i просто указывает ssh-клиенту использовать этот ключ. Файл ~/.ssh/config идеально подходит для автоматической настройки использования ключа при подключении к хосту ec2.

Host my-ec2-public
   Hostname ec2???.compute-1.amazonaws.com
   User ubuntu
   IdentityFile ~/.ssh/my-ec2-key.pem

15. Редактирование текстовых файлов с помощью VIM через ssh/scp

Для всех любителей vim этот совет сэкономит немного времени. С помощью vim файлы редактируются по scp одной командой. Этот метод просто создаёт файл локально в /tmp, а затем копирует его обратно, как только мы его сохранили из vim.

localhost:~$ vim scp://user@remoteserver//etc/hosts

Примечание: формат немного отличается от обычного scp. После хоста у нас двойной //. Это ссылка на абсолютный путь. Один слэш будет означать путь относительно домашней папки users.

**warning** (netrw) cannot determine method (format: protocol://[user@]hostname[:port]/[path])

Если увидите такую ошибку, дважды проверьте формат команды. Обычно это означает синтаксическую ошибку.

16. Монтирование удалённого SSH как локальной папки с SSHFS

При помощи sshfs — клиента файловой системы ssh — мы можем подключить локальный каталог к удалённому местоположению со всеми взаимодействиями файлов в зашифрованном сеансе ssh.

localhost:~$ apt install sshfs

На Ubuntu и Debian установим пакет sshfs, а затем просто приимонтируем удалённое расположение к нашей системе.

localhost:~$ sshfs user@remoteserver:/media/data ~/data/

17. Мультиплексирование SSH с помощью ControlPath

По умолчанию при наличии существующего подключения к удалённому серверу с помощью ssh второе подключение с помощью ssh или scp устанавливает новый сеанс с дополнительной аутентификацией. Опция ControlPath позволяет использовать существующий сеанс для всех последующих соединений. Это значительно ускорит процесс: эффект заметен даже в локальной сети, а тем более при подключении к удалённым ресурсам.

Host remoteserver
        HostName remoteserver.example.org
        ControlMaster auto
        ControlPath ~/.ssh/control/%r@%h:%p
        ControlPersist 10m

ControlPath указывает сокет для проверки новыми соединениями на предмет наличия активной сессии ssh. Последняя опция означает, что даже после выхода из консоли существующий сеанс останется открытым 10 минут, так что в течение этого времени вы сможете повторно подключиться по существующему сокету. Для дополнительной информации смотрите справку ssh_config man.

18. Потоковое видео по SSH с помощью VLC и SFTP

Даже давние пользователи ssh и vlc (Video Lan Client) не всегда знают об этой удобной опции, когда очень нужно посмотреть видео по сети. В настройках File | Open Network Stream программы vlc можно ввести местоположение как sftp://. Если требуется пароль, появится запрос.

sftp://remoteserver//media/uploads/myvideo.mkv

19. Двухфакторная аутентификация

Такая же двухфакторная аутентификация, как у вашего банковского счёта или учётной записи Google, применима к сервису SSH.

Конечно, ssh изначально имеет функцию двухфакторной аутентификации, под которой подразумеваются пароль и ключ SSH. Преимущество аппаратного токена или приложения Google Authenticator заключается в том, что это обычно другое физическое устройство.

См. наше 8-минутное руководство по использованию Google Authenticator и SSH.

20. Прыжки по хостам с ssh и -J

Если из-за сегментации сети приходится переходить через несколько хостов ssh, чтобы добраться до конечной сети назначения, вам сэкономит время ярлык -J.

localhost:~$ ssh -J host1,host2,host3 user@host4.internal

Здесь главное понимать, что это не аналогично команде ssh host1, затем user@host1:~$ ssh host2 и т. д. Параметр -J хитро использует переадресацию, чтобы localhost устанавливал сеанс со следующим хостом в цепочке. Таким образом, в приведённом выше примере наш localhost аутентифицируется на host4. То есть используются наши ключи localhost, а сеанс от localhost до host4 полностью зашифрован.

Для такой возможности в ssh_config укажите опцию конфигурации ProxyJump. Если регулярно приходится переходить через несколько хостов, то автоматизация через конфиг сэкономит массу времени.

21. Блокировка попыток брутфорса SSH с помощью iptables

Любой, кто управлял сервисом SSH и просматривал логи, знает о количестве попыток брутфорса, которые происходят каждый час каждый день. Быстрый способ уменьшить шум в логах — перенести SSH на нестандартный порт. Внесите изменения в файл sshd_config с помощью параметра конфигурации Port##.

С помощью iptables тоже можно легко блокировать попытки подключения к порту по достижении определённого порога. Простой способ сделать это — использовать OSSEC, поскольку он не только блокирует SSH, но выполняет кучу других мер по обнаружению вторжений на базе имени хоста (HIDS).

22. SSH Escape для изменения переадресации портов

И наш последний пример ssh предназначен для изменения переадресации портов на лету в рамках существующего сеанса ssh. Представьте такой сценарий. Вы глубоко в сети; возможно, прыгнули через полдюжины хостов и вам нужен локальный порт на рабочей станции, который перенаправлен на Microsoft SMB старой системы Windows 2003 (кто-нибудь помнит ms08-67?).

Нажав enter, попробуйте ввести в консоли ~C. Это управляющая последовательность в сессии, позволяющая вносить изменения в существующее соединение.

localhost:~$ ~C
ssh> -h
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KL[bind_address:]port                 Cancel local forward
      -KR[bind_address:]port                 Cancel remote forward
      -KD[bind_address:]port                 Cancel dynamic forward
ssh> -L 1445:remote-win2k3:445
Forwarding port.

Здесь вы можете увидеть, что мы переадресовали наш локальный порт 1445 на хост Windows 2003, который нашли во внутренней сети. Теперь просто запустите msfconsole, и можно идти дальше (предполагая, что вы планируете использовать этот хост).

Завершение

Эти примеры, советы и команды ssh должны дать отправную точку; дополнительная информация о каждой из команд и возможностей доступна на справочных страницах (man ssh, man ssh_config, man sshd_config).

Меня всегда очаровывала возможность обращаться к системам и выполнять команды в любой точке мира. Развивая свои навыки по работе с инструментами вроде ssh вы станете более эффективным в любой игре, в какую играете.

Provide feedback

Saved searches

Use saved searches to filter your results more quickly

Sign up

Понравилась статья? Поделить с друзьями:
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest

0 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
  • При нагрузке на сеть на windows 10 отключается интернет
  • Для чего можно использовать windows xp
  • Иконка проводник windows 10
  • Windows консоль управление компьютером
  • Com port drivers windows 10