最近想要配置自家的电脑用作服务器,方便自己远程访问。
由于没有静态IP,最开始想使用DDNS,从花生壳注册了一个域名,然后在路由配置端口转发,配置完成后,发现家里网络是光猫拨号的,路由器自动获取ip,转发的依然是内网ip,局域网可以访问,但是外网仍然访问不了,后面改成路由器拨号,依然没有公网ip。后面就想着通过一个公网上的服务器做跳板,网上找了一圈,决定使用ssh技术进行转发连接,本路记录ssh实现过程中的一些问题。
window下有自动OpenSSH工具可以实现ssh连接管理。
OpenSSH 是安全 Shell (SSH) 工具的开放源代码版本,Linux 及其他非 Windows 系统的管理员使用此类工具跨平台管理远程系统。 OpenSSH 在 2018 年秋季已添加至 Windows,并包含在 Windows 10 和 Windows Server 2019 中。
SSH 基于客户端-服务器体系结构,用户在其中工作的系统是客户端,所管理的远程系统是服务器。 OpenSSH 包含一系列组件和工具,用于提供一种安全且简单的远程系统管理方法,其中包括:
-
sshd.exe,它是远程所管理的系统上必须运行的 SSH 服务器组件
-
ssh.exe,它是在用户的本地系统上运行的 SSH 客户端组件
-
ssh-keygen.exe,为 SSH 生成、管理和转换身份验证密钥
-
ssh-agent.exe,存储用于公钥身份验证的私钥
-
ssh-add.exe,将私钥添加到服务器允许的列表中
-
ssh-keyscan.exe,帮助从许多主机收集公用 SSH 主机密钥
-
sftp.exe,这是提供安全文件传输协议的服务,通过 SSH 运行
-
scp.exe 是在 SSH 上运行的文件复制实用工具
本部分中的文档重点介绍了如何在 Windows 上使用 OpenSSH,包括安装以及特定于 Windows 的配置和用例。
使用ssh访问前需要确认远程主机上安装了OpenSSH服务器,本地主基上安装了OpenSSH客户端。
基本信息:
-
本地主机的IP(局域网内的):Local_IP
-
服务器的IP(公网IP):Server_IP
-
服务器可登录的用户名:UserName
-
服务器用户的密码:123456
-
ssh密钥对(后续创建)
通过win+r调出运行界面,然后输入services.msc打开服务管理器。
找到OpenSSH SSH Server服务启动,一般建议设置为自动启动
以管理员运行PowerShell或者命令行,然后运行如下命令:
# 启动服务 Start-Service sshd # 设置为自启动: Set-Service -Name sshd -StartupType 'Automatic'
注:sshd是OpenSSH的服务名
3.连接到SSH服务器
直接在powershell中用ssh访问
ssh username@server_IP # 连接成功后会收到如下提示 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 #然后输入密码,注意输入密码时不会显示密码。
密钥对指的是由特定的身份验证协议使用的公钥和私钥文件。
SSH 公钥身份验证使用不对称加密算法来生成两个密钥文件 – 一个为“私钥”文件,一个为“公钥”文件。 私钥文件等效于密码,在所有情况下都应当保护它们。 如果有人获取了你的私钥,则他们可以像你一样登录到你有权登录的任何 SSH 服务器。 公钥放置在 SSH 服务器上,并且可以共享,不会危害私钥的安全。
ssh-keygen -t ed25519
如上,-t是用于指定算法,包括DSA、RSA、ECDSA、Ed25519等,未指定时默认为RSA算法。
# 以下设置以ed25519算法生成密钥对 PS C:\WINDOWS\system32> ssh-keygen -t ed25519 # 提示生成密钥的信息 Generating public/private ed25519 key pair. # 此处用于设置密钥文件的存储位置,默认为前面括号中的文件名称 # 若要设置名称,后方需要写入文件所在路径以及文件名称才可,不能只写一个名称 Enter file in which to save the key (C:\Users\xxx/.ssh/id_ed25519): # 由于我原来生成过,所以要确认是否覆盖 C:\Users\xxx/.ssh/id_ed25519 already exists. Overwrite (y/n)? y # 回复y确认覆盖 # 以下时设置创建密码时是否加密私钥的密码,直接按Enter是不加密 Enter passphrase (empty for no passphrase): # 确认密码 Enter same passphrase again: # 密码确认通过后会生成密钥对 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]-----+
创建成功后可以在文件夹下看到密钥对,无扩展名的是私钥,带“.pub”的是公钥。
私钥的管理一般使用ssh-agent来管理,通过ssh-add添加私钥。
# 获取服务 Get-Service ssh-agent | Set-Service -StartupType Manual # 启动服务器 Start-Service ssh-agent # 运行服务 Get-Service ssh-agent # 将私钥添加到ssh-agent,注意需要添加对应私钥的路径 ssh-add ~\.ssh\id_ed25519
注:要想免密登录,启动Agent服务,建议设置成自动启动。
连接到ssh服务器之后可以通过scp将公钥文件复制到服务器,然后执行命令加载公钥
# 连接服务器后创建公钥存储目录,注意mkdir一般只能创建一级目录 ssh UserName@Server_IP mkdir C:\ProgramData\ssh\ # 使用scp拷贝公钥到服务器上 scp C:\Users\username\.ssh\id_ed25519.pub UserName@Server_IP:C:\ProgramData\ssh\administrators_authorized_keys # 访问公钥文件,生效公钥 ssh --% UserName@Server_IP icacls.exe "C:\ProgramData\ssh\administrators_authorized_keys" /inheritance:r /grant "Administrators:F" /grant "SYSTEM:F"
一般可能服务器会有多个公钥,先通过cd命令切换到公钥所在路径,然后可通过cat指令将公钥添加到公钥文件中,添加完之后重启ssh服务器(也可不重启,具体看情况,我是重启才有效)。
cat zero.pub >> administrators_authorized_keys
若公钥无法正常识别时,需要修改ssh_config文件配置,修改配置信息PubkeyAuthentication yes和
AuthorizedKeysFile.ssh/authorized_keys:
若是管理员账户访问时需要配试匹配管理员账户信息:
当公钥和私钥均部署完毕后,再在本地主机上通过ssh访问服务器时即可不用输入密码,当然首次登录一般还是需要进行密码确认。
Agent服务需要设置成自动启动,否则重启电脑后仍然需要密码登录,或者启动Agent服务后才能这正常免密访问。
4、SSH文件传输
ssh文件传输可使用sftp或者scp进行操作,
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
最简单的操作就是指定文件两个文件路径直接拷贝。
若需要大量操作,还可以使用WinSCP软件来操作,网址如下:
ssh的精华功能是用作端口转发,可以通过端口转发将不安全连接转换成加密的数据连接,大大提高数据安全性。
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]
常用参数如下:
-
-f:后台执行ssh指令
-
-C:允许压缩数据
-
-N:不执行远程指令
-
-R:远程端口转发
-
-L:本地端口转发
-
-D:动态转发
-
-g:允许远端主机连接本地转发的端口
-
-v:调试模式运行,可以打印一些日志信息
2.本地端口转发
通过-L参数进行本地端口转发,可实现对本地端口的访问转发到远程服务器上。
ssh -L [本地IP]本地端口:目标主机IP(或主机名):目标端口 Username@Server_IP
通过本地端口转发,可以实现对本地主机的某个端口进行访问时,通过远程服务器中转,变成访问远程的服务器。
当远程端口省略时默认绑定到127.0.0.1。
3.远程端口转发
ssh -R [远程IP:]远程端口:目标IP:目标端口 UserName@Server_IP
进行远程端口转发时,发起放必须在目标主机中发起,将对远程服务器主机指定端口的访问转发到本地主机上。
进行远程端口转发时,需要保证,服务器的安全组规则开放了端口:
window可以通过“netstat ”查看端口配置情况,ip为0.0.0.0:3389匹配设置的远程ip时就标识配置成功。
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
配置成功后可以在服务器的资源监视器查看对应端口的使用情况,若端口防火墙状态不是允许,需要在防火墙添加对应端口的入站规则,否则远程端口配置成功了,也无法正常转发,因为服务器该端口无法正常访问。
ssh运行依赖于客户端,一旦客户端关闭,ssh就会断开连接,可通过autossh等工具进行配置,自动连接ssh。
我打算使用python编辑一个小工具调用powershell自动连接ssh,然后添加成服务程序,设置自动启动(这个后面再整)。
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ 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.
处理方法:执行ssh-keygen -R XXX(ip地址)指令
原文链接:https://blog.csdn.net/u010839204/article/details/129581304?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522168449620216800182184750%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=168449620216800182184750&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~times_rank-16-129581304-null-null.article_score_rank_blog&utm_term=NAS%E3%80%81%E7%BE%A4%E6%99%96%E3%80%81%E9%98%BF%E9%87%8C%E4%BA%91%E3%80%81%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90%E3%80%81%E5%86%85%E7%BD%91%E7%A9%BF%E9%80%8F%E3%80%81ipv6%E3%80%81ddns%E3%80%81%E8%BD%BB%E9%87%8F%E7%BA%A7%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E3%80%81%E9%93%81%E5%A8%81%E9%A9%AC%E3%80%81%E5%A8%81%E8%81%94%E9%80%9A%E3%80%81DSM%E3%80%81DSM6.0%E3%80%81%E7%BE%A4%E6%99%96nas%E3%80%81%E4%BA%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E3%80%81%E8%9C%97%E7%89%9B%E6%98%9F%E9%99%85%E3%80%81%E9%BB%91%E7%BE%A4%E6%99%96%E3%80%81docker%E3%80%81%E5%AE%B9%E5%99%A8%E9%95%9C%E5%83%8F%E3%80%81%E5%9F%9F%E5%90%8D%E6%B3%A8%E5%86%8C%E3%80%81%E5%AE%9D%E5%A1%94%E3%80%81%E5%8F%8D%E5%90%91%E4%BB%A3%E7%90%86%E3%80%81nginx%E3%80%81frp%E3%80%81%E5%8A%A8%E6%80%81%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90