Запуск контейнера докеров: iptables: нет цепочки/цели/соответствия этим именем
Я пытаюсь запустить контейнер, но у меня возникает следующая проблема:
Error response from daemon: Cannot start container b005715c40ea7d5821b15c44f5b7f902d4b39da7c83468f3e5d7c042e5fe3fbd: iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.43 --dport 80 -j ACCEPT: iptables: No chain/target/match by that name.
(exit status 1)
Вот команда, которую я использую:
docker run -d -p 10080:80 -v /srv/http/website/data:/srv/http/www/data -v /srv/http/website/logs:/srv/http/www/logs myimage
Разве порт 80 на моем сервере не достаточно? Есть что-то, что я пропустил с помощью интерфейса докеров? Я использую iptables со сценарием следующим образом:
#!/bin/sh
# reset :
iptables -t filter -F
iptables -t filter -X
# Block all :
iptables -t filter -P INPUT DROP
iptables -t filter -P FORWARD DROP
iptables -t filter -P OUTPUT DROP
# Authorize already established connections :
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# Authorize backloop :
iptables -t filter -A INPUT -i lo -j ACCEPT
iptables -t filter -A OUTPUT -o lo -j ACCEPT
# Authorize ssh :
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 22 -j ACCEPT
# Authorize HTTP :
iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 80 -j ACCEPT
# Authorize HTTPS :
iptables -t filter -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 443 -j ACCEPT
# Authorize DNS :
iptables -t filter -A INPUT -p tcp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A INPUT -p udp --dport 53 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 53 -j ACCEPT
# Ping :
iptables -t filter -A INPUT -p icmp -j ACCEPT
iptables -t filter -A OUTPUT -p icmp -j ACCEPT
# Authorize FTP :
iptables -t filter -A INPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 20 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 21 -j ACCEPT
# # Authorize NTP :
# iptables -t filter -A INPUT -p udp --dport 123 -j ACCEPT
# iptables -t filter -A OUTPUT -p udp --dport 123 -j ACCEPT
# Authorize IRC :
iptables -t filter -A INPUT -p tcp --dport 6667 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 6667 -j ACCEPT
# Authorize port 10000 (for Node.JS server) :
iptables -t filter -A INPUT -p tcp --dport 10000 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 10000 -j ACCEPT
# Authorize port 631 (Cups server) :
iptables -t filter -A INPUT -p tcp --dport 631 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 631 -j ACCEPT
# Authorize port 9418 (git) :
iptables -t filter -A INPUT -p tcp --dport 9418 -j ACCEPT
iptables -t filter -A OUTPUT -p tcp --dport 9418 -j ACCEPT
Как я могу это исправить?
Ответы
Ответ 1
Я считаю, что проблема такова:
Фильтр iptables -t -F
Фильтр iptables -t -X
который действительно очищает все цепи. Одним из возможных решений является запуск демона докеров после сценария установки iptables. В противном случае вам нужно будет явно удалить цепочки, которые вас интересуют.
Ответ 2
Я столкнулся с той же проблемой в настройке docker-compose.
1. Очистить все цепочки:
sudo iptables -t filter -F
sudo iptables -t filter -X
2. Затем перезапустите Docker Service:
systemctl restart docker
Ответ 3
Столкнулся с той же проблемой на RHEL 7. Перезапуск службы iptable
работал для меня без необходимости iptable
какие-либо iptable
правила.
$ sudo systemctl restart docker
Ответ 4
В irc.freenode.net # docker вы заявили, что используете ARM ARM ARM на малине Pi.
Если вы не используете этот скрипт как часть службы systemd, я бы настоятельно рекомендовал перейти к этому или использовать существующие службы iptables и использовать их способность сохранять/восстанавливать таблицы в соответствующее время. Если вы решите перейти на свои собственные услуги, убедитесь, что устройство заявляет, что оно заказано Before=docker.service
Ответ 5
Ошибка может возникать из-за того, что она пытается повлиять на цепочку фильтров iptables "DOCKER", но ее там нет.
Опция --iptables = false не позволяет докеру изменять конфигурацию iptables.
(Источник: https://docs.docker.com/v17.09/engine/userguide/networking/default_network/container-communication/#communicating-to-the-outside-world)
Если вы решите исправить цепочку фильтров iptables, вот как.
На самом деле вы можете отредактировать iptables и добавить его, чтобы он выглядел как в приведенном здесь примере Docker: как заново создать докеры дополнительные правила iptables?
Как это
sudo vi /etc/sysconfig/iptables
Добавьте строки ": DOCKER"
*nat
:PREROUTING ACCEPT [144:8072]
:INPUT ACCEPT [87:5208]
:OUTPUT ACCEPT [118:8055]
:POSTROUTING ACCEPT [118:8055]
:DOCKER - [0:0]
... your previous rules here ...
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5781:5099614]
:DOCKER - [0:0]
... your previous rules here ...
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
COMMIT
Перезагрузите... например
service iptables restart
Хорошая ссылка "читать дальше", где она хорошо объяснена
https://medium.com/@ebuschini/iptables-and-docker-95e2496f0b45