Linux服务器安全加固实战:从Telnet到SSH与防火墙配置 📅 2026/6/26 12:44:16 1. 项目概述从Telnet到SSH的演进与防火墙的必要性在Linux运维和网络管理的日常工作中远程管理服务器是再基础不过的操作。十几年前我接触的第一台Linux服务器用的就是Telnet。敲下telnet 192.168.1.100输入用户名密码就能在千里之外操作它那种感觉在当时很神奇。但很快师傅就严肃地告诉我“生产环境绝对不能用Telnet数据全是明文传输跟在大街上喊密码没区别。” 这句话我记到现在。今天我们就来深入聊聊Linux网络安全的基石如何告别不安全的Telnet全面拥抱SSH并构筑起坚固的防火墙防线。这不仅是命令的堆砌更是一套完整的安全思维和实战体系适合所有从Linux新手到希望夯实安全基础的运维人员。简单来说这个“项目”的核心就是实现Linux服务器的安全远程访问与网络边界防护。它要解决的核心问题是如何确保管理员能够方便地远程管理服务器同时杜绝敏感信息如密码、操作指令在传输过程中被窃听并有效控制哪些网络流量可以进出服务器。我们将围绕Telnet的风险、SSH的全面配置与加固以及如何使用iptables或firewalld构建灵活的防火墙策略来展开。你会发现安全的配置并非高深莫测而是一系列明确、可实操的选择和设置。2. 核心组件深度解析协议、服务与工具2.1 Telnet为何成为历史遗留的风险点Telnet协议设计于互联网的“蛮荒时代”其核心问题在于所有通信内容包括用户名和密码均以明文形式在网络中传输。这意味着任何一个能够截获你与服务器之间数据包的人比如在同一局域网内发起ARP欺骗攻击都可以轻而易举地看到你的登录凭证和后续的所有操作命令。除了明文传输这个致命伤Telnet服务本身通常也缺乏现代认证机制如公钥认证和强大的加密会话支持。虽然在某些极端封闭、物理隔离的网络环境中可能因为老旧设备兼容性问题而短暂使用但在任何对安全有基本要求的场景下启用Telnet服务等同于敞开大门。在Linux中Telnet通常作为一个独立的软件包提供。例如在基于RPM的系统中你可能看到telnet-server包在基于Debian的系统中则是telnetd。检查系统是否安装了Telnet服务端是安全自查的第一步。你可以使用rpm -qa | grep telnet或dpkg -l | grep telnet来查看。如果发现除非有无法替代的特定理由否则我们的第一个操作就是卸载它sudo yum remove telnet-server或sudo apt purge telnetd。2.2 SSH安全远程管理的基石SSHSecure Shell协议彻底解决了Telnet的问题。它通过非对称加密技术建立安全连接整个过程可以概括为版本协商与密钥交换客户端连接服务器时双方先协商使用的SSH协议版本和加密算法。服务器身份验证服务器将自己的公钥发送给客户端。客户端首次连接时会看到该公钥的指纹并选择是否信任这就是你第一次连接时看到的“The authenticity of host ... cant be established”提示的由来。此后客户端会将该公钥保存在~/.ssh/known_hosts文件中下次连接时用于验证服务器身份防止“中间人攻击”。用户身份验证服务器身份确认后开始验证登录用户。常见方式有密码认证密码被加密后传输但仍有被暴力破解的风险。公钥认证最推荐的方式。客户端生成一对密钥私钥自己保管公钥上传到服务器。登录时客户端用私钥签名一段挑战信息服务器用预留的公钥验证。这种方式无需传输密码且破解难度极高。会话加密认证通过后双方会利用之前协商的对称加密算法如AES对后续所有通信数据进行加密确保传输内容的机密性。Linux世界最主流的SSH实现是OpenSSH。它包含了服务端sshd和客户端ssh工具。我们接下来的配置将主要围绕OpenSSH展开。2.3 防火墙网络流量的守门人防火墙是部署在网络边界根据预定义的安全规则对进出网络的数据包进行过滤、控制的系统。在Linux中我们主要接触两类防火墙工具iptables历史悠久的经典工具它直接与内核的Netfilter框架交互功能强大且直接但规则语法相对复杂且规则在重启后默认会丢失需另存或使用持久化工具。firewalldRed Hat系列发行版如CentOS、RHEL、Fedora引入的动态防火墙管理器。它提供了更高级的抽象如“区域”、“服务”概念支持运行时动态更新规则而无需重启服务且配置默认持久化。对于新手和大多数常规应用场景firewalld更友好。无论是iptables还是firewalld其核心工作都是基于对数据包的五元组源IP、目标IP、源端口、目标端口、协议以及连接状态进行分析然后执行ACCEPT接受、DROP丢弃无响应或REJECT拒绝返回拒绝响应等动作。3. 实战配置从安装加固到策略部署3.1 SSH服务端深度配置与加固默认安装的SSH虽然安全但仍有优化和加固空间。配置文件通常位于/etc/ssh/sshd_config。修改前务必备份以下是一些关键配置项及其解读# 使用vim或nano编辑配置文件 sudo vim /etc/ssh/sshd_config基础安全加固# 1. 修改默认端口将22端口改为一个大于1024的非知名端口能减少大量自动化扫描和暴力破解尝试。 Port 2222 # 示例端口请自定义一个 # 2. 禁止root用户直接登录即使密码再复杂直接暴露root也是高风险。 PermitRootLogin no # 3. 限制用户登录只允许必要的用户通过SSH登录。 AllowUsers alice bob admin_user # 4. 禁用密码认证强制使用公钥认证前提是你已配置好公钥。 PasswordAuthentication no PubkeyAuthentication yes # 5. 使用更安全的协议版本禁用已过时且存在漏洞的SSHv1。 Protocol 2 # 6. 限制最大认证尝试次数减缓暴力破解。 MaxAuthTries 3 # 7. 设置空闲会话超时断开避免连接被长期挂起。 ClientAliveInterval 300 # 300秒发送一次保活消息 ClientAliveCountMax 2 # 连续2次无响应则断开连接配置后必须重启服务sudo systemctl restart sshd # 检查服务状态和是否有错误日志 sudo systemctl status sshd sudo journalctl -u sshd -f --since 5 minutes ago重要提示在禁用密码认证和修改端口前必须确保你的公钥认证已经在该服务器上配置成功并能正常登录。否则你会把自己锁在门外测试时建议保持两个SSH会话窗口一个用于修改配置并重启服务另一个用于测试新配置是否生效确认无误后再关闭旧会话。3.2 生成与部署SSH密钥对这是告别密码实现免密安全登录的关键步骤。在客户端机器上生成密钥对如果还没有ssh-keygen -t ed25519 -C your_emailexample.com # -t 指定密钥类型ed25519比传统的rsa更安全快速。也可用 -t rsa -b 4096 # 执行后会提示你输入密钥保存路径直接回车用默认路径 ~/.ssh/id_ed25519和密码短语passphrase。密码短语为私钥再加一层保护即使私钥文件泄露没有短语也无法使用。将公钥部署到目标服务器# 最简单的方法使用 ssh-copy-id 工具 ssh-copy-id -p 2222 -i ~/.ssh/id_ed25519.pub usernameserver_ip # -p 指定SSH端口如果你修改了默认端口 # -i 指定要上传的公钥文件 # 如果服务器没有 ssh-copy-id可以手动操作 # 1. 将公钥内容复制到剪贴板 cat ~/.ssh/id_ed25519.pub # 2. 登录服务器编辑 ~/.ssh/authorized_keys 文件将公钥内容粘贴进去一行。 # 3. 确保 .ssh 目录权限为700authorized_keys文件权限为600。3.3 使用firewalld配置防火墙策略我们以firewalld为例因为它更直观且易于管理。首先确保firewalld已安装并运行sudo systemctl status firewalld # 如果未运行启用并启动sudo systemctl enable --now firewalld核心概念与操作区域Zone预定义的规则集如public公共区域默认、internal内部网络、trusted信任所有流量等。网卡可以被绑定到不同区域。服务Service预定义的一组端口/协议组合如ssh默认22端口、http80端口、https443端口。基础配置步骤查看默认区域和活跃区域sudo firewall-cmd --get-default-zone sudo firewall-cmd --get-active-zones为SSH开放自定义端口例如我们改成的2222# 方法一将现有ssh服务的端口修改为2222更规范 sudo firewall-cmd --permanent --remove-servicessh # 先移除默认22端口 sudo firewall-cmd --permanent --new-servicessh-custom # 创建自定义服务可选 sudo firewall-cmd --permanent --servicessh-custom --add-port2222/tcp --set-descriptionCustom SSH Port sudo firewall-cmd --permanent --add-servicessh-custom # 方法二直接添加端口更直接 sudo firewall-cmd --permanent --add-port2222/tcp限制SSH访问源IP强烈建议如果管理员的IP地址是固定的可以将其加入白名单极大提升安全性。# 假设管理员IP是 203.0.113.10 sudo firewall-cmd --permanent --add-rich-rulerule familyipv4 source address203.0.113.10 port port2222 protocoltcp accept # 然后拒绝其他所有IP访问2222端口注意默认策略是拒绝如果已添加了--add-port则需要先移除或使用富规则设置拒绝 # 更清晰的做法先移除对公网开放的2222端口规则然后只添加允许特定IP的规则。 sudo firewall-cmd --permanent --remove-port2222/tcp # 移除之前的通用开放规则 sudo firewall-cmd --permanent --add-rich-rulerule familyipv4 source address203.0.113.10 port port2222 protocoltcp accept应用配置并检查sudo firewall-cmd --reload # 重新加载配置使永久规则生效 sudo firewall-cmd --list-all # 列出当前区域所有规则 # 查看富规则 sudo firewall-cmd --list-rich-rules3.4 使用iptables配置防火墙策略如果你使用的发行版默认没有firewalld如Debian、Ubuntu早期版本或某些精简服务器iptables是直接的选择。一个基础的、状态化stateful的iptables规则集示例用于保护一台Web服务器开放80、443并管理SSH# 首先设置默认策略INPUT链默认丢弃FORWARD链丢弃OUTPUT链允许。 sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP sudo iptables -P OUTPUT ACCEPT # 允许本地回环(lo)接口的通信这对许多本地服务至关重要。 sudo iptables -A INPUT -i lo -j ACCEPT # 允许已建立的连接和相关的连接状态化防火墙的核心确保对外发起的请求能有回应。 sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT # 允许ICMP协议如ping便于网络诊断但生产环境可根据需要限制。 sudo iptables -A INPUT -p icmp -j ACCEPT # 开放SSH端口假设为2222并限制源IP。 sudo iptables -A INPUT -p tcp --dport 2222 -s 203.0.113.10 -j ACCEPT # 如果需要允许一个IP段可以使用 -s 203.0.113.0/24 # 开放Web服务端口。 sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 最后记录所有被丢弃的包可选用于调试注意日志量可能很大。 sudo iptables -A INPUT -j LOG --log-prefix IPTables-Dropped: 保存iptables规则否则重启后丢失在CentOS/RHEL 7上可以使用iptables-save和iptables-restore或安装iptables-services包后用service iptables save。 在Debian/Ubuntu上可以安装iptables-persistent包它在安装时会保存当前规则之后使用netfilter-persistent save来保存。# 通用方法手动保存和恢复 sudo iptables-save /etc/iptables.rules # 在系统启动时恢复可以将恢复命令添加到 /etc/rc.local 或创建 systemd 服务。4. 高级安全实践与故障排查4.1 SSH加固进阶技巧使用Fail2ban防御暴力破解即使改了端口、用了密钥SSH端口依然会收到扫描。Fail2ban可以监控日志当发现多次失败登录尝试后自动临时封禁源IP。# 安装以Ubuntu为例 sudo apt install fail2ban # 复制默认配置文件进行自定义 sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local # 编辑 jail.local找到 [sshd] 部分确保 enabled true并可以调整 bantime, findtime, maxretry。 sudo systemctl enable --now fail2ban监听内网地址如果服务器只需要被内网管理可以在sshd_config中绑定内网IP。ListenAddress 192.168.1.100 ListenAddress ::1 # IPv6 回环地址使用TCP Wrappers进行额外控制虽然逐渐被淘汰但在某些简单场景下/etc/hosts.allow和/etc/hosts.deny文件可以提供一层额外的访问控制。# /etc/hosts.allow sshd: 192.168.1.0/24, 203.0.113.10 # /etc/hosts.deny sshd: ALL4.2 防火墙策略优化区域划分使用firewalld时根据网络接口所处的物理位置绑定不同的区域。例如eth0连接公网绑定到public区域规则严格eth1连接内部管理网络绑定到internal区域规则宽松。sudo firewall-cmd --zoneinternal --change-interfaceeth1 --permanent sudo firewall-cmd --reload使用富规则Rich Rules实现复杂逻辑firewalld的富规则非常强大可以实现限速、日志记录、端口转发等。# 限制SSH连接速率防止暴力破解 sudo firewall-cmd --permanent --add-rich-rulerule service namessh-custom limit value2/m accept # 记录并丢弃来自某个IP的所有流量 sudo firewall-cmd --permanent --add-rich-rulerule familyipv4 source address10.20.30.40 log prefixBlockedIP levelinfo drop定期审计规则使用firewall-cmd --list-all --zonepublic或iptables -L -n -v定期检查规则移除不再需要的条目确保策略最小化。4.3 常见连接问题与排查指南问题1修改SSH端口后无法连接。检查顺序防火墙这是最常见的原因。确保新端口如2222已在防火墙中正确开放并且没有限制源IP除非你确认你的IP在允许列表中。使用sudo firewall-cmd --list-all或sudo iptables -L -n仔细检查。SELinux如果系统启用了SELinux如CentOS它可能会阻止非标准端口的SSH服务。临时解决sudo setsebool -P ssh_port_t 2222或永久添加端口标签sudo semanage port -a -t ssh_port_t -p tcp 2222。服务监听确认sshd正在监听新端口sudo ss -tlnp | grep :2222或sudo netstat -tlnp | grep :2222。配置文件语法检查/etc/ssh/sshd_config是否有语法错误特别是Port指令前不能有#注释且重启了服务。问题2公钥认证配置正确但仍要求输入密码。排查步骤服务器端文件权限这是99%的问题所在。确保服务器上对应用户家目录下的.ssh文件夹权限为700authorized_keys文件权限为600。错误的权限如755或644会导致SSH出于安全考虑拒绝使用密钥。chmod 700 ~/.ssh chmod 600 ~/.ssh/authorized_keys公钥内容检查authorized_keys文件中的公钥内容是否完整没有多余空格或换行。最好用ssh-copy-id来避免格式问题。SSH配置确认/etc/ssh/sshd_config中PubkeyAuthentication yes已启用。客户端私钥权限客户端私钥文件如~/.ssh/id_ed25519权限应设置为600。问题3防火墙规则似乎不生效。排查思路规则顺序iptables规则是按顺序匹配的。如果你先有一条ACCEPT all的规则后面的DROP规则就无效了。使用iptables -L -n --line-numbers查看规则顺序。默认策略检查INPUT链的默认策略是ACCEPT还是DROP。如果默认是ACCEPT那么没有明确DROP的流量都会被放行。firewalld重载修改--permanent规则后必须执行firewall-cmd --reload才能生效仅--reload不会加载永久规则。多个防火墙工具冲突确保系统没有同时运行iptables服务和firewalld服务它们会互相冲突。通常只启用一个。问题4连接速度慢尤其是登录时卡顿。可能原因与解决DNS反向解析sshd默认会尝试解析客户端的IP地址到主机名如果DNS服务器响应慢或不可达就会造成延迟。在sshd_config中禁用UseDNS noGSSAPI认证如果不需要Kerberos认证可以禁用以加快登录速度GSSAPIAuthentication no修改后重启sshd服务。配置Linux的网络安全尤其是SSH和防火墙是一个从“可用”到“可靠”再到“安全”的渐进过程。没有一劳永逸的银弹关键在于理解每个配置项背后的安全含义并根据自己的实际环境是暴露在公网还是内网管理员的网络环境是否固定来制定策略。我的习惯是任何新服务器上线第一件事就是配置密钥登录、修改SSH端口、设置防火墙白名单然后再做其他操作。这套组合拳打下来能挡掉99%的自动化脚本和初级攻击者为服务器提供一个坚实的安全基线。