RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Docker開啟IPv6

馬哥Linux運(yùn)維 ? 來源:rectcircle.cn ? 2023-01-10 09:24 ? 次閱讀

背景知識(shí)

Docker 網(wǎng)絡(luò)

在 Docker 中,網(wǎng)絡(luò)是一個(gè)重要抽象。一個(gè) Docker 可以有多個(gè)網(wǎng)絡(luò),每個(gè)容器可以連接到一個(gè)或多個(gè)中。

docker 安裝完成后,會(huì)自動(dòng)創(chuàng)建三個(gè)網(wǎng)絡(luò),分別是 bridge、host 和 none。通過 docker network ls 命令可以查看:

NETWORKIDNAMEDRIVERSCOPE
11da7fc827b4bridgebridgelocal
4cd2eae9c4cdhosthostlocal
12730ca5becanonenulllocal

其中名字為 bridge 的 bridge 類型網(wǎng)絡(luò),就是 docker 的默認(rèn)網(wǎng)絡(luò)(docker run 默認(rèn)使用的網(wǎng)絡(luò))。

默認(rèn)網(wǎng)絡(luò)的實(shí)現(xiàn)是在宿主機(jī)環(huán)境創(chuàng)建一個(gè)名為 docker0 的 bridge 設(shè)備,并為其配置一個(gè)私有網(wǎng)段的網(wǎng)關(guān) IP 地址。通過 ip addr show docker0 可以查看更該設(shè)備信息。

3:docker0:mtu1500qdiscnoqueuestateUPgroupdefault
link/ether02xxxx:xxbrdffffff:ff
inet172.17.0.1/16brd172.17.255.255scopeglobaldocker0
valid_lftforeverpreferred_lftforever
inet6fe80:xxxxxx/64scopelink
valid_lftforeverpreferred_lftforever

docker bridge 網(wǎng)絡(luò),在 IPv4 場(chǎng)景下拓?fù)淙缦滤荆▉碜杂冢篕VM + LinuxBridge 的網(wǎng)絡(luò)虛擬化解決方案實(shí)踐):

+----------------------------------------------------------------+-----------------------------------------+-----------------------------------------+
|Host|Container1|Container2|
||||
|+------------------------------------------------+|+-------------------------+|+-------------------------+|
||NewworkProtocolStack|||NewworkProtocolStack|||NewworkProtocolStack||
|+------------------------------------------------+|+-------------------------+|+-------------------------+|
|↑↑|↑|↑|
|............|.............|.....................................|...................|.....................|....................|....................|
|↓↓|↓|↓|
|+------++--------+|+-------+|+-------+|
||.3.101||.9.1|||.9.2|||.9.3||
|+------++--------++-------+|+-------+|+-------+|
||eth0||br0|<--->|veth|||eth0|||eth0||
|+------++--------++-------+|+-------+|+-------+|
|↑↑↑|↑|↑|
|||+-------------------------------------------+|||
||↓||||
||+-------+||||
|||veth|||||
||+-------+||||
||↑||||
||+-------------------------------------------------------------------------------|--------------------+|
|||||
|||||
|||||
+------------|---------------------------------------------------+-----------------------------------------+-----------------------------------------+
↓
PhysicalNetwork(192.168.3.0/24)

通過 docker network inspect bridge 可以查看某該默認(rèn)網(wǎng)絡(luò)配置:

