linux - iptables 线程安全吗?

标签 linux multithreading thread-safety iptables

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

2009 年似乎有一些线程在询问 netfilter 是否线程安全,但没有可靠的解决方案。我不愿意去检查实际代码

最佳答案

您正在调用 iptables ,一个用户空间的 linux 程序,所以线程甚至不会进入它,它是每个调用的完全独立的进程。这些进程彼此隔离。 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 吗? .然后,您可以将完整的规则集生成到一个文件中,并在单个原子操作中加载整个规则集。这意味着您永远不会进入您假设当前规则集与实际不同的状态。这也意味着您永远不会在更新规则的过程中处于奇怪的中间状态。

关于linux - iptables 线程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28743341/

相关文章:

multithreading - 类似于线程安全映射的对仅在一个线程上存在的值的访问

c# - 混合使用锁和互锁操作是否安全?

python - 寻找可靠的 python 进程同步技术(Linux 不可移植)

linux - 在哪里可以找到旧版 Linux 内核 (2.6.x) 的特定文件?

python - 使用 Python 实现单个消费者、多个生产者场景的最佳方法是什么?

java - 如何在java中摆脱这个 "static method should be acessed in a static way"?

c# - 为什么我不能使用 AsyncMethodCaller?

java - Blackberry 的 SimpleDateFormat 线程安全吗?

regex - 在文件中查找与给定值匹配的正则表达式

MySql 同一查询的不同执行路径