你的方法来复杂的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 

这工作得很好,但远远不够完美:例如,如果我添加两个服务器在不同的子网,需要沟通 – 规则需要添加在连锁machineA和machineB。

在这种情况下,我主要关心可pipe理性/可读性 – 所以不需要特殊的性能优化[例如,最小化规则查找的平均数量]。

PS: 类似的问题 ,但这不是我正在寻找的答案。

谢谢!

你可以改变

 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之间进行通信,则可能会起作用。

至less它减less了六行-j链到三行-g链。 它也消除了在每个链的末端放置-j REJECT的需要。 事实上,您必须从每个链的末尾删除-j REJECT以使上述方法起作用。

这是一个简单的改进,可以根据你的例子进行概括。 其他改进可能需要更多关于您想要允许的内容以及要阻止的内容。

你可以使用pfSense来代替。 它有很多特点 :

  • 火墙

    • 根据源和目标IP,IP协议,TCP和UDP通信的源和目标端口进行过滤
    • 能够按照规则限制同时连接
    • pfSense利用先进的被动OS /networking指纹识别实用程序p0f,使您可以通过启动连接的操作系统进行筛选。 想要允许FreeBSD和Linux机器上网,但阻止Windows机器? pfSense可以通过被动检测正在使用的操作系统来实现(在许多其他可能性中)。
    • 选项logging或不logging符合每个规则的stream量。
    • 通过在每个规则的基础上select网关(用于负载平衡,故障转移,多个WAN等),可以实现高度灵活的策略路由
    • 别名允许分组和命名IP,networking和端口。 这有助于保持防火墙规则集的清晰和易于理解,特别是在具有多个公有IP和众多服务器的环境中。
    • 透明的第二层防火墙function – 可以桥接接口并过滤它们之间的stream量,甚至允许使用无IP防火墙(尽pipe您可能需要一个用于pipe理目的的IP)。
    • 数据包规范化 – 来自pf scrub文档的描述 – “'Scrubbing'是数据包的规范化,因此在数据包的最终目的地的解释中没有任何含糊之处,scrub指令还重新组装碎片数据包,保护某些操作系统免受某些forms的攻击并丢弃具有无效标志组合的TCP数据包“。
      • 在pfSense中默认启用
      • 如果需要可以禁用。 此选项会导致某些NFS实现出现问题,但是安全,应在大多数安装中保持启用状态。
    • 禁用filter – 如果您希望将pfSense转换为纯路由器,则可以完全closures防火墙filter。
  • networking地址转换(NAT)
  • 冗余
  • 负载平衡报告和监测
  • RRD图

    pfSense中的RRD图维护以下的历史信息。

    • CPU利用率
    • 总吞吐量
    • 防火墙状态
    • 所有接口的单独吞吐量
    • 所有接口的每秒数据包速率
    • WAN接口网关ping响应时间
    • stream量整形器启用stream量整形的系统上队列
  • VPN
    • IPsec的
    • PPTP
    • OpenVPN的
  • dynamicDNS

    通过:

    • DynDNS的
    • DHS
    • DyNS
    • easyDNS
    • 无IP
    • ODS.org
    • ZoneEdit
  • 圈养门户
  • DHCP服务器和中继

它有一个很好的,易于使用的基于Web的configuration,只需看屏幕截图 。

最重要的是,你可以用商品硬件自己构build它,它是开源的 。