45

我需要查询现有规则,以及能够轻松添加和删除规则。我还没有找到任何用于执行此操作的 API。有什么我想念的吗?

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

C 中的 API 会很棒;但是,由于我打算将其构建到一个独立的 suid 程序中,因此可以使用任何语言执行此操作的库也可以。

4

9 回答 9

23

netfilter 常见问题解答

不幸的是,答案是:不。

现在你可能会想'但是 libiptc 呢?'。正如邮件列表中多次指出的那样,libiptc从来没有打算用作公共接口。我们不保证一个稳定的接口,并计划在 linux 包过滤的下一个版本中将其删除。libiptc 太底层了,无论如何都无法合理使用。

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

于 2008-09-20T22:14:52.873 回答
13

使用 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(例如,端口敲击很有用)时,您可以使用 ipsets,而不是替换这些规则。即:

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 地址,并在其记录中设置超时。(曾经想在一个小时内添加一些东西吗?)。

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

于 2008-09-20T23:49:28.467 回答
9

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

rfw 是为尝试在多个机器上更新防火墙规则的分布式系统而设计的,但它也可以在 localhost 接口上的单台机器上运行。然后它允许避免 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 许可下开源的。

于 2014-03-25T22:49:40.860 回答
5

据我了解(尽管似乎没有提到它),iptables-restore是原子的。最后,当COMMIT读取该行时,iptables调用(iptc_commitlibiptc您不应该使用的内部接口中),然后setsockopt(SO_SET_REPLACE)使用您的新规则集调用。

这听起来就像你能得到的一样原子:一个内核调用。但是,请更多知识渊博的各方对此提出异议。:-)

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

具体地说,“仅”操作是基于每个 CPU 的原子操作。当我们存储每个 CPU 的整个规则集 blob 时(由于缓存优化)。

于 2008-09-20T22:13:15.593 回答
3

故意没有 API 来管理这些规则。你不应该想要这样做。或者其他的东西。

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

  • 使用“最近”匹配或 ip 集匹配之类的东西,您可以在不更改规则集的情况下从黑/白名单中添加/删除 IP 地址。
  • 您可以将数据包传递到用户空间以使用 NFQUEUE 进行过滤
于 2008-09-20T22:02:27.897 回答
2

今天早上我醒来发现这是来自俄罗斯的拒绝服务 (DOS) 攻击。他们从几十个 IP 块中攻击我。他们必须拥有大量 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\n", $argv[1] );
//     printf( "%d\n", $cnt );
//     printf( "%s\n", $line );

       printf( "-A BLOCK1 -s %s/24 -j DROP\n", $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.
于 2013-04-18T21:56:23.997 回答
1

这是使用 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 在这么短的列表上并没有真正改进。

于 2013-09-23T14:20:17.363 回答
0

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

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

Linux netfilter 在 /usr/include/netfilter* 下也有一些包含文件。这些是一些低级功能。这是 iptables 使用的。这与没有 iptables 的 API 一样接近。

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

于 2008-09-20T22:13:11.943 回答
0

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

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

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

于 2020-10-21T12:40:39.213 回答