欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

docker映射端口穿透內(nèi)置防火墻的實(shí)現(xiàn)

 更新時(shí)間:2024年10月10日 11:00:19   作者:偉庭大師兄  
在使用Docker部署項(xiàng)目時(shí),即使未開啟CentOS7的Firewalld防火墻,端口仍可被外網(wǎng)訪問,這是因?yàn)镈ocker在安裝后會(huì)接管iptables,并自動(dòng)添加規(guī)則以放行指定端口,解決方法包括依賴外置防火墻放行端口、指定端口監(jiān)聽地址為本機(jī)、禁用Docker的iptables規(guī)則修改

一、問題現(xiàn)象

1、現(xiàn)象舉例

# 自制的springboot項(xiàng)目的dockerfile
# springboot 其實(shí)就是一個(gè)簡(jiǎn)單的hello-world程序,寫了一個(gè)HelloController 做測(cè)試
# dockerfile內(nèi)容:
FROM java:8 
MAINTAINER shan <test@qq2363581677@163.com> 
ADD ./demo.jar /demo.jar
EXPOSE 8848
CMD java -jar /demo.jar


# 構(gòu)建鏡像
docker build -f ./dockerfile -t demo .

# 創(chuàng)建、映射端口、運(yùn)行容器
docker run -d --name=demo -p 8838:8848 demo

在阿里云服務(wù)器上外置的防火墻或安全組放行端口 8838 后,在瀏覽器發(fā)現(xiàn)可以直接訪問到數(shù)據(jù)

----問題在于咱還沒有開啟內(nèi)置的防火墻firewalld,卻出現(xiàn)了端口可以直接被訪問的情況

2、使用centos7 的防火墻firewalld查看放行端口情況

使用 docker 來(lái)部署項(xiàng)目,發(fā)現(xiàn)直接使用 -p 映射端口,會(huì)出現(xiàn)問題:

導(dǎo)致docker直接透過系統(tǒng)本機(jī)的防火墻,不用開端口可以直接外網(wǎng)訪問 8838 端口。

二、問題原因

1、docker無(wú)視防火墻firewalld 的原因

其實(shí)docker并不是繞過了防火墻,只是因?yàn)樗鵬ptables里寫了規(guī)則,你在firewalld里看不到而已。(centos7系統(tǒng)既有iptables,也有firewalld)

在docker安裝完后,會(huì)接管iptables,只要你docker run的時(shí)候加入?yún)?shù),他會(huì)自動(dòng)向iptables里面添加規(guī)則。

所以使用 -p 容器端口:主機(jī)端口,最終會(huì)在iptables中添加上容器的端口。

防火墻 iptables 和 firewalld 的關(guān)系

  • Iptables:是centos6自帶的防火墻工具,對(duì)服務(wù)器自身、網(wǎng)絡(luò)通信流量進(jìn)行控制,用于過濾數(shù)據(jù)包,屬于網(wǎng)絡(luò)層防火墻。
  • FirewallD:是centos7自帶的防火墻工具,但是也同樣支持iptables。能夠允許哪些服務(wù)可用,哪些端口可用,屬于更高一層的防火墻。

iptables 與 firewalld 都不是真正的防火墻, 它們都只是用來(lái)定義防火墻策略的防火墻管理工具。

對(duì)于 centos7 系統(tǒng)既有iptables,也有firewalld

2、使用 iptables的命令可以查看到docker 容器的端口

iptables -L DOCKER

三、問題的解決

