核心是默认DROP再精准放行:先执行iptables -P INPUT DROP,再依次放行lo、ESTABLISHED/RELATED、管理IP及业务网段,并按源IP+端口粒度控制,最后保存规则持久化。

构建基于 IP 的白名单策略,核心就一条:先设默认拒绝,再逐条放行可信来源。这不是可选项,而是安全底线——任何未显式允许的连接,一律丢弃。
明确策略逻辑:DROP 默认 + ACCEPT 显式
iptables 规则按顺序匹配,一旦命中即执行动作且停止后续检查。因此必须把策略方向理清楚:
- 把 INPUT 链默认策略设为 DROP:
iptables -P INPUT DROP - 再添加允许规则,比如回环、已建立连接、指定 IP 或网段
- 切忌在默认 ACCEPT 下加 ACCEPT 规则——那等于没控制
基础白名单规则(必须包含)
只放行特定 IP,不代表可以忽略基础通信。以下四类规则建议始终保留:
- 放行本地回环:
iptables -A INPUT -i lo -j ACCEPT - 放行已建立/关联连接:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT(或新版用conntrack模块:-m conntrack --ctstate ESTABLISHED,RELATED) - 放行单个管理 IP(如办公网络出口):
iptables -A INPUT -s 203.120.45.88 -p tcp --dport 22 -j ACCEPT - 放行子网(如内网运维段):
iptables -A INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
端口级精细控制(推荐场景)
不建议全端口放行,而应按服务绑定源 IP 和目标端口:
- 只让某 IP 访问 Web 管理后台(如 8080):
iptables -A INPUT -s 10.10.5.22 -p tcp --dport 8080 -j ACCEPT - 限制某 IP 只能访问数据库端口(如 3306),且仅限内网段:
iptables -A INPUT -s 172.16.200.0/24 -p tcp --dport 3306 -j ACCEPT - 若需多端口,可用 multiport 模块:
-p tcp -m multiport --dports 22,80,443
保存与验证:别让规则重启后失效
临时规则在 reboot 后消失,必须持久化:
- CentOS/RHEL 6/7:
service iptables save(需已安装iptables-services) - Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4(确保iptables-persistent已安装并启用) - 验证是否生效:
iptables -L INPUT -n -v查看匹配计数;从白名单外 IP 尝试 telnet 目标端口,应无响应 - 紧急回退:
iptables -P INPUT ACCEPT快速恢复连通性(仅限本地终端操作)
不复杂但容易忽略——白名单真正起效,靠的不是加了多少条 ACCEPT,而是那条 -P INPUT DROP 是否稳稳立住。

















