在Linux系统中,端口22默认用于SSH(Secure Shell)服务,是远程管理服务器的核心通道,开启22端口通常涉及SSH服务的安装与配置、防火墙规则设置以及SELinux策略调整(若系统开启SELinux),以下将详细说明完整操作流程,涵盖主流Linux发行版(如CentOS/RHEL、Ubuntu/Debian)的差异处理,并附常见问题解答。
检查SSH服务状态与安装
SSH服务是开启22端口的前提,需先确认系统是否已安装并运行SSH服务。
检查SSH服务是否已安装
-
CentOS/RHEL系统
使用rpm
或yum
检查:rpm -qa | grep openssh-server # 检查是否安装SSH服务端
若未安装,输出为空;若已安装,会显示类似
openssh-server-8.0p1-5.el8.x86_64
的结果。 -
Ubuntu/Debian系统
使用dpkg
检查:dpkg -l | grep openssh-server # 检查SSH服务端安装状态
未安装时,第二列状态为
ii
的包名不会包含openssh-server
。
安装SSH服务
-
CentOS/RHEL系统(使用yum/dnf)
sudo yum install openssh-server -y # CentOS 7及以下 # 或 sudo dnf install openssh-server -y # CentOS 8/RHEL 8及以上
安装完成后,SSH服务端配置文件默认位于
/etc/ssh/sshd_config
。 -
Ubuntu/Debian系统(使用apt)
sudo apt update sudo apt install openssh-server -y
安装后,配置文件路径同样为
/etc/ssh/sshd_config
,服务名为ssh
(非sshd
)。
启动并设置SSH服务开机自启
安装完成后,需启动SSH服务并配置开机自启,确保服务持续运行。
启动SSH服务
- CentOS/RHEL系统
sudo systemctl start sshd # 启动SSH服务
- Ubuntu/Debian系统
sudo systemctl start ssh # Ubuntu/Debian中服务名为ssh
设置开机自启
- 通用方法(systemd系统)
sudo systemctl enable sshd # CentOS/RHEL sudo systemctl enable ssh # Ubuntu/Debian
执行后,可通过
systemctl is-enabled sshd/ssh
检查是否已设置为开机自启(输出为enabled
即成功)。
验证服务状态
sudo systemctl status sshd # CentOS/RHEL sudo systemctl status ssh # Ubuntu/Debian
若服务正常运行,输出会显示active (running)
,且无错误信息。
配置防火墙允许22端口流量
Linux系统默认启用防火墙(如iptables、firewalld、ufw),需手动开放22端口,否则外部连接会被拒绝,根据发行版不同,防火墙工具有所差异:
CentOS/RHEL系统:使用firewalld(CentOS 7+)或iptables(CentOS 6及以下)
-
firewalld管理(CentOS 7/8/RHEL 7+)
sudo firewall-cmd --permanent --add-port=22/tcp # 永久开放22端口(TCP协议) sudo firewall-cmd --reload # 重新加载防火墙规则,使配置生效
验证规则是否添加成功:
sudo firewall-cmd --list-ports # 查看已开放的端口,应显示22/tcp
-
iptables管理(CentOS 6或旧版系统)
sudo iptables -I INPUT -p tcp --dport 22 -j ACCEPT # 允许22端口TCP流量 sudo service iptables save # 保存规则(CentOS 6) # 或 sudo iptables-save > /etc/sysconfig/iptables # 手动保存规则(适用于需要持久化的场景)
查看已添加的规则:
sudo iptables -L -n --line-numbers # 列出规则,-n避免域名解析,--line-numbers显示行号
Ubuntu/Debian系统:使用ufw(默认)或iptables
-
ufw管理(Ubuntu/Debian默认)
sudo ufw allow 22/tcp # 开放22端口 sudo ufw reload # 重启ufw使规则生效(部分版本可省略,直接allow即生效)
检查规则状态:
sudo ufw status # 输出应包含"22/tcp (ALLOW IN)"
-
iptables管理(手动配置时)
操作与CentOS的iptables一致,需注意Ubuntu/Debian中iptables规则默认不自动保存,需通过iptables-persistent
包实现持久化:sudo apt install iptables-persistent -y sudo netfilter-persistent save # 保存规则
不同防火墙工具命令对比
操作 | firewalld (CentOS 7+) | iptables (通用) | ufw (Ubuntu/Debian) |
---|---|---|---|
开放22端口 | --add-port=22/tcp |
-I INPUT -p tcp --dport 22 |
allow 22/tcp |
保存规则 | --reload (临时)需手动持久化 |
service iptables save |
无需手动保存(allow 即持久) |
查看已开放端口 | --list-ports |
-L -n --line-numbers |
status |
禁用22端口 | --remove-port=22/tcp |
-D INPUT -p tcp --dport 22 |
deny 22/tcp |
处理SELinux策略(仅CentOS/RHEL系统开启时)
若系统开启SELinux(默认为permissive
或enforcing
模式),可能阻止SSH服务监听22端口,需调整策略:
检查SELinux状态
sestatus # 查看SELinux当前模式
输出中SELinux status
为enabled
表示已开启,Current mode
为enforcing
为强制模式,permissive
为警告模式(记录但不阻止)。
设置SELinux允许SSH网络连接
sudo setsebool -P sshd_can_network_connect on # 允许SSH服务网络连接(-P表示永久生效)
若仍无法连接,可检查SELinux日志:
sudo grep sshd /var/log/audit/audit.log # 查看是否有SELinux拒绝SSH的记录
若有类似avc: denied { name_bind }
的记录,可通过semanage
工具调整端口上下文:
sudo semanage port -a -t ssh_port_t -p tcp 22 # 将22端口添加为SSH端口类型
(需安装policycoreutils-python
包,sudo yum install policycoreutils-python
)
测试SSH连接
完成上述配置后,可通过以下方式测试22端口是否开放且服务正常:
本地测试
ssh localhost # 使用当前用户连接本地SSH服务
若提示Are you sure you want to continue connecting (yes/no)?
,输入yes
,再输入用户密码,登录成功则说明服务正常。
远程测试(使用另一台设备)
ssh username@server_ip # 替换为服务器用户名和IP地址
若能成功登录,则22端口已开放;若连接超时或被拒绝,需检查防火墙规则、SSH服务状态及SELinux设置。
安全配置建议
开启22端口后,需注意以下安全措施,避免未授权访问:
- 禁用root直接登录:编辑
/etc/ssh/sshd_config
,设置PermitRootLogin no
,重启SSH服务:sudo systemctl restart sshd/ssh
- 使用密钥认证:关闭密码登录,仅允许SSH密钥认证,提升安全性(编辑
sshd_config
,设置PasswordAuthentication no
)。 - 修改默认端口:若无需使用22端口,可修改
Port 2222
(非特权端口需大于1024),并同步更新防火墙规则和SELinux策略。 - 限制访问IP:通过防火墙规则(如firewalld的
--add-source=192.168.1.0/24
)仅允许特定IP访问22端口。
相关问答FAQs
问题1:开启22端口后,使用SSH连接仍提示“Connection refused”怎么办?
解答:该错误通常表示SSH服务未启动或防火墙未正确开放端口,排查步骤如下:
- 检查SSH服务状态:
sudo systemctl status sshd/ssh
,确保服务为active (running)
;若未启动,执行sudo systemctl start sshd/ssh
。 - 检查防火墙规则:
- CentOS/RHEL:
sudo firewall-cmd --list-ports
确认22/tcp是否在列; - Ubuntu/Debian:
sudo ufw status
确认是否允许22/tcp。
- CentOS/RHEL:
- 检查SELinux(CentOS/RHEL):
sestatus
确认是否为enforcing
模式,尝试临时关闭sudo setenforce 0
测试(关闭后需重启服务),若恢复正常,则需调整SELinux策略(如setsebool -P sshd_can_network_connect on
)。 - 检查SSH服务监听端口:
sudo ss -tulnp | grep ssh
,确认是否监听22端口(若无,需检查/etc/ssh/sshd_config
中Port 22
是否被注释)。
问题2:如何修改SSH默认端口(如改为2222)以提高安全性?
解答:修改SSH默认端口需同时调整配置文件、防火墙规则及SELinux策略(若开启),具体步骤如下:
- 编辑SSH配置文件:
sudo vim /etc/ssh/sshd_config
,找到Port 22
,修改为Port 2222
(若存在多个Port
行,注释或删除旧配置,仅保留新端口)。 - 重启SSH服务:
sudo systemctl restart sshd/ssh
。 - 更新防火墙规则:
- firewalld:
sudo firewall-cmd --permanent --add-port=2222/tcp && sudo firewall-cmd --remove-port=22/tcp
(可选),然后reload
; - ufw:
sudo ufw allow 2222/tcp && sudo ufw deny 22/tcp
; - iptables:
sudo iptables -I INPUT -p tcp --dport 2222 -j ACCEPT
,并删除22端口规则(iptables -D INPUT -p tcp --dport 22 -j ACCEPT
),最后保存规则。
- firewalld:
- 调整SELinux策略(CentOS/RHEL):
sudo semanage port -a -t ssh_port_t -p tcp 2222
,确保SELinux允许新端口。 - 测试连接:使用
ssh username@server_ip -p 2222
登录,成功后将防火墙规则设置为永久生效(如firewalld的--permanent
),并关闭22端口访问(可选)。
注意:修改端口后,需确保客户端连接时使用-p
参数指定新端口,否则会因端口不匹配而失败。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/19382.html