firewalld加入Docker

概述

Docker是一款流行的容器化平台,它可以帮助开发者快速构建、打包和发布应用程序。然而,使用Docker时需要注意安全性问题,特别是网络安全。为了保护Docker容器中的应用程序和主机,我们可以使用firewalld来管理网络访问控制。

firewalld是一个动态防火墙管理工具,它可以帮助我们轻松地管理网络权限。在本文中,我们将介绍如何将firewalld与Docker集成,并通过示例代码演示如何使用firewalld保护Docker容器的网络访问。

准备工作

在开始之前,我们需要确保已经安装了Docker和firewalld。如果尚未安装,请按照以下步骤操作:

  1. 安装Docker

    $ sudo apt-get update
    $ sudo apt-get install docker-ce
    
  2. 安装firewalld

    $ sudo apt-get install firewalld
    

安装完成后,我们可以继续配置firewalld。

配置firewalld

首先,我们需要启动firewalld服务并设置为开机自启动:

$ sudo systemctl start firewalld
$ sudo systemctl enable firewalld

接下来,我们可以使用firewall-cmd命令来配置防火墙规则。以下是一些常用的firewall-cmd命令示例:

  • 添加一个新的防火墙规则:

    $ sudo firewall-cmd --zone=public --add-port=8080/tcp
    
  • 永久添加一个新的防火墙规则:

    $ sudo firewall-cmd --permanent --zone=public --add-port=8080/tcp
    
  • 列出当前生效的防火墙规则:

    $ sudo firewall-cmd --zone=public --list-all
    
  • 永久删除一个防火墙规则:

    $ sudo firewall-cmd --permanent --zone=public --remove-port=8080/tcp
    
  • 重新加载防火墙规则:

    $ sudo firewall-cmd --reload
    

有关更多的firewall-cmd命令,请参考[官方文档](

Docker与firewalld集成

要将firewalld与Docker集成,我们需要创建一个新的firewalld服务来管理Docker容器的网络访问。以下是一个示例的firewalld服务配置文件docker.xml

<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>Docker</short>
  <description>Docker runtime service</description>
  <port protocol="tcp" port="8080"/>
  <port protocol="udp" port="8080"/>
  <port protocol="tcp" port="8081"/>
  <port protocol="udp" port="8081"/>
  <port protocol="tcp" port="8082"/>
  <port protocol="udp" port="8082"/>
  <!-- 添加更多的端口规则 -->
  <module name="nf_conntrack_netbios_ns"/>
</service>

在这个示例中,我们定义了三个TCP和UDP端口规则(8080、8081和8082)。您可以根据自己的需求添加更多的规则。

将以上配置文件保存为docker.xml,然后将其放在/etc/firewalld/services/目录下。

接下来,我们需要重新加载firewalld配置以使新的服务生效:

$ sudo firewall-cmd --reload

现在,我们可以使用firewall-cmd命令来管理Docker容器的网络访问。

示例代码

以下是一个使用Python脚本创建Docker容器并添加防火墙规则的示例代码:

import docker

def create_container(image, name, port):
    client = docker.from_env()
    container = client.containers.run(image, detach=True, name=name, ports={'8080/tcp': port})
    return container

def add_firewall_rule(port):
    cmd = f"firewall-cmd --permanent --zone=public --add-port={port}/tcp"
    container = create_container('ubuntu:latest', 'firewalld_example', port)
    container.exec_run(cmd)
    container.stop()
    container.remove()

if __name__ == "__main__":
    port = input("Enter the port number: ")
    add_firewall