温馨提示×

Linux防火墙怎样限制访问才有效

小樊
33
2025-12-14 11:23:31
栏目: 智能运维

Linux防火墙限制访问的高效做法

一、原则与顺序

  • 明确目标:先确定要限制的协议/端口/方向(入站/出站/转发)与源/目的(单IP、网段、地区等)。
  • 默认拒绝、显式放行:将默认策略设为更安全的状态(如 INPUT/FORWARD 为 DROP),再按最小权限逐一放行必要流量,避免“先放行后拒绝”的顺序错误。
  • 保持会话可用:放行已建立的连接和相关流量(如状态匹配 conntrack),避免把自己“锁在外面”。
  • 规则优先级:iptables 从上到下匹配,先匹配先生效;firewalld 按源地址 > 网卡 > 默认区域的优先级匹配,且富规则优先级高于普通规则。
  • 持久化与回滚:变更前备份,变更后立刻保存并验证;远程操作务必保留备用会话,逐步生效。

二、iptables 实操模板

  • 基础安全基线(远程维护前先开新会话)
    • 仅放行回环、已建立连接与必要管理端口(示例为 SSH 22/TCP):
      iptables -F
      iptables -P INPUT DROP
      iptables -P FORWARD DROP
      iptables -P OUTPUT ACCEPT
      iptables -A INPUT -i lo -j ACCEPT
      iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
      iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
      
    • 按需放行业务端口(示例:80/TCP、443/TCP):
      iptables -A INPUT -p tcp --dport 80  -j ACCEPT
      iptables -A INPUT -p tcp --dport 443 -j ACCEPT
      
  • 按源IP/网段限制
    • 仅允许 192.168.1.100 访问 22/TCP
      iptables -I INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPT
      iptables -A INPUT -p tcp --dport 22 -j DROP
      
    • 屏蔽某网段(示例:203.0.113.0/24):
      iptables -A INPUT -s 203.0.113.0/24 -j DROP
      
  • 批量管理与持久化
    • 使用 ipset 管理大量黑名单/白名单更高效:
      ipset create blacklist hash:ip
      ipset add blacklist 203.0.113.10
      iptables -I INPUT -m set --match-set blacklist src -j DROP
      
    • 持久化(示例路径,按发行版调整):
      iptables-save > /etc/iptables/rules.v4
      # 或 Debian/Ubuntu 使用 iptables-persistent
      
  • 验证与回滚
    iptables -L -n -v --line-numbers
    iptables -D INPUT <编号>   # 删除指定规则
    

以上要点涵盖:规则顺序、状态匹配、白名单/黑名单、网段限制、ipset 批量管理与持久化。

三、firewalld 实操模板

  • 基本准备
    systemctl start  firewalld
    systemctl enable firewalld
    firewall-cmd --get-default-zone
    
  • 单端口单IP白名单(示例:仅 192.168.1.100 访问 8080/TCP
    firewall-cmd --permanent --zone=public \
      --add-rich-rule='rule family="ipv4" source address="192.168.1.100" port protocol="tcp" port="8080" accept'
    firewall-cmd --reload
    
  • 按区域精细化(推荐做法)
    • 新建区域并绑定源IP,仅在该区域放行端口;其他来源走默认区域策略(可设为更严格):
      firewall-cmd --permanent --new-zone=ops
      firewall-cmd --permanent --zone=ops --add-source=192.168.1.100
      firewall-cmd --permanent --zone=ops --add-port=8080/tcp
      firewall-cmd --reload
      
    • 如需对“其他所有来源”的该端口静默丢弃,可在默认区域加一条 DROP 规则;注意 zone 的匹配优先级:source > interface > 默认区域
  • 常用验证
    firewall-cmd --list-all --zone=ops
    firewall-cmd --list-rich-rules --zone=public
    firewall-cmd --query-port=8080/tcp
    

以上要点涵盖:富规则白名单、区域绑定源IP、优先级与验证。

四、进阶与常见陷阱

  • 容器与转发场景
    • Docker 等容器网络常绕过 firewalld 的 INPUT 策略,限制容器访问应在 FORWARD 链或宿主机策略上做规则,或使用 ipset + iptables 在 FORWARD 上精确控制。
  • 服务级访问控制
    • 对支持 TCP Wrappers 的服务,可用 /etc/hosts.allow/etc/hosts.deny 做二次限制(仅对支持的服务生效,优先级 allow > deny)。
  • 协议与ICMP
    • 如需禁止 ping,可用富规则拒绝 ICMP 请求(按需开启/关闭):
      firewall-cmd --permanent --add-rich-rule='rule family="ipv4" protocol value="icmp" reject'
      firewall-cmd --reload
      
  • 规则顺序与默认策略
    • iptables 规则自上而下匹配,务必把“放行”规则放在“拒绝”规则之前;firewalld 注意 zone 优先级与富规则优先级,避免被更宽匹配的规则覆盖。
  • 远程变更安全
    • 先开第二个 SSH 会话;变更 INPUT 前放行已建立连接;变更后用 list/query 命令逐项验证;准备回滚脚本或快照。

0