ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

openEuler修改SSH端口:SELinux与防火墙配置避坑指南

openEuler修改SSH端口:SELinux与防火墙配置避坑指南 修改 SSH 端口这件事我在 openEuler 上前后折腾过不下十次最开始是因为公司安全扫描报告红了一片要求所有公网服务器不能再用默认的 22 端口。后来帮朋友调试几台 arm64 架构的 openEuler 服务器又踩了 SELinux 的坑才发现网上很多教程只写了“改配置文件重启服务”就完事压根没提 openEuler 默认开启 SELinux 这事。这篇就把我的完整操作过程和踩坑记录整理出来给正在用 openEuler 改 SSH 端口的人一份能直接照做的参考。1. 先想明白为什么非要改 SSH 端口1.1 改端口不是玄学是降低被扫描攻击的风险互联网上每天都有大量扫描器在遍历 IP 段的 22 端口一旦发现开放端口就会尝试暴力破解弱口令。把 SSH 从默认的 22 改到其他端口本质上不是提升安全性而是减少被“随机路过”的扫描器盯上的概率。打个比方默认端口就像是家门牌号写在小区门口公告栏上改掉端口等于把门牌号藏起来但真正防盗还是要靠锁密码强度、密钥认证。安全扫描、等保合规、堡垒机接入这些场景里修改 SSH 端口往往是硬性要求这也是很多企业运维规范里明文规定的条目之一。1.2 openEuler 上改端口的特殊之处openEuler 和 CentOS/RHEL 系比较接近用 systemd 管理服务配置文件路径也是/etc/ssh/sshd_config。但它有一个非常容易被忽略的特性默认安装时 SELinux 是 enforcing 模式。这意味着你只改配置文件、重启 sshdSELinux 会直接拦住新端口的监听结果是服务看起来起来了外部却怎么都连不上。我在另一台 CentOS 7 上同样的操作就没这个问题所以如果你是从 CentOS 迁移过来的最容易在这里栽跟头。另外 openEuler 的防火墙默认可能是 firewalld也可能是空规则取决于你安装时选的系统镜像类型这也需要单独确认。2. 动手前的准备工作2.1 确认系统版本和 SSH 服务当前状态修改之前我建议你先确认三件事系统版本、SSH 服务名称、当前监听状态。用下面三条命令就能查清楚cat /etc/openEuler-release systemctl status sshd ss -tlnp | grep sshd如果sshd服务正常监听 22 端口输出里会看到0.0.0.0:22和[::]:22两行。这里要特别注意ss -tlnp会比netstat更直观而且有些最小化安装的 openEuler 里根本没装 netstat所以建议直接养成用ss的习惯。有一点我要特意提醒openEuler 在某些版本里SSH 服务名称也可能是ssh而不是sshd取决于你安装的是哪个软件包。用systemctl status sshd如果报错找不到单元就先rpm -qa | grep openssh-server看看装了哪个包。2.2 配置备份和安全网任何系统配置修改前我都强迫自己先做备份这个习惯帮我避免过太多次“改坏了又记不清原来长什么样”的尴尬cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak.$(date %F)接着确认 SELinux 当前状态getenforce如果输出是Enforcing后面第三节里的 SELinux 策略调整这步就绝对不能省。如果输出是Disabled或Permissive那防火墙放行后基本就能通了但你还是需要留意生产环境不建议为了省事把 SELinux 直接关掉。最后还要确认防火墙当前使用的后端。openEuler 22.03 LTS 之后很多版本用的是 firewalld但有些极致精简镜像里可能没装systemctl status firewalld如果服务存在且是 active 状态就按 firewalld 的规则操作。如果压根没装那就需要检查是否有其他安全组限制在起作用尤其你如果是云服务器别忘了云平台安全组里也有端口放行规则这跟系统内部防火墙是分开的两层。3. 核心操作三步完成 SSH 端口修改3.1 修改 sshd_config 配置文件SSH 服务端配置核心文件是/etc/ssh/sshd_config。打开它找到这一行#Port 22把它改成你想要的新端口比如 2222。去掉井号并把数字替换掉Port 2222这里有几个关键细节Port指令大小写敏感P 必须大写。如果文件里出现多个Portsshd 会监听所有列出的端口这在配置多端口过渡时很好用但如果你以为只改了一个、结果旧的还在监听排查时可能会一脸懵。不建议使用 1024 以下的端口因为这些端口通常需要 root 权限绑定而且很多被知名服务占用容易出现冲突。选 1024 到 65535 之间的高位端口比较稳比如 2222、6022、10022 这类。改完之后建议先用语法检查命令验证一下sshd -t如果没有任何输出说明配置语法没问题。如果报错它会明确指出哪一行有问题这是我最常用的自检手段。3.2 防火墙放行新端口配置文件改好后SSH 服务本身已经会尝试监听新端口但 firewalld 默认规则通常会挡住它。放行新端口有两种思路第一种直接放行指定端口firewall-cmd --permanent --add-port2222/tcp firewall-cmd --reload firewall-cmd --list-ports第二种放行指定服务加端口firewall-cmd --permanent --add-servicessh firewall-cmd --permanent --add-port2222/tcp firewall-cmd --reload我建议在生产环境上把原有的ssh服务规则也保留一段时间等确认新端口稳定后再删除这样能防止配置过程中误操作导致远程连接中断后彻底失联。验证防火墙规则是否生效用firewall-cmd --list-all查看输出里的ports和services段落。有些老版本 openEuler 的 firewalld 对--add-servicessh和--add-port2222/tcp的优先级处理不太一样以实际输出为准。3.3 SELinux 策略调整这是 openEuler 上最不能跳过的一步。默认 Enforcing 模式下sshd被 SELinux 限制只能绑定ssh_port_t这个端口类型而这个类型默认只包含 22 端口。即使你修改了配置文件SELinux 依然不允许 sshd 监听 2222日志里会明确记录AVC denied。正确的做法是安装policycoreutils-python-utils工具包然后用semanage命令把新端口加入 SSH 端口类型dnf install -y policycoreutils-python-utils semanage port -a -t ssh_port_t -p tcp 2222验证是否成功semanage port -l | grep ssh输出里应该能看到ssh_port_t tcp 2222这一条。如果你修改的端口恰好是某个其他服务已经在用的semanage会报端口冲突提示你先确认这个端口有没有被别的类型占用这时可以先semanage port -l | grep 2222排查。注意如果getenforce显示是 Disabled可以跳过这步。但我个人强烈建议不要为了图省事关闭 SELinux因为 openEuler 的很多安全机制都依赖它关掉等于给系统埋雷。3.4 重启服务与验证配置和策略都到位后重启 SSH 服务让新端口生效systemctl restart sshd systemctl status sshd确认服务状态是active (running)之后用ss检查监听端口ss -tlnp | grep sshd这次输出里应该能看到0.0.0.0:2222或*:2222了。我习惯同时用curl或telnet测试一下端口连通性确认防火墙和 SELinux 两层都没问题telnet 服务器IP 2222如果能看到Connected to的提示说明端口已经通了。如果你本地的 SSH 客户端是在 Windows 上也可以用 PowerShell 测试Test-NetConnection 服务器IP -Port 2222TcpTestSucceeded 返回 True 就代表通了。4. 常见坑和排查技巧4.1 重启后 SSH 直接连不上了这是所有人最怕遇到的场景。我踩过的最低级错误是改了端口但忘了防火墙放行结果新端口被拦、旧端口因为配置里只写了一个 Port 也不再监听等于把自己锁在门外。遇到这种情况如果服务器还有物理控制台或云厂商的 VNC 登录入口直接登录进去把配置文件改回来或者把防火墙规则补上。如果你有 iDRAC、BMC 之类的带外管理渠道一样可以救。我强烈建议任何远程操作 SSH 配置前先确认自己有带外管理手段否则一旦断了就真的只能跑机房了。如果服务还在监听但连接被拒绝按这个顺序排查systemctl status sshd ss -tlnp | grep sshd firewall-cmd --list-all getenforce journalctl -u sshd -n 50 --no-pagerjournalctl里的日志信息量最大SELinux 拦截会有明确的关键字比如SELinux is preventing sshd from name_bind access on the tcp_socket port 2222。4.2 防火墙规则明明加了还是不通firewalld 有一个很典型的陷阱规则分 runtime 和 permanent 两层。如果你执行firewall-cmd --add-port2222/tcp没有加--permanent它只对当前运行时段生效一旦 reload 或者重启就失效了。我见过有人加完规则当时测试通了第二天发现又连不上就是因为没加--permanent。另一个常见问题是firewalld 的服务名和端口冲突。如果你的sshd服务被 firewalld 里某个 zone 的富规则rich rule拦了单纯--add-port不一定管用。直接看firewall-cmd --list-all的输出确认ports列表里确实有2222/tcp以及services里有没有异常的条目。4.3 SELinux 日志里出现 AVC denied如果你确认端口放行、服务也在监听但外面就是连不上那先查一下 SELinux 的审计日志ausearch -m AVC -ts recent或者直接看/var/log/audit/audit.log里有没有和sshd或2222相关的内容。出现类似SELinux is preventing sshd from name_bind access on the tcp_socket port 2222的报错就是端口没有加进 ssh_port_t 类型回到 3.3 节把semanage port -a那步执行一遍就行。我遇到过一种看似奇怪的情况semanage port -l里已经有 2222 了但依然被拦。后来发现是semanage添加端口的操作写到了某个自定义策略模块而系统的 base 策略里有条规则优先级更高把端口覆盖了。解决办法是执行semanage port -m -t ssh_port_t -p tcp 2222用修改而不是新增的方式把它强制归到 ssh_port_t 下。4.4 运维视角多端口过渡期的技巧在正式切换前我通常会在sshd_config里同时配置两个 PortPort 22 Port 2222这样新旧端口同时监听先用新端口测试连接确认一切正常后再把Port 22那一行注释掉重启 sshd 完成切换。这个过渡期方案对远程服务器特别友好可以避免“改完直接失联”的尴尬。另外如果你使用密钥登录还要注意/etc/ssh/sshd_config里的PermitRootLogin和PubkeyAuthentication设置。端口改成非默认值之后有些审计脚本或者内部巡检工具可能会找不到原来的 22 端口进而误报“SSH 服务异常”这种情况需要同步更新监控配置。5. 进阶操作批量修改和配套加固5.1 用脚本批量修改多台 openEuler 服务器如果你管理一批服务器手动一台一台改不现实。我自己用的方式是写一个简单的 shell 脚本结合sshpass或预先配置好的 SSH 密钥批量执行#!/bin/bash # 批量修改 SSH 端口脚本 NEW_PORT2222 BACKUP_DIR/root/sshd_backup for host in $(cat hosts.txt); do echo Processing $host ssh -o StrictHostKeyCheckingno root$host mkdir -p $BACKUP_DIR; cp /etc/ssh/sshd_config $BACKUP_DIR/sshd_config.bak.$(date %F); sed -i s/^#Port 22/Port $NEW_PORT/ /etc/ssh/sshd_config; semanage port -a -t ssh_port_t -p tcp $NEW_PORT 2/dev/null || semanage port -m -t ssh_port_t -p tcp $NEW_PORT; firewall-cmd --permanent --add-port$NEW_PORT/tcp; firewall-cmd --reload; systemctl restart sshd; done这里有个细节如果服务器之前已经加了别的高位端口semanage port -a会报冲突所以我在脚本里用了|| semanage port -m做了兜底。在执行批量修改前建议先在两台测试机上跑通再拿到生产环境执行。5.2 端口改完的配套安全措施改端口只是安全加固的第一步。结合前面的实操我建议顺手做好这几件事强制密钥登录并关闭密码登录# /etc/ssh/sshd_config PubkeyAuthentication yes PasswordAuthentication no PermitRootLogin prohibit-password配置 Fail2ban 针对 SSH 的防护dnf install -y fail2ban systemctl enable --now fail2banFail2ban 会监控/var/log/secure里的认证失败记录连续失败超过阈值就把来源 IP 拉黑对应对暴力破解非常有效。限制 SSH 监听地址如果 SSH 只提供给内网用户可以把监听地址从0.0.0.0改成内网 IP设置ListenAddress限制来源ListenAddress 192.168.1.10定期检查登录日志lastlog journalctl -u sshd --since today | grep -i fail日志里如果出现大量某个 IP 的连续尝试基本可以断定是被盯上了。5.3 完整清单回顾我把整个流程的核心操作整理成一张速查表方便你对照执行检查项命令预期结果系统版本cat /etc/openEuler-release显示 openEuler 版本号当前监听端口ss -tlnp | grep sshd显示 22 端口配置语法sshd -t无输出或提示语法错误防火墙规则firewall-cmd --list-allports 包含新端口SELinux 端口类型semanage port -l | grep ssh包含新端口服务状态systemctl status sshdactive (running)端口连通性telnet IP 新端口Connected5.4 两个我踩过比较深的坑第一个是改完端口后发现原来配置好的 SSH 隧道、scp 脚本全部失效。很多内部脚本里硬编码了ssh userhost默认会走 22 端口改端口之后必须把这些脚本全部更新。我当时漏改了一个数据同步脚本恰好那个脚本没加错误处理结果静默失败了一周才发现数据差点断层。第二个是云平台安全组和系统防火墙是两层。openEuler 系统里放行了新端口但云平台安全组没放开依然连不进去。反过来也一样安全组放行了但系统防火墙没放行也不行。所以这类问题排查时一定要按“系统配置 → 系统防火墙 → SELinux → 云平台安全组”的顺序逐层确认而不是只盯着一层。另外再补充一个小技巧修改完端口后我习惯顺手把/etc/ssh/sshd_config里那个PrintMotd、Banner之类的信息也看一下倒不是必须改但趁配置文件开着顺便检查一下有没有可疑的配置项比如被塞进了异常的ForceCommand或者PermitOpen这些能有效防止配置中被人动手脚。我在实际操作中还有一个习惯不管多熟练每次修改前后都会用ssh -v跑一次连接把详细的握手日志打出来连接过程中的每一个阶段都能看得清清楚楚排查问题时效率高很多。改完端口之后你至少要坚持使用新端口连接一周确定所有依赖 SSH 的服务、脚本、定时任务全部正常再回头处理旧端口和旧规则。这种“先加后减”的方式看起来慢实际上最稳。
返回列表