我如何以编程方式动态管理 iptables 规则?

2024-11-01 08:41:00
admin
原创
155
摘要:问题描述:我需要查询现有规则,并能够轻松添加和删除规则。我还没有找到任何可以执行此操作的 API。我是否遗漏了什么?我最接近的解决方案是使用iptables-save | iptables-xml查询并手动调用 iptables 命令本身来添加/删除规则。我考虑过的另一个解决方案是从我的应用程序数据库中重新生...

问题描述:

我需要查询现有规则,并能够轻松添加和删除规则。我还没有找到任何可以执行此操作的 API。我是否遗漏了什么?

我最接近的解决方案是使用iptables-save | iptables-xml查询并手动调用 iptables 命令本身来添加/删除规则。我考虑过的另一个解决方案是从我的应用程序数据库中重新生成整个规则集并刷新整个链,然后再次应用它。但我想避免这种情况,因为我不想丢弃任何数据包——除非有办法自动完成此操作。我想知道是否有更好的方法。

C 语言中的 API 非常棒;但是,由于我计划将其构建成一个独立的 suid 程序,所以用任何语言执行此操作的库也很好。


解决方案 1:

来自netfilter 常见问题解答:

不幸的是,答案是:不是。

现在您可能会想“但是 libiptc 怎么办?”。正如邮件列表中多次指出的那样,libiptc绝不会用作公共接口。我们不保证接口稳定,并且计划在下一个版本的 Linux 数据包过滤中将其删除。libiptc 太低层了,无论如何都无法合理使用。

我们很清楚这种 API 存在根本缺陷,我们正在努力改善这种情况。在此之前,建议使用 system() 或打开 iptables-restore 的 stdin 管道。后者将为您提供更好的性能。

解决方案 2:

使用 iptables-save 和 iptables-restore 来查询和重新生成规则无疑是最有效的方法。它们曾经是 shell 脚本,但现在它们是非常高效的 C 程序。

不过,我应该指出,您可以使用一个工具来使维护 iptables 变得更加容易。大多数动态规则集实际上是多次重复的相同规则,例如:

iptables -A INPUT -s 1.1.1.1 -p tcp -m --dport 22 -j ACCEPT
iptables -A INPUT -s 2.2.2.0/24 -p tcp -m --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 22 -j REJECT

每次想要更改哪些端口可以访问端口 22(例如,对于端口敲击很有用)时,您都无需替换这些规则,而是可以使用 ipset。即:

ipset -N ssh_allowed nethash
iptables -A ssh_allowed -m set --set ssh_allowed src -p tcp -m --dport 22 -j ACCEPT
ipset -A ssh_allowed 1.1.1.1
ipset -A ssh_allowed 2.2.2.0/24

集合可以保存 IP 地址、网络、端口、MAC 地址,并在其记录中设置超时。(有没有想过只添加一个小时的东西?)。

甚至存在一种将一个集合与另一个集合交换的原子方法,因此刷新意味着创建一个新的临时集合,然后将其交换为现有集合的名称。

解决方案 3:

您可以考虑使用rfw,它是 iptables 的 REST API。它序列化来自各种潜在并发源的 iptables 命令并即时远程执行 iptables。

rfw 专为分布式系统而设计,可尝试更新多个机器上的防火墙规则,但它也可以在本地主机接口上的单台机器上运行。这样,它就可以避免 SSL 和身份验证开销,因为在这种情况下,它可以在纯 HTTP 上运行。

示例命令:

PUT /drop/input/eth0/11.22.33.44

其对应为:

iptables -I INPUT -i eth0 -s 11.22.33.44 -j DROP

您可以插入和删除规则以及查询当前状态以获取 JSON 格式的现有规则:

GET /list/input

免责声明:我启动了该项目。它是根据 MIT 许可证开源的。

解决方案 4:

据我所知(虽然似乎没有参考资料提到这一点),iptables-restore它是原子的。最后,当COMMIT读取行时,iptables调用iptc_commitin libiptc(这是您不应该使用的内部接口),然后setsockopt(SO_SET_REPLACE)使用您的新规则集进行调用。

这听起来就像你能得到的最原子的东西:只需一个内核调用。然而,我们欢迎更多知识渊博的人对此提出异议。:-)

编辑:我可以确认你的描述是正确的。iptables-restore是作为内核中的原子操作完成的。

更具体地说,操作“仅”是每个 CPU 的原子操作。因为我们将整个规则集 blob 存储在每个 CPU 上(由于缓存优化)。

解决方案 5:

故意没有提供 API 来管理这些规则。你不应该想这么做。或者其他什么。

如果您需要足够动态的规则,并且您关心执行 /sbin/iptables 的性能,那么还有其他方法可以做到:

  • 使用类似“最近”匹配或 IP 集匹配的方法,您可以在不更改规则集的情况下从黑名单/白名单中添加/删除 IP 地址。

  • 您可以使用 NFQUEUE 将数据包传递到用户空间进行过滤

解决方案 6:

今天早上我醒来发现我受到了来自俄罗斯的拒绝服务 (DOS) 攻击。他们从数十个 IP 块攻击我。他们肯定有一个很大的 IP 池或某种代理列表/服务。每次我阻止一个 IP,另一个就会弹出来。最后,我找了一个脚本,发现我需要编写自己的解决方案。下面的有点激进,但他们将我的 TOP LOAD LEVEL 运行到 200 以上。

这是我编写的用于实时阻止 DOS 的快速脚本。

