正在运行的Docker容器:iptables:没有与该名称匹配的链/目标/

kmpatx3s  于 2022-11-02  发布在  Docker
关注(0)|答案(9)|浏览(275)

我尝试运行容器,但遇到以下问题:

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还不够吗?我在Docker接口中是否遗漏了什么?我使用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

我该怎么解决这个问题?

omtl5h9j

omtl5h9j1#

我在docker-compose设置中也遇到了同样的问题。

1.清除所有链接:

sudo iptables -t filter -F
sudo iptables -t filter -X

2.然后重新启动Docker服务:

systemctl restart docker
yshpjwxd

yshpjwxd2#

在RHEL 7上也遇到了同样的问题。重新启动Docker服务对我来说很有效,不需要刷新任何iptable规则。

$ sudo systemctl restart docker
um6iljoc

um6iljoc3#

我认为问题是在这些范围内:
iptables -t筛选器-F
iptables -t筛选器-X
一个可能的解决方案是在iptables安装脚本 * 之后 * 启动docker守护进程。否则你需要显式地删除你感兴趣的链。

wgmfuz8q

wgmfuz8q4#

我得到同样的问题,安装firewalld后。
我通过以下方式修复它:

service firewalld stop
service docker restart
6qftjkof

6qftjkof5#

发生该错误的原因可能是它试图影响iptables“DOCKER”过滤器链,但实际上并不存在。
选项--iptables=false防止docker更改iptables配置。
(来源:https://docs.docker.com/v17.09/engine/userguide/networking/默认网络/容器-通信/#对外通信)
如果您选择修复iptables docker过滤器链,下面是如何修复的。
实际上,您可以编辑iptables并添加它,这样它看起来就像示例中的Docker: How to re-create dockers additional iptables rules?
就像这样

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

t5zmwmid

t5zmwmid6#

在www.example.com中irc.freenode.net#docker您已经声明您正在树莓派上使用Arch Linux ARM。
如果您没有将此脚本作为systemd服务的一部分来运行,我强烈建议您使用systemd服务,或者使用现有的iptables服务,并在适当的时候使用它们的功能来保存/恢复表。

7gs2gvoe

7gs2gvoe7#

是的,我遇到了同样的问题,如上所述,下面的命令对我很有效

sudo iptables -t filter -F

sudo iptables -t filter -X

systemctl restart docker
63lcw9qa

63lcw9qa8#

我可以确认这个问题是由iptables或firewalld引起的,因为在我的容器停止之前,我编辑了我的防火墙规则。

iptables -t filter -X
iptables -t filter -F
vlju58qv

vlju58qv9#

我也遇到了同样的问题。在运行docker start mongodb之前,我正在测试ssh服务。
以下命令可以为我解决此问题。

iptables -t filter -F

iptables -t filter -X

systemctl restart docker

相关问题