s4ros icon

docker-macvlan-network-PoC.sh

s4ros | PRO | 08/04/21 03:27:40 PM UTC (Edited) | 0 ⭐ | 956 👁️ | Never ⏰ | []
Bash |

1.74 KB

|

None

|

0 👍

/

0 👎

#!/bin/bash
 
set -x
set -u
set -e
set -o pipefail
 
# ustawiamy sobie kilka zmiennych
ETH_INT=$(ip route | grep ^default | cut -d ' ' -f 5) # z wyniku polecenia `ip route` pobieramy wiersz 
                                                     # zaczynający się od `default` następnie robimy 
                                                    # string split z separatorem na "spację" i wyciągamy piąty element 
                                                   # - w tym przypadku nazwę interfejsu sieciowego
IP_GW=$(ip route | grep ^default | cut -d ' ' -f 3)  # jak wyżej, tylko, że zamiast piątego elementu,
                                                    # bierzemy trzeci - czyli adres IP przypisany do interfejsu
IP_BASE=${IP_GW%.*}  # bash env substract - wycinamy ostatni człon po kropce,
                     # np. dla 192.168.0.10 w zmiennej zostanie tylko 192.168.0
 
# tworzymy nowy wirtualny mostek sieciowy "bridge2" linkujący do naszego głównego interfejsu sieciowego 
sudo ip link add bridge2 link ${ETH_INT} type macvlan mode bridge
# podnosimy wirtualny interface
sudo ip link set bridge2 up
# przypisujemy adres IP z maską do interfejsu
sudo ip addr add ${IP_BASE}.192/29 dev bridge2 
# tworzymy sieć dockerową z driverem macvlan i odpowiednimi ustawieniami sieci
docker network create -d macvlan -o parent=${ETH_INT} --gateway ${IP_GW} --subnet ${IP_BASE}.0/24 --ip-range ${IP_BASE}.198/30 bridge2
# uruchamiamy kontener nginx w nowej sieci
docker run --rm --name nginx -itd --network bridge2 nginx:alpine
# sprawdzamy, czy możemy pobrać zawartość `/` z nginx odpytując go po adresie z puli subnetu hosta
curl ${IP_BASE}.196
 
# docker kill nginx
# docker network rm bridge2
# sudo ip link delete bridge2

Comments