Bashpython
$ vi /etc/ssh/sshd_config
取消 #Port 22
的註釋,在下一行添加你須要修改的新端口 Port 2048
。(這裏不刪除 22 端口是爲了防止修改後新端口沒法訪問,形成沒法用 ssh 鏈接服務器。)linux
Port 22 Port 2048
修改保存 sshd_config 文件後重啓 sshd 服務:安全
Bashbash
$ 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 這一套修改端口的方法已經不能生效了。ssh
SELinux 全稱 Security Enhanced Linux (安全強化 Linux),是 MAC (Mandatory Access Control,強制訪問控制系統)的一個實現,目的在於明確的指明某個進程能夠訪問哪些資源(文件、網絡端口等)。tcp
對於 ssh,SELinux 默認只容許 22 端口,咱們能夠用 SELinux 管理配置工具 semanage,來修改 ssh 可訪問的端口。ide
Bash工具
$ yum provides semanage $ yum -y install policycoreutils-python
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,沒法刪除。
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
Bash
$ firewall-cmd --get-default-zone public $ firewall-cmd --get-active-zones public interfaces: eth0 eth1
若沒有激活區域的話,要執行下面的命令。
Bash
$ firewall-cmd --set-default-zone=public $ firewall-cmd --zone=public --add-interface=eth0 success $ firewall-cmd --zone=public --add-interface=eth1 success
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
成功登陸的話,就能夠作收尾工做了。
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))
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 鏈接,則會回顯 "ssh: connect to host {ip} port 22: Connection refused"$ ssh -p 2048 root@example.com# 成功 success