Docker macvlan network, incapace di accedere a Internet

Ho un server dedicato con più indirizzi IP, alcuni IP hanno indirizzo MAC associati mentre altri (in una substring) non dispongono di indirizzi MAC. Ho creato la networking macluetooth docker utilizzando:

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 

Ho ip: 88.99.102.115 con mac: 00: 50: 56: 00: 60: 42. Creato un contenitore utilizzando:

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

Questo funziona, posso accedere a nginx ospitato in quel indirizzo IP dall'esterno.

Caso con IP che non dispone di indirizzo MAC e il gateway è fuori dalla substring.

subnet: 88.99.114.16/28, gateway: 88.99.102.103

Imansible creare la networking utilizzando:

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

Errore di lancio:

 no matching subnet for gateway 88.99.102.103 

Prova con l'aumento della portta di sottoreti per includere il gateway:

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

La networking è stata creata, quindi ha iniziato il contenitore nginx usando 'mynetwork' e bene non ho l'indirizzo MAC per 88.99.114.18 in modo utilizzato un indirizzo mac random 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 

Imansible raggiungere nginx (88.99.102.115).

  1. Come si crea una networking di docking macvlan se il mio gateway è fuori dalla mia substring?
  2. Come faccio ad eseguire un contenitore utilizzando la networking macvlan quando ho solo indirizzo IP ma non indirizzo mac?

Non ho molta conoscenza nel networking, sarà molto utile se spiegherai in dettaglio.

Il mio file / 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 

Potresti iniziare leggendo semplici concetti di routing o sottoreti e routing

Come si crea una networking di dock macvlan se il mio gateway è fuori dalla mia substring?

Un indirizzo del gateway deve essere sulla stessa substring di un'interface. Per utilizzare questa nuova substring è necessario utilizzare uno degli indirizzi IP e assegnarlo da qualche parte all'host come gateway.

Rete di substring verso una networking ponte.

Dalla schermata di hosting, la subnet 88.99.114.16/28 è stata configurata per percorrere via il tuo host 88.99.102.103. È necessario creare un'interface da qualche parte nell'host per utilizzare come gateway se si desidera che Docker utilizzi il resto degli indirizzi IP nella substring.

Creare una networking ponte per Docker da utilizzare, il bridge verrà assegnato l'indirizzo gateway 88.99.114.17

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

Potrebbe anche essere necessario abilitare l'inoltro IP per il routing di lavoro. Configurare l'inoltro ip in /etc/sysctl.conf :

 net.ipv4.ip_forward = 1 

e Applica la nuova impostazione

 sysctl -p /etc/sysctl.conf 

Quindi eseguire un contenitore sul nuovo ponte con la networking routed dovrebbe essere in grado di accedere al gateway e Internet

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

Potrebbe essere necessario consentire l'accesso alla substring in iptables, a seconda della policy predefinita FORWARD

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

I servizi della subnet saranno accessibili dal mondo esterno

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

Allora fuori

 ○→ 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 

Nessuna necessità di mapping dell'interface macvlan.

Come faccio ad eseguire un contenitore utilizzando la networking macvlan quando ho solo indirizzo IP ma non indirizzo mac?

macvlan è utilizzato per mappare un'interface fisica / host in un contenitore. Poiché non si dispone di un'interface fisica per questi indirizzi, sarà difficile mappare uno in un contenitore.