iptables线程安全吗?

时间:2015-02-26 13:09:02

标签: linux multithreading thread-safety iptables

在我看来,这是一个基本问题,但Google和SO未能给我一个答案。正如标题所说,iptables线程安全吗?如果我有多个进程调用iptables,我应该为自己创建一个锁吗?

如果netfilter是线程安全的,没有可靠的解决方案,那么从2009年开始查询似乎有一些线程。我不好去检查实际的代码

2 个答案:

答案 0 :(得分:5)

你正在调用一个用户空间linux程序iptables,所以线程甚至没有进入它,它是每个调用的一个完全独立的过程。这些过程彼此隔离。调用iptables使内核更新底层数据结构将受到保护。

如果你有一个多线程程序产生所有这些进程,那么你可能会遇到麻烦,这取决于你自己的程序的逻辑。例如,如果添加规则会立即删除它?谁可以说规则添加将在规则删除之前运行?单向循环,添加规则,然后删除。反过来,规则被删除(由于它还不存在而失败),然后它被添加(这是有效的,但最终的结果是表有一个他们不应该的规则)。为了说明,这是一个例子:

spawn iptables -A ... (process 1)
spawn iptables -D ... (process 2)
1: starting
2: starting
2: call kernel to delete rule (this is atomic)
1: call kernal to add rule (this is atomic)
2: done
1: done

换句话说,原子性是为了保护内核的内部数据结构。它无助于保护 程序的逻辑。

<强>的iptables-恢复

我还可以推荐使用iptables-restore。然后,您可以在文件中生成完整的规则集,并在单个原子操作中加载整个批次。这意味着您永远无法进入一种状态,即您认为当前规则集与实际规则集不同。这也意味着,在更新规则的过程中,你永远不会处于一种奇怪的中间状态。

答案 1 :(得分:0)

要保护iptables进程免受竞争条件的影响,您需要在1.4.20 iptables版本中使用-w flag enable。 它首先检查另一个iptable进程是否正在执行其命令,如果是,则退出或等待。

上述解决方案仅解决了原子性问题。

  

-w, - wait
  等待xtables锁定。

为了防止多个程序实例同时运行,将尝试在启动时获得独占锁。默认情况下,如果无法获取锁定,程序将退出。此选项将使程序等待,直到可以获得独占锁定。根据{{​​3}}

发布