使用内网穿透连接本地电脑SSH
本文档介绍如何通过内网穿透实现远程SSH连接到本地WSL环境。
TODO:未实现window的ssh和linux一剪切换
实现目标
- 通过公网IP访问本地WSL环境
- 实现SSH远程连接
- 使用NATAPP进行内网穿透
配置步骤
1. WSL SSH服务配置
首先需要在WSL中配置SSH服务器:
- 安装SSH服务器:
sudo apt update
sudo apt install openssh-server
- 编辑SSH配置文件:
sudo nano /etc/ssh/sshd_config
- 确保以下配置项设置正确:
PasswordAuthentication yes # 初期测试时可以开启密码认证
PermitRootLogin yes # 如果需要root登录则开启
- 启动SSH服务:
sudo service ssh start
- 测试SSH服务状态:
可以通过以下几种方式确认SSH服务是否正常运行:
a. 检查服务状态:
sudo service ssh status
正常运行时会显示 “Active: active (running)”
b. 检查进程:
ps aux | grep ssh
应该能看到sshd进程在运行
c. 检查端口监听:
sudo netstat -tuln | grep 22
或
sudo ss -tuln | grep 22
应该能看到22端口处于LISTEN状态
d. 本地连接测试:
ssh localhost
或
ssh 127.0.0.1
如果能成功连接说明SSH服务运行正常
2. NATAPP配置
-
注册账号:
- 访问 NATAPP官网 注册账号
- 登录后点击左侧"购买隧道"
- 选择隧道类型为TCP,本地端口设置为WSL的SSH端口(默认22)
- 可以选择免费或付费隧道
-
下载和安装:
- 在NATAPP官网下载对应系统版本的客户端
- Windows系统下载后解压到任意目录
- Linux系统可直接使用wget下载
-
获取authtoken:
- 在网站后台"我的隧道"中查看
- 点击复制获取authtoken
- 这个authtoken是您的隧道登录凭证
-
运行NATAPP(两种方式):
a) 使用config.ini方式(推荐):
-
下载对应系统的config.ini文件到natapp.exe同级目录
-
编辑config.ini,填入authtoken:
#将本文件放置于natapp同级目录 程序将读取 [default] 段 #在命令行参数模式时,本配置文件可为空 [default] authtoken= #对应一条隧道的authtoken clienttoken= #对应客户端的clienttoken,将会忽略authtoken,若无请留空 log=none #log 日志文件,可以是none代表不记录,可以是文件路径 loglevel=DEBUG #日志等级 DEBUG, INFO, WARNING, ERROR 默认为DEBUG http_proxy= #代理设置 如 http://10.123.10.10:3128
-
各配置项说明:
- authtoken:必填,从网站后台获取的隧道authtoken
- clienttoken:选填,客户端token,填写后会忽略authtoken
- log:日志配置,可以是none或具体的文件路径
- loglevel:日志级别,可选DEBUG、INFO、WARNING、ERROR
- http_proxy:代理服务器设置,如需要可填写代理地址
-
Windows下直接双击natapp.exe运行
b) 使用命令行参数方式:
- Windows命令提示符:
natapp.exe -authtoken=你的authtoken值
- Linux/Mac终端:
./natapp -authtoken=你的authtoken值
注意:输入参数时不要有多余的空格!
-
-
Web管理界面:
- 默认地址:http://127.0.0.1:4040
- 可在隧道配置中开启或关闭
- 用于开发测试和监控连接状态
注意:本文中未包含的图片引用:
- 隧道购买界面截图
- 客户端下载页面截图
- 配置文件设置截图
- 运行成功界面截图
如需查看这些图片,请访问NATAPP新手图文教程
3. 连接测试
其他用户可以通过以下命令连接到你的WSL:
ssh username@natapp分配的域名 -p natapp分配的端口
安全建议
为了确保系统安全,建议采取以下措施:
- 配置SSH密钥认证替代密码认证
- 在WSL的防火墙中限制SSH访问
- 定期更改密码和密钥
- 监控SSH登录日志
故障排查
如果连接失败,请检查:
- WSL中SSH服务是否正常运行
- NATAPP客户端是否正常连接
- 端口转发是否正确配置
- 防火墙设置是否正确
常见问题解答(FAQ)
Q1: SSH应该安装在Windows还是WSL中?
推荐直接在WSL中安装SSH服务器:
-
优势:
- WSL是完整的Linux环境,原生支持SSH服务
- 直接安装避免Windows和WSL之间的额外配置
- 更符合Linux的使用习惯和安全策略
-
如果安装在Windows:
- 需要额外配置端口转发
- 需要配置Windows和WSL之间的网络
- 可能遇到权限和网络隔离问题
- 配置复杂且可能存在稳定性问题
-
对WSL命令行的影响:
- WSL中安装:可直接获得完整的WSL命令行环境
- Windows中安装:需要额外配置才能访问WSL环境,可能存在兼容性问题
Q2: 使用WSL的SSH服务需要注意什么?
-
启动要求:
- 是的,必须先启动WSL才能使用SSH服务
- SSH服务需要手动启动或配置自启动
-
自动化解决方案:
- 创建Windows计划任务在开机时启动WSL
- 在WSL的
/etc/profile
或~/.bashrc
中添加SSH服务启动命令 - 使用Windows批处理脚本组合以上操作
-
启动脚本示例:
@echo off
wsl -d Ubuntu -u root service ssh start
将此脚本保存为.bat文件,可以:
- 手动运行
- 添加到Windows启动项
- 创建计划任务定时执行
注意:具体的自动启动配置可能需要根据你的WSL发行版和Windows版本进行调整。
Q3: Windows SSH的密码认证问题
1. 首次安装后的密码设置
Windows SSH服务使用Windows本地账户系统进行认证,具体说明:
-
默认密码:
- Windows SSH没有独立的默认密码
- 使用Windows用户账户的密码
- 本地账户使用Windows登录密码
- 域账户使用域密码
-
特殊情况 - Windows无密码账户:
- 即使Windows账户没有设置密码,SSH默认也不允许空密码登录
- 这是SSH服务的安全策略,与Windows登录策略无关
- 如果确实需要允许空密码登录(不推荐),需要:
- 修改SSH配置文件:
C:\ProgramData\ssh\sshd_config
- 设置:
PermitEmptyPasswords yes
- 重启SSH服务
- 修改SSH配置文件:
- 安全建议:
- 强烈建议不要允许空密码登录
- 即使Windows允许无密码登录,也应该为SSH访问设置密码
- 或使用SSH密钥认证替代密码认证
-
登录方式:
- 使用Windows用户名和对应密码
- 格式:
ssh username@hostname
- 例如:
ssh Administrator@localhost
2. 密码修改方法
有以下几种修改密码的方式:
-
通过Windows设置:
- 按 Win+I 打开设置
- 点击"账户"
- 选择"登录选项"
- 点击"密码"下的"更改"
-
通过命令提示符(管理员):
net user 用户名 新密码
- 通过PowerShell(管理员):
Set-LocalUser -Name "用户名" -Password (ConvertTo-SecureString -AsPlainText "新密码" -Force)
- 域账户密码:
- 在域控制器上修改
- 使用域管理工具
- 或按Ctrl+Alt+Del在本机修改
3. 密码规则
Windows密码策略通常包含以下要求:
-
默认策略:
- 最小长度:8个字符
- 必须包含以下四类中的三类:
- 大写字母 (A-Z)
- 小写字母 (a-z)
- 数字 (0-9)
- 特殊字符 (!@#$%等)
- 不能包含用户名
-
自定义策略:
- 通过本地安全策略修改
- 通过组策略修改(域环境)
- 可以设置:
- 最小密码长度
- 密码复杂度要求
- 密码历史记录
- 最短密码使用期限
- 最长密码使用期限
-
查看当前密码策略:
net accounts
4. 安全建议
-
密码最佳实践:
- 使用强密码
- 定期更改密码
- 不同账户使用不同密码
- 避免使用常见词组
-
建议配置:
- 启用密码复杂度要求
- 设置最小密码长度
- 启用密码历史记录
- 配置密码过期策略
-
更安全的方案:
- 使用SSH密钥认证替代密码认证
- 配置双因素认证
- 限制允许登录的IP地址
- 使用防火墙规则限制访问
Q4: 如何为SSH访问设置独立密码?
可以通过创建专用的SSH用户账户来实现SSH访问使用独立的密码,而不影响现有Windows登录密码。以下是具体步骤:
1. 创建专用SSH用户
- 使用管理员权限打开PowerShell,执行:
# 创建新用户
New-LocalUser -Name "sshuser" -Description "SSH专用账户" -NoPassword
# 设置密码
$Password = Read-Host -AsSecureString "输入SSH专用密码"
Set-LocalUser -Name "sshuser" -Password $Password
# 添加到Users组
Add-LocalGroupMember -Group "Users" -Member "sshuser"
- 限制用户权限(可选):
# 禁止本地登录
Set-LocalUser -Name "sshuser" -UserMayChangePassword $false -PasswordNeverExpires $true
2. 配置SSH服务
- 编辑SSH配置文件:
notepad C:\ProgramData\ssh\sshd_config
- 添加或修改以下配置:
# 允许特定用户
AllowUsers sshuser
# 禁止空密码
PermitEmptyPasswords no
# 密码认证设置
PasswordAuthentication yes
- 重启SSH服务:
Restart-Service sshd
3. 使用方法
- SSH连接命令:
ssh sshuser@hostname
- 修改SSH密码:
# 在Windows系统上执行
$Password = Read-Host -AsSecureString "输入新的SSH密码"
Set-LocalUser -Name "sshuser" -Password $Password
4. 安全建议
-
密码设置:
- 使用强密码(至少12位)
- 包含大小写字母、数字和特殊字符
- 避免使用个人信息相关内容
- 定期更换密码
-
账户安全:
- 限制SSH用户的系统权限
- 定期检查登录日志
- 考虑使用SSH密钥替代密码认证
- 设置登录失败次数限制
-
监控和维护:
- 定期检查SSH服务日志
- 监控异常登录尝试
- 及时更新系统和SSH服务
- 保持正确的文件权限
注意事项:
- 创建专用SSH用户可以更好地控制和监控SSH访问
- 建议定期更改SSH密码
- 如果不再需要SSH访问,可以禁用或删除专用账户
- 所有操作都需要管理员权限
Q5: 如何配置SSH密钥认证?
SSH密钥认证是一种比密码认证更安全的方式。以下是详细的配置步骤:
1. 生成SSH密钥对
在客户端电脑上打开PowerShell(可以按 Win+X 然后选择 Windows PowerShell 或 终端),然后执行:
# 使用ED25519(推荐)
ssh-keygen -t ed25519 -C "your_email@example.com"
# 或者使用RSA(如果需要更好的兼容性)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
例如:
ssh-keygen -t ed25519 -C "3300607756@qq.com"
系统会提示:
-
Enter file in which to save the key (C:\Users\你的用户名\.ssh\id_ed25519):
- 直接按回车,使用默认路径
-
Enter passphrase (empty for no passphrase):
- 可以设置一个密码短语(建议设置)
- 或直接按回车不设置密码
-
Enter same passphrase again:
- 如果设置了密码短语,再次输入确认
完成后会在 C:\Users\你的用户名\.ssh\
目录下生成两个文件:
id_ed25519
(私钥文件)id_ed25519.pub
(公钥文件)
2. 配置服务器端
- 以管理员身份打开PowerShell,创建认证密钥目录:
# 创建目录
mkdir C:\ProgramData\ssh\administrators_authorized_keys
- 复制公钥内容到授权文件:
# 将公钥内容添加到授权文件
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Out-File -Encoding utf8 C:\ProgramData\ssh\administrators_authorized_keys -Append
- 设置正确的文件权限:
# 设置文件权限
icacls C:\ProgramData\ssh\administrators_authorized_keys /inheritance:r /grant "NT AUTHORITY\SYSTEM:(F)" "BUILTIN\Administrators:(F)"
3. 修改SSH服务配置
- 用记事本打开SSH配置文件(以管理员身份):
notepad C:\ProgramData\ssh\sshd_config
- 在文件中找到或添加以下设置:
PubkeyAuthentication yes
AuthorizedKeysFile .ssh/authorized_keys C:/ProgramData/ssh/administrators_authorized_keys
- 重启SSH服务使配置生效:
Restart-Service sshd
4. 测试密钥认证
# 测试本地连接
ssh localhost
# 如果使用NATAPP,使用NATAPP提供的地址测试
ssh username@server.natappfree.cc -p <NATAPP分配的端口>
5. 禁用密码认证(可选)
确认密钥认证正常工作后,可以禁用密码认证提高安全性:
- 编辑SSH配置文件:
notepad C:\ProgramData\ssh\sshd_config
- 修改或添加:
PasswordAuthentication no
- 重启SSH服务:
Restart-Service sshd
安全建议
-
密钥保护:
- 私钥文件(
id_ed25519
)不要分享给任何人 - 建议为私钥设置密码短语
- 定期更换密钥对
- 私钥文件(
-
权限设置:
- 确保私钥文件只有所有者可以访问
- 确保公钥文件和授权文件的权限正确
-
配置管理:
- 备份私钥文件
- 记录已授权的公钥
- 定期审查授权密钥文件
常见问题解决
-
如果连接被拒绝:
- 检查公钥是否正确添加
- 验证文件权限
- 查看SSH服务日志
-
如果提示权限错误:
# 检查SSH服务日志
Get-EventLog -LogName Application -Source "OpenSSH*" -Newest 20
- 使用建议:
- 建议为私钥设置密码短语
- 定期备份私钥文件
- 可以在多台电脑上使用同一个密钥对
自动化脚本
Windows一键启动脚本
创建以下批处理脚本(保存为start_natapp.bat
):
@echo off
echo 正在启动内网穿透服务...
echo ==================================
:: 1. 启动WSL的SSH服务
echo [1/3] 启动WSL SSH服务...
wsl -d Ubuntu -u root service ssh start
if %errorlevel% neq 0 (
echo WSL SSH服务启动失败!
pause
exit /b 1
)
echo WSL SSH服务启动成功!
:: 2. 检查配置文件
echo [2/3] 检查NATAPP配置...
if not exist config.ini (
echo 错误:找不到config.ini文件!
echo 请确保config.ini与此脚本在同一目录。
pause
exit /b 1
)
:: 3. 启动NATAPP并保存输出
echo [3/3] 启动NATAPP服务...
echo ==================================
echo 正在获取映射地址,请稍候...
echo 如需退出请按Ctrl+C
echo ==================================
:: 创建日期时间戳
set datetime=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%%time:~3,2%%time:~6,2%
set datetime=%datetime: =0%
:: 运行NATAPP并将输出同时显示到屏幕和文件
natapp.exe 2>&1 | tee natapp_%datetime%.log
:: 如果NATAPP异常退出
if %errorlevel% neq 0 (
echo NATAPP运行出错!
echo 请检查配置文件和网络连接。
pause
exit /b 1
)
pause
使用说明:
- 将此脚本放在NATAPP程序(natapp.exe)所在目录
- 确保config.ini配置文件已正确设置
- 双击运行脚本即可
脚本功能:
- 自动启动WSL的SSH服务
- 检查必要的配置文件
- 启动NATAPP服务
- 将运行日志保存到文件(包含时间戳)
- 在控制台显示映射地址
- 错误处理和提示
注意事项:
- 需要有正确配置的config.ini文件
- WSL需要安装并配置好Ubuntu
- 首次运行可能需要管理员权限
- 日志文件会保存在脚本所在目录
使用实例
实例1:NATAPP连接信息解读
当你成功运行NATAPP后,会看到类似以下输出:
Powered By NATAPP Please visit https://natapp.cn
(Ctrl+C to Quit)
Tunnel Status Online
Version 2.4.0
Forwarding tcp://server.natappfree.cc:43098 -> 127.0.0.1:22
Web Interface http://127.0.0.1:4040
Total Connections 0
各项信息说明:
Tunnel Status: Online
- 表示隧道已成功建立Version: 2.4.0
- NATAPP客户端版本Forwarding
- 最重要的信息:tcp://server.natappfree.cc:43098
是公网访问地址-> 127.0.0.1:22
表示转发到本地的SSH端口
Web Interface
- NATAPP的Web管理界面地址Total Connections
- 当前连接数
使用方法:
-
记录公网访问地址:
- 域名:
server.natappfree.cc
- 端口:
43098
- 域名:
-
SSH连接命令示例:
ssh username@server.natappfree.cc -p 43098
如:
ssh yuuu@server.natappfree.cc -p 43098
注意事项:
- 每次启动NATAPP分配的端口可能不同
- 免费版的域名和端口会动态变化
- 付费版可以获得固定的域名和端口
实例2:SSH连接错误排查
当尝试SSH连接时,遇到以下错误:
root@server.natappfree.cc's password:
Permission denied, please try again.
这个错误表示SSH连接被拒绝,可能的原因:
-
密码错误:
- 确保输入的密码正确
- 注意大小写敏感
- 检查输入法状态
-
SSH配置问题:
- 检查
/etc/ssh/sshd_config
中的设置:PasswordAuthentication yes # 确保已启用密码认证 PermitRootLogin yes # 如果使用root登录,确保此项为yes
- 修改配置后需要重启SSH服务:
sudo service ssh restart
- 检查
-
权限问题:
- 确保用户账户存在且已激活
- 检查用户是否有登录权限
- 检查home目录权限
-
解决步骤:
a. 首先验证本地SSH服务是否正常:ssh localhost
b. 检查SSH配置文件权限:
sudo chmod 644 /etc/ssh/sshd_config
c. 检查并重置用户密码:
sudo passwd username # 替换为实际用户名
-
建议:
- 先使用非root用户测试连接
- 启用SSH日志查看详细错误信息:
sudo tail -f /var/log/auth.log
- 考虑使用SSH密钥认证替代密码认证
实例3:SSH首次连接主机验证
当首次通过SSH连接到NATAPP分配的地址时,会看到以下提示:
The authenticity of host '[server.natappfree.cc]:38823 ([112.74.89.58]:38823)' can't be established.
ED25519 key fingerprint is SHA256:xOY8J/zXf41EWrnpXF923mAfNg9Db/rboTpIauiNi9E.
This host key is known by the following other names/addresses:
C:\Users\yuuu/.ssh/known_hosts:5: localhost
C:\Users\yuuu/.ssh/known_hosts:8: [server.natappfree.cc]:43098
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
这个提示的含义:
-
安全验证:
- SSH客户端首次连接到新服务器时的安全验证机制
- 用于防止中间人攻击
- 显示服务器的密钥指纹供验证
-
提示信息解析:
- 主机地址:server.natappfree.cc:38823
- IP地址:112.74.89.58:38823
- 密钥类型:ED25519
- 密钥指纹:SHA256格式
-
known_hosts文件:
- 显示该主机密钥已被其他地址使用
- localhost:说明之前本地连接使用过
- 不同端口的natapp地址:因为每次启动端口会变化
-
处理方法:
- 首次连接时输入"yes"接受并保存密钥
- 密钥会被保存到 ~/.ssh/known_hosts 文件
- 后续连接如果密钥匹配则不会再提示
注意事项:
- 这是正常的SSH安全机制,首次连接都会出现
- 如果已知主机突然出现此提示,需要警惕可能的安全问题
- 使用NATAPP时,因为端口经常变化,这个提示会经常出现
- 可以通过配置SSH客户端来自动接受NATAPP域名的新密钥
实例4:SSH主机密钥变更警告
当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 ED25519 key sent by the remote host is
SHA256:88ZyVxlafbcF8Y4XxNIi/cGz6YrEenrrphg1xs3PqUc.
Please contact your system administrator.
Add correct host key in C:\Users\yuuu/.ssh/known_hosts to get rid of this message.
Offending ED25519 key in C:\Users\yuuu/.ssh/known_hosts:10
Host key for 127.0.0.1 has changed and you have requested strict checking.
Host key verification failed.
这个警告的含义和处理方法:
-
警告原因:
- SSH检测到目标主机的密钥与已保存的不匹配
- 可能是主机重新安装了SSH服务
- 可能是使用了不同的SSH服务(如从WSL切换到Windows SSH)
- 在使用NATAPP时,可能是因为重新启动服务导致
-
安全含义:
- 这是SSH的重要安全机制
- 用于防止中间人攻击
- 当主机密钥改变时发出警告
- 需要用户确认这个改变是预期的
-
警告信息解析:
- 主机标识已改变的警告
- 新的ED25519密钥指纹
- 问题密钥在known_hosts文件中的位置(第10行)
- 受影响的主机地址(127.0.0.1)
-
解决方法:
a. 如果确认是安全的(比如知道服务器刚重装),删除旧的密钥:
# 删除特定行的密钥(这里是第10行) sed -i '10d' ~/.ssh/known_hosts # 或者删除特定主机的所有密钥 ssh-keygen -R 127.0.0.1
b. 如果使用NATAPP,可以:
# 删除特定域名的所有密钥 ssh-keygen -R server.natappfree.cc # 或者编辑SSH配置文件放宽对NATAPP域名的验证 echo "Host server.natappfree.cc" >> ~/.ssh/config echo " StrictHostKeyChecking no" >> ~/.ssh/config
-
安全建议:
- 首次连接到新主机时要验证密钥指纹
- 对于固定服务器,密钥变化时要谨慎确认
- 对于NATAPP这类动态服务,可以适当放宽验证
- 定期备份known_hosts文件
- 如果在意外情况下看到此警告,需要警惕可能的安全问题
-
预防措施:
- 在重装SSH服务前备份主机密钥
- 使用配置管理工具统一管理主机密钥
- 记录服务器的密钥指纹以便验证
- 对重要服务器保持严格的密钥检查
注意事项:
- 不要盲目删除known_hosts中的记录
- 在公共网络环境要特别注意此类警告
- 如果不确定,先咨询系统管理员
- 可以使用ssh-keygen -l -f命令查看密钥指纹
实例5:手动配置SSH密钥认证(解决权限问题)
当使用PowerShell命令遇到权限问题时,可以通过手动操作文件系统来配置SSH密钥认证:
1. 准备工作
-
确保已经生成了SSH密钥对:
- 检查
C:\Users\你的用户名\.ssh\
目录下是否有id_ed25519.pub
文件 - 如果没有,请先按照前面的说明生成密钥对
- 检查
-
以管理员身份打开文件资源管理器:
- 按 Win+R 打开运行对话框
- 输入
explorer
- 按住 Ctrl+Shift+Enter 以管理员身份运行
2. 创建并设置授权文件
-
导航到SSH配置目录:
- 打开
C:\ProgramData\ssh\
目录 - 如果目录不存在,手动创建它
- 打开
-
创建授权文件:
- 在记事本中新建文件
- 复制
C:\Users\你的用户名\.ssh\id_ed25519.pub
文件的内容 - 将内容粘贴到新文件中
- 保存为
C:\ProgramData\ssh\administrators_authorized_keys
- 确保文件没有
.txt
扩展名
-
设置文件权限:
a. 右键点击administrators_authorized_keys
文件
b. 选择"属性"
c. 点击"安全"标签
d. 点击"高级"
e. 点击"禁用继承"
f. 选择"删除所有继承的权限"
g. 点击"添加"
h. 依次添加以下权限:- 主体:
SYSTEM
,权限:完全控制 - 主体:
Administrators
,权限:完全控制
i. 点击"应用"并确认所有更改
- 主体:
3. 验证配置
-
检查文件权限:
- 右键点击文件
- 属性 -> 安全
- 确保只有 SYSTEM 和 Administrators 有权限
-
重启SSH服务:
- 按 Win+R
- 输入
services.msc
- 找到 “OpenSSH SSH Server”
- 右键选择"重新启动"
-
测试连接:
ssh localhost
常见问题解决
-
如果文件扩展名问题:
- 在文件资源管理器中启用"文件扩展名"显示
- 确保文件名没有
.txt
后缀
-
如果权限设置失败:
- 确保使用管理员权限的文件资源管理器
- 尝试先删除文件,重新创建
-
如果仍然无法连接:
- 检查 SSH 服务是否正在运行
- 查看 Windows 事件查看器中的系统日志
- 确认公钥内容是否正确复制(没有多余的换行或空格)
安全注意事项
-
文件权限:
- 严格限制文件访问权限
- 定期检查权限设置是否被更改
-
内容验证:
- 确保复制的公钥内容完整
- 不要添加任何额外字符
- 每行公钥应该是单独的一行
-
备份建议:
- 保存原始公钥文件的备份
- 记录配置步骤以便将来参考
Windows SSH vs WSL SSH 对比
下表详细对比了Windows SSH和WSL SSH的主要区别:
对比方面 | Windows SSH | WSL SSH |
---|---|---|
架构实现 | • 作为原生Windows服务运行 • 使用Windows原生API和系统调用 • 完全集成到Windows服务管理框架 | • 在Linux子系统环境中运行 • 使用Linux系统调用和API • 遵循Linux服务管理模式 |
网络和端口 | • 直接绑定到Windows网络栈 • 默认监听所有网络接口的22端口 • 可以直接访问Windows网络资源 | • 通过WSL网络虚拟化层运行 • 在WSL网络命名空间中监听22端口 • 需要通过WSL网络转发才能从外部访问 |
文件系统访问 | • 只能直接访问Windows文件系统 • 使用Windows路径格式(C:\) • 受Windows文件权限控制 | • 可以访问WSL文件系统 • 可以通过/mnt访问Windows文件系统 • 使用Linux路径格式(/) • 同时支持Windows和Linux权限模型 |
权限和安全 | • 使用Windows用户账户和组 • 基于Windows ACL权限系统 • 集成Windows安全策略 | • 使用Linux用户和组 • 基于Linux权限模型(rwx) • 遵循Linux安全机制 |
适用场景 | • 需要直接访问Windows资源 • 管理Windows服务器 • 与Windows特定工具集成 | • Linux开发环境访问 • 运行Linux工具和命令 • 需要Linux特性的场景 |
配置管理 | • 配置文件位于Windows系统目录 • 通过Windows服务管理工具管理 • 使用Windows事件日志 | • 配置文件在/etc/ssh/目录 • 通过Linux service命令管理 • 使用Linux系统日志 |
性能特点 | • 直接运行在物理机上 • 较低的系统开销 • 原生性能表现 | • 运行在WSL层之上 • 可能有轻微的性能开销 • 受WSL架构影响 |
维护和故障排查 | • 使用Windows工具进行诊断 • 通过Windows日志查看问题 • Windows风格的错误处理 | • 使用Linux工具进行诊断 • 通过Linux日志系统排查 • Linux风格的错误处理 |
潜在冲突 | • 默认占用22端口 • 可能与WSL SSH冲突 • 需要配置Windows防火墙 | • 默认占用22端口 • 可能与Windows SSH冲突 • 需要配置WSL网络转发 |
选择建议
-
选择Windows SSH如果:
- 主要在Windows环境下工作
- 需要管理Windows服务器
- 需要与Windows特定工具集成
- 对原生性能有较高要求
-
选择WSL SSH如果:
- 主要进行Linux开发
- 需要完整的Linux环境
- 需要使用Linux特定工具
- 习惯Linux的工作方式
-
最佳实践:
- 避免同时运行两个SSH服务
- 根据主要使用场景选择合适的实现
- 注意端口冲突和网络配置
- 定期更新和维护所选的SSH服务
Windows SSH服务配置指南
本节详细介绍如何在Windows系统中安装、配置和使用SSH服务。
1. 安装SSH服务
Windows 10和Windows Server 2019及更高版本原生支持SSH服务。有两种安装方式:
方式一:通过设置安装
- 打开Windows设置
- 点击"应用"
- 点击"可选功能"
- 点击"添加功能"
- 搜索并选择:
- “OpenSSH 服务器”
- “OpenSSH 客户端”(可能已预装)
- 点击"安装"
方式二:通过PowerShell安装
以管理员身份运行PowerShell,执行以下命令:
# 检查SSH服务状态
Get-WindowsCapability -Online | Where-Object Name -like 'OpenSSH*'
# 安装SSH服务器
Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
# 安装SSH客户端(如果需要)
Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
2. 配置SSH服务
2.1 启动SSH服务
以管理员身份运行PowerShell,执行:
# 启动SSH服务
Start-Service sshd
# 设置自动启动
Set-Service -Name sshd -StartupType 'Automatic'
# 确认防火墙规则
if (!(Get-NetFirewallRule -Name "OpenSSH-Server-In-TCP" -ErrorAction SilentlyContinue | Select-Object Name, Enabled)) {
New-NetFirewallRule -Name 'OpenSSH-Server-In-TCP' -DisplayName 'OpenSSH Server (sshd)' -Enabled True -Direction Inbound -Protocol TCP -Action Allow -LocalPort 22
}
2.2 配置SSH服务
SSH服务的配置文件位于:C:\ProgramData\ssh\sshd_config
- 备份原配置:
Copy-Item "C:\ProgramData\ssh\sshd_config" "C:\ProgramData\ssh\sshd_config.bak"
- 编辑配置文件(使用记事本或PowerShell ISE):
notepad C:\ProgramData\ssh\sshd_config
主要配置项说明:
# 端口设置(默认22)
Port 22
# 允许密码认证
PasswordAuthentication yes
# 允许公钥认证
PubkeyAuthentication yes
# 允许root/管理员登录
PermitRootLogin yes
# 空密码限制
PermitEmptyPasswords no
# 最大认证尝试次数
MaxAuthTries 6
# 客户端保活设置
ClientAliveInterval 120
ClientAliveCountMax 3
- 修改配置后重启服务:
Restart-Service sshd
3. SSH密钥配置
3.1 生成SSH密钥
# 生成新的SSH密钥对
ssh-keygen -t ed25519 -C "your_email@example.com"
# 或使用RSA(如果需要更广泛的兼容性)
ssh-keygen -t rsa -b 4096 -C "your_email@example.com"
3.2 配置授权密钥
- 创建授权密钥文件:
# 创建.ssh目录(如果不存在)
mkdir ~\.ssh
# 创建授权密钥文件
New-Item -Path ~\.ssh\authorized_keys -ItemType File
- 添加公钥到授权文件:
# 将公钥内容添加到authorized_keys
Add-Content ~\.ssh\authorized_keys "ssh-ed25519 AAAA..."
4. 使用SSH服务
4.1 基本命令
- 连接到远程服务器:
# 使用密码认证
ssh username@hostname
# 使用指定端口
ssh username@hostname -p 2222
# 使用密钥认证
ssh -i C:\path\to\private_key username@hostname
- 文件传输:
# 从远程复制到本地
scp username@hostname:/path/to/remote/file C:\local\path
# 从本地复制到远程
scp C:\local\file username@hostname:/remote/path
4.2 SSH配置文件
在 %UserProfile%\.ssh\config
创建配置文件:
# 默认设置
Host *
ServerAliveInterval 60
ServerAliveCountMax 3
# 特定服务器设置
Host myserver
HostName server.example.com
User myusername
Port 2222
IdentityFile C:\path\to\private_key
5. 服务管理
5.1 查看服务状态
# 查看服务状态
Get-Service sshd
# 查看详细信息
Get-Service sshd | Select-Object *
5.2 启动和停止服务
# 启动服务
Start-Service sshd
# 停止服务
Stop-Service sshd
# 重启服务
Restart-Service sshd
5.3 查看日志
# 查看SSH服务日志
Get-EventLog -LogName Application -Source "OpenSSH*" -Newest 20
6. 安全建议
-
基本安全配置:
- 禁用密码认证,使用密钥认证
- 更改默认端口(可选)
- 限制登录尝试次数
- 配置防火墙规则
-
配置示例:
# 禁用密码认证
PasswordAuthentication no
# 禁用空密码
PermitEmptyPasswords no
# 禁用root登录
PermitRootLogin no
# 限制登录尝试
MaxAuthTries 3
# 使用强密钥算法
KexAlgorithms curve25519-sha256@libssh.org,diffie-hellman-group-exchange-sha256
- 文件权限设置:
# 设置配置文件权限
icacls "C:\ProgramData\ssh\sshd_config" /inheritance:r /grant "NT AUTHORITY\SYSTEM:(F)" "BUILTIN\Administrators:(F)"
7. 故障排查
-
常见问题:
- 连接被拒绝
- 认证失败
- 服务无法启动
- 端口冲突
-
排查步骤:
a. 检查服务状态:Get-Service sshd
b. 检查防火墙:
Get-NetFirewallRule -Name *OpenSSH*
c. 检查端口占用:
netstat -ano | findstr :22
d. 查看详细日志:
Get-EventLog -LogName Application -Source "OpenSSH*" -Newest 20
-
解决方案:
- 重置服务配置
- 清理并重新生成主机密钥
- 检查文件权限
- 验证网络连接
8. 关闭SSH服务
- 临时关闭:
Stop-Service sshd
- 禁用自动启动:
Set-Service -Name sshd -StartupType 'Disabled'
- 完全卸载:
# 卸载SSH服务器
Remove-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
# 卸载SSH客户端(如果需要)
Remove-WindowsCapability -Online -Name OpenSSH.Client~~~~0.0.1.0
- 清理配置:
# 删除SSH文件夹(可选)
Remove-Item -Path "C:\ProgramData\ssh" -Recurse -Force
远程ssh之后,可以使用vscode远程链接代码,并且可以通过路径设置为mnt/来远程到win的系统