讓宿主機能和Linux的虛擬機內部SNAT網絡互訪

前言

學習linux難免不接觸docker容器,它是一個和牛逼的容器技術,你可以在裏面裝各樣的軟件,就像在獨立的環境。比如我可以我的docker裏面裝了多個的Jdk,tomcat,mysql,甚至多個linux發行版。它的功能超級強大,但是有個問題,我要怎麼樣在我的宿主機上很方便的訪問到這些裝在docker上的服務應用,通常情況下,需要做端口轉發,但是這種方式太擾人了,比如我在我docker容器上裝了三個linux發行版,用來做linux集羣的學習使用,我要爲它們每個做ssh端口映射,而且在它裏面裝其他應用又要重複做一遍。所以我想到了一個辦法,就是讓我的宿主機能夠和docker內部的網絡互通。

前期準備

所需工具:
win10系統,virtualbox,centos虛擬機,docker及liunx的鏡像

環境介紹
win10宿主機:
宿主機採用的是win10系統,內部ip地址是192.168.1.114.
在這裏插入圖片描述

虛擬機:
虛擬機使用的軟件用的是virtualbox,安裝的是centos7發行版,採用的是橋接網卡模式,網段是和win10宿主機一致的,所以虛擬機和宿主機一樣可以互相訪問和請求外部網絡,IP:192.168.1.112。
在這裏插入圖片描述
在這裏插入圖片描述

docker容器:
在這裏插入圖片描述mycentos_ssh是我自己打包的帶有ssh服務的鏡像

創建網橋:docker network create centos-bridge
在這裏插入圖片描述
創建容器:docker run -dit --name=centos4 --network centos-bridge linux鏡像 /bin/bash "

可以查看剛剛創建的網橋:docker inspect centos-bridge
在這裏插入圖片描述
centos4容器的ip地址是自動分配的,爲172.21.0.2

可以attach進去容器裏面看看:docker attach centos4
在這裏插入圖片描述
容器創建完了

使用docker的網絡橋接很簡單,不用怎麼配置,容器裏面的服務是可以請求外部網絡的,也可以訪問虛擬機的網絡(IP:192.168.1.112)。但是我要的不只是訪問外部網絡,我還需要讓內部的服務給外面的宿主機進行訪問,所以下一步要做的就是如何讓外面的宿主機能夠訪問到裏面的服務。

下面開始說重點了

實現步驟

我們知道網絡層協議裏面,除了同個網段的ip,其他的都是通過路由的下一跳做轉發的,它首先會尋找自己的路由表,如果存在這個網絡的路由,它的下一跳就直接交給這個下一跳指定的地址或接口,如果沒有找到,那就拋給默認網關,默認網關找不到,它就會一值網上拋,直到ttl過期.但是,現在我要訪問172.21.0.2,本地的宿主機會先將它和 255.255.0.0 掩碼做&操作,得到172.21.0.0,這個是它的網絡號.但是172.21.0.0這個網絡是屬於內部網絡的,外部網絡不可能知道的,所以我們需要設置本機的路由,那我爲這個網絡號指向192.168.1.112的路由,讓它能夠找到正確的下一跳。
使用win10的命令執行:
1.route -p add 172.21.0.0 mask 255.255.255.0 192.168.1.112 #永久添加路由
輸入: route print可以看到我已經添加了一個永久路由
在這裏插入圖片描述
現在我通過 ping 172.21.0.2是ping得通的,但是我用telnet 172.21.0.2 22是連接不到的,因爲192.168.1.112的虛擬機它只是收到了你的數據包而已,它並不會幫你轉發給172.21.0.2的centos容器。

那麼我們下一步就要對linux虛擬機的做一些配置。
我們虛擬機內部其實也有一個網絡,叫SNAT網絡,它跟NAT很像,下面的這些就是內部網絡裏面的ip地址
在這裏插入圖片描述
其實我在192.168.1.112的虛擬機裏面,通過ssh -p [email protected]是可以成功的,那爲什麼外面的宿主機就不行,我們可能很快就能夠想到防火牆了,在centos7種firewall-cmd已經取代了iptables了,所以我們需要配置firewall-cmd。

將docker網橋的接口添加到外部域:
firewall-cmd --permanent --zone=external --change-interface=br-ad14ad9a5b40

zone是防火牆的所在域,它的選項有:
publish 公開的,它允許ssh,ftp等服務
trusted 信任的網絡,它是最高級的,允許所有的請求
external 外部網絡
rejected 拒絕任何操,但是仍會做響應
drop 丟棄不做任何響應

對172.21.0.0/24網段做僞裝IP設置:
firewall-cmd --permanent --zone=external --add-rich-rule=‘rule family=ipv4 source address=172.21.0.0/24 masquerade’
#add-rich-rule是firewall的富語法,它可以做一些非常強大的事情,這裏不做詳解。

輸入:firewall-cmd --zone=external --list-all
查詢剛剛添加配置
在這裏插入圖片描述

網絡轉發設置:
firewall-cmd --permanent --direct --passthrough ipv4 -t nat -A POSTROUTING -s 172.21.0.0/24 -j SNAT --to-source 172.21.0.1
#direct命令使用的firewall-cmd本身以外的功能,passthrough 是將命令參數傳遞過去,這裏的passthrough 後面部分使用的是iptables命令的,後面的意思是產生的指向172.21.0.0的新包將跳轉到snat網絡的172.21.0.1主機,ipv4 -t nat (查詢nat表時遇到產生新的鏈接的包時),-A(是加到鏈末), POSTROUTING (是指修改爲出去的),-j是跳轉 ,SNAT -to-source是指向SNAT的目標地址,
#備註:不在萬不得已的情況下最好少用direct

輸入: firewall-cmd --direct --get-all-passthroughs
查詢剛剛添加的轉發:
在這裏插入圖片描述

再重啓一下:
firewall-cmd --reload

好了我們驗證喜悅的時刻到了
在這裏插入圖片描述

PS:
1.讓主機能夠訪問虛擬機內部的SNAT網絡是爲了方便學習,使用docker搭建內部集羣和節省時間,但是部署很麻煩,每次部署新的項目,都要做端口映射。
2.本實例前提條件是要虛擬機和docker的網絡都能夠請求外部的情況下的,限於篇幅,這裏不對docker的網絡方面做過多的介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章