如果我尝试在我的 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 规则来解决这个问题时。
您所要做的就是将容器的“security.privileged”配置设置为“true”,因为它默认为“false”。
即参考这个并寻找那个“security.privileged”配置。
我不确定更改此配置会做什么,所以要小心并自己研究,但我认为它只是授予容器更多关于控制共享内核(在主机和容器之间共享)的特权。