核心思路是默认拒绝所有入站连接,再精确放行可信流量;首要动作是配置数据库仅监听内网或本地接口(如MySQL bind-address、PostgreSQL listen_addresses、Redis bind+protected-mode),再用iptables按源IP或网卡接口白名单放行指定访问,并持久化规则。

只允许特定来源访问数据库端口,是 iptables 保护内部数据库的核心思路。默认拒绝所有入站连接,再精确放行可信流量,比“封几个坏 IP”更可靠。
关闭数据库的公网监听
iptables 是网络层过滤工具,不能替代服务配置。首要动作是让数据库本身不监听外网接口:
- MySQL:检查
bind-address是否为127.0.0.1或内网 IP(如192.168.1.10),避免设为0.0.0.0 - PostgreSQL:确认
listen_addresses在postgresql.conf中未包含*或0.0.0.0,建议设为'localhost,192.168.1.0/24' - Redis:设置
bind 127.0.0.1或内网地址,并启用protected-mode yes
用 iptables 限制数据库端口入向规则
假设数据库运行在内网 IP 192.168.1.100、端口 3306(MySQL),只允许运维跳板机(192.168.1.10)和应用服务器(192.168.1.50)访问:
- 先清空 INPUT 链中可能冲突的旧规则:
iptables -D INPUT -p tcp --dport 3306 -j ACCEPT(逐条删除)或备份后重置 - 添加白名单规则(顺序重要,放在 DROP 前):
iptables -A INPUT -p tcp -s 192.168.1.10 --dport 3306 -j ACCEPTiptables -A INPUT -p tcp -s 192.168.1.50 --dport 3306 -j ACCEPT - 拒绝其他所有访问该端口的请求:
iptables -A INPUT -p tcp --dport 3306 -j DROP - 确保默认策略为 DROP:
iptables -P INPUT DROP(若尚未设置)
区分内外网接口,增强控制粒度
如果服务器有多个网卡(如 eth0 接外网、eth1 接内网),可按接口限定规则,避免误伤:
- 只允许内网接口接收数据库连接:
iptables -A INPUT -i eth1 -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT - 明确拒绝外网接口的数据库端口请求:
iptables -A INPUT -i eth0 -p tcp --dport 3306 -j DROP - 这样即使 bind-address 配置失误,外网也无法抵达端口
保存规则并设置开机生效
iptables 规则重启后丢失,必须持久化:
- Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4 - CentOS/RHEL 7+:
service iptables save(需安装 iptables-services)或使用iptables-save > /etc/sysconfig/iptables - 推荐搭配 systemd 服务或网络启动脚本自动载入,避免人工遗漏

















