入站流量先经prerouting链(可dnat),再判定向本机则进入input链——这才是入站过滤核心;forward和output链不处理入站流量。

明确入站流量的处理路径和关键链
服务器收到外部请求时,数据包会按固定顺序经过内核网络栈:先到 PREROUTING 链(可做 DNAT),再判断是否发往本机;若是,则进入 INPUT 链——这才是入站过滤的核心位置。所有针对本机服务(如 SSH、Nginx、数据库)的访问控制,都必须在 INPUT 链中设置规则。
注意两点:一是 FORWARD 链不处理入站流量(只管转发),二是 OUTPUT 链管的是本机发出的包,和入站无关。写错链名会导致规则完全不生效。
构建基础安全骨架:默认拒绝 + 必要放行
一个健壮的入站策略,起点不是“加白”,而是“先收紧”。推荐按以下顺序配置(逐条执行):
- 设置 INPUT 链默认策略为 DROP:iptables -P INPUT DROP
- 放行本地回环通信:iptables -A INPUT -i lo -j ACCEPT
- 放行已建立连接的返回包(含响应和后续分片):iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
- 允许 ICMP echo-request(ping)但限速防探测:iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 3 -j ACCEPT
这四步完成后,服务器对外“静默”,只有本机自检、已有连接和可控 ping 能通,其他一切入站请求都被拦截。这是后续精细化控制的前提。
按服务和来源精准开放端口
不要裸开端口,而要结合协议、端口、来源 IP 和状态做组合匹配:
- 仅允特定网段访问 SSH:iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 22 -m conntrack --ctstate NEW -j ACCEPT
- 开放 Web 服务(80/443),但限制并发连接数防 CC:iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -m limit --limit 50/minute --limit-burst 100 -j ACCEPT
- 若用 Nginx 做反向代理,后端服务(如 8080)应禁止外网直连:iptables -A INPUT -p tcp --dport 8080 -s 127.0.0.1 -j ACCEPT,再加一条 -j DROP 拦截其他来源
每条放行规则前建议加注释(用 iptables -L -n --line-numbers 查看序号后,用 iptables -I INPUT [行号] -m comment --comment "SSH from office" 插入)。
进阶防护:用 ipset 实现地理围栏与黑名单联动
单一 IP 规则难应对批量攻击,ipset 可把成千上万 IP 归为一个集合,iptables 一次引用即可:
- 创建名为 bad_countries 的哈希集:ipset create bad_countries hash:net
- 导入某国 CIDR 列表(如从 APNIC 获取的越南 IP 段):ipset add bad_countries 113.160.0.0/13
- 在 INPUT 链头部拦截:iptables -I INPUT -m set --match-set bad_countries src -j DROP
- 配合日志记录命中情况:iptables -I INPUT -m set --match-set bad_countries src -j LOG --log-prefix "BLOCKED-GEO: "
这样既能屏蔽高风险区域流量,又保留日志用于分析误拦;集合可动态增删,无需重载整套规则。










