2.5.5 常见安全场景与排错方法
本节围绕常见安全场景与排错方法,给出可直接落地的检查与处理思路,包含工具安装、示例、排错步骤、命令解释与练习。
原理草图:访问路径与拦截点#
常用排错工具安装#
# CentOS/RHEL
yum install -y tcpdump traceroute mtr nmap net-tools policycoreutils-python-utils
# Debian/Ubuntu
apt-get update
apt-get install -y tcpdump traceroute mtr-tiny nmap net-tools policycoreutils-python-utils
典型安全场景与处理思路(含示例)#
1) 端口无法访问(外部访问失败)#
排查顺序:监听 → 防火墙 → 上游安全组 → 路由/DNS
示例:确认 Nginx 80 端口对外可达
# 1) 本机确认监听
ss -lntp | grep ':80'
# 预期:LISTEN 0 128 0.0.0.0:80 ... nginx
# 2) 防火墙是否放行
iptables -L -n -v --line-numbers
# 若无放行规则,插入一条
iptables -I INPUT 1 -p tcp --dport 80 -m state --state NEW -j ACCEPT
# 3) firewalld 放行(若使用 firewalld)
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
# 4) 外部测试
nc -zv <server_ip> 80
# 预期:succeeded
命令解释:
- ss -lntp:查看监听端口与进程。
- iptables -I INPUT 1 ...:在 INPUT 链首插入放行规则。
- firewall-cmd --add-port:永久开放端口。
- nc -zv:TCP 端口探测。
2) 服务可本机访问,跨主机失败#
常见原因:服务绑定 127.0.0.1、SELinux 拦截、规则顺序导致丢弃
示例:修正绑定地址 + SELinux 端口
# 1) 检查服务监听
ss -lntp | grep 3306
# 若显示 127.0.0.1:3306,说明只监听本地
# 2) 修正 MySQL 配置
cat /etc/my.cnf | grep -i bind-address
# bind-address=0.0.0.0
systemctl restart mysqld
# 3) SELinux 允许 MySQL 监听非默认端口(若用自定义端口)
semanage port -a -t mysqld_port_t -p tcp 3307
命令解释:
- bind-address:控制监听地址,0.0.0.0 表示所有网卡。
- semanage port:为 SELinux 添加允许端口类型。
3) 出站连接异常(无法访问外部服务)#
常见原因:转发/NAT未配置、DNS失败、端口被限制
示例:开启网关 NAT 与转发
# 1) 开启转发
sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
# 2) 添加 NAT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 3) 验证 DNS
cat /etc/resolv.conf
dig www.baidu.com
命令解释:
- ip_forward:允许内核转发流量。
- MASQUERADE:动态出口地址 SNAT。
4) SSH 被拒或频繁断连#
常见原因:防火墙未放行、sshd 配置限制、Fail2ban 封禁
示例:检查 sshd 与封禁列表
# 1) 防火墙放行
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
# 2) sshd 配置检查
sshd -T | egrep 'port|allowusers|maxauthtries'
# 3) Fail2ban 检查
fail2ban-client status sshd
5) 内网横向访问受限#
常见原因:子网 ACL/VPC 安全组、Linux 防火墙未放行内网段
示例:放行内网段 10.0.0.0/16
iptables -I INPUT -s 10.0.0.0/16 -j ACCEPT
iptables -I INPUT -s 172.16.0.0/16 -j ACCEPT
6) 应用访问数据库超时#
常见原因:端口未放行、连接数耗尽、丢包/MTU异常
示例:连通与连接数检查
# 1) 端口连通
nc -zv <db_ip> 3306
# 2) 连接数查看(MySQL)
mysql -uroot -p -e "show status like 'Threads_connected';"
# 3) 丢包检查
ping -c 20 <db_ip>
mtr -r -c 10 <db_ip>
排错方法与步骤(可执行流程)#
# 1) 目标是否存活
ping -c 3 <ip>
traceroute <ip> # 路由路径
mtr -r -c 10 <ip>
# 2) 端口可达性
nc -zv <ip> <port>
# 预期:succeeded 或 Connection refused/timeout
# 3) 服务监听
ss -lntp | grep ":<port>"
# 4) 防火墙核查
iptables -L -n -v --line-numbers
firewall-cmd --list-all
# 5) 日志定位
journalctl -u firewalld --since "10 min ago"
tail -n 200 /var/log/secure
抓包定位示例(判断三次握手)#
# 抓取指定主机与端口
tcpdump -i eth0 host <client_ip> and port 80 -nn -vv
# 预期现象:
# - 只看到 SYN 无 SYN-ACK:可能防火墙/服务未监听
# - 有 SYN/SYN-ACK/ACK:网络层通,问题可能在应用
常用命令清单(含说明)#
ss -lntp:查看监听端口与进程iptables -L -n -v --line-numbers:查看规则与计数iptables -I INPUT -p tcp --dport 80 -j ACCEPT:临时放行 80firewall-cmd --add-port=80/tcp --permanent:永久放行firewall-cmd --reload:刷新规则getenforce:查看 SELinux 状态semanage port -l | grep http:查看 SELinux 端口类型
风险与最佳实践(含备份/回滚)#
# 备份规则
iptables-save > /root/iptables.bak
# 快速回滚
iptables-restore < /root/iptables.bak
# firewalld 配置备份
cp -a /etc/firewalld /root/firewalld.bak
- 优先白名单,最小权限开放
- 生产变更走窗口期,避免锁死远程
- 记录每次规则调整与回滚方案
练习题#
- 将 8080 端口对内网 10.0.0.0/16 放行,对外网禁止访问,并验证连通性。
- 故意将服务绑定到 127.0.0.1,使用
ss与nc证明跨主机失败,再修复。 - 使用
tcpdump捕获一次外部访问 80 端口的握手过程,并分析是否完成三次握手。