Какие еще есть способы создания прямого и обратного туннеля через SSH
Описанные методы решения данного вопроса — это не весь перечень средств, которые есть у программиста по умолчанию. Через все тот же Linux можно создать туннель несколькими способами. И сейчас мы разберем очень простой метод, как подключить компьютер к удаленному серверу, а также как настроить подключение другого компьютеру, подключенному в SSHD.
Итак, допустим вам нужно подключиться к интернет-сервису, размещенному по адресу 10.10.2.1:80. При этом хост работает через определенный домен, к примеру, site.ru. Все, что вам нужно сделать — это пробросить туннель через сервер к нужному IP-адресу. И делается это при помощи команду -f, -N и -L. Первая объясняет протоколу, что нужно будет уйти в background после активации соединения, вторая отменяет все последующие команды, третья перенаправляет соединения на определенный хост к нужному нам IP-адресу. И вот как будет звучать команда: ssh -f -N [email protected] -L 8080:10.10.2.1:80.
Как видите, это достаточно простое решение. Какой метод выберите вы — это зависит от поставленных задач и ваших навыков!
Шаг 2. Делаем доступным порт 8080 для доступа извне.
Если при установленном и работающем туннеле получить страничку Apache можно только с сервера Ubuntu-VPS, то значит в настройках сервера SSH необходимо включить доступ к пробрасываемым через тоннель портам.
Редактируем любым редактором конфигурационный файл SSH, расположенный по пути ‘/etc/ssh/sshd_config’ на Ubuntu-VPS и записываем там строчку (или убираем символ комментария #) ‘GatewayPorts yes’. Сохраняем и перезапускаем SSH-сервер командой ‘sudo service sshd restart’.
Дефолтная страничка от Apache получена с сервера посредника
После перезагрузки сервера SSH, устанавливаем туннель и пробуем зайти на Ubuntu-VPS через браузер на основном компьютере. Все работает. И на этом можно было и закончить, если бы не потребность в большей автономности и автоматизации туннеля. Поэтому двигаемся далее.
Dynamic Port Forwarding
Dynamic port forwarding turns your SSH client into a SOCKS proxy server. SOCKS is a little-known but widely-implemented protocol for programs to request any Internet connection through a proxy server. Each program that uses the proxy server needs to be configured specifically, and reconfigured when you stop using the proxy server.
For example, say you wanted Firefox to connect to every web page through your SSH server. First you would use dynamic port forwarding with the default SOCKS port:
ssh -C -D 1080 laptop
The -D option specifies dynamic port forwarding. 1080 is the standard SOCKS port. Although you can use any port number, some programs will only work if you use 1080. -C enables compression, which speeds the tunnel up when proxying mainly text-based information (like web browsing), but can slow it down when proxying binary information (like downloading files).
Next you would tell Firefox to use your proxy:
-
go to Edit -> Preferences -> Advanced -> Network -> Connection -> Settings…
- check «Manual proxy configuration»
- make sure «Use this proxy server for all protocols» is cleared
- clear «HTTP Proxy», «SSL Proxy», «FTP Proxy», and «Gopher Proxy» fields
- enter «127.0.0.1» for «SOCKS Host»
- enter «1080» (or whatever port you chose) for Port.
You can also set Firefox to use the DNS through that proxy, so even your DNS lookups are secure:
- Type in about:config in the Firefox address bar
- Find the key called «network.proxy.socks_remote_dns» and set it to true
The SOCKS proxy will stop working when you close your SSH session. You will need to change these settings back to normal in order for Firefox to work again.
To make other programs use your SSH proxy server, you will need to configure each program in a similar way.
Forwarding GUI Programs
SSH can also forward graphical applications over a network, although it can take some work and extra software to forward programs to Windows or Mac OS.
Настройка SSH сервера в Windows
После установки сервера OpenSSH в Windows добавляются две службы:
- ssh-agent (OpenSSH Authentication Agent) – можно использовать для управления закрытыми ключами если вы настроили SSH аутентификацию по ключам;
- sshd (OpenSSH SSH Server) – собственно сам SSH сервер.
Вам нужно изменить тип запуска службы sshd на автоматический и запустить службу с помощью PowerShell:
С помощью nestat убедитесь, что теперь в системе запущен SSH сервер и ждет подключений на порту TCP:22 :
Проверьте, что включено правило брандмауэра (Windows Defender Firewall), разрешающее входящие подключения к Windows по порту TCP/22.
Если правило отключено (состоянии Enabled=False) или отсутствует, вы можете создать новое входящее правило командой New-NetFirewallRule:
Рассмотрим, где храниться основные компоненты OpenSSH:
- Исполняемые файлы OpenSSH Server находятся в каталоге (sshd.exe, ssh.exe, ssh-keygen.exe, sftp.exe и т.д.)
- Конфигурационный файл sshd_config (создается после первого запуска службы):
- Файлы authorized_keys и ssh ключи можно хранить в профиле пользователей:
Как включить перенаправления портов в Windows 10 с помощью netsh portproxy?
Настройка переадресации портов в Windows выполняется из командной строки в режиме Portproxy команды Netsh. Синтаксис команды следующий:
где это находится,
- listenaddress – локальный IP-адрес, на котором ожидается соединение (полезно, если у вас несколько сетевых карт или несколько IP-адресов на одном интерфейсе);
- listenport – номер локального TCP-порта, соединение на которое будет перенаправлено (на этом порту ожидается входящее соединение);
- connectaddress – локальный или удаленный IP-адрес или DNS-имя, на которое вы хотите перенаправить сетевое соединение;
- connectport – номер TCP-порта, на который вы хотите перенаправить трафик с прослушивающего порта.
Используя параметры
, вы можете создавать правила переадресации портов между адресами IPv4 и IPv6.
Допустим, наша задача – заставить службу RDP отвечать на нестандартный порт, например 3340 (этот порт, конечно, можно изменить в настройках самой службы, но мы используем RDP, чтобы упростить продемонстрировать технику переадресации и переадресацию портов). Для этого нам нужно перенаправить входящий трафик с TCP-порта 3340 на другой локальный порт – 3389 (это стандартный номер порта RDP).
Примечание
Обратите внимание, что номер локального порта, указанный в listenport, не должен быть занят (прослушиваться) другой службой. Убедитесь, что номер порта свободен с помощью команды:
Кроме того, вы можете проверить, не прослушивает ли порт локально, с помощью командлета PowerShell Test-NetConnection:
Чтобы создать правило переадресации портов, запустите командную строку от имени администратора и выполните команду:
Где 10.10.1.110 – текущий IP-адрес этого компьютера
Теперь используйте утилиту netstat, чтобы убедиться, что Windows теперь прослушивает локальный порт 3340:
Примечание. Если эта команда ничего не возвращает и переадресация портов через интерфейс netsh portproxy не работает, убедитесь, что в вашей системе включен iphlpsvc (IP Helper).
А на сетевом интерфейсе, для которого создано правило переадресации портов, должна быть включена поддержка IPv6.
Это предварительные условия для правильной работы переадресации портов. Без IP Helper и без включенной поддержки IPv6 механизм пересылки не работает.
В Windows Server 2003 / XP для работы перенаправления вам также необходимо включить параметр реестра IPEnableRouter = 1 в ветке HKEY_LOCAL_MACHINE \ SYSTEM \ ControlSet001 \ Services \ Tcpip \ Parameters.
можно определить процесс, прослушивающий указанный локальный порт, используя его PID (в нашем примере PID – 636):
Теперь попробуем подключиться к этому порту с удаленного компьютера с помощью любого RDP-клиента. В качестве порта rdp необходимо указать 3340 (номер порта указывается после двоеточия после адреса сервера rdp), например,
RDP-соединение должно быть установлено правильно.
Если вам нужно перенаправить входящее TCP-соединение на удаленный компьютер, используйте следующую команду:
Это правило перенаправит весь входящий трафик RDP (с локального TCP-порта 3389) с этого компьютера на удаленный компьютер с IP-адресом 192.168.1.100.
Кроме того, для перенаправления локального порта на удаленный сервер в Windows вы можете использовать метод SSH-туннелирования.
Instead of conclusion
Hope the above materials helped you a bit with becoming a master of SSH Tunnels If you find the networking topics interesting but feel like most of the materials are written for bearded network engineers and almost indigestible for mere developers, I’ve got a few more articles that you may find useful:
- Computer Networking Introduction: Ethernet and IP
- Illustrated introduction to Linux iptables
- Bridge vs. Switch: What I Learned From a Data Center Tour
- Container Networking Is Simple (not really)
Happy reading!
Resources
- SSH Tunneling Explained by networking gurus from Teleport.
- SSH Tunneling: Examples, Command, Server Config by SSH Academy.
Сначала основы
Разбор командной строки SSH
В следующем примере используются обычные параметры, часто встречающиеся при подключении к удалённому серверу .
- : вывод отладочной информации особенно полезен при анализе проблем аутентификации. Можно использовать несколько раз для вывода дополнительной информации.
- : порт для подключения к удалённому серверу SSH. 22 не обязательно указывать, потому что это значение по умолчанию, но если протокол на каком-то другом порту, то указываем его с помощью параметра . Порт прослушивания указывается в файле в формате .
- : сжатие для соединения. Если у вас медленный канал или вы просматриваете много текста, это может ускорить связь.
- : строка перед символом @ обозначает имя пользователя для аутентификации на удалённом сервере. Если не указать его, то по умолчанию будет использоваться имя пользователя учётной записи, в которую вы вошли в данный момент (~$ whoami). Пользователя также можно указать параметром .
- : имя хоста, к которому подключается , это может быть полное доменное имя, IP-адрес или любой хост в локальном файле hosts. Для подключения к хосту, который поддерживает и IPv4, и IPv6, можно добавить в командную строку параметр или для правильного резолвинга.
Все вышеперечисленные параметры являются необязательными, кроме .
Использование файла конфигурации
Хотя многие знакомы с файлом , есть ещё файл конфигурации клиента для команды . Значение по умолчанию , но его можно определить как параметр для опции .
В приведённом выше примерном файле конфигурации ssh две записи хоста. Первая обозначает все хосты, для всех применяется параметр конфигурации Port 2222. Вторая говорит, что для хоста remoteserver следует использовать другое имя пользователя, порт, FQDN и IdentityFile.
Файл конфигурации может сэкономить много времени на ввод символов, позволяя автоматически применять продвинутую конфигурацию при подключении к конкретным хостам.
Копирование файлов по SSH с помощью SCP
SSH-клиент поставляется с двумя другими очень удобными инструментами для копирования файлов по зашифрованному ssh-соединению. Ниже см. пример стандартного использования команд scp и sftp
Обратите внимание, что многие параметры для ssh применяются и в этих командах
В этом примере файл mypic.png скопирован на remoteserver в папку /media/data и переименован в mypic_2.png.
Не забывайте о разнице в параметре порта. На этом попадаются многие, кто запускает из командной строки. Здесь параметр порта , а не , как в ssh-клиенте! Вы забудете, но не волнуйтесь, все забывают.
Для тех, кто знаком с консольным , многие из команд похожи в . Вы можете сделать push, put и ls, как сердце пожелает.
Remote port forwarding
Now comes the second part of this tutorial, which is remote port
forwarding. This is again best to explain with an example.
Say that you’re developing a Rails application on your local machine,
and you’d like to show it to a friend. Unfortunately your ISP didn’t
provide you with a public IP address, so it’s not possible to connect
to your machine directly via the internet.
Sometimes this can be solved by configuring NAT (Network Address
Translation) on your router, but this doesn’t always work, and it
requires you to change the configuration on your router, which isn’t
always desirable. This solution also doesn’t work when you don’t have
admin access on your network.
To fix this problem you need to have another computer, which is publicly
accessible and have SSH access to it. It can be any server on the
internet, as long as you can connect to it. We’ll tell SSH to make a
tunnel that opens up a new port on the server, and connects it to a
local port on your machine.
The syntax here is very similar to local port forwarding, with a
single change of for . But as with local port forwarding, the
syntax remains the same.
First you need to specify the port on which th remote server will
listen, which in this case is , and next follows for
your local machine, and the local port, which in this case is .
There is one more thing you need to do to enable this. SSH doesn’t by
default allow remote hosts to forwarded ports. To enable this open
and add the following line somewhere in that
config file.
Make sure you add it only once!
And restart SSH
After this you should be able to connect to the server remotely, even
from your local machine. The way this would work is that you would
first create an SSH tunnel that forwards traffic from the server on
port to your local machine on port . This means that if
you connect to the server on port from your local machine,
you’ll actually make a request to your machine through the SSH tunnel.
Different Kinds of SSH Forwarding
Local Forwarding
Local forwarding is used to send traffic destined for a local port to a port on a remote machine through the SSH tunnel. The SSH client will listen for connections to the local port, when it receives that connection it forwards it to the remote system on the specified port.
Local Forwarding — Example 1
For this first example we will connect our local machine named putor to a legacy MySQL database server named centos6 to encrypt the traffic.
We will forward local port 6603 (putor:6603) to the remote port (centos6:3306) and make the database connection.
Diagram of SSH tunnel 1
Here are some configuration parameters of the server. You will see that we have MySQL running and listening on port 3306, BUT iptables (host firewall) DOES not have 3306 open. This means that normal communication to the database is blocked by the firewall. In this example, we are going to connect to the database through the SSH tunnel, so we do not need the port opened on the host system.
Now let’s setup our SSH Forwarding to allow use to connect to the MySQL database on the remote server through the SSH connection.
To reiterate, the command above forward port 6033 on the local system to port 3306 on the remote system.
Now we have the tunnel up, we can connect to the database from our workstation.
Now my workstation (putor) is listening on port 6603 for incoming connections and it will forward those connections to the MySQL server at centos6:3306. This INCLUDES connections for another system. I can now make this database open to other systems the network, by allowing port 6603 on my firewall.
To stop this behavior, we need to specify a BIND address. This mean we will tell SSH to only allows connections through this tunnel from the IP address we specify. Here is how that forwarding statement looks.
That is how local forwarding works. If you have any questions feel free to leave them in the comments.
Local Forwarding — Example 2
For this next example, we will use the the Centos6 system as a jump box.
We will open a connection to centos6, and forward all connections to port 8443 on the workstation to port 8443 on Fenrir, the web server.
Now that we have the tunnel up, let’s open our web browser and go to https://putor:8443.
In the above example, the request from our browser went to our local port 8443, which was sent through centos6 and off to Fenrir.
That’s local forwarding in a nutshell. I hope I was able to explain it in a clear manner. If you have any questions leave them in the comments.
Remote Forwarding
Remote SSH forwarding works very similar to local forwarding, but in reverse. When you make the connection it forwards the port on the remote host back to the local host port.
Remote Forwarding — Example 1
So let’s make a remote forwarding connection from centos6 MySQL server, back to my workstation and forward port 7777 to the database port 3306.
As you can see from the diagram above, we are initiating the connection from the database server (centos6) for this example. We will connect to my workstation (putor) and forward port 7777 on putor back to 3306 on centos6.
Now let’s test the database connection to port 7777 on putor.
Success. We were able to connect back through the tunnel using remote forwarding.
Remote Forwarding — Example 2
For this example, we will initial a remote forwarding tunnel from Fenrir:8443 to Putor:6556. This will allow putor to connect to localhost:6565 and open the web application on Fenrir:8443.
Just as with local forwarding, if you reverse forward a port from a server to a client, anybody who can access that port on the server will be forwarded to the client. This can be controlled with the GatewayPorts option in the SSH daemon configuration (see server configurations below).
Remote Forwarding Diagram 2
NOTE: It is important to recognize that we are initiating the connect from the server.
Let’s create the tunnel.
Now we should be able to open a browser on Putor and navigate to https://localhost:6565 and open the web application on Fenrir.
Success. We were able to connect to the web application from putor through the tunnel we initiated on the server.
Использование пароля
Начнем с инструкции о том, как подключиться к удаленному серверу через SSH по логину и паролю. Это самый простой способ. Хостер предоставляет вам IP-адрес, логин и пароль. Этого достаточно для того, чтобы установить соединение с удаленным сервером.
Подключение на Windows
Моя основная система — Windows. Раньше для подключения к серверу через SSH я пользовался сторонней утилитой PuTTY, потому что в операционной системе не было встроенного компонента. В «десятке» он появился, так что теперь можно подключаться к SSH через командную строку (cmd).
Чтобы включить встроенный в систему OpenSSH:
- Откройте «Параметры» (Win + I) и перейдите в раздел «Приложения».
- Выберите опцию «Управление дополнительными компонентами».
- Нажмите «Добавить компонент».
- Выберите в списке OpenSSH Client и нажмите «Установить».
- После завершения установки перезагрузите систему.
Теперь разберемся, как подключиться к SSH через cmd. Запустите командную строку и выполните запрос вида ssh [email protected].
Значение root — логин для подключения, вы получили его в письме при создании сервера. 185.104.114.90 — IP-адрес сервера. Его можно посмотреть в панели управления сервером или в том же письме, которое прислал хостер. У команды может быть также дополнительный параметр -p, после которого прописывается номер порта. По умолчанию используется порт 22. Если у вас настроен другой порт, нужно явно его указать, — например, полный адрес может выглядеть так: ssh [email protected] -p 150.
После выполнения команды клиент SSH предложит добавить устройство в список известных. Введите в командной строке yes и нажмите на Enter. Затем укажите пароль для доступа к серверу. На этом подключение к серверу через SSH завершено — теперь все команды будут выполняться на удаленной машине, к которой вы подключились.
На версиях младше Windows 10 1809 нет встроенной поддержки протокола OpenSSH. В таком случае понадобится сторонняя утилита. Смотрим, как через PuTTY подключиться по SSH:
- Запустите PuTTY.
- На вкладке Session укажите Host Name (IP-адрес сервера), Port (по умолчанию 22, но если вы в конфигурации сервера указали другой порт, нужно задать его номер).
- Убедитесь, что тип соединения установлен SSH.
- Нажмите на кнопку Open, чтобы подключиться.
Если вы ввели правильные данные, появится окно консоли, в котором нужно указать логин и пароль для подключения к серверу. При первом запуске также отобразится запрос на добавление устройства в список известных.
Подключение на Linux и macOS
Теперь посмотрим, как подключиться по SSH через терминал на Linux. Для этого не требуется установка дополнительных компонентов, все работает «из коробки».
- Запустите терминал. Обычно для этого используется сочетание клавиш Ctrl+Alt+T. Найти терминал также можно по пути «Главное меню» — «Приложения» — «Система».
- Выполните команду для подключения. Синтаксис такой же, как на Windows, — ssh [email protected]. Если порт не стандартный, то нужно явно его указать: например, ssh [email protected] -p 150. Вместо root вы указываете свое имя пользователя, а вместо 185.104.114.90 — IP-адрес своего сервера.
- Если хост и порт указаны верно, на следующем шаге появится запрос на ввод пароля. При первом подключении также будет предложение добавить новое устройство в список известных. Для этого введите yes и нажмите на клавишу Enter.
На этом подключение завершено. Теперь все команды, которые вы вводите в терминале, будут выполняться на удаленной машине.
Если IP-адрес или порт указаны неверно, то на экране появится сообщение об ошибке — Connection Refused. Это может также говорить о том, что доступ запрещен брандмауэром на удаленном сервере (если вы его не отключили). Чтобы разрешить подключение через SSH:
- на сервере с Ubuntu/Debian выполните команду $ sudo ufw allow 22/tcp;
- на сервере CentOS/Fedora выполните команду $ firewall-cmd —permanent —zone=public —add-port=22/tcp.
Цифра 22 в синтаксисе — номер порта. Если вы используете другой порт, то укажите его явно.
Если вы знаете как подключиться через SSH на Linux, то справитесь с этой задачей и на macOS. В операционной системе Apple тоже есть встроенный терминал. Синтаксис команды для подключения не меняется: ssh [email protected], где root — ваш логин, а 185.104.114.90 — IP-адрес сервера, с которым вы устанавливаете соединение.
3: Dynamic Port Forwarding
- Let’s say we need a quick way to exit our network bypassing the firewall settings.
- Our normally has access to HTTP server running on
- But due to recent firewall policy we can reach host, to access the web server
- To overcome this problem we can use Dynamic Port Forwarding or SOCKS Forwarding SOCKS is a small protocol, defined in RFC-1928.
- A SOCKS client connects via TCP, and indicates via the protocol the remote socket it wants to reach; the SOCKS server makes the connection, then gets out of the way, transparently passing data back and forth.
- Thereafter, it is just as if the client had connected directly to the remote socket.
Advertisement
From the man page of SSH
-D port Specifies a local “dynamic” application-level port forwarding. This works by allocating a socket to lis‐ ten to port on the local side, optionally bound to the specified bind_address. Whenever a connection is made to this port, the connection is forwarded over the secure channel, and the application protocol is then used to determine where to connect to from the remote machine. Currently the SOCKS4 and SOCKS5 pro‐ tocols are supported, and ssh will act as a SOCKS server. Only root can forward privileged ports. Dynamic port forwardings can also be specified in the configuration file.
The syntax to use Dynamic Port Forwarding would be:
ssh -f -N -D port connectToHost
- Here in the first field there is no need to explicitly mention the , just provide the local port to be forwarded in the second field
- That’s because the is determined dynamically, and can be different for each connection.
- Replace with the server towards which you want to create the secure tunnel
3.1: Create SSH Tunnel
Before we create SSH Tunnel, let me show you was by default allowed to connect to apache server on using
# curl http://server3:80 My test site
But then we introduce iptables rule to block port 80 in the chain on
# iptables -A OUTPUT -p tcp --dport 80 -j DROP
Now if we try to access the apache server from , curl will time out while trying to establish the connection
# curl --connect-timeout 5 http://server3:80 curl: (28) Connection timed out after 5000 milliseconds
So we create Dynamic Port Forwarding SSH Tunnel from to using a random port . You can choose any other port of your choice.
# ssh -f -N -D 8080 root@server3
Verify the SSH process from this command
# ps -ef | grep ssh root 1170 1 0 10:20 ? 00:00:00 /usr/sbin/sshd -D root 1426 1170 0 10:21 ? 00:00:01 sshd: root@pts/1 root 2242 1170 0 12:31 ? 00:00:00 sshd: root@pts/0 root 2611 1 0 16:24 ? 00:00:00 ssh -f -N -D 8080 root@server3 root 2613 1430 0 16:25 pts/1 00:00:00 grep --color=auto ssh
3.2: Verify SSH Tunnel setup
Verify the SSH Tunnel setup Now we will try to use SOCKS proxy to connect to the apache server from using
# curl --proxy socks5h://localhost:8080 http://server3:80 My test site
The curl connection was successful with SOCKS proxy
The tcpdump output on shows that the curl connection happened within the secure SSH Tunnel over port 22
# tcpdump -i enp0s8 port 22 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on enp0s8, link-type EN10MB (Ethernet), capture size 262144 bytes 16:27:04.659233 IP server1.53544 > server3.ssh: Flags , seq 2051346850:2051346934, ack 679515067, win 349, options , length 84 16:27:04.659249 IP server3.ssh > server1.53544: Flags , ack 84, win 295, options , length 0 16:27:04.659651 IP server3.ssh > server1.53544: Flags , seq 1:45, ack 84, win 295, options , length 44 16:27:04.660067 IP server1.53544 > server3.ssh: Flags , seq 84:192, ack 45, win 349, options , length 108 16:27:04.660454 IP server3.ssh > server1.53544: Flags , seq 45:337, ack 192, win 295, options , length 292 16:27:04.661356 IP server1.53544 > server3.ssh: Flags , seq 192:228, ack 337, win 369, options , length 36 16:27:04.661590 IP server3.ssh > server1.53544: Flags , seq 337:409, ack 228, win 295, options , length 72 16:27:04.661957 IP server1.53544 > server3.ssh: Flags , seq 228:264, ack 409, win 369, options , length 36 16:27:04.702875 IP server3.ssh > server1.53544: Flags , ack 264, win 295, options , length 0
You can also configure your Mozilla Firefox to use SOCKS Proxy by modifying the Proxy configuration under Network Settings
3.3: Close SSH Tunnel
To close the Dynamic Port Forwarding SSH Tunnel we must kill the SSH process which we created earlier on
# ps -ef | grep ssh root 2611 1 0 16:24 ? 00:00:00 ssh -f -N -D 8080 root@server3 root 2613 1430 0 16:25 pts/1 00:00:00 grep --color=auto ssh
In this case, kill the process PID 2611 to close the tunnel
# kill -9 2611
Summary
Remote desktop applications enable you to work entirely on the Work-PC (e.g. TeamViewer, LogMeIn, VNC), but this is often suffering from lag. An alterntive is to use a VPN but this may require installation of various pieces of softwsare on your home machine or may not be an option. The method described here will instead allow you to work on your Home-PC with a dedicated encrypted tunnel to your Work-PC which is used for specific ports only. These ports are setup as needed to access specific servers/services (including Windows File Sharing port 443 for SMB-based services) usually available to the user when seated at the Work-PC, while making them look like you are connecting to the same server on your local home network (with the benefit of a fully encrypted secure tunnel between the two machines).
Additional Security Considerations
Revoke a key by removing it from the «authorized_keys» file on the server.
Protect the private key as it allows direct access to the server.
Ensure a suitable security software is running on both PCs.
As the connection is between two specific PCs then consider adding a firewall rule to block ALL traffic to port 22 (or OpenSSH server application) except that originating from a specific (work) IP address. This will protect the SSH server which has now been opened to the internet and otherwise receives a lot of connection attempts (see this in the event viewer logs!).
Consider also that you can use Oracle VM Virtual Box and port forward 22 thought the VM such that the OpenSSH server can reside on a Virtual Dev Machine.
Large parts of this may be automated using PowerShell scripts.
Re-direct outgoing «network traffic» on the Home-PC (server) using the etc/hosts file to 127.0.0.1 . Use to redirect incoming traffic to a port above 1024 (ssh requires admin rights to tunnel ports below 1024) such that it is tunneled through the ssh connection.
Also see SSH Tunnelling Ports and Firewall Rules.
Last edit 04 August 2021.
Проброс удаленного порта
Пробрасывает порт на удаленной системе в другую систему.
Перенаправляет трафик с порта 8080 SSH-сервера для всех интерфейсов на порт localhost:80 на локальном компьютере. Если один из интерфейсов смотрит в Интернет, трафик, адресуемый на порт 8080, будет перенаправляться на локальную систему.
Переадресует трафик с порта 8080 SSH-сервера на localhost:80 в локальной системе, при этом доступ ко входу в SSH-туннель со стороны сервера разрешен только с IP-адреса 1.2.3.4 (обратите внимание: директиву необходимо установить в )
Переадресует трафик с порта 8080 SSH-сервера для всех интерфейсов на localhost:80 в локальной системе. Далее трафик из локальной системы направляется на example.org:80. С точки зрения example.org источником трафика выступает локальная система.
Конфигурация SSH-сервера
SSH-сервер конфигурируется в файле .
По умолчанию переадресуемые порты недоступны для доступа из Интернета. Для переадресации публичного интернет-трафика на локальный компьютер добавьте в на удаленном сервере такую строку:
Также в можно указать, каким клиентам разрешен доступ:
Надежные SSH-туннели
Перечисленные выше команды работают на разовой основе: вы сразу получаете конкретный результат, и на этом их работа заканчивается. Поэтому, чтобы обеспечить защиту SSH-туннелей от сбоев в сети или ненадежных соединений, придется выполнить дополнительную настройку.
По умолчанию TCP-соединение, используемое для создания SSH-туннеля, может разрываться после некоторого периода бездействия. Чтобы это предотвратить, нужно настроить сервер () на отправку heartbeat-сообщений:
На отсылку таких сообщений также можно настроить клиент ():
Использование AutoSSH
Указанные выше настройки могут предотвратить разрывы из-за неактивности, но они не в состоянии восстановить прерванные соединения. Для автоматического перезапуска SSH-туннеля можно воспользоваться утилитой — она создает SSH-туннель и отслеживает его работоспособность.
AutoSSH принимает те же аргументы для настройки переадресации портов, что и SSH:
Эта команда создает туннель, способный восстанавливаться после сетевых сбоев. По умолчанию AutoSSH открывает дополнительные порты на SSH-клиенте/сервере для проверки работоспособности (healthcheck). Если трафик не проходит между healthcheck-портами, AutoSSH перезапускает туннель.
Флаг отключает healthcheck-порты (за проверку работоспособности в этом случае отвечает SSH-клиент). В примере выше сервер должен посылать сигналы каждые 10 секунд. Если не проходят три подряд сигнала, SSH-клиент завершает работу, а AutoSSH поднимает новый туннель.
6) Коротко о беспарольном доступе
Думаю, все уже знают что авторизация по паролю это не про нас. Но на всякий случай впихну сюда краткую инструкцию по настройке аутентификации по ключу RSA:
1. На клиентских машинах генерируем пользователю свой ключ RSA:
По-умолчанию приватный ключ сохраняется в ~/.ssh/id_rsa, а открытый — в ~/.ssh/id_rsa.pub. Приватный ключ храните как зеницу ока и никому не давайте, никуда не копируйте.
При создании ключа можно задать пароль (passphrase), которым ключ будет зашифрован.
2. Клиентские открытые ключи нужно сохранить на ssh-сервере в файле ~/.ssh/authorized_keys (~ это домашняя директория того пользователя, которым будете логиниться), каждый на отдельной строке. Для того чтобы это не делать вручную, на каждом клиенте можно воспользоваться командой:
Где user — имя пользователя на сервере, sshserver — имя или IP-адрес ssh-сервера.
4. Отключите на SSH-сервере возможность входа по паролю в файле /etc/ssh/sshd_config:
Возможность входа по открытому ключу обычно уже включена по-умолчанию:
Я обычно также отключаю две следующие опции:
В некоторых случаях это позволяет ускорить процесс соединения (например, когда на сервере нет доступа в Интернет).
5. Перезапустите sshd:
или
Возможно вам будет интересно — Линус Торвальдс сомневается, что Linux будет работать на Apple M1