News:三分天注定,七分靠打拼,爱拼才会赢!致力打造专业IT博客。如果你对本博客有任何意见或建议请联系作者,邮箱:blog@caokuan.cn

解决 Docker 容器“绕过”宿主机防护墙问题

逝水无痕 229 0 条

所谓“绕过”宿主机防火墙其实是假的。Docker 只是接管了部分宿主机防火墙,当我们启动容器并通过 -p 指定映射宿主机端口时,Docker 会自动在宿主机防火墙配置里添加规则,使我们可以在不开放宿主机 INPUT 链端口时仍然可以访问 -p 指定的端口,此所谓“绕过”防火墙。下面将举例介绍如何解决这个问题。

docker.jpg

现在使用 Docker 部署服务器环境非常方便,我们使用 Docker 部署的容器会暴露许多的端口,有的端口是开放访问的,有的则不是。对于内网环境来说,暴露某些端口影响不大,但是对于公网环境的服务器,暴露某些端口就会产生安全问题,下面以部署 gitlab 为例说明只使用宿主机开放的 80 端口访问 gitlab。

通常启动 gitlab 容器的命令:

docker run -d --hostname git.xxx.com -p 8002:80 -p 8043:443 -p 8022:22 \
  --name gitlab \
  --restart always \
  -v /home/gitlab/config:/etc/gitlab \
  -v /home/gitlab/logs:/var/log/gitlab \
  -v /home/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce

通过 -p 分别将宿主机的 8002 8043 8022 端口映射到容器内的相应端口,并暴露出来供外部访问。此时我们可以通过直接访问宿主机 IP:8002 的方式访问 git 服务器,即使宿主机添加 INPUT 规则禁用 8002 端口也无法阻止 8002 端口被访问。

下面看一下修改后的启动命令:

docker run -d --hostname git.xxx.com --expose 80 --expose 443 --expose 22 \
  --name gitlab \
  --restart always \
  -v /home/gitlab/config:/etc/gitlab \
  -v /home/gitlab/logs:/var/log/gitlab \
  -v /home/gitlab/data:/var/opt/gitlab \
  gitlab/gitlab-ce

这次是通过 --expose 指定的端口,这样容器的 80 443 22 端口只对宿主机暴露,外部是无法直接访问的。那么我们如何通过宿主机的 80 端口访问 git 服务器呢?可以使用 nginx 代理来完成。

1、查看容器 IP 地址

docker inspect gitlab | grep IPAddress

假如容器的 IP 为 172.17.0.2

2、配置 nginx 代理

server { 
    listen 80;
    server_name git.xxx.com; 

    charset UTF-8;

    location / {
        root   html;
        index  index.html index.htm;
        proxy_pass http://172.17.0.2;
        proxy_redirect                      off;  
        proxy_set_header   Host             $host;  
        proxy_set_header   X-Real-IP        $remote_addr;  
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;  
    }
    
    location = /50x.html {
        root html; 
    }
}

nginx 重新加载配置文件

/usr/local/nginx/sbin/nginx -s reload

配置完成之后就可以通过宿主机的 80 端口访问 git 服务器了。

发表我的评论
icon_mrgreen.gificon_neutral.gificon_twisted.gificon_arrow.gificon_eek.gificon_smile.gificon_confused.gificon_cool.gificon_evil.gificon_biggrin.gificon_idea.gificon_redface.gificon_razz.gificon_rolleyes.gificon_wink.gificon_cry.gificon_surprised.gificon_lol.gificon_mad.gificon_sad.gificon_exclaim.gificon_question.gif

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址