在Linux系统中,端口22是SSH(Secure Shell)服务的默认端口,用于实现安全的远程登录和文件传输,打开22端口通常意味着配置SSH服务并确保端口未被防火墙或其他安全策略阻止,以下是详细的操作步骤,涵盖不同Linux发行版的服务安装、配置、防火墙设置及验证方法。
检查当前端口状态
在操作前,首先确认22端口的当前状态,避免重复配置或遗漏问题,使用以下命令检查端口是否已被占用或开放:
-
使用netstat命令(传统工具,需安装
net-tools
包):netstat -tuln | grep 22
若返回类似
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
的结果,表示22端口已被SSH服务监听;若无输出,则SSH服务未启动或未配置监听22端口。 -
使用ss命令(推荐,现代Linux系统默认自带):
ss -tuln | grep 22
ss
命令是netstat
的替代工具,输出更简洁高效,参数含义相同:-t
显示TCP端口,-u
显示UDP端口,-l
只显示监听端口,-n
以数字形式显示地址和端口。
安装SSH服务
若系统中未安装SSH服务,需先根据Linux发行版选择对应的安装命令,以下是常见发行版的安装方法:
发行版系列 | 包管理工具 | 安装命令 | 备注 |
---|---|---|---|
Ubuntu/Debian | apt | sudo apt update && sudo apt install openssh-server |
需确保apt 源可用,安装后自动启动服务 |
CentOS/RHEL 7+ | yum/dnf | sudo yum install openssh-server (CentOS 7)sudo dnf install openssh-server (RHEL 8+/CentOS 8+) |
需root权限,dnf 为新版包管理工具 |
Fedora | dnf | sudo dnf install openssh-server |
同RHEL 8+ |
Arch Linux | pacman | sudo pacman -S openssh |
需手动启动服务(systemctl start sshd ) |
安装完成后,可通过以下命令检查SSH服务状态:
sudo systemctl status sshd # CentOS/RHEL/Fedora/Arch sudo systemctl status ssh # Ubuntu/Debian
若显示active (running)
,表示服务已启动;若未启动,使用sudo systemctl start sshd
(或ssh
)启动,并设置开机自启:
sudo systemctl enable sshd # CentOS/RHEL/Fedora/Arch sudo systemctl enable ssh # Ubuntu/Debian
配置SSH服务监听22端口
SSH服务的配置文件位于/etc/ssh/sshd_config
,需确保该文件中22端口未被注释或禁用,使用文本编辑器(如vi
、nano
)打开配置文件:
sudo vi /etc/ssh/sshd_config
检查以下关键参数:
- Port 22:确保此行未被注释(即行首无),若需修改其他端口,可新增
Port 端口号
,但保留22端口或根据需求调整。 - ListenAddress 0.0.0.0:指定监听地址,
0.0.0
表示监听所有IPv4地址;若仅限IPv6,可改为。 - PermitRootLogin yes/no:控制root用户是否直接通过SSH登录(建议设为
no
,改用普通用户sudo提权)。 - PasswordAuthentication yes/no:是否允许密码认证(若使用SSH密钥,可设为
no
增强安全性)。
修改后保存文件,并重启SSH服务使配置生效:
sudo systemctl restart sshd # CentOS/RHEL/Fedora/Arch sudo systemctl restart ssh # Ubuntu/Debian
配置防火墙开放22端口
Linux系统默认启用防火墙(如iptables
、firewalld
、ufw
),需手动开放22端口允许流量通过,以下是常见防火墙的配置方法:
firewalld(CentOS 7+/RHEL 7+/Fedora默认)
# 检查防火墙状态 sudo firewall-cmd --state # 永久开放22端口(TCP协议) sudo firewall-cmd --permanent --add-port=22/tcp # 重新加载防火墙规则使配置生效 sudo firewall-cmd --reload # 验证22端口是否已开放 sudo firewall-cmd --list-ports | grep 22
ufw(Ubuntu/Debian默认)
# 检查ufw状态 sudo ufw status # 开放22端口(可指定协议,默认为TCP) sudo ufw allow 22 # 启用ufw(若未启用) sudo ufw enable # 验证规则 sudo ufw status verbose
iptables(传统防火墙,适用于CentOS 6及旧版Ubuntu)
# 开放22端口(TCP协议) sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT # 保存规则(CentOS 6: service iptables save;Ubuntu: iptables-save > /etc/iptables/rules.v4) sudo service iptables save # CentOS 6 # 或 sudo iptables-save | sudo tee /etc/iptables/rules.v4 # Ubuntu # 重启iptables服务 sudo service iptables restart
防火墙类型 | 开放22端口命令 | 永久生效方法 |
---|---|---|
firewalld | sudo firewall-cmd --permanent --add-port=22/tcp |
sudo firewall-cmd --reload |
ufw | sudo ufw allow 22 |
无需额外操作,ufw enable 后自动保存 |
iptables | sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT |
保存规则(如service iptables save ) |
SELinux配置(仅限CentOS/RHEL)
若系统启用SELinux(安全增强型Linux),需确保SSH服务策略允许22端口通信,检查SELinux状态:
sestatus
若显示SELinux status: enabled
,则需执行以下命令:
# 设置SSH端口策略为允许 sudo semanage port -a -t ssh_port_t -p tcp 22 # 若修改了非默认端口,需添加新端口(如2222) sudo semanage port -a -t ssh_port_t -p tcp 2222
若未安装semanage
工具,需先安装:
sudo yum install policycoreutils-python # CentOS 7 sudo dnf install policycoreutils-python-utils # RHEL 8+/CentOS 8+
验证22端口是否开放
完成上述配置后,通过以下方式验证22端口是否可正常访问:
-
本地测试:
telnet localhost 22
若显示
Connected to localhost.
及SSH服务 banner(如SSH-2.0-OpenSSH_8.2p1
),表示端口开放成功。 -
远程测试:
在另一台设备上执行:ssh -v 用户名@服务器IP
-v
参数显示详细连接过程,若成功建立连接,说明22端口及SSH服务配置正确。 -
使用nmap扫描(需安装
nmap
):nmap 服务器IP -p 22
若显示
open
,表示端口开放;若显示filtered
,则被防火墙或SELinux阻止,需检查上述配置步骤。
常见问题排查
若22端口仍无法访问,可检查以下问题:
- SSH服务未启动:执行
sudo systemctl start sshd
并设置开机自启。 - 防火墙规则未生效:确认防火墙服务已启动,且规则正确保存(如
firewalld
需--reload
)。 - SELinux阻止:临时关闭SELinux测试(
sudo setenforce 0
),若恢复正常,则需调整SELinux策略。 - IP地址限制:若需限制特定IP访问22端口,可在防火墙规则中添加源地址限制(如
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept'
)。
相关问答FAQs
问题1:为什么修改了sshd_config中的Port参数后,SSH服务无法启动?
解答:通常是因为端口参数配置错误或与SELinux策略冲突,首先检查/etc/ssh/sshd_config
中Port
行是否被注释或格式错误(如多空格、特殊字符),若修改为非默认端口(如2222),需确保:
- 防火墙开放了新端口(如
sudo firewall-cmd --permanent --add-port=2222/tcp
); - SELinux允许新端口(
sudo semanage port -a -t ssh_port_t -p tcp 2222
); - 重启SSH服务(
sudo systemctl restart sshd
),若仍有问题,可通过journalctl -u sshd
查看服务日志定位具体错误。
问题2:如何限制只有特定IP地址可以访问22端口?
解答:可通过防火墙规则实现IP访问控制,以firewalld
为例,执行以下命令:
# 允许特定IP(192.168.1.100)访问22端口 sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="22" accept' # 禁止其他IP访问22端口(可选,需先拒绝默认规则) sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" port protocol="tcp" port="22" reject' # 重新加载防火墙 sudo firewall-cmd --reload
对于ufw
,可使用:
sudo ufw allow from 192.168.1.100 to any port 22 proto tcp sudo ufw deny 22
配置后,仅允许指定IP通过SSH连接服务器,其他IP访问22端口将被防火墙拦截。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/36837.html