一、背景介紹
最近想要配置自家的電腦用作服務(wù)器,方便自己遠(yuǎn)程訪問(wèn)。
由于沒(méi)有靜態(tài)IP,最開(kāi)始想使用DDNS,從花生殼注冊(cè)了一個(gè)域名,然后在路由配置端口轉(zhuǎn)發(fā),配置完成后,發(fā)現(xiàn)家里網(wǎng)絡(luò)是光貓撥號(hào)的,路由器自動(dòng)獲取ip,轉(zhuǎn)發(fā)的依然是內(nèi)網(wǎng)ip,局域網(wǎng)可以訪問(wèn),但是外網(wǎng)仍然訪問(wèn)不了,后面改成路由器撥號(hào),依然沒(méi)有公網(wǎng)ip。后面就想著通過(guò)一個(gè)公網(wǎng)上的服務(wù)器做跳板,網(wǎng)上找了一圈,決定使用ssh技術(shù)進(jìn)行轉(zhuǎn)發(fā)連接,本路記錄ssh實(shí)現(xiàn)過(guò)程中的一些問(wèn)題。
二、ssh簡(jiǎn)介
window下有自動(dòng)OpenSSH工具可以實(shí)現(xiàn)ssh連接管理。
安裝方法參考:安裝 OpenSSH | Microsoft Learn
OpenSSH 是安全 Shell (SSH) 工具的開(kāi)放源代碼版本,Linux 及其他非 Windows 系統(tǒng)的管理員使用此類(lèi)工具跨平臺(tái)管理遠(yuǎn)程系統(tǒng)。 OpenSSH 在 2018 年秋季已添加至 Windows,并包含在 Windows 10 和 Windows Server 2019 中。
SSH 基于客戶(hù)端-服務(wù)器體系結(jié)構(gòu),用戶(hù)在其中工作的系統(tǒng)是客戶(hù)端,所管理的遠(yuǎn)程系統(tǒng)是服務(wù)器。 OpenSSH 包含一系列組件和工具,用于提供一種安全且簡(jiǎn)單的遠(yuǎn)程系統(tǒng)管理方法,其中包括:
-
sshd.exe,它是遠(yuǎn)程所管理的系統(tǒng)上必須運(yùn)行的 SSH 服務(wù)器組件
-
ssh.exe,它是在用戶(hù)的本地系統(tǒng)上運(yùn)行的 SSH 客戶(hù)端組件
-
ssh-keygen.exe,為 SSH 生成、管理和轉(zhuǎn)換身份驗(yàn)證密鑰
-
ssh-agent.exe,存儲(chǔ)用于公鑰身份驗(yàn)證的私鑰
-
ssh-add.exe,將私鑰添加到服務(wù)器允許的列表中
-
ssh-keyscan.exe,幫助從許多主機(jī)收集公用 SSH 主機(jī)密鑰
-
sftp.exe,這是提供安全文件傳輸協(xié)議的服務(wù),通過(guò) SSH 運(yùn)行
-
scp.exe 是在 SSH 上運(yùn)行的文件復(fù)制實(shí)用工具
本部分中的文檔重點(diǎn)介紹了如何在 Windows 上使用 OpenSSH,包括安裝以及特定于 Windows 的配置和用例。
-
有關(guān)常見(jiàn) OpenSSH 功能的其他詳細(xì)文檔,請(qǐng)參閱 OpenSSH.com。
三、SSH訪問(wèn)
-
連接前準(zhǔn)備
使用ssh訪問(wèn)前需要確認(rèn)遠(yuǎn)程主機(jī)上安裝了OpenSSH服務(wù)器,本地主基上安裝了OpenSSH客戶(hù)端。

基本信息:
-
本地主機(jī)的IP(局域網(wǎng)內(nèi)的):Local_IP
-
服務(wù)器的IP(公網(wǎng)IP):Server_IP
-
服務(wù)器可登錄的用戶(hù)名:UserName
-
服務(wù)器用戶(hù)的密碼:123456
-
ssh密鑰對(duì)(后續(xù)創(chuàng)建)
-
啟動(dòng)ssh服務(wù)器
2.1 服務(wù)管理啟動(dòng)服務(wù)
通過(guò)win+r調(diào)出運(yùn)行界面,然后輸入services.msc打開(kāi)服務(wù)管理器。

找到OpenSSH SSH Server服務(wù)啟動(dòng),一般建議設(shè)置為自動(dòng)啟動(dòng)

