修改 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