ssh连接linux

本来想想ssh连接linux没有很复杂,但是多次扮演“技术支持”的角色之后发现原来里面还是有不少坑的。这篇文章目的是希望能把这件简单的事情所涉及的步骤整理并知识结构体系化。因为以下命令都需要进入到linux服务器环境中执行,所以主要用于解决火眼仿真linux后无法使用网探连接的问题。

1. 基础知识:linux服务器的主要2大派系

看到这个标题希望各种用Arch的大神不要拍死我。事实上linux发行版众多,派系而言远远不止2个。但是本文主要针对于debian和redhat两大派系讲的。因为在生产服务器市场很难找到以opensuse或者Arch之类的。
debian系最主要的特征是apt和dpkg两个命令。apt全称为Advanced Package Tool,用于软件的安装与卸载,最常用的命令就是apt-get install 包名。dpkg全称为Debian Package,dpkg是一个比apt更为底层的包管理工具,我最经常用的比如dpkg -l列出所有已安装的包或者是dpkg -i 本地deb包路径安装本地包。根据distrowatch显示,目前已知基于debian并且存活的linux发行版大概有137个,比较出名的有:ubuntu,Mint,kali,deepin,deft linux.
对应于debian系的apt和dpkg命令,redhat系发行版有yum和rpm命令。其功能和命令行参数几近类似。yum全称为 Yellowdog Updater, Modified。但是值得一提的是,yum基于python的一个扩展库,这就导致一个很明显的问题是系统自带yum依赖的那个python版本不能动,不能升级也不能降级,否则很容易导致yum不能正常工作。其解决方案是用dnf代替yum.yum和rpm常用功能很简单,不会时直接百度就好了。与redhat一家的还有:centos和fedora.具体三者区别参考于:https://linux-audit.com/difference-between-centos-fedora-rhel

2. 基础知识:了解服务器基本信息

我为什么要花这么长时间去讲linux的两大派系呢?当遇到我们尝试ssh连接目标服务器时,首先需要知道目标是属于哪个发行版以及包管理方法。这对无论是遇到问题寻求解决方案还是后续执行命令都是有帮助的。一般情况下我们可以寻求于 /etc/os-releaseuname命令。可以看到详细的发行版名称,版本号,linux内核版本号。这样当后续遇到任何问题无论是网上搜索还是寻求别人帮助都会方便很多。
下图是Ubuntu的执行结果:

spring@Ubuntu:~$ cat /etc/os-release 
NAME="Ubuntu"
VERSION="18.04.1 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.1 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
spring@Ubuntu:~$ uname -m # x86_64代表64位系统
x86_64
spring@Ubuntu:~$ uname -r # linux内核版本号
4.15.0-33-generic

下图是CentOS的执行结果:

[spring@localhost ~]$ cat /etc/os-release 
NAME="CentOS Linux"
VERSION="7 (Core)"
ID="centos"
ID_LIKE="rhel fedora"
VERSION_ID="7"
PRETTY_NAME="CentOS Linux 7 (Core)"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:centos:centos:7"
HOME_URL="https://www.centos.org/"
BUG_REPORT_URL="https://bugs.centos.org/"

CENTOS_MANTISBT_PROJECT="CentOS-7"
CENTOS_MANTISBT_PROJECT_VERSION="7"
REDHAT_SUPPORT_PRODUCT="centos"
REDHAT_SUPPORT_PRODUCT_VERSION="7"
[spring@localhost ~]$ uname -m # x86_64代表64位系统
x86_64
[spring@localhost ~]$ uname -r  # linux内核版本号
3.10.0-862.el7.x86_64

3.检查ssh服务是否安装

当我们意识到通过常规ssh命令无法正常连接服务器时,首先考虑的第一个问题是服务器是否安装了ssh服务。其包名都为 openssh-server
debian系检查ssh服务是否安装如下图:

spring@Ubuntu:~$ dpkg -l | grep "openssh-server"
ii  openssh-server   1:7.6p1-4        amd64        secure shell (SSH) server, for secure access from remote machines

redhat系检查ssh服务是否安装如下图:

[spring@localhost ~]$ rpm -qa | grep "openssh-server"
openssh-server-7.4p1-16.el7.x86_64

如果如上图显示,说明ssh服务已经安装。否则可分别使用sudo apt-get install openssh-server或者sudo yum install openssh-server安装。

4.检查ssh服务是否启动

在确保ssh服务已经安装的情况下,下面需要检查ssh服务是否已经启动。此时需要注意一点时,在debian系中ssh服务的名称就叫ssh,在redhat中ssh服务名叫sshd
debian系检查ssh服务是否已经启动(注意这里可以看到监听的端口号是0.0.0.0:22):
如果服务未启动则需要执行sudo service ssh start来启动ssh服务。

