Dockerコンテナはインターネットにアクセスできません。

Dockerコンテナはインターネットにアクセスできません。

したがって、私は最近、タワーとラップトップの毎日のドライバをManjaroに切り替えました。どちらの場合も、同じ問題に直面しました。 Dockerコンテナはインターネットに接続できません。でこれをテストしていますdocker run --rm -it alpine ping 8.8.8.8。このオプションを使用すると、--net=hostコマンド全体が次のようになり、docker run --rm --net=host -it alpine ping 8.8.8.8コンテナがpingを実行できます。ただし、このオプションを正しく理解すると、コンテナは互いに通信できません。私のカーネルバージョンは5.2.21-1です。

マイナーなリモート可能性のために、両方のコンピュータはNATの背後にあり、デバイスのMACアドレスに基づいてフィルタリングされた(および割り当てられたIP)ネットワークにあります。

コンテナが実行中でip a出力をpingしようとすると(実際のMACをクリア)

$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: enp0s31f6: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc fq_codel state DOWN group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
3: wlp3s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 10.173.136.22/16 brd 10.173.255.255 scope global dynamic noprefixroute wlp3s0
       valid_lft 83012sec preferred_lft 83012sec
    inet6 fe80::48d7:85d5:4c9d:4dd/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:8e:6f:31:71 brd ff:ff:ff:ff:ff:ff
    inet 172.31.0.1/16 brd 172.31.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:8eff:fe6f:3171/64 scope link 
       valid_lft forever preferred_lft forever
8: veth65af0a1@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether b2:40:b4:8c:6c:f1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::b040:b4ff:fe8c:6cf1/64 scope link 
       valid_lft forever preferred_lft forever

私が今まで試したこと:

/etc/systemd/network/dockerForward.network次のようにファイルを生成しますこのウィキペディア記事内容がある

[Match]
Name=wlp3s0
[Network]
IPForward=true

networkctlだから見ましたこの記事。しかし出力になるので

$ networkctl
WARNING: systemd-networkd is not running, output will be incomplete.

IDX LINK             TYPE               OPERATIONAL      SETUP     
  1 lo               loopback           n/a              unmanaged 
  2 enp0s31f6        ether              n/a              unmanaged 
  3 wlp3s0           wlan               n/a              unmanaged 
  4 docker0          bridge             n/a              unmanaged 

実行にもならないと見て、犯人ではないと推定されます。

また、IP範囲が重ならないことを確認しました(例:このコメント)。私がそれを実行すると、$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 56fe5d704cd9それは私にIPを提供します172.31.0.2

良い測定のために、私のiptables -L結果は次のとおりです。

$ iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
DOCKER-USER  all  --  anywhere             anywhere            
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain DOCKER (1 references)
target     prot opt source               destination         

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination         
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination         
DROP       all  --  anywhere             anywhere            
RETURN     all  --  anywhere             anywhere            

Chain DOCKER-USER (1 references)
target     prot opt source               destination         
RETURN     all  --  anywhere             anywhere

私はここで少し迷子になりました。正しい方向についてのアドバイスをいただきありがとうございます。

編集する:

コメントで述べたように、出力は次のようになりますiptables-save -c

$ iptables-save -c
# Generated by iptables-save v1.8.3 on Fri Nov 15 10:11:51 2019
*filter
:INPUT ACCEPT [1299:403836]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [147:26907]
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
[27:2268] -A FORWARD -j DOCKER-USER
[27:2268] -A FORWARD -j DOCKER-ISOLATION-STAGE-1
[0:0] -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
[0:0] -A FORWARD -o docker0 -j DOCKER
[27:2268] -A FORWARD -i docker0 ! -o docker0 -j ACCEPT
[0:0] -A FORWARD -i docker0 -o docker0 -j ACCEPT
[27:2268] -A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
[27:2268] -A DOCKER-ISOLATION-STAGE-1 -j RETURN
[0:0] -A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
[27:2268] -A DOCKER-ISOLATION-STAGE-2 -j RETURN
[27:2268] -A DOCKER-USER -j RETURN
COMMIT
# Generated by iptables-save v1.8.3 on Fri Nov 15 10:11:51 2019
*nat
:PREROUTING ACCEPT [107:22651]
:INPUT ACCEPT [90:18175]
:OUTPUT ACCEPT [7:1549]
:POSTROUTING ACCEPT [7:1549]
:DOCKER - [0:0]
[6:2978] -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
[0:0] -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
[1:84] -A POSTROUTING -s 172.31.0.0/16 ! -o docker0 -j MASQUERADE
[0:0] -A DOCKER -i docker0 -j RETURN
COMMIT

コメントに記載されている追加出力:

$ docker network inspect bridge
[
    {
        "Name": "bridge",
        "Id": "53ce5b5c85f1ecd2e67118496f38141193398f5786c959305f0453ac15f96c63",
        "Created": "2019-11-16T12:36:27.244838753+01:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.31.0.1/16",
                    "Gateway": "172.31.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        "Containers": {},
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

$ docker run --rm -it alpine ip r
default via 172.31.0.1 dev eth0 
172.31.0.0/16 dev eth0 scope link  src 172.31.0.2

私が実行した接続が失敗した正確な場所を追跡しようとしています。

$ docker run -it --rm gophernet/traceroute 8.8.8.8   
traceroute to 8.8.8.8 (8.8.8.8), 30 hops max, 46 byte packets
 1  172.31.0.1 (172.31.0.1)  0.005 ms  0.051 ms  0.016 ms
 2  xxx.xxx.xxx.1 (xxx.xxx.xxx.1)  15.092 ms  0.570 ms  0.656 ms
 3  *  *  *
 4  *  *  *
 [...]

xxx.xxx.xxx.136私のNATの実際のグローバルアドレスになります。

$ ip route                               
default via 10.173.1.1 dev wlp3s0 proto dhcp metric 600 
10.173.0.0/16 dev wlp3s0 proto kernel scope link src 10.173.136.22 metric 600 
172.31.0.0/16 dev docker0 proto kernel scope link src 172.31.0.1 linkdown 

ベストアンサー1

おすすめ記事