修改 sshd_config 埠
$ vi /etc/ssh/sshd_config
取消 #Port 22 的註釋,在下一行新增你需要修改的新埠 Port 2048 。(這裏不刪除 22 埠是為了防止修改後新埠無法訪問,造成無法用 ssh 連線站羣服務器。)
Port 22  
Port 2048
修改儲存 sshd_config 檔案後重啓 sshd 服務:
Bash
$  systemctl restart sshd
退出 ssh 會話後,再用新的埠連線:
Bash
$ 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 工具
Bash
$ yum provides semanage
$ yum -y install policycoreutils-python
為 ssh 開啓 2048 埠
Bash
# 為 ssh 新增新的允許埠 $ semanage port -a -t ssh_port_t -p tcp 2048# 檢視當前 SELinux 允許的埠 $ semanage port -l | grep sshssh_port_t                     tcp      2048, 22
錯誤處理
當 SELINUX 配置為禁用狀態時,使用 semanage 會報錯提示無法讀取 policy 檔案:
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: Bash $ vi /etc/selinux/config SELINUX=permissive   # 重啓站羣服務器 $ init 6# 重啓後檢視 SELinux 狀態 $ sestatus# if it shows disable, you can run$ load_policy -qi 檢查配置: Bash $ semanage port -a -t ssh_port_t -p tcp 2048 $ semanage port -l | grep sshssh_port_t                     tcp      2048, 22   # 重啓 ssh 服務 systemctl restart sshd 注:semange 不能禁用 ssh 的 22 埠: Bash $ semanage port -d -t ssh_port_t -p tcp 22 ValueError: 在策略中定義了埠 tcp/22,無法刪除。 配置防火牆 firewalld 啓用防火牆 && 檢視防火牆狀態: Bash $ 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(區域): Bash $ firewall-cmd --get-default-zone public   $ firewall-cmd --get-active-zones public     interfaces: eth0 eth1 若沒有啓用區域的話,要執行下面的命令。 啓用 public 區域,增加網絡卡介面: Bash $ 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 埠: Bash # 以防新埠不生效,先把 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 後,嘗試連線新埠 Bash $ ssh -p 2048 root@example.com 成功登入的話,就可以做收尾工作了。 禁用 22 埠 刪除 ssh 允許埠 Bash $ vi /etc/ssh/sshd_config#Port 22Port 2048   $ systemctl restart sshd# 用 ss 命令檢查 ssh 監聽的埠,沒有 22 證明修改成功 $ ss -tnlp | grep sshLISTEN     0      128                       *:2048                    *:*      users:(("sshd",18233,3)) 防火牆移除 22 埠 Bash $ 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 埠的訪問流量轉向訪問者本地: Bash $ 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 配置,可以: Bash $ firewall-cmd --permanen --zone=public --remove-forward-port=port=22:proto=tcp:toport=22:toaddr=127.0.0.1 檢驗修改 ssh 埠是否成功: Bash $ ssh -p 22 root@example.com# 無響應,因為轉到了本地的 22 埠 # 若防火牆未 forward 連線,則會回顯 "ss