spring@Ubuntu:~$ service ssh status
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2021-09-08 21:42:37 CST; 10h ago
 Main PID: 5203 (sshd)
    Tasks: 1 (limit: 3502)
   CGroup: /system.slice/ssh.service
           └─5203 /usr/sbin/sshd -D

Sep 08 21:42:37 Ubuntu systemd[1]: Starting OpenBSD Secure Shell server...
Sep 08 21:42:37 Ubuntu sshd[5203]: Server listening on 0.0.0.0 port 22. 
Sep 08 21:42:37 Ubuntu sshd[5203]: Server listening on :: port 22.
Sep 08 21:42:37 Ubuntu systemd[1]: Started OpenBSD Secure Shell server.

在redhat系中则执行以下命令来检查ssh服务状态(同样可以看到监听的端口号是0.0.0.0:22):
如果服务未启动则考虑执行sudo service sshd start

[spring@localhost ~]$ service sshd status
Redirecting to /bin/systemctl status sshd.service
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2021-09-08 21:07:10 CST; 11h ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 1096 (sshd)
   CGroup: /system.slice/sshd.service
           └─1096 /usr/sbin/sshd -D

Sep 08 21:07:10 localhost.localdomain systemd[1]: Starting OpenSSH server daemon...
Sep 08 21:07:10 localhost.localdomain sshd[1096]: Server listening on 0.0.0.0 port 22.
Sep 08 21:07:10 localhost.localdomain sshd[1096]: Server listening on :: port 22.
Sep 08 21:07:10 localhost.localdomain systemd[1]: Started OpenSSH server daemon.

较新的Linux发行版本(比如Ubuntu16.04或者CentOS7)开始,均采用systemctl代替service做服务管理。
比如systemctl status ssh可以检查当前ssh服务状态,使用systemctl start ssh开启服务。

spring@spring-virtual-machine:~$ systemctl status ssh
● ssh.service - OpenBSD Secure Shell server
   Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
   Active: active (running) since 四 2022-06-30 22:20:44 CST; 24h ago  Process: 999 
           ExecReload=/bin/kill -HUP $MAINPID (code=exited, status=0/SUCCESS)
  Process: 994 ExecReload=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
  Process: 869 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS) Main PID: 878 (sshd)   CGroup: /system.slice/ssh.service
           └─878 /usr/sbin/sshd -D

5.检查ssh配置文件

其实当走完第四步之后已经能解决大部分的ssh连接问题,但是事实上还是有一些犯罪嫌疑人比较谨慎,下面主要说ssh的主要配置项,一般位于 /etc/ssh/sshd_config位置。此刻最好加上sudo权限。

#Port 22  # 默认监听端口号是22
#ListenAddress 0.0.0.0  #0.0.0.0代表外网可以连入,如果是127.0.0.0代表只能本机用
#PasswordAuthentication yes
#PermitRootLogin prohibit-password

划重点,从上面我们可以知道默认ssh服务监听在0.0.0.0:22,这项一般不用修改。
PasswordAuthentication用于表示是否允许以密码的方式验证,有yesno两种值。从运维的角度来说强烈建议改成no,从技术支持的角度来说强烈建议改成yes
重点要讲的是PermitRootLogin。用于表示是否允许root登陆,有以下几种值:yes, prohibit-password, without-password, forced-commands-only, no。当值为yes时,代表允许root以密码验证方式登陆。当值为prohibit-password或者without-password时表示允许root登陆但是不允许以密码验证方式,比如可以通过ssh_host_rsa_key证书方式登陆。当值为forced-commands-only时表示允许root登陆但是仅能执行指定命令。当值为no时代表不允许root登陆。从运维的角度来说强烈建议改成no,从技术支持的角度来说强烈建议改成yes
当对上面的值进行修改了之后记得执行sudo service reload sshd或者sudo service reload ssh用以生效。

6.检查防火墙

如果认真讲Linux中防火墙的故事可以值得单独写一篇文章,其防火墙经历了iptables->nftables,命令行也产生了眼花缭乱的iptables/ufw/firewall-cmd等。这篇文章并不详细讲述上述故事。在我接触的经验中,只有一次碰到用防火墙拦截ssh端口的事情。犯罪嫌疑人通过iptables禁用了所有连入端口,只开放80的web服务器端口,以及经过nat转发之后的ssh端口。
从技术支持的角度来说,直接sudo /sbin/iptables -F删除所有规则就好了。

这篇文章对ssh连接linux做了较为详细的总结,应该可以应付大部分的情况。
当然这并不是全部,比如前一期季刊我投稿的《记一次pam后门分析》讲述的pam规则其实也是ssh认证的一环。
总之,linux的学习和实践任重而道远。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,454评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,553评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,921评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,648评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,770评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,950评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,090评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,817评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,275评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,592评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,724评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,409评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,052评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,815评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,043评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,503评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,627评论 2 350

推荐阅读更多精彩内容