[
{
"Name":"bridge",
"Id":"11da7fc827b4dxxx",
"Created":"2021-11-22T1203.408536176+08:00",
"Scope":"local",
"Driver":"bridge",
"EnableIPv6":false,
"IPAM":{
"Driver":"default",
"Options":null,
"Config":[
{
"Subnet":"172.17.0.0/16",
"Gateway":"172.17.0.1"
}
]
},
"Internal":false,
"Attachable":false,
"Ingress":false,
"ConfigFrom":{
"Network":""
},
"ConfigOnly":false,
"Containers":{
"0d744147030829f0247xx":{
"Name":"container1",
"EndpointID":"6f539a054ae35cbxx",
"MacAddress":"02xxxx:xx",
"IPv4Address":"172.17.0.14/16",
"IPv6Address":""
},
},
"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 network create 命令,創(chuàng)建一個(gè)自定義 bridge 網(wǎng)絡(luò)。關(guān)于,默認(rèn)網(wǎng)絡(luò)和自定義 bridge,有如下不同:

自定義 bridge 網(wǎng)絡(luò)會(huì)使用 docker 內(nèi)嵌的 dns server 服務(wù),配置地址為 127.0.0.11,通過 iptables 轉(zhuǎn)發(fā)到 43747 端口。因此可以直接通過 container name 訪問同一個(gè)自定義網(wǎng)絡(luò)下的其他容器網(wǎng)絡(luò)。而默認(rèn)網(wǎng)絡(luò)則不支持。

自定義 bridge 有更好的隔離性。

一個(gè)容器可以在運(yùn)行時(shí)動(dòng)態(tài)的連接/斷開一個(gè)自定義 bridge,默認(rèn)網(wǎng)絡(luò)只能重新創(chuàng)建。

自定義 bridge 可以在創(chuàng)建的時(shí)候配置 Linux bridge,如果要修改默認(rèn)網(wǎng)絡(luò)的 bridge 則需要重啟 docker daemon。因此,官方更推薦在生產(chǎn)環(huán)境使用自定義 bridge 而非默認(rèn)網(wǎng)絡(luò)。

默認(rèn)網(wǎng)絡(luò)支持 IPv6

本章節(jié)介紹的是如何配置默認(rèn)的 bridge 網(wǎng)絡(luò)支持 ipv6。(未經(jīng)過測(cè)試,僅供參考)

前置條件:確保自己的設(shè)備被分配了一個(gè) IPv6。通過 ip addr show 查看當(dāng)前設(shè)備的 IPv6。其輸出的物理網(wǎng)卡存在包含 inet6 和 scope global 的行時(shí),表示該網(wǎng)卡支持 IPv6。需要注意的是:其 IPv6 地址的前綴不能是 /128,如果是 /128,建議通過 IPv6NAT 方式去支持 IPv6。

2:eth0:mtu1500qdiscmqstateUPgroupdefaultqlen1000
link/etherfaxxxx:xxbrdffffff:ff
inet10.227.8.141/22brd10.227.11.255scopeglobaleth0
valid_lftforeverpreferred_lftforever
inet62xxx:xxxx/64scopeglobal
valid_lftforeverpreferred_lftforever
inet6fe80:xxxxxxxx/64scopelink
valid_lftforeverpreferred_lftforever

修改 /etc/docker/daemon.json,其中 fixed-cidr-v6 是上一步獲取到的 IPv6 網(wǎng)段的子網(wǎng)(配置默認(rèn)網(wǎng)絡(luò),前綴長度最大為 /80)。

{
"ipv6":true,
"fixed-cidr-v6":"2xxx:/80"
}

reload 配置,docker daemon 將會(huì)使用 IPv6 網(wǎng)絡(luò)。

sudosystemctlreloaddocker

通過 docker network inspect bridge 命令檢查是否生效。若生效,則 EnableIPv6 值為 true,IPAM.Config[1].Subnet 是上一步配置的 fixed-cidr-v6。

注意經(jīng)測(cè)試,如下場(chǎng)景可能不會(huì)生效:

/etc/docker/daemon.json 存在 "live-restore": true 字段。

reload 時(shí)有容器仍然存在。

根據(jù)眾多博客的說法,還需如下兩步:

/etc/sysctl.conf 添加,并執(zhí)行 sysctl -f,配置宿主機(jī)和 docker0 網(wǎng)卡支持 NDP proxy。

#docker0是docker默認(rèn)的網(wǎng)橋(bridge)
net.ipv6.conf.docker0.proxy_ndp=1
#eth0表示物理網(wǎng)卡,注意替換為物理網(wǎng)卡
net.ipv6.conf.eth0.proxy_ndp=1

默認(rèn)的 ndp 鄰居發(fā)現(xiàn)配置僅允許單個(gè) IP 配置。需要安裝 ndppd 服務(wù)來轉(zhuǎn)發(fā)鄰居發(fā)現(xiàn)消息(這一步還有一個(gè)替代方案:手動(dòng)為每一個(gè)容器配置如:ip -6 neigh add proxy 2xxx:1 dev ens3,其中,2xxx:1 為容器的分配的 IPv6,ens3 為宿主機(jī)綁定 IPv6 的網(wǎng)卡)。

apt-getupdate-y
apt-getinstall-yndppd
cp/usr/share/doc/ndppd/ndppd.conf-dist/etc/ndppd.conf

更改 proxy eth0 { 行到宿主機(jī)綁定 IPv6 的網(wǎng)卡,如:proxy ens3 {。更改 rule 1111:: { 行為需要暴露的網(wǎng)段 2xxx:/80 {。最后執(zhí)行 systemctl restart ndppd

注意:

本方法僅針對(duì)新裝 Docker 場(chǎng)景

本章節(jié) 和 自定義網(wǎng)絡(luò)支持 IPv6 配置的 IPv6 和 docker 默認(rèn) IPv4 是不同的。容器的 IPv6 用的不是私有網(wǎng)段,而是宿主機(jī)網(wǎng)絡(luò)或者是宿主機(jī)網(wǎng)絡(luò)的一個(gè)子網(wǎng)。因此,宿主機(jī)所在的網(wǎng)絡(luò)的所有實(shí)例可以直接通過 IPv6 的地址。也就是說:容器的所有端口對(duì)于 IPv6 來說都是公開的,而無需 public。而容器的 IPv4 分配的是私有網(wǎng)段,因此,容器網(wǎng)段和宿主機(jī)網(wǎng)段是通過 NAT 轉(zhuǎn)發(fā)數(shù)據(jù)的,因此宿主機(jī)所在網(wǎng)絡(luò)的其他實(shí)例是無法直接訪問容器。也就是說:容器的所有端口對(duì)于 IPv4 來說都是私有的,需 public 到 host 網(wǎng)絡(luò)才能被外部訪問到。

自定義網(wǎng)絡(luò)支持 IPv6

本章節(jié)介紹的是如何創(chuàng)建一個(gè)支持 IPv6 的 bridge 網(wǎng)絡(luò)。(未經(jīng)過測(cè)試,僅供參考)

前置條件:確保自己的設(shè)備被分配了一個(gè) IPv6。

創(chuàng)建一個(gè)支持 IPv6 的 bridge 網(wǎng)絡(luò)。其中 --subnet 參數(shù)為上一步獲取到的 IPv6 網(wǎng)段的子網(wǎng)(自定義 bridge 網(wǎng)絡(luò),前綴長度不限制,可以大于于 80)。

dockernetworkcreatemy-net-ipv6--ipv6--subnet="2xxx:/80"

通過 docker network inspect my-net-ipv6 命令檢查是否生效。若生效,則 EnableIPv6 值為 true,IPAM.Config[1].Subnet 是上一步配置的 fixed-cidr-v6。

創(chuàng)建容器時(shí),通過 --network my-net-ipv6 參數(shù),給容器開啟 IPv6 網(wǎng)絡(luò),如 docker run --network my-net-ipv6 -it busybox ip addr show,可以看到,網(wǎng)卡被分配了 IPv6 地址。

通過 IPv6NAT 方式支持 IPv6

測(cè)試可行,推薦使用該方式。

上文也提到,上文展示的方案,容器獲得的 IPv6 IP 并不是私有網(wǎng)絡(luò) IP,是和外部網(wǎng)絡(luò)直接連通,而不會(huì)經(jīng)過 NAT。在如下場(chǎng)景下,以上方式可能不能滿足要求:

安全性,要求容器的網(wǎng)絡(luò)是私有的,需要容器的網(wǎng)絡(luò)行為和 Docker IPv4 的行為一致,只有特定端口才能訪問。

宿主機(jī)處于一個(gè)很小范圍的網(wǎng)段(前綴大于 /80),如 xxx::xx/128,沒有多余的 IPv6 可以分給容器。此時(shí)就需要,給容器配置一個(gè)私有 IPv6 網(wǎng)段,并啟用 NAT。

但是 Docker 官方并沒有內(nèi)置 IPv6 的 NAT,如果想要使用 IPv6 NAT,需要安裝外掛的 IPv6 啟動(dòng),參見:https://github.com/robbertkl/docker-ipv6nat。

有這些準(zhǔn)備后,實(shí)施步驟如下所示:

使用如下命令,后臺(tái)啟動(dòng) IPv6 NAT(通過 --restart always 配置了開機(jī)自啟)。

dockerrun-d--nameipv6nat--privileged--networkhost--restartalways-v/var/run/docker.sock:/var/run/docker.sock:ro-v/lib/modules:/lib/modules:rorobbertkl/ipv6nat

和 自定義網(wǎng)絡(luò)支持 IPv6 類似,創(chuàng)建一個(gè)支持 IPv6 的 bridge 網(wǎng)絡(luò)。其中 --subnet 參數(shù)為 fe80::/10 的一個(gè)子網(wǎng)。

dockernetworkcreatemy-net-ipv6--ipv6--subnet="fd00:1/80"--gateway="fd00:1"

通過 docker network inspect my-net-ipv6 命令檢查是否生效。若生效,則 EnableIPv6 值為 true,IPAM.Config[1].Subnet 是上一步配置的 fixed-cidr-v6。

創(chuàng)建容器時(shí),通過 --network my-net-ipv6 參數(shù),給容器開啟 IPv6 網(wǎng)絡(luò),如 docker run --network my-net-ipv6 -it busybox sh:

ip addr show ,可以看到,網(wǎng)卡被分配了 IPv6 地址。 wget https://ipv6.icanhazip.com -O /dev/stdout 2>/dev/null 可以看到出網(wǎng) IPv6 地址。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 網(wǎng)絡(luò)
    +關(guān)注

    關(guān)注

    14

    文章

    7553

    瀏覽量

    88729
  • IPv6
    +關(guān)注

    關(guān)注

    6

    文章

    689

    瀏覽量

    59389
  • 容器
    +關(guān)注

    關(guān)注

    0

    文章

    495

    瀏覽量

    22060
  • 命令
    +關(guān)注

    關(guān)注

    5

    文章

    683

    瀏覽量

    22011
  • Docker
    +關(guān)注

    關(guān)注

    0

    文章

    457

    瀏覽量

    11846

原文標(biāo)題:Docker 開啟 IPv6

文章出處:【微信號(hào):magedu-Linux,微信公眾號(hào):馬哥Linux運(yùn)維】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    STMCUBE如何設(shè)置IPV6地址?

    小弟最近在學(xué)習(xí)開發(fā)STMCUBE,請(qǐng)問遇到一個(gè)問題,STMCUBE 在設(shè)置LWIP關(guān)于IPV6配置的時(shí)候,如何設(shè)置IPV6地址,我在電腦PING IPV6的時(shí)候,PING哪個(gè)地址
    發(fā)表于 04-18 07:41

    IPv6地址是什么,IPv6的意思

    IPv6是Internet Protocol Version 6的縮寫,其中Internet Protocol譯為“互聯(lián)網(wǎng)協(xié)議”。它是IETF設(shè)計(jì)的用于替代現(xiàn)行版本IP協(xié)議-IPv4-的下一代IP
    發(fā)表于 01-25 16:39

    基于IPv6的Winsock網(wǎng)絡(luò)編程

    Protocol”,1995年底確定了IPng的協(xié)議規(guī)范,并稱為“IP版本6”,即IPv6。0 IPv6概述IPv6指的是網(wǎng)絡(luò)協(xié)議版本6,
    發(fā)表于 05-08 06:14

    IPv6的特色應(yīng)用

    業(yè)務(wù)匱乏一直是制約IPv6發(fā)展的重要因素。隨著移動(dòng)互聯(lián)網(wǎng)的發(fā)展,IPv6的特色應(yīng)用業(yè)務(wù)漸漸浮出水面。1 IPv6與家庭網(wǎng)絡(luò)“家庭網(wǎng)絡(luò)”已經(jīng)成為全業(yè)務(wù)運(yùn)營商大力發(fā)展家庭用戶的重要業(yè)務(wù)舉措。然而,由于
    發(fā)表于 07-15 08:18

    IPv6,IPv6的應(yīng)用,IPv6的原理是什么?

    IPv6,IPv6的應(yīng)用,IPv6的原理是什么? IPv6是Internet Protocol Version 6的縮寫,其中Intern
    發(fā)表于 03-29 17:19 ?2083次閱讀

    IPv6結(jié)構(gòu),什么是IPv6結(jié)構(gòu)

    IPv6結(jié)構(gòu),什么是IPv6結(jié)構(gòu) 本文將闡述IPv6 報(bào)頭的結(jié)構(gòu)并將其與IPv4 報(bào)頭相比較。此外還將討論Extension(擴(kuò)展)報(bào)頭,這是
    發(fā)表于 04-06 17:06 ?1067次閱讀

    IPv6的地址,什么是IPv6的地址

    IPv6的地址,什么是IPv6的地址 和IPv4相比,IPv6的主要改變就是地址的長度為128位,也就是說可以有2的128次方的IP地址
    發(fā)表于 04-06 17:07 ?693次閱讀

    淺談IPV6(介紹IPV6的特點(diǎn)和功能)

    摘要: 隨著互聯(lián)網(wǎng)的快速發(fā)展,正在興起新的互聯(lián)網(wǎng)協(xié)議一一IPv6。本文系統(tǒng)的介紹了IPv6的特點(diǎn)、功能, 并與當(dāng)前的互聯(lián)網(wǎng)協(xié) 議進(jìn)行了全面的比較, 闡明了IPv6的優(yōu)越性, 以及IPv6
    發(fā)表于 02-12 09:28 ?73次下載

    ipv6是什么_ipv6有什么用

    IPv6 已經(jīng)開發(fā)了20年了,最初的工作是在1992年展開的,叫做“IP Next Generation”,在1998年被標(biāo)準(zhǔn)化為 IPv6。在2008年在因特網(wǎng)上部署,并且2008年的奧運(yùn)會(huì)
    發(fā)表于 12-26 08:45 ?6.1w次閱讀

    IPv6環(huán)境獲取IPV6地址的優(yōu)點(diǎn)

    DHCPv6(Dynamic Host Configuration Protocol for IPv6,支持 IPv6 的動(dòng)態(tài)主機(jī)配置協(xié)議)是針對(duì) IPv6 編址方案設(shè)計(jì)的,為主機(jī)分配
    的頭像 發(fā)表于 03-22 17:22 ?3642次閱讀
    <b class='flag-5'>IPv6</b>環(huán)境獲取<b class='flag-5'>IPV6</b>地址的優(yōu)點(diǎn)

    什么是ipv6 ipv4與ipv6的區(qū)別

    ipv6的英文全稱是Internet Protocol Version 6,中文為互聯(lián)網(wǎng)協(xié)議第6版。ipv6是互聯(lián)網(wǎng)工程任務(wù)組設(shè)計(jì)的用于替代IPv
    的頭像 發(fā)表于 09-03 16:03 ?2.3w次閱讀

    什么是ipv4什么是ipv6 ipv6技術(shù)的優(yōu)缺點(diǎn)

    IPv4和IPv6的地址格式不同,它們之間沒有直接的換算方法。但是,可以使用IPv4與IPv6的雙棧機(jī)制,實(shí)現(xiàn)IPv4地址到
    發(fā)表于 05-17 18:12 ?5501次閱讀

    ipv6功能有什么用 ipv6開啟好還是關(guān)閉好

    。本文將探討IPv6的功能,以及為什么開啟IPv6可能更好。 IPv6的功能: 擴(kuò)展地址空間:IPv6的主要功能是擴(kuò)展地址空間,由于
    的頭像 發(fā)表于 02-05 10:06 ?3.6w次閱讀

    什么是IPv6隧道技術(shù)

    隨著互聯(lián)網(wǎng)的快速發(fā)展,IPv4地址資源逐漸枯竭,IPv6作為下一代互聯(lián)網(wǎng)協(xié)議應(yīng)運(yùn)而生。然而,IPv6的部署并非一蹴而就,許多現(xiàn)有的IPv4網(wǎng)絡(luò)設(shè)備和應(yīng)用尚未支持
    的頭像 發(fā)表于 10-30 09:17 ?319次閱讀
    RM新时代网站-首页