1、依靠阿里云服務(wù)器提供的外置防火墻(推薦

  • 有的服務(wù)器叫防火墻,有的服務(wù)器叫安全組,都是一個(gè)東西,都是系統(tǒng)的外置防火墻。
  • 防火墻就像一個(gè)門,想象一下你的錢藏到你的房間,這時(shí)候有一個(gè)小偷想要來(lái)偷你的錢,小偷需要先溜進(jìn)你家大門【外置防火墻(安全組/防火墻)】,然后再溜進(jìn)你的房間【內(nèi)置防火墻(iptables/firewalld)】。

解決方式1:依靠阿里云服務(wù)器提供的外置防火墻放行需要暴露給外界的端口

相當(dāng)于關(guān)閉了你家大門

雖然內(nèi)置防火墻和外置防火墻一起使用更加安全,但是影響了數(shù)據(jù)訪問的效率了,為了速度,有時(shí)候確保安全即可,不用更加安全。

購(gòu)買了騰訊云服務(wù)的老鐵要注意一下:

配置安全組的時(shí)候,不要選擇放行所有端口,要選擇自定義,然后放行80、443、ping、ssh端口(ssh端口建議進(jìn)行修改,不使用默認(rèn)的22)

2、端口映射時(shí)指定監(jiān)聽地址為本機(jī)

對(duì)于那些只需要在本地訪問,不需要向外暴露端口的服務(wù),在進(jìn)行端口映射的時(shí)候指定監(jiān)聽地址為127.0.0.1。

# 創(chuàng)建、映射端口、運(yùn)行容器
docker run -d --name=demo -p 127.0.0.1:8838:8848 demo
  • 這時(shí)候,外界(通過瀏覽器)就無(wú)法訪問了到8838 端口了,即使在外置防火墻放行了端口。

3、禁用 docker 的 iptables 規(guī)則

原因就是docker 在iptables 加入規(guī)則,才導(dǎo)致內(nèi)置防火墻放行了docker容器的端口,現(xiàn)在咱就根治它,在docker配置文件禁止修改iptables 規(guī)則。

① docker 配置修改,禁止 iptables 規(guī)則

# 編輯/lib/systemd/system/docker.service文件

# 在ExecStart后添加 --iptables=false 

② 重載 docker 配置 & 重啟 docker 服務(wù)

systemctl daemon-reload
systemctl restart docker

完成上述兩步以及可以采用系統(tǒng) firewall 控制端口訪問,但會(huì)出現(xiàn) docker 容器間無(wú)法訪問,而且容器內(nèi)也無(wú)法訪問外部網(wǎng)絡(luò)。

③ 使用類似 NAT 網(wǎng)絡(luò)方式使得 docker 可以訪問外部網(wǎng)絡(luò)

firewall-cmd --permanent --zone=public --add-masquerade

使用該方法解決 docker 無(wú)視系統(tǒng)防火墻問題所帶來(lái)的缺點(diǎn):容器內(nèi)無(wú)法獲取得到客戶端的真實(shí) IP,由于是類似 NAT 網(wǎng)絡(luò),常常 nginx 日志上記錄的是 docker0 網(wǎng)絡(luò)的子網(wǎng) IP,對(duì)于一些業(yè)務(wù)無(wú)法獲取真實(shí) IP 可能不能容忍,看個(gè)人的取舍吧。

4、使用 expose 方式暴露端口,然后采用 nginx 代理轉(zhuǎn)發(fā)(推薦)

(1) 使用dockerCompose 編排+nginx代理轉(zhuǎn)發(fā)

① dockerCompose 中編排內(nèi)容:

version: "3"
services:
  app:
    image: app
    container_name: app
    build: ..
    expose:
     - "8888"
    depends_on:
      - mysql
      - redis
  nginx:
    image: nginx
    container_name: nginx
    ports:
      - 80:80
      - 443:443
    volumes:
      - /mnt/docker/nginx/:/etc/nginx/
    links:
      - app
    depends_on:
      - app

② nginx 中的配置:

upstream appstream{
        server app:8888; #dockerCompose編排之后,app服務(wù)名相當(dāng)于域名,可以通過app找到對(duì)應(yīng)的ip地址
}

server{
        listen 80;
        server_name blog.yilele.site; 
        location /api {
			proxy_pass http://appstream;#nginx代理轉(zhuǎn)發(fā)
        }
}

(2) 上面例子的demo容器(使用dockerfile)+ nginx

server{
        listen 80;
        server_name blog.yilele.site; 
        location /hello {# 啟動(dòng)docker的demo容器后,可以通過命令:docker inspect demo 找到demo對(duì)應(yīng)的ip地址
			proxy_pass http://demo的ip地址:8888;   # nginx代理轉(zhuǎn)發(fā)
        }
}

ports 和 expose 區(qū)別

  • ports: 暴露容器端口到主機(jī)的任意端口或指定端口。

不管是否指定主機(jī)端口,使用ports都會(huì)將端口 暴露給主機(jī)和其他容器。

 - "9000:8080"     # 綁定容器的8080端口到主機(jī)的9000端口
  - "443"          # 綁定容器的443端口到主機(jī)的任意端口,容器啟動(dòng)時(shí)隨機(jī)分配綁定的主機(jī)端口號(hào)
  • expose: 暴露容器給link到當(dāng)前容器的容器。

即暴露給處于同一個(gè)networks的容器。搭配link 進(jìn)行使用。

expose:
  - "8000"

參考文章:《docker無(wú)視防火墻問題總結(jié)》 https://icharle.com/dockeriptables.html

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用Docker鏡像構(gòu)建Go應(yīng)用的實(shí)現(xiàn)方法

    使用Docker鏡像構(gòu)建Go應(yīng)用的實(shí)現(xiàn)方法

    本文主要介紹了使用Docker鏡像構(gòu)建Go應(yīng)用的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • 詳解利用nginx和docker實(shí)現(xiàn)一個(gè)簡(jiǎn)易的負(fù)載均衡

    詳解利用nginx和docker實(shí)現(xiàn)一個(gè)簡(jiǎn)易的負(fù)載均衡

    本篇文章主要介紹了利用nginx和docker實(shí)現(xiàn)一個(gè)簡(jiǎn)易的負(fù)載均衡 ,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-06-06
  • docker內(nèi)部容器之間的端口訪問實(shí)現(xiàn)方法

    docker內(nèi)部容器之間的端口訪問實(shí)現(xiàn)方法

    alpine-client?與?alpine-server?兩容器,前者訪問后者監(jiān)聽之端口,以此探析?Docker?內(nèi)部容器間端口訪問機(jī)制,這篇文章主要介紹了如何實(shí)現(xiàn)docker內(nèi)部容器之間的端口訪問,需要的朋友可以參考下
    2024-04-04
  • 告別Docker請(qǐng)求超時(shí)之一步步排查與詳細(xì)解決方案

    告別Docker請(qǐng)求超時(shí)之一步步排查與詳細(xì)解決方案

    在Ubuntu系統(tǒng)上安裝Docker后,運(yùn)行docker?run?hello-world時(shí)遇到連接超時(shí)問題,下面這篇文章主要介紹了Docker請(qǐng)求超時(shí)一步步排查與詳細(xì)解決方案的相關(guān)資料,需要的朋友可以參考下
    2025-02-02
  • 如何使用docker部署lnmp多站點(diǎn)

    如何使用docker部署lnmp多站點(diǎn)

    本文給大家介紹如何使用docker部署lnmp多站點(diǎn),創(chuàng)建一個(gè) Docker 網(wǎng)絡(luò)以便容器可以在同一網(wǎng)絡(luò)上進(jìn)行通信,本文給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10
  • docker搭建Jenkins以及基本使用圖文教程

    docker搭建Jenkins以及基本使用圖文教程

    Jenkins是一個(gè)廣泛使用的開源持續(xù)集成工具,它能夠自動(dòng)化構(gòu)建、測(cè)試和部署軟件項(xiàng)目,這篇文章主要給大家介紹了關(guān)于docker搭建Jenkins以及基本使用的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2024-04-04
  • Docker 部署Go的兩種基礎(chǔ)鏡像的實(shí)現(xiàn)

    Docker 部署Go的兩種基礎(chǔ)鏡像的實(shí)現(xiàn)

    這篇文章主要介紹了Docker 部署Go的兩種基礎(chǔ)鏡像的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Docker-compose部署gitlab的方法步驟

    Docker-compose部署gitlab的方法步驟

    這篇文章主要介紹了Docker-compose部署gitlab的方法步驟,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2018-12-12
  • Docker?Memcached?容器化部署的實(shí)現(xiàn)

    Docker?Memcached?容器化部署的實(shí)現(xiàn)

    memcached是一套分布式的高速緩存系統(tǒng),本文主要介紹了Docker?Memcached?容器化部署的實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • Docker?Push?Skipped?foreign?layer?的錯(cuò)誤問題及解決方案

    Docker?Push?Skipped?foreign?layer?的錯(cuò)誤問題及解決方案

    當(dāng)Docker推送基于Windows鏡像到私有倉(cāng)庫(kù)的時(shí)候會(huì)遇到Skipped foreign layer的問題,這篇文章主要介紹了Docker?Push?Skipped?foreign?layer?的錯(cuò)誤問題及解決方案,需要的朋友可以參考下
    2022-05-05

最新評(píng)論