默认拒绝+白名单放行是数据库端口防护核心策略:先设input默认drop,再按ip点对点放行3306/5432/1521等端口,禁用全网开放;区分firewalld区域、同步收紧云安全组;最后实测验证拦截效果并审计规则。

核心是“默认拒绝 + 白名单放行”,而不是靠封IP黑名单来堵漏洞。数据库端口(如 MySQL 3306、PostgreSQL 5432、Oracle 1521)一旦对公网开放,极易被暴力扫描和利用。真正有效的做法是从策略源头切断所有非必要访问。
一、先设默认拒绝策略
这是最关键的一步,必须在添加任何放行规则前完成:
-
firewalld 用户:执行
sudo firewall-cmd --set-target=DROP --permanent,再sudo firewall-cmd --reload -
iptables 用户:运行
sudo iptables -P INPUT DROP(操作前务必确保已保留 SSH 白名单或带外访问通道,否则可能锁死) - 切勿跳过这步直接加允许规则——没有默认拒绝,就等于把门虚掩着等别人推
二、只允许可信来源点对点访问数据库端口
禁止用 --add-port=3306/tcp 这类全网开放方式。必须绑定具体 IP 或内网段:
- 例如只允许应用服务器
192.168.5.10访问 MySQL:sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.5.10" port port="3306" protocol="tcp" accept' - 若需多个来源,逐条添加 rich rule,不要合并成一个大网段(如
192.168.0.0/16),避免过度授权 - Oracle 用户注意:1521 端口同样适用该逻辑,且建议配合监听器配置
sqlnet.ora中的TCP.VALIDNODE_CHECKING = YES做双重校验
三、区分区域并关闭非必要路径
数据库通常不需要响应公网、DMZ 或其他业务区的连接请求:
- 确认数据库服务器 firewalld zone 是
public(默认),但不要在该 zone 开放服务;改用--zone=internal或自定义 zone 绑定可信源 - 执行
sudo firewall-cmd --permanent --zone=public --remove-service=mysql(如果误加过) - 云环境必须同步检查安全组(Security Group):确保其入方向规则也仅放行相同 IP+端口,防火墙与安全组任一层宽松都会导致绕过
四、验证与持续防护
配置后不能只看命令是否成功,要实测验证:
- 从非白名单 IP 尝试 telnet 或 nc 连接数据库端口,应完全无响应(
DROP表现为超时,REJECT会返回 connection refused) - 查看日志确认拦截行为:
sudo journalctl -u firewalld | grep "3306"或启用log-denied=all(sudo firewall-cmd --set-log-denied=all) - 定期审查
firewall-cmd --list-all输出,确认无残留的通用放行规则(如ports: 3306/tcp)











