Сеть Docker macvlan, не удается получить доступ к интернету

у меня есть выделенный сервер с несколькими IP-адресами, некоторые IP имеют MAC-адрес, связанный, в то время как другие(в подсети) не имеют mac-адресов. Я создал сеть docker macvlan, используя:

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

это работает, я могу получить доступ к nginx, размещенному на этом ip-адресе извне.

случай с IP, который не имеет mac-адреса и шлюза вне подсети.

подсеть: 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

сеть создана, затем запущен контейнер nginx с помощью "mynetwork", и хорошо, что у меня нет mac-адреса для 88.99.114.18, поэтому я использовал случайный 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, если мой шлюз находится вне моей подсети?
  2. как запустить контейнер с помощью сети macvlan, когда у меня есть только IP-адрес, но нет mac-адреса?

у меня нет много знаний в области сетей, это будет очень полезно, если вы объясните подробно.

мой файл/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

1 ответов


вы можете начать с чтения на простые понятия маршрутизации или подсети и маршрутизация

как создать сеть докеров macvlan, если мой шлюз находится вне моей подсети?

адрес шлюза должен быть в той же подсети, что и интерфейс. Чтобы использовать эту новую подсеть, вам нужно будет использовать один из IP-адресов и назначить его где-то на хосте в качестве шлюза.

маршрутизация подсети к мосту сеть.

на снимке экрана хостинга подсеть 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 для маршрутизации. Настройте переадресацию ip в /etc/sysctl.conf:

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"

вам может потребоваться разрешить доступ в подсеть в iptables, в зависимости от вашего значения по умолчанию FORWARD политика

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.

как запустить контейнер с помощью сети macvlan, когда у меня есть только IP адрес, но без mac-адреса?

macvlan используется для отображения физического / хост-интерфейса в контейнер. Поскольку у вас нет физического интерфейса для этих адресов, будет трудно отобразить его в контейнер.