如果我尝试在我的 lxc/lxd Ubuntu 14.04 amd64 容器中运行以下命令:
iptables -A OUTPUT -p tcp -m owner --uid-owner 0 -m tcp --dport 80 -j ACCEPT
我收到以下错误消息:
iptables: Invalid argument. Run `dmesg' for more information.
...但/var/log/dmesg
没有得到任何额外的输出。
我确信 iptables 规则有效,因为它在 lxc/lxd 主机和其他机器上都能正常工作。似乎有问题的部分是所有者部分,即如果我运行此命令:
iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
...它运行良好。
对我来说这似乎是 lxc 中的一个错误,但是有什么方法可以进一步调查它吗?
编辑1
我使用调试标志从源代码构建了 iptables,然后跟踪执行过程。这让我找到了该iptables-standalone.c
文件,其中:
int iptc_commit(struct xtc_handle *handle);
...函数返回EINVAL
错误代码。问题是我无法找到该函数的源代码。它似乎位于libip4tc.so
共享库中,但我无法找到该库的源代码。
如果有人知道来源在哪里,我将非常感激,如果你能告诉我。
编辑2
參閱这我创建的 lxc GitHub 问题更详细地描述了这一情况。我打算放弃,因为这项工作对我来说太过艰巨,而我可以通过避免在容器中使用与“所有者”匹配的 iptables 规则来解决这个问题。
答案1
您所要做的就是将容器的“security.privileged”配置设置为“true”,因为它默认为“false”。
即参考这并寻找“security.privileged”配置。
我不太清楚改变这个配置会产生什么效果,所以要小心并自己研究,但我认为它只是授予容器更多控制共享内核(在主机和容器之间共享)的权限。