Если я попытаюсь запустить следующую команду в моем контейнере 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".
Я не совсем уверен, что меняет эта конфигурация, поэтому будьте осторожны и исследуйте себя, но я думаю, что это просто дает контейнеру больше привилегий в отношении управления общим ядром (совместно используемым между хостом и контейнером).