ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

openKylinx SSH服务安装配置全攻略:从入门到远程开发

openKylinx SSH服务安装配置全攻略:从入门到远程开发 不管你是刚从Windows转过来还是已经在Linux下折腾过一段时间只要手里有一台装好openKylinx的机器十有八九会遇到同一个需求怎么从笔记本上远程连过去操作。openKylinx默认不会主动把SSH服务打开装完系统后你在终端里执行systemctl status ssh大概率看到的是Unit not found。这篇文章就是围绕openKylinx下SSH服务的完整安装配置展开的从安装openssh-server、启动守护进程、修改sshd_config、放行防火墙到配置密钥免密登录、用VSCode做远程开发一步一步走通。可以说SSH配置是Linux运维里绕不开的坎也是后面装MySQL、Redis、Nacos这些服务的基础只要你想让一台机器真正变成“远程可管理”的状态就得先把这条链路搞顺。我这里标题写了v0.2.0算是这个配置流程的第二次修订版。第一次写的时候只覆盖了安装和密码登录后来在实际使用中踩了不少坑比如密钥权限、防火墙拦截、客户端连接超时这些在初版里都没提。这次一并补上目录结构也做了调整适合纯新手照着敲也适合老手直接翻到后面的排查章节找答案。1. 动手前的准备工作先确认你的环境1.1 确认系统版本和网络状态不管你是刚从官网下载的ISO装的还是拿别人给的镜像部署的第一步永远是先确认系统的真实情况。openKylinx这种基于Debian系改造的系统很多操作路径和Ubuntu类似但版本差异会直接影响软件源的配置方式所以不要跳过这一步。lsb_release -a cat /etc/os-release uname -a三条命令配合使用能快速确认系统版本、内核信息以及是x86_64还是ARM架构。这里特别说明一下在云主机或者开发板上装openKylinx的人很多架构不同后续下载的软件包也不同。比如树莓派上跑的系统是aarch64版本装SSH服务时apt会自动匹配对应架构的包这个倒不用太担心但你自己心里要有数后面配置VSCode远程连接时选择平台会用到。网络状态可以用ping和ip addr来查。ping网关或者ping mirrors.aliyun.com这种外网地址主要确认机器能不能访问软件源。如果ping不通先去检查网线、WiFi或者云主机的安全组规则这个问题不解决后面apt update会一直报错所有安装都无从谈起。1.2 建议先换源再动手用默认软件源安装比较慢很多情况下还会出现连接超时。我个人的习惯是拿到新系统先把源换成国内镜像源这样后面安装任何软件都会快很多。先备份原始源文件这个习惯建议所有人养成sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak然后编辑源文件把里面的地址替换成可用的镜像地址。openKylinx的源格式和Debian系一致具体替换成哪个镜像源要根据你所在的网络环境来选阿里云、清华源都是常用的选择。这里重点提醒一句换源后一定要执行sudo apt update刷新索引如果报错就仔细看报错信息多半是地址写错了或者源格式不对。注意有些精简版系统可能没装vim或nano如果提示找不到命令可以先执行sudo apt install -y vim装上编辑器或者直接用sed做替换。2. 安装SSH服务端一条命令的事但别忽略细节2.1 安装openssh-server与openssh-clientSSH分客户端和服务端两部分。客户端负责发起连接服务端负责接收连接。你平时在终端里执行ssh userhost用的就是客户端工具这个一般系统自带。但要让别人能连上你的机器必须装服务端。sudo apt update sudo apt install -y openssh-server openssh-client把openssh-client也装上没有坏处有些精简镜像只装了服务端没装客户端导致本机无法ssh到其他机器排查起来很迷惑。安装过程一般几十秒到几分钟取决于网络速度。如果系统提示Unable to locate package openssh-server说明软件源索引太旧先执行sudo apt update再装。装完之后先别急着连在本机验证一下服务端是否正常工作。ssh localhost这个命令会尝试连接本机的SSH服务如果提示输入密码或者直接进入取决于是否配置了密钥说明服务已经起来了。如果提示Connection refused说明服务端没起来或者端口不对继续往下看。2.2 启动服务、设开机自启、验证监听端口Debian系系统里SSH服务的systemd单元名通常是ssh有些版本也叫sshd保险起见两个都试试。sudo systemctl start ssh sudo systemctl enable ssh sudo systemctl status ssh如果systemctl status ssh提示Unit not found就试试sshdsudo systemctl start sshd sudo systemctl enable sshdenable的作用是设置开机自启这步很重要。很多人的SSH服务当时能用重启机器后就再也连不上了排查到最后才发现是忘了开机自启。再确认一下端口监听状态sudo ss -tlnp | grep 22看到一个状态为LISTEN、进程名为sshd的条目就说明服务端已经在22端口上监听了。有些系统可能启用了IPv6能看到:::22这个地址这表示IPv6和IPv4同时监听没有问题。3. 核心配置sshd_config里那些影响安全和易用性的参数3.1 端口、监听地址与协议版本SSH服务端的所有核心行为都集中在/etc/ssh/sshd_config文件里。默认配置足够安全但不一定好用需要根据你的实际场景来调整。修改之前还是先备份sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak然后打开配置文件开始编辑。先说端口。默认端口是22这个端口在公网环境下会被各种扫描工具轮番探测。如果你只是在内网用用默认端口问题不大如果是公网服务器建议改成高位端口比如Port 2222能少很多无意义的爆破尝试。改完端口后连接时要带上-p参数ssh -p 2222 userhost监听地址这块默认ListenAddress 0.0.0.0表示所有网卡都监听。如果你只想让某个内网网卡被访问可以指定IPListenAddress 192.168.1.100这样其他网卡上的请求就不会被SSH服务接收到一定程度上减少了暴露面。3.2 登录认证策略密码、Root、密钥该怎么设置认证策略是sshd_config里最值得花时间理解的部分我拆开来讲。PermitRootLogin控制是否允许root用户直接通过SSH登录。这个参数有几个可选值yes允许root密码登录最方便也最危险no禁止root登录需要用普通用户登录后再su切到rootprohibit-password禁止root用密码登录但允许密钥登录我推荐的折中方案如果你是个人开发机平时图省事可以设置成prohibit-password配好密钥后root也能免密登录安全性和便利性兼顾。PasswordAuthentication控制是否允许密码登录。默认是yes。如果你想严格一点在配好密钥之后可以改成no只允许密钥登录。但这里有个重要提醒如果你在远程操作改完这个参数后一定要保持当前会话不要断开新开一个窗口测试密钥登录没问题后再关掉旧会话否则一旦配置有问题你就被锁在门外了。MaxAuthTries限制单次连接的最大认证尝试次数默认是6建议改成3减少暴力破解的风险。AllowUsers白名单机制只允许指定用户登录AllowUsers alice bob不在列表里的用户即使密码正确也无法登录这在多人共用的服务器上非常实用。3.3 改完配置后的重载与检查每次修改sshd_config不要直接重启服务先检查语法sudo sshd -t没有任何输出就说明语法没问题。然后重载服务sudo systemctl reload sshreload和restart的区别在于reload只重新加载配置文件不会断开现有连接restart会把当前所有SSH会话全部踢下线。如果你正在远程修改配置务必用reload否则改到一半把自己断开了就很尴尬。如果改完配置后怎么也连不上先看日志sudo journalctl -u ssh --since today sudo tail -f /var/log/auth.log认证失败的记录、配置错误的原因在日志里一般都能看到。4. 防火墙放行与局域网访问让远程真正走通4.1 用ufw放行SSH端口服务端装好、配置也改好了结果从另一台机器一连接就卡住不动最后超时十有八九是防火墙拦住了。openKylinx默认不一定装了防火墙但很多人会在装完系统后自己装个ufw这时候就得手动放行。先检查防火墙状态sudo ufw status如果显示inactive说明防火墙没启用那基本可以排除防火墙问题。如果显示active则执行sudo ufw allow 22/tcp如果你改了SSH端口比如改成2222那就放行对应端口sudo ufw allow 2222/tcp这里有个很容易踩的坑如果开了防火墙但忘了放行SSH端口当你启用防火墙的瞬间当前SSH连接不会断但断线后你就再也连不上了。所以我建议在操作防火墙规则时保持一个本地终端窗口出了问题还能回到机器前面处理。4.2 内网IP绑定与静态地址建议防火墙放行之后从同一台路由器下的其他机器应该能连上了。如果依然连不上检查两台机器是不是在同一个网段。用ip addr看自己的IP地址用ping 目标机器IP看能不能通。如果ping不通可能是跨了网段或者路由器做了AP隔离。局域网环境里还涉及一个很现实的问题IP地址可能会变动。如果机器是通过DHCP获取IP路由器重启后IP可能就变了这时候你就没法用旧IP连上去了。两个解决办法在路由器后台给这台机器的MAC地址绑定一个固定IP在系统里直接配置静态IP我个人更推荐在路由器里做DHCP静态绑定因为系统层面改静态IP容易把网络配置搞坏尤其是新手一旦配置错误可能直接断网恢复起来比绑定麻烦多了。提示无论用哪种方式确认你的SSH连接目标是固定IP后再进入下一步配置密钥登录不然IP一变你前面配的所有东西都要重新来一遍。5. 免密登录配置从密码到密钥一次搞定5.1 生成密钥对与公钥分发每次登录都输密码确实烦而且密码在网络上传输理论上存在被中间人截获的风险。密钥认证则安全得多客户端持有私钥服务端保存公钥认证过程靠数学算法完成私钥永远不出客户端机器。在客户端也就是你的笔记本上生成密钥对ssh-keygen -t ed25519 -C your_emailexample.com-t ed25519指定密钥类型Ed25519是目前安全性和性能都不错的算法生成的密钥短、速度快。如果你的客户端或者服务器比较老不支持Ed25519可以退回到RSAssh-keygen -t rsa -b 4096生成过程中会提示你设置私钥口令passphrase这是给私钥加的一道锁即使私钥文件泄露了没有口令也无法使用。我建议设一个虽然每次连接时要输一次口令但换来的是额外的安全性。如果觉得麻烦也可以留空看个人取舍。生成完成后会得到两个文件私钥~/.ssh/id_ed25519和公钥~/.ssh/id_ed25519.pub。接下来把公钥放到服务器上ssh-copy-id -p 22 userserver_ip这个命令会自动把公钥追加到服务器的~/.ssh/authorized_keys文件中并设置好权限。执行时需要输入一次服务器密码之后就再也不用输了。如果你的系统没有ssh-copy-id也可以手动操作把公钥内容复制下来在服务器上执行mkdir -p ~/.ssh chmod 700 ~/.ssh echo 粘贴你的公钥内容 ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys公钥文件权限必须正确否则服务端会拒绝使用这个密钥。5.2 客户端权限问题bad owner or permissions的完美解决密钥认证报错里最有名的一条莫过于Bad owner or permissions on C:\Users\thinkpad/.ssh/config。这个问题在Windows上特别常见因为从Windows商店或Git Bash里生成的.ssh目录权限继承关系复杂SSH客户端检查权限时发现当前用户不是唯一所有者就会拒绝读取配置。解决办法有两个。方法一图形界面修复找到C:\Users\你的用户名\.ssh文件夹右键点击config文件或私钥文件-属性-安全-高级。点击“禁用继承”选择“将已继承的权限转换为此对象的显式权限”。然后删除列表里的所有用户只保留当前用户再点击“添加”给当前用户授予“完全控制”权限。确定保存后重新执行SSH连接。方法二命令行修复打开PowerShell或CMD执行icacls C:\Users\你的用户名\.ssh\config /inheritance:r icacls C:\Users\你的用户名\.ssh\config /grant:r %USERNAME%:F cd C:\Users\你的用户名\.ssh icacls id_ed25519 /inheritance:r icacls id_ed25519 /grant:r %USERNAME%:F icacls authorized_keys /inheritance:r icacls authorized_keys /grant:r %USERNAME%:F/inheritance:r表示移除所有继承权限/grant:r表示替换现有权限并给当前用户完全控制。这两条命令组合使用基本能解决90%的Windows权限问题。Linux客户端也会遇到类似问题修复方式更简单chmod 700 ~/.ssh chmod 600 ~/.ssh/config ~/.ssh/id_ed25519 ~/.ssh/authorized_keys注意私钥文件的权限必须严格为600或400如果把权限设置成777SSH客户端会直接拒绝加载该私钥。6. 常见故障排查远程连不上时按这个顺序查6.1 服务端先自查连接不上不要慌按顺序排查绝大多数问题都能定位。第一确认服务状态。登录到机器前或者通过物理终端执行sudo systemctl status ssh看到active (running)说明服务正常运行看到failed说明服务启动失败用journalctl -u ssh --since today看具体报错。第二确认端口监听。执行sudo ss -tlnp | grep 22如果没有任何输出说明sshd进程没有监听端口检查配置文件语法sudo sshd -t。第三确认防火墙。执行sudo ufw status如果防火墙开启且没有放行SSH端口立刻放行。6.2 客户端和网络侧检查服务端一切正常但客户端还是连不上这时把排查重点转移到网络。在客户端执行ping 服务器IPping不通说明网络不通检查网段、路由器、物理链路。执行telnet 服务器IP 22Windows下需要先安装telnet客户端如果能连上但卡住不动说明服务端SSH进程响应异常如果提示无法连接说明端口不通回到防火墙排查。这里补充一个常见的坑如果你修改了SSH端口但连接时忘记加-p参数客户端默认走22端口会直接Connection refused。很多人在自己机器上改了端口过几天就忘了用默认端口去连怎么都连不上。把这个写进你的连接命令别名里避免踩坑。6.3 权限与配置文件语法问题如果看到Permission denied (publickey,password)说明认证过程失败了。排查顺序密码是否输错注意大小写和特殊字符服务器上/etc/ssh/sshd_config里PasswordAuthentication是否为yesroot登录时检查PermitRootLogin是否允许密钥登录时检查公钥是否在~/.ssh/authorized_keys里且权限是否正确如果看到Bad owner or permissions参考5.2小节的修复方法。如果登录后立刻被断开看服务器日志/var/log/auth.log里面会明确写着认证失败的具体原因比如User xxx from x.x.x.x not allowed because not listed in AllowUsers这种一眼就能看出是白名单没加。下面这张表总结了最常见的几种现象和对应排查路径建议收藏现象大概率原因排查方向Connection refused服务未启动 / 端口号不对systemctl status sshss -tlnpConnection timed out防火墙拦截 / 跨网段 / IP不通pingufw statustelnet IP 端口Permission denied (password)密码错误 / PasswordAuthentication no确认密码sshd_configPermission denied (publickey)公钥未部署 / 密钥权限问题authorized_keys客户端私钥权限Bad owner or permissionsWindows客户端权限继承问题icacls修复登录后立即断开sshd_config语法错误 / AllowUsers限制sshd -ttail /var/log/auth.log6.4 自动化工具连不上怎么办不少人在配置Jenkins、Git、Ansible这类工具时会遇到类似jenkins ssh java.lang.IllegalStateException: Connection is not established!的报错。这种情况一般是两个原因一个是认证方式不对工具进程用的不是交互式密码而是密钥需要把私钥路径和端口正确配置到工具里另一个是并发连接数超限sshd有最大未认证连接数限制参数是MaxStartups默认10:30:100如果有很多工具同时发起连接可以适当调高。还有人在Windows下用plink做自动化登录plink是命令行SSH客户端不支持交互式密码输入场景下的某些sudo操作。如果脚本里要plink -ssh userhost sudo命令记得加上-t参数分配伪终端否则sudo会提示no tty present。7. 从终端到IDEVSCode远程开发配置7.1 VSCode Remote-SSH的基本用法SSH服务配置完成后远程开发的第一步就跨过去了。现在很多开发者都习惯用VSCode的Remote-SSH插件直接在本地IDE里操控远程机器上的代码无需在服务器上装完整的图形界面。操作很简单本地VSCode安装Remote-SSH插件然后按下CtrlShiftP输入Remote-SSH: Connect to Host选择或输入userhostVSCode会自动在远程机器上下载安装一个服务端组件然后打开远程窗口左侧的资源管理器、终端都指向远程环境。第一次连接时VSCode需要在远程机器上安装.vscode-server组件如果网络不好或者下载失败窗口会卡在Setting up SSH Host这个提示上。解决办法是手动下载对应的tar.gz包放到远程机器上解压到~/.vscode-server/bin/commit-id/目录。commit-id在连接日志里能看到对应版本号也可以在VSCode的关于页查到。7.2 配置文件里的Host条目怎么规划当你管理多台机器时每次连接都输userhost太麻烦推荐把连接信息写进~/.ssh/config文件。这个文件同时被SSH客户端和VSCode使用规划好了能省很多事。Host dev HostName 192.168.1.100 User ubuntu Port 2222 IdentityFile ~/.ssh/id_ed25519 Host raspberry HostName 192.168.1.50 User pi Port 22 IdentityFile ~/.ssh/id_ed25519配置好之后直接ssh dev就能连上开发机ssh raspberry连树莓派。VSCode的Remote-SSH也会自动识别这些配置在连接列表里直接显示dev和raspberry。另外SSH配置里还支持很多高级玩法比如Host *通配符配置所有机器的公共参数禁止密码登录、连接超时时间等配合ControlMaster实现连接复用。用过一次之后你会觉得之前在终端里反复敲长串命令的日子白过了。最后说一个我自己的使用习惯。配好SSH服务后我还是会在本机留一个root登录的密钥备份并且把密码登录关掉。这样既不用担心密码被爆破也不用为了远程操作频繁输密码偶尔在别的电脑上临时连一下就用带口令的私钥文件。这套模式用了很久几乎没掉过链子算是比较稳妥的收尾配置。
返回列表