web-dev-qa-db-ja.com

Docker macvlanネットワーク、インターネットにアクセスできません

複数のIPアドレスを持つ専用サーバーがあります。一部のIPにはMACアドレスが関連付けられていますが、他のIP(サブネットワーク内)にはMACアドレスがありません。私は以下を使用してdockermacvlanネットワークを作成しました:

docker network create -d macvlan -o macvlan_mode=bridge --subnet=188.40.76.0/26 --gateway=188.40.76.1 -o parent=eth0 macvlan_bridge

私はIP:88.99.102.115とMac:00:50:56:00:60:42を持っています。以下を使用してコンテナを作成しました。

docker run --name cont1 --net=macvlan_bridge --ip=88.99.102.115 --mac-address 00:50:56:00:60:42 -itd nginx

これは機能し、外部からそのIPアドレスでホストされているnginxにアクセスできます。

MACアドレスがなく、ゲートウェイがサブネット外にあるIPの場合

サブネット:88.99.114.16/28、ゲートウェイ:88.99.102.103

以下を使用してネットワークを作成できません:

docker network create -d macvlan -o macvlan_mode=bridge --subnet=88.99.114.16/28 --gateway=88.99.102.103 -o parent=eth0 mynetwork

エラーをスローします:

no matching subnet for gateway 88.99.102.103

ゲートウェイを含めるためにサブネットスコープを増やしてみました:

docker network create -d macvlan -o macvlan_mode=bridge --subnet=88.99.0.0/16 --gateway=88.99.102.103 -o parent=eth0 mynetwork

ネットワークが作成され、「mynetwork」を使用してnginxコンテナを開始しましたが、88.99.114.18のMACアドレスがないため、ランダムなMACアドレス40:1c:0f:bd:a1:d2を使用しました。

docker run --name cont1 --net=mynetwork --ip=88.99.114.18 --mac-address 40:1c:0f:bd:a1:d2 -itd nginx

Nginx(88.99.102.115)に到達できません。

  1. ゲートウェイがサブネット外にある場合、macvlan dockerネットワークを作成するにはどうすればよいですか?
  2. IPアドレスのみがあり、MACアドレスがない場合、macvlanネットワークを使用してコンテナを実行するにはどうすればよいですか?

ネットワーキングの知識はあまりないので、詳しく説明していただければ助かります。

私の/ etc/network/interfacesファイル:

### Hetzner Online GmbH - installimage
# Loopback device:
auto lo
iface lo inet loopback
iface lo inet6 loopback
# device: eth0
auto  eth0
iface eth0 inet static
  address   88.99.102.103
  netmask   255.255.255.192
  gateway   88.99.102.65
  # default route to access subnet
  up route add -net 88.99.102.64 netmask 255.255.255.192 gw 88.99.102.65 eth0

iface eth0 inet6 static
  address 2a01:4f8:221:1266::2
  netmask 64
  gateway fe80::1
12
user3713466

単純なルーティングの概念 または サブネットとルーティング を読むことから始めたいと思うかもしれません。

ゲートウェイがサブネット外にある場合、macvlan dockerネットワークを作成するにはどうすればよいですか?

ゲートウェイアドレスは、インターフェイスと同じサブネット上にある必要があります。この新しいサブネットを使用するには、IPアドレスの1つを使い果たし、それをホストのどこかにゲートウェイとして割り当てる必要があります。

ブリッジネットワークへのサブネットルーティング。

ホスティングのスクリーンショットから、88.99.114.16/28サブネットは、ホスト88.99.102.103を介してルーティングするように設定されています。 Dockerでサブネット内の残りのIPアドレスを使用する場合は、ゲートウェイとして使用するインターフェイスをホストのどこかに作成する必要があります。

Dockerが使用するブリッジネットワークを作成します。ブリッジにはゲートウェイアドレス88.99.114.17が割り当てられます。

docker network create \
  --driver=bridge \
  --subnet 88.99.114.16/28 \
  --gateway=88.99.114.17 \
  name0

ルーティングを機能させるには、IP転送を有効にする必要がある場合もあります。 /etc/sysctl.confでIP転送を構成します。

net.ipv4.ip_forward = 1

新しい設定を適用します

sysctl -p /etc/sysctl.conf

次に、ルーティングされたネットワークで新しいブリッジでコンテナを実行すると、ゲートウェイとインターネットにアクセスできるようになります。

docker run --net=name0 --rm busybox \
  sh -c "ip ad sh && ping -c 4 88.99.114.17 && wget api.ipify.org"

デフォルトのFORWARDポリシーによっては、iptablesでサブネットへのアクセスを許可する必要がある場合があります

iptables -I DOCKER -d 88.99.114.16/28 -j ACCEPT

サブネット上のサービスには、外部からアクセスできます

docker run --net=name0 busybox \
  nc -lp 80 -e echo -e "HTTP/1.0 200 OK\nContent-Length: 3\n\nHi\n"

それから外

○→ ping -c 2  88.99.114.18
PING 88.99.114.18 (88.99.114.18): 56 data bytes
64 bytes from 88.99.114.18: icmp_seq=0 ttl=63 time=0.527 ms
64 bytes from 88.99.114.18: icmp_seq=1 ttl=63 time=0.417 ms

--- 88.99.114.18 ping statistics ---
2 packets transmitted, 2 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.417/0.472/0.527/0.055 ms

○→ curl 88.99.114.18
Hi

Macvlanインターフェースマッピングの必要はありません。

IPアドレスのみがあり、MACアドレスがない場合、macvlanネットワークを使用してコンテナを実行するにはどうすればよいですか?

macvlanは、物理/ホストインターフェイスをコンテナにマップするために使用されます。これらのアドレスの物理インターフェースがないため、コンテナーにマップするのは困難です。

7
Matt