笔记:SSH更改端口、禁用密码、使用密钥登陆

  1. 更改端口(范围:1~65535)
    比如更改为22222,首先需要查看22222端口是否开放。
    有多种方式:

    lsof -i:22222 # 必须以root用户执行
    netstat -ntulp |grep 22222 # 查看端口是否开放并查看监听端口的服务
    iptables -L|grep 22222 # 查看iptables规则
    firewall-cmd --list-ports # 查看所有开放的端口
    ufw status verbose|grep 2222
    

    如果未输出或输出的内容中不包含需要的端口,那么即是端口未开放,需要开放端口

    # firewalld方式
    
    # 添加
    # zone一般默认为public 可以不写
    # 查看默认zone
    firewall-cmd --get-default-zone
    # --permanent永久生效,没有此参数重启后失效
    firewall-cmd --zone=public --add-port=22222 /tcp --permanent 
    # 查看
    firewall-cmd --zone=public --query-port=22222 /tcp
    # 删除
    firewall-cmd --zone=public --remove-port=22222 /tcp --permanent
    
    # 添加/删除后 重新载入
    firewall-cmd --reload
    
    # iptables方式
    # centos7版本以下的方式,centos7及更高版本默认为firewalld方式
    # 非要在centos7+用iptables,就关闭 firewalld 服务并安装 iptables-service
    
    # 开放端口
    # 用 iptables -I 而不是 iptables -A
    # iptables -A 是规则末尾追加,可能导致因为已有规则使追加的规则无效
    # iptables -I 是规则开头插入,一般不会出问题
    iptables -I INPUT -p tcp --dport 22222 -j ACCEPT
    iptables -I OUTPUT -p tcp --sport 22222 -j ACCEPT
    
    # 关闭端口(删除规则)
    iptables -D INPUT -p tcp --dport 22222 -j ACCEPT
    iptables -D OUTPUT -p tcp --dport 22222 -j ACCEPT
    
    # 保存,不然服务器重启后会失效
    # centos7+ 不安装 iptables-service 的话,没有该命令
    service iptables save
    
    # 虽然在不安装 iptables-service 的情况下,iptables指令也生效(重启后会失效,因为没有保存的命令)
    # 但是firewalld并不会在其配置文件中记录,届时我们用firewalld命令查看端口会找不到
    
    # firewalld 和 iptables-service是一个层面的东西,它们都基于iptables这个软件
    # 它们的作用是一样的,不必纠结看个人习惯或者业务需求
    
    #  查看iptables软件是否安装(firewalld 和 iptables-service 都是基于它的)
    whereis iptables
    或者
    yum list installed|grep iptables
    

    在端口开放后修改sshd配置文件
    vi /etc/ssh/sshd_config
    找到 #Port 22
    然后插入一行
    Port 22222
    如果22端口还需要监听就取消#Port 22的注释
    保存后重启sshd
    systemctl restart sshd
    或者
    service sshd restart

    重启后查看端口
    netstat -ntulp |grep 22222
    看到sshd在监听说明ssh可以通过22222端口访问了

    查看日志
    centos下 cat /var/log/secure|grep 22222
    debian下 cat /var/log/auth.log|grep 22222
    看到

    Server listening on 0.0.0.0 port 22222.
    Server listening on :: port 22222.
    

    说明无异常
    此时可以通过22222端口ssh访问啦

  2. 启用密钥,禁止密码
    首先生成密钥,有两种方式
    ssh客户端工具和ssh-keygen命令

    客户端以mobaxterm为例:顶部菜单"Tools"下找到"MobaKeyGen",点击进入面板。然后点击"Generate"生成密钥,包括公钥和私钥。
    在要使用密钥的用户主目录的".ssh"目录下新建authorized_keys文件(如果不存在,如/root/.ssh/authorized_keys),把公钥字符串粘贴进去就好。
    然后导出私钥,默认.ppk格式,就是putty软件的那种格式。
    然后在客户端登陆时使用private key 并选择生成的密钥就可以登陆了。

    顶部菜单的"Conversions"可以选择生成其他格式的私钥(比如手机端juicessh需要openssh格式),我们选择"Export OpenSSH key",并将生成的私钥命名为"id_rsa"就行了。

    第二种ssh-keygen命令也很简单
    ssh-keygen -t rsa
    然后一路回车就好,不必输入密钥密码(如果怕私钥泄露可以设置密码,但是要记住,因为设置了密码后,登陆时除了验证私钥,还需要输入密码验证)
    /root/.ssh/目录下会新建两个文件,私钥id_rsa and 公钥id_rsa.pub

    再执行ssh-copy-id -i .ssh/id_rsa.pub -p22222 [email protected]
    然后输入密码,公钥会自动追加到authorized_keys这个文件里。
    如果执行该命令出现Permission denied (publickey).的错误,看看是不是禁止了密码登陆,不要禁用,等公钥添加完成后再禁用。
    当然,如果不想改配置文件,我们将公钥字符串手动追加(复制粘贴)到authorized_keys文件也是可以的。
    最后我们把生成的私钥下载到本地,在ssh客户端使用就好了。

    禁止密码登陆
    在使用密钥登陆无异常后,打开sshd配置文件
    vi /etc/ssh/sshd_config
    PasswordAuthentication yes改成PasswordAuthentication no
    重启sshd即可生效
    届时,如果我们使用密码登陆会提示:
    No supported authentication methods available (server sent: publickey)
    同时,sshd日志也会写入。

其他问题:
日志不输出:
service rsyslog status查看syslog的状态,发现inactive(因为使sshd监听了未开放的端口,并取消了22的监听导致无法ssh,所以改了下配置文件重启了服务器,syslog并未设置开机启动)
启动syslog就好了
还可以设置其开机启动
centos下
systemctl enable rsyslogchkconfig rsyslog on
执行systemctl list-unit-files|grep rsyslog,看到rsyslog的状态为enabled即是成功

你可能感兴趣的:(笔记:SSH更改端口、禁用密码、使用密钥登陆)