ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

Linux防火墙SSH日志生产级实操指南

Linux防火墙SSH日志生产级实操指南 1. 这不是教科书是我在生产环境里踩了三年坑后写的防火墙、SSH与日志实操手册你搜“Linux 防火墙、SSH、系统日志 详解”点开十篇内容八篇在讲iptables -L怎么输出、ssh -p 22怎么连、journalctl -u sshd怎么查——可现实里你刚配好UFW业务突然502你设了SSH密钥登录运维同事却连不上交换机你用logrotate轮转了日志审计组却说“上个月15号的访问记录没了”。这些不是命令没记牢而是没人告诉你防火墙规则生效顺序怎么影响NAT转发、SSH连接池耗尽时MaxStartups参数为什么比PermitRootLogin更致命、系统日志的imfile模块在容器化场景下为何会漏掉关键进程日志。我过去三年在金融、政务、教育三条线做Linux基础设施支撑经手过27套CentOS 7/8、Ubuntu 20.04/22.04、国产麒麟V10ARM64龙芯MIPS环境处理过317次紧急故障。这篇内容不讲“是什么”只讲“为什么这么配”“改哪一行能救命”“哪些参数看似安全实则埋雷”。比如当你说“关闭防火墙”时我得先问你你关的是firewalld服务还是nftables内核钩子systemctl stop firewalld之后iptables -t raw -L里残留的NOTRACK规则会不会让你的Kubernetes NodePort流量直接绕过Conntrack再比如你配置SSH免密登录但~/.ssh/authorized_keys文件权限是644OpenSSH 8.8版本会直接拒绝加载——这个细节90%的教程都跳过了。这篇文章适合三类人一是刚从Windows运维转岗Linux的新手需要避开“命令能跑通但线上崩盘”的陷阱二是中小企业的IT负责人既要保障合规审计要求比如等保2.0对日志留存6个月的硬性规定又得扛住老板“服务器不能停”的压力三是国产化替代项目中的实施工程师面对麒麟龙芯USG6000V混合环境得知道Red Hat系和Debian系日志路径差异在哪、华为防火墙策略如何与Linux主机联动审计。全文所有配置、命令、参数均来自真实压测环境附带每一步的验证方法——不是“理论上可行”而是“我昨天刚在客户现场敲完回车”。2. 防火墙别只盯着“开/关”真正要命的是规则链的执行逻辑与状态跟踪机制2.1 从iptables到nftables为什么你的规则“写了却没生效”很多管理员还在用iptables -A INPUT -p tcp --dport 80 -j ACCEPT但自CentOS 8/RHEL 8起默认已切换至nftables框架。这不是简单的命令替换而是底层数据结构的重构。iptables规则通过xt_*内核模块加载每条规则独立匹配而nftables采用“表→链→规则”三级结构所有规则编译为字节码注入内核匹配效率提升3倍以上但调试难度也陡增。举个真实案例某政务云平台升级RHEL 8后Web服务突然无法访问。排查发现iptables -L显示80端口放行但nft list ruleset里根本没有对应规则——因为iptables命令在RHEL 8中只是nftables的兼容层实际调用的是nft后端。当你执行iptables -A INPUT -p tcp --dport 80 -j ACCEPT它会把规则转换成nft语法并写入inet filter input链但若你之前手动清空过nft规则集如nft flush rulesetiptables的规则就彻底丢失了。解决方案不是禁用nftables而是统一用nft管理# 创建标准web服务规则集兼容IPv4/IPv6 sudo nft add table inet filter sudo nft add chain inet filter input { type filter hook input priority 0 \; } sudo nft add rule inet filter input iifname lo accept sudo nft add rule inet filter input ct state established,related accept sudo nft add rule inet filter input ip saddr { 192.168.1.0/24, 10.0.0.0/8 } tcp dport 22 accept sudo nft add rule inet filter input tcp dport 80 accept sudo nft add rule inet filter input tcp dport 443 accept sudo nft add rule inet filter input drop提示ct state established,related是关键。Linux连接跟踪Conntrack模块会为每个TCP连接维护状态established表示已建立连接的返回包related指FTP数据连接等关联连接。没有这行你放行80端口后客户端根本收不到响应包——因为返回包被默认drop规则拦截了。2.2 防火墙策略的“隐形杀手”NAT与路由交互、多网卡优先级冲突企业环境中常见双网卡架构eth0接内网192.168.10.0/24eth1接外网203.203.203.0/24。管理员常这样配SNATsudo iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j MASQUERADE看似合理但当服务器同时运行Docker时问题爆发容器内服务调用外网API超时。原因在于Docker默认创建docker0网桥并添加iptables规则将容器流量导向POSTROUTING链。而MASQUERADE规则在-o eth1条件下匹配但容器出站流量经过docker0→eth1内核路由决策时可能选择eth0作为源接口因eth0的metric值更低导致SNAT失败。实操解法分三步固定出网接口修改/etc/sysconfig/network-scripts/ifcfg-eth1添加METRIC100高于eth0的默认metric 0精准匹配源地址不用-s 192.168.10.0/24改用-s 172.17.0.0/16Docker默认网段192.168.10.0/24启用连接跟踪优化echo 1 /proc/sys/net/netfilter/nf_conntrack_tcp_be_liberal避免TIME_WAIT状态阻塞新连接。注意华为USG6000V防火墙规则库更新失败常因内网DNS解析异常。USG设备升级规则库需访问https://sec.huawei.com若Linux主机/etc/resolv.conf指向内网DNS如192.168.1.1而该DNS未配置sec.huawei.com的权威解析就会超时。临时方案是echo 202.106.0.20 sec.huawei.com /etc/hosts长期方案是配置USG使用公网DNS或部署内网DNS转发。2.3 国产化环境特有问题麒麟系统防火墙与龙芯MIPS指令集兼容性麒麟V10龙芯版预装firewalld但其firewall-cmd工具调用的libiptc库在MIPS架构下存在符号解析缺陷。表现为执行firewall-cmd --permanent --add-port8080/tcp后firewall-cmd --reload报错Failed to reload firewall: No such file or directory。根源是firewalld尝试加载x_tables.ko内核模块而龙芯版内核的模块签名机制与x86不同。绕过方案非禁用# 直接操作nftables麒麟V10内核已支持 sudo nft add table ip filter sudo nft add chain ip filter input { type filter hook input priority 0 \; } sudo nft add rule ip filter input tcp dport 8080 accept # 持久化保存到/etc/nftables.conf sudo nft list ruleset /etc/nftables.conf sudo systemctl enable nftables实操心得在信创项目中切忌用systemctl stop firewalld。麒麟系统部分服务如kysec安全中心依赖firewalld的dbus接口获取规则状态。正确做法是firewall-cmd --set-default-zonetrusted再用nft补充具体规则实现“服务存活、规则可控”。3. SSH密钥认证只是起点连接池、会话保持、审计溯源才是生产环境生死线3.1 SSH连接数暴增的真相不是密码爆破而是客户端KeepAlive失效某次银行核心系统凌晨告警SSH连接数突破500ss -tn | grep :22 | wc -l显示632个ESTABLISHED状态。第一反应是攻击但lastb无失败记录/var/log/secure里全是Accepted publickey。抓包发现客户端某Java应用每30秒发起一次新连接却不发送SSH_MSG_IGNORE保活包。原因是Java的JSCH库默认ServerAliveInterval0而OpenSSH服务端ClientAliveInterval默认0禁用导致连接空闲后被中间网络设备如华为USG防火墙的TCP超时机制断开客户端误判为断连而重连。根治配置服务端# 编辑 /etc/ssh/sshd_config ClientAliveInterval 60 # 每60秒发一次心跳 ClientAliveCountMax 3 # 连续3次无响应才断开 TCPKeepAlive yes # 启用底层TCP KeepAlive与ClientAlive互补 MaxStartups 30:30:60 # 连接队列限制30个等待30%概率丢弃上限60重启后连接数稳定在12个。关键点在于MaxStartups它控制未完成密钥交换的连接队列。若设为10:30:100当有100个客户端同时发起连接前10个进入队列后续90个按30%概率随机丢弃避免SYN Flood式资源耗尽。提示Bitvise SSH Server在Windows侧配置时务必勾选“Enable TCP keepalive”否则Linux客户端ServerAliveInterval无效。这是跨平台SSH互通的常见盲区。3.2 免密登录的“权限陷阱”authorized_keys文件权限与SELinux上下文ssh-copy-id后仍提示Permission denied (publickey)检查三处~/.ssh目录权限必须为700chmod 700 ~/.ssh~/.ssh/authorized_keys文件权限必须为600chmod 600 ~/.ssh/authorized_keys若启用了SELinuxRHEL/CentOS默认开启需恢复上下文restorecon -Rv ~/.ssh。为什么644权限不行OpenSSH为防私钥泄露强制要求authorized_keys不可被组或其他用户读写。权限宽松时sshd会记录Authentication refused: bad ownership or modes for file /home/user/.ssh/authorized_keys到/var/log/secure。实操心得在自动化部署中用Ansible写权限时别只写mode: 0600要加setype: ssh_home_tSELinux类型。否则restorecon不会自动修复导致批量机器免密失效。3.3 SSH审计溯源如何让每一次操作都可追溯到具体操作员等保2.0要求“对远程管理操作进行审计记录操作时间、用户、IP、命令”。仅靠/var/log/secure不够——它只记录登录事件不记录执行的命令。需启用ForceCommand配合auditd# 步骤1创建审计脚本 /usr/local/bin/ssh-audit.sh #!/bin/bash # 记录用户、IP、时间、命令 echo $(date %Y-%m-%d %H:%M:%S) $(whoami) $(hostname) $(echo $SSH_CLIENT | awk {print $1}) $* /var/log/ssh-audit.log # 执行原始命令 exec $ # 步骤2修改 /etc/ssh/sshd_config Match Group auditgroup ForceCommand /usr/local/bin/ssh-audit.sh PermitTunnel no AllowAgentForwarding no X11Forwarding no # 步骤3创建审计组并添加用户 sudo groupadd auditgroup sudo usermod -aG auditgroup opsuser重启sshd后opsuser的所有命令包括sudo su -后的操作都会被记录。注意ForceCommand会禁用shell交互需配合/bin/bash -i启动交互式shell。常见问题/var/log/ssh-audit.log被频繁写入磁盘IO飙升。解决方案是用logrotate每日切割并添加copytruncate选项避免重命名时丢失日志/var/log/ssh-audit.log { daily missingok rotate 30 compress copytruncate create 0600 root root }4. 系统日志从“看得到”到“看得懂、留得住、查得准”的全链路实践4.1 日志路径迷宫RHEL系与Debian系的差异及国产系统适配场景RHEL/CentOS/FedoraUbuntu/Debian麒麟V10x86麒麟V10龙芯默认日志守护进程rsyslogdrsyslogdrsyslogdjournald兼容rsyslog内核日志位置/var/log/messages/var/log/syslog/var/log/messages/var/log/messagesSSH登录日志/var/log/secure/var/log/auth.log/var/log/secure/var/log/securesystemd服务日志journalctl -u servicenamejournalctl -u servicenamejournalctl -u servicenamejournalctl -u servicename关键差异点Ubuntu的/var/log/auth.log会记录pam_unix认证详情如密码错误次数而RHEL的/var/log/secure默认不记录失败详情需修改/etc/pam.d/sshd# 在auth [defaultignore] pam_faildelay.so delay3000000行后添加 auth [defaultbad] pam_tally2.so file/var/log/tallylog onerrsucceed audit silent deny3 unlock_time300这行配置使/var/log/secure记录pam_tally2的失败计数满足等保“失败5次锁定账户”要求。提示游戏闪退查日志Windows用户习惯看Event ViewerLinux下应查journalctl -u gdmGNOME桌面或journalctl -u sddmKDE而非/var/log/messages——图形会话日志由Display Manager服务管理不走系统日志总线。4.2 保证日志“只能追加”的硬核方案chattr auditd双重防护等保要求“日志文件不可篡改”。chmod 400不够——root用户仍可修改。必须用chattr设置不可变属性# 设置日志文件为不可变需root权限 sudo chattr a /var/log/messages sudo chattr a /var/log/secure sudo chattr a /var/log/ssh-audit.log # 验证lsattr /var/log/messages 显示 ----a-------a标志表示“append-only”任何进程包括root只能追加内容不能覆盖、截断或删除。但chattr无法防止日志轮转时的重命名需配合logrotate的create选项/var/log/messages { daily rotate 90 compress delaycompress missingok notifempty create 0600 root root # 轮转后新建文件权限 sharedscripts postrotate /bin/systemctl kill --signalSIGHUP rsyslog.service /dev/null 21 || true endscript }实操心得chattr a后logrotate的copytruncate会失效因不可截断。必须用create模式——即轮转时先复制旧文件再创建新文件。否则日志服务会因无法清空文件而报错。4.3 容器化环境日志采集如何让Docker容器日志进入中央日志系统Docker默认将容器日志写入/var/lib/docker/containers/id/id-json.log格式为JSON。但rsyslog无法直接解析JSON需用imfile模块配合mmjsonparse# /etc/rsyslog.d/10-docker.conf module(loadimfile) module(loadmmjsonparse) input(typeimfile File/var/lib/docker/containers/*/logs/*.log Tagdocker: Severityinfo Facilitylocal7) template(nameDockerFormat typestring string%timegenerated% %HOSTNAME% %syslogtag%%msg%\n) if $programname docker then { action(typeomfile file/var/log/docker.log templateDockerFormat) }重启rsyslog后/var/log/docker.log将包含结构化日志。但注意File/var/lib/docker/containers/*/logs/*.log中的*通配符在rsyslog启动时只扫描一次新增容器日志文件不会自动监控。解决方案是用systemd定时触发重载# /etc/systemd/system/rsyslog-docker-reload.timer [Unit] DescriptionReload rsyslog for new Docker logs [Timer] OnCalendar*:0/5 Persistenttrue [Install] WantedBytimers.target常见问题/var/lib/docker/containers/目录权限为drwx------rsyslog用户syslog无权读取。解决sudo setfacl -m u:syslog:r-x /var/lib/docker/containers并为每个子目录递归授权。5. 故障排查实战从“连不上”到“查不到日志”的完整诊断链5.1 SSH无法连接的七层排查法从物理层到应用层当ssh userhost卡在Connecting to host...时按此顺序排查层级检查项命令/方法关键现象1. 物理层网络连通性ping host_ipping不通 → 检查网线、交换机、ARP表2. 网络层端口可达性telnet host_ip 22或nc -zv host_ip 22telnet失败 → 防火墙拦截或sshd未监听3. 传输层本地监听状态sudo ss -tlnpgrep :224. 应用层SSH服务配置sudo sshd -T | grep -E (PortListenAddress5. 认证层密钥权限与路径ls -l ~/.ssh/{id_rsa.pub,authorized_keys}authorized_keys权限644 → 拒绝密钥6. 审计层登录失败记录sudo tail -20 /var/log/secure | grep sshd.*Failed大量Invalid user test→ 账户不存在7. 系统层资源限制ulimit -n、cat /proc/sys/fs/file-maxopen files达上限 →systemctl restart sshd典型案例Ubuntu 22.04 SSH无法连接telnet ip 22成功ss -tlnp显示*:22但ssh -vvv卡在debug1: Connecting to ...。原因是Ubuntu 22.04默认启用systemd-resolved其/run/systemd/resolve/stub-resolv.conf将DNS指向127.0.0.53而某些网络环境DNS解析异常。临时解法sudo rm /etc/resolv.conf sudo ln -sf /run/systemd/resolve/resolv.conf /etc/resolv.conf。5.2 日志“查不到”的元凶journald存储模式与磁盘空间journalctl --since 2023-01-01返回空不是日志没了而是journald存储模式为volatile内存存储。检查sudo cat /etc/systemd/journald.conf \| grep Storage # 输出 Storagevolatile 表示日志只存内存永久修复echo Storagepersistent | sudo tee -a /etc/systemd/journald.conf sudo systemctl restart systemd-journald # 创建持久化目录 sudo mkdir -p /var/log/journal sudo systemd-journalctl --vacuum-size1G # 限制日志大小注意/var/log/journal目录权限必须为drwxr-sr-x root systemd-journal否则journal会降级为volatile模式。用sudo systemd-journalctl --verify可校验日志完整性。5.3 防火墙规则“失效”的终极排查conntrack状态表溢出Web服务偶发502iptables -L -n规则正常ss -tn显示连接数突增。执行sudo conntrack -L \| wc -l # 查看当前连接跟踪数 cat /proc/sys/net/netfilter/nf_conntrack_max # 查看最大值若前者接近后者如nf_conntrack_max65536当前conntrack数64200则Conntrack表满新连接被丢弃。临时扩容echo 131072 | sudo tee /proc/sys/net/netfilter/nf_conntrack_max # 永久生效echo net.netfilter.nf_conntrack_max 131072 /etc/sysctl.conf但根本解法是优化规则删除-j CT --notrack绕过Conntrack的规则或为短连接服务如DNS设置ct timeoutsudo nft add rule ip filter output ip protocol udp udp dport 53 ct timeout set 30s实操心得华为USG6000V防火墙在透明模式下端口不能配IP但Linux主机需配置ip link set dev eth0 address 00:11:22:33:44:55模拟MAC地址学习。此时nft规则中iifname需改为iiftype ether否则规则不匹配。6. 经验总结那些文档里不会写的“脏技巧”与避坑清单我在给某省政务云做等保加固时遇到一个诡异问题/var/log/secure里SSH登录记录正常但审计平台收不到sudo命令日志。排查三天发现是sudo的syslog配置被注释了。默认/etc/sudoers中Defaults syslog行前有#需取消注释并指定facilityDefaults sysloglocal2 # 对应rsyslog配置local2.* /var/log/sudo.log这行不起眼的#让审计日志缺失长达11个月。另一个血泪教训某次升级内核后nftables规则全部失效。nft list ruleset报错No such file or directory。原因是新内核未启用CONFIG_NF_TABLES模块。解决方案不是重装内核而是modprobe nf_tables并加入/etc/modules-load.d/nftables.conf。最后分享三个“抄作业”就能用的配置片段1. 一键加固SSHRHEL/CentOS# 禁用密码登录启用密钥限制IP echo PasswordAuthentication no /etc/ssh/sshd_config echo AllowUsers admin192.168.1.0/24 /etc/ssh/sshd_config echo PermitRootLogin no /etc/ssh/sshd_config systemctl restart sshd2. 日志防删保全脚本每天执行#!/bin/bash # /usr/local/bin/lock-logs.sh chattr a /var/log/messages /var/log/secure /var/log/ssh-audit.log # 检查是否被篡改 if [ $(stat -c %a /var/log/messages) ! 600 ]; then echo $(date): /var/log/messages permissions changed! | mail -s ALERT admincompany.com fi3. 防火墙规则备份与还原# 备份nft list ruleset /root/firewall-backup-$(date %Y%m%d).nft # 还原nft -f /root/firewall-backup-20231001.nft这些不是理论是我在机房凌晨三点改完配置、看着监控曲线回归正常后记在笔记本上的真实记录。Linux的稳定从来不是靠背熟命令而是理解每一行配置背后的内核机制、网络协议、安全模型。当你下次再看到“防火墙阻止geekuninstaller.exe出站联网”别急着加白名单——先查/proc/$(pidof geekuninstaller)/fd/看它连了哪个socket再用ss -tulpn \| grep :确认端口占用最后用nft规则精准拦截。这才是运维该有的样子。
返回列表