根据documentation:rules,执行以下操作应该在iptables规则列表中添加一个简单的规则:
rule = iptc.Rule()
rule.src = "127.0.0.1"
rule.protocol = "udp"
rule.target = rule.create_target("ACCEPT")
match = rule.create_match("comment")
match.comment = "this is a test comment"
chain = iptc.Chain(iptc.Table(iptc.Table.FILTER), "INPUT")
chain.insert_rule(rule)
但是,运行此示例会导致新规则绝对为零 我正在通过以下方式验证这一点:
iptables -L --line-number
在我提交错误问题之前,我想知道是否有其他人遇到过这个问题,如果是的话,你是如何解决它的。
我以root身份运行所有内容只是为了安全起见,我还尝试通过运行文档相同部分中的另一个示例代码来验证规则:
table = iptc.Table(iptc.Table.FILTER)
for chain in table.chains:
print ("=======================")
print ("Chain ", chain.name)
for rule in chain.rules:
print ("Rule", "proto:", rule.protocol, "src:", rule.src, "dst:", \
rule.dst, "in:", rule.in_interface, "out:", rule.out_interface,)
print ("Matches:")
for match in rule.matches:
print (match.name)
print ("Target:"),
print (rule.target.name)
print ("=======================")
(稍微修改以使用Python3)。
这是为了确保自动提交没有问题,但结果仍然相同。
我还要指出,它确实有一点工作,大约3次添加到iptables。它可能会有效systemctl restart iptables
,但我想尽可能 - 在我做重启东西的经典旧“Windows技巧”之前弄清楚为什么会出错。 (在journald / systemd中没有提到iptables的任何内容)
答案 0 :(得分:0)
看到@larsks无法重现这个问题,我进一步挖掘了一下。 似乎已经执行了系统更新(经典错误,我道歉)。
这导致加载的内核版本与iptables的内核模块不同,有一些使用iptables
命令解决此问题的修复程序,以便您仍然可以添加规则。
但是,使用lib python-iptables不起作用 实际的差异超出了我的范围,我挖了一点但却无法找到导致问题的地方。
在这个实例中重新启动计算机是唯一(我所知)解决此问题的方法。这样加载的内核模块和已安装的工具就会与他们正在反对的版本相匹配。
(另一种解决方案是保留旧的iptables
命令和库,这意味着备份它们并将库指向备份版本,直到可以重新启动为止。