处理复杂 iptables 规则集的方法

处理复杂 iptables 规则集的方法

我感兴趣的是如何在充当防火墙的 Linux 路由器上编写复杂的数据包过滤规则集。一个具有默认丢弃策略的规则集。

我通常采用这种方法[只是一个人为的例子]:

iptables -F ; iptables -X; iptables -P FORWARD DROP
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -N FORWARD_machineA
iptables -A FORWARD_machineA -d $machineA -p tcp --dport 80 -j ACCEPT
iptables -A FORWARD_machineA -d $machineA -s $machineB -p tcp --dport 3306 -j ACCEPT
iptables -A FORWARD_machineA -d $machineA -j DROP
iptables -A FORWARD_machineA -s $machineA -d $machineC -p tcp --dport 2 -j ACCEPT
iptables -A FORWARD_machineA -s $machineA -j REJECT

iptables -N FORWARD_machineB
iptables -A FORWARD_machineB -d $machineB -s $machineA -p tcp --dport 3306 -j ACCEPT
iptables -A FORWARD_machineB -d $machineB -j DROP
iptables -A FORWARD_machineB -s $machineB -d $machineC -p tcp --dport 2 -j ACCEPT
iptables -A FORWARD_machineB -s $machineB -j REJECT

iptables -N FORWARD_machineC
iptables -A FORWARD_machineC -d $machineC -s $machineA -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD_machineC -d $machineC -s $machineB -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD_machineC -d $machineC -j DROP
iptables -A FORWARD_machineC -s $machineC -j REJECT

iptables -A FORWARD -s $machineA -j FORWARD_machineA
iptables -A FORWARD -d $machineA -j FORWARD_machineA

iptables -A FORWARD -s $machineB -j FORWARD_machineB
iptables -A FORWARD -d $machineB -j FORWARD_machineB

iptables -A FORWARD -s $machineC -j FORWARD_machineC
iptables -A FORWARD -d $machineC -j FORWARD_machineC

这可以正常工作,但远非完美:例如,如果我在需要通信的不同子网中添加两个服务器 - 则需要在机器 A 和机器 B 的链中添加规则。

在这种情况下,我最感兴趣的是可管理性/可读性 - 因此不需要进行特殊的性能优化[例如最小化规则查找的平均次数]。

附言:类似问题,但这不是我想要的答案。

谢谢!

答案1

你可以改变

iptables -A FORWARD -s $machineA -j FORWARD_machineA
iptables -A FORWARD -d $machineA -j FORWARD_machineA

iptables -A FORWARD -g FORWARD_machineA

这样你就可以有三条这样的规则

iptables -A FORWARD -g FORWARD_machineA
iptables -A FORWARD -g FORWARD_machineB
iptables -A FORWARD -g FORWARD_machineC

在这三条规则之后,只需添加一条

iptables -A FORWARD -j REJECT

这样,如果您在链 FORWARD_machineA 或链 FORWARD_machineB 中只允许一次通信,以进行机器 A 和机器 B 之间的通信,它可能会起作用。

至少它将 -j 链的六行减少到 -g 链的三行。它还消除了在每个链末尾放置 -j REJECT 的需要。事实上,您必须从每个链的末尾删除 -j REJECT 才能使上述方法有效。

这是简单的改进,可以根据您的示例进行概括。其他改进可能需要更多关于您想要允许什么和您想要阻止什么的详细信息。

答案2

你可以使用普富思相反,它有很多特征

  • 防火墙

    • 按源和目标 IP、IP 协议、源和目标端口过滤 TCP 和 UDP 流量
    • 能够根据规则限制同时连接数
    • pfSense 利用 p0f(一种先进的被动操作系统/网络指纹识别实用程序)允许您按启动连接的操作系统进行过滤。想要允许 FreeBSD 和 Linux 计算机访问互联网,但阻止 Windows 计算机?pfSense 可以通过被动检测正在使用的操作系统来实现这一点(以及许多其他可能性)。
    • 选择记录或不记录与每条规则匹配的流量。
    • 通过根据每个规则选择网关,可以实现高度灵活的策略路由(用于负载平衡、故障转移、多个 WAN 等)
    • 别名允许对 IP、网络和端口进行分组和命名。这有助于保持防火墙规则集简洁易懂,尤其是在具有多个公共 IP 和众多服务器的环境中。
    • 透明第 2 层防火墙功能 - 可以桥接接口并过滤它们之间的流量,甚至允许无 IP 防火墙(尽管您可能需要 IP 以用于管理目的)。
    • 数据包规范化 - pf scrub 文档中的描述 - “‘Scrubbing’ 是对数据包的规范化,这样数据包的最终目的地在解释时就不会产生歧义。scrub 指令还会重新组装碎片数据包,保护某些操作系统免受某些形式的攻击,并丢弃具有无效标志组合的 TCP 数据包。”
      • 在 pfSense 中默认启用
      • 必要时可禁用。此选项会给某些 NFS 实现带来问题,但它是安全的,在大多数安装中都应保持启用状态。
    • 禁用过滤器 - 如果您希望将 pfSense 变成纯路由器,可以完全关闭防火墙过滤器。

  • 网络地址转换 (NAT)
  • 冗余
  • 负载平衡报告和监控
  • RRD 图

    pfSense 中的 RRD 图表保留以下历史信息。

    • CPU 利用率
    • 总吞吐量
    • 防火墙状态
    • 所有接口的单独吞吐量
    • 所有接口的每秒数据包速率
    • WAN 接口网关 ping 响应时间
    • 启用流量整形功能的系统上的流量整形队列
  • VPN
    • IPsec
    • 点对点隧道协议
    • OpenVPN
  • 动态 DNS

    通过:

    • 动态域名系统
    • 国土安全部
    • 动态
    • 简易DNS
    • 无IP
    • ODS网站
    • 區域編輯
  • 强制门户
  • DHCP 服务器和中继

它有一个很好的、易于使用的基于网络的配置,只需看看屏幕截图

最好的是,你可以用商用硬件自己构建它,而且它开源

相关内容