这在我看来是一个基本问题,但谷歌和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
Run Code Online (Sandbox Code Playgroud)
换句话说,原子性是为了保护内核的内部数据结构.它不利于保护的逻辑你的程序.
由iptables-restore
我还可以推荐使用iptables-restore.然后,您可以在文件中生成完整的规则集,并在单个原子操作中加载整个批次.这意味着您永远无法进入一种状态,即您认为当前规则集与实际规则集不同.这也意味着,在更新规则的过程中,您永远不会处于奇怪的中间状态.
| 归档时间: |
|
| 查看次数: |
1400 次 |
| 最近记录: |