ssh端口修改

Catalogue
  1. 1. centos 7 修改ssh端口+Selinux+firewall
  2. 2. 修改动机
  3. 3. 修改 sshd_config 文件(这一段直接复制过来的)
  4. 4. 打开SElinux端口
  5. 5. 配置防火墙 firewalld
  6. 6. 启用防火墙 && 查看防火墙状态
  7. 7. 查看防火墙当前「默认」和「激活」zone(区域)
  8. 8. 激活 public 区域,增加网卡接口
  9. 9. 为 public zone 永久开放 2048/TCP 端口:
  • 禁用 22 端口
    1. 1. 删除 ssh 允许端口
    2. 2. 防火墙移除 22 端口
    3. 3. 修改Git端口
  • centos 7 修改ssh端口+Selinux+firewall

    修改动机

    突然想起看看服务器的日志,于是去网上搜索,last ps -ef iftop -np 也没看出什么来,不过du -h /var/log/secure 一看20多M,终于明白自己是多么的井蛙了,于是便想要更改ssh的端口。

    参考网址

    https://www.centos.bz/2017/08/centos-7-change-ssh-port/

    修改 sshd_config 文件(这一段直接复制过来的)
    1
    $ vi /etc/ssh/sshd_config

    取消 #Port 22 的注释,在下一行添加你需要修改的新端口 Port 2048。(这里不删除 22 端口是为了防止修改后新端口无法访问,造成无法用 ssh 连接服务器。)

    1
    2
    Port 22  
    Port 2048

    修改保存 sshd_config 文件后重启 sshd 服务:

    1
    $  systemctl restart sshd

    退出 ssh 会话后,再用新的端口连接:

    1
    2
    $ ssh -p 2048 root@example.com
    ssh: connect to host 0.0.0.0 port 2048: Connection refused

    好吧,native 了……对于 CentOS 7 这一套修改端口的方法已经不能生效了。

    于是进行下一步

    打开SElinux端口

    SELinux 全称 Security Enhanced Linux (安全强化 Linux),是 MAC (Mandatory Access Control,强制访问控制系统)的一个实现,目的在于明确的指明某个进程可以访问哪些资源(文件、网络端口等)。

    对于 ssh,SELinux 默认只允许 22 端口,我们可以用 SELinux 管理配置工具 semanage,来修改 ssh 可访问的端口。

    安装semanage工具,(这个工具来设置selinux)

    1
    2
    $ yum provides semanage
    $ yum -y install policycoreutils-python

    为ssh打开2048端口

    1
    2
    3
    4
    5
    # 为 ssh 添加新的允许端口
    $ semanage port -a -t ssh_port_t -p tcp 2048
    # 查看当前 SELinux 允许的端口
    $ semanage port -l | grep ssh
    ssh_port_t tcp 2048, 22

    进行到这一步,我这里进行不下去了,我的是vultr的主机,然后安装的是centos7 64。semanage 命令一直报错,查看selinux状况,提示disabled

    1
    2
    [root@vultr ~]# sestatus
    SELinux status: disabled

    然后就网上找这么开启selinux的方法,setenforce 1 修改 /etc/selinux/config 文件 ,可是到了这一步就诡异了,我的系统没有这个文件,连selinux这个文件夹也没有,于是我无奈之下就新建了文件夹和文件,并且参考网络上的文件内容复制进去,并且修改SELINUX=disabled ,折腾重启n次,无果,sestatus还是显示 disabled, 于是只能弃之不管,继续去配置firewall。原教程在selinux还有这一步:

    错误处理

    当 SELINUX 配置为禁用状态时,使用 semanage 会报错提示无法读取 policy 文件:

    1
    2
    3
    4
    5
    SELinux:  Could not downgrade policy file /etc/selinux/targeted/policy/policy.30, searching for an older version.  
    SELinux: Could not open policy file <= /etc/selinux/targeted/policy/policy.30: No such file or directory
    /sbin/load_policy: Can't load policy: No such file or directory
    libsemanage.semanage_reload_policy: load_policy returned error code 2. (No such file or directory).
    FileNotFoundError: [Errno 2] No such file or directory

    修改 /etc/selinux/config 配置,启用 SELinux:

    1
    2
    3
    4
    5
    6
    7
    8
    $ vi /etc/selinux/config
    SELINUX=permissive
    # 重启服务器
    $ init 6
    # 重启后查看 SELinux 状态
    $ sestatus
    # if it shows disable, you can run
    $ load_policy -qi

    检查配置

    1
    2
    3
    4
    5
    $ semanage port -a -t ssh_port_t -p tcp 2048
    $ semanage port -l | grep ssh
    ssh_port_t tcp 2048, 22
    # 重启 ssh 服务
    systemctl restart sshd

    注:semange 不能禁用 ssh 的 22 端口:

    1
    2
    $ semanage port -d -t ssh_port_t -p tcp 22
    ValueError: 在策略中定义了端口 tcp/22,无法删除。

    此路不通,继续往下….

    配置防火墙 firewalld
    1
    2
    $ systemctl enable firewalld  #使firewall开机启动
    $ systemctl start firewalld #启动firewall

    然后就悲剧了,服务启动不起来,按照提示好像是iptable 的规则有错误,服务启动不起来。于是又搜索

    1
    2
    3
    iptables: Applying firewall rules: iptables-restore v1.4.7: iptables-restore: unable to initialize ta’le ‘security
    Error occurred at line: 2
    Try `iptables-restore -h’ or ‘iptables-restore –help’ for more information.

    找到了初始化iptables的命令:

    1
    2
    3
    iptables -F
    service iptables save
    service iptables restart

    这下IPtables启动成功了,可是不知道是刚刚一通乱改动了那里的东西,systemctl start firewalld 一直是faild. 看来还是要从selinux下手。

    突然想到重装一下selinux吧,这下用谷歌搜一下,然后就搜到这个网页 https://www.tecmint.com/things-to-do-after-minimal-rhel-centos-7-installation/4/ 30 Things to Do After Minimal RHEL/CentOS 7 Installation ,说的是centos7最小化安装后需要做的30件事情,其中就有一条 Install and Enable SELinux ,不管是不是最小化安装的,直接装一下看看,按照教程安装–这个教程也是个坑呀

    1
    yum install selinux-policy

    这下/etc/selinux/config里面也有文件了,于是开启selinux,再去运行semanage 命令,可是还是报错,提示是缺少规则什么的,我想是不是需要重启一下,于是就重启了,然后就悲剧了,ssh什么的都连不上了,进vultr的网页控制台去看,重启卡进度条了,按ESC后提示

    faild to load SELinux….

    网上搜出现这种情况的解决办法,网页端又不好操作,而且晚上一下就掉线了,搞半天无果,这时想起自己以前在vultr控制台存了快照,于是又搜索快照恢复的方法,原来这不像我们电脑的备份,这个快照无法直接恢复,需要新建一个实例然后用这个快照做镜像。好吧,于是先在控制台保存一下公网IP,然后删除这个启动不了的实例,新开一个配置和原来一样的实例,镜像用原来的快照,IP用刚刚保留的IP,然后安装完成以后,搜索怎么全新安装一个selinux.

    这是vultr恢复快照如果无法上网的解决方法 https://www.vultr.com/docs/correcting-network-configuration-after-snapshot-restore

    参考 这三个网页,拼凑出下面的安装SElinux的命令

    https://linode.com/docs/security/getting-started-with-selinux/

    https://gist.github.com/amphineko/b0edb71c89dd91cff675

    https://en.opensuse.org/SDB:SELinux

    1
    2
    3
    yum install policycoreutils policycoreutils-python selinux-policy selinux-policy-targeted libselinux-utils setroubleshoot-server setools setools-console mcstrans
    yum install selinux-policy-targeted
    yum install selinux-policy-mls

    这样安装完成以后 sestatus 显示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELinux status:                 enabled
    SELinuxfs mount: /sys/fs/selinux
    SELinux root directory: /etc/selinux
    Loaded policy name: targeted
    Current mode: permissive
    Mode from config file: permissive
    Policy MLS status: enabled
    Policy deny_unknown status: allowed
    Max kernel policy version: 28

    然后重启后 sestatus显示

    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELinux status:                 enabled
    SELinuxfs mount: /sys/fs/selinux
    SELinux root directory: /etc/selinux
    Loaded policy name: targeted
    Current mode: enforcing
    Mode from config file: enforcing
    Policy MLS status: enabled
    Policy deny_unknown status: allowed
    Max kernel policy version: 28

    然后再从原来的semanage 命令那里开始参照 https://www.centos.bz/2017/08/centos-7-change-ssh-port/ 一步一步来配置防火墙 firewalld

    启用防火墙 && 查看防火墙状态
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ systemctl enable firewalld
    $ systemctl start firewalld
    $ systemctl status firewalld
    ● firewalld.service - firewalld - dynamic firewall daemon
    Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
    Active: active (running) since 二 2016-12-20 02:12:59 CST; 1 day 13h ago
    Main PID: 10379 (firewalld)
    CGroup: /system.slice/firewalld.service
    └─10379 /usr/bin/python -Es /usr/sbin/firewalld --nofork --nopid
    $ firewall-cmd --state
    running
    查看防火墙当前「默认」和「激活」zone(区域)
    1
    2
    3
    4
    5
    $ firewall-cmd --get-default-zone
    public
    $ firewall-cmd --get-active-zones
    public
    interfaces: eth0 eth1

    若没有激活区域的话,要执行下面的命令。

    激活 public 区域,增加网卡接口
    1
    2
    3
    4
    5
    $ firewall-cmd --set-default-zone=public
    $ firewall-cmd --zone=public --add-interface=eth0
    success
    $ firewall-cmd --zone=public --add-interface=eth1
    success
    为 public zone 永久开放 2048/TCP 端口:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    # 以防新端口不生效,先把 22 端口暴露
    $ firewall-cmd --permanent --zone=public --add-port=22/tcp
    $ firewall-cmd --permanent --zone=public --add-port=2048/tcp
    success
    # 重载防火墙
    $ firewall-cmd --reload
    # 查看暴露端口规则
    $ firewall-cmd --permanent --list-port
    443/tcp 80/tcp 22/tcp 2048/tcp
    $ firewall-cmd --zone=public --list-all
    public (default, active)
    interfaces: eth0 eth1
    sources:
    services: dhcpv6-client ssh
    ports: 443/tcp 80/tcp 22/tcp 2048/tcp
    masquerade: no
    forward-ports:
    icmp-blocks:
    rich rules:

    退出 ssh 后,尝试连接新端口

    1
    $ ssh -p 2048 root@example.com

    成功登录的话,就可以做收尾工作了。

    禁用 22 端口

    删除 ssh 允许端口
    1
    2
    3
    4
    5
    6
    7
    $ vi /etc/ssh/sshd_config
    #Port 22
    Port 2048
    $ systemctl restart sshd
    # 用 ss 命令检查 ssh 监听的端口,没有 22 证明修改成功
    $ ss -tnlp | grep ssh
    LISTEN 0 128 *:2048 *:* users:(("sshd",18233,3))
    防火墙移除 22 端口
    1
    2
    3
    4
    5
    $ firewall-cmd --permanent --zone=public --remove-port=22/tcp
    success
    $ firewall-cmd --reload
    $ firewall-cmd --permanent --list-port
    443/tcp 80/tcp 2048/tcp

    ssh 取消监听 22 端口,就已经配置好了,防火墙只不过是在 ssh 外多一层访问限制。如果要做的更好还可以将 22 端口的访问流量转向访问者本地:

    1
    2
    $ firewall-cmd --permanen --zone=public --add-forward-port=port=22:proto=tcp:toport=22:toaddr=127.0.0.1
    # 配置后重载防火墙,用 ssh -p 22 root@example.com 就会访问到自己本地的 22 端口。

    若要删除 forward 配置,可以:

    1
    $ firewall-cmd --permanen --zone=public --remove-forward-port=port=22:proto=tcp:toport=22:toaddr=127.0.0.1

    检验修改 ssh 端口是否成功:

    1
    2
    3
    4
    5
    $ ssh -p 22 root@example.com
    # 无响应,因为转到了本地的 22 端口
    # 若防火墙未 forward 连接,则会回显 "ssh: connect to host {ip} port 22: Connection refused"
    $ ssh -p 2048 root@example.com
    # 成功 success
    修改Git端口

    最后还要修改git 端口为修改后的端口,不然上传不了文件

    windows下.ssh文件夹一般在 C:\User\用户名 , 然后在.ssh文件夹里面新建config文件,内容如下:

    1
    2
    3
    4
    5
    Host 服务器IP
    HostName 服务器IP
    User git
    Port 端口号
    IdentityFile ~/.ssh/id_rsa