2.2 使用命令直接啟動(dòng)服務(wù)
以管理員運(yùn)行PowerShell或者命令行,然后運(yùn)行如下命令:
# 啟動(dòng)服務(wù)
Start-Service sshd
# 設(shè)置為自啟動(dòng):
Set-Service -Name sshd -StartupType 'Automatic'
注:sshd是OpenSSH的服務(wù)名

3.連接到SSH服務(wù)器
3.1 使用名稱(chēng)和密碼連接
直接在powershell中用ssh訪問(wèn)
ssh username@server_IP
# 連接成功后會(huì)收到如下提示
The authenticity of host 'servername (10.00.00.001)' can't be established.
ECDSA key fingerprint is SHA256:(<a large string>).
Are you sure you want to continue connecting (yes/no)?
#輸入 yes
#然后輸入密碼,注意輸入密碼時(shí)不會(huì)顯示密碼。
3.2 使用密鑰對(duì)訪問(wèn)(免密登錄)
3.2.1 關(guān)于密鑰對(duì)
密鑰對(duì)指的是由特定的身份驗(yàn)證協(xié)議使用的公鑰和私鑰文件。
SSH 公鑰身份驗(yàn)證使用不對(duì)稱(chēng)加密算法來(lái)生成兩個(gè)密鑰文件 – 一個(gè)為“私鑰”文件,一個(gè)為“公鑰”文件。 私鑰文件等效于密碼,在所有情況下都應(yīng)當(dāng)保護(hù)它們。 如果有人獲取了你的私鑰,則他們可以像你一樣登錄到你有權(quán)登錄的任何 SSH 服務(wù)器。 公鑰放置在 SSH 服務(wù)器上,并且可以共享,不會(huì)危害私鑰的安全。
3.2.2 生成密鑰對(duì)
ssh-keygen -t ed25519
如上,-t是用于指定算法,包括DSA、RSA、ECDSA、Ed25519等,未指定時(shí)默認(rèn)為RSA算法。
# 以下設(shè)置以ed25519算法生成密鑰對(duì)
PS C:\WINDOWS\system32> ssh-keygen -t ed25519
# 提示生成密鑰的信息
Generating public/private ed25519 key pair.
# 此處用于設(shè)置密鑰文件的存儲(chǔ)位置,默認(rèn)為前面括號(hào)中的文件名稱(chēng)
# 若要設(shè)置名稱(chēng),后方需要寫(xiě)入文件所在路徑以及文件名稱(chēng)才可,不能只寫(xiě)一個(gè)名稱(chēng)
Enter file in which to save the key (C:\Users\xxx/.ssh/id_ed25519):
# 由于我原來(lái)生成過(guò),所以要確認(rèn)是否覆蓋
C:\Users\xxx/.ssh/id_ed25519 already exists.
Overwrite (y/n)? y # 回復(fù)y確認(rèn)覆蓋
# 以下時(shí)設(shè)置創(chuàng)建密碼時(shí)是否加密私鑰的密碼,直接按Enter是不加密
Enter passphrase (empty for no passphrase):
# 確認(rèn)密碼
Enter same passphrase again:
# 密碼確認(rèn)通過(guò)后會(huì)生成密鑰對(duì)
Your identification has been saved in C:\Users\xxx/.ssh/id_ed25519.
Your public key has been saved in C:\Users\xxx/.ssh/id_ed25519.pub.
The key fingerprint is:
SHA256:gSHnvI7PnKlI/QgZUzvbbFoY+o+l0pIhgSlHkytgkbI xxx@PC-xxx
The key's randomart image is:
+--[ED25519 256]--+
| .o.. o |
|oo+ = o |
|=+ o. + . |
|E o. . . . |
|.+o + . S |
|. .* X |
| .=+= B |
| .++.& o |
| .oBoO |
+----[SHA256]-----+
創(chuàng)建成功后可以在文件夾下看到密鑰對(duì),無(wú)擴(kuò)展名的是私鑰,帶“.pub”的是公鑰。

3.2.3 管理私鑰
私鑰的管理一般使用ssh-agent來(lái)管理,通過(guò)ssh-add添加私鑰。
# 獲取服務(wù)
Get-Service ssh-agent | Set-Service -StartupType Manual
# 啟動(dòng)服務(wù)器
Start-Service ssh-agent
# 運(yùn)行服務(wù)
Get-Service ssh-agent
# 將私鑰添加到ssh-agent,注意需要添加對(duì)應(yīng)私鑰的路徑
ssh-add ~\.ssh\id_ed25519
注:要想免密登錄,啟動(dòng)Agent服務(wù),建議設(shè)置成自動(dòng)啟動(dòng)。

