11 - 防火墙与安全加固一、防火墙概述Linux 防火墙主要分为两代工具说明使用场景firewalld动态防火墙区域概念CentOS 默认CentOS 7 / RHELiptables传统防火墙规则链通用 / 旧系统nftablesiptables 的继任者内核 3.13 / 新系统ufwiptables 的简化前端Ubuntu 默认数据包过滤流程数据包进入 → PREROUTING → 路由判断 ├─ 本机处理 → INPUT → 应用程序 → OUTPUT → POSTROUTING → 发出 └─ 转发 → FORWARD → POSTROUTING → 发出二、firewalld2.1 基本操作# 查看状态systemctl status firewalld firewall-cmd--state# 启动/停止/重启systemctl start firewalld systemctl stop firewalld systemctl restart firewalld# 开机自启systemctlenablefirewalld systemctl disable firewalld2.2 区域Zone管理firewalld 使用区域概念不同区域有不同的信任级别区域信任级别说明trusted完全信任允许所有流量public不信任默认区域仅允许选中服务home较信任家庭网络internal较信任内部网络work较信任工作网络dmz不信任DMZ 隔离区block拒绝拒绝所有流量drop丢弃丢弃所有包不回应# 查看默认区域firewall-cmd --get-default-zone# 查看所有区域firewall-cmd --get-zones# 查看当前激活的区域firewall-cmd --get-active-zones# 查看区域配置firewall-cmd--zonepublic --list-all# 切换默认区域firewall-cmd --set-default-zonepublic2.3 服务与端口管理# 查看已开放的服务firewall-cmd--zonepublic --list-services# 开放服务服务名来自 /etc/servicesfirewall-cmd--permanent--zonepublic --add-servicehttp firewall-cmd--permanent--zonepublic --add-servicehttps firewall-cmd--permanent--zonepublic --add-servicessh# 移除服务firewall-cmd--permanent--zonepublic --remove-servicehttp# 开放端口firewall-cmd--permanent--zonepublic --add-port8080/tcp firewall-cmd--permanent--zonepublic --add-port3000-3100/tcp# 端口范围firewall-cmd--permanent--zonepublic --add-port53/udp# UDP 端口# 移除端口firewall-cmd--permanent--zonepublic --remove-port8080/tcp# 查看已开放的端口firewall-cmd--zonepublic --list-ports# 重新加载永久规则生效firewall-cmd--reload# 查看所有配置firewall-cmd--zonepublic --list-all重要使用--permanent的规则需要--reload才生效。不加--permanent则立即生效但重启后丢失。2.4 IP 伪装与端口转发# 开启 IP 伪装NAT让内网机器通过本机上网firewall-cmd--permanent--zonepublic --add-masquerade firewall-cmd--reload# 端口转发将 80 端口转发到 8080firewall-cmd--permanent--zonepublic --add-forward-portport80:prototcp:toport8080# 端口转发到其他机器firewall-cmd--permanent--zonepublic --add-forward-portport80:prototcp:toaddr192.168.1.20:toport8080firewall-cmd--reload2.5 Rich Rules富规则富规则提供更精细的控制# 允许指定 IP 访问指定端口firewall-cmd--permanent--add-rich-rulerule familyipv4 source address192.168.1.100 port port3306 protocoltcp accept# 拒绝指定 IP 的所有访问firewall-cmd--permanent--add-rich-rulerule familyipv4 source address192.168.1.200 reject# 允许指定网段firewall-cmd--permanent--add-rich-rulerule familyipv4 source address192.168.1.0/24 accept# 限制连接数防止暴力破解firewall-cmd--permanent--add-rich-rulerule service namessh limit value3/m accept# 查看富规则firewall-cmd--zonepublic --list-rich-rules# 删除富规则firewall-cmd--permanent--remove-rich-rulerule familyipv4 source address192.168.1.200 rejectfirewall-cmd--reload三、iptables3.1 基本概念iptables 有四表五链四表表作用filter包过滤默认nat地址转换mangle包修改raw连接追踪豁免五链链时机INPUT入站包OUTPUT出站包FORWARD转发包PREROUTING路由前POSTROUTING路由后3.2 常用命令# 查看规则iptables-L-n-v# 查看所有规则带统计iptables-L-n--line-numbers# 显示行号iptables-tnat-L-n# 查看 NAT 表# 允许已建立的连接iptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT# 允许本地回环iptables-AINPUT-ilo-jACCEPT# 允许 SSHiptables-AINPUT-ptcp--dport22-jACCEPT# 允许 HTTP/HTTPSiptables-AINPUT-ptcp--dport80-jACCEPT iptables-AINPUT-ptcp--dport443-jACCEPT# 允许指定 IP 访问 MySQLiptables-AINPUT-ptcp-s192.168.1.100--dport3306-jACCEPT# 拒绝其他所有入站流量iptables-AINPUT-jDROP iptables-PINPUT DROP# 设置默认策略3.3 规则管理# 插入规则插入到指定位置默认第1位iptables-IINPUT1-ptcp--dport8080-jACCEPT# 删除规则iptables-DINPUT3# 删除第 3 条规则iptables-DINPUT-ptcp--dport80-jACCEPT# 按内容删除# 清空所有规则危险iptables-F# 清空指定链iptables-FINPUT# 清空计数器iptables-Z# 设置默认策略iptables-PINPUT DROP iptables-PFORWARD DROP iptables-POUTPUT ACCEPT3.4 保存与恢复# 保存规则CentOSiptables-save/etc/sysconfig/iptables# 保存规则Ubuntuiptables-save/etc/iptables/rules.v4# 恢复规则iptables-restore/etc/sysconfig/iptables# 安装持久化工具yuminstall-yiptables-services# CentOSsystemctlenableiptables3.5 常用 iptables 脚本#!/bin/bash# firewall_setup.sh - 基础防火墙配置# 清空现有规则iptables-Fiptables-Xiptables-Z# 设置默认策略iptables-PINPUT DROP iptables-PFORWARD DROP iptables-POUTPUT ACCEPT# 允许本地回环iptables-AINPUT-ilo-jACCEPT# 允许已建立的连接iptables-AINPUT-mstate--stateESTABLISHED,RELATED-jACCEPT# 允许 ICMPpingiptables-AINPUT-picmp-jACCEPT# 开放服务端口iptables-AINPUT-ptcp--dport22-jACCEPT# SSHiptables-AINPUT-ptcp--dport80-jACCEPT# HTTPiptables-AINPUT-ptcp--dport443-jACCEPT# HTTPS# 防 SSH 暴力破解每分钟最多 5 次新连接iptables-AINPUT-ptcp--dport22-mstate--stateNEW-mrecent--setiptables-AINPUT-ptcp--dport22-mstate--stateNEW-mrecent--update--seconds60--hitcount5-jDROP# 防 SYN Floodiptables-AINPUT-ptcp--syn-mlimit--limit20/s --limit-burst40-jACCEPT iptables-AINPUT-ptcp--syn-jDROP# 保存规则iptables-save/etc/sysconfig/iptablesecho防火墙配置完成四、ufwUbuntu# 安装aptinstall-yufw# 查看状态ufw status verbose# 启用/禁用ufwenableufw disable# 允许/拒绝端口ufw allow80/tcp ufw allow443/tcp ufw allow22/tcp ufw deny3306/tcp# 允许指定 IPufw allow from192.168.1.100 to any port3306# 允许网段ufw allow from192.168.1.0/24 to any port22# 删除规则ufw delete allow80/tcp# 按编号删除ufw status numbered ufw delete3# 重置ufw reset# 默认策略ufw default deny incoming ufw default allow outgoing五、SELinux5.1 SELinux 概念SELinuxSecurity-Enhanced Linux是 Linux 内核的强制访问控制MAC安全模块。三种模式模式说明enforcing强制执行违规即阻止permissive宽容模式违规只记录不阻止disabled禁用5.2 SELinux 操作# 查看状态getenforce sestatus# 临时切换模式setenforce0# 切换到 permissivesetenforce1# 切换到 enforcing# 永久修改重启生效# 编辑 /etc/selinux/configSELINUXpermissive# 或 enforcing / disabled5.3 SELinux 上下文# 查看文件上下文ls-Z/var/www/html/index.html# 修改文件上下文chcon-thttpd_sys_content_t /var/www/html/index.html chcon-R-thttpd_sys_content_t /var/www/html/# 恢复默认上下文restorecon-Rv/var/www/html/# 查看进程上下文ps-eZ|grepnginx# 查看端口上下文semanage port-l|grephttp5.4 SELinux 排错# 查看 SELinux 拒绝日志ausearch-mavc-tsrecentgrepdenied /var/log/audit/audit.log# 使用 audit2allow 生成策略grephttpd /var/log/audit/audit.log|audit2allow-Mmypol semodule-imypol.pp# 查看 SELinux 布尔值getsebool-a|grephttpd setsebool-Phttpd_can_network_connect on运维建议生产环境建议保持 SELinux 为 enforcing 模式。遇到问题时先用 permissive 模式排查找到原因后调整策略而不是直接关闭。六、SSH 安全加固6.1 sshd 配置编辑/etc/ssh/sshd_config# 禁止 root 直接登录PermitRootLogin no# 禁止密码登录仅用密钥PasswordAuthentication no# 修改默认端口减少扫描Port2222# 禁止空密码PermitEmptyPasswords no# 限制登录用户AllowUsers alice bob# 或限制组AllowGroups sshusers# 登录超时秒LoginGraceTime30# 最大尝试次数MaxAuthTries3# 禁止 X11 转发不需要的话X11Forwarding no# 空闲超时自动断开ClientAliveInterval300ClientAliveCountMax0# 禁止 DNS 反查加快登录UseDNS no# 重启生效systemctl restart sshd6.2 fail2ban 防 SSH 暴力破解# 安装yuminstall-yepel-releaseyuminstall-yfail2ban# CentOSaptinstall-yfail2ban# Ubuntu# 配置cat/etc/fail2ban/jail.localEOF [sshd] enabled true port 2222 maxretry 5 findtime 600 bantime 3600 # bantime -1 # 永久封禁 EOF# 启动systemctlenable--nowfail2ban# 查看状态fail2ban-client status fail2ban-client status sshd# 手动解封 IPfail2ban-clientsetsshd unbanip192.168.1.100七、系统安全加固清单7.1 账户安全# 1. 删除不必要的账户userdel-rgamesuserdel-rnews# 2. 检查空密码账户awk-F:($2 ) {print $1}/etc/shadow# 3. 锁定不使用的账户passwd-lusername# 4. 设置密码策略# /etc/login.defsPASS_MAX_DAYS90PASS_MIN_DAYS2PASS_MIN_LEN12PASS_WARN_AGE7# 5. 密码复杂度安装 pam_pwquality# /etc/security/pwquality.confminlen12minclass4# 至少包含4类字符maxrepeat37.2 文件权限# 设置关键文件权限chattr i /etc/passwd# 不可修改连 root 也不能改需 chattr -i 解除chattr i /etc/shadow chattr i /etc/group chattr i /etc/gshadow# 设置关键目录权限chmod700/rootchmod700/bootchmod600/etc/ssh/sshd_config# 查找 SUID 文件可能被利用提权find/-perm-4000-typef2/dev/null# 查找无主文件find/-nouser-o-nogroup2/dev/null7.3 内核安全参数# /etc/sysctl.conf# 禁用 ICMP 重定向net.ipv4.conf.all.accept_redirects0net.ipv4.conf.default.accept_redirects0# 禁用源路由net.ipv4.conf.all.accept_source_route0net.ipv4.conf.default.accept_source_route0# 开启反向路径过滤net.ipv4.conf.all.rp_filter1net.ipv4.conf.default.rp_filter1# 禁用 ICMP 广播net.ipv4.icmp_echo_ignore_broadcasts1# 开启 SYN Cookienet.ipv4.tcp_syncookies1# 禁用 IP 转发非路由器net.ipv4.ip_forward0# 应用sysctl-p7.4 服务最小化# 查看正在运行的服务systemctl list-units--typeservice--staterunning# 禁用不必要的服务systemctl disable--nowavahi-daemon systemctl disable--nowcups systemctl disable--nowbluetooth systemctl disable--nowrpcbind# 检查监听端口ss-tlnp# 确认每个端口都是必要的八、小结本篇介绍了 firewalld、iptables、ufw 三种防火墙工具SELinux 强制访问控制SSH 安全加固以及系统级安全加固清单。安全是一个持续的过程建议定期进行安全审计和漏洞扫描。上一篇10 - 日志管理与故障排查下一篇12 - 性能监控与优化