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

2024-11-01 08:41:00
admin
原创
45
摘要:问题描述:我需要查询现有规则,并能够轻松添加和删除规则。我还没有找到任何可以执行此操作的 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

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

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用