3.2.4 部署公鑰
連接到ssh服務(wù)器之后可以通過(guò)scp將公鑰文件復(fù)制到服務(wù)器,然后執(zhí)行命令加載公鑰
# 連接服務(wù)器后創(chuàng)建公鑰存儲(chǔ)目錄,注意mkdir一般只能創(chuàng)建一級(jí)目錄
ssh UserName@Server_IP mkdir C:\ProgramData\ssh\
# 使用scp拷貝公鑰到服務(wù)器上
scp C:\Users\username\.ssh\id_ed25519.pub UserName@Server_IP:C:\ProgramData\ssh\administrators_authorized_keys
# 訪問(wèn)公鑰文件,生效公鑰
ssh --% UserName@Server_IP icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
一般可能服務(wù)器會(huì)有多個(gè)公鑰,先通過(guò)cd命令切換到公鑰所在路徑,然后可通過(guò)cat指令將公鑰添加到公鑰文件中,添加完之后重啟ssh服務(wù)器(也可不重啟,具體看情況,我是重啟才有效)。
cat zero.pub >> administrators_authorized_keys
若公鑰無(wú)法正常識(shí)別時(shí),需要修改sshd_config文件配置,修改配置信息PubkeyAuthentication yes和
AuthorizedKeysFile.ssh/authorized_keys:

若是管理員賬戶(hù)訪問(wèn)時(shí)需要配試匹配管理員賬戶(hù)信息:

3.2.5 免密訪問(wèn)
當(dāng)公鑰和私鑰均部署完畢后,再在本地主機(jī)上通過(guò)ssh訪問(wèn)服務(wù)器時(shí)即可不用輸入密碼,當(dāng)然首次登錄一般還是需要進(jìn)行密碼確認(rèn)。
Agent服務(wù)需要設(shè)置成自動(dòng)啟動(dòng),否則重啟電腦后仍然需要密碼登錄,或者啟動(dòng)Agent服務(wù)后才能這正常免密訪問(wèn)。
4、SSH文件傳輸
ssh文件傳輸可使用sftp或者scp進(jìn)行操作,
sftp [-46aCfpqrv] [-B buffer_size] [-b batchfile] [-c cipher]
[-D sftp_server_path] [-F ssh_config] [-i identity_file] [-l limit]
[-o ssh_option] [-P port] [-R num_requests] [-S program]
[-s subsystem | sftp_server] destination
scp [-346BCpqrv] [-c cipher] [-F ssh_config] [-i identity_file]
[-l limit] [-o ssh_option] [-P port] [-S program] source ... target
scp拷問(wèn)文件示例:
scp ubuntu@IP:.ssh/id_rsa.pub C:\xxx\xxx\.ssh\id_rsa.pub
最簡(jiǎn)單的操作就是指定文件兩個(gè)文件路徑直接拷貝。
若需要大量操作,還可以使用WinSCP軟件來(lái)操作,網(wǎng)址如下:
WinSCP :: Official Site :: Free SFTP and FTP client for Windows
四、端口轉(zhuǎn)發(fā)
ssh的精華功能是用作端口轉(zhuǎn)發(fā),可以通過(guò)端口轉(zhuǎn)發(fā)將不安全連接轉(zhuǎn)換成加密的數(shù)據(jù)連接,大大提高數(shù)據(jù)安全性。
-
ssh參數(shù)
ssh [-46AaCfGgKkMNnqsTtVvXxYy] [-B bind_interface]
[-b bind_address] [-c cipher_spec] [-D [bind_address:]port]
[-E log_file] [-e escape_char] [-F configfile] [-I pkcs11]
[-i identity_file] [-J [user@]host[:port]] [-L address]
[-l login_name] [-m mac_spec] [-O ctl_cmd] [-o option] [-p port]
[-Q query_option] [-R address] [-S ctl_path] [-W host:port]
[-w local_tun[:remote_tun]] destination [command]
常用參數(shù)如下:
-
-f:后臺(tái)執(zhí)行ssh指令
-
-C:允許壓縮數(shù)據(jù)
-
-N:不執(zhí)行遠(yuǎn)程指令
-
-R:遠(yuǎn)程端口轉(zhuǎn)發(fā)
-
-L:本地端口轉(zhuǎn)發(fā)
-
-D:動(dòng)態(tài)轉(zhuǎn)發(fā)
-
-g:允許遠(yuǎn)端主機(jī)連接本地轉(zhuǎn)發(fā)的端口
-
-v:調(diào)試模式運(yùn)行,可以打印一些日志信息
2.本地端口轉(zhuǎn)發(fā)
通過(guò)-L參數(shù)進(jìn)行本地端口轉(zhuǎn)發(fā),可實(shí)現(xiàn)對(duì)本地端口的訪問(wèn)轉(zhuǎn)發(fā)到遠(yuǎn)程服務(wù)器上。
ssh -L [本地IP]本地端口:目標(biāo)主機(jī)IP(或主機(jī)名):目標(biāo)端口 Username@Server_IP