cat  **"output of the logs"** | php ipchains.php **"something unique in the logs"**

==> PHP 脚本:

<?php

$ip_arr = array();

while(1)
{
   $line = trim(fgets(STDIN)); // reads one line from STDIN
   $ip = trim( strtok( $line, " ") );

   if( !array_key_exists( $ip, $ip_arr ) )
      $ip_arr[$ip] = 0;

   $regex = sprintf( "/%s/", $argv[1] );

   $cnt = preg_match_all( $regex, $line );

   if( $cnt < 1 ) continue;

   $ip_arr[$ip] += 1;

   if( $ip_arr[$ip] == 1  )
     {
//     printf( "%s
", $argv[1] );
//     printf( "%d
", $cnt );
//     printf( "%s
", $line );

       printf( "-A BLOCK1 -s %s/24 -j DROP
", $ip );

       $cmd = sprintf( "/sbin/iptables  -I BLOCK1  -d %s/24 -j DROP", $ip );
       system( $cmd );
     }
}

?>

假设:

1) BLOCK1 is a Chain already created. 
2) BLOCK1 is a Chain that is run/called from the INPUT CHAIN 
3) Periodically you will need to run "ipchains -S BLOCK1" and put output in /etc/sysconfig file. 
4) You are familiar with PHP 
5) You understand web log line items/fields and output.

解决方案 7:

这是使用 bash 和 iptables 动态阻止黑客在 CentOS 上滥用 sshd 的示例。在本例中,我将 sshd 配置为禁止密码登录(允许密钥)。我在 /var/log/secure 中查找“Bye Bye”的条目,这是 sshd 礼貌地说“f-off”的方式……

IP=$(awk '/Bye Bye/{print $9}' /var/log/secure |
     sed 's/://g' |sort -u | head -n 1)

[[ "$IP" < "123" ]] || {

  echo "Found $IP - blocking it..." >> /var/log/hacker.log

  /sbin/iptables -A INPUT -s $IP -j DROP

  service iptables save

  sed -i "/$IP/d" /var/log/secure

}

我每秒、每分钟或任何让我高兴的时间循环运行一次。我测试 $IP 的值以验证它是否找到了有用的值,如果是,我调用 iptables 将其删除,然后使用 sed 清除日志文件中的 $IP,这样就不会再次添加该条目。

我做了一些预处理(未显示)以将一些始终有效且可能在连接时遇到问题(由于用户错误)的重要 IP 列入白名单。

我会不时地对 iptables 过滤列表进行排序,并从中创建 IP 范围(使用不同的脚本 - 检查后,它们通常是来自印度、中国和俄罗斯的 IP 范围)。因此,我的整体 iptables 过滤规则集保持在 50 到 500 个条目之间;ipset 在这么短的列表中并没有真正改善多少。

解决方案 8:

MarkR 说得对,你不应该这样做。最简单的方法是从脚本中调用 iptables,或者编写 iptables 配置并“恢复”它。

不过,如果您愿意,请阅读 iptables 的源代码。iptables 使用匹配和表作为共享对象。您可以使用源代码或它们。

Linux netfilter 在 /usr/include/netfilter* 下也有一些包含文件。这些是一些低级函数。这是 iptables 使用的。这是在没有 iptables 的情况下可以获得的最接近 API 的 API。

但是这个 API 很“混乱”。请记住,它被设计为仅供 iptables 使用。它没有很好的文档记录,您可能会遇到非常具体的问题,API 可能会在没有任何警告的情况下快速更改,因此升级可能会破坏您的代码,等等。

解决方案 9:

我知道根据 netfilter 讨论,这是一个短期解决方案,但在短期内,您可以使用 python 包装的 iptc:

https://github.com/ldx/python-iptables

我在最近的一个项目中试用了一些它,发现它非常有效。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1124  
  IPD(Integrated Product Development,集成产品开发)流程是一种广泛应用于高科技和制造业的产品开发方法论。它通过跨职能团队的紧密协作,将产品开发周期缩短,同时提高产品质量和市场成功率。在IPD流程中,CDCP(Concept Decision Checkpoint,概念决策检查点)是一个关...
IPD培训课程   79  
  研发IPD(集成产品开发)流程作为一种系统化的产品开发方法,已经在许多行业中得到广泛应用。它不仅能够提升产品开发的效率和质量,还能够通过优化流程和资源分配,显著提高客户满意度。客户满意度是企业长期成功的关键因素之一,而IPD流程通过其独特的结构和机制,能够确保产品从概念到市场交付的每个环节都围绕客户需求展开。本文将深入...
IPD流程   70  
  IPD(Integrated Product Development,集成产品开发)流程是一种以跨职能团队协作为核心的产品开发方法,旨在通过优化资源分配、提高沟通效率以及减少返工,从而缩短项目周期并提升产品质量。随着企业对产品上市速度的要求越来越高,IPD流程的应用价值愈发凸显。通过整合产品开发过程中的各个环节,IPD...
IPD项目管理咨询   82  
  跨部门沟通是企业运营中不可或缺的一环,尤其在复杂的产品开发过程中,不同部门之间的协作效率直接影响项目的成败。集成产品开发(IPD)作为一种系统化的项目管理方法,旨在通过优化流程和增强团队协作来提升产品开发的效率和质量。然而,跨部门沟通的复杂性往往成为IPD实施中的一大挑战。部门之间的目标差异、信息不对称以及沟通渠道不畅...
IPD是什么意思   74  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用