Время на прочтение6 мин
Количество просмотров18K
Я ленивый и потому люблю когда все организовано удобно, без лишних телодвижений. Иногда перебарываю лень, для того чтобы сделать удобно.
Однажды потребовалось мне организовать доступ к серверу по протоколу SMB и в поиске решения я наткнулся на следующую статью: Mounting your Nikhef home directory using SSH for Windows 8. Это было простое и удобное решение, которое использовало Putty. Чуть позже мне пришлось настраивать это решение на другом компьютере и я понял, что Putty тут лишний с тех пор как в Windows 10 появился встроенный ssh-клиент на основе OpenSSH.
Под катом — идентичная схема, только с использованием OpenSSH под Windows 10.
У меня схема организована следующим образом:
- На сервере запущена Samba, от имени пользователя www-data расшарена корневая папка с сайтами. Доступ к серверу только через ssh с авторизацией по ключу. Сервер за NATом, порт проброшен только для ssh.
- В процессе входа в аккаунт на домашней машине на Windows 10 через встроенный в систему OpenSSH устанавливается соединение с сервером с авторизацией по ключу.
- Туннелируется порт 445 удаленной машины на локальный порт 44445 сетевого loopback-адаптера доступного по адресу 10.255.255.1
- На loopback-адаптере 10.255.255.1 порт 44445 проксируется на локальный 445. Таким образом при подключении к \\10.255.255.1\ открывается удаленная шара с файлами (которая, при необходимости монтируется как сетевой диск).
Всё это автоматом – лень торжествует. Безопасно, быстро и нативно выглядит. Любым редактором могу открывать и править файлы на удаленном сервере как у себя на локальном — без проблем с загрузкой правленых файлов и установкой им необходимых разрешений. При этом нет проблем с безопасностью Samba.
Итак – сперва по шагам:
На стороне WINDOWS
Должен быть установлены OpenSSH. В Windows 10 и Windows Server 2019 появился встроенный SSH клиент на основе OpenSSH. Им мы и воспользуемся. Сначала убедимся что он установлен – наберем в командной строке
ssh
Если видим исполнение команды — все «Ок», клиент присутствует в системе.
Шаг 1. Настройка сетевого адаптера
Устанавливаем loopback-адаптер в системе. Мы будем обращаться по адресу к локальному адаптеру.
hdwwiz.exe
Запустится «Мастер установки оборудования» (Здесь я пользуюсь русской Windows 10 Pro).
«Далее» -> «Установка оборудования, выбранного из списка вручную» -> «Сетевые адаптеры» -> «Microsoft –> Адаптер замыкания на себя Microsoft KM-Test» -> «Далее»
Уверен, что эти шаги можно сделать из командной строки, но не нашел способ установки драйвера без devcon.exe, потому и не стал заморачиваться с автоматизацией этого шага.
Далее уже в CMD (от имени Администратора).
netsh interface show interface
Видим появился второй адаптер. У меня он называется Ethernet 2.
Теперь настроим адрес для этого адаптера
Или из командной строки:
netsh interface ip set address name="Ethernet 2" source=static address=10.255.255.1 mask=255.255.255.0
В результате у нас появился адаптер локально доступный по адресу 10.255.255.1
Теперь проблема в том, что нам необходимо получить доступ к общей папке через TCP-порт 445, но при загрузке Windows этот порт захватывается системным драйвером lanmanserver для всех интерфейсов. Отложив запуск драйвера lanmanserver и установив правило portproxy, мы можем обойти это.
Далее в командной строке от имени администратора меняем режим запуска сетевых служб (пробел после «start=» обязателен!!!):
sc config lanmanserver start= demand
sc config iphlpsvc start= auto
и настраиваем для адаптера с адресом 10.255.255.1 проксирование порта 44445 на локальный порт 445
netsh interface portproxy add v4tov4 listenaddress=10.255.255.1 listenport=445 connectaddress=10.255.255.1 connectport=44445
Теперь необходимо перезагрузиться, чтобы схема перехвата порта у службы lanmanserver сработала.
Проверяем что прослушивание порта осуществляется нашим loopback-адаптером, просмотрев открытые в системе порты
netstat -an | find ":445 "
Если мы видим
TCP 10.255.255.1:445 0.0.0.0:0 LISTENING
значит все в порядке и порт прослушивается на нужном адресе. Если же мы видим «0.0.0.0:445» — значит в нашей схеме что-то не сработало правильно. Проверить правила переадресации портов можно командой
netsh interface portproxy show v4tov4
Шаг 2. Ключ и рабочий скрипт
Создаем папку для вспомогательных файлов. Встроим, так сказать в систему наш способ.
mkdir %APPDATA%\CIFSoverSSH
cd %APPDATA%\CIFSoverSSH
Генерируем ключ для ssh-авторизации (назовем его, например: cifsoversshkey)
ssh-keygen -t rsa -N "" -f cifsoversshkey
В результате будет сгенерирована пара открытого и закрытого ключа. Для того, чтобы OpenSSH не выдавал сообщение UNPROTECTED PRIVATE KEY FILE! нужно изменить права на файл ключа. Задачу мы будем запускать для одного пользователя, от имени которого мы собираемся работать в Windows. Можно через GUI, но мне показалось что картинок уже достаточно. В Windows это сделаем следующей командой:
icacls cifsoversshkey /RESET
icacls cifsoversshkey /grant Имя_Пользователя:F /inheritance:r
В результате текущий пользователь будет назначен владельцем, отключено наследование и удалены унаследованные права. Проверить мы это сможем командой
icacls cifsoversshkey
Должны быть права только для текущего пользователя, иначе файл ключа не будет принят программой OpenSSH и соединение не будет подниматься!
Создадим в текущей папке пакетный файл cifsoverssh.cmd следующего содержания:
call cmd /c start "" /B C:\Windows\System32\OpenSSH\ssh.exe user@111.111.111.111 -p remoteport -i %APPDATA%\CIFSoverSSH\cifsoversshkey -L 10.255.255.1:44445:localhost:445 -N -o "StrictHostKeyChecking=no"
Где:
user@111.111.111.111 – пользователь на стороне linux сервера @ адрес удаленного сервера
Шаг 3. Ярлык или задача в планировщике
Создаем ярлык для следующей команды: powershell -nologo -noninteractive -windowStyle hidden -command «%APPDATA%\CIFSoverSSH\cifsoversshkey.cmd»
Это позволит запускать наш пакетный файл через powershell без открытия окна. Если запускать его через CMD будет открываться черное окно терминала и будет висеть все время, пока соединение будет установлено, а это неудобно и некрасиво.
Для автоматизации запуска при входе в систему можно создать задачу в планировщике:
schtasks /CREATE /RU %username% /TN "CIFS over SSH" /TR "powershell.exe -nologo -noninteractive -windowStyle hidden -command %APPDATA%\CIFSoverSSH\cifsoversshkey.cmd" /SC ONLOGON /DELAY 0000:10 /IT /RL highest
На стороне клиентского компьютера Windows все приготовления были закончены.
Настройка Linux сервера
Предполагается, что ssh-сервер был предварительно настроен и включена авторизация по ключу.
Подключаемся по ssh из командной строки на windows-машине
C:\Windows\System32\OpenSSH\ssh.exe user@111.111.111.111 -p remoteport
В домашней папке пользователя, от имени которого мы будем авторизовываться при создании туннеля ищем файл ~/.ssh/authorized_keys (если файл отсутствует – создадим его).
mkdir ~/.ssh && touch ~/.ssh/authorized_keys
Теперь необходимо в этот файл вставить содержимое нашего файла публичного ключа, созданного на нашей windows-машине (файл %APPDATA%\CIFSoverSSH\cifsoversshkey.pub). Откроем его в любом редакторе и вставим цепочку ключа с новой строки. Если есть другие ключи, просто вставим его с новой строки.
Устанавливаем Samba (на примере Debian)
apt update && apt install samba
Переименовываем старый файл настроек и создаем новый файл
mv /etc/samba/smb.conf /etc/samba/smb.conf.old
touch /etc/samba/smb.conf
Открываем пустой файл настроек и приводим его к следующему виду:
[global]
realm = webserver
server string = Web server
workgroup = WORKGROUP
# Setup charsets
dos charset = cp1251
unix charset = utf8
# Disable printers
load printers = No
show add printer wizard = no
printcap name = /dev/null
disable spoolss = yes
# Setup logging
log file = /var/log/smbd.log
max log size = 50
max xmit = 65536
debug level = 1
# Setup daemon settings
domain master = No
preferred master = Yes
socket options = IPTOS_LOWDELAY TCP_NODELAY SO_SNDBUF=65536 SO_RCVBUF=65536 SO_KEEPALIVE
os level = 65
use sendfile = Yes
dns proxy = No
dont descend = /proc,/dev,/etc
deadtime = 15
# Enable symlinks
unix extensions = No
wide links = yes
follow symlinks = yes
# Securtity settings
security = user
map to guest = Bad Password
guest account = nobody
create mask = 0664
directory mask = 0775
hide dot files = yes
client min protocol = SMB2
client max protocol = SMB3
[ShareName]
comment = Sites folder
path = /home/web
force user = www-data
force group = www-data
read only = No
guest ok = Yes
writable = yes
create mask = 0664
directory mask = 2775
В последней секции мы настраиваем непосредственно шару. В названии секции указываем имя шары ShareName. Path = путь к файлам, которые мы хотим расшарить. В параметрах force user и force group указываем linux-пользователя, от имени которого будут сохраняться файлы при изменении и создании в шаре. Так как у меня там лежат файлы для веб-сервера – у меня пользователь www-data
Перезапускаем Samba
systemctl restart smbd
Отключаемся и выходим в командную строку Windows
exit
Всё готово. Теперь остается только запустить наш ярлык или выйти из профиля пользователя windows и снова войти (если вы создали задачу в планировщике).
После этого ваша удаленная шара будет доступна по адресу \\10.255.255.1\ShareName — Можно даже монтировать её как сетевой диск.
Tutorial on how to use CIFS/SMB over SSH in Windows
View the Project on GitHub jjkeijser/cifs-over-ssh
CIFS-over-SSH
Sometimes there is a need to mount a remote Windows/Samba directory, but all you have is
an SSH connection to a remote server close to the fileserver.
This tutorial tries to explain how you can set up these Windows shares on Windows 10 & 11.
The concept behind mounting shares using SSH is this:
- The SSH protocol has a feature known as port-forwarding. This feature allows you to forward all
traffic from a TCP/IP network port on your local computer to another port on another computer at
the “other” side of the SSH connection. - The Windows File Sharing protocol, a.k.a.CIFS, uses TCP/IP port 445 to communicate between the
client and the server. Older versions of Windows also allowed the use of TCP/IP port 139 to
communicate between the client and the server. - Unfortunately, it turns out to be quite hard to redirect local port 445 to another computer, as
the OS also wants this port all for itself. However, with some special portproxy rules it is
still possible to grab port 445 before the OS does. - Thus, by configuring SSH in just the right way, we can redirect all traffic from the TCP/IP port 445
on your local computer to the remote Windows file server. - The result is that this will magically allow you to create a network share to view the remote directory
on your home computer.
This tutorial has been tested on Windows 2000, XP, Vista, 7, 8, 10 and 11.
Note This tutorial does not work on Windows Server 2016 or 2019. If someone finds a way to make
it work for Windows Server editions please let me know!
Types of access
For Windows 10+, the tutorial is now split into multiple parts, depending on the type of remote server
access that is required:
- Access to a single remote host, no Kerberos
- Access to multiple remote hosts, no Kerberos
- Access to multiple remote hosts, including DFS and Kerberos
Legacy tutorials
The following legacy tutorial pages are also available as single HTML pages:
- Windows 10 with the built-in OpenSSH client
- Windows 10 with the PuTTY SSH client
- Windows 8
- Windows 7
- Windows Vista
- Windows XP/2000
Provide feedback
Saved searches
Use saved searches to filter your results more quickly
Sign up
Appearance settings
I am lazy and therefore I like it when everything is organized conveniently, without unnecessary gestures. Sometimes I am too lazy to do it comfortably.
Once I needed to organize access to the server via SMB and while looking for a solution I came across the following article: Mounting your Nikhef home directory using SSH for Windows 8 . It was a simple and easy to use solution that Putty used. A little later, I had to configure this solution on another computer and I realized that Putty was superfluous here since the built-in ssh client based on OpenSSH appeared in Windows 10.
Under the cut — an identical scheme, only using OpenSSH under Windows 10.
My scheme is organized as follows:
- Samba is running on the server, the root folder with sites is shared on behalf of the www-data user. Access to the server only via ssh with key authorization. Server behind NAT, port forwarded only for ssh.
- In the process of logging into an account on a home machine on Windows 10 through the built-in OpenSSH system, a connection is established to the server with authorization by key.
- Port 445 of the remote machine is tunneled to local port 44445 of the network loopback adapter available at 10.255.255.1
- On loopback adapter 10.255.255.1 port 44445 is proxied to local 445. Thus, when connecting to \\ 10.255.255.1 \, a remote file ball opens (which, if necessary, is mounted as a network drive).
All this is automatic — laziness triumphs. Safe, fast and native looking. Any editor can open and edit files on a remote server as well as on my local one — without problems downloading the edited files and setting them the necessary permissions. That being said, there are no security issues with Samba.
So — first step by step:
WINDOWS side
OpenSSH. Windows 10 Windows Server 2019 SSH OpenSSH. . –
ssh
— «», .
1.
loopback- . .
hdwwiz.exe
« » ( Windows 10 Pro).
«» -> « , » -> « » -> «Microsoft –> Microsoft KM-Test» -> «»
, , devcon.exe, .
CMD ( ).
netsh interface show interface
. Ethernet 2.
:
netsh interface ip set address name="Ethernet 2" source=static address=10.255.255.1 mask=255.255.255.0
10.255.255.1
, TCP- 445, Windows lanmanserver . lanmanserver portproxy, .
( «start=» !!!):
sc config lanmanserver start= demand
sc config iphlpsvc start= auto
10.255.255.1 44445 445
netsh interface portproxy add v4tov4 listenaddress=10.255.255.1 listenport=445 connectaddress=10.255.255.1 connectport=44445
, lanmanserver .
loopback-,
netstat -an | find ":445 "
TCP 10.255.255.1:445 0.0.0.0:0 LISTENING
. «0.0.0.0:445» — — .
netsh interface portproxy show v4tov4
2.
. , .
mkdir %APPDATA%\CIFSoverSSH
cd %APPDATA%\CIFSoverSSH
ssh- ( , : cifsoversshkey)
ssh-keygen -t rsa -N "" -f cifsoversshkey
. , OpenSSH UNPROTECTED PRIVATE KEY FILE! . , Windows. GUI, . Windows :
icacls cifsoversshkey /RESET
icacls cifsoversshkey /grant _:F /inheritance:r
, .
icacls cifsoversshkey
, OpenSSH !
cifsoverssh.cmd :
call cmd /c start "" /B C:\Windows\System32\OpenSSH\ssh.exe user@111.111.111.111 -p remoteport -i %APPDATA%\CIFSoverSSH\cifsoversshkey -L 10.255.255.1:44445:localhost:445 -N -o "StrictHostKeyChecking=no"
:
user@111.111.111.111 – linux @
3.
: powershell -nologo -noninteractive -windowStyle hidden -command «%APPDATA%\CIFSoverSSH\cifsoversshkey.cmd»
powershell . CMD , , .
:
schtasks /CREATE /RU %username% /TN "CIFS over SSH" /TR "powershell.exe -nologo -noninteractive -windowStyle hidden -command %APPDATA%\CIFSoverSSH\cifsoversshkey.cmd" /SC ONLOGON /DELAY 0000:10 /IT /RL highest
Windows .
Linux
, ssh- .
ssh windows-
C:\Windows\System32\OpenSSH\ssh.exe user@111.111.111.111 -p remoteport
, ~/.ssh/authorized_keys ( – ).
mkdir ~/.ssh && touch ~/.ssh/authorized_keys
, windows- ( %APPDATA%\CIFSoverSSH\cifsoversshkey.pub). . , .
Samba ( Debian)
apt update && apt install samba
mv /etc/samba/smb.conf /etc/samba/smb.conf.old
touch /etc/samba/smb.conf
:
[global]
realm = webserver
server string = Web server
workgroup = WORKGROUP
# Setup charsets
dos charset = cp1251
unix charset = utf8
# Disable printers
load printers = No
show add printer wizard = no
printcap name = /dev/null
disable spoolss = yes
# Setup logging
log file = /var/log/smbd.log
max log size = 50
max xmit = 65536
debug level = 1
# Setup daemon settings
domain master = No
preferred master = Yes
socket options = IPTOS_LOWDELAY TCP_NODELAY SO_SNDBUF=65536 SO_RCVBUF=65536 SO_KEEPALIVE
os level = 65
use sendfile = Yes
dns proxy = No
dont descend = /proc,/dev,/etc
deadtime = 15
# Enable synlinks
unix extensions = No
wide links = yes
follow symlinks = yes
# Securtity settings
security = user
map to guest = Bad Password
guest account = nobody
create mask = 0664
directory mask = 0775
hide dot files = yes
client min protocol = SMB2
client max protocol = SMB3
[ShareName]
comment = Sites folder
path = /home/web
force user = www-data
force group = www-data
read only = No
guest ok = Yes
writable = yes
create mask = 0664
directory mask = 2775
. ShareName. Path = , . force user force group linux-, . — – www-data
Samba
systemctl restart smbd
Windows
exit
. windows ( ).
\\10.255.255.1\ShareName — .
Для подключения файловой системы удаленного сервера в качестве сетевого диска в Windows можно использовать защищенный протокол SSH (вместо стандартного SMB/samba). Это удобно, когда нужно сделать файлы на удаленном SSH сервере доступными для локальной работы без использования дополнительных FTP/SFTP подключений. Для монтирования удаленных файловых систем в Windows можно использовать клиент SSHFS-Win. Этот клиент позволяет прозрачно подключать каталоги с удаленных компьютеров по протоколу SSHFS (основан на протоколе передачи SFTP, SSH File Transfer Protocol).
Можно скачать MSI установщик SSHFS-Win вручную или установить его через встроенный пакетный менеджер WinGet:
winget install SSHFS-Win.SSHFS-Win
Теперь можно смонтировать удаленную папку в виде сетевого диска прямо из проводника File Windows. Щелкните правой мышкой по значку Этот компьютер и выберите Подключить сетевой диск. Здесь нужно выбрать букву диска, которую нужно назначить и указать UNC путь к удаленной директории в формате:
\\prefix\\user@host[!PORT][\\PATH]
User
– учетная запись для аутентификации на удаленном SSH хосте
Host
– имя/IP адрес хоста
В качестве префикса нужно указать один из следующих значений:
-
sshfs
– подключиться в домашний каталог пользователя (в случае Windows это каталог профиля пользователя). Дополнительно указать относительный путь к людому каталогу в профиле пользователя. -
sshfs.r
– подключиться к корневой папке системы (в случае Windows это будет корень системного диска) -
sshfs.k
– подключиться в домашний каталог пользователя. Для аутентификации использовать SSH ключ в %USERPROFILE%/.ssh/id_rsa -
sshfs.kr
– подключиться к корневой директории с SSH ключом
Например, для монтирования каталога
C:\PS
с удаленного Windows хоста (на котором настроен SSH сервер), введите такой UNC путь:
\\sshfs.r\[email protected]\ps
При подключении появится запрос пароля удаленного пользователя для аутентификации (пароль можно сохранить в диспетчере учетных записей Windows).
После этого в проводнике Windows появится отдельной сетевой диск, подключенный по SSHFS.
Также можно подключить сетевой диск из командной строки с помощью стандартной команды
net use
.
Следующая команда смонтирует каталог
/var/www
на Linux сервере в качестве сетевого диска Windows:
net use W: \\sshfs.r\[email protected]\var\www /user:sysops
Смонтировать локальную папку с Windows хоста:
net use m: \\sshfs.r\[email protected]\ps /user:administrator
При подключении нужно будет ввести пароль пользователя.
Подключенный таким образом сетевой диск будет существовать только до следующей перезагрузки компьютера. Чтобы автоматически переподключать диск при входе пользователя, в команду нужно добавить опцию
/persistent:yes
Чтобы не вводить пароль пользователя для подключения, можно сохранить пароль в Windows Credential Manager с помощью:
cmdkey /add:192.168.158.13 /user:sysops /pass:Passw0rdd1
Одновременно через провайдера WinFsp.Np может быть подключено несколько сетевых папок. Вывести список подключенных дисков:
net use
Удалить один из дисков:
net use M: /delete
В команде net use можно указывать пароль и в открытом виде, но безопаснее будет настроить монтирование удаленной папки с помощью аутентификации по SSH ключу.
Сгенерируйте SSH ключи в Windows с помощью утилиты
ssh-keygen
согласно мануалу по ссылке (не указывайте пароль для защиты закрытого ключа). Добавьте открытый ключ из файла .pub в файл
authorized_keys
(или
administrators_authorized_keys
) на удаленном SSH сервере.
Для автоматического подключения сетевого диска по SSH с аутентификацией по ключу при входе в Windows, можно создать задание планировщика которое будет запускать такой PowerShell скрипт:
$rUser = "administator"
$rHost = "m-fs01.winitpro.ru"
$remoteDir = "\Install"
$Drive = "M:"
$privSSHKey = "C:\secret\m-fs01-id_rsa"
cd 'C:\Program Files\SSHFS-Win\bin\'
$mountcmd = ".\sshfs-win.exe svc \sshfs.k\$rUser@$rHost$remoteDir $Drive -IdentityFile=$privSSHKey"
Invoke-Expression $mountcmd
Можно использовать графический клиент для создания подключений сетевых дисков по SSH. Самым простым и удобным является SSHFS-Win-Manager. Клиент
SSHFS-Win-Manager
позволяет создать несколько SSHFS подключений к удаленным файловым системам. Поддерживает аутентификацию, как по паролю так и ключу.