通過(guò)本地端口轉(zhuǎn)發(fā),可以實(shí)現(xiàn)對(duì)本地主機(jī)的某個(gè)端口進(jìn)行訪問(wèn)時(shí),通過(guò)遠(yuǎn)程服務(wù)器中轉(zhuǎn),變成訪問(wèn)遠(yuǎn)程的服務(wù)器。
當(dāng)遠(yuǎn)程端口省略時(shí)默認(rèn)綁定到127.0.0.1。
3.遠(yuǎn)程端口轉(zhuǎn)發(fā)
ssh -R [遠(yuǎn)程IP:]遠(yuǎn)程端口:目標(biāo)IP:目標(biāo)端口 UserName@Server_IP

進(jìn)行遠(yuǎn)程端口轉(zhuǎn)發(fā)時(shí),發(fā)起放必須在目標(biāo)主機(jī)中發(fā)起,將對(duì)遠(yuǎn)程服務(wù)器主機(jī)指定端口的訪問(wèn)轉(zhuǎn)發(fā)到本地主機(jī)上。
進(jìn)行遠(yuǎn)程端口轉(zhuǎn)發(fā)時(shí),需要保證,服務(wù)器的安全組規(guī)則開(kāi)放了端口:

window可以通過(guò)“netstat ”查看端口配置情況,ip為0.0.0.0:3389匹配設(shè)置的遠(yuǎn)程ip時(shí)就標(biāo)識(shí)配置成功。
PS C:\Windows\system32> netstat -ano|findstr "3389"
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 1516
TCP [::]:3389 [::]:0 LISTENING 1516
UDP 0.0.0.0:3389 *:* 1516
UDP [::]:3389 *:* 1516
配置成功后可以在服務(wù)器的資源監(jiān)視器查看對(duì)應(yīng)端口的使用情況,若端口防火墻狀態(tài)不是允許,需要在防火墻添加對(duì)應(yīng)端口的入站規(guī)則,否則遠(yuǎn)程端口配置成功了,也無(wú)法正常轉(zhuǎn)發(fā),因?yàn)榉?wù)器該端口無(wú)法正常訪問(wèn)。


五、自動(dòng)啟動(dòng)ssh
ssh運(yùn)行依賴(lài)于客戶(hù)端,一旦客戶(hù)端關(guān)閉,ssh就會(huì)斷開(kāi)連接,可通過(guò)autossh等工具進(jìn)行配置,自動(dòng)連接ssh。
我打算使用python編輯一個(gè)小工具調(diào)用powershell自動(dòng)連接ssh,然后添加成服務(wù)程序,設(shè)置自動(dòng)啟動(dòng)(這個(gè)后面再整)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-434512.html
六、問(wèn)題處理
-
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that a host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
SHA256:j2ygTU2u24P3v6ZG7RMqz66RRuNvvjpoWA1qEQO75pw.
Please contact your system administrator.
Add correct host key in C:\\Users\\xxx/.ssh/known_hosts to get rid of this message.
Offending RSA key in C:\\Users\\xxx/.ssh/known_hosts:10
RSA host key for ip(地址) has changed and you have requested strict checking.
Host key verification failed.
處理方法:執(zhí)行ssh-keygen -R XXX(ip地址)指令文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-434512.html
到了這里,關(guān)于Windows下配置SSH實(shí)現(xiàn)免密訪問(wèn)和遠(yuǎn)程端口轉(zhuǎn)發(fā)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!